trying to change tag Year

The place for "I can't figure out how to..." questions.

trying to change tag Year

Postby onurb » Tue Mar 31, 2015 5:09 am

hi!
i'm quite a newbie and even worst, french !

i'm trying to change the year of mp3 file with getID3.

my problem :
i'm using 'COLLECTORZ' to manage my mp3 files.
COLLECTORZ is very fine but use customized tags (Tempo, Preference. Mood, ect...)

these customized tags are not properly written by getID3.
So, when i'm rewriting the mp3 with just a new year these tags are lost.

Is there some functions to just change a little little tag ?

say yes, please !!!!

thanks !
onurb
User
 
Posts: 8
Joined: Tue Mar 31, 2015 5:01 am

Re: trying to change tag Year

Postby James Heinrich » Tue Mar 31, 2015 12:20 pm

Et quand même votre anglais est bien mieux que mon français :)

Assuming you mean ID3v2, note this option and comment in write.id3v2.php:
$merge_existing_data = false; // if true, merge new data with existing tags; if false, delete old tag data and only write new tags


By default it removes the existing tag and only writes the data you pass to it. If you set the merge_existing_data option to TRUE then it will try to merge the new data you pass (e.g. year) into the existing tag.
You would need to set this option when creating the tag writer object:
Code: Select all
$tagwriter = new getid3_writetags;
$tagwriter->filename             = $Filename;
$tagwriter->tagformats           = array('id3v2.3');
$tagwriter-> merge_existing_data = true;
... etc ...
James Heinrich
getID3() v1 developer
 
Posts: 1411
Joined: Fri May 04, 2001 4:00 pm
Location: Northern Ontario, Canada

Re: trying to change tag Year

Postby onurb » Tue Mar 31, 2015 1:33 pm

thanks James !
i tried your suggestion before have post my question...
with no result, because some no fixed bug with
merge_existing_data
&&
overwrite_tags (in writer)
and a throw catch these option...
and if i try to pass out further i have some missing parameters and the prog bugs...!
onurb
User
 
Posts: 8
Joined: Tue Mar 31, 2015 5:01 am

Re: trying to change tag Year

Postby James Heinrich » Tue Mar 31, 2015 2:05 pm

Did you get an error message? If so, what was it exactly?
James Heinrich
getID3() v1 developer
 
Posts: 1411
Joined: Fri May 04, 2001 4:00 pm
Location: Northern Ontario, Canada

Re: trying to change tag Year

Postby onurb » Tue Mar 31, 2015 3:56 pm

i get this :
Notice: Array to string conversion in getid3\write.id3v2.php on line 1836
onurb
User
 
Posts: 8
Joined: Tue Mar 31, 2015 5:01 am

Re: trying to change tag Year

Postby James Heinrich » Tue Mar 31, 2015 4:02 pm

You can't be using the current version because there's nothing on line 1836.

Please download the latest version and let me know if you still have any problems, and if so what the exact error message is.
James Heinrich
getID3() v1 developer
 
Posts: 1411
Joined: Fri May 04, 2001 4:00 pm
Location: Northern Ontario, Canada

Re: trying to change tag Year

Postby onurb » Wed Apr 01, 2015 10:30 pm

oh, thanks for this version i got mine (2014 build) in SourceForge.

Notice: Array to string conversion in C:\Ma musique\____php\getid3\write.id3v2.php on line 1829
line 1829 is into the merge function :

1829: $new_array = array_reverse(array_unique(array_reverse(array_merge($arr1, $arr2))));

where $arr1 is the old array and $arr2 the new tags.
onurb
User
 
Posts: 8
Joined: Tue Mar 31, 2015 5:01 am

Re: trying to change tag Year

Postby James Heinrich » Thu Apr 02, 2015 12:06 am

Can you perhaps try and debug what's being passed there? Just before that line try inserting
Code: Select all
var_dump($arr1);
var_dump($arr2);
$new_array = array_reverse(array_unique(array_reverse(array_merge($arr1, $arr2))));
to see what is not being passed as an array, although they both should be arrays to get to that point in the code.
James Heinrich
getID3() v1 developer
 
Posts: 1411
Joined: Fri May 04, 2001 4:00 pm
Location: Northern Ontario, Canada

