Changeset 41196 for trunk/src/wp-includes/ID3/module.tag.id3v2.php
- Timestamp:
- 07/31/2017 07:49:31 PM (8 years ago)
- File:
-
- 1 edited
-
trunk/src/wp-includes/ID3/module.tag.id3v2.php (modified) (53 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/ID3/module.tag.id3v2.php
r32979 r41196 72 72 if ($id3v2_majorversion > 4) { // this script probably won't correctly parse ID3v2.5.x and above (if it ever exists) 73 73 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']); 75 75 return false; 76 76 … … 242 242 243 243 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).')'); 245 245 } 246 246 } … … 261 261 $thisfile_id3v2['padding']['valid'] = false; 262 262 $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)'); 264 264 break; 265 265 } … … 301 301 // MP3ext known broken frames - "ok" for the purposes of this test 302 302 } 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'); 304 304 $id3v2_majorversion = 3; 305 305 $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer … … 323 323 $thisfile_id3v2['padding']['valid'] = false; 324 324 $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)'); 326 326 break; 327 327 } … … 330 330 } 331 331 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; 335 335 } 336 336 if (($frame_size <= strlen($framedata)) && ($this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion))) { … … 356 356 // next frame is valid, just skip the current frame 357 357 $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.'); 359 359 360 360 } else { … … 363 363 //unset($framedata); 364 364 $framedata = null; 365 $ info['error'][] = 'Next ID3v2 frame is also invalid, aborting processing.';365 $this->error('Next ID3v2 frame is also invalid, aborting processing.'); 366 366 367 367 } … … 370 370 371 371 // 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.'); 373 373 374 374 } else { … … 377 377 //unset($framedata); 378 378 $framedata = null; 379 $ info['warning'][] = 'Invalid ID3v2 frame size, aborting.';379 $this->warning('Invalid ID3v2 frame size, aborting.'); 380 380 381 381 } … … 390 390 case ' MP': 391 391 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/)"]'); 393 393 break; 394 394 395 395 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.'))).'); 397 397 break; 398 398 } … … 400 400 } elseif (!isset($framedata) || ($frame_size > strlen($framedata))) { 401 401 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').')).'); 403 403 404 404 } else { 405 405 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).'); 407 407 408 408 } … … 443 443 444 444 if (isset($thisfile_id3v2['comments']['genre'])) { 445 $genres = array(); 445 446 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); 449 453 } 450 454 … … 501 505 // ID3v2.4.x: '21' $00 'Eurodisco' $00 502 506 $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 503 525 if (strpos($genrestring, "\x00") === false) { 504 526 $genrestring = preg_replace('#\(([0-9]{1,3})\)#', '$1'."\x00", $genrestring); 505 527 } 528 506 529 $genre_elements = explode("\x00", $genrestring); 507 530 foreach ($genre_elements as $element) { … … 572 595 $parsedFrame['decompressed_size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4)); 573 596 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'].'"'); 575 598 } else { 576 599 if ($decompresseddata = @gzuncompress(substr($parsedFrame['data'], 4))) { … … 579 602 unset($decompresseddata); 580 603 } 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'].'"'); 582 605 } 583 606 } … … 587 610 if (!empty($parsedFrame['flags']['DataLengthIndicator'])) { 588 611 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'); 590 613 } 591 614 } … … 602 625 break; 603 626 } 604 $ info['warning'][] = $warning;627 $this->warning($warning); 605 628 606 629 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'UFID')) || // 4.1 UFID Unique file identifier … … 628 651 $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); 629 652 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'); 631 654 $frame_textencoding_terminator = "\x00"; 632 655 } … … 636 659 } 637 660 $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 639 663 $frame_description = ''; 640 664 } … … 665 689 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); 666 690 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'); 668 692 } 669 693 … … 721 745 $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); 722 746 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'); 724 748 $frame_textencoding_terminator = "\x00"; 725 749 } … … 729 753 } 730 754 $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 733 757 $frame_description = ''; 734 758 } … … 784 808 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); 785 809 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'); 787 811 } 788 812 $parsedFrame['encodingid'] = $frame_textencoding; … … 962 986 $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); 963 987 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'); 965 989 $frame_textencoding_terminator = "\x00"; 966 990 } … … 972 996 } 973 997 $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 975 1000 $frame_description = ''; 976 1001 } … … 980 1005 $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); 981 1006 982 $parsedFrame['data'] = $parsedFrame['data'];983 1007 $parsedFrame['language'] = $frame_language; 984 1008 $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); … … 1010 1034 $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); 1011 1035 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'); 1013 1037 $frame_textencoding_terminator = "\x00"; 1014 1038 } … … 1062 1086 if (strlen($parsedFrame['data']) < 5) { 1063 1087 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']); 1065 1089 1066 1090 } else { … … 1070 1094 $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); 1071 1095 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'); 1073 1097 $frame_textencoding_terminator = "\x00"; 1074 1098 } … … 1080 1104 } 1081 1105 $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 1083 1108 $frame_description = ''; 1084 1109 } … … 1133 1158 $parsedFrame[$RVA2channelcounter]['bitspeakvolume'] = ord(substr($frame_remainingdata, $frame_offset++, 1)); 1134 1159 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'); 1136 1161 break; 1137 1162 } … … 1342 1367 $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); 1343 1368 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'); 1345 1370 $frame_textencoding_terminator = "\x00"; 1346 1371 } … … 1377 1402 1378 1403 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)); 1380 1405 } else { 1381 1406 $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); … … 1384 1409 } 1385 1410 $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 1387 1413 $frame_description = ''; 1388 1414 } … … 1403 1429 $parsedFrame['image_mime'] = ''; 1404 1430 $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 } 1413 1440 } 1414 1441 } … … 1426 1453 if ($this->getid3->option_save_attachments < $parsedFrame['data_length']) { 1427 1454 // 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)'); 1429 1456 unset($parsedFrame['data']); 1430 1457 break; … … 1433 1460 } elseif (is_string($this->getid3->option_save_attachments)) { 1434 1461 $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)) { 1436 1463 // 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)'); 1438 1465 unset($parsedFrame['data']); 1439 1466 break; … … 1443 1470 if (is_string($this->getid3->option_save_attachments)) { 1444 1471 $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)) { 1446 1473 file_put_contents($destination_filename, $parsedFrame['data']); 1447 1474 } 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)'); 1449 1476 } 1450 1477 $parsedFrame['data_filename'] = $destination_filename; … … 1483 1510 $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); 1484 1511 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'); 1486 1513 $frame_textencoding_terminator = "\x00"; 1487 1514 } … … 1508 1535 } 1509 1536 $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 1511 1539 $frame_description = ''; 1512 1540 } … … 1590 1618 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); 1591 1619 $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 1593 1622 $frame_description = ''; 1594 1623 } … … 1615 1644 $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); 1616 1645 if (ord($frame_ownerid) === 0) { 1617 $frame_ownerid = ='';1646 $frame_ownerid = ''; 1618 1647 } 1619 1648 $frame_offset = $frame_terminatorpos + strlen("\x00"); … … 1684 1713 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); 1685 1714 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'); 1687 1716 } 1688 1717 $frame_language = substr($parsedFrame['data'], $frame_offset, 3); … … 1711 1740 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); 1712 1741 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'); 1714 1743 } 1715 1744 $parsedFrame['encodingid'] = $frame_textencoding; … … 1725 1754 1726 1755 $parsedFrame['purchasedate'] = substr($parsedFrame['data'], $frame_offset, 8); 1727 if ( !$this->IsValidDateStampString($parsedFrame['purchasedate'])) {1756 if ($this->IsValidDateStampString($parsedFrame['purchasedate'])) { 1728 1757 $parsedFrame['purchasedateunix'] = mktime (0, 0, 0, substr($parsedFrame['purchasedate'], 4, 2), substr($parsedFrame['purchasedate'], 6, 2), substr($parsedFrame['purchasedate'], 0, 4)); 1729 1758 } … … 1752 1781 $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); 1753 1782 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'); 1755 1784 $frame_textencoding_terminator = "\x00"; 1756 1785 } … … 1790 1819 } 1791 1820 $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 1793 1823 $frame_description = ''; 1794 1824 } … … 2007 2037 $frame_offset += 2; 2008 2038 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)'); 2010 2040 break; 2011 2041 } … … 2044 2074 $parsedFrame['subframes'][] = $subframe; 2045 2075 } 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)'); 2047 2077 } 2048 2078 } … … 2104 2134 $frame_offset += 2; 2105 2135 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)'); 2107 2137 break; 2108 2138 } … … 2141 2171 $parsedFrame['subframes'][] = $subframe; 2142 2172 } 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)'); 2144 2174 } 2145 2175 } … … 3624 3654 } 3625 3655 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 3626 3741 } 3627
Note: See TracChangeset
for help on using the changeset viewer.