Make WordPress Core


Ignore:
Timestamp:
07/31/2017 07:49:31 PM (9 years ago)
Author:
wonderboymusic
Message:

Media: update the getID3 library to version 1.9.14 to avoid fatal errors in PHP7.

Props MyThemeShop for the initial patch.
Fixes #41496.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/ID3/module.tag.id3v2.php

    r32979 r41196  
    7272                if ($id3v2_majorversion > 4) { // this script probably won't correctly parse ID3v2.5.x and above (if it ever exists)
    7373
    74                         $info['error'][] = 'this script only parses up to ID3v2.4.x - this tag is ID3v2.'.$id3v2_majorversion.'.'.$thisfile_id3v2['minorversion'];
     74                        $this->error('this script only parses up to ID3v2.4.x - this tag is ID3v2.'.$id3v2_majorversion.'.'.$thisfile_id3v2['minorversion']);
    7575                        return false;
    7676
     
    242242
    243243                                        if ($thisfile_id3v2['exthead']['length'] != $extended_header_offset) {
    244                                                 $info['warning'][] = 'ID3v2.4 extended header length mismatch (expecting '.intval($thisfile_id3v2['exthead']['length']).', found '.intval($extended_header_offset).')';
     244                                                $this->warning('ID3v2.4 extended header length mismatch (expecting '.intval($thisfile_id3v2['exthead']['length']).', found '.intval($extended_header_offset).')');
    245245                                        }
    246246                                }
     
    261261                                                        $thisfile_id3v2['padding']['valid'] = false;
    262262                                                        $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i;
    263                                                         $info['warning'][] = 'Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)';
     263                                                        $this->warning('Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)');
    264264                                                        break;
    265265                                                }
     
    301301                                                        // MP3ext known broken frames - "ok" for the purposes of this test
    302302                                                } elseif (($id3v2_majorversion == 4) && ($this->IsValidID3v2FrameName(substr($framedata, getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0), 4), 3))) {
    303                                                         $info['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';
     303                                                        $this->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');
    304304                                                        $id3v2_majorversion = 3;
    305305                                                        $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer
     
    323323                                                        $thisfile_id3v2['padding']['valid'] = false;
    324324                                                        $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i;
    325                                                         $info['warning'][] = 'Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)';
     325                                                        $this->warning('Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)');
    326326                                                        break;
    327327                                                }
     
    330330                                }
    331331
    332                                 if ($frame_name == 'COM ') {
    333                                         $info['warning'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by iTunes (versions "X v2.0.3", "v3.0.1" are known-guilty, probably others too)]';
    334                                         $frame_name = 'COMM';
     332                                if ($iTunesBrokenFrameNameFixed = self::ID3v22iTunesBrokenFrameName($frame_name)) {
     333                                        $this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by iTunes (versions "X v2.0.3", "v3.0.1", "v7.0.0.70" are known-guilty, probably others too)]. Translated frame name from "'.str_replace("\x00", ' ', $frame_name).'" to "'.$iTunesBrokenFrameNameFixed.'" for parsing.');
     334                                        $frame_name = $iTunesBrokenFrameNameFixed;
    335335                                }
    336336                                if (($frame_size <= strlen($framedata)) && ($this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion))) {
     
    356356                                                        // next frame is valid, just skip the current frame
    357357                                                        $framedata = substr($framedata, $frame_size);
    358                                                         $info['warning'][] = 'Next ID3v2 frame is valid, skipping current frame.';
     358                                                        $this->warning('Next ID3v2 frame is valid, skipping current frame.');
    359359
    360360                                                } else {
     
    363363                                                        //unset($framedata);
    364364                                                        $framedata = null;
    365                                                         $info['error'][] = 'Next ID3v2 frame is also invalid, aborting processing.';
     365                                                        $this->error('Next ID3v2 frame is also invalid, aborting processing.');
    366366
    367367                                                }
     
    370370
    371371                                                // this is the last frame, just skip
    372                                                 $info['warning'][] = 'This was the last ID3v2 frame.';
     372                                                $this->warning('This was the last ID3v2 frame.');
    373373
    374374                                        } else {
     
    377377                                                //unset($framedata);
    378378                                                $framedata = null;
    379                                                 $info['warning'][] = 'Invalid ID3v2 frame size, aborting.';
     379                                                $this->warning('Invalid ID3v2 frame size, aborting.');
    380380
    381381                                        }
     
    390390                                                        case ' MP':
    391391                                                        case 'MP3':
    392                                                                 $info['warning'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by "MP3ext (www.mutschler.de/mp3ext/)"]';
     392                                                                $this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by "MP3ext (www.mutschler.de/mp3ext/)"]');
    393393                                                                break;
    394394
    395395                                                        default:
    396                                                                 $info['warning'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))).';
     396                                                                $this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))).');
    397397                                                                break;
    398398                                                }
     
    400400                                        } elseif (!isset($framedata) || ($frame_size > strlen($framedata))) {
    401401
    402                                                 $info['error'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: $frame_size ('.$frame_size.') > strlen($framedata) ('.(isset($framedata) ? strlen($framedata) : 'null').')).';
     402                                                $this->error('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: $frame_size ('.$frame_size.') > strlen($framedata) ('.(isset($framedata) ? strlen($framedata) : 'null').')).');
    403403
    404404                                        } else {
    405405
    406                                                 $info['error'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag).';
     406                                                $this->error('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag).');
    407407
    408408                                        }
     
    443443
    444444                if (isset($thisfile_id3v2['comments']['genre'])) {
     445                        $genres = array();
    445446                        foreach ($thisfile_id3v2['comments']['genre'] as $key => $value) {
    446                                 unset($thisfile_id3v2['comments']['genre'][$key]);
    447                                 $thisfile_id3v2['comments'] = getid3_lib::array_merge_noclobber($thisfile_id3v2['comments'], array('genre'=>$this->ParseID3v2GenreString($value)));
    448                         }
     447                                foreach ($this->ParseID3v2GenreString($value) as $genre) {
     448                                        $genres[] = $genre;
     449                                }
     450                        }
     451                        $thisfile_id3v2['comments']['genre'] = array_unique($genres);
     452                        unset($key, $value, $genres, $genre);
    449453                }
    450454
     
    501505                // ID3v2.4.x: '21' $00 'Eurodisco' $00
    502506                $clean_genres = array();
     507
     508                // hack-fixes for some badly-written ID3v2.3 taggers, while trying not to break correctly-written tags
     509                if (($this->getid3->info['id3v2']['majorversion'] == 3) && !preg_match('#[\x00]#', $genrestring)) {
     510                        // note: MusicBrainz Picard incorrectly stores plaintext genres separated by "/" when writing in ID3v2.3 mode, hack-fix here:
     511                        // replace / with NULL, then replace back the two ID3v1 genres that legitimately have "/" as part of the single genre name
     512                        if (preg_match('#/#', $genrestring)) {
     513                                $genrestring = str_replace('/', "\x00", $genrestring);
     514                                $genrestring = str_replace('Pop'."\x00".'Funk', 'Pop/Funk', $genrestring);
     515                                $genrestring = str_replace('Rock'."\x00".'Rock', 'Folk/Rock', $genrestring);
     516                        }
     517
     518                        // some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal"
     519                        if (preg_match('#;#', $genrestring)) {
     520                                $genrestring = str_replace(';', "\x00", $genrestring);
     521                        }
     522                }
     523
     524
    503525                if (strpos($genrestring, "\x00") === false) {
    504526                        $genrestring = preg_replace('#\(([0-9]{1,3})\)#', '$1'."\x00", $genrestring);
    505527                }
     528
    506529                $genre_elements = explode("\x00", $genrestring);
    507530                foreach ($genre_elements as $element) {
     
    572595                                $parsedFrame['decompressed_size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4));
    573596                                if (!function_exists('gzuncompress')) {
    574                                         $info['warning'][] = 'gzuncompress() support required to decompress ID3v2 frame "'.$parsedFrame['frame_name'].'"';
     597                                        $this->warning('gzuncompress() support required to decompress ID3v2 frame "'.$parsedFrame['frame_name'].'"');
    575598                                } else {
    576599                                        if ($decompresseddata = @gzuncompress(substr($parsedFrame['data'], 4))) {
     
    579602                                                unset($decompresseddata);
    580603                                        } else {
    581                                                 $info['warning'][] = 'gzuncompress() failed on compressed contents of ID3v2 frame "'.$parsedFrame['frame_name'].'"';
     604                                                $this->warning('gzuncompress() failed on compressed contents of ID3v2 frame "'.$parsedFrame['frame_name'].'"');
    582605                                        }
    583606                                }
     
    587610                if (!empty($parsedFrame['flags']['DataLengthIndicator'])) {
    588611                        if ($parsedFrame['data_length_indicator'] != strlen($parsedFrame['data'])) {
    589                                 $info['warning'][] = 'ID3v2 frame "'.$parsedFrame['frame_name'].'" should be '.$parsedFrame['data_length_indicator'].' bytes long according to DataLengthIndicator, but found '.strlen($parsedFrame['data']).' bytes of data';
     612                                $this->warning('ID3v2 frame "'.$parsedFrame['frame_name'].'" should be '.$parsedFrame['data_length_indicator'].' bytes long according to DataLengthIndicator, but found '.strlen($parsedFrame['data']).' bytes of data');
    590613                        }
    591614                }
     
    602625                                        break;
    603626                        }
    604                         $info['warning'][] = $warning;
     627                        $this->warning($warning);
    605628
    606629                } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'UFID')) || // 4.1   UFID Unique file identifier
     
    628651                        $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
    629652                        if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
    630                                 $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
     653                                $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
    631654                                $frame_textencoding_terminator = "\x00";
    632655                        }
     
    636659                        }
    637660                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    638                         if (ord($frame_description) === 0) {
     661                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     662                                // if description only contains a BOM or terminator then make it blank
    639663                                $frame_description = '';
    640664                        }
     
    665689                        $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
    666690                        if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
    667                                 $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
     691                                $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
    668692                        }
    669693
     
    721745                        $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
    722746                        if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
    723                                 $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
     747                                $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
    724748                                $frame_textencoding_terminator = "\x00";
    725749                        }
     
    729753                        }
    730754                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    731 
    732                         if (ord($frame_description) === 0) {
     755                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     756                                // if description only contains a BOM or terminator then make it blank
    733757                                $frame_description = '';
    734758                        }
     
    784808                        $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
    785809                        if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
    786                                 $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
     810                                $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
    787811                        }
    788812                        $parsedFrame['encodingid'] = $frame_textencoding;
     
    962986                        $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
    963987                        if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
    964                                 $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
     988                                $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
    965989                                $frame_textencoding_terminator = "\x00";
    966990                        }
     
    972996                        }
    973997                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    974                         if (ord($frame_description) === 0) {
     998                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     999                                // if description only contains a BOM or terminator then make it blank
    9751000                                $frame_description = '';
    9761001                        }
     
    9801005                        $parsedFrame['encoding']     = $this->TextEncodingNameLookup($frame_textencoding);
    9811006
    982                         $parsedFrame['data']         = $parsedFrame['data'];
    9831007                        $parsedFrame['language']     = $frame_language;
    9841008                        $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false);
     
    10101034                        $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
    10111035                        if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
    1012                                 $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
     1036                                $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
    10131037                                $frame_textencoding_terminator = "\x00";
    10141038                        }
     
    10621086                        if (strlen($parsedFrame['data']) < 5) {
    10631087
    1064                                 $info['warning'][] = 'Invalid data (too short) for "'.$parsedFrame['frame_name'].'" frame at offset '.$parsedFrame['dataoffset'];
     1088                                $this->warning('Invalid data (too short) for "'.$parsedFrame['frame_name'].'" frame at offset '.$parsedFrame['dataoffset']);
    10651089
    10661090                        } else {
     
    10701094                                $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
    10711095                                if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
    1072                                         $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
     1096                                        $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
    10731097                                        $frame_textencoding_terminator = "\x00";
    10741098                                }
     
    10801104                                }
    10811105                                $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1082                                 if (ord($frame_description) === 0) {
     1106                                if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1107                                        // if description only contains a BOM or terminator then make it blank
    10831108                                        $frame_description = '';
    10841109                                }
     
    11331158                                $parsedFrame[$RVA2channelcounter]['bitspeakvolume'] = ord(substr($frame_remainingdata, $frame_offset++, 1));
    11341159                                if (($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] < 1) || ($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] > 4)) {
    1135                                         $info['warning'][] = 'ID3v2::RVA2 frame['.$RVA2channelcounter.'] contains invalid '.$parsedFrame[$RVA2channelcounter]['bitspeakvolume'].'-byte bits-representing-peak value';
     1160                                        $this->warning('ID3v2::RVA2 frame['.$RVA2channelcounter.'] contains invalid '.$parsedFrame[$RVA2channelcounter]['bitspeakvolume'].'-byte bits-representing-peak value');
    11361161                                        break;
    11371162                                }
     
    13421367                        $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
    13431368                        if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
    1344                                 $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
     1369                                $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
    13451370                                $frame_textencoding_terminator = "\x00";
    13461371                        }
     
    13771402
    13781403                        if ($frame_offset >= $parsedFrame['datalength']) {
    1379                                 $info['warning'][] = 'data portion of APIC frame is missing at offset '.($parsedFrame['dataoffset'] + 8 + $frame_offset);
     1404                                $this->warning('data portion of APIC frame is missing at offset '.($parsedFrame['dataoffset'] + 8 + $frame_offset));
    13801405                        } else {
    13811406                                $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);
     
    13841409                                }
    13851410                                $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1386                                 if (ord($frame_description) === 0) {
     1411                                if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1412                                        // if description only contains a BOM or terminator then make it blank
    13871413                                        $frame_description = '';
    13881414                                }
     
    14031429                                $parsedFrame['image_mime'] = '';
    14041430                                $imageinfo = array();
    1405                                 $imagechunkcheck = getid3_lib::GetDataImageSize($parsedFrame['data'], $imageinfo);
    1406                                 if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) {
    1407                                         $parsedFrame['image_mime']       = 'image/'.getid3_lib::ImageTypesLookup($imagechunkcheck[2]);
    1408                                         if ($imagechunkcheck[0]) {
    1409                                                 $parsedFrame['image_width']  = $imagechunkcheck[0];
    1410                                         }
    1411                                         if ($imagechunkcheck[1]) {
    1412                                                 $parsedFrame['image_height'] = $imagechunkcheck[1];
     1431                                if ($imagechunkcheck = getid3_lib::GetDataImageSize($parsedFrame['data'], $imageinfo)) {
     1432                                        if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) {
     1433                                                $parsedFrame['image_mime']       = 'image/'.getid3_lib::ImageTypesLookup($imagechunkcheck[2]);
     1434                                                if ($imagechunkcheck[0]) {
     1435                                                        $parsedFrame['image_width']  = $imagechunkcheck[0];
     1436                                                }
     1437                                                if ($imagechunkcheck[1]) {
     1438                                                        $parsedFrame['image_height'] = $imagechunkcheck[1];
     1439                                                }
    14131440                                        }
    14141441                                }
     
    14261453                                                if ($this->getid3->option_save_attachments < $parsedFrame['data_length']) {
    14271454                                                        // too big, skip
    1428                                                         $info['warning'][] = 'attachment at '.$frame_offset.' is too large to process inline ('.number_format($parsedFrame['data_length']).' bytes)';
     1455                                                        $this->warning('attachment at '.$frame_offset.' is too large to process inline ('.number_format($parsedFrame['data_length']).' bytes)');
    14291456                                                        unset($parsedFrame['data']);
    14301457                                                        break;
     
    14331460                                        } elseif (is_string($this->getid3->option_save_attachments)) {
    14341461                                                $dir = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR);
    1435                                                 if (!is_dir($dir) || !is_writable($dir)) {
     1462                                                if (!is_dir($dir) || !getID3::is_writable($dir)) {
    14361463                                                        // cannot write, skip
    1437                                                         $info['warning'][] = 'attachment at '.$frame_offset.' cannot be saved to "'.$dir.'" (not writable)';
     1464                                                        $this->warning('attachment at '.$frame_offset.' cannot be saved to "'.$dir.'" (not writable)');
    14381465                                                        unset($parsedFrame['data']);
    14391466                                                        break;
     
    14431470                                        if (is_string($this->getid3->option_save_attachments)) {
    14441471                                                $destination_filename = $dir.DIRECTORY_SEPARATOR.md5($info['filenamepath']).'_'.$frame_offset;
    1445                                                 if (!file_exists($destination_filename) || is_writable($destination_filename)) {
     1472                                                if (!file_exists($destination_filename) || getID3::is_writable($destination_filename)) {
    14461473                                                        file_put_contents($destination_filename, $parsedFrame['data']);
    14471474                                                } else {
    1448                                                         $info['warning'][] = 'attachment at '.$frame_offset.' cannot be saved to "'.$destination_filename.'" (not writable)';
     1475                                                        $this->warning('attachment at '.$frame_offset.' cannot be saved to "'.$destination_filename.'" (not writable)');
    14491476                                                }
    14501477                                                $parsedFrame['data_filename'] = $destination_filename;
     
    14831510                        $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
    14841511                        if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
    1485                                 $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
     1512                                $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
    14861513                                $frame_textencoding_terminator = "\x00";
    14871514                        }
     
    15081535                        }
    15091536                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1510                         if (ord($frame_description) === 0) {
     1537                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1538                                // if description only contains a BOM or terminator then make it blank
    15111539                                $frame_description = '';
    15121540                        }
     
    15901618                        $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
    15911619                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1592                         if (ord($frame_description) === 0) {
     1620                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1621                                // if description only contains a BOM or terminator then make it blank
    15931622                                $frame_description = '';
    15941623                        }
     
    16151644                        $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    16161645                        if (ord($frame_ownerid) === 0) {
    1617                                 $frame_ownerid == '';
     1646                                $frame_ownerid = '';
    16181647                        }
    16191648                        $frame_offset = $frame_terminatorpos + strlen("\x00");
     
    16841713                        $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
    16851714                        if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
    1686                                 $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
     1715                                $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
    16871716                        }
    16881717                        $frame_language = substr($parsedFrame['data'], $frame_offset, 3);
     
    17111740                        $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
    17121741                        if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
    1713                                 $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
     1742                                $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
    17141743                        }
    17151744                        $parsedFrame['encodingid'] = $frame_textencoding;
     
    17251754
    17261755                        $parsedFrame['purchasedate'] = substr($parsedFrame['data'], $frame_offset, 8);
    1727                         if (!$this->IsValidDateStampString($parsedFrame['purchasedate'])) {
     1756                        if ($this->IsValidDateStampString($parsedFrame['purchasedate'])) {
    17281757                                $parsedFrame['purchasedateunix'] = mktime (0, 0, 0, substr($parsedFrame['purchasedate'], 4, 2), substr($parsedFrame['purchasedate'], 6, 2), substr($parsedFrame['purchasedate'], 0, 4));
    17291758                        }
     
    17521781                        $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);
    17531782                        if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
    1754                                 $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
     1783                                $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
    17551784                                $frame_textencoding_terminator = "\x00";
    17561785                        }
     
    17901819                        }
    17911820                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1792                         if (ord($frame_description) === 0) {
     1821                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1822                                // if description only contains a BOM or terminator then make it blank
    17931823                                $frame_description = '';
    17941824                        }
     
    20072037                                        $frame_offset += 2;
    20082038                                        if ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) {
    2009                                                 $info['warning'][] = 'CHAP subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)';
     2039                                                $this->warning('CHAP subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)');
    20102040                                                break;
    20112041                                        }
     
    20442074                                                $parsedFrame['subframes'][] = $subframe;
    20452075                                        } else {
    2046                                                 $info['warning'][] = 'ID3v2.CHAP subframe "'.$subframe['name'].'" not handled (only TIT2 and TIT3)';
     2076                                                $this->warning('ID3v2.CHAP subframe "'.$subframe['name'].'" not handled (only TIT2 and TIT3)');
    20472077                                        }
    20482078                                }
     
    21042134                                        $frame_offset += 2;
    21052135                                        if ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) {
    2106                                                 $info['warning'][] = 'CTOS subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)';
     2136                                                $this->warning('CTOS subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)');
    21072137                                                break;
    21082138                                        }
     
    21412171                                                $parsedFrame['subframes'][] = $subframe;
    21422172                                        } else {
    2143                                                 $info['warning'][] = 'ID3v2.CTOC subframe "'.$subframe['name'].'" not handled (only TIT2 and TIT3)';
     2173                                                $this->warning('ID3v2.CTOC subframe "'.$subframe['name'].'" not handled (only TIT2 and TIT3)');
    21442174                                        }
    21452175                                }
     
    36243654        }
    36253655
     3656        public static function ID3v22iTunesBrokenFrameName($frame_name) {
     3657                // iTunes (multiple versions) has been known to write ID3v2.3 style frames
     3658                // but use ID3v2.2 frame names, right-padded using either [space] or [null]
     3659                // to make them fit in the 4-byte frame name space of the ID3v2.3 frame.
     3660                // This function will detect and translate the corrupt frame name into ID3v2.3 standard.
     3661                static $ID3v22_iTunes_BrokenFrames = array(
     3662                        'BUF' => 'RBUF', // Recommended buffer size
     3663                        'CNT' => 'PCNT', // Play counter
     3664                        'COM' => 'COMM', // Comments
     3665                        'CRA' => 'AENC', // Audio encryption
     3666                        'EQU' => 'EQUA', // Equalisation
     3667                        'ETC' => 'ETCO', // Event timing codes
     3668                        'GEO' => 'GEOB', // General encapsulated object
     3669                        'IPL' => 'IPLS', // Involved people list
     3670                        'LNK' => 'LINK', // Linked information
     3671                        'MCI' => 'MCDI', // Music CD identifier
     3672                        'MLL' => 'MLLT', // MPEG location lookup table
     3673                        'PIC' => 'APIC', // Attached picture
     3674                        'POP' => 'POPM', // Popularimeter
     3675                        'REV' => 'RVRB', // Reverb
     3676                        'RVA' => 'RVAD', // Relative volume adjustment
     3677                        'SLT' => 'SYLT', // Synchronised lyric/text
     3678                        'STC' => 'SYTC', // Synchronised tempo codes
     3679                        'TAL' => 'TALB', // Album/Movie/Show title
     3680                        'TBP' => 'TBPM', // BPM (beats per minute)
     3681                        'TCM' => 'TCOM', // Composer
     3682                        'TCO' => 'TCON', // Content type
     3683                        'TCP' => 'TCMP', // Part of a compilation
     3684                        'TCR' => 'TCOP', // Copyright message
     3685                        'TDA' => 'TDAT', // Date
     3686                        'TDY' => 'TDLY', // Playlist delay
     3687                        'TEN' => 'TENC', // Encoded by
     3688                        'TFT' => 'TFLT', // File type
     3689                        'TIM' => 'TIME', // Time
     3690                        'TKE' => 'TKEY', // Initial key
     3691                        'TLA' => 'TLAN', // Language(s)
     3692                        'TLE' => 'TLEN', // Length
     3693                        'TMT' => 'TMED', // Media type
     3694                        'TOA' => 'TOPE', // Original artist(s)/performer(s)
     3695                        'TOF' => 'TOFN', // Original filename
     3696                        'TOL' => 'TOLY', // Original lyricist(s)/text writer(s)
     3697                        'TOR' => 'TORY', // Original release year
     3698                        'TOT' => 'TOAL', // Original album/movie/show title
     3699                        'TP1' => 'TPE1', // Lead performer(s)/Soloist(s)
     3700                        'TP2' => 'TPE2', // Band/orchestra/accompaniment
     3701                        'TP3' => 'TPE3', // Conductor/performer refinement
     3702                        'TP4' => 'TPE4', // Interpreted, remixed, or otherwise modified by
     3703                        'TPA' => 'TPOS', // Part of a set
     3704                        'TPB' => 'TPUB', // Publisher
     3705                        'TRC' => 'TSRC', // ISRC (international standard recording code)
     3706                        'TRD' => 'TRDA', // Recording dates
     3707                        'TRK' => 'TRCK', // Track number/Position in set
     3708                        'TS2' => 'TSO2', // Album-Artist sort order
     3709                        'TSA' => 'TSOA', // Album sort order
     3710                        'TSC' => 'TSOC', // Composer sort order
     3711                        'TSI' => 'TSIZ', // Size
     3712                        'TSP' => 'TSOP', // Performer sort order
     3713                        'TSS' => 'TSSE', // Software/Hardware and settings used for encoding
     3714                        'TST' => 'TSOT', // Title sort order
     3715                        'TT1' => 'TIT1', // Content group description
     3716                        'TT2' => 'TIT2', // Title/songname/content description
     3717                        'TT3' => 'TIT3', // Subtitle/Description refinement
     3718                        'TXT' => 'TEXT', // Lyricist/Text writer
     3719                        'TXX' => 'TXXX', // User defined text information frame
     3720                        'TYE' => 'TYER', // Year
     3721                        'UFI' => 'UFID', // Unique file identifier
     3722                        'ULT' => 'USLT', // Unsynchronised lyric/text transcription
     3723                        'WAF' => 'WOAF', // Official audio file webpage
     3724                        'WAR' => 'WOAR', // Official artist/performer webpage
     3725                        'WAS' => 'WOAS', // Official audio source webpage
     3726                        'WCM' => 'WCOM', // Commercial information
     3727                        'WCP' => 'WCOP', // Copyright/Legal information
     3728                        'WPB' => 'WPUB', // Publishers official webpage
     3729                        'WXX' => 'WXXX', // User defined URL link frame
     3730                );
     3731                if (strlen($frame_name) == 4) {
     3732                        if ((substr($frame_name, 3, 1) == ' ') || (substr($frame_name, 3, 1) == "\x00")) {
     3733                                if (isset($ID3v22_iTunes_BrokenFrames[substr($frame_name, 0, 3)])) {
     3734                                        return $ID3v22_iTunes_BrokenFrames[substr($frame_name, 0, 3)];
     3735                                }
     3736                        }
     3737                }
     3738                return false;
     3739        }
     3740
    36263741}
    3627 
Note: See TracChangeset for help on using the changeset viewer.