Re: trying to change tag Year

Postby onurb » Thu Apr 02, 2015 7:52 am

old=
Code: Select all
array(1) {
  [0]=> array(10) {
    ["frame_name"]=> string(4) "TIT2"
    ["frame_flags_raw"]=> int(0)
    ["data"]=> string(3) "Why"
    ["datalength"]=> int(4)
    ["dataoffset"]=> int(10)
    ["framenamelong"]=> string(34) "Title/songname/content description"
    ["framenameshort"]=> string(5) "title"
    ["flags"]=> array(6) {
      ["TagAlterPreservation"]=> bool(false)
      ["FileAlterPreservation"]=> bool(false)
      ["ReadOnly"]=> bool(false)
      ["compression"]=> bool(false)
      ["Encryption"]=> bool(false)
      ["GroupingIdentity"]=> bool(false)
    }
    ["encodingid"]=> int(0)
    ["encoding"]=> string(10) "ISO-8859-1"
  }
}


new=
Code: Select all
array(1) {
  [0]=> array(4) {
    ["encodingid"]=> int(0)
    ["data"]=> string(3) "Why"
    ["description"]=> string(0) ""
    ["language"]=> string(3) "eng"
  }
}

Notice: Array to string conversion in C:\Ma musique\____php\getid3\write.id3v2.php on line 1833
onurb
User
 
Posts: 8
Joined: Tue Mar 31, 2015 5:01 am

Re: trying to change tag Year

Postby James Heinrich » Thu Apr 02, 2015 2:53 pm

Can you please change that line 1829:
Code: Select all
//$new_array = array_reverse(array_unique(array_reverse(array_merge($arr1, $arr2))));
$new_array = array_merge($arr1, $arr2);
and let me know how it works for you?
James Heinrich
getID3() v1 developer
 
Posts: 1411
Joined: Fri May 04, 2001 4:00 pm
Location: Northern Ontario, Canada

Re: trying to change tag Year

Postby onurb » Thu Apr 02, 2015 6:37 pm

ok, i changed the line and now the next error is on this line

1540 foreach ($frame_rawinputdata as $irrelevantindex => $source_data_array) {

in function GenerateID3v2Tag

Warning: Invalid argument supplied for foreach() in C:\Ma musique\____php\getid3\write.id3v2.php on line 1540

Notice: Undefined variable: frame_name in C:\Ma musique\____php\getid3\write.id3v2.php on line 1541

etc...

then
WriteID3v2() failed with message(s):
Invalid Language in COMM ()
$this->GenerateID3v2FrameData() failed for "COMM"
$this->GenerateID3v2Tag() failed

i tried to upload a mp3 example but i don't see it anywhere...!
onurb
User
 
Posts: 8
Joined: Tue Mar 31, 2015 5:01 am

Re: trying to change tag Year

Postby James Heinrich » Thu Apr 02, 2015 8:41 pm

Can you please post the code you're using to call getID3?
James Heinrich
getID3() v1 developer
 
Posts: 1411
Joined: Fri May 04, 2001 4:00 pm
Location: Northern Ontario, Canada

Re: trying to change tag Year

Postby onurb » Fri Apr 03, 2015 1:07 am

Code: Select all
<?php

function trace($txt) {   echo $txt."<br/>"; }

function parse_recursive_array($arr, $tabul="&nbsp;&nbsp;") {
   foreach($arr as $k=>$val) {
      if (is_array($val)) {
         trace($tabul."ARRAY ".$k);
         parse_recursive_array($val, $tabul.$tabul);
      }
      else trace($tabul.$k." -> ".$val);
   }
}

trace("<br/>--------------------------CHECK post ".count($_POST));
parse_recursive_array($_POST);

function recursiveScan($dirname, $subdir="", $deep=0) {
  // trace("recurs=".$dirname." subdir=".$subdir."   deep=".$deep);
   if ($dir = opendir($dirname)) {
      while (($file = readdir($dir)) !== false) {
      if ($file != "." && $file != "..") {
         //$curFile = "$dirname$file";
         $curFile = $dirname.$file;
         if (is_dir($curFile)) {recursiveScan($curFile.'/', ($subdir=='' ? $file : $subdir.'/'.$file) , $deep++); }
          else {
            trace("    file=".$curFile);
            // do what you actually want to do to the files here, call getID3 or whatever
            }
         }
      }
   }
}

//recursiveScan("C:Ma musique/____php/ID3TagsRW/");


$TaggingFormat = 'UTF-8';

header('Content-Type: text/html; charset='.$TaggingFormat);
echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
echo '<html><head><title>test getID3</title></head><style type="text/css">BODY,TD,TH { font-family: sans-serif; font-size: 9pt;" }</style><body>';

require_once('getid3.php');
// Initialize getID3 engine
$getID3 = new getID3;
$getID3->setOption(array('encoding'=>$TaggingFormat));

getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'write.php', __FILE__, true);
//$browsescriptfilename = 'demo.browse.php';
$browsescriptfilename = 'test_getid3.php';

