Example #1
0
 protected function warning($text)
 {
     return $this->getid3->warning($text);
 }
 public function __construct(getID3 $getid3, $algorithm)
 {
     $this->getid3 = $getid3;
     // Check algorithm
     if (!preg_match('/^(md5|sha1)$/', $algorithm)) {
         throw new getid3_exception('Unsupported algorithm, "' . $algorithm . '", in GetHashdata()');
     }
     //// Handle ogg vorbis files
     if (@$getid3->info['fileformat'] == 'ogg' && @$getid3->info['audio']['dataformat'] == 'vorbis') {
         // We cannot get an identical md5_data value for Ogg files where the comments
         // span more than 1 Ogg page (compared to the same audio data with smaller
         // comments) using the normal getID3() method of MD5'ing the data between the
         // end of the comments and the end of the file (minus any trailing tags),
         // because the page sequence numbers of the pages that the audio data is on
         // do not match. Under normal circumstances, where comments are smaller than
         // the nominal 4-8kB page size, then this is not a problem, but if there are
         // very large comments, the only way around it is to strip off the comment
         // tags with vorbiscomment and MD5 that file.
         // This procedure must be applied to ALL Ogg files, not just the ones with
         // comments larger than 1 page, because the below method simply MD5's the
         // whole file with the comments stripped, not just the portion after the
         // comments block (which is the standard getID3() method.
         // The above-mentioned problem of comments spanning multiple pages and changing
         // page sequence numbers likely happens for OggSpeex and OggFLAC as well, but
         // currently vorbiscomment only works on OggVorbis files.
         if ((bool) ini_get('safe_mode')) {
             throw new getid3_exception('PHP running in Safe Mode - cannot make system call to vorbiscomment[.exe]  needed for ' . $algorithm . '_data.');
         }
         if (!preg_match('/^Vorbiscomment /', `vorbiscomment --version 2>&1`)) {
             throw new getid3_exception('vorbiscomment[.exe] binary not found in path. UNIX: typically /usr/bin. Windows: typically c:\\windows\\system32.');
         }
         // Prevent user from aborting script
         $old_abort = ignore_user_abort(true);
         // Create empty file
         $empty = tempnam('*', 'getID3');
         touch($empty);
         // Use vorbiscomment to make temp file without comments
         $temp = tempnam('*', 'getID3');
         $command_line = 'vorbiscomment -w -c ' . escapeshellarg($empty) . ' ' . escapeshellarg(realpath($getid3->filename)) . ' ' . escapeshellarg($temp) . ' 2>&1';
         // Error from vorbiscomment
         if ($vorbis_comment_error = `{$command_line}`) {
             throw new getid3_exception('System call to vorbiscomment[.exe] failed.');
         }
         // Get hash of newly created file
         $hash_function = $algorithm . '_file';
         $getid3->info[$algorithm . '_data'] = $hash_function($temp);
         // Clean up
         unlink($empty);
         unlink($temp);
         // Reset abort setting
         ignore_user_abort($old_abort);
         // Return success
         return true;
     }
     //// Handle other file formats
     // Get hash from part of file
     if (@$getid3->info['avdataoffset'] || @$getid3->info['avdataend'] && @$getid3->info['avdataend'] < $getid3->info['filesize']) {
         if ((bool) ini_get('safe_mode')) {
             $getid3->warning('PHP running in Safe Mode - backtick operator not available, using slower non-system-call ' . $algorithm . ' algorithm.');
             $hash_function = 'hash_file_partial_safe_mode';
         } else {
             $hash_function = 'hash_file_partial';
         }
         $getid3->info[$algorithm . '_data'] = $this->{$hash_function}($getid3->filename, $getid3->info['avdataoffset'], $getid3->info['avdataend'], $algorithm);
     } else {
         $hash_function = $algorithm . '_file';
         $getid3->info[$algorithm . '_data'] = $hash_function($getid3->filename);
     }
 }