Ampache PHP Cross Reference Groupware Applications

Source: /modules/getid3/write.vorbiscomment.php - 120 lines - 4731 bytes - Summary - Text - Print

   1  <?php
   2  /////////////////////////////////////////////////////////////////
   3  /// getID3() by James Heinrich <info@getid3.org>               //
   4  //  available at http://getid3.sourceforge.net                 //
   5  //            or http://www.getid3.org                         //
   6  //          also https://github.com/JamesHeinrich/getID3       //
   7  /////////////////////////////////////////////////////////////////
   8  // See readme.txt for more details                             //
   9  /////////////////////////////////////////////////////////////////
  10  //                                                             //
  11  // write.vorbiscomment.php                                     //
  12  // module for writing VorbisComment tags                       //
  13  // dependencies: /helperapps/vorbiscomment.exe                 //
  14  //                                                            ///
  15  /////////////////////////////////////////////////////////////////
  16  
  17  
  18  class getid3_write_vorbiscomment
  19  {
  20  
  21      public $filename;
  22      public $tag_data;
  23      public $warnings = array(); // any non-critical errors will be stored here
  24      public $errors   = array(); // any critical errors will be stored here
  25  
  26  	public function getid3_write_vorbiscomment() {
  27          return true;
  28      }
  29  
  30  	public function WriteVorbisComment() {
  31  
  32          if (preg_match('#(1|ON)#i', ini_get('safe_mode'))) {
  33              $this->errors[] = 'PHP running in Safe Mode (backtick operator not available) - cannot call vorbiscomment, tags not written';
  34              return false;
  35          }
  36  
  37          // Create file with new comments
  38          $tempcommentsfilename = tempnam(GETID3_TEMP_DIR, 'getID3');
  39          if (is_writable($tempcommentsfilename) && is_file($tempcommentsfilename) && ($fpcomments = fopen($tempcommentsfilename, 'wb'))) {
  40  
  41              foreach ($this->tag_data as $key => $value) {
  42                  foreach ($value as $commentdata) {
  43                      fwrite($fpcomments, $this->CleanVorbisCommentName($key).'='.$commentdata."\n");
  44                  }
  45              }
  46              fclose($fpcomments);
  47  
  48          } else {
  49              $this->errors[] = 'failed to open temporary tags file "'.$tempcommentsfilename.'", tags not written';
  50              return false;
  51          }
  52  
  53          $oldignoreuserabort = ignore_user_abort(true);
  54          if (GETID3_OS_ISWINDOWS) {
  55  
  56              if (file_exists(GETID3_HELPERAPPSDIR.'vorbiscomment.exe')) {
  57                  //$commandline = '"'.GETID3_HELPERAPPSDIR.'vorbiscomment.exe" -w --raw -c "'.$tempcommentsfilename.'" "'.str_replace('/', '\\', $this->filename).'"';
  58                  //  vorbiscomment works fine if you copy-paste the above commandline into a command prompt,
  59                  //  but refuses to work with `backtick` if there are "doublequotes" present around BOTH
  60                  //  the metaflac pathname and the target filename. For whatever reason...??
  61                  //  The solution is simply ensure that the metaflac pathname has no spaces,
  62                  //  and therefore does not need to be quoted
  63  
  64                  // On top of that, if error messages are not always captured properly under Windows
  65                  // To at least see if there was a problem, compare file modification timestamps before and after writing
  66                  clearstatcache();
  67                  $timestampbeforewriting = filemtime($this->filename);
  68  
  69                  $commandline = GETID3_HELPERAPPSDIR.'vorbiscomment.exe -w --raw -c "'.$tempcommentsfilename.'" "'.$this->filename.'" 2>&1';
  70                  $VorbiscommentError = `$commandline`;
  71  
  72                  if (empty($VorbiscommentError)) {
  73                      clearstatcache();
  74                      if ($timestampbeforewriting == filemtime($this->filename)) {
  75                          $VorbiscommentError = 'File modification timestamp has not changed - it looks like the tags were not written';
  76                      }
  77                  }
  78              } else {
  79                  $VorbiscommentError = 'vorbiscomment.exe not found in '.GETID3_HELPERAPPSDIR;
  80              }
  81  
  82          } else {
  83  
  84              $commandline = 'vorbiscomment -w --raw -c "'.$tempcommentsfilename.'" "'.$this->filename.'" 2>&1';
  85              $VorbiscommentError = `$commandline`;
  86  
  87          }
  88  
  89          // Remove temporary comments file
  90          unlink($tempcommentsfilename);
  91          ignore_user_abort($oldignoreuserabort);
  92  
  93          if (!empty($VorbiscommentError)) {
  94  
  95              $this->errors[] = 'system call to vorbiscomment failed with message: '."\n\n".$VorbiscommentError;
  96              return false;
  97  
  98          }
  99  
 100          return true;
 101      }
 102  
 103  	public function DeleteVorbisComment() {
 104          $this->tag_data = array(array());
 105          return $this->WriteVorbisComment();
 106      }
 107  
 108  	public function CleanVorbisCommentName($originalcommentname) {
 109          // A case-insensitive field name that may consist of ASCII 0x20 through 0x7D, 0x3D ('=') excluded.
 110          // ASCII 0x41 through 0x5A inclusive (A-Z) is to be considered equivalent to ASCII 0x61 through
 111          // 0x7A inclusive (a-z).
 112  
 113          // replace invalid chars with a space, return uppercase text
 114          // Thanks Chris Bolt <chris-getid3Øbolt*cx> for improving this function
 115          // note: *reg_replace() replaces nulls with empty string (not space)
 116          return strtoupper(preg_replace('#[^ -<>-}]#', ' ', str_replace("\x00", ' ', $originalcommentname)));
 117  
 118      }
 119  
 120  }

title

Description

title

Description

title

Description

title

title

Body