$Filename = //(isset($_REQUEST['Filename']) ? $_REQUEST['Filename'] : '');
"C:Ma musique/____php/ID3TagsRW/music/why2.mp3";//

$target_genre = isset($_POST['Genre']) ? $_POST['Genre'] :"";
$target_genreOther = isset($_POST['GenreOther']) ? $_POST['GenreOther'] :"";


if (isset($_POST['WriteTags'])) {
   if (!empty($target_genreOther)) $target_genre = "";
   
   $TagFormatsToWrite = (isset($_POST['TagFormatsToWrite']) ? $_POST['TagFormatsToWrite'] : array());
   
   trace("<br/>--------------------------CHECK tags format ".count($TagFormatsToWrite));
   parse_recursive_array($TagFormatsToWrite);
   
   if (!empty($TagFormatsToWrite)) {
      echo 'starting to write tag(s)<BR>';

      $tagwriter = new getid3_writetags;
      $tagwriter->filename       = $Filename;
      $tagwriter->tagformats     = $TagFormatsToWrite;
      $tagwriter->overwrite_tags = true;
      $tagwriter->tag_encoding   = $TaggingFormat;
      $tagwriter->merge_existing_data = true;

      if (!empty($_POST['remove_other_tags'])) {
         $tagwriter->remove_other_tags = true;
      }

      $commonkeysarray = array('Title', 'Artist', 'Album', 'Year', 'Comment','MusicMatch_Tempo');
      foreach ($commonkeysarray as $key) {
         if (!empty($_POST[$key])) {
            $TagData[strtolower($key)][] = $_POST[$key];
         }
      }
      
      trace("<br/>--------------------------CHECK tagdata ".count($TagData));
      parse_recursive_array($TagData);
   
      ////////////////////
      /*
      trace("write genre=".$_POST['Genre']."<   other=".$_POST['GenreOther']."<");
      trace("2write genre=".$target_genre."<   other=".$target_genreOther."<");
      trace(" genre empty ? ". empty($target_genre));
      trace(" other genre empty ? ". empty($target_genreOther));
      */
      //trace(" av nb genres ".count($TagData['genre']));
      /////////////////////
      
      if (!empty($target_genre)) {
         $TagData['genre'][] = $target_genre;
      }
      if (!empty($target_genreOther)) {
         
         //array_push($TagData['genre'],$_POST['GenreOther']);
         $TagData['genre'][] = $target_genreOther;
         //trace ("WRITE GENRE OTHER ".$TagData['genre'][] );
         //trace ("WRITE GENRE OTHER ".$target_genreOther);
         //echo "test 2 ".$TagData['genre'][count($TagData['genre'])-1]."<br/>";
      }
      
      if (!empty($_POST['Track'])) {
         $TagData['track'][] = $_POST['Track'].(!empty($_POST['TracksTotal']) ? '/'.$_POST['TracksTotal'] : '');
      }

      if (!empty($_FILES['userfile']['tmp_name'])) {
         if (in_array('id3v2.4', $tagwriter->tagformats) || in_array('id3v2.3', $tagwriter->tagformats) || in_array('id3v2.2', $tagwriter->tagformats)) {
            if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
               ob_start();
               if ($fd = fopen($_FILES['userfile']['tmp_name'], 'rb')) {
                  ob_end_clean();
                  $APICdata = fread($fd, filesize($_FILES['userfile']['tmp_name']));
                  fclose ($fd);
                  /*
                  list($APIC_width, $APIC_height, $APIC_imageTypeID) = GetImageSize($_FILES['userfile']['tmp_name']);
                  $imagetypes = array(1=>'gif', 2=>'jpeg', 3=>'png');
                  if (isset($imagetypes[$APIC_imageTypeID])) {

                     $TagData['attached_picture'][0]['data']          = $APICdata;
                     $TagData['attached_picture'][0]['picturetypeid'] = $_POST['APICpictureType'];
                     $TagData['attached_picture'][0]['description']   = $_FILES['userfile']['name'];
                     $TagData['attached_picture'][0]['mime']          = 'image/'.$imagetypes[$APIC_imageTypeID];

                  } else {
                     echo '<b>invalid image format (only GIF, JPEG, PNG)</b><br>';
                  }*/
               } else {
                  $errormessage = ob_get_contents();
                  ob_end_clean();
                  echo '<b>cannot open '.$_FILES['userfile']['tmp_name'].'</b><br>';
               }
            } else {
               echo '<b>!is_uploaded_file('.$_FILES['userfile']['tmp_name'].')</b><br>';
            }
         } else {
            echo '<b>WARNING:</b> Can only embed images for ID3v2<br>';
         }
      }
      trace("<br/>---------------------CHECK TAGS To WRITE ".count($TagData));
      parse_recursive_array($TagData);

      $tagwriter->tag_data = $TagData;
      if ($tagwriter->WriteTags()) {
         echo 'Successfully wrote tags<BR>';
         if (!empty($tagwriter->warnings)) {
            echo 'There were some warnings:<BLOCKQUOTE STYLE="background-color:#FFCC33; padding: 10px;">'.implode('<br><br>', $tagwriter->warnings).'</BLOCKQUOTE>';
         }
      } else {
         echo 'Failed to write tags!<BLOCKQUOTE STYLE="background-color:#FF9999; padding: 10px;">'.implode('<br><br>', $tagwriter->errors).'</BLOCKQUOTE>';
      }

   } else {

      echo 'WARNING: no tag formats selected for writing - nothing written';

   }
   echo '<HR>';

}


