Changeset 22745 in spip-zone


Ignore:
Timestamp:
Sep 25, 2008, 4:00:01 PM (13 years ago)
Author:
kent1@…
Message:

commit foireux => commits à répétition après

Location:
_plugins_/_test_/getID3
Files:
7 added
28 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/_test_/getID3/action/getid3_infos.php

    r22743 r22745  
    2020                action_getid3_infos_post($r);
    2121                spip_log("action getid3_infos","getid3");
     22                spip_log($r);
    2223        }
    2324}
    2425
    2526function action_getid3_infos_post($r){
    26         list(, $sign, $id_objet, $objet, $id_document, $suite) = $r;
     27        list($arg, $sign, $id_objet, $objet, $id_document, $suite) = $r;
    2728       
    2829        $recuperer_infos = charger_fonction('getid3_recuperer_infos','inc');
  • _plugins_/_test_/getID3/getid3/getid3.lib.php

    r16273 r22745  
    88// getid3.lib.php - part of getID3()                           //
    99// See readme.txt for more details                             //
    10 //                                                             //
    11 /////////////////////////////////////////////////////////////////
    12 // getid3_lib::GetURLImageSize( $urlpic ) determines the       //
    13 // dimensions of local/remote URL pictures.                    //
    14 // returns array with ($width, $height, $type)                 //
    15 //                                                             //
    16 // Thanks to: Oyvind Hallsteinsen aka Gosub / ELq -            //
    17 // gosubØelq*org  for the original size determining code       //
    18 //                                                             //
    19 // PHP Hack by Filipe Laborde-Basto Oct 21/2000                //
    20 // FREELY DISTRIBUTABLE -- use at your sole discretion! :)     //
    21 // Enjoy. (Not to be sold in commercial packages though,       //
    22 // keep it free!) Feel free to contact me at filØrezox*com     //
    23 // (http://www.rezox.com)                                      //
    24 //                                                             //
    25 // Modified by James Heinrich <getid3Øusers*sourceforge*net>   //
    26 // June 1, 2001 - created GetDataImageSize($imgData) by        //
    27 // seperating the fopen() stuff to GetURLImageSize($urlpic)    //
    28 // which then calls GetDataImageSize($imgData). The idea being //
    29 // you can call GetDataImageSize($imgData) with image data     //
    30 // from a database etc.                                        //
    3110//                                                            ///
    3211/////////////////////////////////////////////////////////////////
    33 
    34 
    35 define('GETID3_GIF_SIG',     "\x47\x49\x46");  // 'GIF'
    36 define('GETID3_PNG_SIG',     "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A");
    37 define('GETID3_JPG_SIG',     "\xFF\xD8\xFF");
    38 define('GETID3_JPG_SOS',     "\xDA"); // Start Of Scan - image data start
    39 define('GETID3_JPG_SOF0',    "\xC0"); // Start Of Frame N
    40 define('GETID3_JPG_SOF1',    "\xC1"); // N indicates which compression process
    41 define('GETID3_JPG_SOF2',    "\xC2"); // Only SOF0-SOF2 are now in common use
    42 define('GETID3_JPG_SOF3',    "\xC3");
    43 // NB: codes C4 and CC are *not* SOF markers
    44 define('GETID3_JPG_SOF5',    "\xC5");
    45 define('GETID3_JPG_SOF6',    "\xC6");
    46 define('GETID3_JPG_SOF7',    "\xC7");
    47 define('GETID3_JPG_SOF9',    "\xC9");
    48 define('GETID3_JPG_SOF10',   "\xCA");
    49 define('GETID3_JPG_SOF11',   "\xCB");
    50 // NB: codes C4 and CC are *not* SOF markers
    51 define('GETID3_JPG_SOF13',   "\xCD");
    52 define('GETID3_JPG_SOF14',   "\xCE");
    53 define('GETID3_JPG_SOF15',   "\xCF");
    54 define('GETID3_JPG_EOI',     "\xD9"); // End Of Image (end of datastream)
    55 
    5612
    5713
     
    207163
    208164                $bitword = getid3_lib::BigEndian2Bin($byteword);
     165                if (!$bitword) {
     166            return 0;
     167        }
    209168                $signbit = $bitword{0};
    210169
     
    451410
    452411        function PlaytimeString($playtimeseconds) {
     412                $sign = (($playtimeseconds < 0) ? '-' : '');
     413                $playtimeseconds = abs($playtimeseconds);
    453414                $contentseconds = round((($playtimeseconds / 60) - floor($playtimeseconds / 60)) * 60);
    454415                $contentminutes = floor($playtimeseconds / 60);
     
    457418                        $contentminutes++;
    458419                }
    459                 return intval($contentminutes).':'.str_pad($contentseconds, 2, 0, STR_PAD_LEFT);
     420                return $sign.intval($contentminutes).':'.str_pad($contentseconds, 2, 0, STR_PAD_LEFT);
    460421        }
    461422
     
    569530                                }
    570531                        }
    571                         $commandline = GETID3_HELPERAPPSDIR.'md5sum.exe "'.str_replace('/', GETID3_OS_DIRSLASH, $file).'"';
     532                        $commandline = GETID3_HELPERAPPSDIR.'md5sum.exe "'.str_replace('/', DIRECTORY_SEPARATOR, $file).'"';
    572533                        if (ereg("^[\\]?([0-9a-f]{32})", strtolower(`$commandline`), $r)) {
    573534                                return $r[1];
     
    604565                                }
    605566                        }
    606                         $commandline = GETID3_HELPERAPPSDIR.'sha1sum.exe "'.str_replace('/', GETID3_OS_DIRSLASH, $file).'"';
     567                        $commandline = GETID3_HELPERAPPSDIR.'sha1sum.exe "'.str_replace('/', DIRECTORY_SEPARATOR, $file).'"';
    607568                        if (ereg("^sha1=([0-9a-f]{40})", strtolower(`$commandline`), $r)) {
    608569                                return $r[1];
     
    611572                } else {
    612573
    613                         $commandline = 'sha1sum "'.$file.'"';
     574                        $commandline = 'sha1sum '.escapeshellarg($file).'';
    614575                        if (ereg("^([0-9a-f]{40})[ \t\n\r]", strtolower(`$commandline`), $r)) {
    615576                                return $r[1];
     
    662623                                        }
    663624                                }
    664                                 $commandline  = GETID3_HELPERAPPSDIR.'head.exe -c '.$end.' "'.str_replace('/', GETID3_OS_DIRSLASH, $file).'" | ';
     625                                $commandline  = GETID3_HELPERAPPSDIR.'head.exe -c '.$end.' "'.escapeshellarg(str_replace('/', DIRECTORY_SEPARATOR, $file)).'" | ';
    665626                                $commandline .= GETID3_HELPERAPPSDIR.'tail.exe -c '.$size.' | ';
    666627                                $commandline .= GETID3_HELPERAPPSDIR.$windows_call;
     
    668629                        } else {
    669630
    670                                 $commandline  = 'head -c '.$end.' "'.$file.'" | ';
    671                                 $commandline .= 'tail -c '.$size.' | ';
     631                                $commandline  = 'head -c'.$end.' '.escapeshellarg($file).' | ';
     632                                $commandline .= 'tail -c'.$size.' | ';
    672633                                $commandline .= $unix_call;
    673634
     
    999960                }
    1000961
    1001                 static $iconv_broken_or_unavailable = array();
    1002                 if (is_null(@$iconv_broken_or_unavailable[$in_charset.'_'.$out_charset])) {
    1003                         $GETID3_ICONV_TEST_STRING = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„
    1004 †‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ';
    1005 
    1006                         // Check iconv()
    1007                         if (function_exists('iconv')) {
    1008                                 if (@iconv($in_charset, 'ISO-8859-1', @iconv('ISO-8859-1', $in_charset, $GETID3_ICONV_TEST_STRING)) == $GETID3_ICONV_TEST_STRING) {
    1009                                         if (@iconv($out_charset, 'ISO-8859-1', @iconv('ISO-8859-1', $out_charset, $GETID3_ICONV_TEST_STRING)) == $GETID3_ICONV_TEST_STRING) {
    1010                                                 // everything works, use iconv()
    1011                                                 $iconv_broken_or_unavailable[$in_charset.'_'.$out_charset] = false;
    1012                                         } else {
    1013                                                 // iconv() available, but broken. Use getID3()'s iconv_fallback() conversions instead
    1014                                                 // known issue in PHP v4.1.x
    1015                                                 $iconv_broken_or_unavailable[$in_charset.'_'.$out_charset] = true;
    1016                                         }
    1017                                 } else {
    1018                                         // iconv() available, but broken. Use getID3()'s iconv_fallback() conversions instead
    1019                                         // known issue in PHP v4.1.x
    1020                                         $iconv_broken_or_unavailable[$in_charset.'_'.$out_charset] = true;
    1021                                 }
    1022                         } else {
    1023                                 // iconv() unavailable, use getID3()'s iconv_fallback() conversions
    1024                                 $iconv_broken_or_unavailable[$in_charset.'_'.$out_charset] = true;
    1025                         }
    1026                 }
    1027 
    1028                 if ($iconv_broken_or_unavailable[$in_charset.'_'.$out_charset]) {
    1029                         static $ConversionFunctionList = array();
    1030                         if (empty($ConversionFunctionList)) {
    1031                                 $ConversionFunctionList['ISO-8859-1']['UTF-8']    = 'iconv_fallback_iso88591_utf8';
    1032                                 $ConversionFunctionList['ISO-8859-1']['UTF-16']   = 'iconv_fallback_iso88591_utf16';
    1033                                 $ConversionFunctionList['ISO-8859-1']['UTF-16BE'] = 'iconv_fallback_iso88591_utf16be';
    1034                                 $ConversionFunctionList['ISO-8859-1']['UTF-16LE'] = 'iconv_fallback_iso88591_utf16le';
    1035                                 $ConversionFunctionList['UTF-8']['ISO-8859-1']    = 'iconv_fallback_utf8_iso88591';
    1036                                 $ConversionFunctionList['UTF-8']['UTF-16']        = 'iconv_fallback_utf8_utf16';
    1037                                 $ConversionFunctionList['UTF-8']['UTF-16BE']      = 'iconv_fallback_utf8_utf16be';
    1038                                 $ConversionFunctionList['UTF-8']['UTF-16LE']      = 'iconv_fallback_utf8_utf16le';
    1039                                 $ConversionFunctionList['UTF-16']['ISO-8859-1']   = 'iconv_fallback_utf16_iso88591';
    1040                                 $ConversionFunctionList['UTF-16']['UTF-8']        = 'iconv_fallback_utf16_utf8';
    1041                                 $ConversionFunctionList['UTF-16LE']['ISO-8859-1'] = 'iconv_fallback_utf16le_iso88591';
    1042                                 $ConversionFunctionList['UTF-16LE']['UTF-8']      = 'iconv_fallback_utf16le_utf8';
    1043                                 $ConversionFunctionList['UTF-16BE']['ISO-8859-1'] = 'iconv_fallback_utf16be_iso88591';
    1044                                 $ConversionFunctionList['UTF-16BE']['UTF-8']      = 'iconv_fallback_utf16be_utf8';
    1045                         }
    1046                         if (isset($ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)])) {
    1047                                 $ConversionFunction = $ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)];
    1048                                 return getid3_lib::$ConversionFunction($string);
    1049                         }
    1050                         die('PHP does not have iconv() support - cannot convert from '.$in_charset.' to '.$out_charset);
    1051                 }
    1052 
    1053                 if ($converted_string = @iconv($in_charset, $out_charset.'//TRANSLIT', $string)) {
    1054                         switch ($out_charset) {
    1055                                 case 'ISO-8859-1':
    1056                                         $converted_string = rtrim($converted_string, "\x00");
    1057                                         break;
    1058                         }
    1059                         return $converted_string;
    1060                 }
    1061 
    1062                 // iconv() may sometimes fail with "illegal character in input string" error message
    1063                 // and return an empty string, but returning the unconverted string is more useful
    1064                 return $string;
     962                // iconv() availble
     963                if (function_exists('iconv')) {
     964
     965                    if ($converted_string = @iconv($in_charset, $out_charset.'//TRANSLIT', $string)) {
     966                        switch ($out_charset) {
     967                                case 'ISO-8859-1':
     968                                        $converted_string = rtrim($converted_string, "\x00");
     969                                        break;
     970                        }
     971                        return $converted_string;
     972                }
     973
     974                // iconv() may sometimes fail with "illegal character in input string" error message
     975                // and return an empty string, but returning the unconverted string is more useful
     976                return $string;
     977        }
     978
     979
     980        // iconv() not available
     981                static $ConversionFunctionList = array();
     982                if (empty($ConversionFunctionList)) {
     983                        $ConversionFunctionList['ISO-8859-1']['UTF-8']    = 'iconv_fallback_iso88591_utf8';
     984                        $ConversionFunctionList['ISO-8859-1']['UTF-16']   = 'iconv_fallback_iso88591_utf16';
     985                        $ConversionFunctionList['ISO-8859-1']['UTF-16BE'] = 'iconv_fallback_iso88591_utf16be';
     986                        $ConversionFunctionList['ISO-8859-1']['UTF-16LE'] = 'iconv_fallback_iso88591_utf16le';
     987                        $ConversionFunctionList['UTF-8']['ISO-8859-1']    = 'iconv_fallback_utf8_iso88591';
     988                        $ConversionFunctionList['UTF-8']['UTF-16']        = 'iconv_fallback_utf8_utf16';
     989                        $ConversionFunctionList['UTF-8']['UTF-16BE']      = 'iconv_fallback_utf8_utf16be';
     990                        $ConversionFunctionList['UTF-8']['UTF-16LE']      = 'iconv_fallback_utf8_utf16le';
     991                        $ConversionFunctionList['UTF-16']['ISO-8859-1']   = 'iconv_fallback_utf16_iso88591';
     992                        $ConversionFunctionList['UTF-16']['UTF-8']        = 'iconv_fallback_utf16_utf8';
     993                        $ConversionFunctionList['UTF-16LE']['ISO-8859-1'] = 'iconv_fallback_utf16le_iso88591';
     994                        $ConversionFunctionList['UTF-16LE']['UTF-8']      = 'iconv_fallback_utf16le_utf8';
     995                        $ConversionFunctionList['UTF-16BE']['ISO-8859-1'] = 'iconv_fallback_utf16be_iso88591';
     996                        $ConversionFunctionList['UTF-16BE']['UTF-8']      = 'iconv_fallback_utf16be_utf8';
     997                }
     998                if (isset($ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)])) {
     999                        $ConversionFunction = $ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)];
     1000                        return getid3_lib::$ConversionFunction($string);
     1001                }
     1002                die('PHP does not have iconv() support - cannot convert from '.$in_charset.' to '.$out_charset);
    10651003        }
    10661004
     
    11071045                                        if ($char_ord_val < 0x80) {
    11081046                                                $charval = $char_ord_val;
    1109                                         } elseif ((($char_ord_val & 0xF0) >> 4) == 0x0F) {
     1047                                        } elseif ((($char_ord_val & 0xF0) >> 4) == 0x0F  &&  $i+3 < $strlen) {
    11101048                                                $charval  = (($char_ord_val & 0x07) << 18);
    11111049                                                $charval += ((ord($string{++$i}) & 0x3F) << 12);
    11121050                                                $charval += ((ord($string{++$i}) & 0x3F) << 6);
    11131051                                                $charval +=  (ord($string{++$i}) & 0x3F);
    1114                                         } elseif ((($char_ord_val & 0xE0) >> 5) == 0x07) {
     1052                                        } elseif ((($char_ord_val & 0xE0) >> 5) == 0x07  &&  $i+2 < $strlen) {
    11151053                                                $charval  = (($char_ord_val & 0x0F) << 12);
    11161054                                                $charval += ((ord($string{++$i}) & 0x3F) << 6);
    11171055                                                $charval +=  (ord($string{++$i}) & 0x3F);
    1118                                         } elseif ((($char_ord_val & 0xC0) >> 6) == 0x03) {
     1056                                        } elseif ((($char_ord_val & 0xC0) >> 6) == 0x03  &&  $i+1 < $strlen) {
    11191057                                                $charval  = (($char_ord_val & 0x1F) << 6);
    11201058                                                $charval += (ord($string{++$i}) & 0x3F);
     
    12131151
    12141152
    1215         function GetURLImageSize($urlpic) {
    1216                 if ($fd = @fopen($urlpic, 'rb')){
    1217                         $imgData = fread($fd, filesize($urlpic));
    1218                         fclose($fd);
    1219                         return getid3_lib::GetDataImageSize($imgData);
    1220                 }
    1221                 return array('', '', '');
    1222         }
    1223 
    1224 
    12251153        function GetDataImageSize($imgData) {
    1226                 $height = '';
    1227                 $width  = '';
    1228                 $type   = '';
    1229                 if ((substr($imgData, 0, 3) == GETID3_GIF_SIG) && (strlen($imgData) > 10)) {
    1230                         $dim = unpack('v2dim', substr($imgData, 6, 4));
    1231                         $width  = $dim['dim1'];
    1232                         $height = $dim['dim2'];
    1233                         $type = 1;
    1234                 } elseif ((substr($imgData, 0, 8) == GETID3_PNG_SIG) && (strlen($imgData) > 24)) {
    1235                         $dim = unpack('N2dim', substr($imgData, 16, 8));
    1236                         $width  = $dim['dim1'];
    1237                         $height = $dim['dim2'];
    1238                         $type = 3;
    1239                 } elseif ((substr($imgData, 0, 3) == GETID3_JPG_SIG) && (strlen($imgData) > 4)) {
    1240                         ///////////////// JPG CHUNK SCAN ////////////////////
    1241                         $imgPos = 2;
    1242                         $type = 2;
    1243                         $buffer = strlen($imgData) - 2;
    1244                         while ($imgPos < strlen($imgData)) {
    1245                                 // synchronize to the marker 0xFF
    1246                                 $imgPos = strpos($imgData, 0xFF, $imgPos) + 1;
    1247                                 $marker = $imgData[$imgPos];
    1248                                 do {
    1249                                         $marker = ord($imgData[$imgPos++]);
    1250                                 } while ($marker == 255);
    1251                                 // find dimensions of block
    1252                                 switch (chr($marker)) {
    1253                                         // Grab width/height from SOF segment (these are acceptable chunk types)
    1254                                         case GETID3_JPG_SOF0:
    1255                                         case GETID3_JPG_SOF1:
    1256                                         case GETID3_JPG_SOF2:
    1257                                         case GETID3_JPG_SOF3:
    1258                                         case GETID3_JPG_SOF5:
    1259                                         case GETID3_JPG_SOF6:
    1260                                         case GETID3_JPG_SOF7:
    1261                                         case GETID3_JPG_SOF9:
    1262                                         case GETID3_JPG_SOF10:
    1263                                         case GETID3_JPG_SOF11:
    1264                                         case GETID3_JPG_SOF13:
    1265                                         case GETID3_JPG_SOF14:
    1266                                         case GETID3_JPG_SOF15:
    1267                                                 $dim = unpack('n2dim', substr($imgData, $imgPos + 3, 4));
    1268                                                 $height = $dim['dim1'];
    1269                                                 $width  = $dim['dim2'];
    1270                                                 break 2; // found it so exit
    1271                                         case GETID3_JPG_EOI:
    1272                                         case GETID3_JPG_SOS:
    1273                                                 return false;       // End loop in case we find one of these markers
    1274                                         default:            // We're not interested in other markers
    1275                                                 $skiplen = (ord($imgData[$imgPos++]) << 8) + ord($imgData[$imgPos++]) - 2;
    1276                                                 // if the skip is more than what we've read in, read more
    1277                                                 $buffer -= $skiplen;
    1278                                                 if ($buffer < 512) { // if the buffer of data is too low, read more file.
    1279                                                         // $imgData .= fread($fd, $skiplen + 1024);
    1280                                                         // $buffer += $skiplen + 1024;
    1281                                                         return false; // End loop in case we find run out of data
    1282                                                 }
    1283                                                 $imgPos += $skiplen;
    1284                                                 break;
    1285                                 } // endswitch check marker type
    1286                         } // endif loop through JPG chunks
    1287                 } // endif chk for valid file types
    1288 
    1289                 return array($width, $height, $type);
    1290         } // end function
    1291 
     1154                $GetDataImageSize = false;
     1155                if ($tempfilename = tempnam('*', 'getID3')) {
     1156                        if ($tmp = @fopen($tempfilename, 'wb')) {
     1157                                fwrite($tmp, $imgData);
     1158                                fclose($tmp);
     1159                                $GetDataImageSize = @GetImageSize($tempfilename);
     1160                        }
     1161                        unlink($tempfilename);
     1162                }
     1163                return $GetDataImageSize;
     1164        }
    12921165
    12931166        function ImageTypesLookup($imagetypeid) {
     
    13131186
    13141187        function CopyTagsToComments(&$ThisFileInfo) {
    1315                 // Copy all entries from ['tags'] into common ['comments'] and ['comments_html']
     1188
     1189                // Copy all entries from ['tags'] into common ['comments']
    13161190                if (!empty($ThisFileInfo['tags'])) {
    13171191                        foreach ($ThisFileInfo['tags'] as $tagtype => $tagarray) {
     
    13481222                                                        if (empty($ThisFileInfo['comments'][$tagname]) || !in_array(trim($value), $ThisFileInfo['comments'][$tagname])) {
    13491223                                                                $ThisFileInfo['comments'][$tagname][] = trim($value);
    1350                                                                 if (isset($ThisFileInfo['tags_html'][$tagtype][$tagname][$key])) {
    1351                                                                         $ThisFileInfo['comments_html'][$tagname][] = $ThisFileInfo['tags_html'][$tagtype][$tagname][$key];
    1352                                                                 }
    13531224                                                        }
    13541225                                                }
     
    13561227                                }
    13571228                        }
     1229
     1230                        // Copy to ['comments_html']
     1231                foreach ($ThisFileInfo['comments'] as $field => $values) {
     1232                    foreach ($values as $index => $value) {
     1233                        $ThisFileInfo['comments_html'][$field][$index] = str_replace('&#0;', '', getid3_lib::MultiByteCharString2HTML($value, $ThisFileInfo['encoding']));
     1234                    }
     1235            }
    13581236                }
    13591237        }
  • _plugins_/_test_/getID3/getid3/getid3.php

    r16273 r22745  
    1111
    1212// Defines
    13 define('GETID3_VERSION', '1.7.4');
     13define('GETID3_VERSION', '1.7.8b2');
    1414define('GETID3_FREAD_BUFFER_SIZE', 16384); // read buffer size in bytes
    1515
     
    1919{
    2020        // public: Settings
    21         var $encoding                 = 'ISO-8859-1';     // CASE SENSITIVE! - i.e. (must be supported by iconv())
    22                                                           // Examples:  ISO-8859-1  UTF-8  UTF-16  UTF-16BE
    23 
    24         var $encoding_id3v1           = 'ISO-8859-1';     // Should always be 'ISO-8859-1', but some tags may be written
    25                                                           // in other encodings such as 'EUC-CN'
     21        var $encoding        = 'ISO-8859-1';   // CASE SENSITIVE! - i.e. (must be supported by iconv())
     22                                               // Examples:  ISO-8859-1  UTF-8  UTF-16  UTF-16BE
     23
     24        var $encoding_id3v1  = 'ISO-8859-1';   // Should always be 'ISO-8859-1', but some tags may be written in other encodings such as 'EUC-CN'
     25
     26        var $tempdir         = '*';            // default '*' should use system temp dir
    2627
    2728        // public: Optional tag checks - disable for speed.
    28         var $option_tag_id3v1         = true;             // Read and process ID3v1 tags
    29         var $option_tag_id3v2         = true;             // Read and process ID3v2 tags
    30         var $option_tag_lyrics3       = true;             // Read and process Lyrics3 tags
    31         var $option_tag_apetag        = true;             // Read and process APE tags
    32         var $option_tags_process      = true;             // Copy tags to root key 'tags' and encode to $this->encoding
    33         var $option_tags_html         = true;             // Copy tags to root key 'tags_html' properly translated from various encodings to HTML entities
     29        var $option_tag_id3v1         = true;  // Read and process ID3v1 tags
     30        var $option_tag_id3v2         = true;  // Read and process ID3v2 tags
     31        var $option_tag_lyrics3       = true;  // Read and process Lyrics3 tags
     32        var $option_tag_apetag        = true;  // Read and process APE tags
     33        var $option_tags_process      = true;  // Copy tags to root key 'tags' and encode to $this->encoding
     34        var $option_tags_html         = true;  // Copy tags to root key 'tags_html' properly translated from various encodings to HTML entities
    3435
    3536        // public: Optional tag/comment calucations
    36         var $option_extra_info        = true;             // Calculate additional info such as bitrate, channelmode etc
     37        var $option_extra_info        = true;  // Calculate additional info such as bitrate, channelmode etc
    3738
    3839        // public: Optional calculations
    39         var $option_md5_data          = false;            // Get MD5 sum of data part - slow
    40         var $option_md5_data_source   = false;            // Use MD5 of source file if availble - only FLAC and OptimFROG
    41         var $option_sha1_data         = false;            // Get SHA1 sum of data part - slow
    42         var $option_max_2gb_check     = true;             // Check whether file is larger than 2 Gb and thus not supported by PHP
     40        var $option_md5_data          = false; // Get MD5 sum of data part - slow
     41        var $option_md5_data_source   = false; // Use MD5 of source file if availble - only FLAC and OptimFROG
     42        var $option_sha1_data         = false; // Get SHA1 sum of data part - slow
     43        var $option_max_2gb_check     = true;  // Check whether file is larger than 2 Gb and thus not supported by PHP
    4344
    4445        // private
     
    5354                $this->startup_warning = '';
    5455
    55                 // Check for PHP version >= 4.1.0
    56                 if (phpversion() < '4.1.0') {
    57                     $this->startup_error .= 'getID3() requires PHP v4.1.0 or higher - you are running v'.phpversion();
     56                // Check for PHP version >= 4.2.0
     57                if (phpversion() < '4.2.0') {
     58                    $this->startup_error .= 'getID3() requires PHP v4.2.0 or higher - you are running v'.phpversion();
    5859                }
    5960
     
    8990                // Get base path of getID3() - ONCE
    9091                if (!defined('GETID3_INCLUDEPATH')) {
    91                         define('GETID3_OS_DIRSLASH', (GETID3_OS_ISWINDOWS ? '\\' : '/'));
    92 
    9392                        foreach (get_included_files() as $key => $val) {
    9493                                if (basename($val) == 'getid3.php') {
    95                                         define('GETID3_INCLUDEPATH', dirname($val).GETID3_OS_DIRSLASH);
     94                                        define('GETID3_INCLUDEPATH', dirname($val).DIRECTORY_SEPARATOR);
    9695                                        break;
    9796                                }
     
    113112                if (GETID3_OS_ISWINDOWS && !defined('GETID3_HELPERAPPSDIR')) {
    114113
    115                         $helperappsdir = GETID3_INCLUDEPATH.'..'.GETID3_OS_DIRSLASH.'helperapps'; // must not have any space in this path
     114                        $helperappsdir = GETID3_INCLUDEPATH.'..'.DIRECTORY_SEPARATOR.'helperapps'; // must not have any space in this path
    116115
    117116                        if (!is_dir($helperappsdir)) {
    118117                                $this->startup_error .= '"'.$helperappsdir.'" cannot be defined as GETID3_HELPERAPPSDIR because it does not exist';
    119118                        } elseif (strpos(realpath($helperappsdir), ' ') !== false) {
    120                                 $DirPieces = explode(GETID3_OS_DIRSLASH, realpath($helperappsdir));
     119                                $DirPieces = explode(DIRECTORY_SEPARATOR, realpath($helperappsdir));
    121120                                foreach ($DirPieces as $key => $value) {
    122121                                        if ((strpos($value, '.') !== false) && (strpos($value, ' ') === false)) {
     
    129128                                        $DirPieces[$key] = strtoupper($value);
    130129                                }
    131                                 $this->startup_error .= 'GETID3_HELPERAPPSDIR must not have any spaces in it - use 8dot3 naming convention if neccesary (on this server that would be something like "'.implode(GETID3_OS_DIRSLASH, $DirPieces).'" - NOTE: this may or may not be the actual 8.3 equivalent of "'.$helperappsdir.'", please double-check). You can run "dir /x" from the commandline to see the correct 8.3-style names. You need to edit the file "'.GETID3_INCLUDEPATH.'/getid3.php" around line '.(__LINE__ - 16);
    132                         }
    133                         define('GETID3_HELPERAPPSDIR', realpath($helperappsdir).GETID3_OS_DIRSLASH);
    134                 }
    135 
    136         }
    137 
     130                                $this->startup_error .= 'GETID3_HELPERAPPSDIR must not have any spaces in it - use 8dot3 naming convention if neccesary (on this server that would be something like "'.implode(DIRECTORY_SEPARATOR, $DirPieces).'" - NOTE: this may or may not be the actual 8.3 equivalent of "'.$helperappsdir.'", please double-check). You can run "dir /x" from the commandline to see the correct 8.3-style names.';
     131                        }
     132                        define('GETID3_HELPERAPPSDIR', realpath($helperappsdir).DIRECTORY_SEPARATOR);
     133                }
     134
     135        }
     136
     137
     138        // public: setOption
     139        function setOption($optArray) {
     140                if (!is_array($optArray) || empty($optArray)) {
     141                        return false;
     142                }
     143                foreach ($optArray as $opt => $val) {
     144                        if (isset($this, $opt) === false) {
     145                                continue;
     146                        }
     147                        $this->$opt = $val;
     148                }
     149                return true;
     150        }
    138151
    139152
     
    225238                        if (getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, false)) {
    226239                                $tag = new getid3_id3v2($fp, $this->info);
     240                                unset($tag);
    227241                        }
    228242
     
    231245                        fseek($fp, 0, SEEK_SET);
    232246                        $header = fread($fp, 10);
    233                         if (substr($header, 0, 3) == 'ID3') {
     247                        if (substr($header, 0, 3) == 'ID3'  &&  strlen($header) == 10) {
    234248                                $this->info['id3v2']['header']           = true;
    235249                                $this->info['id3v2']['majorversion']     = ord($header{3});
     
    251265                        }
    252266                        $tag = new getid3_id3v1($fp, $this->info);
     267                        unset($tag);
    253268                }
    254269
     
    259274                        }
    260275                        $tag = new getid3_apetag($fp, $this->info);
     276                        unset($tag);
    261277                }
    262278
     
    267283                        }
    268284                        $tag = new getid3_lyrics3($fp, $this->info);
     285                        unset($tag);
    269286                }
    270287
     
    329346                        $class = new $class_name($fp, $this->info);
    330347                }
     348                unset($class);
    331349
    332350                // close file
     
    392410
    393411                // remove possible empty keys
    394                 $AVpossibleEmptyKeys = array('dataformat', 'bits_per_sample', 'encoder_options', 'streams');
    395                 foreach ($AVpossibleEmptyKeys as $key) {
     412                $AVpossibleEmptyKeys = array('dataformat', 'bits_per_sample', 'encoder_options', 'streams', 'bitrate');
     413                foreach ($AVpossibleEmptyKeys as $dummy => $key) {
    396414                        if (empty($this->info['audio'][$key]) && isset($this->info['audio'][$key])) {
    397415                                unset($this->info['audio'][$key]);
     
    437455                                                        'module'    => 'ac3',
    438456                                                        'mime_type' => 'audio/ac3',
    439                                                   ),
     457                                                ),
    440458
    441459                                // AAC  - audio       - Advanced Audio Coding (AAC) - ADIF format
     
    447465                                                        'mime_type' => 'application/octet-stream',
    448466                                                        'fail_ape'  => 'WARNING',
    449                                                   ),
     467                                                ),
    450468
    451469
     
    458476                                                        'mime_type' => 'application/octet-stream',
    459477                                                        'fail_ape'  => 'WARNING',
    460                                                   ),
     478                                                ),
    461479
    462480
     
    467485                                                        'module'    => 'au',
    468486                                                        'mime_type' => 'audio/basic',
    469                                                   ),
     487                                                ),
    470488
    471489                                // AVR  - audio       - Audio Visual Research
     
    475493                                                        'module'    => 'avr',
    476494                                                        'mime_type' => 'application/octet-stream',
    477                                                   ),
     495                                                ),
    478496
    479497                                // BONK - audio       - Bonk v0.9+
     
    483501                                                        'module'    => 'bonk',
    484502                                                        'mime_type' => 'audio/xmms-bonk',
    485                                                   ),
     503                                                ),
     504
     505                                // DTS  - audio       - Dolby Theatre System
     506                                'dts'  => array(
     507                                                        'pattern'   => '^\x7F\xFE\x80\x01',
     508                                                        'group'     => 'audio',
     509                                                        'module'    => 'dts',
     510                                                        'mime_type' => 'audio/dts',
     511                                                ),
    486512
    487513                                // FLAC - audio       - Free Lossless Audio Codec
     
    491517                                                        'module'    => 'flac',
    492518                                                        'mime_type' => 'audio/x-flac',
    493                                                   ),
     519                                                ),
    494520
    495521                                // LA   - audio       - Lossless Audio (LA)
     
    499525                                                        'module'    => 'la',
    500526                                                        'mime_type' => 'application/octet-stream',
    501                                                   ),
     527                                                ),
    502528
    503529                                // LPAC - audio       - Lossless Predictive Audio Compression (LPAC)
     
    507533                                                        'module'    => 'lpac',
    508534                                                        'mime_type' => 'application/octet-stream',
    509                                                   ),
     535                                                ),
    510536
    511537                                // MIDI - audio       - MIDI (Musical Instrument Digital Interface)
     
    515541                                                        'module'    => 'midi',
    516542                                                        'mime_type' => 'audio/midi',
    517                                                   ),
     543                                                ),
    518544
    519545                                // MAC  - audio       - Monkey's Audio Compressor
     
    523549                                                        'module'    => 'monkey',
    524550                                                        'mime_type' => 'application/octet-stream',
    525                                                   ),
     551                                                ),
    526552
    527553                                // MOD  - audio       - MODule (assorted sub-formats)
     
    532558                                                        'option'    => 'mod',
    533559                                                        'mime_type' => 'audio/mod',
    534                                                   ),
     560                                                ),
    535561
    536562                                // MOD  - audio       - MODule (Impulse Tracker)
     
    541567                                                        'option'    => 'it',
    542568                                                        'mime_type' => 'audio/it',
    543                                                   ),
     569                                                ),
    544570
    545571                                // MOD  - audio       - MODule (eXtended Module, various sub-formats)
     
    550576                                                        'option'    => 'xm',
    551577                                                        'mime_type' => 'audio/xm',
    552                                                   ),
     578                                                ),
    553579
    554580                                // MOD  - audio       - MODule (ScreamTracker)
     
    559585                                                        'option'    => 's3m',
    560586                                                        'mime_type' => 'audio/s3m',
    561                                                   ),
     587                                                ),
    562588
    563589                                // MPC  - audio       - Musepack / MPEGplus
     
    566592                                                        'group'     => 'audio',
    567593                                                        'module'    => 'mpc',
    568                                                         'mime_type' => 'application/octet-stream',
    569                                                   ),
     594                                                        'mime_type' => 'audio/x-musepack',
     595                                                ),
    570596
    571597                                // MP3  - audio       - MPEG-audio Layer 3 (very similar to AAC-ADTS)
     
    575601                                                        'module'    => 'mp3',
    576602                                                        'mime_type' => 'audio/mpeg',
    577                                                   ),
     603                                                ),
    578604
    579605                                // OFR  - audio       - OptimFROG
     
    583609                                                        'module'    => 'optimfrog',
    584610                                                        'mime_type' => 'application/octet-stream',
    585                                                   ),
     611                                                ),
    586612
    587613                                // RKAU - audio       - RKive AUdio compressor
     
    591617                                                        'module'    => 'rkau',
    592618                                                        'mime_type' => 'application/octet-stream',
    593                                                   ),
     619                                                ),
    594620
    595621                                // SHN  - audio       - Shorten
     
    601627                                                        'fail_id3'  => 'ERROR',
    602628                                                        'fail_ape'  => 'ERROR',
    603                                                   ),
     629                                                ),
    604630
    605631                                // TTA  - audio       - TTA Lossless Audio Compressor (http://tta.corecodec.org)
     
    609635                                                        'module'    => 'tta',
    610636                                                        'mime_type' => 'application/octet-stream',
    611                                                   ),
     637                                                ),
    612638
    613639                                // VOC  - audio       - Creative Voice (VOC)
     
    617643                                                        'module'    => 'voc',
    618644                                                        'mime_type' => 'audio/voc',
    619                                                   ),
     645                                                ),
    620646
    621647                                // VQF  - audio       - transform-domain weighted interleave Vector Quantization Format (VQF)
     
    625651                                                        'module'    => 'vqf',
    626652                                                        'mime_type' => 'application/octet-stream',
    627                                                   ),
     653                                                ),
    628654
    629655                                // WV  - audio        - WavPack (v4.0+)
     
    633659                                                        'module'    => 'wavpack',
    634660                                                        'mime_type' => 'application/octet-stream',
    635                                                   ),
     661                                                ),
    636662
    637663
     
    645671                                                        'mime_type' => 'video/x-ms-asf',
    646672                                                        'iconv_req' => false,
    647                                                   ),
    648 
    649                                 // BINK  - audio/video - Bink / Smacker
     673                                                ),
     674
     675                                // BINK - audio/video - Bink / Smacker
    650676                                'bink' => array(
    651677                                                        'pattern'   => '^(BIK|SMK)',
     
    653679                                                        'module'    => 'bink',
    654680                                                        'mime_type' => 'application/octet-stream',
    655                                                   ),
     681                                                ),
     682
     683                                // FLV  - audio/video - FLash Video
     684                                'flv' => array(
     685                                                        'pattern'   => '^FLV\x01',
     686                                                        'group'     => 'audio-video',
     687                                                        'module'    => 'flv',
     688                                                        'mime_type' => 'video/x-flv',
     689                                                ),
    656690
    657691                                // MKAV - audio/video - Mastroka
     
    661695                                                        'module'    => 'matroska',
    662696                                                        'mime_type' => 'application/octet-stream',
    663                                                   ),
     697                                                ),
    664698
    665699                                // MPEG - audio/video - MPEG (Moving Pictures Experts Group)
     
    669703                                                        'module'    => 'mpeg',
    670704                                                        'mime_type' => 'video/mpeg',
    671                                                   ),
     705                                                ),
    672706
    673707                                // NSV  - audio/video - Nullsoft Streaming Video (NSV)
     
    677711                                                        'module'    => 'nsv',
    678712                                                        'mime_type' => 'application/octet-stream',
    679                                                   ),
     713                                                ),
    680714
    681715                                // Ogg  - audio/video - Ogg (Ogg-Vorbis, Ogg-FLAC, Speex, Ogg-Theora(*), Ogg-Tarkin(*))
     
    687721                                                        'fail_id3'  => 'WARNING',
    688722                                                        'fail_ape'  => 'WARNING',
    689                                                   ),
     723                                                ),
    690724
    691725                                // QT   - audio/video - Quicktime
     
    695729                                                        'module'    => 'quicktime',
    696730                                                        'mime_type' => 'video/quicktime',
    697                                                   ),
     731                                                ),
    698732
    699733                                // RIFF - audio/video - Resource Interchange File Format (RIFF) / WAV / AVI / CD-audio / SDSS = renamed variant used by SmartSound QuickTracks (www.smartsound.com) / FORM = Audio Interchange File Format (AIFF)
     
    704738                                                        'mime_type' => 'audio/x-wave',
    705739                                                        'fail_ape'  => 'WARNING',
    706                                                   ),
     740                                                ),
    707741
    708742                                // Real - audio/video - RealAudio, RealVideo
     
    712746                                                        'module'    => 'real',
    713747                                                        'mime_type' => 'audio/x-realaudio',
    714                                                   ),
     748                                                ),
    715749
    716750                                // SWF - audio/video - ShockWave Flash
     
    720754                                                        'module'    => 'swf',
    721755                                                        'mime_type' => 'application/x-shockwave-flash',
    722                                                   ),
     756                                                ),
    723757
    724758
     
    733767                                                        'fail_id3'  => 'ERROR',
    734768                                                        'fail_ape'  => 'ERROR',
    735                                                   ),
     769                                                ),
    736770
    737771                                // GIF  - still image - Graphics Interchange Format
     
    743777                                                        'fail_id3'  => 'ERROR',
    744778                                                        'fail_ape'  => 'ERROR',
    745                                                   ),
     779                                                ),
    746780
    747781                                // JPEG - still image - Joint Photographic Experts Group (JPEG)
     
    753787                                                        'fail_id3'  => 'ERROR',
    754788                                                        'fail_ape'  => 'ERROR',
    755                                                   ),
     789                                                ),
    756790
    757791                                // PCD  - still image - Kodak Photo CD
     
    763797                                                        'fail_id3'  => 'ERROR',
    764798                                                        'fail_ape'  => 'ERROR',
    765                                                   ),
     799                                                ),
    766800
    767801
     
    774808                                                        'fail_id3'  => 'ERROR',
    775809                                                        'fail_ape'  => 'ERROR',
    776                                                   ),
     810                                                ),
     811
     812
     813                // SVG  - still image - Scalable Vector Graphics (SVG)
     814                                'svg'  => array(
     815                                                        'pattern'   => '<!DOCTYPE svg PUBLIC ',
     816                                                        'group'     => 'graphic',
     817                                                        'module'    => 'svg',
     818                                                        'mime_type' => 'image/svg+xml',
     819                                                        'fail_id3'  => 'ERROR',
     820                                                        'fail_ape'  => 'ERROR',
     821                                                ),
    777822
    778823
     
    785830                                                        'fail_id3'  => 'ERROR',
    786831                                                        'fail_ape'  => 'ERROR',
    787                                                   ),
     832                                                ),
    788833
    789834
     
    799844                                                        'fail_ape'  => 'ERROR',
    800845                                                        'iconv_req' => false,
    801                                                   ),
     846                                                ),
    802847
    803848                                // RAR  - data        - RAR compressed data
     
    809854                                                        'fail_id3'  => 'ERROR',
    810855                                                        'fail_ape'  => 'ERROR',
    811                                                   ),
    812 
    813                                 // SZIP - audio       - SZIP compressed data
     856                                                ),
     857
     858                                // SZIP - audio/data  - SZIP compressed data
    814859                                'szip' => array(
    815860                                                        'pattern'   => '^SZ\x0A\x04',
     
    819864                                                        'fail_id3'  => 'ERROR',
    820865                                                        'fail_ape'  => 'ERROR',
    821                                                   ),
     866                                                ),
    822867
    823868                                // TAR  - data        - TAR compressed data
     
    829874                                                        'fail_id3'  => 'ERROR',
    830875                                                        'fail_ape'  => 'ERROR',
    831                                                   ),
     876                                                ),
    832877
    833878                                // GZIP  - data        - GZIP compressed data
     
    839884                                                        'fail_id3'  => 'ERROR',
    840885                                                        'fail_ape'  => 'ERROR',
    841                                                   ),
    842 
    843                                 // ZIP  - data        - ZIP compressed data
     886                                                ),
     887
     888                                // ZIP  - data         - ZIP compressed data
    844889                                'zip'  => array(
    845890                                                        'pattern'   => '^PK\x03\x04',
     
    849894                                                        'fail_id3'  => 'ERROR',
    850895                                                        'fail_ape'  => 'ERROR',
    851                                                   )
     896                                                ),
     897
     898
     899                                // Misc other formats
     900
     901                // PAR2 - data        - Parity Volume Set Specification 2.0
     902                'par2' => array (
     903                                        'pattern'   => '^PAR2\x00PKT',
     904                                        'group'     => 'misc',
     905                                                        'module'    => 'par2',
     906                                                        'mime_type' => 'application/octet-stream',
     907                                                        'fail_id3'  => 'ERROR',
     908                                                        'fail_ape'  => 'ERROR',
     909                                                ),
     910
     911                                // PDF  - data        - Portable Document Format
     912                                'pdf'  => array(
     913                                                        'pattern'   => '^\x25PDF',
     914                                                        'group'     => 'misc',
     915                                                        'module'    => 'pdf',
     916                                                        'mime_type' => 'application/pdf',
     917                                                        'fail_id3'  => 'ERROR',
     918                                                        'fail_ape'  => 'ERROR',
     919                                                ),
     920
     921                                // MSOFFICE  - data   - ZIP compressed data
     922                                'msoffice' => array(
     923                                                        'pattern'   => '^\xD0\xCF\x11\xE0', // D0CF11E == DOCFILE == Microsoft Office Document
     924                                                        'group'     => 'misc',
     925                                                        'module'    => 'msoffice',
     926                                                        'mime_type' => 'application/octet-stream',
     927                                                        'fail_id3'  => 'ERROR',
     928                                                        'fail_ape'  => 'ERROR',
     929                                                ),
    852930                        );
    853931                }
     
    877955
    878956                if (preg_match('/\.mp[123a]$/i', $filename)) {
    879 
    880957                        // Too many mp3 encoders on the market put gabage in front of mpeg files
    881958                        // use assume format on these if format detection failed
     
    884961                        $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
    885962                        return $info;
    886 
    887                 //} elseif (preg_match('/\.tar$/i', $filename)) {
    888         //
    889                 //      // TAR files don't have any useful header to work from
    890                 //      // TAR  - data        - TAR compressed data
    891                 //      $info = array(
    892                 //              'pattern'   => '^.{512}',
    893                 //              'group'     => 'archive',
    894                 //              'module'    => 'tar',
    895                 //              'mime_type' => 'application/octet-stream',
    896                 //              'fail_id3'  => 'ERROR',
    897                 //              'fail_ape'  => 'ERROR',
    898                 //      );
    899                 //      $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
    900                 //      return $info;
    901 
    902963                }
    903964
     
    10661127
    10671128                                        $commandline = 'vorbiscomment -w -c "'.$empty.'" "'.$file.'" "'.$temp.'" 2>&1';
     1129                                        $commandline = 'vorbiscomment -w -c '.escapeshellarg($empty).' '.escapeshellarg($file).' '.escapeshellarg($temp).' 2>&1';
    10681130                                        $VorbisCommentError = `$commandline`;
    10691131
     
    11451207                //      unset($this->info['bitrate']);
    11461208                //}
     1209
     1210                // video bitrate undetermined, but calculable
     1211                if (isset($this->info['video']['dataformat']) && $this->info['video']['dataformat'] && (!isset($this->info['video']['bitrate']) || ($this->info['video']['bitrate'] == 0))) {
     1212                        // if video bitrate not set
     1213                        if (isset($this->info['audio']['bitrate']) && ($this->info['audio']['bitrate'] > 0) && ($this->info['audio']['bitrate'] == $this->info['bitrate'])) {
     1214                                // AND if audio bitrate is set to same as overall bitrate
     1215                                if (isset($this->info['playtime_seconds']) && ($this->info['playtime_seconds'] > 0)) {
     1216                                        // AND if playtime is set
     1217                                        if (isset($this->info['avdataend']) && isset($this->info['avdataoffset'])) {
     1218                                                // AND if AV data offset start/end is known
     1219                                                // THEN we can calculate the video bitrate
     1220                                                $this->info['bitrate'] = round((($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds']);
     1221                                                $this->info['video']['bitrate'] = $this->info['bitrate'] - $this->info['audio']['bitrate'];
     1222                                        }
     1223                                }
     1224                        }
     1225                }
    11471226
    11481227                if (!isset($this->info['playtime_seconds']) && !empty($this->info['bitrate'])) {
     
    12551334        }
    12561335
     1336        function getid3_tempnam() {
     1337                return tempnam($this->tempdir, 'gI3');
     1338        }
     1339
    12571340}
    12581341
  • _plugins_/_test_/getID3/getid3/module.archive.gzip.php

    r16273 r22745  
    99//                                                             //
    1010// module.archive.gzip.php                                     //
    11 // written by Mike Mozolin <teddybearØmail*ru>                 //
    1211// module for analyzing GZIP files                             //
    1312// dependencies: NONE                                          //
    1413//                                                            ///
    1514/////////////////////////////////////////////////////////////////
     15//                                                             //
     16// Module originally written by                                //
     17//      Mike Mozolin <teddybearØmail*ru>                       //
     18//                                                             //
     19/////////////////////////////////////////////////////////////////
     20
    1621
    1722class getid3_gzip {
    1823
    1924        // public: Optional file list - disable for speed.
    20         var $option_gzip_parse_contents = true; // decode gzipped files, if possible, and parse recursively (.tar.gz for example)
     25        var $option_gzip_parse_contents = false; // decode gzipped files, if possible, and parse recursively (.tar.gz for example)
    2126
    2227        function getid3_gzip(&$fd, &$ThisFileInfo) {
    2328                $ThisFileInfo['fileformat'] = 'gzip';
    24                 return $this->read_gzip($fd, $ThisFileInfo);
    25         }
    26 
    27         // Reads the gzip-file
    28         function read_gzip($fd, &$ThisFileInfo) {
    2929
    3030                $start_length = 10;
     
    118118                                        $si2 = ord(substr($buff, $fpointer + $idx++, 1));
    119119                                        if (($si1 == 0x41) && ($si2 == 0x70)) {
    120                                                 $w_xsublen = substr($buff, $fpointer+$idx, 2);
     120                                                $w_xsublen = substr($buff, $fpointer + $idx, 2);
    121121                                                $xsublen = getid3_lib::LittleEndian2Int($w_xsublen);
    122122                                                $idx += 2;
    123                                                 $arr_xsubfield[] = substr($buff, $fpointer+$idx, $xsublen);
     123                                                $arr_xsubfield[] = substr($buff, $fpointer + $idx, $xsublen);
    124124                                                $idx += $xsublen;
    125125                                        } else {
     
    204204                                                        // view TAR-file info
    205205                                                        if (file_exists(GETID3_INCLUDEPATH.$determined_format['include']) && @include_once(GETID3_INCLUDEPATH.$determined_format['include'])) {
    206                                                                 getid3_tar::read_tar($inflated, $ThisFileInfo['gzip']['member_header'][$idx]);
     206                                                                if (($temp_tar_filename = tempnam('*', 'getID3')) === false) {
     207                                                                        // can't find anywhere to create a temp file, abort
     208                                                                        $ThisFileInfo['error'][] = 'Unable to create temp file to parse TAR inside GZIP file';
     209                                                                        break;
     210                                                                }
     211                                                                if ($fp_temp_tar = fopen($temp_tar_filename, 'w+b')) {
     212                                                                        fwrite($fp_temp_tar, $inflated);
     213                                                                        rewind($fp_temp_tar);
     214                                                                        $getid3_tar = new getid3_tar($fp_temp_tar, $dummy);
     215                                                                        $ThisFileInfo['gzip']['member_header'][$idx]['tar'] = $dummy['tar'];
     216                                                                        unset($dummy);
     217                                                                        unset($getid3_tar);
     218                                                                        fclose($fp_temp_tar);
     219                                                                        unlink($temp_tar_filename);
     220                                                                } else {
     221                                                                        $ThisFileInfo['error'][] = 'Unable to fopen() temp file to parse TAR inside GZIP file';
     222                                                                        break;
     223                                                                }
    207224                                                        }
    208225                                                        break;
  • _plugins_/_test_/getID3/getid3/module.archive.tar.php

    r16273 r22745  
    99//                                                             //
    1010// module.archive.tar.php                                      //
    11 // written by Mike Mozolin <teddybearØmail*ru>                 //
    1211// module for analyzing TAR files                              //
    1312// dependencies: NONE                                          //
    1413//                                                            ///
    1514/////////////////////////////////////////////////////////////////
     15//                                                             //
     16// Module originally written by                                //
     17//      Mike Mozolin <teddybearØmail*ru>                       //
     18//                                                             //
     19/////////////////////////////////////////////////////////////////
     20
    1621
    1722class getid3_tar {
     
    1924        function getid3_tar(&$fd, &$ThisFileInfo) {
    2025                $ThisFileInfo['fileformat'] = 'tar';
     26                $ThisFileInfo['tar']['files'] = array();
     27
     28                $unpack_header = 'a100fname/a8mode/a8uid/a8gid/a12size/a12mtime/a8chksum/a1typflag/a100lnkname/a6magic/a2ver/a32uname/a32gname/a8devmaj/a8devmin/a155prefix';
     29                $null_512k = str_repeat("\x00", 512); // end-of-file marker
    2130
    2231                @fseek($fd, 0);
    23                 $filebuffer = @fread($fd, $ThisFileInfo['filesize']);
    24                 return $this->read_tar($filebuffer, $ThisFileInfo);
    25         }
     32                while (!feof($fd)) {
     33                        $buffer = fread($fd, 512);
     34                        if (strlen($buffer) < 512) {
     35                                break;
     36                        }
    2637
    27         // Reads the tar-file
    28         function read_tar(&$filebuffer, &$ThisFileInfo) {
    29 
    30                 $header_length = 512;
    31                 $unpack_header = 'a100fname/a8mode/a8uid/a8gid/a12size/a12mtime/a8chksum/a1typflag/a100lnkname/a6magic/a2ver/a32uname/a32gname/a8devmaj/a8devmin/a155/prefix';
    32 
    33                 $null_512k = str_repeat("\0", 512); // end-of-file marker
    34 
    35                 $ThisFileInfo['tar']['files'] = array();
    36 
    37                 while(strlen($filebuffer) != 0) {
    38                         $buffer = substr($filebuffer, 0, $header_length);
    39                         $filebuffer = substr($filebuffer, strlen($buffer));
    4038                        // check the block
    4139                        $checksum = 0;
    4240                        for ($i = 0; $i < 148; $i++) {
    43                                 $checksum += ord(substr($buffer, $i, 1));
     41                                $checksum += ord($buffer{$i});
    4442                        }
    4543                        for ($i = 148; $i < 156; $i++) {
     
    4745                        }
    4846                        for ($i = 156; $i < 512; $i++) {
    49                                 $checksum += ord(substr($buffer, $i, 1));
     47                                $checksum += ord($buffer{$i});
    5048                        }
    5149                        $attr    = unpack($unpack_header, $buffer);
     
    6664                        $devmin  = octdec(trim(@$attr['devmin']));
    6765                        $prefix  =        trim(@$attr['prefix']);
    68                         // EOF Found
    6966                        if (($checksum == 256) && ($chksum == 0)) {
     67                                // EOF Found
    7068                                break;
    7169                        }
     
    7674                                $typeflag = 5;
    7775                        }
    78                         // If it's the end of the tar-file...
    7976                        if ($buffer == $null_512k) {
     77                                // it's the end of the tar-file...
    8078                                break;
    8179                        }
    82                         // Read the next chunk
    83                         $data = substr($filebuffer, 0, $size);
    84                         $filebuffer = substr($filebuffer, strlen($data));
    85                         if (strlen($data) != $size) {
    86                                 $ThisFileInfo['error'][] = 'Read error on tar file';
    87                                 return false;
    88                         }
     80
     81                        // Read to the next chunk
     82                        fseek($fd, $size, SEEK_CUR);
     83
    8984                        $diff = $size % 512;
    9085                        if ($diff != 0) {
    9186                                // Padding, throw away
    92                                 $buff = substr($filebuffer, 0, (512 - $diff));
    93                                 $filebuffer = substr($filebuffer, strlen($buff));
     87                                fseek($fd, (512 - $diff), SEEK_CUR);
    9488                        }
    9589                        // Protect against tar-files with garbage at the end
     
    123117        function display_perms($mode) {
    124118                // Determine Type
    125                 if ($mode & 0x1000)    $type='p'; // FIFO pipe
     119                if     ($mode & 0x1000) $type='p'; // FIFO pipe
    126120                elseif ($mode & 0x2000) $type='c'; // Character special
    127121                elseif ($mode & 0x4000) $type='d'; // Directory
  • _plugins_/_test_/getID3/getid3/module.archive.zip.php

    r16273 r22745  
    407407                $UNIXhour   = (($DOStime & 0xF800) >> 11);
    408408
    409                 return mktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
     409                return gmmktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
    410410        }
    411411
  • _plugins_/_test_/getID3/getid3/module.audio-video.asf.php

    r16273 r22745  
    7979                $thisfile_asf_headerobject['reserved2']     = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 29, 1));
    8080
    81                 //$ASFHeaderData  = $HeaderObjectData;
    8281                $ASFHeaderData = fread($fd, $thisfile_asf_headerobject['objectsize'] - 30);
    83                 //$offset = 30;
    8482                $offset = 0;
    8583
     
    135133                                        $thisfile_asf_filepropertiesobject['preroll']            = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));
    136134                                        $offset += 8;
    137                                         $ThisFileInfo['playtime_seconds'] = ($thisfile_asf_filepropertiesobject['play_duration'] / 10000000) - ($thisfile_asf_filepropertiesobject['preroll'] / 1000);
    138135                                        $thisfile_asf_filepropertiesobject['flags_raw']          = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
    139136                                        $offset += 4;
     
    147144                                        $thisfile_asf_filepropertiesobject['max_bitrate']        = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
    148145                                        $offset += 4;
    149                                         $ThisFileInfo['bitrate']                                 = $thisfile_asf_filepropertiesobject['max_bitrate'];
     146
     147                                        if ($thisfile_asf_filepropertiesobject['flags']['broadcast']) {
     148
     149                                                // broadcast flag is set, some values invalid
     150                                                unset($thisfile_asf_filepropertiesobject['filesize']);
     151                                                unset($thisfile_asf_filepropertiesobject['data_packets']);
     152                                                unset($thisfile_asf_filepropertiesobject['play_duration']);
     153                                                unset($thisfile_asf_filepropertiesobject['send_duration']);
     154                                                unset($thisfile_asf_filepropertiesobject['min_packet_size']);
     155                                                unset($thisfile_asf_filepropertiesobject['max_packet_size']);
     156
     157                                        } else {
     158
     159                                                // broadcast flag NOT set, perform calculations
     160                                                $ThisFileInfo['playtime_seconds'] = ($thisfile_asf_filepropertiesobject['play_duration'] / 10000000) - ($thisfile_asf_filepropertiesobject['preroll'] / 1000);
     161
     162                                                //$ThisFileInfo['bitrate'] = $thisfile_asf_filepropertiesobject['max_bitrate'];
     163                                                $ThisFileInfo['bitrate'] = ((isset($thisfile_asf_filepropertiesobject['filesize']) ? $thisfile_asf_filepropertiesobject['filesize'] : $ThisFileInfo['filesize']) * 8) / $ThisFileInfo['playtime_seconds'];
     164                                        }
    150165                                        break;
    151166
     
    332347                                                                $thisfile_audio['bitrate'] = (int) (trim(str_replace('kbps', '', $AudioCodecBitrate)) * 1000);
    333348                                                        }
    334                                                         if (!isset($thisfile_video['bitrate']) && isset($thisfile_audio['bitrate']) && isset($thisfile_asf['file_properties_object']['max_bitrate']) && ($thisfile_asf_codeclistobject['codec_entries_count'] > 1)) {
    335                                                                 $thisfile_video['bitrate'] = $thisfile_asf['file_properties_object']['max_bitrate'] - $thisfile_audio['bitrate'];
     349                                                        //if (!isset($thisfile_video['bitrate']) && isset($thisfile_audio['bitrate']) && isset($thisfile_asf['file_properties_object']['max_bitrate']) && ($thisfile_asf_codeclistobject['codec_entries_count'] > 1)) {
     350                                                        if (!@$thisfile_video['bitrate'] && @$thisfile_audio['bitrate'] && @$ThisFileInfo['bitrate']) {
     351                                                                //$thisfile_video['bitrate'] = $thisfile_asf['file_properties_object']['max_bitrate'] - $thisfile_audio['bitrate'];
     352                                                                $thisfile_video['bitrate'] = $ThisFileInfo['bitrate'] - $thisfile_audio['bitrate'];
    336353                                                        }
    337354
     
    339356                                                        switch ($AudioCodecFrequency) {
    340357                                                                case 8:
     358                                                                case 8000:
    341359                                                                        $thisfile_audio['sample_rate'] = 8000;
    342360                                                                        break;
    343361
    344362                                                                case 11:
     363                                                                case 11025:
    345364                                                                        $thisfile_audio['sample_rate'] = 11025;
    346365                                                                        break;
    347366
    348367                                                                case 12:
     368                                                                case 12000:
    349369                                                                        $thisfile_audio['sample_rate'] = 12000;
    350370                                                                        break;
    351371
    352372                                                                case 16:
     373                                                                case 16000:
    353374                                                                        $thisfile_audio['sample_rate'] = 16000;
    354375                                                                        break;
    355376
    356377                                                                case 22:
     378                                                                case 22050:
    357379                                                                        $thisfile_audio['sample_rate'] = 22050;
    358380                                                                        break;
    359381
    360382                                                                case 24:
     383                                                                case 24000:
    361384                                                                        $thisfile_audio['sample_rate'] = 24000;
    362385                                                                        break;
    363386
    364387                                                                case 32:
     388                                                                case 32000:
    365389                                                                        $thisfile_audio['sample_rate'] = 32000;
    366390                                                                        break;
    367391
    368392                                                                case 44:
     393                                                                case 441000:
    369394                                                                        $thisfile_audio['sample_rate'] = 44100;
    370395                                                                        break;
    371396
    372397                                                                case 48:
     398                                                                case 48000:
    373399                                                                        $thisfile_audio['sample_rate'] = 48000;
    374400                                                                        break;
     
    376402                                                                default:
    377403                                                                        $ThisFileInfo['warning'][] = 'unknown frequency: "'.$AudioCodecFrequency.'" ('.$this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description']).')';
    378         //                                return false;
    379404                                                                        break;
    380405                                                        }
     
    755780                                                                break;
    756781
     782                                                        case 'wm/lyrics':
     783                                                        case 'lyrics':
     784                                                                $thisfile_asf_comments['lyrics'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
     785                                                                break;
     786
    757787                                                        case 'isvbr':
    758788                                                                if ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']) {
     
    770800                                                                        fwrite($tempfilehandle, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']);
    771801                                                                        fclose($tempfilehandle);
    772                                                                        
     802
    773803                                                                        $tempfilehandle = fopen($tempfile, "rb");
    774804                                                                        $id3 = new getid3_id3v2($tempfilehandle, $tempThisfileInfo);
     805                                                                        unset($id3);
    775806                                                                        fclose($tempfilehandle);
    776807                                                                        unlink($tempfile);
    777                                                                        
     808
    778809                                                                        $ThisFileInfo['id3v2'] = $tempThisfileInfo['id3v2'];
     810                                                                        unset($tempThisfileInfo);
    779811                                                                }
    780812                                                                break;
     
    854886                                        $thisfile_asf_streambitratepropertiesobject       = &$thisfile_asf['stream_bitrate_properties_object'];
    855887
    856                                         $thisfile_asf_streambitrateproperties['objectid']                  = $NextObjectGUID;
    857                                         $thisfile_asf_streambitrateproperties['objectid_guid']             = $NextObjectGUIDtext;
    858                                         $thisfile_asf_streambitrateproperties['objectsize']                = $NextObjectSize;
    859                                         $thisfile_asf_streambitrateproperties['bitrate_records_count']     = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
     888                                        $thisfile_asf_streambitratepropertiesobject['objectid']                  = $NextObjectGUID;
     889                                        $thisfile_asf_streambitratepropertiesobject['objectid_guid']             = $NextObjectGUIDtext;
     890                                        $thisfile_asf_streambitratepropertiesobject['objectsize']                = $NextObjectSize;
     891                                        $thisfile_asf_streambitratepropertiesobject['bitrate_records_count']     = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
    860892                                        $offset += 2;
    861                                         for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitrateproperties['bitrate_records_count']; $BitrateRecordsCounter++) {
    862                                                 $thisfile_asf_streambitrateproperties['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
     893                                        for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitratepropertiesobject['bitrate_records_count']; $BitrateRecordsCounter++) {
     894                                                $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
    863895                                                $offset += 2;
    864                                                 $thisfile_asf_streambitrateproperties['bitrate_records'][$BitrateRecordsCounter]['flags']['stream_number'] = $thisfile_asf_streambitrateproperties['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] & 0x007F;
    865                                                 $thisfile_asf_streambitrateproperties['bitrate_records'][$BitrateRecordsCounter]['bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
     896                                                $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags']['stream_number'] = $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] & 0x007F;
     897                                                $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));
    866898                                                $offset += 4;
    867899                                        }
     
    884916                                        $thisfile_asf_paddingobject['padding_length']            = $thisfile_asf_paddingobject['objectsize'] - 16 - 8;
    885917                                        $thisfile_asf_paddingobject['padding']                   = substr($ASFHeaderData, $offset, $thisfile_asf_paddingobject['padding_length']);
     918                                        $offset += ($NextObjectSize - 16 - 8);
    886919                                        break;
    887920
     
    924957                        }
    925958                        if ($ASFbitrateAudio > 0) {
    926                                 $thisfile_audio['bitrate']     = $ASFbitrateAudio;
     959                                $thisfile_audio['bitrate'] = $ASFbitrateAudio;
    927960                        }
    928961                        if ($ASFbitrateVideo > 0) {
    929                                 $thisfile_video['bitrate']     = $ASFbitrateVideo;
     962                                $thisfile_video['bitrate'] = $ASFbitrateVideo;
    930963                        }
    931964                }
    932965                if (isset($thisfile_asf['stream_properties_object']) && is_array($thisfile_asf['stream_properties_object'])) {
     966
     967                        $thisfile_audio['bitrate'] = 0;
     968                        $thisfile_video['bitrate'] = 0;
    933969
    934970                        foreach ($thisfile_asf['stream_properties_object'] as $streamnumber => $streamdata) {
     
    963999                                                }
    9641000
    965                                                 if (!isset($thisfile_audio['bitrate'])) {
    966                                                         $thisfile_audio['bitrate'] = $thisfile_asf_audiomedia_currentstream['bytes_sec'] * 8;
     1001                                                if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) {
     1002                                                        foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) {
     1003                                                                if (@$dataarray['flags']['stream_number'] == $streamnumber) {
     1004                                                                        $thisfile_asf_audiomedia_currentstream['bitrate'] = $dataarray['bitrate'];
     1005                                                                        $thisfile_audio['bitrate'] += $dataarray['bitrate'];
     1006                                                                        break;
     1007                                                                }
     1008                                                        }
     1009                                                } else {
     1010                                                        if (@$thisfile_asf_audiomedia_currentstream['bytes_sec']) {
     1011                                                                $thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bytes_sec'] * 8;
     1012                                                        } elseif (@$thisfile_asf_audiomedia_currentstream['bitrate']) {
     1013                                                                $thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bitrate'];
     1014                                                        }
    9671015                                                }
    9681016                                                $thisfile_audio['streams'][$streamnumber]                = $thisfile_asf_audiomedia_currentstream;
     
    9701018                                                $thisfile_audio['streams'][$streamnumber]['lossless']    = $thisfile_audio['lossless'];
    9711019                                                $thisfile_audio['streams'][$streamnumber]['bitrate']     = $thisfile_audio['bitrate'];
     1020                                                $thisfile_audio['streams'][$streamnumber]['dataformat']  = 'wma';
    9721021                                                unset($thisfile_audio['streams'][$streamnumber]['raw']);
    9731022
     
    10361085                                                $thisfile_asf_videomedia_currentstream['format_data']['codec_data']       = substr($streamdata['type_specific_data'], $videomediaoffset);
    10371086
     1087                                                if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) {
     1088                                                        foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) {
     1089                                                                if (@$dataarray['flags']['stream_number'] == $streamnumber) {
     1090                                                                        $thisfile_asf_videomedia_currentstream['bitrate'] = $dataarray['bitrate'];
     1091                                                                        $thisfile_video['streams'][$streamnumber]['bitrate'] = $dataarray['bitrate'];
     1092                                                                        $thisfile_video['bitrate'] += $dataarray['bitrate'];
     1093                                                                        break;
     1094                                                                }
     1095                                                        }
     1096                                                }
    10381097
    10391098                                                $thisfile_asf_videomedia_currentstream['format_data']['codec'] = getid3_riff::RIFFfourccLookup($thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']);
    10401099
    1041                                                 $thisfile_video['fourcc']          = $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc'];
    1042                                                 $thisfile_video['codec']           = $thisfile_asf_videomedia_currentstream['format_data']['codec'];
    1043                                                 $thisfile_video['resolution_x']    = $thisfile_asf_videomedia_currentstream['image_width'];
    1044                                                 $thisfile_video['resolution_y']    = $thisfile_asf_videomedia_currentstream['image_height'];
    1045                                                 $thisfile_video['bits_per_sample'] = $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel'];
     1100                                                $thisfile_video['streams'][$streamnumber]['fourcc']          = $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc'];
     1101                                                $thisfile_video['streams'][$streamnumber]['codec']           = $thisfile_asf_videomedia_currentstream['format_data']['codec'];
     1102                                                $thisfile_video['streams'][$streamnumber]['resolution_x']    = $thisfile_asf_videomedia_currentstream['image_width'];
     1103                                                $thisfile_video['streams'][$streamnumber]['resolution_y']    = $thisfile_asf_videomedia_currentstream['image_height'];
     1104                                                $thisfile_video['streams'][$streamnumber]['bits_per_sample'] = $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel'];
    10461105                                                break;
    10471106
     
    12411300                                        case 'WMV2':
    12421301                                        case 'WMV3':
     1302                    case 'MSS1':
     1303                    case 'MSS2':
     1304                    case 'WMVA':
     1305                    case 'WVC1':
     1306                    case 'WMVP':
     1307                    case 'WVP2':
    12431308                                                $thisfile_video['dataformat'] = 'wmv';
    12441309                                                $ThisFileInfo['mime_type']    = 'video/x-ms-wmv';
     
    12791344                }
    12801345
    1281                 switch ($thisfile_audio['codec']) {
     1346                switch (@$thisfile_audio['codec']) {
    12821347                        case 'MPEG Layer-3':
    12831348                                $thisfile_audio['dataformat'] = 'mp3';
     
    13211386                        $thisfile_video['pixel_aspect_ratio'] = (isset($thisfile_audio['pixel_aspect_ratio']) ? $thisfile_audio['pixel_aspect_ratio'] : (float) 1);
    13221387                        $thisfile_video['dataformat']         = (!empty($thisfile_video['dataformat'])        ? $thisfile_video['dataformat']         : 'asf');
     1388                }
     1389                if (!empty($thisfile_video['streams'])) {
     1390                        $thisfile_video['streams']['resolution_x'] = 0;
     1391                        $thisfile_video['streams']['resolution_y'] = 0;
     1392                        foreach ($thisfile_video['streams'] as $key => $valuearray) {
     1393                                if (($valuearray['resolution_x'] > $thisfile_video['streams']['resolution_x']) || ($valuearray['resolution_y'] > $thisfile_video['streams']['resolution_y'])) {
     1394                                        $thisfile_video['resolution_x'] = $valuearray['resolution_x'];
     1395                                        $thisfile_video['resolution_y'] = $valuearray['resolution_y'];
     1396                                }
     1397                        }
     1398                }
     1399                $ThisFileInfo['bitrate'] = @$thisfile_audio['bitrate'] + @$thisfile_video['bitrate'];
     1400
     1401                if ((!isset($ThisFileInfo['playtime_seconds']) || ($ThisFileInfo['playtime_seconds'] <= 0)) && ($ThisFileInfo['bitrate'] > 0)) {
     1402                        $ThisFileInfo['playtime_seconds'] = ($ThisFileInfo['filesize'] - $ThisFileInfo['avdataoffset']) / ($ThisFileInfo['bitrate'] / 8);
    13231403                }
    13241404
  • _plugins_/_test_/getID3/getid3/module.audio-video.quicktime.php

    r16273 r22745  
    521521                                                $sttsEntriesDataOffset += 4;
    522522
    523                                                 if (!empty($ThisFileInfo['quicktime']['time_scale'])) {
     523                                                if (!empty($ThisFileInfo['quicktime']['time_scale']) && (@$atomstructure['time_to_sample_table'][$i]['sample_duration'] > 0)) {
    524524                                                        $stts_new_framerate = $ThisFileInfo['quicktime']['time_scale'] / $atomstructure['time_to_sample_table'][$i]['sample_duration'];
    525525                                                        if ($stts_new_framerate <= 60) {
     
    698698                                        return false;
    699699                                }
     700                $ThisFileInfo['quicktime']['time_scale'] = max(@$ThisFileInfo['quicktime']['time_scale'], $atomstructure['time_scale']);
     701
    700702                                $atomstructure['creation_time_unix']    = getid3_lib::DateMac2Unix($atomstructure['creation_time']);
    701703                                $atomstructure['modify_time_unix']      = getid3_lib::DateMac2Unix($atomstructure['modify_time']);
     
    812814                                $atomstructure['creation_time_unix']        = getid3_lib::DateMac2Unix($atomstructure['creation_time']);
    813815                                $atomstructure['modify_time_unix']          = getid3_lib::DateMac2Unix($atomstructure['modify_time']);
    814                                 $ThisFileInfo['quicktime']['time_scale']    = $atomstructure['time_scale'];
     816                                $ThisFileInfo['quicktime']['time_scale'] = max(@$ThisFileInfo['quicktime']['time_scale'], $atomstructure['time_scale']);
    815817                                $ThisFileInfo['quicktime']['display_scale'] = $atomstructure['matrix_a'];
    816818                                $ThisFileInfo['playtime_seconds']           = $atomstructure['duration'] / $atomstructure['time_scale'];
     
    854856                                        $ThisFileInfo['video']['resolution_y'] = $atomstructure['height'];
    855857                                }
    856                                 $ThisFileInfo['video']['resolution_x'] = max($ThisFileInfo['video']['resolution_x'], $atomstructure['width']);
    857                                 $ThisFileInfo['video']['resolution_y'] = max($ThisFileInfo['video']['resolution_y'], $atomstructure['height']);
     858                                if ($atomstructure['flags']['enabled'] == 1) {
     859                                        $ThisFileInfo['video']['resolution_x'] = max($ThisFileInfo['video']['resolution_x'], $atomstructure['width']);
     860                                        $ThisFileInfo['video']['resolution_y'] = max($ThisFileInfo['video']['resolution_y'], $atomstructure['height']);
     861                                }
    858862                                if (!empty($ThisFileInfo['video']['resolution_x']) && !empty($ThisFileInfo['video']['resolution_y'])) {
    859863                                        $ThisFileInfo['quicktime']['video']['resolution_x'] = $ThisFileInfo['video']['resolution_x'];
  • _plugins_/_test_/getID3/getid3/module.audio-video.real.php

    r16273 r22745  
    7474                                fseek($fd, $thisfile_real_chunks_currentchunk['offset'] + $ChunkSize, SEEK_SET);
    7575
    76                         } else {
    77 
     76                        } elseif(($ChunkSize - 8) > 0) {
     77               
    7878                                $ChunkData .= fread($fd, $ChunkSize - 8);
    7979
  • _plugins_/_test_/getID3/getid3/module.audio-video.riff.php

    r16273 r22745  
    1414// dependencies: module.audio.mp3.php                          //
    1515//               module.audio.ac3.php (optional)               //
     16//               module.audio.dts.php (optional)               //
    1617//                                                            ///
    1718/////////////////////////////////////////////////////////////////
     
    202203                                        $thisfile_riff_WAVE_bext_0['coding_history'] =         explode("\r\n", trim(substr($thisfile_riff_WAVE_bext_0['data'], 601)));
    203204
    204                                         $thisfile_riff_WAVE_bext_0['origin_date_unix'] = mktime(
     205                                        $thisfile_riff_WAVE_bext_0['origin_date_unix'] = gmmktime(
    205206                                                                                                                                                                substr($thisfile_riff_WAVE_bext_0['origin_time'], 0, 2),
    206207                                                                                                                                                                substr($thisfile_riff_WAVE_bext_0['origin_time'], 3, 2),
     
    886887                                                        $ThisFileInfo['warning'] = $dummy['warning'];
    887888                                                }
     889                                                unset($mpeg_scanner);
    888890                                        }
    889891                                }
     
    896898                                break;
    897899                }
     900
     901                if (@$thisfile_riff_raw['fmt ']['wFormatTag'] == 1) {
     902                        // http://www.mega-nerd.com/erikd/Blog/Windiots/dts.html
     903                        fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET);
     904                        $FirstFourBytes = fread($fd, 4);
     905                        if (preg_match('/^\xFF\x1F\x00\xE8/s', $FirstFourBytes)) {
     906                                // DTSWAV
     907                                $thisfile_audio_dataformat = 'dts';
     908                        } elseif (preg_match('/^\x7F\xFF\x80\x01/s', $FirstFourBytes)) {
     909                                // DTS, but this probably shouldn't happen
     910                                $thisfile_audio_dataformat = 'dts';
     911                        }
     912                }
     913
    898914
    899915                if (isset($thisfile_riff_WAVE['DISP']) && is_array($thisfile_riff_WAVE['DISP'])) {
     
    10651081
    10661082                $RIFFchunk = false;
     1083                $ParsedAudioStream = false;
    10671084
    10681085                fseek($fd, $startoffset, SEEK_SET);
     
    10771094                        $chunksize = getid3_riff::EitherEndian2Int($ThisFileInfo, fread($fd, 4));
    10781095                        if ($chunksize == 0) {
    1079                                 $ThisFileInfo['error'][] = 'Chunk size at offset '.(ftell($fd) - 4).' is zero. Aborting RIFF parsing.';
    1080                                 break;
     1096                                $ThisFileInfo['warning'][] = 'Chunk size at offset '.(ftell($fd) - 4).' is zero. Aborting RIFF parsing.';
     1097                                continue;
    10811098                        }
    10821099                        if (($chunksize % 2) != 0) {
     
    10941111                                                        $RIFFchunk[$listname]['size']   = $chunksize;
    10951112
    1096                                                         static $ParsedAudioStream = false;
    10971113                                                        if ($ParsedAudioStream) {
    10981114
     
    11101126                                                                        $FirstFourBytes = substr($AudioChunkHeader, 8, 4);
    11111127                                                                        if (preg_match('/^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]/s', $FirstFourBytes)) {
    1112 
    11131128                                                                                // MP3
    11141129                                                                                if (getid3_mp3::MPEGaudioHeaderBytesValid($FirstFourBytes)) {
     
    11261141                                                                                                $ThisFileInfo['audio']['bitrate_mode'] = strtolower($ThisFileInfo['mpeg']['audio']['bitrate_mode']);
    11271142                                                                                        }
     1143                                                                                        unset($dummy);
    11281144                                                                                }
    11291145
     
    11441160                                                                                                $ThisFileInfo['warning'] = $dummy['warning'];
    11451161                                                                                        }
     1162                                                                                        unset($ac3_tag);
    11461163
    11471164                                                                                }
     
    11891206                                                                // Probably is MP3 data
    11901207                                                                if (getid3_mp3::MPEGaudioHeaderBytesValid(substr($RIFFdataChunkContentsTest, 0, 4))) {
    1191                                                                         getid3_mp3::getOnlyMPEGaudioInfo($fd, $ThisFileInfo, $RIFFchunk[$chunkname][$thisindex]['offset'], false);
     1208
     1209                                                                        // copy info array
     1210                                                                        $dummy = $ThisFileInfo;
     1211
     1212                                                                        getid3_mp3::getOnlyMPEGaudioInfo($fd, $dummy, $RIFFchunk[$chunkname][$thisindex]['offset'], false);
     1213
     1214                                    // use dummy array unless error
     1215                                                                        if (empty($dummy['error'])) {
     1216                                                                            $ThisFileInfo = $dummy;
     1217                                                                        }
    11921218                                                                }
    11931219
     
    12091235                                                                                $ThisFileInfo['warning'] = $dummy['warning'];
    12101236                                                                        }
     1237                                                                        unset($ac3_tag);
    12111238
    12121239                                                                }
     
    12431270                                                                                        $ThisFileInfo['error'][] = 'Errors parsing DolbyDigital WAV: '.explode(';', $dummy['error']);
    12441271                                                                                }
     1272                                                                                unset($ac3_tag);
    12451273
    12461274                                                                        } else {
     
    12711299                                                case 'cart':
    12721300                                                case 'fmt ':
     1301                                                case 'strh':
     1302                                                case 'strf':
    12731303                                                case 'MEXT':
    12741304                                                case 'DISP':
     
    13291359                        $ThisFileInfo['tags']     = $dummy['tags'];
    13301360                        $ThisFileInfo['comments'] = $dummy['comments'];
     1361                        unset($riff);
    13311362                        fclose($fp_temp);
    13321363                        unlink($tempfile);
     
    19541985                        XVID    XviD MPEG-4 (www.xvid.org)
    19551986                        XXAN    ?XXAN?
    1956                         Y422    ADS Technologies Copy of UYVY used in Pyro WebCam firewire camera
    1957                         Y800    Simple, single Y plane for monochrome images
    19581987                        YU92    Intel YUV (YU92)
    19591988                        YUNV    Nvidia Uncompressed YUV 4:2:2
     
    19661995                        Y42B    Weitek YUV 4:2:2 Planar
    19671996                        Y42T    Brooktree UYUV 4:2:2 with transparency
     1997                        Y422    ADS Technologies Copy of UYVY used in Pyro WebCam firewire camera
     1998                        Y800    Simple, single Y plane for monochrome images
    19681999                        Y8      Grayscale video
    19692000                        YC12    Intel YUV 12 codec
  • _plugins_/_test_/getID3/getid3/module.audio.aac.php

    r16273 r22745  
    300300
    301301                // used to calculate bitrate below
    302                 static $BitrateCache = array();
     302                $BitrateCache = array();
    303303
    304304
  • _plugins_/_test_/getID3/getid3/module.audio.flac.php

    r16273 r22745  
    4848                        $METAdataBlockTypeText        = getid3_flac::FLACmetaBlockTypeLookup($METAdataBlockType);
    4949
    50                         if ($METAdataBlockLength <= 0) {
     50                        if ($METAdataBlockLength < 0) {
    5151                                $ThisFileInfo['error'][] = 'corrupt or invalid METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$METAdataBlockType.') at offset '.$METAdataBlockOffset;
    5252                                break;
     
    6161                        $ThisFileInfo_flac_METAdataBlockTypeText_raw['block_type_text'] = $METAdataBlockTypeText;
    6262                        $ThisFileInfo_flac_METAdataBlockTypeText_raw['block_length']    = $METAdataBlockLength;
    63                         $ThisFileInfo_flac_METAdataBlockTypeText_raw['block_data']      = fread($fd, $METAdataBlockLength);
     63                        $ThisFileInfo_flac_METAdataBlockTypeText_raw['block_data']      = @fread($fd, $METAdataBlockLength);
    6464                        $ThisFileInfo['avdataoffset'] = ftell($fd);
    6565
     
    214214
    215215                }
     216               
     217                unset($ThisFileInfo['flac']['STREAMINFO']['raw']);
     218               
    216219                return true;
    217220        }
     
    226229                $offset = $METAdataBlockLength;
    227230
     231                unset($ThisFileInfo['flac']['APPLICATION']['raw']);
     232               
    228233                return true;
    229234        }
     
    253258                        }
    254259                }
     260               
     261                unset($ThisFileInfo['flac']['SEEKTABLE']['raw']);
     262               
    255263                return true;
    256264        }
     
    302310                        }
    303311                }
     312               
     313                unset($ThisFileInfo['flac']['CUESHEET']['raw']);
     314               
    304315                return true;
    305316        }
  • _plugins_/_test_/getID3/getid3/module.audio.la.php

    r16273 r22745  
    181181                                                                $ThisFileInfo['warning'][] = 'Error parsing RIFF portion of La file: '.implode($dummy['error']);
    182182                                                        }
     183                                                        unset($riff);
    183184                                                        unset($dummy);
    184185                                                        fclose($RIFF_fp);
  • _plugins_/_test_/getID3/getid3/module.audio.lpac.php

    r16273 r22745  
    7777                $dummy = $ThisFileInfo;
    7878                $riff = new getid3_riff($fd, $dummy);
     79                unset($riff);
    7980                $ThisFileInfo['avdataoffset']                = $dummy['avdataoffset'];
    8081                $ThisFileInfo['riff']                        = $dummy['riff'];
  • _plugins_/_test_/getID3/getid3/module.audio.midi.php

    r16273 r22745  
    7777                        $CurrentMicroSecondsPerBeat       = 500000; // 120 beats per minute;  60,000,000 microseconds per minute -> 500,000 microseconds per beat
    7878                        $CurrentBeatsPerMinute            = 120;    // 120 beats per minute;  60,000,000 microseconds per minute -> 500,000 microseconds per beat
     79                        $MicroSecondsPerQuarterNoteAfter  = array ();
    7980
    8081                        foreach ($trackdataarray as $tracknumber => $trackdata) {
     
    305306                        }
    306307                }
    307 
    308                 if ($ThisFileInfo['playtime_seconds'] > 0) {
     308               
     309
     310                if (@$ThisFileInfo['playtime_seconds'] > 0) {
    309311                        $ThisFileInfo['bitrate'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['playtime_seconds'];
    310312                }
  • _plugins_/_test_/getID3/getid3/module.audio.mp3.php

    r16273 r22745  
    321321                                                                        'r3mix|19500'         => 19500,  // 3.90,   3.90.1, 3.92
    322322                                                                        'r3mix|19600'         => 19600,  // 3.90.2, 3.90.3, 3.91
    323                                                                         'r3mix|18000'         => 18000); // 3.94,   3.95
    324                                                         if (!isset($ExpectedLowpass[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio_lame['lowpass_frequency']])) {
     323                                                                        'r3mix|18000'         => 18000,  // 3.94,   3.95
     324                                                                );
     325                                                        if (!isset($ExpectedLowpass[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio_lame['lowpass_frequency']]) && ($thisfile_mpeg_audio_lame['lowpass_frequency'] < 22050) && (round($thisfile_mpeg_audio_lame['lowpass_frequency'] / 1000) < round($thisfile_mpeg_audio['sample_rate'] / 2000))) {
    325326                                                                $encoder_options .= ' --lowpass '.$thisfile_mpeg_audio_lame['lowpass_frequency'];
    326327                                                        }
     
    718719                                                $LAMEtagRevisionVBRmethod = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA5, 1));
    719720
    720                                                 $thisfile_mpeg_audio_lame['tag_revision']      = ($LAMEtagRevisionVBRmethod & 0xF0) >> 4;
     721                                                $thisfile_mpeg_audio_lame['tag_revision']   = ($LAMEtagRevisionVBRmethod & 0xF0) >> 4;
    721722                                                $thisfile_mpeg_audio_lame_raw['vbr_method'] =  $LAMEtagRevisionVBRmethod & 0x0F;
    722                                                 $thisfile_mpeg_audio_lame['vbr_method']        = getid3_mp3::LAMEvbrMethodLookup($thisfile_mpeg_audio_lame_raw['vbr_method']);
    723                                                 $thisfile_mpeg_audio['bitrate_mode']           = substr($thisfile_mpeg_audio_lame['vbr_method'], 0, 3); // usually either 'cbr' or 'vbr', but truncates 'vbr-old / vbr-rh' to 'vbr'
     723                                                $thisfile_mpeg_audio_lame['vbr_method']     = getid3_mp3::LAMEvbrMethodLookup($thisfile_mpeg_audio_lame_raw['vbr_method']);
     724                                                $thisfile_mpeg_audio['bitrate_mode']        = substr($thisfile_mpeg_audio_lame['vbr_method'], 0, 3); // usually either 'cbr' or 'vbr', but truncates 'vbr-old / vbr-rh' to 'vbr'
    724725
    725726                                                // byte $A6  Lowpass filter value
     
    931932                }
    932933
    933                 if (!empty($thisfile_mpeg_audio['VBR_frames'])) {
     934                if (@$thisfile_mpeg_audio['VBR_frames']) {
    934935                        switch ($thisfile_mpeg_audio['bitrate_mode']) {
    935936                                case 'vbr':
    936937                                case 'abr':
    937938                                        if (($thisfile_mpeg_audio['version'] == '1') && ($thisfile_mpeg_audio['layer'] == 1)) {
    938                                                 $thisfile_mpeg_audio['VBR_bitrate'] = (($thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 384);
     939                                                $thisfile_mpeg_audio['VBR_bitrate'] = ((@$thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 384);
    939940                                        } elseif ((($thisfile_mpeg_audio['version'] == '2') || ($thisfile_mpeg_audio['version'] == '2.5')) && ($thisfile_mpeg_audio['layer'] == 3)) {
    940                                                 $thisfile_mpeg_audio['VBR_bitrate'] = (($thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 576);
     941                                                $thisfile_mpeg_audio['VBR_bitrate'] = ((@$thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 576);
    941942                                        } else {
    942                                                 $thisfile_mpeg_audio['VBR_bitrate'] = (($thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 1152);
     943                                                $thisfile_mpeg_audio['VBR_bitrate'] = ((@$thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($ThisFileInfo['audio']['sample_rate'] / 1152);
    943944                                        }
    944945                                        if ($thisfile_mpeg_audio['VBR_bitrate'] > 0) {
     
    13161317
    13171318
    1318         function getOnlyMPEGaudioInfo($fd, &$ThisFileInfo, $avdataoffset, $BitrateHistogram=false) {
    1319                 // looks for synch, decodes MPEG audio header
    1320 
    1321                 fseek($fd, $avdataoffset, SEEK_SET);
    1322                 $header = '';
    1323                 $SynchSeekOffset = 0;
    1324 
    1325                 static $MPEGaudioVersionLookup;
    1326                 static $MPEGaudioLayerLookup;
    1327                 static $MPEGaudioBitrateLookup;
    1328                 if (empty($MPEGaudioVersionLookup)) {
    1329                         $MPEGaudioVersionLookup = getid3_mp3::MPEGaudioVersionArray();
    1330                         $MPEGaudioLayerLookup   = getid3_mp3::MPEGaudioLayerArray();
    1331                         $MPEGaudioBitrateLookup = getid3_mp3::MPEGaudioBitrateArray();
    1332 
    1333                 }
    1334 
    1335                 $header_len = strlen($header) - intval(round(GETID3_FREAD_BUFFER_SIZE / 2));
    1336                 while (true) {
    1337 
    1338                         if (($SynchSeekOffset > $header_len) && (($avdataoffset + $SynchSeekOffset)  < $ThisFileInfo['avdataend']) && !feof($fd)) {
    1339 
    1340                                 if ($SynchSeekOffset > 131072) {
    1341                                         // if a synch's not found within the first 128k bytes, then give up
    1342                                         $ThisFileInfo['error'][] = 'could not find valid MPEG audio synch within the first 128k bytes';
    1343                                         if (isset($ThisFileInfo['audio']['bitrate'])) {
    1344                                                 unset($ThisFileInfo['audio']['bitrate']);
    1345                                         }
    1346                                         if (isset($ThisFileInfo['mpeg']['audio'])) {
    1347                                                 unset($ThisFileInfo['mpeg']['audio']);
    1348                                         }
    1349                                         if (empty($ThisFileInfo['mpeg'])) {
    1350                                                 unset($ThisFileInfo['mpeg']);
    1351                                         }
    1352                                         return false;
    1353 
    1354                                 } elseif ($header .= fread($fd, GETID3_FREAD_BUFFER_SIZE)) {
    1355 
    1356                                         // great
    1357                                         $header_len = strlen($header) - intval(round(GETID3_FREAD_BUFFER_SIZE / 2));
    1358 
    1359                                 } else {
    1360 
    1361                                         $ThisFileInfo['error'][] = 'could not find valid MPEG audio synch before end of file';
    1362                                         if (isset($ThisFileInfo['audio']['bitrate'])) {
    1363                                                 unset($ThisFileInfo['audio']['bitrate']);
    1364                                         }
    1365                                         if (isset($ThisFileInfo['mpeg']['audio'])) {
    1366                                                 unset($ThisFileInfo['mpeg']['audio']);
    1367                                         }
    1368                                         if (isset($ThisFileInfo['mpeg']) && (!is_array($ThisFileInfo['mpeg']) || (count($ThisFileInfo['mpeg']) == 0))) {
    1369                                                 unset($ThisFileInfo['mpeg']);
    1370                                         }
    1371                                         return false;
    1372 
    1373                                 }
    1374                         }
    1375 
    1376                         if (($SynchSeekOffset + 1) >= strlen($header)) {
    1377                                 $ThisFileInfo['error'][] = 'could not find valid MPEG synch before end of file';
    1378                                 return false;
    1379                         }
    1380 
    1381                         if (($header{$SynchSeekOffset} == "\xFF") && ($header{($SynchSeekOffset + 1)} > "\xE0")) { // synch detected
     1319    function getOnlyMPEGaudioInfo($fd, &$ThisFileInfo, $avdataoffset, $BitrateHistogram=false) {
     1320
     1321        // looks for synch, decodes MPEG audio header
     1322
     1323        static $MPEGaudioVersionLookup;
     1324        static $MPEGaudioLayerLookup;
     1325        static $MPEGaudioBitrateLookup;
     1326        if (empty($MPEGaudioVersionLookup)) {
     1327           $MPEGaudioVersionLookup = getid3_mp3::MPEGaudioVersionArray();
     1328           $MPEGaudioLayerLookup   = getid3_mp3::MPEGaudioLayerArray();
     1329           $MPEGaudioBitrateLookup = getid3_mp3::MPEGaudioBitrateArray();
     1330
     1331        }
     1332
     1333        fseek($fd, $avdataoffset, SEEK_SET);
     1334        $sync_seek_buffer_size = min(128 * 1024, $ThisFileInfo['avdataend'] - $avdataoffset);
     1335        $header = fread($fd, $sync_seek_buffer_size);
     1336        $sync_seek_buffer_size = strlen($header);
     1337        $SynchSeekOffset = 0;
     1338        while ($SynchSeekOffset < $sync_seek_buffer_size) {
     1339
     1340            if ((($avdataoffset + $SynchSeekOffset)  < $ThisFileInfo['avdataend']) && !feof($fd)) {
     1341
     1342                if ($SynchSeekOffset > $sync_seek_buffer_size) {
     1343                    // if a synch's not found within the first 128k bytes, then give up
     1344                    $ThisFileInfo['error'][] = 'Could not find valid MPEG audio synch within the first '.round($sync_seek_buffer_size / 1024).'kB';
     1345                    if (isset($ThisFileInfo['audio']['bitrate'])) {
     1346                        unset($ThisFileInfo['audio']['bitrate']);
     1347                    }
     1348                    if (isset($ThisFileInfo['mpeg']['audio'])) {
     1349                        unset($ThisFileInfo['mpeg']['audio']);
     1350                    }
     1351                    if (empty($ThisFileInfo['mpeg'])) {
     1352                        unset($ThisFileInfo['mpeg']);
     1353                    }
     1354                    return false;
     1355
     1356                } elseif (feof($fd)) {
     1357
     1358                    $ThisFileInfo['error'][] = 'Could not find valid MPEG audio synch before end of file';
     1359                    if (isset($ThisFileInfo['audio']['bitrate'])) {
     1360                        unset($ThisFileInfo['audio']['bitrate']);
     1361                    }
     1362                    if (isset($ThisFileInfo['mpeg']['audio'])) {
     1363                        unset($ThisFileInfo['mpeg']['audio']);
     1364                    }
     1365                    if (isset($ThisFileInfo['mpeg']) && (!is_array($ThisFileInfo['mpeg']) || (count($ThisFileInfo['mpeg']) == 0))) {
     1366                        unset($ThisFileInfo['mpeg']);
     1367                    }
     1368                    return false;
     1369                }
     1370            }
     1371
     1372            if (($SynchSeekOffset + 1) >= strlen($header)) {
     1373                $ThisFileInfo['error'][] = 'Could not find valid MPEG synch before end of file';
     1374                return false;
     1375            }
     1376
     1377            if (($header{$SynchSeekOffset} == "\xFF") && ($header{($SynchSeekOffset + 1)} > "\xE0")) { // synch detected
    13821378
    13831379                                if (!isset($FirstFrameThisfileInfo) && !isset($ThisFileInfo['mpeg']['audio'])) {
     
    14651461                                                                $SynchErrorsFound++;
    14661462                                                        } else {
    1467                                                                 $ThisFileInfo['mpeg']['audio']['bitrate_distribution'][$thisframebitrate]++;
    1468                                                                 $ThisFileInfo['mpeg']['audio']['stereo_distribution'][$dummy['mpeg']['audio']['channelmode']]++;
    1469                                                                 $ThisFileInfo['mpeg']['audio']['version_distribution'][$dummy['mpeg']['audio']['version']]++;
     1463                                                                @$ThisFileInfo['mpeg']['audio']['bitrate_distribution'][$thisframebitrate]++;
     1464                                                                @$ThisFileInfo['mpeg']['audio']['stereo_distribution'][$dummy['mpeg']['audio']['channelmode']]++;
     1465                                                                @$ThisFileInfo['mpeg']['audio']['version_distribution'][$dummy['mpeg']['audio']['version']]++;
    14701466
    14711467                                                                $synchstartoffset += $dummy['mpeg']['audio']['framelength'];
     
    16371633                        $decodedVersion = $MPEGaudioVersionLookup[$rawarray['version']];
    16381634                } else {
    1639                         if ($echoerrors) {
    1640                                 echo "\n".'invalid Version ('.$rawarray['version'].')';
    1641                         }
     1635                        echo ($echoerrors ? "\n".'invalid Version ('.$rawarray['version'].')' : '');
    16421636                        return false;
    16431637                }
     
    16451639                        $decodedLayer = $MPEGaudioLayerLookup[$rawarray['layer']];
    16461640                } else {
    1647                         if ($echoerrors) {
    1648                                 echo "\n".'invalid Layer ('.$rawarray['layer'].')';
    1649                         }
     1641                        echo ($echoerrors ? "\n".'invalid Layer ('.$rawarray['layer'].')' : '');
    16501642                        return false;
    16511643                }
    16521644                if (!isset($MPEGaudioBitrateLookup[$decodedVersion][$decodedLayer][$rawarray['bitrate']])) {
    1653                         if ($echoerrors) {
    1654                                 echo "\n".'invalid Bitrate ('.$rawarray['bitrate'].')';
    1655                         }
     1645                        echo ($echoerrors ? "\n".'invalid Bitrate ('.$rawarray['bitrate'].')' : '');
    16561646                        if ($rawarray['bitrate'] == 15) {
    16571647                                // known issue in LAME 3.90 - 3.93.1 where free-format has bitrate ID of 15 instead of 0
     
    16651655                }
    16661656                if (!isset($MPEGaudioFrequencyLookup[$decodedVersion][$rawarray['sample_rate']])) {
    1667                         if ($echoerrors) {
    1668                                 echo "\n".'invalid Frequency ('.$rawarray['sample_rate'].')';
    1669                         }
     1657                        echo ($echoerrors ? "\n".'invalid Frequency ('.$rawarray['sample_rate'].')' : '');
    16701658                        return false;
    16711659                }
    16721660                if (!isset($MPEGaudioChannelModeLookup[$rawarray['channelmode']])) {
    1673                         if ($echoerrors) {
    1674                                 echo "\n".'invalid ChannelMode ('.$rawarray['channelmode'].')';
    1675                         }
     1661                        echo ($echoerrors ? "\n".'invalid ChannelMode ('.$rawarray['channelmode'].')' : '');
    16761662                        return false;
    16771663                }
    16781664                if (!isset($MPEGaudioModeExtensionLookup[$decodedLayer][$rawarray['modeextension']])) {
    1679                         if ($echoerrors) {
    1680                                 echo "\n".'invalid Mode Extension ('.$rawarray['modeextension'].')';
    1681                         }
     1665                        echo ($echoerrors ? "\n".'invalid Mode Extension ('.$rawarray['modeextension'].')' : '');
    16821666                        return false;
    16831667                }
    16841668                if (!isset($MPEGaudioEmphasisLookup[$rawarray['emphasis']])) {
    1685                         if ($echoerrors) {
    1686                                 echo "\n".'invalid Emphasis ('.$rawarray['emphasis'].')';
    1687                         }
     1669                        echo ($echoerrors ? "\n".'invalid Emphasis ('.$rawarray['emphasis'].')' : '');
    16881670                        return false;
    16891671                }
     
    18511833                        0x04 => 'vbr-new / vbr-mtrh',
    18521834                        0x05 => 'vbr-mt',
    1853                         0x06 => 'Full VBR Method 4',
    1854                         0x08 => 'constant bitrate 2 pass',
    1855                         0x09 => 'abr 2 pass',
     1835                        0x06 => 'vbr (full vbr method 4)',
     1836                        0x08 => 'cbr (constant bitrate 2 pass)',
     1837                        0x09 => 'abr (2 pass)',
    18561838                        0x0F => 'reserved'
    18571839                );
     
    18941876
    18951877        function LAMEpresetUsedLookup($LAMEtag) {
    1896                 if ($LAMEtag['preset_used_id'] == 0) {
    1897                         // no preset used (LAME >=3.93)
    1898                         // no preset recorded (LAME <3.93)
    1899                         return '';
    1900                 }
    1901                 static $LAMEpresetUsedLookup = array();
    1902                 if (empty($LAMEpresetUsedLookup)) {
    1903                         for ($i = 8; $i <= 320; $i++) {
    1904                                 switch ($LAMEtag['vbr_method']) {
    1905                                         case 'cbr':
    1906                                                 $LAMEpresetUsedLookup[$i] = '--alt-preset '.$LAMEtag['vbr_method'].' '.$i;
    1907                                                 break;
    1908                                         case 'abr':
    1909                                         default: // other VBR modes shouldn't be here(?)
    1910                                                 $LAMEpresetUsedLookup[$i] = '--alt-preset '.$i;
    1911                                                 break;
    1912                                 }
    1913                         }
    1914 
    1915                         // named old-style presets (studio, phone, voice, etc) are handled in GuessEncoderOptions()
    1916 
    1917                         // named alt-presets
    1918                         $LAMEpresetUsedLookup[1000] = '--r3mix';
    1919                         $LAMEpresetUsedLookup[1001] = '--alt-preset standard';
    1920                         $LAMEpresetUsedLookup[1002] = '--alt-preset extreme';
    1921                         $LAMEpresetUsedLookup[1003] = '--alt-preset insane';
    1922                         $LAMEpresetUsedLookup[1004] = '--alt-preset fast standard';
    1923                         $LAMEpresetUsedLookup[1005] = '--alt-preset fast extreme';
    1924                         $LAMEpresetUsedLookup[1006] = '--alt-preset medium';
    1925                         $LAMEpresetUsedLookup[1007] = '--alt-preset fast medium';
    1926 
    1927                         // LAME 3.94 additions/changes
    1928                         $LAMEpresetUsedLookup[1010] = '--preset portable';                                                           // 3.94a15 Oct 21 2003
    1929                         $LAMEpresetUsedLookup[1015] = '--preset radio';                                                              // 3.94a15 Oct 21 2003
    1930 
    1931                         $LAMEpresetUsedLookup[320]  = '--preset insane';                                                             // 3.94a15 Nov 12 2003
    1932                         $LAMEpresetUsedLookup[430]  = '--preset radio';                                                              // 3.94a15 Nov 12 2003
    1933                         $LAMEpresetUsedLookup[450]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'portable';  // 3.94a15 Nov 12 2003
    1934                         $LAMEpresetUsedLookup[460]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'medium';    // 3.94a15 Nov 12 2003
    1935                         $LAMEpresetUsedLookup[470]  = '--r3mix';                                                                     // 3.94b1  Dec 18 2003
    1936                         $LAMEpresetUsedLookup[480]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'standard';  // 3.94a15 Nov 12 2003
    1937                         $LAMEpresetUsedLookup[500]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'extreme';   // 3.94a15 Nov 12 2003
    1938                 }
    1939                 return (isset($LAMEpresetUsedLookup[$LAMEtag['preset_used_id']]) ? $LAMEpresetUsedLookup[$LAMEtag['preset_used_id']] : 'new/unknown preset: '.$LAMEtag['preset_used_id'].' - report to info@getid3.org');
    1940         }
     1878
     1879        if ($LAMEtag['preset_used_id'] == 0) {
     1880            // no preset used (LAME >=3.93)
     1881            // no preset recorded (LAME <3.93)
     1882            return '';
     1883        }
     1884        $LAMEpresetUsedLookup = array();
     1885
     1886        /////  THIS PART CANNOT BE STATIC .
     1887        for ($i = 8; $i <= 320; $i++) {
     1888            switch ($LAMEtag['vbr_method']) {
     1889                case 'cbr':
     1890                    $LAMEpresetUsedLookup[$i] = '--alt-preset '.$LAMEtag['vbr_method'].' '.$i;
     1891                    break;
     1892                case 'abr':
     1893                default: // other VBR modes shouldn't be here(?)
     1894                    $LAMEpresetUsedLookup[$i] = '--alt-preset '.$i;
     1895                    break;
     1896            }
     1897        }
     1898
     1899        // named old-style presets (studio, phone, voice, etc) are handled in GuessEncoderOptions()
     1900
     1901        // named alt-presets
     1902        $LAMEpresetUsedLookup[1000] = '--r3mix';
     1903        $LAMEpresetUsedLookup[1001] = '--alt-preset standard';
     1904        $LAMEpresetUsedLookup[1002] = '--alt-preset extreme';
     1905        $LAMEpresetUsedLookup[1003] = '--alt-preset insane';
     1906        $LAMEpresetUsedLookup[1004] = '--alt-preset fast standard';
     1907        $LAMEpresetUsedLookup[1005] = '--alt-preset fast extreme';
     1908        $LAMEpresetUsedLookup[1006] = '--alt-preset medium';
     1909        $LAMEpresetUsedLookup[1007] = '--alt-preset fast medium';
     1910
     1911        // LAME 3.94 additions/changes
     1912        $LAMEpresetUsedLookup[1010] = '--preset portable';                                                           // 3.94a15 Oct 21 2003
     1913        $LAMEpresetUsedLookup[1015] = '--preset radio';                                                              // 3.94a15 Oct 21 2003
     1914
     1915        $LAMEpresetUsedLookup[320]  = '--preset insane';                                                             // 3.94a15 Nov 12 2003
     1916        $LAMEpresetUsedLookup[410]  = '-V9';
     1917        $LAMEpresetUsedLookup[420]  = '-V8';
     1918        $LAMEpresetUsedLookup[440]  = '-V6';
     1919        $LAMEpresetUsedLookup[430]  = '--preset radio';                                                              // 3.94a15 Nov 12 2003
     1920        $LAMEpresetUsedLookup[450]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'portable';  // 3.94a15 Nov 12 2003
     1921        $LAMEpresetUsedLookup[460]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'medium';    // 3.94a15 Nov 12 2003
     1922        $LAMEpresetUsedLookup[470]  = '--r3mix';                                                                     // 3.94b1  Dec 18 2003
     1923        $LAMEpresetUsedLookup[480]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'standard';  // 3.94a15 Nov 12 2003
     1924        $LAMEpresetUsedLookup[490]  = '-V1';
     1925        $LAMEpresetUsedLookup[500]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'extreme';   // 3.94a15 Nov 12 2003
     1926
     1927        return (isset($LAMEpresetUsedLookup[$LAMEtag['preset_used_id']]) ? $LAMEpresetUsedLookup[$LAMEtag['preset_used_id']] : 'new/unknown preset: '.$LAMEtag['preset_used_id'].' - report to info@getid3.org');
     1928    }
    19411929
    19421930}
  • _plugins_/_test_/getID3/getid3/module.audio.shorten.php

    r16273 r22745  
    124124                                }
    125125                        }
    126                         $commandline = GETID3_HELPERAPPSDIR.'shorten.exe -x "'.$ThisFileInfo['filenamepath'].'" - | '.GETID3_HELPERAPPSDIR.'head.exe -c 44';
     126                        $commandline = GETID3_HELPERAPPSDIR.'shorten.exe -x "'.$ThisFileInfo['filenamepath'].'" - | '.GETID3_HELPERAPPSDIR.'head.exe -c 64';
     127                        $commandline = str_replace('/', '\\', $commandline);
    127128
    128129                } else {
     
    136137                return false;
    137138            }
    138             $commandline = (file_exists('/usr/local/bin/shorten') ? '/usr/local/bin/' : '' ) . 'shorten -x "'.$ThisFileInfo['filenamepath'].'" - | head -c 44';
     139            $commandline = (file_exists('/usr/local/bin/shorten') ? '/usr/local/bin/' : '' ) . 'shorten -x '.escapeshellarg($ThisFileInfo['filenamepath']).' - | head -c 64';
    139140
    140141                }
     
    146147                        getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true);
    147148
    148                         $DecodedWAVFORMATEX = getid3_riff::RIFFparseWAVEFORMATex(substr($output, 20, 16));
     149                        $fmt_size = getid3_lib::LittleEndian2Int(substr($output, 16, 4));
     150                        $DecodedWAVFORMATEX = getid3_riff::RIFFparseWAVEFORMATex(substr($output, 20, $fmt_size));
    149151                        $ThisFileInfo['audio']['channels']        = $DecodedWAVFORMATEX['channels'];
    150152                        $ThisFileInfo['audio']['bits_per_sample'] = $DecodedWAVFORMATEX['bits_per_sample'];
    151153                        $ThisFileInfo['audio']['sample_rate']     = $DecodedWAVFORMATEX['sample_rate'];
    152154
    153                         if (substr($output, 36, 4) == 'data') {
     155                        if (substr($output, 20 + $fmt_size, 4) == 'data') {
    154156
    155                                 $ThisFileInfo['playtime_seconds'] = getid3_lib::LittleEndian2Int(substr($output, 40, 4)) / $DecodedWAVFORMATEX['raw']['nAvgBytesPerSec'];
     157                                $ThisFileInfo['playtime_seconds'] = getid3_lib::LittleEndian2Int(substr($output, 20 + 4 + $fmt_size, 4)) / $DecodedWAVFORMATEX['raw']['nAvgBytesPerSec'];
    156158
    157159                        } else {
  • _plugins_/_test_/getID3/getid3/module.graphic.png.php

    r16273 r22745  
    6868                                case 'IHDR': // Image Header
    6969                                        $thisfile_png_chunk_type_text['header'] = $chunk;
    70                                         $thisfile_png_chunk_type_text['width']                     = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'],  0, 4));
    71                                         $thisfile_png_chunk_type_text['height']                    = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'],  4, 4));
    72                                         $thisfile_png_chunk_type_text['raw']['bit_depth']          = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'],  8, 1));
    73                                         $thisfile_png_chunk_type_text['raw']['color_type']         = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'],  9, 1));
    74                                         $thisfile_png_chunk_type_text['raw']['compression_method'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 10, 1));
    75                                         $thisfile_png_chunk_type_text['raw']['filter_method']      = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 11, 1));
    76                                         $thisfile_png_chunk_type_text['raw']['interlace_method']   = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 12, 1));
     70                                        $thisfile_png_chunk_type_text['width']                     = getid3_lib::BigEndian2Int(substr($chunk['data'],  0, 4));
     71                                        $thisfile_png_chunk_type_text['height']                    = getid3_lib::BigEndian2Int(substr($chunk['data'],  4, 4));
     72                                        $thisfile_png_chunk_type_text['raw']['bit_depth']          = getid3_lib::BigEndian2Int(substr($chunk['data'],  8, 1));
     73                                        $thisfile_png_chunk_type_text['raw']['color_type']         = getid3_lib::BigEndian2Int(substr($chunk['data'],  9, 1));
     74                                        $thisfile_png_chunk_type_text['raw']['compression_method'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 10, 1));
     75                                        $thisfile_png_chunk_type_text['raw']['filter_method']      = getid3_lib::BigEndian2Int(substr($chunk['data'], 11, 1));
     76                                        $thisfile_png_chunk_type_text['raw']['interlace_method']   = getid3_lib::BigEndian2Int(substr($chunk['data'], 12, 1));
    7777
    7878                                        $thisfile_png_chunk_type_text['compression_method_text']   = $this->PNGcompressionMethodLookup($thisfile_png_chunk_type_text['raw']['compression_method']);
     
    9292                                        $paletteoffset = 0;
    9393                                        for ($i = 0; $i <= 255; $i++) {
    94                                                 //$thisfile_png_chunk_type_text['red'][$i]   = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $paletteoffset++, 1));
    95                                                 //$thisfile_png_chunk_type_text['green'][$i] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $paletteoffset++, 1));
    96                                                 //$thisfile_png_chunk_type_text['blue'][$i]  = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $paletteoffset++, 1));
    97                                                 $red   = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $paletteoffset++, 1));
    98                                                 $green = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $paletteoffset++, 1));
    99                                                 $blue  = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $paletteoffset++, 1));
     94                                                //$thisfile_png_chunk_type_text['red'][$i]   = getid3_lib::BigEndian2Int(substr($chunk['data'], $paletteoffset++, 1));
     95                                                //$thisfile_png_chunk_type_text['green'][$i] = getid3_lib::BigEndian2Int(substr($chunk['data'], $paletteoffset++, 1));
     96                                                //$thisfile_png_chunk_type_text['blue'][$i]  = getid3_lib::BigEndian2Int(substr($chunk['data'], $paletteoffset++, 1));
     97                                                $red   = getid3_lib::BigEndian2Int(substr($chunk['data'], $paletteoffset++, 1));
     98                                                $green = getid3_lib::BigEndian2Int(substr($chunk['data'], $paletteoffset++, 1));
     99                                                $blue  = getid3_lib::BigEndian2Int(substr($chunk['data'], $paletteoffset++, 1));
    100100                                                $thisfile_png_chunk_type_text[$i] = (($red << 16) | ($green << 8) | ($blue));
    101101                                        }
     
    107107                                        switch ($thisfile_png['IHDR']['raw']['color_type']) {
    108108                                                case 0:
    109                                                         $thisfile_png_chunk_type_text['transparent_color_gray']  = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 2));
     109                                                        $thisfile_png_chunk_type_text['transparent_color_gray']  = getid3_lib::BigEndian2Int(substr($chunk['data'], 0, 2));
    110110                                                        break;
    111111
    112112                                                case 2:
    113                                                         $thisfile_png_chunk_type_text['transparent_color_red']   = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 2));
    114                                                         $thisfile_png_chunk_type_text['transparent_color_green'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 2, 2));
    115                                                         $thisfile_png_chunk_type_text['transparent_color_blue']  = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 4, 2));
     113                                                        $thisfile_png_chunk_type_text['transparent_color_red']   = getid3_lib::BigEndian2Int(substr($chunk['data'], 0, 2));
     114                                                        $thisfile_png_chunk_type_text['transparent_color_green'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 2, 2));
     115                                                        $thisfile_png_chunk_type_text['transparent_color_blue']  = getid3_lib::BigEndian2Int(substr($chunk['data'], 4, 2));
    116116                                                        break;
    117117
    118118                                                case 3:
    119                                                         for ($i = 0; $i < strlen($thisfile_png_chunk_type_text['header']['data']); $i++) {
    120                                                                 $thisfile_png_chunk_type_text['palette_opacity'][$i] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $i, 1));
     119                                                        for ($i = 0; $i < strlen($chunk['data']); $i++) {
     120                                                                $thisfile_png_chunk_type_text['palette_opacity'][$i] = getid3_lib::BigEndian2Int(substr($chunk['data'], $i, 1));
    121121                                                        }
    122122                                                        break;
     
    135135                                case 'gAMA': // Image Gamma
    136136                                        $thisfile_png_chunk_type_text['header'] = $chunk;
    137                                         $thisfile_png_chunk_type_text['gamma']  = getid3_lib::BigEndian2Int($thisfile_png_chunk_type_text['header']['data']) / 100000;
     137                                        $thisfile_png_chunk_type_text['gamma']  = getid3_lib::BigEndian2Int($chunk['data']) / 100000;
    138138                                        break;
    139139
     
    141141                                case 'cHRM': // Primary Chromaticities
    142142                                        $thisfile_png_chunk_type_text['header']  = $chunk;
    143                                         $thisfile_png_chunk_type_text['white_x'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'],  0, 4)) / 100000;
    144                                         $thisfile_png_chunk_type_text['white_y'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'],  4, 4)) / 100000;
    145                                         $thisfile_png_chunk_type_text['red_y']   = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'],  8, 4)) / 100000;
    146                                         $thisfile_png_chunk_type_text['red_y']   = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 12, 4)) / 100000;
    147                                         $thisfile_png_chunk_type_text['green_y'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 16, 4)) / 100000;
    148                                         $thisfile_png_chunk_type_text['green_y'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 20, 4)) / 100000;
    149                                         $thisfile_png_chunk_type_text['blue_y']  = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 24, 4)) / 100000;
    150                                         $thisfile_png_chunk_type_text['blue_y']  = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 28, 4)) / 100000;
     143                                        $thisfile_png_chunk_type_text['white_x'] = getid3_lib::BigEndian2Int(substr($chunk['data'],  0, 4)) / 100000;
     144                                        $thisfile_png_chunk_type_text['white_y'] = getid3_lib::BigEndian2Int(substr($chunk['data'],  4, 4)) / 100000;
     145                                        $thisfile_png_chunk_type_text['red_y']   = getid3_lib::BigEndian2Int(substr($chunk['data'],  8, 4)) / 100000;
     146                                        $thisfile_png_chunk_type_text['red_y']   = getid3_lib::BigEndian2Int(substr($chunk['data'], 12, 4)) / 100000;
     147                                        $thisfile_png_chunk_type_text['green_y'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 16, 4)) / 100000;
     148                                        $thisfile_png_chunk_type_text['green_y'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 20, 4)) / 100000;
     149                                        $thisfile_png_chunk_type_text['blue_y']  = getid3_lib::BigEndian2Int(substr($chunk['data'], 24, 4)) / 100000;
     150                                        $thisfile_png_chunk_type_text['blue_y']  = getid3_lib::BigEndian2Int(substr($chunk['data'], 28, 4)) / 100000;
    151151                                        break;
    152152
     
    154154                                case 'sRGB': // Standard RGB Color Space
    155155                                        $thisfile_png_chunk_type_text['header']                 = $chunk;
    156                                         $thisfile_png_chunk_type_text['reindering_intent']      = getid3_lib::BigEndian2Int($thisfile_png_chunk_type_text['header']['data']);
     156                                        $thisfile_png_chunk_type_text['reindering_intent']      = getid3_lib::BigEndian2Int($chunk['data']);
    157157                                        $thisfile_png_chunk_type_text['reindering_intent_text'] = $this->PNGsRGBintentLookup($thisfile_png_chunk_type_text['reindering_intent']);
    158158                                        break;
     
    161161                                case 'iCCP': // Embedded ICC Profile
    162162                                        $thisfile_png_chunk_type_text['header']                  = $chunk;
    163                                         list($profilename, $compressiondata)                                 = explode("\x00", $thisfile_png_chunk_type_text['header']['data'], 2);
     163                                        list($profilename, $compressiondata)                                 = explode("\x00", $chunk['data'], 2);
    164164                                        $thisfile_png_chunk_type_text['profile_name']            = $profilename;
    165165                                        $thisfile_png_chunk_type_text['compression_method']      = getid3_lib::BigEndian2Int(substr($compressiondata, 0, 1));
     
    172172                                case 'tEXt': // Textual Data
    173173                                        $thisfile_png_chunk_type_text['header']  = $chunk;
    174                                         list($keyword, $text)                                = explode("\x00", $thisfile_png_chunk_type_text['header']['data'], 2);
     174                                        list($keyword, $text)                                = explode("\x00", $chunk['data'], 2);
    175175                                        $thisfile_png_chunk_type_text['keyword'] = $keyword;
    176176                                        $thisfile_png_chunk_type_text['text']    = $text;
     
    182182                                case 'zTXt': // Compressed Textual Data
    183183                                        $thisfile_png_chunk_type_text['header']                  = $chunk;
    184                                         list($keyword, $otherdata)                                           = explode("\x00", $thisfile_png_chunk_type_text['header']['data'], 2);
     184                                        list($keyword, $otherdata)                                           = explode("\x00", $chunk['data'], 2);
    185185                                        $thisfile_png_chunk_type_text['keyword']                 = $keyword;
    186186                                        $thisfile_png_chunk_type_text['compression_method']      = getid3_lib::BigEndian2Int(substr($otherdata, 0, 1));
     
    205205                                case 'iTXt': // International Textual Data
    206206                                        $thisfile_png_chunk_type_text['header']                  = $chunk;
    207                                         list($keyword, $otherdata)                                           = explode("\x00", $thisfile_png_chunk_type_text['header']['data'], 2);
     207                                        list($keyword, $otherdata)                                           = explode("\x00", $chunk['data'], 2);
    208208                                        $thisfile_png_chunk_type_text['keyword']                 = $keyword;
    209209                                        $thisfile_png_chunk_type_text['compression']             = (bool) getid3_lib::BigEndian2Int(substr($otherdata, 0, 1));
     
    243243                                                case 0:
    244244                                                case 4:
    245                                                         $thisfile_png_chunk_type_text['background_gray']  = getid3_lib::BigEndian2Int($thisfile_png_chunk_type_text['header']['data']);
     245                                                        $thisfile_png_chunk_type_text['background_gray']  = getid3_lib::BigEndian2Int($chunk['data']);
    246246                                                        break;
    247247
    248248                                                case 2:
    249249                                                case 6:
    250                                                         $thisfile_png_chunk_type_text['background_red']   = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0 * $thisfile_png['IHDR']['raw']['bit_depth'], $thisfile_png['IHDR']['raw']['bit_depth']));
    251                                                         $thisfile_png_chunk_type_text['background_green'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 1 * $thisfile_png['IHDR']['raw']['bit_depth'], $thisfile_png['IHDR']['raw']['bit_depth']));
    252                                                         $thisfile_png_chunk_type_text['background_blue']  = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 2 * $thisfile_png['IHDR']['raw']['bit_depth'], $thisfile_png['IHDR']['raw']['bit_depth']));
     250                                                        $thisfile_png_chunk_type_text['background_red']   = getid3_lib::BigEndian2Int(substr($chunk['data'], 0 * $thisfile_png['IHDR']['raw']['bit_depth'], $thisfile_png['IHDR']['raw']['bit_depth']));
     251                                                        $thisfile_png_chunk_type_text['background_green'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 1 * $thisfile_png['IHDR']['raw']['bit_depth'], $thisfile_png['IHDR']['raw']['bit_depth']));
     252                                                        $thisfile_png_chunk_type_text['background_blue']  = getid3_lib::BigEndian2Int(substr($chunk['data'], 2 * $thisfile_png['IHDR']['raw']['bit_depth'], $thisfile_png['IHDR']['raw']['bit_depth']));
    253253                                                        break;
    254254
    255255                                                case 3:
    256                                                         $thisfile_png_chunk_type_text['background_index'] = getid3_lib::BigEndian2Int($thisfile_png_chunk_type_text['header']['data']);
     256                                                        $thisfile_png_chunk_type_text['background_index'] = getid3_lib::BigEndian2Int($chunk['data']);
    257257                                                        break;
    258258
     
    265265                                case 'pHYs': // Physical Pixel Dimensions
    266266                                        $thisfile_png_chunk_type_text['header']                 = $chunk;
    267                                         $thisfile_png_chunk_type_text['pixels_per_unit_x']      = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 4));
    268                                         $thisfile_png_chunk_type_text['pixels_per_unit_y']      = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 4, 4));
    269                                         $thisfile_png_chunk_type_text['unit_specifier']         = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 8, 1));
     267                                        $thisfile_png_chunk_type_text['pixels_per_unit_x']      = getid3_lib::BigEndian2Int(substr($chunk['data'], 0, 4));
     268                                        $thisfile_png_chunk_type_text['pixels_per_unit_y']      = getid3_lib::BigEndian2Int(substr($chunk['data'], 4, 4));
     269                                        $thisfile_png_chunk_type_text['unit_specifier']         = getid3_lib::BigEndian2Int(substr($chunk['data'], 8, 1));
    270270                                        $thisfile_png_chunk_type_text['unit']                   = $this->PNGpHYsUnitLookup($thisfile_png_chunk_type_text['unit_specifier']);
    271271                                        break;
     
    276276                                        switch ($thisfile_png['IHDR']['raw']['color_type']) {
    277277                                                case 0:
    278                                                         $thisfile_png_chunk_type_text['significant_bits_gray']  = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 1));
     278                                                        $thisfile_png_chunk_type_text['significant_bits_gray']  = getid3_lib::BigEndian2Int(substr($chunk['data'], 0, 1));
    279279                                                        break;
    280280
    281281                                                case 2:
    282282                                                case 3:
    283                                                         $thisfile_png_chunk_type_text['significant_bits_red']   = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 1));
    284                                                         $thisfile_png_chunk_type_text['significant_bits_green'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 1, 1));
    285                                                         $thisfile_png_chunk_type_text['significant_bits_blue']  = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 2, 1));
     283                                                        $thisfile_png_chunk_type_text['significant_bits_red']   = getid3_lib::BigEndian2Int(substr($chunk['data'], 0, 1));
     284                                                        $thisfile_png_chunk_type_text['significant_bits_green'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 1, 1));
     285                                                        $thisfile_png_chunk_type_text['significant_bits_blue']  = getid3_lib::BigEndian2Int(substr($chunk['data'], 2, 1));
    286286                                                        break;
    287287
    288288                                                case 4:
    289                                                         $thisfile_png_chunk_type_text['significant_bits_gray']  = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 1));
    290                                                         $thisfile_png_chunk_type_text['significant_bits_alpha'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 1, 1));
     289                                                        $thisfile_png_chunk_type_text['significant_bits_gray']  = getid3_lib::BigEndian2Int(substr($chunk['data'], 0, 1));
     290                                                        $thisfile_png_chunk_type_text['significant_bits_alpha'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 1, 1));
    291291                                                        break;
    292292
    293293                                                case 6:
    294                                                         $thisfile_png_chunk_type_text['significant_bits_red']   = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 1));
    295                                                         $thisfile_png_chunk_type_text['significant_bits_green'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 1, 1));
    296                                                         $thisfile_png_chunk_type_text['significant_bits_blue']  = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 2, 1));
    297                                                         $thisfile_png_chunk_type_text['significant_bits_alpha'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 3, 1));
     294                                                        $thisfile_png_chunk_type_text['significant_bits_red']   = getid3_lib::BigEndian2Int(substr($chunk['data'], 0, 1));
     295                                                        $thisfile_png_chunk_type_text['significant_bits_green'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 1, 1));
     296                                                        $thisfile_png_chunk_type_text['significant_bits_blue']  = getid3_lib::BigEndian2Int(substr($chunk['data'], 2, 1));
     297                                                        $thisfile_png_chunk_type_text['significant_bits_alpha'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 3, 1));
    298298                                                        break;
    299299
     
    306306                                case 'sPLT': // Suggested Palette
    307307                                        $thisfile_png_chunk_type_text['header']                           = $chunk;
    308                                         list($palettename, $otherdata)                                                = explode("\x00", $thisfile_png_chunk_type_text['header']['data'], 2);
     308                                        list($palettename, $otherdata)                                                = explode("\x00", $chunk['data'], 2);
    309309                                        $thisfile_png_chunk_type_text['palette_name']                     = $palettename;
    310310                                        $sPLToffset = 0;
     
    332332                                        $thisfile_png_chunk_type_text['header'] = $chunk;
    333333                                        $hISTcounter = 0;
    334                                         while ($hISTcounter < strlen($thisfile_png_chunk_type_text['header']['data'])) {
    335                                                 $thisfile_png_chunk_type_text[$hISTcounter] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $hISTcounter / 2, 2));
     334                                        while ($hISTcounter < strlen($chunk['data'])) {
     335                                                $thisfile_png_chunk_type_text[$hISTcounter] = getid3_lib::BigEndian2Int(substr($chunk['data'], $hISTcounter / 2, 2));
    336336                                                $hISTcounter += 2;
    337337                                        }
     
    341341                                case 'tIME': // Image Last-Modification Time
    342342                                        $thisfile_png_chunk_type_text['header'] = $chunk;
    343                                         $thisfile_png_chunk_type_text['year']   = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 2));
    344                                         $thisfile_png_chunk_type_text['month']  = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 2, 1));
    345                                         $thisfile_png_chunk_type_text['day']    = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 3, 1));
    346                                         $thisfile_png_chunk_type_text['hour']   = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 4, 1));
    347                                         $thisfile_png_chunk_type_text['minute'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 5, 1));
    348                                         $thisfile_png_chunk_type_text['second'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 6, 1));
     343                                        $thisfile_png_chunk_type_text['year']   = getid3_lib::BigEndian2Int(substr($chunk['data'], 0, 2));
     344                                        $thisfile_png_chunk_type_text['month']  = getid3_lib::BigEndian2Int(substr($chunk['data'], 2, 1));
     345                                        $thisfile_png_chunk_type_text['day']    = getid3_lib::BigEndian2Int(substr($chunk['data'], 3, 1));
     346                                        $thisfile_png_chunk_type_text['hour']   = getid3_lib::BigEndian2Int(substr($chunk['data'], 4, 1));
     347                                        $thisfile_png_chunk_type_text['minute'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 5, 1));
     348                                        $thisfile_png_chunk_type_text['second'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 6, 1));
    349349                                        $thisfile_png_chunk_type_text['unix']   = gmmktime($thisfile_png_chunk_type_text['hour'], $thisfile_png_chunk_type_text['minute'], $thisfile_png_chunk_type_text['second'], $thisfile_png_chunk_type_text['month'], $thisfile_png_chunk_type_text['day'], $thisfile_png_chunk_type_text['year']);
    350350                                        break;
     
    353353                                case 'oFFs': // Image Offset
    354354                                        $thisfile_png_chunk_type_text['header']         = $chunk;
    355                                         $thisfile_png_chunk_type_text['position_x']     = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 4), false, true);
    356                                         $thisfile_png_chunk_type_text['position_y']     = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 4, 4), false, true);
    357                                         $thisfile_png_chunk_type_text['unit_specifier'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 8, 1));
     355                                        $thisfile_png_chunk_type_text['position_x']     = getid3_lib::BigEndian2Int(substr($chunk['data'], 0, 4), false, true);
     356                                        $thisfile_png_chunk_type_text['position_y']     = getid3_lib::BigEndian2Int(substr($chunk['data'], 4, 4), false, true);
     357                                        $thisfile_png_chunk_type_text['unit_specifier'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 8, 1));
    358358                                        $thisfile_png_chunk_type_text['unit']           = $this->PNGoFFsUnitLookup($thisfile_png_chunk_type_text['unit_specifier']);
    359359                                        break;
     
    362362                                case 'pCAL': // Calibration Of Pixel Values
    363363                                        $thisfile_png_chunk_type_text['header']             = $chunk;
    364                                         list($calibrationname, $otherdata)                              = explode("\x00", $thisfile_png_chunk_type_text['header']['data'], 2);
     364                                        list($calibrationname, $otherdata)                              = explode("\x00", $chunk['data'], 2);
    365365                                        $thisfile_png_chunk_type_text['calibration_name']   = $calibrationname;
    366366                                        $pCALoffset = 0;
    367                                         $thisfile_png_chunk_type_text['original_zero']      = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $pCALoffset, 4), false, true);
     367                                        $thisfile_png_chunk_type_text['original_zero']      = getid3_lib::BigEndian2Int(substr($chunk['data'], $pCALoffset, 4), false, true);
    368368                                        $pCALoffset += 4;
    369                                         $thisfile_png_chunk_type_text['original_max']       = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $pCALoffset, 4), false, true);
     369                                        $thisfile_png_chunk_type_text['original_max']       = getid3_lib::BigEndian2Int(substr($chunk['data'], $pCALoffset, 4), false, true);
    370370                                        $pCALoffset += 4;
    371                                         $thisfile_png_chunk_type_text['equation_type']      = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $pCALoffset, 1));
     371                                        $thisfile_png_chunk_type_text['equation_type']      = getid3_lib::BigEndian2Int(substr($chunk['data'], $pCALoffset, 1));
    372372                                        $pCALoffset += 1;
    373373                                        $thisfile_png_chunk_type_text['equation_type_text'] = $this->PNGpCALequationTypeLookup($thisfile_png_chunk_type_text['equation_type']);
    374                                         $thisfile_png_chunk_type_text['parameter_count']    = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], $pCALoffset, 1));
     374                                        $thisfile_png_chunk_type_text['parameter_count']    = getid3_lib::BigEndian2Int(substr($chunk['data'], $pCALoffset, 1));
    375375                                        $pCALoffset += 1;
    376                                         $thisfile_png_chunk_type_text['parameters']         = explode("\x00", substr($thisfile_png_chunk_type_text['header']['data'], $pCALoffset));
     376                                        $thisfile_png_chunk_type_text['parameters']         = explode("\x00", substr($chunk['data'], $pCALoffset));
    377377                                        break;
    378378
     
    380380                                case 'sCAL': // Physical Scale Of Image Subject
    381381                                        $thisfile_png_chunk_type_text['header']         = $chunk;
    382                                         $thisfile_png_chunk_type_text['unit_specifier'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 1));
     382                                        $thisfile_png_chunk_type_text['unit_specifier'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 0, 1));
    383383                                        $thisfile_png_chunk_type_text['unit']           = $this->PNGsCALUnitLookup($thisfile_png_chunk_type_text['unit_specifier']);
    384                                         list($pixelwidth, $pixelheight)                             = explode("\x00", substr($thisfile_png_chunk_type_text['header']['data'], 1));
     384                                        list($pixelwidth, $pixelheight)                             = explode("\x00", substr($chunk['data'], 1));
    385385                                        $thisfile_png_chunk_type_text['pixel_width']    = $pixelwidth;
    386386                                        $thisfile_png_chunk_type_text['pixel_height']   = $pixelheight;
     
    394394                                        }
    395395                                        $thisfile_png_chunk_type_text[$gIFgCounter]['header']          = $chunk;
    396                                         $thisfile_png_chunk_type_text[$gIFgCounter]['disposal_method'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 0, 1));
    397                                         $thisfile_png_chunk_type_text[$gIFgCounter]['user_input_flag'] = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 1, 1));
    398                                         $thisfile_png_chunk_type_text[$gIFgCounter]['delay_time']      = getid3_lib::BigEndian2Int(substr($thisfile_png_chunk_type_text['header']['data'], 2, 2));
     396                                        $thisfile_png_chunk_type_text[$gIFgCounter]['disposal_method'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 0, 1));
     397                                        $thisfile_png_chunk_type_text[$gIFgCounter]['user_input_flag'] = getid3_lib::BigEndian2Int(substr($chunk['data'], 1, 1));
     398                                        $thisfile_png_chunk_type_text[$gIFgCounter]['delay_time']      = getid3_lib::BigEndian2Int(substr($chunk['data'], 2, 2));
    399399                                        break;
    400400
     
    406406                                        }
    407407                                        $thisfile_png_chunk_type_text[$gIFxCounter]['header']                 = $chunk;
    408                                         $thisfile_png_chunk_type_text[$gIFxCounter]['application_identifier'] = substr($thisfile_png_chunk_type_text['header']['data'],  0, 8);
    409                                         $thisfile_png_chunk_type_text[$gIFxCounter]['authentication_code']    = substr($thisfile_png_chunk_type_text['header']['data'],  8, 3);
    410                                         $thisfile_png_chunk_type_text[$gIFxCounter]['application_data']       = substr($thisfile_png_chunk_type_text['header']['data'], 11);
     408                                        $thisfile_png_chunk_type_text[$gIFxCounter]['application_identifier'] = substr($chunk['data'],  0, 8);
     409                                        $thisfile_png_chunk_type_text[$gIFxCounter]['authentication_code']    = substr($chunk['data'],  8, 3);
     410                                        $thisfile_png_chunk_type_text[$gIFxCounter]['application_data']       = substr($chunk['data'], 11);
    411411                                        break;
    412412
  • _plugins_/_test_/getID3/getid3/module.misc.iso.php

    r16273 r22745  
    339339                        return false;
    340340                }
    341                 return mktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
     341                return gmmktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
    342342        }
    343343
     
    360360                $GMToffset  = $this->TwosCompliment2Decimal(ord($ISOtime{5}));
    361361
    362                 return mktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
     362                return gmmktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
    363363        }
    364364
  • _plugins_/_test_/getID3/getid3/module.tag.id3v2.php

    r16273 r22745  
    5151                fseek($fd, $StartingOffset, SEEK_SET);
    5252                $header = fread($fd, 10);
    53                 if (substr($header, 0, 3) == 'ID3') {
     53                if (substr($header, 0, 3) == 'ID3'  &&  strlen($header) == 10) {
    5454
    5555                        $thisfile_id3v2['majorversion'] = ord($header{3});
     
    102102                $thisfile_id3v2['tag_offset_end']   = $thisfile_id3v2['tag_offset_start'] + $thisfile_id3v2['headerlength'];
    103103
    104         //    Extended Header
    105                 if (isset($thisfile_id3v2_flags['exthead']) && $thisfile_id3v2_flags['exthead']) {
    106         //            Extended header size   4 * %0xxxxxxx
    107         //            Number of flag bytes       $01
    108         //            Extended Flags             $xx
    109         //            Where the 'Extended header size' is the size of the whole extended header, stored as a 32 bit synchsafe integer.
    110                         $extheader = fread ($fd, 4);
    111                         $thisfile_id3v2['extheaderlength'] = getid3_lib::BigEndian2Int($extheader, 1);
    112 
    113         //            The extended flags field, with its size described by 'number of flag  bytes', is defined as:
    114         //                %0bcd0000
    115         //            b - Tag is an update
    116         //                Flag data length       $00
    117         //            c - CRC data present
    118         //                Flag data length       $05
    119         //                Total frame CRC    5 * %0xxxxxxx
    120         //            d - Tag restrictions
    121         //                Flag data length       $01
    122                         $extheaderflagbytes = fread ($fd, 1);
    123                         $extheaderflags     = fread ($fd, $extheaderflagbytes);
    124                         $id3_exthead_flags = getid3_lib::BigEndian2Bin(substr($header, 5, 1));
    125                         $thisfile_id3v2['exthead_flags']['update']       = substr($id3_exthead_flags, 1, 1);
    126                         $thisfile_id3v2['exthead_flags']['CRC']          = substr($id3_exthead_flags, 2, 1);
    127                         if ($thisfile_id3v2['exthead_flags']['CRC']) {
    128                                 $extheaderrawCRC = fread ($fd, 5);
    129                                 $thisfile_id3v2['exthead_flags']['CRC'] = getid3_lib::BigEndian2Int($extheaderrawCRC, 1);
    130                         }
    131                         $thisfile_id3v2['exthead_flags']['restrictions'] = substr($id3_exthead_flags, 3, 1);
    132                         if ($thisfile_id3v2['exthead_flags']['restrictions']) {
    133                                 // Restrictions           %ppqrrstt
    134                                 $extheaderrawrestrictions = fread ($fd, 1);
    135                                 $thisfile_id3v2['exthead_flags']['restrictions_tagsize']  = (bindec('11000000') & ord($extheaderrawrestrictions)) >> 6; // p - Tag size restrictions
    136                                 $thisfile_id3v2['exthead_flags']['restrictions_textenc']  = (bindec('00100000') & ord($extheaderrawrestrictions)) >> 5; // q - Text encoding restrictions
    137                                 $thisfile_id3v2['exthead_flags']['restrictions_textsize'] = (bindec('00011000') & ord($extheaderrawrestrictions)) >> 3; // r - Text fields size restrictions
    138                                 $thisfile_id3v2['exthead_flags']['restrictions_imgenc']   = (bindec('00000100') & ord($extheaderrawrestrictions)) >> 2; // s - Image encoding restrictions
    139                                 $thisfile_id3v2['exthead_flags']['restrictions_imgsize']  = (bindec('00000011') & ord($extheaderrawrestrictions)) >> 0; // t - Image size restrictions
    140                         }
    141                 } // end extended header
    142 
    143104
    144105
     
    160121
    161122                $sizeofframes = $thisfile_id3v2['headerlength'] - 10; // not including 10-byte initial header
    162                 if (isset($thisfile_id3v2['extheaderlength'])) {
    163                         $sizeofframes -= $thisfile_id3v2['extheaderlength'];
     123                if (@$thisfile_id3v2['exthead']['length']) {
     124                        $sizeofframes -= ($thisfile_id3v2['exthead']['length'] + 4);
    164125                }
    165                 if (isset($thisfile_id3v2_flags['isfooter']) && $thisfile_id3v2_flags['isfooter']) {
     126                if (@$thisfile_id3v2_flags['isfooter']) {
    166127                        $sizeofframes -= 10; // footer takes last 10 bytes of ID3v2 header, after frame data, before audio
    167128                }
     
    171132
    172133                        //    if entire frame data is unsynched, de-unsynch it now (ID3v2.3.x)
    173                         if (isset($thisfile_id3v2_flags['unsynch']) && $thisfile_id3v2_flags['unsynch'] && ($id3v2_majorversion <= 3)) {
     134                        if (@$thisfile_id3v2_flags['unsynch'] && ($id3v2_majorversion <= 3)) {
    174135                                $framedata = $this->DeUnsynchronise($framedata);
    175136                        }
     
    180141                        //        the frame header [S:4.1.2] indicates unsynchronisation.
    181142
     143
     144                        //$framedataoffset = 10 + (@$thisfile_id3v2['exthead']['length'] ? $thisfile_id3v2['exthead']['length'] + 4 : 0); // how many bytes into the stream - start from after the 10-byte header (and extended header length+4, if present)
    182145                        $framedataoffset = 10; // how many bytes into the stream - start from after the 10-byte header
     146
     147
     148                        //    Extended Header
     149                        if (@$thisfile_id3v2_flags['exthead']) {
     150                                $extended_header_offset = 0;
     151
     152                                if ($id3v2_majorversion == 3) {
     153
     154                                        // v2.3 definition:
     155                                        //Extended header size  $xx xx xx xx   // 32-bit integer
     156                                        //Extended Flags        $xx xx
     157                                        //     %x0000000 %00000000 // v2.3
     158                                        //     x - CRC data present
     159                                        //Size of padding       $xx xx xx xx
     160
     161                                        $thisfile_id3v2['exthead']['length'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), 0);
     162                                        $extended_header_offset += 4;
     163
     164                                        $thisfile_id3v2['exthead']['flag_bytes'] = 2;
     165                                        $thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes']));
     166                                        $extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes'];
     167
     168                                        $thisfile_id3v2['exthead']['flags']['crc'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x8000);
     169
     170                                        $thisfile_id3v2['exthead']['padding_size'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4));
     171                                        $extended_header_offset += 4;
     172
     173                                        if ($thisfile_id3v2['exthead']['flags']['crc']) {
     174                                                $thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4));
     175                                                $extended_header_offset += 4;
     176                                        }
     177                                        $extended_header_offset += $thisfile_id3v2['exthead']['padding_size'];
     178
     179                                } elseif ($id3v2_majorversion == 4) {
     180
     181                                        // v2.4 definition:
     182                                        //Extended header size   4 * %0xxxxxxx // 28-bit synchsafe integer
     183                                        //Number of flag bytes       $01
     184                                        //Extended Flags             $xx
     185                                        //     %0bcd0000 // v2.4
     186                                        //     b - Tag is an update
     187                                        //         Flag data length       $00
     188                                        //     c - CRC data present
     189                                        //         Flag data length       $05
     190                                        //         Total frame CRC    5 * %0xxxxxxx
     191                                        //     d - Tag restrictions
     192                                        //         Flag data length       $01
     193
     194                                        $thisfile_id3v2['exthead']['length']     = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), 1);
     195                                        $extended_header_offset += 4;
     196
     197                                        $thisfile_id3v2['exthead']['flag_bytes'] = 1;
     198                                        $thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes']));
     199                                        $extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes'];
     200
     201                                        $thisfile_id3v2['exthead']['flags']['update']       = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x4000);
     202                                        $thisfile_id3v2['exthead']['flags']['crc']          = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x2000);
     203                                        $thisfile_id3v2['exthead']['flags']['restrictions'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x1000);
     204
     205                                        if ($thisfile_id3v2['exthead']['flags']['crc']) {
     206                                                $thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 5), 1);
     207                                                $extended_header_offset += 5;
     208                                        }
     209                                        if ($thisfile_id3v2['exthead']['flags']['restrictions']) {
     210                                                // %ppqrrstt
     211                                                $restrictions_raw = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1));
     212                                                $extended_header_offset += 1;
     213                                                $thisfile_id3v2['exthead']['flags']['restrictions']['tagsize']  = ($restrictions_raw && 0xC0) >> 6; // p - Tag size restrictions
     214                                                $thisfile_id3v2['exthead']['flags']['restrictions']['textenc']  = ($restrictions_raw && 0x20) >> 5; // q - Text encoding restrictions
     215                                                $thisfile_id3v2['exthead']['flags']['restrictions']['textsize'] = ($restrictions_raw && 0x18) >> 3; // r - Text fields size restrictions
     216                                                $thisfile_id3v2['exthead']['flags']['restrictions']['imgenc']   = ($restrictions_raw && 0x04) >> 2; // s - Image encoding restrictions
     217                                                $thisfile_id3v2['exthead']['flags']['restrictions']['imgsize']  = ($restrictions_raw && 0x03) >> 0; // t - Image size restrictions
     218                                        }
     219
     220                                }
     221                                $framedataoffset += $extended_header_offset;
     222                                $framedata = substr($framedata, $extended_header_offset);
     223                        } // end extended header
     224
     225
    183226                        while (isset($framedata) && (strlen($framedata) > 0)) { // cycle through until no more frame data is left to parse
    184227                                if (strlen($framedata) <= $this->ID3v2HeaderLength($id3v2_majorversion)) {
     
    231274                                                        // MP3ext known broken frames - "ok" for the purposes of this test
    232275                                                } elseif (($id3v2_majorversion == 4) && ($this->IsValidID3v2FrameName(substr($framedata, getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0), 4), 3))) {
    233                                                         $ThisFileInfo['warning'][] = 'ID3v2 tag written as ID3v2.4, but with non-synchsafe integers (ID3v2.3 style). Older versions of Helium2 (www.helium2.com) is a known culprit of this. Tag has been parsed as ID3v2.3';
     276                                                        $ThisFileInfo['warning'][] = 'ID3v2 tag written as ID3v2.4, but with non-synchsafe integers (ID3v2.3 style). Older versions of (Helium2; iTunes) are known culprits of this. Tag has been parsed as ID3v2.3';
    234277                                                        $id3v2_majorversion = 3;
    235278                                                        $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer
     
    245288
    246289                                        $thisfile_id3v2['padding']['start']  = $framedataoffset;
    247                                         $thisfile_id3v2['padding']['length'] = strlen($framedata);
     290                                        $thisfile_id3v2['padding']['length'] = strlen($frame_header) + strlen($framedata);
    248291                                        $thisfile_id3v2['padding']['valid']  = true;
    249                                         for ($i = 0; $i < $thisfile_id3v2['padding']['length']; $i++) {
     292
     293                                        $len = strlen($framedata);
     294                                        for ($i = 0; $i < $len; $i++) {
    250295                                                if ($framedata{$i} != "\x00") {
    251296                                                        $thisfile_id3v2['padding']['valid'] = false;
     
    289334
    290335                                                        // next frame is invalid too, abort processing
    291                                                         unset($framedata);
     336                                                        //unset($framedata);
     337                                                        $framedata = null;
    292338                                                        $ThisFileInfo['error'][] = 'Next ID3v2 frame is also invalid, aborting processing.';
    293339
     
    302348
    303349                                                // next frame is invalid too, abort processing
    304                                                 unset($framedata);
     350                                                //unset($framedata);
     351                                                $framedata = null;
    305352                                                $ThisFileInfo['warning'][] = 'Invalid ID3v2 frame size, aborting.';
    306353
     
    324371                                                }
    325372
    326                                         } elseif ($frame_size > strlen($framedata)){
     373                                        } elseif ($frame_size > strlen(@$framedata)){
    327374
    328375                                                $ThisFileInfo['error'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: $frame_size ('.$frame_size.') > strlen($framedata) ('.strlen($framedata).')).';
     
    351398
    352399                if (isset($thisfile_id3v2_flags['isfooter']) && $thisfile_id3v2_flags['isfooter']) {
    353                         $footer = fread ($fd, 10);
     400                        $footer = fread($fd, 10);
    354401                        if (substr($footer, 0, 3) == '3DI') {
    355402                                $thisfile_id3v2['footer'] = true;
     
    381428                                }
    382429                        }
     430                }
     431
     432                if (!isset($thisfile_id3v2['comments']['year']) && ereg('^([0-9]{4})', trim(@$thisfile_id3v2['comments']['recording_time'][0]), $matches)) {
     433                        $thisfile_id3v2['comments']['year'] = array($matches[1]);
    383434                }
    384435
     
    552603                                $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
    553604                        }
    554                         $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
     605                        $frame_terminatorpos = @strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
    555606                        if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
    556                                 $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
     607                                $frame_terminatorpos++; // @strpos() fooled because 2nd byte of Unicode chars are often 0x00
    557608                        }
    558609                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     
    590641
    591642                        if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
    592                                 $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $ThisFileInfo['id3v2']['encoding'], $parsedFrame['data']);
     643
     644                                // remove possible terminating \x00 (put by encoding id or software bug)
     645                $string = getid3_lib::iconv_fallback($parsedFrame['encoding'], $ThisFileInfo['id3v2']['encoding'], $parsedFrame['data']);
     646                if ($string[strlen($string) - 1] == "\x00") {
     647                    $string = substr($string, 0, strlen($string) - 1);
     648                }
     649                                $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = $string;
     650                                unset($string);
    593651                        }
    594652
     
    607665                                $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
    608666                        }
    609                         $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
     667                        $frame_terminatorpos = @strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
    610668                        if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
    611                                 $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
     669                                $frame_terminatorpos++; // @strpos() fooled because 2nd byte of Unicode chars are often 0x00
    612670                        }
    613671                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     
    789847                        $frame_language = substr($parsedFrame['data'], $frame_offset, 3);
    790848                        $frame_offset += 3;
    791                         $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
     849                        $frame_terminatorpos = @strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
    792850                        if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
    793                                 $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
     851                                $frame_terminatorpos++; // @strpos() fooled because 2nd byte of Unicode chars are often 0x00
    794852                        }
    795853                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     
    893951                                $frame_language = substr($parsedFrame['data'], $frame_offset, 3);
    894952                                $frame_offset += 3;
    895                                 $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
     953                                $frame_terminatorpos = @strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
    896954                                if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
    897                                         $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
     955                                        $frame_terminatorpos++; // @strpos() fooled because 2nd byte of Unicode chars are often 0x00
    898956                                }
    899957                                $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     
    10541112                        $frame_offset = 0;
    10551113                        $frame_interpolationmethod = ord(substr($parsedFrame['data'], $frame_offset++, 1));
    1056                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1114                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    10571115                        $frame_idstring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    10581116                        if (ord($frame_idstring) === 0) {
     
    11511209                        }
    11521210
    1153                         if ($id3v2_majorversion == 2) {
     1211                        if ($id3v2_majorversion == 2 && strlen($parsedFrame['data']) > $frame_offset) {
    11541212                                $frame_imagetype = substr($parsedFrame['data'], $frame_offset, 3);
    11551213                                if (strtolower($frame_imagetype) == 'ima') {
    11561214                                        // complete hack for mp3Rage (www.chaoticsoftware.com) that puts ID3v2.3-formatted
    11571215                                        // MIME type instead of 3-char ID3v2.2-format image type  (thanks xbhoffØpacbell*net)
    1158                                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1216                                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    11591217                                        $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    11601218                                        if (ord($frame_mimetype) === 0) {
     
    11701228                                }
    11711229                        }
    1172                         if ($id3v2_majorversion > 2) {
    1173                                 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1230                        if ($id3v2_majorversion > 2 && strlen($parsedFrame['data']) > $frame_offset) {
     1231                                $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    11741232                                $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    11751233                                if (ord($frame_mimetype) === 0) {
     
    11811239                        $frame_picturetype = ord(substr($parsedFrame['data'], $frame_offset++, 1));
    11821240
    1183                         $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
     1241                        $frame_terminatorpos = @strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
    11841242                        if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
    1185                                 $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
     1243                                $frame_terminatorpos++; // @strpos() fooled because 2nd byte of Unicode chars are often 0x00
    11861244                        }
    11871245                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     
    12311289                                $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
    12321290                        }
    1233                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1291                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    12341292                        $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    12351293                        if (ord($frame_mimetype) === 0) {
     
    12381296                        $frame_offset = $frame_terminatorpos + strlen("\x00");
    12391297
    1240                         $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
     1298                        $frame_terminatorpos = @strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
    12411299                        if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
    1242                                 $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
     1300                                $frame_terminatorpos++; // @strpos() fooled because 2nd byte of Unicode chars are often 0x00
    12431301                        }
    12441302                        $frame_filename = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     
    12481306                        $frame_offset = $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding));
    12491307
    1250                         $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
     1308                        $frame_terminatorpos = @strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
    12511309                        if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
    1252                                 $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
     1310                                $frame_terminatorpos++; // @strpos() fooled because 2nd byte of Unicode chars are often 0x00
    12531311                        }
    12541312                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     
    12891347
    12901348                        $frame_offset = 0;
    1291                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1349                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    12921350                        $frame_emailaddress = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    12931351                        if (ord($frame_emailaddress) === 0) {
     
    13291387
    13301388                        $frame_offset = 0;
    1331                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1389                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    13321390                        $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    13331391                        $frame_offset = $frame_terminatorpos + strlen("\x00");
    13341392
    1335                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1393                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    13361394                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    13371395                        if (ord($frame_description) === 0) {
     
    13571415
    13581416                        $frame_offset = 0;
    1359                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1417                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    13601418                        $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    13611419                        if (ord($frame_ownerid) === 0) {
     
    13911449                        }
    13921450
    1393                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1451                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    13941452                        $frame_url = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    13951453                        if (ord($frame_url) === 0) {
     
    14011459                        $parsedFrame['additionaldata'] = (string) substr($parsedFrame['data'], $frame_offset);
    14021460                        if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) {
    1403                                 $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $ThisFileInfo['id3v2']['encoding'], $parsedFrame['url']);
     1461                                $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = utf8_encode($parsedFrame['url']);
    14041462                        }
    14051463                        unset($parsedFrame['data']);
     
    14611519                        $parsedFrame['encoding']   = $this->TextEncodingNameLookup($frame_textencoding);
    14621520
    1463                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1521                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    14641522                        $frame_pricepaid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    14651523                        $frame_offset = $frame_terminatorpos + strlen("\x00");
     
    14991557                        }
    15001558
    1501                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1559                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    15021560                        $frame_pricestring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    15031561                        $frame_offset = $frame_terminatorpos + strlen("\x00");
     
    15121570                        $frame_offset += 8;
    15131571
    1514                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1572                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    15151573                        $frame_contacturl = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    15161574                        $frame_offset = $frame_terminatorpos + strlen("\x00");
     
    15181576                        $frame_receivedasid = ord(substr($parsedFrame['data'], $frame_offset++, 1));
    15191577
    1520                         $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
     1578                        $frame_terminatorpos = @strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
    15211579                        if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
    1522                                 $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
     1580                                $frame_terminatorpos++; // @strpos() fooled because 2nd byte of Unicode chars are often 0x00
    15231581                        }
    15241582                        $frame_sellername = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     
    15281586                        $frame_offset = $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding));
    15291587
    1530                         $frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
     1588                        $frame_terminatorpos = @strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);
    15311589                        if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
    1532                                 $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
     1590                                $frame_terminatorpos++; // @strpos() fooled because 2nd byte of Unicode chars are often 0x00
    15331591                        }
    15341592                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     
    15381596                        $frame_offset = $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding));
    15391597
    1540                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1598                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    15411599                        $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    15421600                        $frame_offset = $frame_terminatorpos + strlen("\x00");
     
    15681626
    15691627                        $frame_offset = 0;
    1570                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1628                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    15711629                        $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    15721630                        if (ord($frame_ownerid) === 0) {
     
    15911649
    15921650                        $frame_offset = 0;
    1593                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1651                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    15941652                        $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    15951653                        if (ord($frame_ownerid) === 0) {
     
    16111669
    16121670                        $frame_offset = 0;
    1613                         $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
     1671                        $frame_terminatorpos = @strpos($parsedFrame['data'], "\x00", $frame_offset);
    16141672                        $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    16151673                        if (ord($frame_ownerid) === 0) {
     
    28722930                /** This is not a comment!
    28732931
    2874                         COM     comment
    2875                         COMM    comment
     2932                        AENC    audio_encryption
     2933                        APIC    attached_picture
     2934                        ASPI    audio_seek_point_index
     2935                        BUF     recommended_buffer_size
     2936                        CNT     play_counter
     2937                        COM     comments
     2938                        COMM    comments
     2939                        COMR    commercial_frame
     2940                        CRA     audio_encryption
     2941                        CRM     encrypted_meta_frame
     2942                        ENCR    encryption_method_registration
     2943                        EQU     equalisation
     2944                        EQU2    equalisation
     2945                        EQUA    equalisation
     2946                        ETC     event_timing_codes
     2947                        ETCO    event_timing_codes
     2948                        GEO     general_encapsulated_object
     2949                        GEOB    general_encapsulated_object
     2950                        GRID    group_identification_registration
     2951                        IPL     involved_people_list
     2952                        IPLS    involved_people_list
     2953                        LINK    linked_information
     2954                        LNK     linked_information
     2955                        MCDI    music_cd_identifier
     2956                        MCI     music_cd_identifier
     2957                        MLL     mpeg_location_lookup_table
     2958                        MLLT    mpeg_location_lookup_table
     2959                        OWNE    ownership_frame
     2960                        PCNT    play_counter
     2961                        PIC     attached_picture
     2962                        POP     popularimeter
     2963                        POPM    popularimeter
     2964                        POSS    position_synchronisation_frame
     2965                        PRIV    private_frame
     2966                        RBUF    recommended_buffer_size
     2967                        REV     reverb
     2968                        RVA     relative_volume_adjustment
     2969                        RVA2    relative_volume_adjustment
     2970                        RVAD    relative_volume_adjustment
     2971                        RVRB    reverb
     2972                        SEEK    seek_frame
     2973                        SIGN    signature_frame
     2974                        SLT     synchronised_lyric
     2975                        STC     synced_tempo_codes
     2976                        SYLT    synchronised_lyric
     2977                        SYTC    synchronised_tempo_codes
    28762978                        TAL     album
    28772979                        TALB    album
     
    28822984                        TCOM    composer
    28832985                        TCON    genre
    2884                         TCOP    copyright
    2885                         TCR     copyright
     2986                        TCOP    copyright_message
     2987                        TCR     copyright_message
     2988                        TDA     date
     2989                        TDAT    date
     2990                        TDEN    encoding_time
     2991                        TDLY    playlist_delay
     2992                        TDOR    original_release_time
     2993                        TDRC    recording_time
     2994                        TDRL    release_time
     2995                        TDTG    tagging_time
     2996                        TDY     playlist_delay
    28862997                        TEN     encoded_by
    28872998                        TENC    encoded_by
    28882999                        TEXT    lyricist
    2889                         TIT1    description
     3000                        TFLT    file_type
     3001                        TFT     file_type
     3002                        TIM     time
     3003                        TIME    time
     3004                        TIPL    involved_people_list
     3005                        TIT1    content_group_description
    28903006                        TIT2    title
    28913007                        TIT3    subtitle
     3008                        TKE     initial_key
     3009                        TKEY    initial_key
    28923010                        TLA     language
    28933011                        TLAN    language
    28943012                        TLE     length
    28953013                        TLEN    length
     3014                        TMCL    musician_credits_list
     3015                        TMED    media_type
    28963016                        TMOO    mood
     3017                        TMT     media_type
    28973018                        TOA     original_artist
    28983019                        TOAL    original_album
     
    29023023                        TOLY    original_lyricist
    29033024                        TOPE    original_artist
     3025                        TOR     original_year
     3026                        TORY    original_year
    29043027                        TOT     original_album
     3028                        TOWN    file_owner
    29053029                        TP1     artist
    29063030                        TP2     band
    29073031                        TP3     conductor
    29083032                        TP4     remixer
     3033                        TPA     part_of_a_set
    29093034                        TPB     publisher
    29103035                        TPE1    artist
     
    29123037                        TPE3    conductor
    29133038                        TPE4    remixer
     3039                        TPOS    part_of_a_set
     3040                        TPRO    produced_notice
    29143041                        TPUB    publisher
    29153042                        TRC     isrc
    2916                         TRCK    track
    2917                         TRK     track
     3043                        TRCK    track_number
     3044                        TRD     recording_dates
     3045                        TRDA    recording_dates
     3046                        TRK     track_number
     3047                        TRSN    internet_radio_station_name
     3048                        TRSO    internet_radio_station_owner
    29183049                        TSI     size
    29193050                        TSIZ    size
     3051                        TSOA    album_sort_order
     3052                        TSOP    performer_sort_order
     3053                        TSOT    title_sort_order
    29203054                        TSRC    isrc
    29213055                        TSS     encoder_settings
    29223056                        TSSE    encoder_settings
    2923                         TSST    subtitle
     3057                        TSST    set_subtitle
    29243058                        TT1     description
    29253059                        TT2     title
     
    29343068                        ULT     unsychronised_lyric
    29353069                        USER    terms_of_use
    2936                         USLT    unsynchronised lyric
     3070                        USLT    unsynchronised_lyric
    29373071                        WAF     url_file
    29383072                        WAR     url_artist
    29393073                        WAS     url_source
     3074                        WCM     commercial_information
     3075                        WCOM    commercial_information
    29403076                        WCOP    copyright
    29413077                        WCP     copyright
     
    29443080                        WOAS    url_source
    29453081                        WORS    url_station
     3082                        WPAY    url_payment
    29463083                        WPB     url_publisher
    29473084                        WPUB    url_publisher
     
    29493086                        WXXX    url_user
    29503087                        TFEA    featured_artist
    2951                         TSTU    studio
     3088                        TSTU    recording_studio
     3089                        rgad    replay_gain_adjustment
    29523090
    29533091                */
  • _plugins_/_test_/getID3/getid3/module.tag.lyrics3.php

    r16273 r22745  
    9797                                if (getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.apetag.php', __FILE__, false)) {
    9898                                        $tag = new getid3_apetag($fd, $ThisFileInfo, $ThisFileInfo['lyrics3']['tag_offset_start']);
     99                                        unset($tag);
    99100                                }
    100101                        }
     
    164165                                                $flagnames = array('lyrics', 'timestamps', 'inhibitrandom');
    165166                                                foreach ($flagnames as $flagname) {
    166                                                         if (strlen($ParsedLyrics3['raw']['IND']) > ++$i) {
    167                                                                 $ParsedLyrics3['flags'][$flagname] = $this->IntString2Bool(substr($ParsedLyrics3['raw']['IND'], $i, 1));
     167                                                        if (strlen($ParsedLyrics3['raw']['IND']) > $i++) {
     168                                                                $ParsedLyrics3['flags'][$flagname] = $this->IntString2Bool(substr($ParsedLyrics3['raw']['IND'], $i, 1 - 1));
    168169                                                        }
    169170                                                }
     
    182183                                                        if (strpos($imagestring, '||') !== false) {
    183184                                                                $imagearray = explode('||', $imagestring);
    184                                                                 $ParsedLyrics3['images'][$key]['filename']     = $imagearray[0];
    185                                                                 $ParsedLyrics3['images'][$key]['description']  = $imagearray[1];
    186                                                                 $ParsedLyrics3['images'][$key]['timestamp']    = $this->Lyrics3Timestamp2Seconds($imagearray[2]);
     185                                                                $ParsedLyrics3['images'][$key]['filename']     = @$imagearray[0];
     186                                                                $ParsedLyrics3['images'][$key]['description']  = @$imagearray[1];
     187                                                                $ParsedLyrics3['images'][$key]['timestamp']    = $this->Lyrics3Timestamp2Seconds(@$imagearray[2]);
    187188                                                        }
    188189                                                }
  • _plugins_/_test_/getID3/getid3/write.apetag.php

    r16273 r22745  
    123123
    124124                        }
    125                 }
    126                 return false;
     125                        return false;
     126                }
     127                return true;
    127128        }
    128129
  • _plugins_/_test_/getID3/getid3/write.id3v2.php

    r16273 r22745  
    102102                                                                copy($tempfilename, $this->filename);
    103103                                                                unlink($tempfilename);
     104                                                                ob_end_clean();
    104105                                                                return true;
    105106
     
    342343                                                $this->errors[] = 'Invalid Text Encoding in '.$frame_name.' ('.$source_data_array['encodingid'].') for ID3v2.'.$this->majorversion;
    343344                                        } elseif (!isset($source_data_array['data']) || !$this->IsValidURL($source_data_array['data'], false, false)) {
    344                                                 $this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
     345                                                //$this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
     346                                                // probably should be an error, need to rewrite IsValidURL() to handle other encodings
     347                                                $this->warnings[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
    345348                                        } else {
    346349                                                $framedata .= chr($source_data_array['encodingid']);
     
    754757                                                $this->errors[] = 'Invalid MIME Type in '.$frame_name.' ('.$source_data_array['mime'].') for ID3v2.'.$this->majorversion;
    755758                                        } elseif (($source_data_array['mime'] == '-->') && (!$this->IsValidURL($source_data_array['data'], false, false))) {
    756                                                 $this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
     759                                                //$this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
     760                                                // probably should be an error, need to rewrite IsValidURL() to handle other encodings
     761                                                $this->warnings[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
    757762                                        } else {
    758763                                                $framedata .= chr($source_data_array['encodingid']);
     
    857862                                                $this->errors[] = 'Invalid Frame Identifier in '.$frame_name.' ('.$source_data_array['frameid'].')';
    858863                                        } elseif (!$this->IsValidURL($source_data_array['data'], true, false)) {
    859                                                 $this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
     864                                                //$this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
     865                                                // probably should be an error, need to rewrite IsValidURL() to handle other encodings
     866                                                $this->warnings[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
    860867                                        } elseif ((($source_data_array['frameid'] == 'AENC') || ($source_data_array['frameid'] == 'APIC') || ($source_data_array['frameid'] == 'GEOB') || ($source_data_array['frameid'] == 'TXXX')) && ($source_data_array['additionaldata'] == '')) {
    861868                                                $this->errors[] = 'Content Descriptor must be specified as additional data for Frame Identifier of '.$source_data_array['frameid'].' in '.$frame_name;
     
    11411148                                                // URL              <text string>
    11421149                                                if (!$this->IsValidURL($source_data_array['data'], false, false)) {
    1143                                                         $this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
     1150                                                        //$this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
     1151                                                        // probably should be an error, need to rewrite IsValidURL() to handle other encodings
     1152                                                        $this->warnings[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
    11441153                                                } else {
    11451154                                                        $framedata .= $source_data_array['data'];
  • _plugins_/_test_/getID3/getid3/write.metaflac.php

    r16273 r22745  
    5353
    5454                                if (file_exists(GETID3_HELPERAPPSDIR.'metaflac.exe')) {
    55                                         //$commandline = '"'.GETID3_HELPERAPPSDIR.'metaflac.exe" --no-utf8-convert --remove-vc-all --import-vc-from="'.$tempcommentsfilename.'" "'.str_replace('/', '\\', $this->filename).'"';
     55                                        //$commandline = '"'.GETID3_HELPERAPPSDIR.'metaflac.exe" --no-utf8-convert --remove-all-tags --import-tags-from="'.$tempcommentsfilename.'" "'.str_replace('/', '\\', $this->filename).'"';
    5656                                        //  metaflac works fine if you copy-paste the above commandline into a command prompt,
    5757                                        //  but refuses to work with `backtick` if there are "doublequotes" present around BOTH
     
    6565                                        $timestampbeforewriting = filemtime($this->filename);
    6666
    67                                         $commandline = GETID3_HELPERAPPSDIR.'metaflac.exe --no-utf8-convert --remove-vc-all --import-vc-from="'.$tempcommentsfilename.'" "'.$this->filename.'" 2>&1';
     67                                        $commandline = GETID3_HELPERAPPSDIR.'metaflac.exe --no-utf8-convert --remove-all-tags --import-tags-from="'.$tempcommentsfilename.'" "'.$this->filename.'" 2>&1';
    6868                                        $metaflacError = `$commandline`;
    6969
     
    8181
    8282                                // It's simpler on *nix
    83                                 $commandline = 'metaflac --no-utf8-convert --remove-vc-all --import-vc-from='.$tempcommentsfilename.' "'.$this->filename.'" 2>&1';
     83                                $commandline = 'metaflac --no-utf8-convert --remove-all-tags --import-tags-from='.$tempcommentsfilename.' "'.$this->filename.'" 2>&1';
    8484                                $metaflacError = `$commandline`;
    8585
     
    117117                                        $timestampbeforewriting = filemtime($this->filename);
    118118
    119                                         $commandline = GETID3_HELPERAPPSDIR.'metaflac.exe --remove-vc-all "'.$this->filename.'" 2>&1';
     119                                        $commandline = GETID3_HELPERAPPSDIR.'metaflac.exe --remove-all-tags "'.$this->filename.'" 2>&1';
    120120                                        $metaflacError = `$commandline`;
    121121
     
    133133
    134134                                // It's simpler on *nix
    135                                 $commandline = 'metaflac --remove-vc-all "'.$this->filename.'" 2>&1';
     135                                $commandline = 'metaflac --remove-all-tags "'.$this->filename.'" 2>&1';
    136136                                $metaflacError = `$commandline`;
    137137
  • _plugins_/_test_/getID3/getid3/write.php

    r16273 r22745  
    8484                }
    8585
     86                $TagFormatsToRemove = array();
    8687                if (filesize($this->filename) == 0) {
    8788
     
    102103                                case 'mp2':
    103104                                case 'mp1':
     105                                case 'riff': // maybe not officially, but people do it anyway
    104106                                        $AllowedTagFormats = array('id3v1', 'id3v2.2', 'id3v2.3', 'id3v2.4', 'ape', 'lyrics3');
    105107                                        break;
     
    151153
    152154                        // List of other tag formats, removed if requested
    153                         $TagFormatsToRemove = array();
    154155                        if ($this->remove_other_tags) {
    155156                                foreach ($AllowedTagFormats as $AllowedTagFormat) {
     
    301302                                                }
    302303                                        } else {
    303                                                 $this->errors[] = 'WriteVorbisComment() failed';
     304                                                $this->errors[] = 'FormatDataForVorbisComment() failed';
    304305                                        }
    305306                                        break;
     
    392393                                        if (($success = $lyrics3_writer->DeleteLyrics3()) === false) {
    393394                                                $this->errors[] = 'DeleteLyrics3() failed with message(s):<PRE><UL><LI>'.trim(implode('</LI><LI>', $lyrics3_writer->errors)).'</LI></UL></PRE>';
     395                                        }
     396                                        break;
     397
     398                                case 'real':
     399                                        $real_writer = new getid3_write_real;
     400                                        $real_writer->filename = $this->filename;
     401                                        if (($success = $real_writer->RemoveReal()) === false) {
     402                                                $this->errors[] = 'RemoveReal() failed with message(s):<PRE><UL><LI>'.trim(implode('</LI><LI>', $real_writer->errors)).'</LI></UL></PRE>';
    394403                                        }
    395404                                        break;
  • _plugins_/_test_/getID3/getid3/write.real.php

    r16273 r22745  
    1717{
    1818        var $filename;
    19         var $tag_data;
     19        var $tag_data     = array();
    2020        var $warnings     = array(); // any non-critical errors will be stored here
    2121        var $errors       = array(); // any critical errors will be stored here
     
    3434                                $getID3 = new getID3;
    3535                                $OldThisFileInfo = $getID3->analyze($this->filename);
    36                                 if (empty($OldThisFileInfo['chunks']) && !empty($OldThisFileInfo['old_ra_header'])) {
     36                                if (empty($OldThisFileInfo['real']['chunks']) && !empty($OldThisFileInfo['real']['old_ra_header'])) {
    3737                                        $this->errors[] = 'Cannot write Real tags on old-style file format';
    38                                         return false;
    39                                 }
    40 
    41                                 $OldPROPinfo = false;
    42                                 $StartOfDATA = false;
    43                                 foreach ($OldThisFileInfo['chunks'] as $chunknumber => $chunkarray) {
    44                                         if ($chunkarray['name'] == 'PROP') {
    45                                                 $OldPROPinfo = $chunkarray;
    46                                         } elseif ($chunkarray['name'] = 'DATA') {
    47                                                 $StartOfDATA = $chunkarray['offset'];
    48                                         }
    49                                 }
    50 
    51                                 if (!empty($OldPROPinfo['length'])) {
    52                                         $this->paddedlength = max($OldPROPinfo['length'], $this->paddedlength);
    53                                 }
    54 
    55                                 $new_real_tag_data = GenerateRealTag();
    56 
    57                                 if (@$OldPROPinfo['length'] == $new_real_tag_data) {
     38                                        fclose($fp_source);
     39                                        return false;
     40                                }
     41
     42                                if (empty($OldThisFileInfo['real']['chunks'])) {
     43                                        $this->errors[] = 'Cannot write Real tags because cannot find DATA chunk in file';
     44                                        fclose($fp_source);
     45                                        return false;
     46                                }
     47                                foreach ($OldThisFileInfo['real']['chunks'] as $chunknumber => $chunkarray) {
     48                                        $oldChunkInfo[$chunkarray['name']] = $chunkarray;
     49                                }
     50                                if (!empty($oldChunkInfo['CONT']['length'])) {
     51                                        $this->paddedlength = max($oldChunkInfo['CONT']['length'], $this->paddedlength);
     52                                }
     53
     54                                $new_CONT_tag_data = $this->GenerateCONTchunk();
     55                                $new_PROP_tag_data = $this->GeneratePROPchunk($OldThisFileInfo['real']['chunks'], $new_CONT_tag_data);
     56                                $new__RMF_tag_data = $this->GenerateRMFchunk($OldThisFileInfo['real']['chunks']);
     57
     58                                if (@$oldChunkInfo['.RMF']['length'] == strlen($new__RMF_tag_data)) {
     59                                        fseek($fp_source, $oldChunkInfo['.RMF']['offset'], SEEK_SET);
     60                                        fwrite($fp_source, $new__RMF_tag_data);
     61                                } else {
     62                                        $this->errors[] = 'new .RMF tag ('.strlen($new__RMF_tag_data).' bytes) different length than old .RMF tag ('.$oldChunkInfo['.RMF']['length'].' bytes)';
     63                                        fclose($fp_source);
     64                                        return false;
     65                                }
     66
     67                                if (@$oldChunkInfo['PROP']['length'] == strlen($new_PROP_tag_data)) {
     68                                        fseek($fp_source, $oldChunkInfo['PROP']['offset'], SEEK_SET);
     69                                        fwrite($fp_source, $new_PROP_tag_data);
     70                                } else {
     71                                        $this->errors[] = 'new PROP tag ('.strlen($new_PROP_tag_data).' bytes) different length than old PROP tag ('.$oldChunkInfo['PROP']['length'].' bytes)';
     72                                        fclose($fp_source);
     73                                        return false;
     74                                }
     75
     76                                if (@$oldChunkInfo['CONT']['length'] == strlen($new_CONT_tag_data)) {
    5877
    5978                                        // new data length is same as old data length - just overwrite
    60                                         fseek($fp_source, $OldPROPinfo['offset'], SEEK_SET);
    61                                         fwrite($fp_source, $new_real_tag_data);
     79                                        fseek($fp_source, $oldChunkInfo['CONT']['offset'], SEEK_SET);
     80                                        fwrite($fp_source, $new_CONT_tag_data);
     81                                        fclose($fp_source);
     82                                        return true;
    6283
    6384                                } else {
    6485
    65                                         if (empty($OldPROPinfo)) {
    66                                                 // no existing PROP chunk
    67                                                 $BeforeOffset = $StartOfDATA;
    68                                                 $AfterOffset  = $StartOfDATA;
     86                                        if (empty($oldChunkInfo['CONT'])) {
     87                                                // no existing CONT chunk
     88                                                $BeforeOffset = $oldChunkInfo['DATA']['offset'];
     89                                                $AfterOffset  = $oldChunkInfo['DATA']['offset'];
    6990                                        } else {
    7091                                                // new data is longer than old data
    71                                                 $BeforeOffset = $OldPROPinfo['offset'];
    72                                                 $AfterOffset  = $OldPROPinfo['offset'] + $OldPROPinfo['length'];
     92                                                $BeforeOffset = $oldChunkInfo['CONT']['offset'];
     93                                                $AfterOffset  = $oldChunkInfo['CONT']['offset'] + $oldChunkInfo['CONT']['length'];
    7394                                        }
    74 
    75 
    76                                 }
    77 
    78                                 fclose($fp_source);
    79                                 return true;
     95                                        if ($tempfilename = tempnam('*', 'getID3')) {
     96                                                ob_start();
     97                                                if ($fp_temp = fopen($tempfilename, 'wb')) {
     98
     99                                                        rewind($fp_source);
     100                                                        fwrite($fp_temp, fread($fp_source, $BeforeOffset));
     101                                                        fwrite($fp_temp, $new_CONT_tag_data);
     102                                                        fseek($fp_source, $AfterOffset, SEEK_SET);
     103                                                        while ($buffer = fread($fp_source, GETID3_FREAD_BUFFER_SIZE)) {
     104                                                                fwrite($fp_temp, $buffer, strlen($buffer));
     105                                                        }
     106                                                        fclose($fp_temp);
     107
     108                                                        if (copy($tempfilename, $this->filename)) {
     109                                                                unlink($tempfilename);
     110                                                                fclose($fp_source);
     111                                                                return true;
     112                                                        }
     113                                                        unlink($tempfilename);
     114                                                        $this->errors[] = 'FAILED: copy('.$tempfilename.', '.$this->filename.') - '.strip_tags(ob_get_contents());
     115
     116                                                } else {
     117
     118                                                        $this->errors[] = 'Could not open '.$tempfilename.' mode "wb" - '.strip_tags(ob_get_contents());
     119
     120                                                }
     121                                                ob_end_clean();
     122                                        }
     123                                        fclose($fp_source);
     124                                        return false;
     125
     126                                }
     127
    80128
    81129                        } else {
     
    88136        }
    89137
    90         function GenerateRealTag() {
    91                 $RealCONT  = "\x00\x00"; // object version
    92 
    93                 $RealCONT .= BigEndian2String(strlen(@$this->tag_data['title']), 4);
    94                 $RealCONT .= @$this->tag_data['title'];
    95 
    96                 $RealCONT .= BigEndian2String(strlen(@$this->tag_data['artist']), 4);
    97                 $RealCONT .= @$this->tag_data['artist'];
    98 
    99                 $RealCONT .= BigEndian2String(strlen(@$this->tag_data['copyright']), 4);
    100                 $RealCONT .= @$this->tag_data['copyright'];
    101 
    102                 $RealCONT .= BigEndian2String(strlen(@$this->tag_data['comment']), 4);
    103                 $RealCONT .= @$this->tag_data['comment'];
    104 
    105                 if ($this->paddedlength > (strlen($RealCONT) + 8)) {
    106                         $RealCONT .= str_repeat("\x00", $this->paddedlength - strlen($RealCONT) - 8);
    107                 }
    108 
    109                 $RealCONT  = 'CONT'.BigEndian2String(strlen($RealCONT) + 8, 4).$RealCONT; // CONT chunk identifier + chunk length
    110 
    111                 return $RealCONT;
     138        function GenerateRMFchunk(&$chunks) {
     139                $oldCONTexists = false;
     140                foreach ($chunks as $key => $chunk) {
     141                        $chunkNameKeys[$chunk['name']] = $key;
     142                        if ($chunk['name'] == 'CONT') {
     143                                $oldCONTexists = true;
     144                        }
     145                }
     146                $newHeadersCount = $chunks[$chunkNameKeys['.RMF']]['headers_count'] + ($oldCONTexists ? 0 : 1);
     147
     148                $RMFchunk  = "\x00\x00"; // object version
     149                $RMFchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['.RMF']]['file_version'], 4);
     150                $RMFchunk .= getid3_lib::BigEndian2String($newHeadersCount,                                4);
     151
     152                $RMFchunk  = '.RMF'.getid3_lib::BigEndian2String(strlen($RMFchunk) + 8, 4).$RMFchunk; // .RMF chunk identifier + chunk length
     153                return $RMFchunk;
     154        }
     155
     156        function GeneratePROPchunk(&$chunks, &$new_CONT_tag_data) {
     157                $old_CONT_length = 0;
     158                $old_DATA_offset = 0;
     159                $old_INDX_offset = 0;
     160                foreach ($chunks as $key => $chunk) {
     161                        $chunkNameKeys[$chunk['name']] = $key;
     162                        if ($chunk['name'] == 'CONT') {
     163                                $old_CONT_length = $chunk['length'];
     164                        } elseif ($chunk['name'] == 'DATA') {
     165                                if (!$old_DATA_offset) {
     166                                        $old_DATA_offset = $chunk['offset'];
     167                                }
     168                        } elseif ($chunk['name'] == 'INDX') {
     169                                if (!$old_INDX_offset) {
     170                                        $old_INDX_offset = $chunk['offset'];
     171                                }
     172                        }
     173                }
     174                $CONTdelta = strlen($new_CONT_tag_data) - $old_CONT_length;
     175
     176                $PROPchunk  = "\x00\x00"; // object version
     177                $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['max_bit_rate'],    4);
     178                $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['avg_bit_rate'],    4);
     179                $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['max_packet_size'], 4);
     180                $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['avg_packet_size'], 4);
     181                $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['num_packets'],     4);
     182                $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['duration'],        4);
     183                $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['preroll'],         4);
     184                $PROPchunk .= getid3_lib::BigEndian2String(max(0, $old_INDX_offset + $CONTdelta),              4);
     185                $PROPchunk .= getid3_lib::BigEndian2String(max(0, $old_DATA_offset + $CONTdelta),              4);
     186                $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['num_streams'],     2);
     187                $PROPchunk .= getid3_lib::BigEndian2String($chunks[$chunkNameKeys['PROP']]['flags_raw'],       2);
     188
     189                $PROPchunk  = 'PROP'.getid3_lib::BigEndian2String(strlen($PROPchunk) + 8, 4).$PROPchunk; // PROP chunk identifier + chunk length
     190                return $PROPchunk;
     191        }
     192
     193        function GenerateCONTchunk() {
     194                foreach ($this->tag_data as $key => $value) {
     195                        // limit each value to 0xFFFF bytes
     196                        $this->tag_data[$key] = substr($value, 0, 65535);
     197                }
     198
     199                $CONTchunk  = "\x00\x00"; // object version
     200
     201                $CONTchunk .= getid3_lib::BigEndian2String(strlen(@$this->tag_data['title']), 2);
     202                $CONTchunk .= @$this->tag_data['title'];
     203
     204                $CONTchunk .= getid3_lib::BigEndian2String(strlen(@$this->tag_data['artist']), 2);
     205                $CONTchunk .= @$this->tag_data['artist'];
     206
     207                $CONTchunk .= getid3_lib::BigEndian2String(strlen(@$this->tag_data['copyright']), 2);
     208                $CONTchunk .= @$this->tag_data['copyright'];
     209
     210                $CONTchunk .= getid3_lib::BigEndian2String(strlen(@$this->tag_data['comment']), 2);
     211                $CONTchunk .= @$this->tag_data['comment'];
     212
     213                if ($this->paddedlength > (strlen($CONTchunk) + 8)) {
     214                        $CONTchunk .= str_repeat("\x00", $this->paddedlength - strlen($CONTchunk) - 8);
     215                }
     216
     217                $CONTchunk  = 'CONT'.getid3_lib::BigEndian2String(strlen($CONTchunk) + 8, 4).$CONTchunk; // CONT chunk identifier + chunk length
     218
     219                return $CONTchunk;
    112220