17 function PrintHexBytes($string, $hex=
true, $spaces=
true, $htmlsafe=
true) {
19 for ($i = 0; $i < strlen($string); $i++) {
21 $returnstring .= str_pad(dechex(ord($string{$i})), 2,
'0', STR_PAD_LEFT);
23 $returnstring .=
' '.(ereg(
"[\x20-\x7E]", $string{$i}) ? $string{$i} :
'¤');
30 $returnstring = htmlentities($returnstring);
36 if (get_magic_quotes_gpc()) {
37 return stripslashes($text);
46 if ($floatnumber >= 1) {
47 $truncatednumber = floor($floatnumber);
48 }
elseif ($floatnumber <= -1) {
49 $truncatednumber = ceil($floatnumber);
53 if ($truncatednumber <= 1073741824) {
54 $truncatednumber = (int) $truncatednumber;
56 return $truncatednumber;
62 $floatnum = (float) $floatnum;
67 if ($floatnum <= 1073741824) {
69 $floatnum = (int) $floatnum;
79 return ($numerator / $denominator);
85 if (strpos($binarypointnumber,
'.') ===
false) {
86 $binarypointnumber =
'0.'.$binarypointnumber;
87 }
elseif ($binarypointnumber{0} ==
'.') {
88 $binarypointnumber =
'0'.$binarypointnumber;
91 while (($binarypointnumber{0} !=
'1') || (substr($binarypointnumber, 1, 1) !=
'.')) {
92 if (substr($binarypointnumber, 1, 1) ==
'.') {
94 $binarypointnumber = substr($binarypointnumber, 2, 1).
'.'.substr($binarypointnumber, 3);
96 $pointpos = strpos($binarypointnumber,
'.');
97 $exponent += ($pointpos - 1);
98 $binarypointnumber = str_replace(
'.',
'', $binarypointnumber);
99 $binarypointnumber = $binarypointnumber{0}.
'.'.substr($binarypointnumber, 1);
102 $binarypointnumber = str_pad(substr($binarypointnumber, 0, $maxbits + 2), $maxbits + 2,
'0', STR_PAD_RIGHT);
103 return array(
'normalized'=>$binarypointnumber,
'exponent'=>(
int) $exponent);
111 $floatpart = abs($floatvalue - $intpart);
112 $pointbitstring =
'';
113 while (($floatpart != 0) && (strlen($pointbitstring) < $maxbits)) {
118 $binarypointnumber = decbin($intpart).
'.'.$pointbitstring;
119 return $binarypointnumber;
140 if ($floatvalue >= 0) {
146 $biasedexponent = pow(2, $exponentbits - 1) - 1 + $normalizedbinary[
'exponent'];
147 $exponentbitstring = str_pad(decbin($biasedexponent), $exponentbits,
'0', STR_PAD_LEFT);
148 $fractionbitstring = str_pad(substr($normalizedbinary[
'normalized'], 2), $fractionbits,
'0', STR_PAD_RIGHT);
165 $signbit = $bitword{0};
167 switch (strlen($byteword) * 8) {
181 $exponentstring = substr($bitword, 1, 15);
182 $isnormalized = intval($bitword{16});
183 $fractionstring = substr($bitword, 17, 63);
186 $floatvalue = $exponent * $fraction;
187 if ($signbit ==
'1') {
197 $exponentstring = substr($bitword, 1, $exponentbits);
198 $fractionstring = substr($bitword, $exponentbits + 1, $fractionbits);
202 if (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction != 0)) {
205 }
elseif (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction == 0)) {
206 if ($signbit ==
'1') {
207 $floatvalue =
'-infinity';
209 $floatvalue =
'+infinity';
211 }
elseif (($exponent == 0) && ($fraction == 0)) {
212 if ($signbit ==
'1') {
217 $floatvalue = ($signbit ? 0 : -0);
218 }
elseif (($exponent == 0) && ($fraction != 0)) {
221 if ($signbit ==
'1') {
224 }
elseif ($exponent != 0) {
226 if ($signbit ==
'1') {
230 return (
float) $floatvalue;
236 $bytewordlen = strlen($byteword);
237 for ($i = 0; $i < $bytewordlen; $i++) {
239 $intvalue = $intvalue | (ord($byteword{$i}) & 0x7F) << (($bytewordlen - 1 - $i) * 7);
241 $intvalue += ord($byteword{$i}) * pow(256, ($bytewordlen - 1 - $i));
244 if ($signed && !$synchsafe) {
246 switch ($bytewordlen) {
251 $signmaskbit = 0x80 << (8 * ($bytewordlen - 1));
252 if ($intvalue & $signmaskbit) {
253 $intvalue = 0 - ($intvalue & ($signmaskbit - 1));
258 die(
'ERROR: Cannot have signed integers larger than 32-bits in getid3_lib::BigEndian2Int()');
273 $bytewordlen = strlen($byteword);
274 for ($i = 0; $i < $bytewordlen; $i++) {
275 $binvalue .= str_pad(decbin(ord($byteword{$i})), 8,
'0', STR_PAD_LEFT);
285 $maskbyte = (($synchsafe || $signed) ? 0x7F : 0xFF);
289 die(
'ERROR: Cannot have signed integers larger than 32-bits in getid3_lib::BigEndian2String()');
291 $number = $number & (0x80 << (8 * ($minbytes - 1)));
293 while ($number != 0) {
294 $quotient = ($number / ($maskbyte + 1));
295 $intstring = chr(ceil(($quotient - floor($quotient)) * $maskbyte)).$intstring;
296 $number = floor($quotient);
298 return str_pad($intstring, $minbytes,
"\x00", STR_PAD_LEFT);
303 while ($number >= 256) {
304 $bytes[] = (($number / 256) - (floor($number / 256))) * 256;
305 $number = floor($number / 256);
309 for ($i = 0; $i < count($bytes); $i++) {
310 $binstring = (($i == count($bytes) - 1) ? decbin($bytes[$i]) : str_pad(decbin($bytes[$i]), 8,
'0', STR_PAD_LEFT)).$binstring;
319 if ($binstring{0} ==
'1') {
322 $binstring = substr($binstring, 1);
325 for ($i = 0; $i < strlen($binstring); $i++) {
326 $decvalue += ((int) substr($binstring, strlen($binstring) - $i - 1, 1)) * pow(2, $i);
335 $binstringreversed = strrev($binstring);
336 for ($i = 0; $i < strlen($binstringreversed); $i += 8) {
345 while ($number > 0) {
347 $intstring = $intstring.chr($number & 127);
350 $intstring = $intstring.chr($number & 255);
354 return str_pad($intstring, $minbytes,
"\x00", STR_PAD_RIGHT);
361 if (!is_array($array1) || !is_array($array2)) {
365 foreach ($array2 as
$key => $val) {
366 if (is_array($val) && isset($newarray[
$key]) && is_array($newarray[$key])) {
369 $newarray[
$key] = $val;
377 if (!is_array($array1) || !is_array($array2)) {
381 foreach ($array2 as
$key => $val) {
382 if (is_array($val) && isset($newarray[
$key]) && is_array($newarray[$key])) {
384 }
elseif (!isset($newarray[$key])) {
385 $newarray[
$key] = $val;
396 for ($i = 0; $i < $numextensions; $i++) {
397 $offset = strpos($reversedfilename,
'.', $offset + 1);
398 if ($offset ===
false) {
402 return strrev(substr($reversedfilename, 0, $offset));
409 $contentseconds = round((($playtimeseconds / 60) - floor($playtimeseconds / 60)) * 60);
410 $contentminutes = floor($playtimeseconds / 60);
411 if ($contentseconds >= 60) {
412 $contentseconds -= 60;
415 return intval($contentminutes).
':'.str_pad($contentseconds, 2, 0, STR_PAD_LEFT);
421 static $image_type_to_mime_type = array();
422 if (empty($image_type_to_mime_type)) {
423 $image_type_to_mime_type[1] =
'image/gif';
424 $image_type_to_mime_type[2] =
'image/jpeg';
425 $image_type_to_mime_type[3] =
'image/png';
426 $image_type_to_mime_type[4] =
'application/x-shockwave-flash';
427 $image_type_to_mime_type[5] =
'image/psd';
428 $image_type_to_mime_type[6] =
'image/bmp';
429 $image_type_to_mime_type[7] =
'image/tiff';
430 $image_type_to_mime_type[8] =
'image/tiff';
435 $image_type_to_mime_type[13] =
'application/x-shockwave-flash';
436 $image_type_to_mime_type[14] =
'image/iff';
438 return (isset($image_type_to_mime_type[$imagetypeid]) ? $image_type_to_mime_type[$imagetypeid] :
'application/octet-stream');
472 while ($ArrayPath && ($ArrayPath{0} == $Separator)) {
473 $ArrayPath = substr($ArrayPath, 1);
475 if (($pos = strpos($ArrayPath, $Separator)) !==
false) {
478 $ReturnedArray[$ArrayPath] = $Value;
480 return $ReturnedArray;
486 foreach ($arraydata as
$key => $value) {
487 if (!is_array($value)) {
488 if ($value > $maxvalue) {
494 return ($returnkey ? $maxkey : $maxvalue);
500 foreach ($arraydata as
$key => $value) {
501 if (!is_array($value)) {
502 if ($value > $minvalue) {
508 return ($returnkey ? $minkey : $minvalue);
515 if (function_exists(
'md5_file')) {
519 if (GETID3_OS_ISWINDOWS) {
521 $RequiredFiles = array(
'cygwin1.dll',
'md5sum.exe');
522 foreach ($RequiredFiles as $required_file) {
523 if (!is_readable(GETID3_HELPERAPPSDIR.$required_file)) {
524 die(implode(
' and ', $RequiredFiles).
' are required in '.GETID3_HELPERAPPSDIR.
' for getid3_lib::md5_file() to function under Windows in PHP < v4.2.0');
527 $commandline = GETID3_HELPERAPPSDIR.
'md5sum.exe "'.str_replace(
'/', DIRECTORY_SEPARATOR,
$file).
'"';
528 if (ereg(
"^[\\]?([0-9a-f]{32})", strtolower(`$commandline`), $r)) {
536 if (ereg(
"^([0-9a-f]{32})[ \t\n\r]", `md5sum
"$file"`, $r)) {
548 if (function_exists(
'sha1_file')) {
554 if (GETID3_OS_ISWINDOWS) {
556 $RequiredFiles = array(
'cygwin1.dll',
'sha1sum.exe');
557 foreach ($RequiredFiles as $required_file) {
558 if (!is_readable(GETID3_HELPERAPPSDIR.$required_file)) {
559 die(implode(
' and ', $RequiredFiles).
' are required in '.GETID3_HELPERAPPSDIR.
' for getid3_lib::sha1_file() to function under Windows in PHP < v4.3.0');
562 $commandline = GETID3_HELPERAPPSDIR.
'sha1sum.exe "'.str_replace(
'/', DIRECTORY_SEPARATOR,
$file).
'"';
563 if (ereg(
"^sha1=([0-9a-f]{40})", strtolower(`$commandline`), $r)) {
569 $commandline =
'sha1sum '.escapeshellarg(
$file).
'';
570 if (ereg(
"^([0-9a-f]{40})[ \t\n\r]", strtolower(`$commandline`), $r)) {
584 switch ($algorithm) {
586 $hash_function =
'md5_file';
587 $unix_call =
'md5sum';
588 $windows_call =
'md5sum.exe';
593 $hash_function =
'sha1_file';
594 $unix_call =
'sha1sum';
595 $windows_call =
'sha1sum.exe';
600 die(
'Invalid algorithm ('.$algorithm.
') in getid3_lib::hash_data()');
603 $size = $end - $offset;
605 if (GETID3_OS_ISWINDOWS) {
609 if ($algorithm ==
'sha1') {
613 $RequiredFiles = array(
'cygwin1.dll',
'head.exe',
'tail.exe', $windows_call);
614 foreach ($RequiredFiles as $required_file) {
615 if (!is_readable(GETID3_HELPERAPPSDIR.$required_file)) {
620 $commandline = GETID3_HELPERAPPSDIR.
'head.exe -c '.$end.
' "'.escapeshellarg(str_replace(
'/', DIRECTORY_SEPARATOR,
$file)).
'" | ';
621 $commandline .= GETID3_HELPERAPPSDIR.
'tail.exe -c '.
$size.
' | ';
622 $commandline .= GETID3_HELPERAPPSDIR.$windows_call;
626 $commandline =
'head -c'.$end.
' '.escapeshellarg(
$file).
' | ';
627 $commandline .=
'tail -c'.$size.
' | ';
628 $commandline .= $unix_call;
631 if ((
bool) ini_get(
'safe_mode')) {
632 $ThisFileInfo[
'warning'][] =
'PHP running in Safe Mode - backtick operator not available, using slower non-system-call '.$algorithm.
' algorithm';
635 return substr(`$commandline`, 0, $hash_length);
639 if (($data_filename = tempnam(
'*',
'getID3')) ===
false) {
648 if ($fp = @fopen(
$file,
'rb')) {
650 if ($fp_data = @fopen($data_filename,
'wb')) {
652 fseek($fp, $offset, SEEK_SET);
653 $byteslefttowrite = $end - $offset;
655 $byteswritten = fwrite($fp_data, $buffer, $byteslefttowrite);
656 $byteslefttowrite -= $byteswritten;
659 $result = getid3_lib::$hash_function($data_filename);
664 unlink($data_filename);
670 if ($charval < 128) {
672 $newcharstring = chr($charval);
673 }
elseif ($charval < 2048) {
675 $newcharstring = chr(($charval >> 6) | 0xC0);
676 $newcharstring .= chr(($charval & 0x3F) | 0x80);
677 }
elseif ($charval < 65536) {
679 $newcharstring = chr(($charval >> 12) | 0xE0);
680 $newcharstring .= chr(($charval >> 6) | 0xC0);
681 $newcharstring .= chr(($charval & 0x3F) | 0x80);
684 $newcharstring = chr(($charval >> 18) | 0xF0);
685 $newcharstring .= chr(($charval >> 12) | 0xC0);
686 $newcharstring .= chr(($charval >> 6) | 0xC0);
687 $newcharstring .= chr(($charval & 0x3F) | 0x80);
689 return $newcharstring;
694 if (function_exists(
'utf8_encode')) {
695 return utf8_encode($string);
700 $newcharstring .=
"\xEF\xBB\xBF";
702 for ($i = 0; $i < strlen($string); $i++) {
703 $charval = ord($string{$i});
706 return $newcharstring;
713 $newcharstring .=
"\xFE\xFF";
715 for ($i = 0; $i < strlen($string); $i++) {
716 $newcharstring .=
"\x00".$string{$i};
718 return $newcharstring;
725 $newcharstring .=
"\xFF\xFE";
727 for ($i = 0; $i < strlen($string); $i++) {
728 $newcharstring .= $string{$i}.
"\x00";
730 return $newcharstring;
740 if (function_exists(
'utf8_decode')) {
741 return utf8_decode($string);
746 $stringlength = strlen($string);
747 while ($offset < $stringlength) {
748 if ((ord($string{$offset}) | 0x07) == 0xF7) {
750 $charval = ((ord($string{($offset + 0)}) & 0x07) << 18) &
751 ((ord($string{($offset + 1)}) & 0x3F) << 12) &
752 ((ord($string{($offset + 2)}) & 0x3F) << 6) &
753 (ord($string{($offset + 3)}) & 0x3F);
755 }
elseif ((ord($string{$offset}) | 0x0F) == 0xEF) {
757 $charval = ((ord($string{($offset + 0)}) & 0x0F) << 12) &
758 ((ord($string{($offset + 1)}) & 0x3F) << 6) &
759 (ord($string{($offset + 2)}) & 0x3F);
761 }
elseif ((ord($string{$offset}) | 0x1F) == 0xDF) {
763 $charval = ((ord($string{($offset + 0)}) & 0x1F) << 6) &
764 (ord($string{($offset + 1)}) & 0x3F);
766 }
elseif ((ord($string{$offset}) | 0x7F) == 0x7F) {
768 $charval = ord($string{$offset});
775 if ($charval !==
false) {
776 $newcharstring .= (($charval < 256) ? chr($charval) :
'?');
779 return $newcharstring;
786 $newcharstring .=
"\xFE\xFF";
789 $stringlength = strlen($string);
790 while ($offset < $stringlength) {
791 if ((ord($string{$offset}) | 0x07) == 0xF7) {
793 $charval = ((ord($string{($offset + 0)}) & 0x07) << 18) &
794 ((ord($string{($offset + 1)}) & 0x3F) << 12) &
795 ((ord($string{($offset + 2)}) & 0x3F) << 6) &
796 (ord($string{($offset + 3)}) & 0x3F);
798 }
elseif ((ord($string{$offset}) | 0x0F) == 0xEF) {
800 $charval = ((ord($string{($offset + 0)}) & 0x0F) << 12) &
801 ((ord($string{($offset + 1)}) & 0x3F) << 6) &
802 (ord($string{($offset + 2)}) & 0x3F);
804 }
elseif ((ord($string{$offset}) | 0x1F) == 0xDF) {
806 $charval = ((ord($string{($offset + 0)}) & 0x1F) << 6) &
807 (ord($string{($offset + 1)}) & 0x3F);
809 }
elseif ((ord($string{$offset}) | 0x7F) == 0x7F) {
811 $charval = ord($string{$offset});
818 if ($charval !==
false) {
822 return $newcharstring;
829 $newcharstring .=
"\xFF\xFE";
832 $stringlength = strlen($string);
833 while ($offset < $stringlength) {
834 if ((ord($string{$offset}) | 0x07) == 0xF7) {
836 $charval = ((ord($string{($offset + 0)}) & 0x07) << 18) &
837 ((ord($string{($offset + 1)}) & 0x3F) << 12) &
838 ((ord($string{($offset + 2)}) & 0x3F) << 6) &
839 (ord($string{($offset + 3)}) & 0x3F);
841 }
elseif ((ord($string{$offset}) | 0x0F) == 0xEF) {
843 $charval = ((ord($string{($offset + 0)}) & 0x0F) << 12) &
844 ((ord($string{($offset + 1)}) & 0x3F) << 6) &
845 (ord($string{($offset + 2)}) & 0x3F);
847 }
elseif ((ord($string{$offset}) | 0x1F) == 0xDF) {
849 $charval = ((ord($string{($offset + 0)}) & 0x1F) << 6) &
850 (ord($string{($offset + 1)}) & 0x3F);
852 }
elseif ((ord($string{$offset}) | 0x7F) == 0x7F) {
854 $charval = ord($string{$offset});
861 if ($charval !==
false) {
865 return $newcharstring;
875 if (substr($string, 0, 2) ==
"\xFE\xFF") {
877 $string = substr($string, 2);
880 for ($i = 0; $i < strlen($string); $i += 2) {
884 return $newcharstring;
889 if (substr($string, 0, 2) ==
"\xFF\xFE") {
891 $string = substr($string, 2);
894 for ($i = 0; $i < strlen($string); $i += 2) {
898 return $newcharstring;
903 if (substr($string, 0, 2) ==
"\xFE\xFF") {
905 $string = substr($string, 2);
908 for ($i = 0; $i < strlen($string); $i += 2) {
910 $newcharstring .= (($charval < 256) ? chr($charval) :
'?');
912 return $newcharstring;
917 if (substr($string, 0, 2) ==
"\xFF\xFE") {
919 $string = substr($string, 2);
922 for ($i = 0; $i < strlen($string); $i += 2) {
924 $newcharstring .= (($charval < 256) ? chr($charval) :
'?');
926 return $newcharstring;
931 $bom = substr($string, 0, 2);
932 if ($bom ==
"\xFE\xFF") {
934 }
elseif ($bom ==
"\xFF\xFE") {
942 $bom = substr($string, 0, 2);
943 if ($bom ==
"\xFE\xFF") {
945 }
elseif ($bom ==
"\xFF\xFE") {
953 if ($in_charset == $out_charset) {
957 static $iconv_broken_or_unavailable = array();
958 if (is_null(@$iconv_broken_or_unavailable[$in_charset.
'_'.$out_charset])) {
959 $GETID3_ICONV_TEST_STRING =
' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚„…†‡‰Š‹ŚŤŽŹ‘’“”•–—™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙';
962 if (function_exists(
'iconv')) {
963 if (@iconv($in_charset,
'ISO-8859-1', @iconv(
'ISO-8859-1', $in_charset, $GETID3_ICONV_TEST_STRING)) == $GETID3_ICONV_TEST_STRING) {
964 if (@iconv($out_charset,
'ISO-8859-1', @iconv(
'ISO-8859-1', $out_charset, $GETID3_ICONV_TEST_STRING)) == $GETID3_ICONV_TEST_STRING) {
966 $iconv_broken_or_unavailable[$in_charset.
'_'.$out_charset] =
false;
970 $iconv_broken_or_unavailable[$in_charset.
'_'.$out_charset] =
true;
975 $iconv_broken_or_unavailable[$in_charset.
'_'.$out_charset] =
true;
979 $iconv_broken_or_unavailable[$in_charset.
'_'.$out_charset] =
true;
983 if ($iconv_broken_or_unavailable[$in_charset.
'_'.$out_charset]) {
984 static $ConversionFunctionList = array();
985 if (empty($ConversionFunctionList)) {
986 $ConversionFunctionList[
'ISO-8859-1'][
'UTF-8'] =
'iconv_fallback_iso88591_utf8';
987 $ConversionFunctionList[
'ISO-8859-1'][
'UTF-16'] =
'iconv_fallback_iso88591_utf16';
988 $ConversionFunctionList[
'ISO-8859-1'][
'UTF-16BE'] =
'iconv_fallback_iso88591_utf16be';
989 $ConversionFunctionList[
'ISO-8859-1'][
'UTF-16LE'] =
'iconv_fallback_iso88591_utf16le';
990 $ConversionFunctionList[
'UTF-8'][
'ISO-8859-1'] =
'iconv_fallback_utf8_iso88591';
991 $ConversionFunctionList[
'UTF-8'][
'UTF-16'] =
'iconv_fallback_utf8_utf16';
992 $ConversionFunctionList[
'UTF-8'][
'UTF-16BE'] =
'iconv_fallback_utf8_utf16be';
993 $ConversionFunctionList[
'UTF-8'][
'UTF-16LE'] =
'iconv_fallback_utf8_utf16le';
994 $ConversionFunctionList[
'UTF-16'][
'ISO-8859-1'] =
'iconv_fallback_utf16_iso88591';
995 $ConversionFunctionList[
'UTF-16'][
'UTF-8'] =
'iconv_fallback_utf16_utf8';
996 $ConversionFunctionList[
'UTF-16LE'][
'ISO-8859-1'] =
'iconv_fallback_utf16le_iso88591';
997 $ConversionFunctionList[
'UTF-16LE'][
'UTF-8'] =
'iconv_fallback_utf16le_utf8';
998 $ConversionFunctionList[
'UTF-16BE'][
'ISO-8859-1'] =
'iconv_fallback_utf16be_iso88591';
999 $ConversionFunctionList[
'UTF-16BE'][
'UTF-8'] =
'iconv_fallback_utf16be_utf8';
1001 if (isset($ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)])) {
1002 $ConversionFunction = $ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)];
1003 return getid3_lib::$ConversionFunction($string);
1005 die(
'PHP does not have iconv() support - cannot convert from '.$in_charset.
' to '.$out_charset);
1008 if ($converted_string = @iconv($in_charset, $out_charset.
'//TRANSLIT', $string)) {
1009 switch ($out_charset) {
1011 $converted_string = rtrim($converted_string,
"\x00");
1014 return $converted_string;
1035 case 'Windows-1251':
1039 case 'Windows-1252':
1054 $HTMLstring = htmlentities($string, ENT_COMPAT, $charset);
1058 $strlen = strlen($string);
1059 for ($i = 0; $i < $strlen; $i++) {
1060 $char_ord_val = ord($string{$i});
1062 if ($char_ord_val < 0x80) {
1063 $charval = $char_ord_val;
1064 }
elseif ((($char_ord_val & 0xF0) >> 4) == 0x0F) {
1065 $charval = (($char_ord_val & 0x07) << 18);
1066 $charval += ((ord($string{++$i}) & 0x3F) << 12);
1067 $charval += ((ord($string{++$i}) & 0x3F) << 6);
1068 $charval += (ord($string{++$i}) & 0x3F);
1069 }
elseif ((($char_ord_val & 0xE0) >> 5) == 0x07) {
1070 $charval = (($char_ord_val & 0x0F) << 12);
1071 $charval += ((ord($string{++$i}) & 0x3F) << 6);
1072 $charval += (ord($string{++$i}) & 0x3F);
1073 }
elseif ((($char_ord_val & 0xC0) >> 6) == 0x03) {
1074 $charval = (($char_ord_val & 0x1F) << 6);
1075 $charval += (ord($string{++$i}) & 0x3F);
1077 if (($charval >= 32) && ($charval <= 127)) {
1078 $HTMLstring .= chr($charval);
1080 $HTMLstring .=
'&#'.$charval.
';';
1086 for ($i = 0; $i < strlen($string); $i += 2) {
1088 if (($charval >= 32) && ($charval <= 127)) {
1089 $HTMLstring .= chr($charval);
1091 $HTMLstring .=
'&#'.$charval.
';';
1097 for ($i = 0; $i < strlen($string); $i += 2) {
1099 if (($charval >= 32) && ($charval <= 127)) {
1100 $HTMLstring .= chr($charval);
1102 $HTMLstring .=
'&#'.$charval.
';';
1108 $HTMLstring =
'ERROR: Character set "'.$charset.
'" not supported in MultiByteCharString2HTML()';
1117 static $RGADname = array();
1118 if (empty($RGADname)) {
1119 $RGADname[0] =
'not set';
1120 $RGADname[1] =
'Track Gain Adjustment';
1121 $RGADname[2] =
'Album Gain Adjustment';
1124 return (isset($RGADname[$namecode]) ? $RGADname[$namecode] :
'');
1129 static $RGADoriginator = array();
1130 if (empty($RGADoriginator)) {
1131 $RGADoriginator[0] =
'unspecified';
1132 $RGADoriginator[1] =
'pre-set by artist/producer/mastering engineer';
1133 $RGADoriginator[2] =
'set by user';
1134 $RGADoriginator[3] =
'determined automatically';
1137 return (isset($RGADoriginator[$originatorcode]) ? $RGADoriginator[$originatorcode] :
'');
1142 $adjustment = $rawadjustment / 10;
1143 if ($signbit == 1) {
1146 return (
float) $adjustment;
1151 if ($replaygain < 0) {
1156 $storedreplaygain = intval(round($replaygain * 10));
1157 $gainstring = str_pad(decbin($namecode), 3,
'0', STR_PAD_LEFT);
1158 $gainstring .= str_pad(decbin($originatorcode), 3,
'0', STR_PAD_LEFT);
1159 $gainstring .= $signbit;
1160 $gainstring .= str_pad(decbin($storedreplaygain), 9,
'0', STR_PAD_LEFT);
1166 return 20 * log10($amplitude);
1171 $GetDataImageSize =
false;
1172 if ($tempfilename = tempnam(
'*',
'getID3')) {
1173 if ($tmp = @fopen($tempfilename,
'wb')) {
1174 fwrite($tmp, $imgData);
1176 $GetDataImageSize = @GetImageSize($tempfilename);
1178 unlink($tempfilename);
1180 return $GetDataImageSize;
1184 static $ImageTypesLookup = array();
1185 if (empty($ImageTypesLookup)) {
1186 $ImageTypesLookup[1] =
'gif';
1187 $ImageTypesLookup[2] =
'jpeg';
1188 $ImageTypesLookup[3] =
'png';
1189 $ImageTypesLookup[4] =
'swf';
1190 $ImageTypesLookup[5] =
'psd';
1191 $ImageTypesLookup[6] =
'bmp';
1192 $ImageTypesLookup[7] =
'tiff (little-endian)';
1193 $ImageTypesLookup[8] =
'tiff (big-endian)';
1194 $ImageTypesLookup[9] =
'jpc';
1195 $ImageTypesLookup[10] =
'jp2';
1196 $ImageTypesLookup[11] =
'jpx';
1197 $ImageTypesLookup[12] =
'jb2';
1198 $ImageTypesLookup[13] =
'swc';
1199 $ImageTypesLookup[14] =
'iff';
1201 return (isset($ImageTypesLookup[$imagetypeid]) ? $ImageTypesLookup[$imagetypeid] :
'');
1207 if (!empty($ThisFileInfo[
'tags'])) {
1208 foreach ($ThisFileInfo[
'tags'] as $tagtype => $tagarray) {
1209 foreach ($tagarray as $tagname => $tagdata) {
1210 foreach ($tagdata as
$key => $value) {
1211 if (!empty($value)) {
1212 if (empty($ThisFileInfo[
'comments'][$tagname])) {
1216 }
elseif ($tagtype ==
'id3v1') {
1218 $newvaluelength = strlen(trim($value));
1219 foreach ($ThisFileInfo[
'comments'][$tagname] as $existingkey => $existingvalue) {
1220 $oldvaluelength = strlen(trim($existingvalue));
1221 if (($newvaluelength <= $oldvaluelength) && (substr($existingvalue, 0, $newvaluelength) == trim($value))) {
1229 $newvaluelength = strlen(trim($value));
1230 foreach ($ThisFileInfo[
'comments'][$tagname] as $existingkey => $existingvalue) {
1231 $oldvaluelength = strlen(trim($existingvalue));
1232 if (($newvaluelength > $oldvaluelength) && (substr(trim($value), 0, strlen($existingvalue)) == $existingvalue)) {
1233 $ThisFileInfo[
'comments'][$tagname][$existingkey] = trim($value);
1239 if (empty($ThisFileInfo[
'comments'][$tagname]) || !in_array(trim($value), $ThisFileInfo[
'comments'][$tagname])) {
1240 $ThisFileInfo[
'comments'][$tagname][] = trim($value);
1248 foreach ($ThisFileInfo[
'comments'] as $field => $values) {
1249 foreach ($values as $index => $value) {
1266 $keylength = strlen(
$key);
1267 $line_count = $end - $begin - 7;
1270 $fp = fopen(
$file,
'r');
1273 for ($i = 0; $i < ($begin + 3); $i++) {
1278 while (0 < $line_count--) {
1281 $line = ltrim(fgets($fp, 1024),
"\t ");
1292 @list($ThisKey, $ThisValue) = explode(
"\t", $line, 2);
1302 global $GETID3_ERRORARRAY;
1308 $diemessage = basename($sourcefile).
' depends on '.
$filename.
', which has errors';
1311 $diemessage = basename($sourcefile).
' depends on '.
$filename.
', which is missing';
1313 if ($DieOnFailure) {
1316 $GETID3_ERRORARRAY[] = $diemessage;