echo '<div style="font-size: 1.2em; font-weight: bold;">Sample tag editor/writer</div>';
echo '<a href="'.htmlentities($browsescriptfilename.'?listdirectory='.rawurlencode(realpath(dirname($Filename))), ENT_QUOTES).'">Browse current directory</a><br>';
if (!empty($Filename)) {
   echo '<a href="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'">Start Over</a><br><br>';
   echo '<form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES).'" method="post" enctype="multipart/form-data">';
   echo '<table border="3" cellspacing="0" cellpadding="4">';
   echo '<tr><th align="right">Filename:</th><td><input type="hidden" name="Filename" value="'.htmlentities($Filename, ENT_QUOTES).'"><a href="'.htmlentities($browsescriptfilename.'?filename='.rawurlencode($Filename), ENT_QUOTES).'" target="_blank">'.$Filename.'</a></td></tr>';
   if (file_exists($Filename)) {

      // Initialize getID3 engine
      $getID3 = new getID3;
      $OldThisFileInfo = $getID3->analyze($Filename);
      trace("<br/>--------------------------CHECK INFOS MP3 ".count($OldThisFileInfo));
      parse_recursive_array($OldThisFileInfo);
      
      getid3_lib::CopyTagsToComments($OldThisFileInfo);

      trace("file=".$Filename);
      
      trace("title=".$getID3->get_title());
      trace("artist=".$getID3->get_artist());
      trace("genre=".$getID3->get_genre());
      trace("year=".$getID3->get_year());
      trace("tempo=".$getID3->get_tempo());
      trace("situation=".$getID3->get_situation());
      trace("mood=".$getID3->get_mood());
      trace("preference=".$getID3->get_preference());
   
      
      switch ($OldThisFileInfo['fileformat']) {
         case 'mp3':
         case 'mp2':
         case 'mp1':
            $ValidTagTypes = array('id3v1', 'id3v2.3', 'ape');
            break;

         case 'mpc':
            $ValidTagTypes = array('ape');
            break;

         case 'ogg':
            if (!empty($OldThisFileInfo['audio']['dataformat']) && ($OldThisFileInfo['audio']['dataformat'] == 'flac')) {
               //$ValidTagTypes = array('metaflac');
               // metaflac doesn't (yet) work with OggFLAC files
               $ValidTagTypes = array();
            } else {
               $ValidTagTypes = array('vorbiscomment');
            }
            break;

         case 'flac':
            $ValidTagTypes = array('metaflac');
            break;

         case 'real':
            $ValidTagTypes = array('real');
            break;

         default:
            $ValidTagTypes = array();
            break;
      }
      echo '<tr><td align="right"><b>Title</b></td> <td><input type="text" size="40" name="Title"  value="'.htmlentities((!empty($OldThisFileInfo['comments']['title'])  ? implode(', ', $OldThisFileInfo['comments']['title'] ) : ''), ENT_QUOTES).'"></td></tr>';
      echo '<tr><td align="right"><b>Artist</b></td><td><input type="text" size="40" name="Artist" value="'.htmlentities((!empty($OldThisFileInfo['comments']['artist']) ? implode(', ', $OldThisFileInfo['comments']['artist']) : ''), ENT_QUOTES).'"></td></tr>';
      echo '<tr><td align="right"><b>Album</b></td> <td><input type="text" size="40" name="Album"  value="'.htmlentities((!empty($OldThisFileInfo['comments']['album'])  ? implode(', ', $OldThisFileInfo['comments']['album'] ) : ''), ENT_QUOTES).'"></td></tr>';
      echo '<tr><td align="right"><b>Year</b></td>  <td><input type="text" size="4"  name="Year"   value="'.htmlentities((!empty($OldThisFileInfo['comments']['year'])   ? implode(', ', $OldThisFileInfo['comments']['year']  ) : ''), ENT_QUOTES).'"></td></tr>';

      $TracksTotal = '';
      $TrackNumber = '';
      if (!empty($OldThisFileInfo['comments']['track_number']) && is_array($OldThisFileInfo['comments']['track_number'])) {
         $RawTrackNumberArray = $OldThisFileInfo['comments']['track_number'];
      } elseif (!empty($OldThisFileInfo['comments']['track']) && is_array($OldThisFileInfo['comments']['track'])) {
         $RawTrackNumberArray = $OldThisFileInfo['comments']['track'];
      } else {
         $RawTrackNumberArray = array();
      }
      foreach ($RawTrackNumberArray as $key => $value) {
         if (strlen($value) > strlen($TrackNumber)) {
            // ID3v1 may store track as "3" but ID3v2/APE would store as "03/16"
            $TrackNumber = $value;
         }
      }
      if (strstr($TrackNumber, '/')) {
         list($TrackNumber, $TracksTotal) = explode('/', $TrackNumber);
      }
      echo '<tr><td align="right"><b>Track</b></td><td><input type="text" size="2" name="Track" value="'.htmlentities($TrackNumber, ENT_QUOTES).'"> of <input type="text" size="2" name="TracksTotal" value="'.htmlentities($TracksTotal, ENT_QUOTES).'"></TD></TR>';

      $ArrayOfGenresTemp = getid3_id3v1::ArrayOfGenres();   // get the array of genres
      foreach ($ArrayOfGenresTemp as $key => $value) {      // change keys to match displayed value
         $ArrayOfGenres[$value] = $value;
      }
      unset($ArrayOfGenresTemp);                            // remove temporary array
      unset($ArrayOfGenres['Cover']);                       // take off these special cases
      unset($ArrayOfGenres['Remix']);
      unset($ArrayOfGenres['Unknown']);
      $ArrayOfGenres['']      = '- Unknown -';              // Add special cases back in with renamed key/value
      $ArrayOfGenres['Cover'] = '-Cover-';
      $ArrayOfGenres['Remix'] = '-Remix-';
      asort($ArrayOfGenres);                                // sort into alphabetical order
      echo '<tr><th align="right">Genre</th><td><select name="Genre">';
      $AllGenresArray = (!empty($OldThisFileInfo['comments']['genre']) ? $OldThisFileInfo['comments']['genre'] : array());
      foreach ($ArrayOfGenres as $key => $value) {
         echo '<option value="'.htmlentities($key, ENT_QUOTES).'"';
         if (in_array($key, $AllGenresArray)) {
            echo ' selected="selected"';
            unset($AllGenresArray[array_search($key, $AllGenresArray)]);
            sort($AllGenresArray);
         }
         echo '>'.htmlentities($value).'</option>';
      }
      echo '</select><input type="text" name="GenreOther" size="10" value="'.htmlentities((!empty($AllGenresArray[0]) ? $AllGenresArray[0] : ''), ENT_QUOTES).'"></td></tr>';

      echo '<tr><td align="right"><b>Write Tags</b></td><td>';
      foreach ($ValidTagTypes as $ValidTagType) {
         echo '<input type="checkbox" name="TagFormatsToWrite[]" value="'.$ValidTagType.'"';
         if (count($ValidTagTypes) == 1) {
            echo ' checked="checked"';
         } else {
            switch ($ValidTagType) {
               case 'id3v2.2':
               case 'id3v2.3':
               case 'id3v2.4':
                  if (isset($OldThisFileInfo['tags']['id3v2'])) {
                     echo ' checked="checked"';
                  }
                  break;

               default:
                  if (isset($OldThisFileInfo['tags'][$ValidTagType])) {
                     echo ' checked="checked"';
                  }
                  break;
            }
         }
         echo '>'.$ValidTagType.'<br>';
      }
      if (count($ValidTagTypes) > 1) {
         echo '<hr><input type="checkbox" name="remove_other_tags" value="1"> Remove non-selected tag formats when writing new tag<br>';
      }
      echo '<tr><td>tempo</td><td><input type="text"  name="COMM" value="MusicMatch_TempoSlow"/></td></tr>';
      //echo '<tr><td align="right"><b>Write Tags</b></td><td>';
      //echo '<tr><td align="right"><b>Comment</b></td><td><textarea cols="30" rows="3" name="Comment" wrap="virtual">'.((isset($OldThisFileInfo['comments']['comment']) && is_array($OldThisFileInfo['comments']['comment'])) ? implode("\n", $OldThisFileInfo['comments']['comment']) : '').'</textarea></td></tr>';

      echo '<tr><td align="right"><b>Picture</b><br>(ID3v2 only)</td><td><input type="file" name="userfile" accept="image/jpeg, image/gif, image/png"><br>';
      echo '<select name="APICpictureType">';
      $APICtypes = getid3_id3v2::APICPictureTypeLookup('', true);
      foreach ($APICtypes as $key => $value) {
         echo '<option value="'.htmlentities($key, ENT_QUOTES).'">'.htmlentities($value).'</option>';
      }
      echo '</select></td></tr>';
      echo '<tr><td align="center" colspan="2"><input type="submit" name="WriteTags" value="Save Changes"> ';
      echo '<input type="reset" value="Reset"></td></tr>';

   } else {

      echo '<tr><td align="right"><b>Error</b></td><td>'.htmlentities($Filename).' does not exist</td></tr>';

   }
   echo '</table>';
   echo '</form>';

}

echo '</body></html>';
onurb
User
 
Posts: 8
Joined: Tue Mar 31, 2015 5:01 am

Re: trying to change tag Year

Postby James Heinrich » Fri Apr 03, 2015 4:18 pm

And just to make my life easier, please tell me the contents (e.g. var_dump) of $TagData just before you assign it on this line:
Code: Select all
$tagwriter->tag_data = $TagData;
James Heinrich
getID3() v1 developer
 
Posts: 1411
Joined: Fri May 04, 2001 4:00 pm
Location: Northern Ontario, Canada

Re: trying to change tag Year

Postby onurb » Fri Apr 03, 2015 6:32 pm

ok, i'm very really sorry if i'm enough clear..
Code: Select all
var_dump($TagDta) :
array(3) {
  ["title"]=> array(1) {
    [0]=> string(3) "Why"
  }
  ["artist"]=> array(1) {
    [0]=> string(1) "-"
  }
  ["year"]=> array(1) {
    [0]=> string(4) "1999"
  }
}
onurb
User
 
Posts: 8
Joined: Tue Mar 31, 2015 5:01 am


Return to Support 1.x

Who is online

Users browsing this forum: No registered users and 2 guests

cron