13 define(
'GETID3_VERSION',
'1.7.7');
14 define(
'GETID3_FREAD_BUFFER_SIZE', 16384);
53 $this->startup_error =
'';
54 $this->startup_warning =
'';
57 if (phpversion() <
'4.1.0') {
58 $this->startup_error .=
'getID3() requires PHP v4.1.0 or higher - you are running v'.phpversion();
62 $memory_limit = ini_get(
'memory_limit');
63 if (eregi(
'([0-9]+)M', $memory_limit, $matches)) {
65 $memory_limit = $matches[1] * 1048576;
67 if ($memory_limit <= 0) {
69 } elseif ($memory_limit <= 3145728) {
70 $this->startup_error .=
'PHP has less than 3MB available memory and will very likely run out. Increase memory_limit in php.ini';
71 } elseif ($memory_limit <= 12582912) {
72 $this->startup_warning .=
'PHP has less than 12MB available memory and might run out if all modules are loaded. Increase memory_limit in php.ini';
76 if ((
bool) ini_get(
'safe_mode')) {
77 $this->
warning(
'WARNING: Safe mode is on, shorten support disabled, md5data/sha1data for ogg vorbis disabled, ogg vorbos/flac tag writing disabled.');
82 if (!defined(
'GETID3_OS_ISWINDOWS')) {
83 if (strtoupper(substr(PHP_OS, 0, 3)) ==
'WIN') {
84 define(
'GETID3_OS_ISWINDOWS',
true);
86 define(
'GETID3_OS_ISWINDOWS',
false);
91 if (!defined(
'GETID3_INCLUDEPATH')) {
92 foreach (get_included_files() as $key => $val) {
93 if (basename($val) ==
'getid3.php') {
94 define(
'GETID3_INCLUDEPATH', dirname($val).DIRECTORY_SEPARATOR);
101 if (!include_once(GETID3_INCLUDEPATH.
'getid3.lib.php')) {
102 $this->startup_error .=
'getid3.lib.php is missing or corrupt';
112 if (GETID3_OS_ISWINDOWS && !defined(
'GETID3_HELPERAPPSDIR')) {
113 $helperappsdir = GETID3_INCLUDEPATH.
'..'.DIRECTORY_SEPARATOR.
'helperapps';
115 if (!is_dir($helperappsdir)) {
117 $this->startup_error .=
'"'.$helperappsdir.
'" cannot be defined as GETID3_HELPERAPPSDIR because it does not exist';
119 } elseif (strpos(realpath($helperappsdir),
' ') !==
false) {
121 $DirPieces = explode(DIRECTORY_SEPARATOR, realpath($helperappsdir));
122 $DirPieces8 = $DirPieces;
124 $CLIdir = $DirPieces[0].
' && cd \\';
125 for ($i = 1; $i < count($DirPieces); $i++) {
126 if (strpos($DirPieces[$i],
' ') ===
false) {
127 $CLIdir .=
' && cd '.$DirPieces[$i];
130 system($CLIdir.
' && dir /ad /x');
131 $subdirsraw = explode(
"\n", ob_get_contents());
133 foreach ($subdirsraw as $dummy => $line) {
134 if (eregi(
'^[0-9]{4}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2} [AP]M <DIR> ([^ ]{8}) '.preg_quote($DirPieces[$i]).
'$', trim($line), $matches)) {
135 $CLIdir .=
' && cd '.$matches[1];
139 $DirPieces8[$i] = $matches[1];
142 $helperappsdir = implode(DIRECTORY_SEPARATOR, $DirPieces8);
145 define(
'GETID3_HELPERAPPSDIR', realpath($helperappsdir).DIRECTORY_SEPARATOR);
154 if (!is_array($optArray) || empty($optArray)) {
157 foreach ($optArray as $opt => $val) {
158 if (isset($this, $opt) ===
false) {
170 if (!empty($this->startup_error)) {
171 return $this->
error($this->startup_error);
173 if (!empty($this->startup_warning)) {
174 $this->
warning($this->startup_warning);
178 $this->info = array();
182 if (!function_exists(
'iconv') && !in_array($this->encoding, array(
'ISO-8859-1',
'UTF-8',
'UTF-16LE',
'UTF-16BE',
'UTF-16'))) {
183 $errormessage =
'iconv() support is needed for encodings other than ISO-8859-1, UTF-8, UTF-16LE, UTF16-BE, UTF-16. ';
184 if (GETID3_OS_ISWINDOWS) {
185 $errormessage .=
'PHP does not have iconv() support. Please enable php_iconv.dll in php.ini, and copy iconv.dll from c:/php/dlls to c:/windows/system32';
187 $errormessage .=
'PHP is not compiled with iconv() support. Please recompile with the --with-iconv switch';
189 return $this->
error($errormessage);
193 $old_magic_quotes_runtime = get_magic_quotes_runtime();
194 if ($old_magic_quotes_runtime) {
195 set_magic_quotes_runtime(0);
196 if (get_magic_quotes_runtime()) {
197 return $this->
error(
'Could not disable magic_quotes_runtime - getID3() cannot work properly with this setting enabled');
202 if (preg_match(
'/^(ht|f)tp:\/\//',
$filename)) {
203 return $this->
error(
'Remote files are not supported in this version of getID3() - please copy the file locally first');
212 $this->info[
'filesize'] = filesize(
$filename);
215 if ($this->option_max_2gb_check) {
219 fseek($fp, 0, SEEK_END);
220 if ((($this->info[
'filesize'] != 0) && (ftell($fp) == 0)) ||
221 ($this->info[
'filesize'] < 0) ||
223 unset($this->info[
'filesize']);
225 return $this->
error(
'File is most likely larger than 2GB and is not supported by PHP');
230 $this->info[
'avdataoffset'] = 0;
231 $this->info[
'avdataend'] = $this->info[
'filesize'];
232 $this->info[
'fileformat'] =
'';
233 $this->info[
'audio'][
'dataformat'] =
'';
234 $this->info[
'video'][
'dataformat'] =
'';
235 $this->info[
'tags'] = array();
236 $this->info[
'error'] = array();
237 $this->info[
'warning'] = array();
238 $this->info[
'comments'] = array();
242 $this->info[
'filename'] = basename(
$filename);
243 $this->info[
'filepath'] = str_replace(
'\\',
'/', realpath(dirname(
$filename)));
244 $this->info[
'filenamepath'] = $this->info[
'filepath'].
'/'.$this->info[
'filename'];
249 if ($this->option_tag_id3v2) {
251 $GETID3_ERRORARRAY = &$this->info[
'warning'];
258 fseek($fp, 0, SEEK_SET);
259 $header = fread($fp, 10);
260 if (substr($header, 0, 3) ==
'ID3') {
261 $this->info[
'id3v2'][
'header'] =
true;
262 $this->info[
'id3v2'][
'majorversion'] = ord($header{3});
263 $this->info[
'id3v2'][
'minorversion'] = ord($header{4});
266 $this->info[
'id3v2'][
'tag_offset_start'] = 0;
267 $this->info[
'id3v2'][
'tag_offset_end'] = $this->info[
'id3v2'][
'tag_offset_start'] + $this->info[
'id3v2'][
'headerlength'];
268 $this->info[
'avdataoffset'] = $this->info[
'id3v2'][
'tag_offset_end'];
275 if ($this->option_tag_id3v1) {
276 if (!@include_once(GETID3_INCLUDEPATH.
'module.tag.id3v1.php')) {
277 return $this->
error(
'module.tag.id3v1.php is missing - you may disable option_tag_id3v1.');
283 if ($this->option_tag_apetag) {
284 if (!@include_once(GETID3_INCLUDEPATH.
'module.tag.apetag.php')) {
285 return $this->
error(
'module.tag.apetag.php is missing - you may disable option_tag_apetag.');
291 if ($this->option_tag_lyrics3) {
292 if (!@include_once(GETID3_INCLUDEPATH.
'module.tag.lyrics3.php')) {
293 return $this->
error(
'module.tag.lyrics3.php is missing - you may disable option_tag_lyrics3.');
299 fseek($fp, $this->info[
'avdataoffset'], SEEK_SET);
300 $formattest = fread($fp, 32774);
306 if (!$determined_format) {
308 return $this->
error(
'unable to determine file format');
312 if (isset($determined_format[
'fail_id3']) && (in_array(
'id3v1', $this->info[
'tags']) || in_array(
'id3v2', $this->info[
'tags']))) {
313 if ($determined_format[
'fail_id3'] ===
'ERROR') {
315 return $this->
error(
'ID3 tags not allowed on this file type.');
316 } elseif ($determined_format[
'fail_id3'] ===
'WARNING') {
317 $this->info[
'warning'][] =
'ID3 tags not allowed on this file type.';
322 if (isset($determined_format[
'fail_ape']) && in_array(
'ape', $this->info[
'tags'])) {
323 if ($determined_format[
'fail_ape'] ===
'ERROR') {
325 return $this->
error(
'APE tags not allowed on this file type.');
326 } elseif ($determined_format[
'fail_ape'] ===
'WARNING') {
327 $this->info[
'warning'][] =
'APE tags not allowed on this file type.';
332 $this->info[
'mime_type'] = $determined_format[
'mime_type'];
335 if (!file_exists(GETID3_INCLUDEPATH.$determined_format[
'include'])) {
337 return $this->
error(
'Format not supported, module, '.$determined_format[
'include'].
', was removed.');
341 if (!function_exists(
'iconv') && @$determined_format[
'iconv_req']) {
342 return $this->
error(
'iconv support is required for this module ('.$determined_format[
'include'].
').');
346 include_once(GETID3_INCLUDEPATH.$determined_format[
'include']);
349 $class_name =
'getid3_'.$determined_format[
'module'];
350 if (!class_exists($class_name)) {
351 return $this->
error(
'Format not supported, module, '.$determined_format[
'include'].
', is corrupt.');
353 if (isset($determined_format[
'option'])) {
354 $class =
new $class_name($fp, $this->info, $determined_format[
'option']);
356 $class =
new $class_name($fp, $this->info);
363 if ($this->option_tags_process) {
368 if ($this->option_extra_info) {
377 if ($this->option_md5_data) {
379 if (!$this->option_md5_data_source || empty($this->info[
'md5_data_source'])) {
385 if ($this->option_sha1_data) {
393 set_magic_quotes_runtime($old_magic_quotes_runtime);
405 $this->info[
'error'][] = $message;
412 $this->info[
'warning'][] = $message;
421 $AVpossibleEmptyKeys = array(
'dataformat',
'bits_per_sample',
'encoder_options',
'streams');
422 foreach ($AVpossibleEmptyKeys as $dummy => $key) {
423 if (empty($this->info[
'audio'][$key]) && isset($this->info[
'audio'][$key])) {
424 unset($this->info[
'audio'][$key]);
426 if (empty($this->info[
'video'][$key]) && isset($this->info[
'video'][$key])) {
427 unset($this->info[
'video'][$key]);
432 if (!empty($this->info)) {
433 foreach ($this->info as $key => $value) {
434 if (empty($this->info[$key]) && ($this->info[$key] !== 0) && ($this->info[$key] !==
'0')) {
435 unset($this->info[$key]);
441 if (empty($this->info[
'fileformat'])) {
442 if (isset($this->info[
'avdataoffset'])) {
443 unset($this->info[
'avdataoffset']);
445 if (isset($this->info[
'avdataend'])) {
446 unset($this->info[
'avdataend']);
454 static $format_info = array();
455 if (empty($format_info)) {
456 $format_info = array(
462 'pattern' =>
'^\x0B\x77',
465 'mime_type' =>
'audio/ac3',
470 'pattern' =>
'^ADIF',
474 'mime_type' =>
'application/octet-stream',
475 'fail_ape' =>
'WARNING',
481 'pattern' =>
'^\xFF[\xF0-\xF1\xF8-\xF9]',
485 'mime_type' =>
'application/octet-stream',
486 'fail_ape' =>
'WARNING',
492 'pattern' =>
'^\.snd',
495 'mime_type' =>
'audio/basic',
500 'pattern' =>
'^2BIT',
503 'mime_type' =>
'application/octet-stream',
508 'pattern' =>
'^\x00(BONK|INFO|META| ID3)',
511 'mime_type' =>
'audio/xmms-bonk',
516 'pattern' =>
'^fLaC',
519 'mime_type' =>
'audio/x-flac',
524 'pattern' =>
'^LA0[2-4]',
527 'mime_type' =>
'application/octet-stream',
532 'pattern' =>
'^LPAC',
535 'mime_type' =>
'application/octet-stream',
540 'pattern' =>
'^MThd',
543 'mime_type' =>
'audio/midi',
548 'pattern' =>
'^MAC ',
550 'module' =>
'monkey',
551 'mime_type' =>
'application/octet-stream',
556 'pattern' =>
'^.{1080}(M.K.|[5-9]CHN|[1-3][0-9]CH)',
560 'mime_type' =>
'audio/mod',
565 'pattern' =>
'^IMPM',
569 'mime_type' =>
'audio/it',
574 'pattern' =>
'^Extended Module',
578 'mime_type' =>
'audio/xm',
583 'pattern' =>
'^.{44}SCRM',
587 'mime_type' =>
'audio/s3m',
592 'pattern' =>
'^(MP\+|[\x00\x01\x10\x11\x40\x41\x50\x51\x80\x81\x90\x91\xC0\xC1\xD0\xD1][\x20-37][\x00\x20\x40\x60\x80\xA0\xC0\xE0])',
595 'mime_type' =>
'application/octet-stream',
600 'pattern' =>
'^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]',
603 'mime_type' =>
'audio/mpeg',
608 'pattern' =>
'^(\*RIFF|OFR)',
610 'module' =>
'optimfrog',
611 'mime_type' =>
'application/octet-stream',
619 'mime_type' =>
'application/octet-stream',
624 'pattern' =>
'^ajkg',
626 'module' =>
'shorten',
627 'mime_type' =>
'audio/xmms-shn',
628 'fail_id3' =>
'ERROR',
629 'fail_ape' =>
'ERROR',
637 'mime_type' =>
'application/octet-stream',
642 'pattern' =>
'^Creative Voice File',
645 'mime_type' =>
'audio/voc',
650 'pattern' =>
'^TWIN',
653 'mime_type' =>
'application/octet-stream',
658 'pattern' =>
'^wvpk',
660 'module' =>
'wavpack',
661 'mime_type' =>
'application/octet-stream',
669 'pattern' =>
'^\x30\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C',
670 'group' =>
'audio-video',
672 'mime_type' =>
'video/x-ms-asf',
673 'iconv_req' =>
false,
678 'pattern' =>
'^(BIK|SMK)',
679 'group' =>
'audio-video',
681 'mime_type' =>
'application/octet-stream',
686 'pattern' =>
'^FLV\x01',
687 'group' =>
'audio-video',
689 'mime_type' =>
'video/x-flv',
694 'pattern' =>
'^\x1A\x45\xDF\xA3',
695 'group' =>
'audio-video',
696 'module' =>
'matroska',
697 'mime_type' =>
'application/octet-stream',
702 'pattern' =>
'^\x00\x00\x01(\xBA|\xB3)',
703 'group' =>
'audio-video',
705 'mime_type' =>
'video/mpeg',
710 'pattern' =>
'^NSV[sf]',
711 'group' =>
'audio-video',
713 'mime_type' =>
'application/octet-stream',
718 'pattern' =>
'^OggS',
721 'mime_type' =>
'application/ogg',
722 'fail_id3' =>
'WARNING',
723 'fail_ape' =>
'WARNING',
727 'quicktime' => array(
728 'pattern' =>
'^.{4}(cmov|free|ftyp|mdat|moov|pnot|skip|wide)',
729 'group' =>
'audio-video',
730 'module' =>
'quicktime',
731 'mime_type' =>
'video/quicktime',
736 'pattern' =>
'^(RIFF|SDSS|FORM)',
737 'group' =>
'audio-video',
739 'mime_type' =>
'audio/x-wave',
740 'fail_ape' =>
'WARNING',
745 'pattern' =>
'^(\.RMF|.ra)',
746 'group' =>
'audio-video',
748 'mime_type' =>
'audio/x-realaudio',
753 'pattern' =>
'^(F|C)WS',
754 'group' =>
'audio-video',
756 'mime_type' =>
'application/x-shockwave-flash',
765 'group' =>
'graphic',
767 'mime_type' =>
'image/bmp',
768 'fail_id3' =>
'ERROR',
769 'fail_ape' =>
'ERROR',
775 'group' =>
'graphic',
777 'mime_type' =>
'image/gif',
778 'fail_id3' =>
'ERROR',
779 'fail_ape' =>
'ERROR',
784 'pattern' =>
'^\xFF\xD8\xFF',
785 'group' =>
'graphic',
787 'mime_type' =>
'image/jpeg',
788 'fail_id3' =>
'ERROR',
789 'fail_ape' =>
'ERROR',
794 'pattern' =>
'^.{2048}PCD_IPI\x00',
795 'group' =>
'graphic',
797 'mime_type' =>
'image/x-photo-cd',
798 'fail_id3' =>
'ERROR',
799 'fail_ape' =>
'ERROR',
805 'pattern' =>
'^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A',
806 'group' =>
'graphic',
808 'mime_type' =>
'image/png',
809 'fail_id3' =>
'ERROR',
810 'fail_ape' =>
'ERROR',
816 'pattern' =>
'^(II\x2A\x00|MM\x00\x2A)',
817 'group' =>
'graphic',
819 'mime_type' =>
'image/tiff',
820 'fail_id3' =>
'ERROR',
821 'fail_ape' =>
'ERROR',
829 'pattern' =>
'^.{32769}CD001',
832 'mime_type' =>
'application/octet-stream',
833 'fail_id3' =>
'ERROR',
834 'fail_ape' =>
'ERROR',
835 'iconv_req' =>
false,
840 'pattern' =>
'^Rar\!',
841 'group' =>
'archive',
843 'mime_type' =>
'application/octet-stream',
844 'fail_id3' =>
'ERROR',
845 'fail_ape' =>
'ERROR',
850 'pattern' =>
'^SZ\x0A\x04',
851 'group' =>
'archive',
853 'mime_type' =>
'application/octet-stream',
854 'fail_id3' =>
'ERROR',
855 'fail_ape' =>
'ERROR',
860 'pattern' =>
'^.{100}[0-9\x20]{7}\x00[0-9\x20]{7}\x00[0-9\x20]{7}\x00[0-9\x20\x00]{12}[0-9\x20\x00]{12}',
861 'group' =>
'archive',
863 'mime_type' =>
'application/x-tar',
864 'fail_id3' =>
'ERROR',
865 'fail_ape' =>
'ERROR',
870 'pattern' =>
'^\x1F\x8B\x08',
871 'group' =>
'archive',
873 'mime_type' =>
'application/x-gzip',
874 'fail_id3' =>
'ERROR',
875 'fail_ape' =>
'ERROR',
880 'pattern' =>
'^PK\x03\x04',
881 'group' =>
'archive',
883 'mime_type' =>
'application/zip',
884 'fail_id3' =>
'ERROR',
885 'fail_ape' =>
'ERROR',
893 'pattern' =>
'^\x25PDF',
896 'mime_type' =>
'application/pdf',
897 'fail_id3' =>
'ERROR',
898 'fail_ape' =>
'ERROR',
903 'pattern' =>
'^\xD0\xCF\x11\xE0',
905 'module' =>
'msoffice',
906 'mime_type' =>
'application/octet-stream',
907 'fail_id3' =>
'ERROR',
908 'fail_ape' =>
'ERROR',
929 if (preg_match(
'/'.$info[
'pattern'].
'/s', $filedata)) {
930 $info[
'include'] =
'module.'.$info[
'group'].
'.'.$info[
'module'].
'.php';
936 if (preg_match(
'/\.mp[123a]$/i',
$filename)) {
940 $info = $GetFileFormatArray[
'mp3'];
941 $info[
'include'] =
'module.'.$info[
'group'].
'.'.$info[
'module'].
'.php';
958 foreach ($array as $key => $value) {
961 if (is_array($value)) {
966 elseif (is_string($value)) {
979 'asf' => array(
'asf' ,
'UTF-16LE'),
980 'midi' => array(
'midi' ,
'ISO-8859-1'),
981 'nsv' => array(
'nsv' ,
'ISO-8859-1'),
982 'ogg' => array(
'vorbiscomment' ,
'UTF-8'),
983 'png' => array(
'png' ,
'UTF-8'),
984 'tiff' => array(
'tiff' ,
'ISO-8859-1'),
985 'quicktime' => array(
'quicktime' ,
'ISO-8859-1'),
986 'real' => array(
'real' ,
'ISO-8859-1'),
987 'vqf' => array(
'vqf' ,
'ISO-8859-1'),
988 'zip' => array(
'zip' ,
'ISO-8859-1'),
989 'riff' => array(
'riff' ,
'ISO-8859-1'),
990 'lyrics3' => array(
'lyrics3' ,
'ISO-8859-1'),
991 'id3v1' => array(
'id3v1' , $this->encoding_id3v1),
992 'id3v2' => array(
'id3v2' ,
'UTF-8'),
993 'ape' => array(
'ape' ,
'UTF-8')
998 foreach ($tags as $comment_name => $tagname_encoding_array) {
999 list($tag_name,
$encoding) = $tagname_encoding_array;
1002 if (isset($this->info[$comment_name]) && !isset($this->info[$comment_name][
'encoding'])) {
1003 $this->info[$comment_name][
'encoding'] =
$encoding;
1007 if (!empty($this->info[$comment_name][
'comments'])) {
1009 foreach ($this->info[$comment_name][
'comments'] as $tag_key => $valuearray) {
1010 foreach ($valuearray as $key => $value) {
1011 if (strlen(trim($value)) > 0) {
1012 $this->info[
'tags'][trim($tag_name)][trim($tag_key)][] = $value;
1017 if (!isset($this->info[
'tags'][$tag_name])) {
1022 if ($this->option_tags_html) {
1023 foreach ($this->info[
'tags'][$tag_name] as $tag_key => $valuearray) {
1024 foreach ($valuearray as $key => $value) {
1025 if (is_string($value)) {
1029 $this->info[
'tags_html'][$tag_name][$tag_key][$key] = $value;
1044 switch ($algorithm) {
1050 return $this->
error(
'bad algorithm "'.$algorithm.
'" in getHashdata()');
1054 if ((@$this->info[
'fileformat'] ==
'ogg') && (@$this->info[
'audio'][
'dataformat'] ==
'vorbis')) {
1074 if ((
bool) ini_get(
'safe_mode')) {
1076 $this->info[
'warning'][] =
'Failed making system call to vorbiscomment.exe - '.$algorithm.
'_data is incorrect - error returned: PHP running in Safe Mode (backtick operator not available)';
1077 $this->info[$algorithm.
'_data'] =
false;
1082 $old_abort = ignore_user_abort(
true);
1085 $empty = tempnam(
'*',
'getID3');
1090 $temp = tempnam(
'*',
'getID3');
1091 $file = $this->info[
'filenamepath'];
1093 if (GETID3_OS_ISWINDOWS) {
1095 if (file_exists(GETID3_HELPERAPPSDIR.
'vorbiscomment.exe')) {
1097 $commandline =
'"'.GETID3_HELPERAPPSDIR.
'vorbiscomment.exe" -w -c "'.$empty.
'" "'.
$file.
'" "'.$temp.
'"';
1098 $VorbisCommentError = `$commandline`;
1102 $VorbisCommentError =
'vorbiscomment.exe not found in '.GETID3_HELPERAPPSDIR;
1108 $commandline =
'vorbiscomment -w -c "'.$empty.
'" "'.
$file.
'" "'.$temp.
'" 2>&1';
1109 $commandline =
'vorbiscomment -w -c '.escapeshellarg($empty).
' '.escapeshellarg(
$file).
' '.escapeshellarg($temp).
' 2>&1';
1110 $VorbisCommentError = `$commandline`;
1114 if (!empty($VorbisCommentError)) {
1116 $this->info[
'warning'][] =
'Failed making system call to vorbiscomment(.exe) - '.$algorithm.
'_data will be incorrect. If vorbiscomment is unavailable, please download from http://www.vorbis.com/download.psp and put in the getID3() directory. Error returned: '.$VorbisCommentError;
1117 $this->info[$algorithm.
'_data'] =
false;
1122 switch ($algorithm) {
1138 ignore_user_abort($old_abort);
1144 if (!empty($this->info[
'avdataoffset']) || (isset($this->info[
'avdataend']) && ($this->info[
'avdataend'] < $this->info[
'filesize']))) {
1147 $this->info[$algorithm.
'_data'] =
getid3_lib::hash_data($this->info[
'filenamepath'], $this->info[
'avdataoffset'], $this->info[
'avdataend'], $algorithm);
1152 switch ($algorithm) {
1171 if (@$this->info[
'audio'][
'channels'] ==
'1') {
1172 $this->info[
'audio'][
'channelmode'] =
'mono';
1173 } elseif (@$this->info[
'audio'][
'channels'] ==
'2') {
1174 $this->info[
'audio'][
'channelmode'] =
'stereo';
1178 $CombinedBitrate = 0;
1179 $CombinedBitrate += (isset($this->info[
'audio'][
'bitrate']) ? $this->info[
'audio'][
'bitrate'] : 0);
1180 $CombinedBitrate += (isset($this->info[
'video'][
'bitrate']) ? $this->info[
'video'][
'bitrate'] : 0);
1181 if (($CombinedBitrate > 0) && empty($this->info[
'bitrate'])) {
1182 $this->info[
'bitrate'] = $CombinedBitrate;
1190 if (!isset($this->info[
'playtime_seconds']) && !empty($this->info[
'bitrate'])) {
1191 $this->info[
'playtime_seconds'] = (($this->info[
'avdataend'] - $this->info[
'avdataoffset']) * 8) / $this->info[
'bitrate'];
1195 if (!empty($this->info[
'playtime_seconds']) && empty($this->info[
'playtime_string'])) {
1202 if (empty($this->info[
'video'])) {
1205 if (empty($this->info[
'video'][
'resolution_x']) || empty($this->info[
'video'][
'resolution_y'])) {
1208 if (empty($this->info[
'video'][
'bits_per_sample'])) {
1212 switch ($this->info[
'video'][
'dataformat']) {
1220 $PlaytimeSeconds = 1;
1221 $BitrateCompressed = $this->info[
'filesize'] * 8;
1225 if (!empty($this->info[
'video'][
'frame_rate'])) {
1226 $FrameRate = $this->info[
'video'][
'frame_rate'];
1230 if (!empty($this->info[
'playtime_seconds'])) {
1231 $PlaytimeSeconds = $this->info[
'playtime_seconds'];
1235 if (!empty($this->info[
'video'][
'bitrate'])) {
1236 $BitrateCompressed = $this->info[
'video'][
'bitrate'];
1242 $BitrateUncompressed = $this->info[
'video'][
'resolution_x'] * $this->info[
'video'][
'resolution_y'] * $this->info[
'video'][
'bits_per_sample'] * $FrameRate;
1244 $this->info[
'video'][
'compression_ratio'] = $BitrateCompressed / $BitrateUncompressed;
1250 if (empty($this->info[
'audio'][
'bitrate']) || empty($this->info[
'audio'][
'channels']) || empty($this->info[
'audio'][
'sample_rate'])) {
1253 $this->info[
'audio'][
'compression_ratio'] = $this->info[
'audio'][
'bitrate'] / ($this->info[
'audio'][
'channels'] * $this->info[
'audio'][
'sample_rate'] * (!empty($this->info[
'audio'][
'bits_per_sample']) ? $this->info[
'audio'][
'bits_per_sample'] : 16));
1255 if (!empty($this->info[
'audio'][
'streams'])) {
1256 foreach ($this->info[
'audio'][
'streams'] as $streamnumber => $streamdata) {
1257 if (!empty($streamdata[
'bitrate']) && !empty($streamdata[
'channels']) && !empty($streamdata[
'sample_rate'])) {
1258 $this->info[
'audio'][
'streams'][$streamnumber][
'compression_ratio'] = $streamdata[
'bitrate'] / ($streamdata[
'channels'] * $streamdata[
'sample_rate'] * (!empty($streamdata[
'bits_per_sample']) ? $streamdata[
'bits_per_sample'] : 16));
1267 if (isset($this->info[
'replay_gain'])) {
1268 $this->info[
'replay_gain'][
'reference_volume'] = 89;
1269 if (isset($this->info[
'replay_gain'][
'track'][
'adjustment'])) {
1270 $this->info[
'replay_gain'][
'track'][
'volume'] = $this->info[
'replay_gain'][
'reference_volume'] - $this->info[
'replay_gain'][
'track'][
'adjustment'];
1272 if (isset($this->info[
'replay_gain'][
'album'][
'adjustment'])) {
1273 $this->info[
'replay_gain'][
'album'][
'volume'] = $this->info[
'replay_gain'][
'reference_volume'] - $this->info[
'replay_gain'][
'album'][
'adjustment'];
1276 if (isset($this->info[
'replay_gain'][
'track'][
'peak'])) {
1277 $this->info[
'replay_gain'][
'track'][
'max_noclip_gain'] = 0 -
getid3_lib::RGADamplitude2dB($this->info[
'replay_gain'][
'track'][
'peak']);
1279 if (isset($this->info[
'replay_gain'][
'album'][
'peak'])) {
1280 $this->info[
'replay_gain'][
'album'][
'max_noclip_gain'] = 0 -
getid3_lib::RGADamplitude2dB($this->info[
'replay_gain'][
'album'][
'peak']);
1287 if (!empty($this->info[
'audio'][
'bitrate']) || !empty($this->info[
'audio'][
'channels']) || !empty($this->info[
'audio'][
'sample_rate'])) {
1288 if (!isset($this->info[
'audio'][
'streams'])) {
1289 foreach ($this->info[
'audio'] as $key => $value) {
1290 if ($key !=
'streams') {
1291 $this->info[
'audio'][
'streams'][0][$key] = $value;
1300 return tempnam($this->tempdir,
'gI3');