Make WordPress Core


Ignore:
Timestamp:
07/31/2017 07:49:31 PM (8 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.