1///////////////////////////////////////////////////////////////// 2/// getID3() by James Heinrich <info@getid3.org> // 3// available at http://getid3.sourceforge.net // 4// or https://www.getid3.org // 5// also https://github.com/JamesHeinrich/getID3 // 6///////////////////////////////////////////////////////////////// 7// // 8// changelog.txt - part of getID3() // 9// See readme.txt for more details // 10// /// 11///////////////////////////////////////////////////////////////// 12 13 » denotes a major feature addition/change 14 ¤ denotes a change in the returned structure 15 ! denotes a cry for help from developers 16* Bugfix: denotes a fixed bug 17 18Version History 19=============== 20 211.9.20: [2020-06-30] James Heinrich :: 1.9.20-202006061653 22 » add support for DSDIFF audio 23 » add support for TAK lossess audio 24 » add support for IVF video 25 » add detection support for EPUB files 26 » add detection support for HPK archives 27 » add demo.mysqli.php, remove demo.mysql.php 28 ¤ QuickTime.uuid now returned as an array (may contain multiple entries) 29 ¤ improved PDF support, including page count 30 * bugfix (G:247) array_min incorrect return value 31 * bugfix (G:242) filepointer analysis errors 32 * bugfix (G:238) comments_html may not match comments 33 * bugfix (G:235) prevent disclosing paths when accessing modules directly 34 * bugfix (G:233) Quicktime duplicate attached images 35 * bugfix (G:229) Quicktime timestamps easy access 36 * bugfix (G:228) master.zip did not contain demos 37 * bugfix (G:227) Quicktime check subatoms data length 38 * bugfix (G:226) uuid parsing based on UUID 39 * bugfix (G:225) use comments_html content already generated by modules 40 * bugfix (G:223) ID3v2 slashed genre names 41 * bugfix (G:222) demo.browse filesystem character encoding 42 * bugfix (G:221) option_tags_html=false ignored 43 * bugfix (G:219) Quicktime.UUID now parsed more discriminately for XML and other data types 44 * bugfix (G:218) QuickTime not copying covr to comments 45 * bugfix (G:217) mp3 array offsets of type bool 46 * bugfix (G:216) ID3v2.write allow WMP rating in POPM 47 * bugfix (G:210) PHP 7.4 deprecated get_magic_quotes 48 * bugfix: Quicktime detect null-terminated strings used where Pascal strings should be 49 * bugfix: Quicktime GPS uninitialized array keys 50 511.9.19: [2019-12-17] James Heinrich :: 1.9.19-201912131005 52 » add placeholder support for WTV (Windows Recorded TV Show) 53 * bugfix (G:210) PHP 7.4 deprecated get_magic_quotes 54 * bugfix (G:207) improved LAME version string parsing 55 * bugfix (G:206) inverted logic in CopyTagsToComments 56 * bugfix (G:203) use getimagesizefromstring if available 57 * Quicktime decode 'uuid' atom for 360fly cameras 58 591.9.18: [2019-07-24] James Heinrich :: 1.9.18-201907240906 60 * bugfix (G:198) use native hash functions instead of obsolete external binaries 61 * bugfix (G:194) PHP 7.4 compatibility: fix deprecated curly brace array access 62 * bugfix (G:191) unsupported operand types module.audio.ac3.php:763 63 * bugfix (G:189) false UTF-16 <BOM> and no termination strings 64 * bugfix (G:188) add support for DS2 v8 65 * bugfix (G:187) RIFF.WAVE.scot parsing 66 * bugfix (G:184) invalid regex pattern (ID3v1) 67 * bugfix (G:183) reduced information for GIF files with $option_extra_info=false 68 * bugfix (G:175) mp4 max buffer size 69 * bugfix (G:174) TIFF parsing improvements 70 * bugfix (G:121) trailing nulls in ID3v2 strings 71 * standardize "track" -> "track_number" 72 731.9.17: [2019-02-07] James Heinrich :: 1.9.17-201902071234 74 * bugfix (G:178) HandleAllTags should skip "picture" 75 * bugfix (G:177) error checking for reading more than PHP memory_limit 76 * bugfix (G:176) improved mp3 detection in remote-file demo 77 * bugfix (G:173) Add filepointer option to analyze/openfile function 78 * bugfix (G:170) Add support for WXXX (URL) and APIC (attached picture) subframes inside ID3v2 chapters 79 * bugfix: write.id3v2 year field 80 * bugfix: mp3.APE permit optional " dB" in ReplayGain tags 81 * placeholder support for .xz file format 82 831.9.16: [2018-10-17] James Heinrich :: 1.9.16-201810171314 84 * bugfix (G:168) Ogg FLAC not parsed 85 * bugfix (G:163) invalid MP3 header error on VBR 86 * bugfix (G:162) prevent writing multiple ID3v2 versions 87 * bugfix (G:161) MP3 VBR header duration 88 * bugfix (G:160) OggOpus duration sometimes incorrect 89 * bugfix (G:157) quicktime GPS invalid argument 90 * bugfix (G:148) MPEG-2 aspect ratio 91 * bugfix (G:147) Quicktime fourcc codec name lookup 92 * bugfix (G:147) Quicktime audio/video bitrate guessing 93 * bugfix (G:145) incompatible variable types 94 * bugfix (G:139) Quicktime islt subatoms >5 95 * bugfix (G:137) ID3v2 semi-numeric genres 96 * bugfix (G:136) ID3v2 unsynchronised typo 97 * bugfix (#2514) FLAC zero-byte block header 98 * bugfix (#2488) MIME types (FLAC, WAV, gzip) 99 * bugfix (#2468) Quicktime video rotation 100 * bugfix (#2207) metaflac + attached pictures 101 * bugfix (#2151) improved demo UNC filename support 102 * bugfix (#1966) fread fail when PHP memory_limit -1 103 * bugfix (#1908) Quicktime rotation detection (using matrix values) 104 * bugfix (#1908) Quicktime "rcif" and "dscp" atoms 105 * bugfix (#1900) demo.joinmp3 cut from end 106 * security: avoid disabled demo reflection 107 * TIFF: expand list of named tags, expose as 'tag_name' key for all entries 108 * Quicktime: parse some GoPro-specific data 109 * helperapps (Windows): updated vorbiscomment.exe, metaflac.exe to v1.3.2 110 * add more image formats supported by getimagesize() 111 1121.9.15: [2017-10-26] James Heinrich :: 1.9.15-201709291043 113 » (G:108) add basic APNG support 114 » (G:107) add basic WebP support 115 * return RIFF.WAV.CART comments in merged comments section 116 * add support for QuickTime 'loci' chunk 117 * bugfix: (#2124) support for Quicktime/MP4 "chpl" (CHaPter List) atom 118 * bugfix: (G:128) undefinied bsmod in module.ac3 119 * bugfix: (#2114) possible issue with UTF8 filenames and metaflac 120 * bugfix: (G:123) remove MySQL engine and collation from create table 121 * bugfix: (#2066) fix AAC MIME type, remove video key for audio-only files 122 * bugfix: (G:111) QuickTime stsd number_entries deadlock 123 * bugfix: (G:110) PHP memory limit with space 124 * bugfix: (G:109) improved animated GIF support 125 * bugfix: (#1966) GPS track in QuickTime 126 1271.9.14: [2017-03-27] James Heinrich 128 » Add experimental support for E-AC3 129 * bugfix (G:105): RIFF.WAVE.iXML multiple TIMESTAMP_SAMPLE_RATE 130 * bugfix (G:95): improperly initialized error/warning keys 131 * bugfix (G:94): ID3v2 write support for TXXX 132 * bugfix (G:93): all errors or warnings should pass through class method 133 1341.9.13: [2016-12-14] James Heinrich 135 * bugfix (G:89): ID3v2.4 custom genres with slashes 136 * bugfix (G:88): large QuickTime files exceed PHP memory limit 137 * bugfix (G:87): ID3v2 write GRID data not working properly 138 * bugfix (G:86): Increase autoloading definitions 139 * bugfix (G:84): ID3v2 available writable frames list 140 * bugfix (G:82): ID3v2 datetime logic 141 * bugfix (G:80): attempt to autodetect ID3v1 encoding 142 * bugfix (G:77): add partial support of DSSv6 143 * bugfix (G:76): add mysqli version of caching extension 144 * bugfix (G:75): mysql cache max key length 145 * bugfix (G:71): custom error handler to catch exif_read_data() errors 146 * bugfix (G:71): add support for mb_convert_encoding 147 * bugfix (G:70): ID3v2 POPM / UFID 148 * bugfix (G:68): workaround broken iTunes ID3v2 149 * bugfix (G:48): Quicktime set MIME to video/mp4 where applicable 150 * bugfix (#1930) fread on pipes 151 * bugfix (#1926) relax ID3v2.IsValidURL check 152 1531.9.12: [2016-03-02] James Heinrich 154 » Add support for Direct Stream Digital (DSD) / 155 DSD Storage Facility (DSF) file format 156 » Add detection (not parsing) of WebP image format 157 * bugfix (#1910): Quicktime embedded images 158 1591.9.11: [2015-12-24] James Heinrich 160 * bugfix (G:64): update constructor syntax for PHP 7 161 * bugfix (G:62): infinite loop in large PNG files 162 * bugfix (G:61): ID3v2 remove BOM from frame descriptions 163 * bugfix (G:60): missing "break" in module.audio-video.quicktime.php 164 * bugfix (G:59): .gitignore comments 165 * bugfix (G:58): inconsistency in relation to module.tag.id3v2.php 166 * bugfix (G:57): comparing instead of assign 167 * bugfix (G:56): unsupported MIME type "audio/x-wave" 168 * bugfix (G:55): readme.md variable reference 169 * bugfix (G:54): QuickTime false 1000fps 170 * bugfix (G:53): Quicktime / ID3v2 multiple genres 171 * bugfix (G:52): sys_get_temp_dir in GetDataImageSize 172 * bugfix (#1903): Quicktime meta atom not parsed 173 * demo.joinmp3.php enhancements 174 * m4b (audiobook) chapters not parsed correctly 175 * sqlite3 caching not working 176 1771.9.10: [2015-09-14] James Heinrich 178 * bugfix (G:49): Declaration of getID3_cached_sqlite3 179 * bugfix (#1892): extension.cache.mysql 180 * bugfix (#1891): duplicate default clause [Quicktime] 181 * bugfix (G:41): incorrect MP3 playtime 182 * bugfix: iconv problems on musl with //TRANSLIT 183 * Add arguments to analyze() for original filesize (and filename) 184 * ID3v2 simplify handling of multiple genres 185 * Corrected merging of multiple genres for ID3v2 186 * getid3_lib::GetDataImageSize return false on error 187 1881.9.9: [2014-12-18] James Heinrich 189 » Added basic support for OggOpus 190 » Add ID3v2 CHAP + CTOC support 191 * Add composer autoloader 192 * bugfix: removed non-printable ASCII in comment 193 * bugfix: possible memory leak in OggFLAC 194 * bugfix: sys_get_temp_dir undefined before PHP 5.2.1 195 * bugfix: improved fix for XXE security issue (CVE-2014-2053) 196 (thanks nacinØwordpress*org) 197 * bugfix: G:25 ID3v2 LINK utf8_encode not defined 198 * bugfix: G:22 ID3v2 TXXX description encoding 199 * bugfix: #1855 - copy image height/width/etc to comments 200 * bugfix: #1855 - PHP errors in badly written APE/ID3v2 tags 201 * bugfix: #1845 - Quicktime parsing with no PHP memory_limit 202 * bugfix: #1828 - ID3v2 writing unknown frame names 203 2041.9.8: [2014-05-11] James Heinrich 205 » Add support for AMR (Adaptive Multi-Rate audio codec) 206 new file: module.audio.amr.php 207 » Added composer.json, registered on packagist.org 208 * Added workaround for PHP Bug #39923 (undefined constant IMG_JPG) 209 * Bugfix: (#1813) avoid running out of memory when parsing large 210 Quicktime files 211 * Bugfix: (#1812) potential unwanted high-ASCII characters in errors 212 * Bugfix: close potential XXE security issue (CVE-2014-2053) 213 * Bugfix: (G:10) Avoid warnings from realpath() if SAFE MODE is enabled 214 * Bugfix: (G:12) If [tags] data contains an array of strings then html 215 encoding did not take place. 216 * Bugfix: (G:12) IPTC character set not specified 217 * Bugfix: possible divide by zero error in FLV module 218 * Bugfix: possible undefined key in ID3v2 219 * Bugfix: possible undefined key in MPEG video files 220 * Bugfix: demo.browse to use character set consistently 221 2221.9.7: [2013-07-05] James Heinrich 223 * Bugfix: [module.audio-video.quicktime.php] track languages set 224 with 15-bit-encoded ISO639-2 language codes not parsed correctly 225 * Bugfix: (#1717) QuickTime atom hierarchy broken 226 * Bugfix: (#1716) truncate MIDI file could cause infinite loop 227 * Bugfix: all source files converted to UTF-8 228 2291.9.6: [2013-06-03] James Heinrich 230 » getID3() is now licensed under GPL / LGPL / MozillaPL / gCL 231 See license.txt for more details. 232 * Bugfix: (#1550) Quicktime video track sample description parsed 233 incorrectly 234 * Bugfix: (#1550) Quicktime matrix U/V/W values calculated incorrectly 235 * [demo.browse] disable edit-tag and delete-file links by default 236 * Bugfix: option_max_2gb_check should issue warning not error on >2GB 237 2381.9.5: [2013-02-20] James Heinrich, Dmitry Arkhipov 239 » DTS-in-WAV now properly supported 240 ¤ DSS files return additional data in new keys, and some existing 241 keys have been renamed 242 * Bugfix: open_basedir not parsed correctly under Windows 243 (thanks yannick*jamontØgmail*com) 244 * Bugfix: [demo/demo.browse] might not display file or directory name 245 on PHP >=5.4.0 if filename not UTF-8 friendly 246 * Bugfix: [demo/demo.zip] could read more uncompressed data than 247 required; fail to read file if local data descriptor not set; 248 some wrong include files were listed; improved error message display 249 * Bugfix: [module.audio-video.riff] INFO comment chunks with null name 250 chunk not parsed correctly 251 * Bugfix: [module.archive.gz] gzip files with filename stored may have 252 filename reduplicated in [gzip][files] output 253 * Bugfix: [module.archive.zip] data_descriptor not parsed correctly 254 * Bugfix: [module.archive.zip] some newer compression methods unknown 255 * Bugfix: [module.archive.zip] not all flags parsed 256 * Bugfix: [module.archive.zip] local file header not parsed correctly 257 if file has zero values for compressed_size in Local File Header 258 * Bugfix: (#1493) better support for >2GB filesize on 32-bit Linux 259 * Bugfix: (#1474) unneccesary call to GetDataImageSize in JPEG module 260 * Bugfix: (#1470) GIF files falsely detected as TS format 261 * Bugfix: (#1431) Matroska did not parse PixelCrop* / DisplayUnit 262 (thanks jgerberØwikimedia*org) 263 * Bugfix: (#1430) split ID3v2 text values on null separator 264 * Bugfix: (#1426) MS Office 2007 file format now recognized as zip.msoffice 265 * Bugfix: (#1423) optimized CreateDeepArray function 266 * Bugfix: (#1415) add support for DS2 variant of DSS 267 2681.9.4b1: [2012-10-05] James Heinrich, Dmitry Arkhipov, Karl G. Holz 269 » New module: extension.cache.sqlite3.php (by Karl G. Holz) 270 » New demo: demos/getid3.demo.dirscan.php (by Karl G. Holz) 271 » PHP5 standards improvements (thanks phansysØgmail*com) 272 » more reliable >4GB file size parsing using COM (if available) 273 Scripting.FileSystemObject rather than parsing `dir` output 274 * added support for FLAC inside Matroska (audio bitrate cannot 275 be determined in this case) 276 * XMP module now returns all tags, not just whitelisted ones 277 * (#1297) Added detection of MPEG Transport Stream files. 278 Stub module.audio-video.ts.php incomplete 279 * (#1383) removed unneeded ?> tags (thanks daveØholyfield*info) 280 * Bugfix: XMP returns attributes array not just value strings 281 * Bugfix: (#1369) ID3v2 IPLS contents not parsed 282 * Bugfix: (#1357) demo.mysql.php mysql_table_exists() failed 283 * Bugfix: (#1355) copy Foobar2000 QuickTime tags to [comments] 284 * Bugfix: (#1351) QuickTime files with zero-sized atom boxes 285 could cause infinite loop 286 * Bugfix: (#1343) FLAC attached pictures Ogg not handled 287 * Bugfix: (#1343) ID3v2 inside WAV "id3 " chunk not handled 288 * Bugfix: (#1315) BMP detection was broken 289 * Bugfix: (#1309) ID3v2.2 content_group_description (TT2) did 290 not copy to same place as ID3v2.3/ID3v2.4 (TIT2) 291 * Bugfix: (#1308) [playtime_string] could show hh:mm:60 292 * Bugfix: (#1306) extension.cache.mysql.php keyword TYPE->ENGINE 293 * Bugfix: (#1295) missing video information if QuickTime file has 294 disabled tracks 295 * Bugfix: (#1275) MD5/SHA1 data hashes not working properly 296 under Windows 297 298 2991.9.3: [2011-12-13] Dmitry Arkhipov, James Heinrich 300 * Matroska module improved: 301 1. Added support for A_MS/ACM audio codec 302 2. Fixed issues in tags, cues, chapters and clusters parsing 303 3. Fixed almost all errors with track_data_offset, errors 304 still may occur with Xiph data lacing 305 4. Optimized audio/video streams population with usage of the 306 official default values for missing elements 307 5. Audio/video keys are now populated with data from the 308 default stream, not from the first one as before 309 6. Full WebM support 310 * Bugfix: demo.browse would not pop up warnings when clicked 311 if warning contains apostrophe/single-quote character 312 * Bugfix: (#1269) ID3v1 genre typo "Trash"->"Thrash" Metal 313 314 3151.9.2: [2011-12-08] James Heinrich, Dmitry Arkhipov 316 » significant rewrite to module.audio-video.matroska.php 317 ¤ (#1256) ID3 tags in AIFF 'ID3 ' chunks now parsed 318 ¤ (#1039) iXML data in WAV files now returned and parsed into 319 [riff][WAVE][iXML][0][data] and [riff][WAVE][iXML][0][parsed] 320 ¤ [playtime_string] now returns M:SS if less than 1 hour, and 321 H:MM:SS if 1 hour or longer 322 * Bugfix: (#1266) variable tablename: extension.cache.mysql.php 323 * Bugfix: (#1265) unescaped # in regex in write.id3v2.php 324 * Bugfix: (#1252) MediaMonkey writes blank ID3v2 RGAD frames 325 and puts replay-gain values in TXXX frames 326 * Bugfix: (#1251) FLV playtime could be inaccurate for longer 327 files where meta frame is present but meta-playtime is zero 328 * Bugfix: (#1216) show hex values of unknown atom names 329 * Bugfix: (#1215) undefined variable in PrintHexBytes() 330 * Bugfix: FLV audio bitrate was returning kbps not bps 331 * Bugfix: missing ) in write.real.php::RemoveReal() 332 * Bugfix: replace $this::VERSION with getID3::VERSION in 333 extension.cache.*.php 334 335 3361.9.1: [2011-08-10] James Heinrich 337 ¤ ASF Extended Header Object data now (partially) parsed 338 * Default getID3 encoding now set to UTF-8 not ISO-8859-1 339 * Bugfix: (#1212) truncated Matroska files may result in 340 infinite loop and memory exhaustion 341 * Bugfix: (#1203) parse RIFF JUNK chunks for version strings 342 * Bugfix: (#1201) multi-byte characters strings incorrectly 343 displayed by table_var_dump() in demo.browse.php 344 * Bugfix: (#1199) prevent PHP warning on malformed ID3v2 APIC 345 * Bugfix: (#1196) typo in module.audio-video.quicktime.php 346 * Bugfix: (#1195) QuicktimeStoreFrontCodeLookup() broken 347 * Bugfix: (#1194) mp4 embedded images not handled correctly 348 * Bugfix: (#1193) [image_mime] key not set fo WM/picture data 349 * Bugfix: (#1193) ASF Extended Header Object Metadata Library 350 now parsed for embedded images and handled per usual style 351 * Bugfix: (#1190) demo.mimeonly.php was broken since v1.9.0 352 * Bugfix: ID3v2 comment is now called 'comment' not 'comments' 353 * Bugfix: AVI unknown codec fourcc would be reported as blank 354 * Bugfix: AVI zero-size JUNK chunk would give warning 355 356 3571.9.0: [2011-06-20] James Heinrich 358 » changed all module classes to have proper constructors 359 with the actual analysis code moved to function Analyze() 360 * removed unnecessary ob_* calls, replaced with appropriate 361 checks and judicious use of @ error suppression 362 ¤ GETID3_VERSION constant replaced with $getID3->version() 363 ¤ picture data is now returned only in the original source 364 location and [comments][picture], it is no longer replicated 365 in [comments_html], [tags] or [tags_html] 366 ¤ Matroska tags are now returned in [comments] as per normal 367 ¤ Matroska tags are better supported, including pictures 368 ¤ GPS data in MP4 files (e.g. iPhone) is now parsed (#1157) 369 ¤ Matroska audio/video tracks with a default flag, the default 370 stream flag is now copied to [audio|video][streams] (#1147) 371 ¤ Nikon-specific data (NCDT atom) in Quicktime videos now parsed 372 ¤ QuickTime atoms 'meta' and 'data' now (mostly) parsed 373 * Bugfix: remove false warning of junk data on WAV+ID3v1 374 * Bugfix: DolbyDigitalWAV files returned wrong audio bitrate 375 * Bugfix: large attachment data in Matroska tags were not 376 returned completely. 377 * Bugfix: wrong image_mime used for images in demo.browse.php 378 * Bugfix: broken preg_match in module.audio.dss.php 379 * Bugfix: Lyrics3 end offset was off by 1 380 * Bugfix: audio channelmode could be wrong for 2 channels 381 (e.g. joint stereo reported as stereo) 382 * Bugfix: MultiByteCharString2HTML() would return empty string 383 if passed float or int value, now casts to string first 384 * Bugfix: FLAC.picture was not returning under [data] + 385 [image_mime] per standardized format 386 * Bugfix: BigEndian2Int() could incorrectly return negative 387 signed synchsafe integer instead of casting to float 388 * Bugfix: (#1177) ID3v2.4 extended headers were broken 389 * Bugfix: (#1173) some MIDI files not completely parsed 390 * Bugfix: (#1171) change helperapps error to nonblocking warning 391 * Bugfix: (#1170) possible infinite loop in FLV module 392 * Bugfix: (#1169) $this reference in static function (ID3v2) 393 * Bugfix: (#1156) demo.mysql.php not working 394 * Bugfix: (#1153) badly-tagged files could produce invalid 395 argument errors in module.tag.xmp.php 396 * Bugfix: (#1152) add error-suppression to iconv() calls 397 * Bugfix: (#1151) AAC-ADTS files could sometimes not find sync 398 * Bugfix: (#1136) last character of unicode tags (e.g. ASF) 399 was being truncated 400 * Bugfix: (#1133) write.id3v2.php IsValidURL() was broken 401 * Bugfix: (#1126) ID3v2.POPM field was being clobbered 402 * Bugfix: (#999, #1154) ID3v2 UFID data was missing 403 404 4051.8.5: [2011-02-18] James Heinrich 406 » support >2GB files on 64-bit PHP 407 - note current unofficial 64-bit PHP builds for Windows 408 do not actually support 64-bit integers so are still 409 subject to normal 32-bit limits (2GB) for file functions 410 » PHP v5.0.5 now minimum required version. 411 Removed obsolte functions from getid3.lib.php: 412 md5_file, sha1_file, image_type_to_mime_type 413 » IDivX tags now parsed on AVI files 414 ¤ embedded image data is returned inside [comments][picture] 415 in a 2-element array (data, image_mime) for all formats 416 * $this->overwrite_tags=false is now known to be buggy and 417 has been disabled for this version until a full review 418 of tag writing can be completed. Certainly affects ID3v2, 419 the other writable tag formats may or may not be broken 420 * getID3 constructor no longer checks for (or sets) timezone 421 * demo.browse.php now shows cover art as inline images 422 rather than dumped to separate files 423 * [audio][streams][x][language] now set when known 424 * Bugfix: RIFF-AVI "JUNK" chunks are now parsed properly, 425 including zero-sized ones (no more false errors) 426 * Bugfix: msoffice documents now return correct error message 427 * Bugfix: demo.browse.php now encodes data according to 428 current page encoding (default=UTF-8) 429 * Bugfix: (#1120) sometimes incorrect ID3v2 genre parsing 430 * Bugfix: (#1116) possibly incorrect warnings (or lack of) 431 for RIFFs > 2GB. 432 * Bugfix: (#1115) wrong RIFFtype in RIFF files 433 * Bugfix: (#1114) wrong MIME type may be set for Matroska 434 * Bugfix: (#1113) support DSS v3 files 435 * Bugfix: (#1111) cover art in APE tags now supported 436 * Bugfix: (#1091) RemoveID3v1() unitialized variables 437 * Bugfix: (# 504) do not set Quicktime resolution if 438 'tkhd' atom is disabled 439 * Bugfix: (# 95) return [quicktime][controller] if known 440 441 4421.8.4: [2011-02-03] James Heinrich 443 * change default encoding in ID3v2 writing to UTF16-LE+BOM 444 (or ISO-8859-1 where possible) for better compatability 445 with broken versions of Windows Media Player and iTunes 446 * Bugfix: [FLV] incorrect overall bitrate in some files 447 * Bugfix: (#1102) missing parentheses in write[.id3v2].php 448 * Bugfix: (#510) undefined IsValidDottedIP() in write.id3v2.php 449 450 4511.8.3: [2011-01-18] James Heinrich 452 » magic_quotes_gpc must now be disabled to use getID3 453 » replace all error-suppressing @$variable calls with 454 isset() or empty() as appropriate for some configurations 455 where @ does not act to suppress warnings of undefined 456 variables (e.g. support forum thread #798) 457 * remove SafeStripSlashes() and FixTextFields functions 458 * [quicktime] use fourcc if codec name zero-length 459 * [quicktime] support "iods" atom 460 * Bugfix: (#1099) sometimes incorrect detection of safe_mode 461 * Bugfix: (#1095) more robust setting of temp dir 462 * Bugfix: (#1093) add support for ClusterSimpleBlock to 463 prevent "Undefined index: track_data_offsets" errors 464 in Matroska files 465 * Bugfix: [riff] prevent errors when RIFF.WAVE.BEXT chunk 466 contains null date/time (thanks moysevichØgmail*com) 467 * Bugfix: [quicktime] prevent divide-by-zero errors if 468 time_to_sample_table has zero-sample entry 469 (thanks moysevichØgmail*com) 470 471 4721.8.2: [2010-12-06] James Heinrich 473 * include startup warning for PHP < v5 474 * magic_quotes_runtime must now be disabled to use getID3 475 ¤ MusicBrainz / AmpliFIND data more accessible in returned data 476 from Quicktime-style files (e.g. MP4/AAC) 477 * Bugfix: (#1079) wrong encoding might be used for ID3v2 478 text data, and/or garbage data prepended before text 479 data; DataLengthIndicator value was being ignored 480 * Bugfix: (#1055) clearer warnings on non-EXIF contents in 481 JPEG [APP1] 482 * Bugfix: (#999) ID3v2 UFID data was missing 483 484 4851.8.1: [2010-11-25] James Heinrich 486 * replaced calls to deprecated mysql_escape_string() with 487 mysql_real_escape_string() 488 * Bugfix: (#1072) memory limit not handled correctly if 489 in gigabytes in php.ini (e.g. "2G") 490 * Bugfix: (#1068) wrong encoding for Quicktime tags 491 * Bugfix: (#1040) possible infinite loop in genre parsing 492 * Bugfix: (#1036) helperapps directory not resolving 8.3 493 path names correctly 494 * Bugfix: (#1023) dbm cache extension not correctly handling 495 types other than "db3" 496 * Bugfix: (#1023) mysql cache extension now base64_encodes 497 data to make binary-safe. Existing cached data must be 498 purged from your database cache 499 * Bugfix: (#1007) ClosestStandardMP3Bitrate() not selecting 500 most appropriate value 501 * Bugfix: (#996) inefficient and buggy ID3v1 and ID3v2 502 genre parsing 503 * Bugfix: (#974) track number handled incorrectly in 504 demo.write.php 505 * Bugfix: (#969) tempnam() calls failing with open_basedir 506 * Bugfix: (#955) UTF-16LE text files could be falsely 507 identified as corrupt mp3 files 508 * Bugfix: (#877) detect if mbstring.func_overload is set in php.ini 509 * Bugfix: (#858) PHP safe_mode setting in php.ini incorrectly 510 handled if set to "Off" 511 * Bugfix: (#838) prevent warnings with assorted unhandled 512 Quicktime atoms 513 514 5151.8.0: [2010-11-23] James Heinrich 516 » Changes required for PHP v5.3+ compatability, including: 517 - change ereg* functions to preg_* equivalents 518 - declare functions static as needed 519 note: users of PHP v4.x may need to stay with getID3 v1.7.x 520 » Added CUE (cuesheet) support 521 new file: module.misc.cue.php 522 (thanks Nigel Barnes ngbarnesØhotmail*com) 523 » Added XMP (Adobe Extensible Metadata Platform) support 524 currently used with module.graphic.jpg.php 525 new file: module.tag.xmp.php 526 (thanks Nigel Barnes ngbarnesØhotmail*com) 527 ¤ [jpg][exif][GPS][computed] now exists when possible with 528 calculated values (decimal latitude, longitude, altitude, time) 529 ¤ Prevent clobbering WMA artist with albumartist value; added WMA 530 partofset tag; added WMA tag picture data to WMA comments 531 (thanks ngbarnesØhotmail*com) 532 ¤ RIFF.WAVE.SNDM (SoundMiner) metadata now parsed 533 (thanks emerrittØwbgu*bgsu*edu) 534 ¤ FLAC embedded pictures now return [data_length] key 535 (thanks darrenburnhillØhotmail*com) 536 * added support for a number of new comment atom types added in 537 iTunes v4.0-v7.0 (thanks ngbarnesØhotmail*com) 538 * demo.browse.php now shows video resolution and framerate (if no 539 artist or title info present) 540 * additional FLV details parsed, may be faster as well 541 (thanks ngbarnesØhotmail*com) 542 * Bugfix: DSS files longer than 60 seconds had wrong playtime 543 * Bugfix: possible empty array encountered in APE tags 544 (thanks csnaitsirchØweb*de) 545 * Bugfix: prevent fatal error when calling BigEndian2Int() on 546 zero-length string (thanks taylor*fausakØgmail*com) 547 * Bugfix: prevent errors when parsing invalid Vorbis comments 548 (thanks dr*dieselØgmail*com) 549 * Bugfix: files could not be analyzed from Windows shares 550 (e.g. \\SERVER\Directory\Filename.mp3) 551 * Bugfix: RAR file opening should use 'filenamepath' 552 (thanks adrien*gibratØgmail*com) 553 * Bugfix: [asf][codec_list_object][codec_entries][x][description] 554 not containing expected comma-seperated values no longer aborts 555 (thanks larry_globusØyahoo*com) 556 * Bugfix: [id3v2] UFID was not returning data 557 (thanks joostØdecock*org) 558 5591.7.9: [2009-03-08] James Heinrich 560 » Added DSS (Digital Speech Standard) support 561 new file: module.audio.dss.php 562 (thanks luke*wilkinsØdtsam*com) 563 » Added MPC (Musepack) SV8 support 564 (thanks WaldoMonster) 565 ¤ some MPC [header] keys renamed to be the same between SV7/SV8 566 ¤ start aligning demos CSS styling with v2.x styles 567 new file: demos/getid3.css 568 ¤ JPEG now returns parsed IPTC tags in [iptc] 569 ¤ getid3_lib::GetDataImageSize now requires $imageinfo parameter 570 ¤ better support for Matroska files with AC3/DTS/MP3/OGG audio 571 (support still lacking for AAC) 572 ¤ standardize ID3v2 TCMP key to 'part_of_a_set' between reading 573 and writing (thanks aaron_stormØyahoo*com) 574 ¤ added ID3v2 keys 'TCMP','TCP' to for writing iTunes-style tags 575 (thanks aaron_stormØyahoo*com) 576 ¤ back-ported PICTURE tag handling in FLAC tags 577 (thanks WaldoMonster) 578 ¤ added alternate method to get [video][frame_rate] from QuickTime 579 * added partial support for "TCMP"/"TCP" ID3v2 frames (iTunes 580 non-standard part-of-a-compilation tag) 581 (thanks aaron_stormØyahoo*com) 582 * slightly improved scanning through FLV files speed 583 (thanks franki) 584 * faster Matroska scanning by stopping at cluster chunks once 585 needed header chunks are found (much faster for large files) 586 * added workaround for broken tagging programs that miss terminating 587 null byte for numeric ID3v2.4 genres 588 (thanks yam655Øgmail*com) 589 * Bugfix: MultiByteCharString2HTML() did not escape common HTML 590 special characters like & and ? 591 * Bugfix: cleaned up some malformed HTML errors in demo.browse.php 592 * Bugfix: under Windows files >2GB might not be processed due to 593 "dir" command not finding file with double directory slashes 594 * Bugfix: "MODule (assorted sub-formats)" was falsely matching 595 some random files (e.g. JPEGs) (thanks qwertywin) 596 * Bugfix: suppress PHP_notice on failed SWF-compressed 597 decompression failure (thanks mkron) 598 599 6001.7.8b3: [2008-07-13] James Heinrich 601 » Experimental partial support for files > 2GB (gets filesize 602 from shell call to "dir" or "ls", parse files with PHP only 603 up to 2GB limit). See readme.txt for details on what formats 604 work properly and other limitations 605 » Initial support for Matroska. Has only been tested with a 606 limited number of sample files, please report any bugs 607 » Experimental support for PHP-RAR reading. Known buggy, disabled 608 by default, enable with care 609 ¤ getid3_lib::CastAsInt() now returns ints up to 2^31 (not 2^30) 610 ¤ Quicktime: [video] now returns [frame_rate] and [fourcc] for MP4 611 video files 612 * MP3: headerless VBR files now only have up to 10 blocks of 5000 613 frames each scanned by default and bitrate extrapolated from that 614 distribution for speed (thanks glau*stuffØridiculousprods*com) 615 * Quicktime: support "co64" atom 616 * SWF: lower memory use when compressed SWF files processed 617 (thanks doughammondØblueyonder*co*uk) 618 * Bugfix: FLV height and width was calculated incorrectly 619 (thanks moysevichØgmail*com) 620 * Bugfix: FLV GETID3_FLV_TAG_META parsed incorrectly 621 (thanks moysevichØgmail*com) 622 * Bugfix: Quicktime: 'tkhd' matrix_v and matrix_d were switched 623 (thanks rjjmoroØhotmail*com) 624 * Bugfix: Quicktime: frame_rate was often incorrect for MP4 video 625 * Bugfix: getid3_lib::CastAsInt returned -2147483648 when passed 626 2147483648 (0x80000000) 627 628 6291.7.8b2: [2007-10-15] James Heinrich, Allan Hansen 630 * Video bitrate now calculated even if not explicitly stated in 631 file metadata, but if overall and audio bitrates are known 632 * Bugfix: 'comments_html' missing last letter in id3v2 tags. 633 * Bugfix: module objects (e.g. getid3_riff) that are instantiated 634 in other modules are explicitly disposed once no longer needed. 635 * Bugfix: some AVI files were not returning audio information 636 because "strh" chunk was not being read in 637 * Bugfix: asf [audio][<streamnumber>][dataformat] should be set 638 to "wma" but wasn't 639 * Bugfix: [mpeg][audio][bitrate_mode] should always be one of 640 ("cbr", "vbr", "abr") but wasn't for some values in 641 LAMEvbrMethodLookup() 642 * Bugfix: MP3 audio in AVI files could show "cbr" instead of 643 correct audio bitrate_mode, and audio bitrate could be slightly 644 incorrect if multiple files were scanned in a loop (scanning 645 single files produced correct values). 646 * Bugfix: remove [audio/video][bitrate] key if falsely set to zero 647 * Bugfix: PlaytimeString returned non-matching value for negative 648 playtimes (which shouldn't happen either, but now they're at 649 least shown correctly, if they happen due to other bugs) 650 * Bugfix: Several ASF header values are invalid if the broadcast 651 flag is set, getID3() now calculates these values in other 652 ways if the broadcast flag is set (thanks fletchØpobox*com) 653 * Bugfix: lyrics3-flags-lyrics field was always false, and there 654 never was a lyrics3-flags-timestamp field present even though 655 the lyrics3-raw-IND field consisted of "10" (lyrics present, 656 timestamp not present). (thanks i*f*schulzØweb*de) 657 * Bugfix: TAR.GZ files produce PHP errors when 658 option_gzip_parse_contents == true in module.archive.gzip.php 659 (thanks alan*harderØsun*com) 660 661 6621.7.8b1: [2007-01-08] Allan Hansen 663 » Major update to readme.txt 664 » PHP 4.2.0 required 665 » Tagwriter requires metaflac 1.1.1+ in order to write FLAC tags. 666 » Removed broken and non-fixable tagwriting module for real format. 667 ! Developers please help fix the above module: 668 https://www.getid3.org/phpBB3/viewtopic.php?t=677 669 » Avoided security issues with demo.browse.php, demo.write.php and 670 demo.mysql.php. These demos are now disabled by default and has 671 to be enabled in the source. 672 * Bugfix: id3v2 genre broken since 1.7.7. 673 » Added DTS module (module.audio.dts.php) 674 ¤ ASF/WMV files now return largest video stream dimensions in 675 [video][resolution_x] and [video][resolution_y] 676 * Bugfix: Minor issues with midi module (avoid PHP_NOTICE). 677 * Bugfix: Minor issues with lyrics3 (avoid PHP_NOTICE). 678 * Bugfix: PHP_NOTICE issues in MultiByteCharString2HTML() 679 * Bugfix: PHP_NOTICE issue in BigEndian2Float() 680 * Bugfix: fread() zero bytes issue in real module. 681 * Bugfix: ASF module returned mime type video/x-ms-wma instead of 682 video/x-ms-wmv for certain FourCCs. 683 * Bugfix: PHP_NOTICE issues with broken ID3v2 tag/garbage. 684 * Bugfix: PNG module broken in regards to gIFg and gIFx chunks. 685 » Removed detection of short filenames 8dot3 under windows, as 686 it only worked for English versions of windows and has other 687 problems. 688 * Bugfix: Some CBR MP3 files detected as VBR with plenty of warnings. 689 * Bugfix: PHP_NOTICE issues in MP3 module. 690 * Bugfix: Quicktime returned incorrect frame rate. 691 * Bugfix: DivByZero on zero length FLV files. 692 * Bugfix: PHP_NOTICE one some FLV files. 693 * Bugfix: ID3v2 UTF-8/16 encoded frames terminated by \x00 694 * Bugfix: ID3v2 LINK frames iconv error. 695 * Bugfix: ID3v2 padding length calculated incorrectly. 696 * Bugfix: ID3v2.3 extended headers non-conformance 697 » SVG file detection. 698 » Added SVG user module (user_modules/module.graphic.svg.php). 699 Thanks to Roan Horning. 700 » PAR2 file detection (no parsing) 701 * Bugfix: Wave files being detected as MP3. 702 * Bugfix: ASF padding offset bug. 703 * Bugfix: Shorten module not working for wav files with fmt 704 chunks <> 16 bytes. 705 ¤ RIFF: Zero sized chunk invokes warning instead of error. 706 ¤ FLAC: Removed some ['raw'] keys. 707 ¤ MPC: Mime type returned: audio/x-musepack 708 7091.7.7: [2006-06-25] Allan Hansen 710 * Bugfix: AAC static bitrate cache wrong result when parsing 711 several files. 712 * Bugfix: Do not return NULL video bitrate for ASF v3. 713 * Bugfix: getid3_lib::GetImageSize() broken => JPG module broken. 714 * Bugfix: Encoder options should now be returned with correct 715 "--alt-preset n" / "--alt-preset cbr n" when scanning more files. 716 * Bugfix: Shorten module not escapeshellarg() filenames (UNIX only). 717 * Bugfix: Filenames not escapeshellarg() for md5_data and 718 sha1_data (UNIX only). 719 * Bugfix: UNIX: head and tail called with -cNNN instead of "-c NNN". 720 » Added detection support for PDF and MS Office documents 721 (*.doc, *.xls, *.pps, etc) (thanks zeromassmediaØgmail*com) 722 ¤ Bugfix: ID3v2 "TDRC" frame now used as "year" in comments if TYER 723 unavailable (TYER is deprecated in ID3v2.4) 724 (thanks matthiasØpanczyk*org) 725 ¤ Removed GETID3_OS_DIRSLASH, replaced with DIRECTORY_SEPARATOR 726 * Bugfix: added LAME preset guessing for presets 410,420,440,490 727 (thanks adminØlogbud*com) 728 * Bugfix: Added escapeshellarg() call in getid3_lib::hash_data 729 (thanks towbØgmx*net) 730 » TAR module no longer reads entire file into memory 731 » FLV module no longer reads entire file into memory 732 * Bugfix: added LAME preset guessing for presets 410,420,440,490 733 (thanks adminØlogbud*com) 734 * Bugfix: Added escapeshellarg() call in getid3_lib::hash_data 735 (thanks towbØgmx*net) 736 * Bugfix: Error message when padding in FLAC files were used up. 737 * Bugfix: Shorten module not working under windows. 738 ¤ Bugfix: gmmktime() instead of mktime(). 739 ¤ Using gmmktime() instead of mktime() in ISO, ZIP, PNG and RIFF 740 modules to avoid E_STRICT notices with PHP5.1+. 741 * Bugfix: ['comments_html'] and ['comments'] contains different 742 value when having multiple tags (one of them ID3v1) and the 743 long field names. 744 7451.7.6: [2006-03-12] James Heinrich 746 * Rewrote getid3_lib::GetDataImageSize() to use GetImageSize() 747 instead of using code by filØrezox*com 748 * Bugfix: incorrect dimensions from disabled Quicktime tracks 749 (thanks m-1Øgmx*net) 750 * Bugfix: ['codec'] key warning in module.audio-video.asf.php 751 (thanks niel*archerØblueyonder*co*uk) 752 * Bugfix: undefined array in write.php 753 (thanks drewishØkatherinehouse*com) 754 * Bugfix: DeleteAPEtag() incorrectly failing when no tag present 755 (thanks drewishØkatherinehouse*com) 756 * Bugfix: ID3v2 writing frames with URL fields failing when URL 757 is not in ISO-8859-1 (thanks drewishØkatherinehouse*com) 758 * Bugfix: PHP notices on bad ID3v2 frames 759 (thanks cw264701Øohiou*edu) 760 * Bugfix: audio & video bitrates sometimes wrong in ASF files 761 (thanks kris_kauperØexcite*com) 762 7631.7.5: [2005-12-29] James Heinrich 764 » Added FLV (FLash Video) support -- new file: 765 module.audio-video.flv.php 766 (thanks Seth Kaufman <seth@whirl-i-gig.com> for code) 767 » Real tags can now be written (previous Real tag writing 768 code was not supposed to be in public releases, as it 769 was not complete) 770 » GETID3_HELPERAPPSDIR now autodetected under Windows 771 ¤ ASF lyrics now returned under [comments][lyrics] 772 * Bugfix: removed "--lowpass xxxxx" info from guessed 773 LAME presets when source frequency <= 32kHz 774 * Bugfix: ID3v2 extended header errors 775 * Bugfix: missing ob_end_clean() in write.id3v2.php 776 (thanks rasherØgmail*com) 777 7781.7.4: [2005-05-04] James Heinrich 779 ¤ Added ['quicktime']['hinting'] key (boolean) 780 (thanks jonØwebignition*net) 781 * Bugfix: major UTF-8 to UTF-16/ISO-8859-1 conversion 782 bug (empty string returned) when using iconv_fallback 783 (thanks chrisØfmgp*com) 784 * Bugfix: Missing 'lossless' key in RIFF-WAV 785 (thanks bobbfwedØcomcast*net) 786 7871.7.3: [2005-04-22] James Heinrich 788 » Added TAR support -- new file: module.archive.tar.php 789 (thanks Mike Mozolin <teddybearØmail*ru> for code!) 790 » Added GZIP support -- new file: module.archive.gzip.php 791 (thanks Mike Mozolin <teddybearØmail*ru> for code!) 792 * Bugfix: demo.browse.php now displays embedded images 793 internally instead of passing local filename as IMG 794 SRC (should allow demo.browse.php to correctly show 795 embedded images over a network) 796 (thanks patpowermanØhotmail*com) 797 * Bugfix: minor UTF-8 display issues in demo.browse.php 798 * Bugfix: demo.browse.php now works even if the evil 799 setting magic_quotes_gpc is turned on 800 (thanks patpowermanØhotmail*com) 801 * Bugfix: incorrect MIDI playtime for some files 802 (thanks joelØoneporpoise*com) 803 * Bugfix: 'url_source' typo in module.tag.id3v2.php 804 (thanks richardlynchØusers*sourceforge*net) 805 * Bugfix: Quicktime 'mvhd' matrix values were wrong 806 (thanks webØbobbymac*net) 807 ¤ ID3v2 now returns xx/yy for ['track'] (if 808 available), with xx in ['tracknum'] and yy in 809 ['totaltracks']. Previously ['tracknum'] was not 810 available and ['track'] had only xx. 811 Bugfixes and improvements to /demo/demo.mysql.php: 812 - remix/version parsed from tags and stored in 813 database, can be used when renaming files 814 - track number can be used for renaming files 815 816 8171.7.2: [2004-10-18] Allan Hansen 818 » Added support for WavPack v4.0+ 819 (thanks ahØartemis*dk) 820 » Removed code for parsing EXE files 821 (thanks ahØartemis*dk) 822 Removed file: module.misc.exe.php 823 * Bugfix: Large ID3v2 tags inside ASF not parsed 824 properly under PHP5. 825 * Bugfix: Certain Wavpack3 files failed under PHP5 due 826 to new undocumented tmpfile() limit (same problem as 827 above). 828 * Bugfix: New iTunes crashes PHP - temp fix - no tags 829 on those files. 830 * Bugfix: ['nsv']['NSVs']['framerate_index'] might be 831 wrong (thanks ahØartemis*dk) 832 * Bugfix: transparent color was wrong from truecolor 833 PNG (thanks ahØartemis*dk) 834 * Bugfix: Changed MPC SV7 header size from 30 to 28, 835 this will change hash values for MPC files 836 (thanks ahØartemis*dk) 837 * Bugfix: Changed MPC SV4-6 header size from 28 to 8, 838 this will change hash values for MPC files 839 (thanks ahØartemis*dk) 840 ¤ Trim/unset wavpack encoder_options to match 2.0.0b2 841 output. 842 ¤ Commented-out unknown/unused values in NSV and ISO 843 modules (thanks ahØartemis*dk) 844 845 8461.7.1b1: [July-26-2004] James Heinrich 847 » Added support for Apple Lossless Audio Codec 848 » Added support for RealAudio Lossless 849 » Added support for TTA v3 850 » Added support for TIFF 851 New file: /getid3/module.graphic.tiff.php 852 » Modified iconv_fallback to work with UTF-8, UTF-16, UTF-16LE, 853 UTF-16BE and ISO-8859-1 even if iconv() and/or XML support is 854 not available. This means that iconv() is no longer required 855 for most users of getID3() 856 (thanks Jeremia, khleeØbitpass*com) 857 » Added support for Monkey's Audio v3.98+ (thanks ahØartemis*dk) 858 » Included new demo showing most-basic getID3() usage 859 New file: /demos/demo.basic.php 860 * Bugfix: LAME3.94+ presets cached incorrectly if multiple files 861 are scanned in one batch and first file is LAME3.93 or earlier 862 (thanks enoyandØyahoo*com) 863 * Bugfix: Added warning if compressed ID3v2 frame decompression 864 fails. (thanks Mike Billings) 865 * Bugfix: Assorted small fixes to ensure compatability with PHP5 866 * Bugfix: ID3v1 genre "Blues" could not be written 867 (thanks Jeremia) 868 * Bugfix: ['bitrate_mode'] typo in module.audio-video.real.php 869 (thanks asukakenjiØusers*sourceforge*net) 870 * Bugfix: ['zip']['files'] is now populated with filenames even 871 if End Of Central Directory couldn't be parsed 872 * Bugfix: ['audio']['lossless'] was incorrect for FLAC 873 (thanks WaldoMonster) 874 * Bugfix: MD5 File was incorrect in directory browse mode for 875 /demo/getid3.browse.php 876 * Bugfix: PHP v5 compatability changes (float array keys, fread() 877 calls with zero data length) 878 (thanks getid3Øjsc*pp*ru) 879 * Bugfix: was dying if on compressed ID3v2 frames if 880 gzuncompress() function was unavailable 881 * Bugfix: ['vqf']['COMM'] was always empty 882 * Bugfix: MIDI playtime was missing for single-track MIDI files 883 * Bugfix: removed � characters from ['comments_html'] 884 (thanks p*quaedackersØplanet*nl) 885 * Bugfix: improved MIDI playtime accuracy 886 (thanks joelØoneporpoise*com) 887 * Bugfix: BMP subtypes 4 and 5 were not being identified 888 * Bugfix: frame_rate in AVI was incorrectly truncated to integer 889 * Bugfix: FLAC cuesheet track index was incorrect 890 (thanks tetsuo*yokozukaØoperamail*com) 891 ¤ ['quicktime']['display_scale'] now contains the playback scale 892 multiplier for QuickTime movies - a movie set to playback at 893 double-size will have "2" here. Other values are "1" and "0.5" 894 ¤ Added LAME preset guessing for --preset medium with v3.90.3 895 (thanks phwipØfish*co*uk) 896 ¤ Added $encoding_id3v1 to allow for ID3v1 encodings other than 897 the standard ISO-8859-1 898 ¤ Default AVI video bitrate_mode is now 'vbr' 899 (thanks eltoderØpisem*net) 900 Force getID3() to abort if Shorten files have ID3 or APE tags 901 (thanks ahØartemis*dk) 902 Editable textbox for parent directory in demo.browse.php 903 (thanks eltoderØpisem*net) 904 905 9061.7.0-hotfix [2004-03-17] Allan Hansen 907 (hotfix version released by Allan Hansen) 908 * Bugfix: PHP 4.1.x compatiblity - fgets($fp) => fgets($fp, 1024) 909 * Bugfix: Added default charset to TextEncodingNameLookup() in 910 module.tag.id3v2.php 911 Ø Removed option_no_iconv 912 iconv() support is only a requirement for WMA/WMW/ASF, and for 913 destination encodings other than ISO-8859-1 and UTF-8, iconv is 914 not needed otherwise. New 'iconv_req' in GetFileFormatArray() 915 only set for WMA/WMV/ASF. analyze() now refuses to analyse 916 WMA/ASF file if iconv is not present. 917 iconv_fallback() only dies on internal errors not missing iconv() 918 919 9201.7.0: [January-19-2004] James Heinrich 921 » Added support for RIFF/CDXA files (MPEG video in RIFF container 922 format (thanks chrisØdigitekdesign*com) 923 » Added support for TTA v2 (thanks ahØartemis*dk) 924 ¤ ID3v2 unsynchronisation scheme disabled by default because most 925 tag-reading programs cannot read unsynchronised tags. Can be 926 overridden by setting id3v2_use_unsynchronisation to true. 927 (thanks mikeØdelusion*org) 928 ¤ extention.*.php renamed to extension.*.php 929 (thanks tp62Øcornell*edu) 930 ¤ /demo/demo.check.php renamed to /demo/demo.browse.php 931 ¤ Added id3v2_paddedlength configuration parameter to WriteTags() 932 and renamed tag_language to id3v2_tag_language 933 ¤ MPEG audio layers are now represented as 1, 2 or 3 instead of 934 'I', 'II', or 'III' 935 ¤ Added [audio][wformattag] and [video][fourcc] for WAV and AVI 936 ¤ Added [audio][streams] which contains one entry for each audio 937 stream present in the file (usually only one). The data is a 938 copy of what is usually found in [audio]. If there are multiple 939 audio streams then [audio] will contain a sum of the bitrates 940 of all audio streams, and the data format of the first stream 941 (if streams are of different data types) 942 ¤ Added BruteForce mode to mp3 scanning. Disabled by default as 943 it is extremely slow and only files that are broken enough to 944 not really play will gain any benefit from this. 945 ¤ Suppress '--resample xxxxx' appended to encoder options for mp3 946 with low-quality presets for default sampling frequencies 947 ¤ Enhanced LAME preset guessing for pre-3.93 with a better lookup 948 table, --resample/--lowpass guessing (thanks phwipØfish*co*uk) 949 ¤ RIFF files with non-MP3 contents no longer have 950 [audio][encoder_options] set 951 ¤ Added [audio][encoder_options] to audio formats where possible 952 (including LiteWave, LPAC, OptimFROG, TTA) 953 ¤ Moved [quantization] and [max_prediction_order] from 954 [lpac][flags] to just [lpac] 955 ¤ WavPack flags are now parsed into [wavpack][flags] 956 * Bugfix: APEtags with ReplayGain information stored with comma- 957 seperated decimal values (ie "0,95" instead of "0.95") were 958 giving wrong peak and gain values 959 * Bugfix: Filesize > 2GB not always detected correctly 960 * Bugfix: Some ID3v2 frames had data key unset incorrectly 961 (thanks chrisØdigitekdesign*com) 962 * Bugfix: Warnings on empty-strings-only comments 963 * Bugfix: ID3v2 tag writing may have had incorrect padding length 964 if padded length less than current ID3v2 tag length and 965 merge_existing_data is false (thanks mikeØdelusion*org) 966 * Bugfix: hash_data() for SHA1 was broken under Windows 967 * Bugfix: BigEndian2Float()/LittleEndian2Float() were broken 968 * Bugfix: LAME header calculated track peaks were incorrect for 969 LAME3.94a15 and earlier 970 * Bugfix: AVIs with VBR MP3 audio data reported incorrect bitrate 971 and bitrate_mode 972 * Bugfix: AVIs sometimes had incorrect or missing video and total 973 bitrates 974 * Bugifx: AVIs sometimes had incorrect ['avdataend'] and 975 therefore also incorrect data hashes (md5_data, sha1_data) 976 * Bugfix: ID3v1 genreid no longer returned for Unknown genre 977 * Bugfix: ID3v1 SCMPX genres were broken 978 Modified LAME header parsing to correctly process peak track 979 value for LAME3.94a16+ (thanks Gabriel) 980 md5_file() and sha1_file() now work under Windows in PHP < 4.2.0 981 and 4.3.0 respectively with helper apps 982 Default md5_data() tempfile location is now system temp directory 983 instead of same directory as file (thanks towbØtiscali*de) 984 Improved list of RIFF ['INFO'] comment key translations 985 More helpful error message when GETID3_HELPERAPPSDIR has spaces 986 /demo/demo.browse.php now autogets both MD5 and SHA1 hashes for 987 files < 50MB 988 Replaced PHP_OS comparisons with GETID3_OS_ISWINDOWS define 989 (thanks necroticØusers*sourceforge*net) 990 991 9921.7.0b5: [December-29-2003] James Heinrich 993 » Windows only: Various binary files are now required for some 994 file formats, especially for tag writing, as well as md5sum 995 (and other) calculations. These binaries are now stored in the 996 directory defined as GETID3_HELPERAPPSDIR in getid3.php 997 (default is /helperapps/ parallel to /getid3/). 998 Note: This directory must not have any spaces in the pathname. 999 All neccesary files are available as a seperate download. 1000 See /helperapps/readme.txt for more information 1001 New file: /helperapps/readme.txt 1002 » Unified tag-writing interface for all tag formats 1003 New file: /getid3/write.php 1004 /getid3/write.apetag.php 1005 /getid3/write.id3v1.php 1006 /getid3/write.id3v2.php 1007 /getid3/write.lyrics3.php 1008 /getid3/write.metaflac.php 1009 /getid3/write.vorbiscomment.php 1010 » Added support for Shorten - requires shorten binary (head.exe 1011 is also required under Windows). 1012 New file: /getid3/module.audio.shorten.php 1013 » Added support for RKAU 1014 New file: /getid3/module.audio.rkau.php 1015 » Added (minimal) support for SZIP 1016 New file: /getid3/module.archive.szip.php 1017 » Added MySQL caching extention (thanks ahØartemis*dk) 1018 New file: /getid3/extention.cache.mysql.php 1019 » Added DBM caching extention (thanks ahØartemis*dk) 1020 New file: /getid3/extention.cache.dbm.php 1021 » Added sha1_data hash option (thanks ahØartemis*dk) 1022 » Added option to allow getID3() to skip ID3v2 without parsing it 1023 for faster scanning when ID3v2 data is not required. If you 1024 want to enable this feature delete /getid3/module.tag.id3v2.php 1025 (thanks ahØartemis*dk) 1026 ¤ 8-bit WAV data now calculates MD5 checksums as normal, not 1027 converting to signed data as before, so stored md5_data_source 1028 in FLAC files will no longer match md5_data for the equivalent 1029 decoded 8-bit WAV. A warning will be generated for 8-bit FLAC 1030 files 1031 ¤ Added option_no_iconv option to allow getID3() to work 1032 partially without iconv() support enabled in PHP 1033 (thanks ahØartemis*dk) 1034 ¤ All '*_ascii' keys removed for ASF/WMA/WMV files 1035 ¤ All 'ascii*' keys removed for ID3v2 tags 1036 ¤ Ogg filetypes now return MIME of "application/ogg" instead of 1037 the previous "application/x-ogg" 1038 (thanks blakewattersØusers*sourceforge*net) 1039 ¤ Force contents of ['id3v2']['comments'] to UTF-8 format from 1040 whatever encoding each frame may have (text encoding can vary 1041 from frame to frame in ID3v2) 1042 ¤ MP3Gain information from APE tags suppressed from ['tags'] and 1043 parsed into ['replay_gain'] 1044 ¤ ReplayGain information (all formats) changed from "Radio" and 1045 "Audiophile" to "Track" and "Album" respectively 1046 ¤ ['volume'] and ['max_noclip_gain'] are now available in both 1047 ['replay_gain']['track'] and ['replay_gain']['album'] for all 1048 formats that calculate ReplayGain. 1049 ¤ ['video']['total_frames'] is available for AVIs 1050 ¤ All parsed ID3v2 frame data is now in ['id3v2'][XXXX][#] 1051 (previously some frame types would have numeric array keys if 1052 multiple instances of that frame type were allowed and other 1053 frame types would not) 1054 ¤ ASF/WMA "WM/Picture" images are now parsed in the same manner 1055 as ID3v2 with the image (ex JPEG) data returned in [data] 1056 rather than [value] 1057 * Bugfix: Optional tag processing options were being ignored (ie 1058 ID3v1 still processed even if option_tag_id3v1 == false) 1059 (thanks ahØartemis*dk) 1060 * Bugfix: fixed MultiByteCharString2HTML() for UTF-8 1061 * Bugfix: Quicktime files not always reporting video frame_rate 1062 * Bugfix: False ID3v1 synch patterns in APE or Lyrics3 tags are 1063 now detected and incorrect ID3v1 data not returned 1064 (thanks sebastian_maresØusers*sourceforge*net for the idea) 1065 * Bugfix: WMA9 Lossless now reported as lossless 1066 * Bugfix: two typos in ID3v1 genre list 1067 * Bugfix: MPEG-2/2.5 ABR/VBR MP3 files had doubled playtime 1068 * Bugfix: MPEG-2/2.5 LayerII (ie MP2: 24/22.05/16kHz) files were 1069 not detected due to incorrect frame length calculation 1070 * Bugfix: MPEG LayerI files were not detected due to incorrect 1071 frame length calculation (must be multiple of slot length) 1072 Added alternative md5_data via system call - twice as fast. Needs 1073 "getID3()-WindowsSupport" to work under Windows. 1074 (thanks ahØartemis*dk) 1075 ID3v2.4 compressed frames are now supported 1076 php_uname() calls changed to use PHP_OS constant 1077 Added SCMPX extensions to ID3v1 genres (0xF0-0xFE) 1078 Obfuscated contributor email address in changelog and sourcecode 1079 Added memory-saving EmbeddedLookup() function for lookup tables 1080 in RIFF and ID3v2 modules (thanks ahØartemis*dk) 1081 Major memory patches to many modules by using 1082 $var = &$INFO_ARRAY_AT_SOME_INDEX 1083 in place of large multi-dimensional array declarations. 1084 Memory saved: RIFF: ~200kB; ID3v2: ~475kB; ASF: ~50kB etc. 1085 (thanks ahØartemis*dk) 1086 1087 10881.7.0b4: [November-19-2003] James Heinrich 1089 » Support added for MPC files with old SV4-SV6 structure 1090 » RealVideo now properly supported with resolution, framerate, etc 1091 (thanks jcsston) 1092 » RealAudio files with old-style file format (v2-v4) are now 1093 fully supported 1094 » Support added for DolbyDigital WAV files (thanks ahØartemis*dk) 1095 ¤ ['RIFF'] is now ['riff'] to conform to make all root key names 1096 lowercase 1097 ¤ ['OFR'] is now ['ofr'] to conform to make all root key names 1098 lowercase 1099 ¤ ['tags_html'] is now available as a copy of ['tags'] but 1100 with all text replaced with an HTML version of all characters 1101 above chr(127), translated according to whatever the encoding 1102 of the source tag is, in the HTML form Ӓ 1103 ¤ CopyTagsToComments() is now available in getid3_lib 1104 ¤ QuicktimeVR files now return a ['video']['dataformat'] of 1105 'quicktimevr' instead of 'quicktime' (thanks gtsØtsu*biz) 1106 ¤ Quicktime video files with DivX, Xvid, 3ivx or MPEG4 video 1107 streams now return those names as ['video']['dataformat'] 1108 ¤ MPEG video files are now identified with ['video']['codec'] set 1109 to either 'MPEG-1' or 'MPEG-2' (rather than just 'MPEG'). If you 1110 see a file wrongly identified, please report it! 1111 (thanks fccHandler) 1112 ¤ All bitrate values in ['mpeg']['audio'] is now reported in bps 1113 rather than kbps (ie 128000 instead of 128) for consistancy 1114 ¤ AVIs with MP2 audio now report ['audio']['dataformat'] as 'mp2' 1115 rather than 'wav' (thanks metalbrainØnetian*com) 1116 ¤ Added ['md5_data_source'] for OptimFROG 1117 ¤ AC3 in RIFF-WAV now identified with ['audio']['dataformat'] 1118 returning 'ac3' 1119 ¤ WavPack ['extra_bc'] now returned as integer 1120 ¤ WavPack ['extras'] now returned as 3-element array of integers 1121 ¤ MP3 ['audio']['encoder options'] now returns 'VBR' or 'CBR' only 1122 (no bitrate) if no LAME preset is used, or 'VBR q??' where ?? is 1123 a number 0-100 for Fraunhofer-encoded VBR MP3s 1124 * Bugfix: VBR MP3s could have incorrect bitrate reported 1125 * Bugfix: Quicktime files with MP4 audio were not returning 1126 ['video']['dataformat'] (thanks robØmassive-interactive*nl) 1127 * Bugfix: strpad vs str_pad typo in module.riff.php 1128 (thanks nicojunØusers*sourceforge*net) 1129 * Bugfix: ReplayGain information was often wrong for MPC files 1130 * Bugfix: MD5 and other post-TAIL chunks were not being processed 1131 in module.audio.optimfrog.php 1132 * Bugfix: Undefined variable in table_var_dump() in demo/check.php 1133 * Bugfix: QuickTime files now only return information in [audio] 1134 or [video] if those exist in the file 1135 * Bugfix: WavPack no longer tries to read entire compressed data 1136 chunk 1137 * Bugfix: Properly handle VBR MP3s with "Info" (rather than 1138 "Xing") header frame. foobar2000 adds this to MP3 files when 1139 "Fix MP3 Header" function is used (thanks ahØartemis*dk) 1140 * Bugfix: Fraunhofer VBRI headers for MP3s were assuming 2-byte 1141 entries for TOC rather than using stride, and were ignoring the 1142 scaling value. (thanks sebastianØmaresweb*net) 1143 Several QuickTime atoms have been added to an exclusion list 1144 because they have been observed, but I have no idea what they 1145 are supposed to do so I can't add real support for them, but 1146 they should not generate warnings (robØmassive-interactive*nl) 1147 Old MPC encoder (before v1.06) was return as v0.00, now returned 1148 as 'Buschmann v1.7.0-v1.7.9 or Klemm v0.90-v1.05' 1149 (thanks ahØartemis*dk) 1150 Added check for magic_quotes_runtime and code to disable it if 1151 neccesary (thanks stefan*kischkelØt-online*de) 1152 Added 3ivx fourCCs to module.audio-video.quicktime.php 1153 MP3 and AC3 streams are now parsed when contained inside RIFF-WAV 1154 or RIFF-AVI container formats 1155 Better detection of named presets in LAME 3.93/3.94 1156 1157 11581.7.0b3: [October-17-2003] James Heinrich 1159 » AC-3 (aka Dolby Digital) is now supported. 1160 New file: /getid3/module.audio.ac3.php 1161 * Bugfix: ID3v2-writing function Unsynchronise() was broken, which 1162 made ID3v2 tag containing binary data (typically pictures) get 1163 corrupted. (thanks t*coombesØbendigo*vic*gov*au, 1164 i*kuehlbornØndh*net, mikeØdelusion*org, mikeØftl*com) 1165 * Bugfix: Zip comments now returned as array instead of string, 1166 as they're supposed to be. 1167 * Bugfix: Quicktime/MP4 files may have reported extremely low 1168 bitrates (thanks spunkØdasspunk*com) 1169 Improved double-ID3v1 check to prevent false detection when string 1170 "TAG" is present in APE or Lyrics3 1171 Fixed /demo/simple.php 1172 Fixed /demo/joinmp3.php 1173 Fixed /demo/mimeonly.php 1174 Fixed /demo/write.php 1175 1176 11771.7.0b2: [October-15-2003] James Heinrich 1178 » TTA Lossless Audio Compressor format now supported. 1179 (http://tta.iszf.irk.ru) 1180 New file: /getid3/module.graphic.tta.php 1181 » PhotoCD (PCD) format now supported. Image data for the three 1182 lowest resolutions (192x128, 384x256, 768x512) can be optionally 1183 extracted. 1184 New file: /getid3/module.graphic.pcd.php 1185 ¤ RIFF-MP3 files now should return the same ['md5_data'] as the 1186 identical MP3 file outside the RIFF container 1187 ¤ Name of LAME preset used (if available, needs LAME v3.90+) 1188 returned in ['mpeg']['audio']['LAME']['preset_used'] and also as 1189 part of ['audio']['encoder_options'] 1190 ¤ VQF module now sets ['audio']['encoder_options'] to i.e. CBR96 1191 ¤ MP3 module now sets ['audio']['encoder_options'] on CBR files 1192 and all LAME-encoded files 1193 ¤ MPC module now sets ['audio']['encoder_options'] 1194 ¤ Monkey module now sets ['audio']['encoder_options'] 1195 ¤ AAC module now sets ['audio']['encoder_options'] to profile name 1196 ¤ ASF module now sets ['audio']['encoder_options'] 1197 ¤ Ogg module adds ['audio']['encoder_options'] -b 128 on 1198 Ogg Vorbis 1.0+ ABR files 1199 ¤ Ogg module adds ['audio']['encoder_options'] -q N on 1200 Ogg Vorbis 1.0+ VBR files 44k/48k sample rate/stereo files only. 1201 ¤ Ogg module ['audio']['encoder_options'] "Nominal birate: 80k" to 1202 other Ogg Vorbis files. 1203 ¤ ID3v2 track number now returned as string (with leading zeros, 1204 if present in data) rather than integer (thanks Plamen) 1205 ¤ ASF module returns ['asf']['comments']['encoding_time_unix'] if 1206 available (from WM/EncodingTime) 1207 ¤ Fixed /demo/mysql.php and added some new features: 1208 - encoder options 1209 - ID3v2 "Encoded By" 1210 - non-empty comments 1211 - total entries in database summary (totals & averages) 1212 - database version update 1213 * Bugfix: 'UNICODE' iconv() charset changed to 'UTF-16LE' or 1214 'UTF-16BE' as appropriate 1215 * Bugfix: iconv_fallback() function created in case iconv() fails 1216 * Bugfix: fixed MD5 calls in demo/check.php 1217 * Bugfix: reenabled detection of APE + Lyrics3 tags in same file 1218 * Bugfix: ASF module now returns ID3v1 genre as string instead of 1219 number - patch from Eugene Toder. 1220 * Bugfix: ASF module now reads non-standard field names, 1221 i.e. "date" as well as WM/Year - patch from Eugene Toder. 1222 * Bugfix: ASF module now returns genre as-is if it is not a 1223 standard ID3v1 genre (thanks wonderboy) 1224 * Bugfix: Eliminated false-synch problem in MP3 module 1225 * Bugfix: Fixed missing root ['bitrate'] for most formats 1226 * Bugfix: ['audio']['compression_ration'] missing for MPC 1227 (thanks WaldoMonster) 1228 * Bugfix: NSV module died in 1.7.0b1 1229 * Bugfix: ASF module died in 1.7.0b1 when WM/Picture preset 1230 * Bugfix: ASF tracknumber incorrect when specified by WM/Track 1231 rather than WM/TrackNumber (thanks jgriffiniiiØhotmail*com) 1232 * Bugfix: MPEG audio+video playtime should now be pretty accurate 1233 (ie within 0.1% variation at most) 1234 (thanks mgrimmØhealthtvchannel*org) 1235 * Bugfix: ID3v2 not being copied to ['tags'] in some cases 1236 * Bugfix: LAME CBR files with Info tag were being incorrectly 1237 flagged as VBR (thanks Jojo) 1238 * Bugfix: LAME tag not being detected for LAME 3.90 (original) 1239 Changed regex pattern match for MP3 to include 3rd byte for more 1240 reliable/accurate pattern matching 1241 Added duplicate-ID3v1 tag checking (two ID3v1 tags, one after the 1242 other) that has been known to occur with iTunes 1243 (thanks towbØtiscali*de) 1244 Added instructions for enabling iconv() support under Windows 1245 Removed some unneccesary debugging code 1246 Suppressed duplicate PHP warnings for missing include files 1247 Included some missing dependencies in various files 1248 /demo/audioinfo.class.php now copies ['audio']['encoder_options'] 1249 1250 12511.7.0b1: [2003-09-28] Allan Hansen 1252 This beta version was not made by James Heinrich. It was made by 1253 Allan Hansen <ahØartemis*dk> - please send bug reports on this 1254 beta directly to me. 1255 1256 James Heinrich will release 1.7.0 final, but it may take some time 1257 to work out the bugs from the major rewrite. 1258 1259 This version could be called getID3lite. It makes a lot of checks 1260 optional and makes it easy to remove support for undesired formats 1261 1262 It also is more library-like. Older versions of getID3() declared 1263 an incredible amount of global scope functions and defined several 1264 constants. 1.7.0beta1 still declares constants, but they are all 1265 prepended by GETID3_. It declares no global scope functions - they 1266 are all wrapped into classes. 1267 1268 » Made getID3() depend on iconv library: compile PHP --with-iconv 1269 » Created new directory structure 1270 Moved all demos to demos/ 1271 Moved all getID3() files to getid3/ 1272 Renamed most files to module.something 1273 Changed header in all module.something to explain what they do 1274 Simply remove all modules you don't need 1275 Wrapped all modules into classes 1276 * Bugfix: Implemented misc patches from Eugene Toder 1277 * Bugfix: Implemented misc patches from "six" 1278 ¤ Added root key 'encoding' 1279 ¤ Added prefix GETID3_ to all defined constants. 1280 ¤ Wrapped getid3.php into getid3 class 1281 ¤ Wrapped getid3.functions.php into getid3_lib class 1282 Removed unused functions 1283 Moved several functions away from getid3.functions.php and 1284 into the files where they are actually used. 1285 Renamed getid3.functions.php to getid3.lib.php 1286 Moved getid3.rgad.php functions into getid3_lib 1287 Moved getid3.getimagesize.php funcitons ingo getid3_lib 1288 ¤ Moved getid3.ogginfo.php into ogg module 1289 ¤ Combined GetTagOnly() and GetAllFileInfo() in method analyze 1290 ¤ Removed redundant and unuseful root keys 1291 'file_modified_time' == filemtime($filename) 1292 'md5_file' == md5_file($filename) 1293 'exist' == file_exists($filename) 1294 ¤ Changed root key ['tags'] from array of string to array of array 1295 of comments. 1296 Simplified code for detecting base path. 1297 Removed ob_ from InitializeFilepointerArray(). That was really a 1298 ugly HACK to get output from fopen. If user want the reason, 1299 he should open the file himself! 1300 Checking for APE tags before lyrics3 - makes Lyrics3 not depend 1301 on APE tag. It seems to work on my test file. 1302 Changed ['error'] and ['warning'] in multiple files to append to 1303 array instead of appending to string. That simplified code in 1304 getid3.php too. 1305 Simplified clean-up procedure: simply remove all empty root keys 1306 Setting tags in individual modules instead of main getid3.php 1307 Made Bonk and ASF modules non-dependent on id3 modules - id3 1308 optional. 1309 Rewrote HandleAllTags() - simplified and convert comments to 1310 desired encoding. 1311 Replaced all calls to RoughTranslateUnicodeToASCII() in ASF module 1312 with a TrimConvert() method. This uses iconv() for conversion. 1313 It also converts from UNICODE instead of UTF-16BE, as the spec 1314 says it should. 1315 Replaced all calls to RoughTranslateUnicodeToASCII() in id3v2 1316 module with iconv(). id3v2 module also reads 1317 $ThisFileInfo['encoding'] and converts all comments to this 1318 format. All other formats just add their comments in their 1319 native charset, but every comment field in id3v2 can have a 1320 different encoding, so this is needed. 1321 Did same thing as above with ISO module. However - it does not 1322 work. I need to find out how to specify big-endian unicode != 1323 UNICODING encoding name given to iconv(). 1324 Built-in assume mp3 format in getid3.php 1325 Temporarily nuked root key ['comments'] and CopyCommentsToRoot() 1326 Updated demo/audioinfo.class.php 1327 Updated demo/check.php - some thing don't work! 1328 Other demos are out of order! 1329 1330 13311.6.5: [October-06-2003] James Heinrich 1332 » Added support for LiteWave (thanks supportØclearjump*com) 1333 Ø Split out speedup info from ['OFR']['OFR']['compression'] into 1334 ['OFR']['OFR']['speedup'] 1335 Ø If EXIF functions for JPEG not available, now warning not error 1336 Ø ID3v2 track number now returned as string (with leading zeros, 1337 if present in data) rather than integer (thanks Plamen) 1338 * Bugfix: now correctly parses cbSize element of WAVEFORMATEX 1339 structure (thanks supportØclearjump*com) 1340 * Bugfix: ASF module now reads non-standard field names, 1341 i.e. "date" as well as WM/Year - patch from Eugene Toder. 1342 * Bugfix: ASF module now returns genre as-is if it is not a 1343 standard ID3v1 genre (thanks wonderboy) 1344 * Bugfix: ['audio']['compression_ration'] missing for MPC 1345 (thanks WaldoMonster) 1346 Prevent infinite loop in MP3 histogram if framelength == 0 1347 Added wFormatTag values 0x00FF and 0x2001 - 0x2005 1348 (thanks steveØheadbands*com) 1349 Added "twos" and "sowt" FourCCs for Mac AIFC 1350 1351 13521.6.4: [June-30-2003] James Heinrich 1353 » Added support for free-format MP3s 1354 (thanks Sebastian Mares for the idea) 1355 » Compressed (Flash 6+) SWF files are now handled properly 1356 (thanks alan*cheungØalumni*ust*hk) 1357 » Added DeleteLyrics3() to getid3.lyrics3.php 1358 » Added FixID3v1Padding() to getid3.putid3.php 1359 » Added new simple MP3-splicing sample file 1360 (thanks tommybobØmailandnews*com for the idea) 1361 New file: getid3.demo.joinmp3.php 1362 » Moved all contents of getid3.putid3.php into either 1363 getid3.id3v1.php or getid3.id3v2.php or getid3.functions.php as 1364 appropriate 1365 Removed file: getid3.putid3.php 1366 ¤ ['error'] and ['warning'] keys now return as arrays, not strings 1367 ¤ New root key for all files: ['file_modified_time'] (UNIX time) 1368 ¤ getid3.demo.scandir.php renamed to getid3.demo.mysql.php 1369 ¤ New demo file returns the MIME type only for a single file 1370 (thanks adminØe-tones*co*uk for the idea) 1371 New file: getid3.demo.mimeonly.php 1372 ¤ Added check for valid ID3v1 padding (strings should be padded 1373 with null characters but some taggers incorrectly use spaces). 1374 A warning will be generated if padding is invalid. New boolean 1375 key ['id3v1']['padding_valid'] indicates padding validity. 1376 ¤ CleanUpGetAllMP3info() removes more useless root keys for 1377 unknown-format files 1378 ¤ Extended LAME information in ['mpeg']['audio']['LAME'] is now 1379 only returned for LAME v3.90+ 1380 ¤ LAME-encoded MP3s now return 1381 ['mpeg']['audio']['LAME']['long_version'] as well as 1382 ['mpeg']['audio']['LAME']['short_version'] - these are identical 1383 in LAME v3.90+ but older versions will report longer more 1384 detailed version information if available 1385 ¤ New Lyrics3 values: ['lyrics3']['raw']['offset_start'] and 1386 ['lyrics3']['raw']['offset_end'] 1387 ¤ New optional parameter on getAPEtagFilepointer() to scan from a 1388 defined offset rather than end-of-file to allow scanning of APE 1389 tags before Lyrics3 tags 1390 ¤ ['tag_offset_start'] and ['tag_offset_end'] are now present in 1391 ['ape'], ['lyrics3'], ['id3v1'] and ['id3v2'] 1392 ¤ Numerous changes to the returned structure and content for La 1393 files, including parsing the seektable (if applicable) and 1394 parsing RIFF data occuring after the end of the compressed audio 1395 data (notably RIFF comments) 1396 (thanks mikeØbevin*de) 1397 ¤ getSWFHeaderFilepointer() now has optional 3rd parameter 1398 $ReturnAllTagData (default == false) which if set to true will 1399 return data on all tags in ['swf']['tags'] 1400 ¤ ['swf']['bgcolor'] now returns the 6-character string 1401 representing the background color in HTML hex color format 1402 (thanks ubergeekØubergeek*tv) 1403 ¤ ['swf']['header']['frame_delay'] is no longer returned 1404 ¤ getQuicktimeHeaderFilepointer() now has two additional optional 1405 parameters: $ReturnAtomData (default == true) and 1406 $ParseAllPossibleAtoms (default == false). Setting 1407 $ReturnAtomData to false will reduce the size of the returned 1408 data array by unsetting ['quicktime']['moov'] before returning. 1409 Leaving $ParseAllPossibleAtoms as false now suppresses parsing 1410 of several atom types that contain very large tables of data 1411 that are not typically useful. Atom type suppressed are: 1412 stts, stss, stsc, stsz, and stco 1413 (thanks ubergeekØubergeek*tv) 1414 ¤ ['fileformat'] no longer set to 'id3' if ID3v1 or ID3v2 tag 1415 detected but no other data format recognized 1416 * Bugfix: La files now return the correct values for 1417 ['avdataoffset'] and ['avdataend'] and therefore the correct 1418 values for ['md5_data'] - note that ['md5_data'] values will not 1419 match values from previous versions of getID3() - the previous 1420 versions were incorrect 1421 (thanks mikeØbevin*de) 1422 * Bugfix: A temporary file was being created in the web server's 1423 root directory (not DocumentRoot) each time ['md5_data'] was 1424 calculated, and not removed due to lack of permissions. Temp 1425 file is now created (as it was supposed to be) in the directory 1426 of the file being examined, or the system temp directory, and 1427 properly removed when done. 1428 * Bugfix: Several incorrect values were being returned inside 1429 ['mpeg']['audio']['LAME'] (thanks bouvigneØmp3-tech*org) 1430 * Bugfix: SWF frame rates values were usually incorrect. 1431 (thanks alan.cheungØalumni*ust*hk and ubergeekØubergeek*tv) 1432 * Bugfix: ID3v2.2 files always flagged 4 bytes of invalid padding 1433 (thanks marcaØmac*com) 1434 * Bugfix: Lyrics3 without ID3v1 was not working properly 1435 * Bugfix: Lyrics3, APE & ID3v1 can all now exist in the same file. 1436 A warning is issued if APE comes after Lyrics3 (because Lyrics3- 1437 aware taggers probably are not APE-aware and therefore won't be 1438 able to find the Lyrics3 tag) (thanks mp3gainØhotmail*com) 1439 * Bugfix: WriteAPEtag() now writes the APE tag before any Lyrics3 1440 tags (if present) and removes any incorrect ones that are after 1441 existing Lyrics3 tags (thanks mp3gainØhotmail*com) 1442 * Bugfix: RIFF-WAVE file with incorrect NumberOfSamples values in 1443 the 'fact' chunk no longer cause incorrect playtime calculation 1444 (thanks stprasadØindusnetworks*com) 1445 * Bugfix: getid3.demo.simple.php had undefined variables if the 1446 file needed to be deep-scanned with assumeFormat 1447 * Bugfix: fixed previously-incorrect ['avdataend'] values for APE 1448 and Lyrics3 tags in some cases, which in some cases means that 1449 ['md5_data'] is different than previously (now correct) 1450 Much-improved detection of AAC-ADTS, which also means MP3 1451 format detection should now be nearly twice as fast 1452 Truncated AVIs and WAVs are now reported 1453 Number of new features and bugfixes in getid3.demo.mysql.php 1454 Quicktime 'meta' atoms now parsed, so Quicktime MP4 files can now 1455 return artist, title, album, etc (thanks spunkØdasspunk*com) 1456 Consolidated all comments processing functions (processing the 1457 ['comments'] and ['tags'] keys) into HandleAllTags() which now 1458 also checks to ensure that APE tags are really better than ID3v2 1459 before using them in ['comments'] 1460 Known issue with Meracl ID3 Tag Writer v1.3.4 truncating last byte 1461 of MP3 file when appending new ID3v1 tag now specifically noted 1462 (rather than generic Probably Truncated File message) 1463 getid3.demo.mysql.php now stores last-modified time for each file 1464 getid3.demo.mysql.php is now case-sensitive for filenames 1465 getid3.demo.mysql.php can generate M3U playlists of any of the 1466 groups of files it can select (duplicate filenames, tag types, 1467 etc.) 1468 getid3.demo.mysql.php can now find mismatched tag contents and 1469 filenames 1470 getid3.demo.check.php now shows total number of errors & warnings 1471 GetFileFormatArray() now matches actual patterns for MP3 files 1472 based on the first two bytes of the file, rather than just the 1473 first one 1474 Simplified DeleteAPEtag() and made it work properly with Lyrics3 1475 1476 14771.6.3: [May-17-2003] James Heinrich 1478 » Added support for Bonk (thanks ahØartemis*dk) 1479 New file: getid3.bonk.php 1480 » Added support for AVR (thanks ahØartemis*dk) 1481 New file: getid3.avr.php 1482 ¤ Contents of getid3.id3.php moved to getid3.id3v1.php 1483 Removed file: getid3.id3.php 1484 ¤ Contents of getid3.frames.php moved to getid3.id3v2.php 1485 Removed file: getid3.frames.php 1486 ¤ Returned data structure documentation improved and updated and 1487 now stored in getid3.structure.txt rather than getid3.readme.txt 1488 New file: getid3.structure.txt 1489 ¤ Now including the GNU General Public License in the distribution 1490 as getid3.license.txt 1491 New file: getid3.license.txt 1492 ¤ Added new, optional, parameter to WriteAPEtag() (and also 1493 GenerateAPEtag()) which must be set to TRUE if the values you 1494 are passing are already UTF8-encoded, otherwise all data is 1495 encoded to UTF8 by default. For all ASCII/ANSI data this value 1496 should be left at the defaul value of FALSE. 1497 ¤ Added third, optional, parameter to getID3v2Filepointer() - 1498 $StartingOffset (default == 0) which can parse an ID3v2 tag 1499 in a file at a position other than the start-of-file. 1500 ¤ ['video']['pixel_aspect_ratio'] now returned when known 1501 ¤ AVI files with WMA audio now return ['audio']['dataformat'] 1502 of 'wma' rather than 'wav' 1503 ¤ ASF-WMA files now return the artist value from WM/AlbumArtist 1504 in ['comments']['artist'] (thanks msibbaldØsaebauld*com) 1505 ¤ ASF-WMA files now return the 'author' value from 1506 ['asf']['content_description'] in ['comments']['artist'] 1507 instead of ['comments']['author'] 1508 ¤ ASF-WMA files now return the 'description' value from 1509 ['asf']['content_description'] in ['comments']['comment'] 1510 instead of ['comments']['description'] 1511 * Bugfix: APE tag writing with multiple values for a tag (more 1512 than one ARTIST for example) was not being correctly written 1513 (thanks ahØartemis*dk) 1514 * Bugfix: CreateDeepArray() was returning an empty-string key as 1515 the top-level returned value - ['iso']['files'] now directly 1516 contains the file listing without an empty array in between. 1517 * Bugfix: ID3v2 genreid was not being returned in some cases. 1518 * Bugfix: APEv1 tags would generate error messages 1519 * Bugfix: APE tags would sometimes show phantom second entry for 1520 each item (title, artist, etc) with no data 1521 * Bugfix: APE tag writing was not UTF8-encoding the data - 1522 non-ASCII characters (above chr(127)) were being incorrectly 1523 stored (thanks ahØartemis*dk) 1524 * Bugfix: getid3.demo.scandir.php had undefined function error 1525 * Bugfix: getid3.demo.scandir.php would not display list of files 1526 with no tags 1527 Added link to getid3.demo.check.php from list of specific-tags 1528 files in getid3.demo.scandir.php 1529 1530 15311.6.2: [May-04-2003] James Heinrich 1532 » New official mirror site for getID3() - https://www.getid3.org 1533 » Added basic support for SWF (Flash) (thanks n8n8Øyahoo*com) 1534 New file: getid3.swf.php 1535 » Added experimental support for parsing the audio portion of 1536 MPEG-video files. I don't have any actual documentation for 1537 this, so this part is experimental and not guaranteed accurate, 1538 but it seems to be working OK as far as I have been able to test 1539 it. Bug reports (or even better - documentation!) are welcome at 1540 info@getid3.org 1541 » Added new simple directory-scanning sample file 1542 New file: getid3.demo.simple.php 1543 » getid3.demo.write.php now writes APE tags as well. 1544 ¤ Renamed getid3.write.php to getid3.demo.write.php 1545 ¤ Renamed audioinfo.class.php to getid3.demo.audioinfo.class.php 1546 ¤ getid3.php now automatically includes the getid3.functions.php 1547 function library file, no need to include it seperately. 1548 ¤ getLyrics3Filepointer() has been changed to be consistant with 1549 all the other similar function structures - the parameters have 1550 changed. The old function has been renamed to getLyrics3Data() 1551 ¤ Added DeleteAPEtag() function to getid3.ape.php 1552 ¤ HandleID3v1Tag() now only handles ID3v1. Lyrics3 processing is 1553 now done by HandleLyrics3Tag() 1554 ¤ If BitrateHistogram is enabled in getOnlyMPEGaudioInfo() it now 1555 also returns ['mpeg']['audio']['version_distribution'] showing 1556 the number of frames of each MPEG version (1, 2 or 2.5) - all 1557 frames *should* be of the same MPEG version 1558 ¤ getID3v1Filepointer() always returns TRUE now, even if it didn't 1559 find a valid ID3v1 tag 1560 ¤ getOnlyMPEGaudioInfo() now looks for MPEG sync in the first 128k 1561 bytes rather than the first 64k bytes 1562 ¤ Added dummy function GetAllMP3info() to generate warning not to 1563 use that deprecated function. 1564 ¤ ['video']['codec'] is now 'MPEG' for all MPEG video files (this 1565 will change to 'MPEG-1' or 'MPEG-2' as soon as I figure out how 1566 to determine that) (thanks jigalØspill*nl) 1567 ¤ ['mpeg']['audio']['LAME']['mp3_gain'] renamed to 1568 ['mpeg']['audio']['LAME']['mp3_gain_db'] (gain in dB) 1569 ¤ Added ['mpeg']['audio']['LAME']['mp3_gain_factor'] (gain as a 1570 multiplication factor) 1571 ¤ Added support for Preset and Surround Info bytes from LAME VBR 1572 tag (http://gabriel.mp3-tech.org/mp3infotag.html) 1573 * Bugfix: APE tag writing would put the string 'Array' for all 1574 values rather than the actual data (thanks ahØartemis*dk) 1575 * Bugfix: Warning now generated for VBR MPEG-video files because 1576 getID3() cannot determine average bitrate. If you know of 1577 documentation that would tell me how to do this, please email 1578 info@getid3.org 1579 * Bugfix: Replay Gain values from Vorbis comments are now 1580 returned in ['replay_gain'] (and not in ['comments']) 1581 (thanks ahØartemis*dk) 1582 * Bugfix: Replay Gain values from APE comments are now correctly 1583 returned in ['replay_gain'] (thanks ahØartemis*dk) 1584 * Bugfix: getid3.demo.check.php is now case-insensitive when 1585 assuming a format for a corrupted file if standard detection 1586 does not identify the file type. 1587 * Bugfix: RIFF comments were overwriting/suppressing ID3 comments 1588 for RIFF-MP3 files (thanks wmØwofuer*com) 1589 * Bugfix: RIFF-MP3 files with 'RMP3' chunks instead of 'WAVE' were 1590 not being correctly identified. 1591 * Bugfix: ID3v2 padding shorter than the length of an ID3v2 frame 1592 header was not correctly detected 1593 * Bugfix: getid3.demo.check.php now does in-depth scanning for MP2 1594 and MP1 files the same as for MP3 files based on file extension 1595 if a MPEG-audio structure isn't found immediately at the start 1596 of the file 1597 * Bugfix: removed condition where RIFF-WAV was being scanned for 1598 MPEG-audio signature when it shouldn't be present (non-MP3 WAV) 1599 * Bugfix: ASF files were not always showing correct audio datatype 1600 * Bugfix: array_merge_clobber() and array_merge_noclobber() were 1601 not being conditionally defined in getid3.functions.php 1602 (thanks rich.martinØreden-anders*com) 1603 * Bugfix: stream_numbers was not being correctly returned in 1604 bitrate_mutual_exclusion_object chunks of ASF files 1605 * Bugfix: Added support for 24kHz and 12kHz audio in ASF files 1606 * Bugfix: Removed possible undefined offset error in MP3s where 1607 cannot find synch before end of file 1608 * Bugfix: Removed potential out-of-memory crash situation when 1609 parsing Real files with chunks larger than the available memory 1610 (thanks jigalØspill*nl) 1611 * Bugfix: ID3v1 was incorrectly taking precedence over ID3v2 in 1612 the ['comments'] array (thanks lionelflØwanadoo*fr) 1613 * Bugfix: No longer calculates overall bitrate and playtime for 1614 VBR MPEG video files based on the audio bitrate. 1615 * Bugfix: AssumeFormat was not working properly 1616 Added summary footer line to getid3.demo.check.php 1617 Added '.mpeg' to the list of assume-format-from-filenames list in 1618 getid3.demo.check.php 1619 MPEG-video files now more reliably detected 1620 A number of additional features have been added to 1621 getid3.demo.scandir.php 1622 Added many RIFF-AVI audio types and fourcc video types to the 1623 lookup functions in getid3.riff.php 1624 Now identifes files with Lyrics3 v1 tags that are of incorrect 1625 length (v1 Lyrics3 is supposed to be 5100 bytes long, but 1626 [unknown program] writes variable-length tags (which is illegal 1627 for Lyrics3 v1)). getID3() now correctly parses these tags and 1628 issues a warning. 1629 Split GetFileFormat() to GetFileFormat() and GetFileFormatArray() 1630 HTML colors in getid3.demo.check.php are now defined as constant 1631 variables at the top of the file (if you want to change them) 1632 Added support for OptimFROG v4.50x (non-alpha) (new header fields) 1633 (thanks floringhidoØyahoo*com) 1634 Added support for Lossless Audio v0.4 (thanks mikeØbevin*de) 1635 1636 16371.6.1: [March-03-2003] James Heinrich 1638 » Added support for writing APE v2. 1639 WriteAPEtag() in getid3.ape.php 1640 NOTE: APE v1 writing support will *not* be added to future 1641 versions of getID3() 1642 (thanks ahØartemis*dk and adamØphysco*com for the idea) 1643 » Added support for AIFF (Audio Interchange File Format) including 1644 AIFF, AIFC and 8SVX (thanks ahØartemis*dk for the idea) 1645 Removed file: getid3.aiff.php 1646 » Added support for OptimFROG (v4.50a and v4.2x) 1647 (thanks ahØartemis*dk for the idea) 1648 New file: getid3.optimfrog.php 1649 » Added support for WavPack (thanks ahØartemis*dk for the idea) 1650 » Added support for LPAC (thanks ahØartemis*dk for the idea) 1651 » Added support for NeXT/Sun .au format 1652 New file: getid3.au.php 1653 » Added support for Creative SoundBlaster VOC format 1654 New file: getid3.voc.php 1655 » Added support for the BWF (Broadcast Wave File) RIFF chunks 1656 "bext" and "MEXT" (thanks Ryan and njhØsurgeradio*co*uk) 1657 » Added support for the CART (Broadcast Wave File) RIFF chunks 1658 (thanks Ryan) 1659 » Added getid3.demo.scandir.php - a sample recursive scanning demo 1660 that scans every file in a given directory, and all sub- 1661 directories, and stores the resulting data in MySQL database, 1662 and then displays a list of duplicate files based on md5_data 1663 ¤ ['md5_data_source'] now contains the MD5 value for the original 1664 uncompressed data for formats that store that information 1665 (currently only FLAC v0.5+). ['md5_data'] (if chosen to be 1666 calculated) will contain the calculated MD5 value for the 1667 compressed file. To check if 2 files are identical in every way, 1668 including all comments: compare ['md5_file']. To check if two 1669 files were compressed from the same source file: compare 1670 ['md5_data_source']. To check if the compressed audio/video data 1671 of two files is identical, even if comments or even the 1672 container file format is different (MP3 in RIFF container, 1673 FLAC in Ogg container, etc): compare ['md5_data']. 1674 ¤ ['md5_data'] for 8-bit WAV files is now calculated based on a 1675 converted version of the data from unsigned to signed (MSB 1676 inverted) to match the MD5 value calculated by FLAC 1677 ¤ New optional parameter added to GetAllFileInfo() - 1678 $MD5dataIfMD5SourceKnown (default: false). If false the md5_data 1679 value will NOT be calculated for files (such as FLAC) that have 1680 ['md5_data_source'] set, even if $MD5data == true. 1681 (thanks ahØartemis*dk) 1682 ¤ getid3.check.php renamed to getid3.demo.check.php 1683 ¤ Added GetTagOnly() function to getid3.php - similar to 1684 GetAllFileInfo() except only takes a filename as a parameter and 1685 only returns ID3v2, APE, Lyrics3 and ID3v1 tag information - no 1686 attempt is made to parse the data contents of the file at all. 1687 (thanks Phil for the idea) 1688 ¤ Added ['audio']['lossless'] and ['video']['lossless'] for all 1689 formats (when known). Both are boolean values - true means the 1690 data is lossless-compressed, false means the data is lossy- 1691 compressed. 1692 ¤ Added ['audio']['compression_ratio'] and/or 1693 ['video']['compression_ratio'] for all formats. Returns a number 1694 (usually) less than 1, where 1 represents no compression and 0.5 1695 represents a compressed file half the size of the original file 1696 ¤ Added ['video']['bits_per_sample'] to all video formats (when 1697 known) 1698 ¤ Added ['video']['frame_rate'] to all video formats (when known) 1699 ¤ ['fileformat'] set to 'mp1' or 'mp2' instead of 'mp3' when 1700 ['audio']['dataformat'] is one of those (thanks ahØartemis*dk) 1701 ¤ Added 4th parameter to md5_data(), $invertsign, which will invert 1702 the MSB of each byte before MD5'ing. This is needed for 8-bit 1703 WAV files because FLAC calculates the stored MD5 value on 1704 signed data rather than the original byte values. ['md5_data'] 1705 of an 8-bit WAV will now match the ['md5_data_source'] value 1706 (thanks lichvarmØphoenix*inf*upol*cz) 1707 ¤ ['ape']['items']['data'] and ['ape']['items']['data_ascii'] now 1708 contains an array of values, if the tag contains UTF-8 text (as 1709 opposed to binary data) 1710 ¤ ['mpeg']['audio']['bitratemode'] renamed to 1711 ['mpeg']['audio']['bitrate_mode'] 1712 * Bugfix: Removed potential bug that could replace all MP3 file 1713 contents with only the new ID3v2 tag in getid3.putid3.php 1714 * Bugfix: md5_data values calculated for RIFF (WAV, AVI) files 1715 were incorrect (thanks ahØartemis*dk) 1716 * Bugfix: MP3 data in an MP4 wrapper fileformat could not identify 1717 bitrate (thanks ahØartemis*dk) 1718 * Bugfix: ['audio'] and/or ['video'] keys would sometimes get 1719 removed even if not empty 1720 * Bugfix: Prevented creation of null entries in 1721 ['RIFF']['WAVE']['INFO'] if a comment entry was not present 1722 * Bugfix: Potential infinite-loop condition in getid3.ogg.php 1723 (thanks afshin.behniaØsbcglobal*net) 1724 * Bugfix: Ogg files with illegal ID3v1 (and/or APE or Lyrics3) 1725 tags were not finding the last Ogg page 1726 (thanks afshin.behniaØsbcglobal*net) 1727 * Bugfix: replay-gain values not properly set from LAME tag 1728 * Bugfix: RIFF-MP3 had incorrect md5_data 1729 * Bugfix: the LAME DLL CBR problem of not re-writing the LAME 1730 frame at the beginning of the data is now detected for MP3s 1731 with ID3v2 tags as well 1732 * Bugfix: APE tags with multiple values (ie multiple entries in 1733 the "artist" tag) are now shown properly in ['ape']['items'] 1734 * Bugfix: fixed condition where APE tag with no ID3v1 tag could be 1735 mistaken for APE tag with ID3v1 (and incorrectly parsed) 1736 * Bugfix: added warning if ID3v2 frame has zero-length data 1737 (thanks cmassetØclubinternet*fr) 1738 * Bugfix: getid3.frames.php looking for non-existant key in USER 1739 frames 1740 Improved detection of RIFF-MP3 data. [unknown program] encodes 1741 RIFF-WAV data with a chunk name of 'RMP3' instead of the 1742 standard 'RIFF' 1743 Encoder now returned in both ['comments'] and ['audio']['encoder'] 1744 for RIFF-WAV files with an INFO.ISFT chunk 1745 Generate a warning for FLAC files encoded with v0.3 or v0.4 1746 because audio_signature is not calculated during encoding 1747 (thanks ahØartemis*dk) 1748 Modified getid3.check.php to display md5_data_source as well as 1749 md5_file and md5_data if display-MD5 mode is selected 1750 Modified getid3.check.php to assume-format based on file extension 1751 in browse mode if fileformat is found to be 'id3' (formerly only 1752 if the fileformat was null) 1753 Changed scaling of BitrateColor() from representing 1-256kbps to 1754 representing 1-768kbps for better display of high-bitrate files, 1755 specifically lossless-compressed CD-audio (FLAC, LA, etc) 1756 1757 17581.6.0: [January-30-2003] James Heinrich 1759 » Added support for OggFLAC (FLAC data stored in an Ogg container) 1760 (thanks ahØartemis*dk for the idea) 1761 » Added support for Speex (the data stored in an Ogg container) 1762 » Comments are now available in the root 2-dimensional array 1763 ['comments'] - each entry in this array will contain one or more 1764 strings. For example, if there are two artists then 1765 ['comments']['artist'][0] will contain the first one and 1766 ['comments']['artist'][1] the other. All keys are forced 1767 lowercase. Comments will be stored in the ['comments'] array in 1768 this order of precedence: 1769 1) Native format tags (ASF, VQF, NSV, RIFF, Quicktime, Vorbis) 1770 2) APE tags 1771 3) ID3v2 1772 4) Lyrics3 1773 5) ID3v1 1774 Lower-priority tags will not overwrite or append existing values 1775 of higher-priority tags (for example, 'artist' in ID3v1 will be 1776 ignored if already specified in APE), but missing values will be 1777 filled in (for example, if 'album' is specified in ID3v2 but not 1778 in APE, it will be included in the ['comments'] array). 1779 Note: Root keys (['title'], ['artist'], etc) are NOT available 1780 in this or future versions of getID3(). 1781 (thanks ahØartemis*dk) 1782 » MD5 hashes are now available for all formats for both the entire 1783 file (['md5_file']) and the portion of the file containing only 1784 the audio/video data, stripped of all prepended/appended tags 1785 like ID3v2, ID3v1, APE, etc - ['md5_data'] 1786 (thanks ahØartemis*dk for alternate md5_file() function that 1787 runs on UNIX system running PHP < 4.2.0) 1788 NOTE: Ogg files require the use of vorbiscomment to obtain the 1789 md5_data value. vorbiscomment must be downloaded from 1790 http://www.vorbis.com/download.psp and placed in the getID3() 1791 directory. All Ogg formats (Vorbis, OggFLAC, Speex) are affected 1792 by this problem, but only OggVorbis files can be processed with 1793 vorbiscomment. OggFLAC and Speex files will be processed by 1794 getID3(), but this may result in an incorrect value for md5_data 1795 in the event that VorbisComments are larger than 1 page (4-8kB). 1796 NOTE: md5_data for Ogg will not work if PHP is running in Safe 1797 Mode 1798 » There is now a wrapper class available, written by Allan Hansen, 1799 which should simplify extracting most common basic information 1800 (such as format, bitrate, comments). 1801 New file: audioinfo.class.php 1802 » OggWrite() in getid3.ogginfo.php has been replaced with a new 1803 version that uses vorbiscomment to write the comments, because 1804 of a reported bug that can corrupt OggVorbis files such they 1805 cannot be played. 1806 NOTE: Ogg comment writing now requires the use of vorbiscomment 1807 which must be downloaded from http://www.vorbis.com/download.psp 1808 and placed in the getID3() directory. 1809 NOTE: Ogg comment writing will not work if PHP is running in 1810 Safe Mode 1811 ¤ New root key ['tags'] is now always returned for all formats. 1812 It is an array that may contain any of: 1813 * Native format tags: 'vqf', 'riff', 'vorbiscomment', 'asf', 1814 'nsv', 'real', 'midi', 'zip', 'quicktime' 1815 * Appended data tags: 'ape', 'lyrics3', 'id3v2', 'id3v1' 1816 ¤ New root key ['audio'] is an array containing any or all of: 1817 codec, channels, channelmode, bitrate, bits_per_sample, 1818 dataformat, bitrate_mode, sample_rate, encoder 1819 Note: This replaces several root keys, including: 1820 bitrate_audio, bits_per_sample, frequency, channels 1821 ¤ New root key ['video'] is an array containing any or all of: 1822 bitrate_mode, bitrate, codec, resolution_x, resolution_y, 1823 resolution_y, frame_rate, encoder 1824 Note: This replaces several root keys, including: 1825 bitrate_video, resolution_x, resolution_y, frame_rate 1826 ¤ ['id3']['id3v1'] has moved to ['id3v1'] 1827 ¤ ['id3']['id3v2'] has moved to ['id3v2'] 1828 ¤ ['audiodataoffset'] and ['audiodataend'] have been renamed to 1829 ['avdataoffset'] and ['avdataend'] respectively 1830 ¤ GetAllMP3info() has been changed to GetAllFileInfo() with a 1831 different parameter list ($allowedFormats is no longer a 1832 parameter). Check your code where you're calling 1833 GetAllMP3Info() - you will need to change both the function 1834 name and the parameter list if you pass more than 2 parameters 1835 ¤ All formats now return ['audio']['dataformat'] and/or 1836 ['video']['dataformat'] where appropriate - this goes along with 1837 ['fileformat'] - ['fileformat'] will return the actual structure 1838 of the file, whereas ['dataformat'] will return the format of 1839 the data inside that structure. For example, an Ogg file can 1840 contain Vobis data (normal), or it can contain FLAC data in the 1841 Ogg container format. In that case, ['fileformat'] would be 1842 'ogg', but ['dataformat'] would be 'flac'. 1843 Note: this means that WAV and AVI files now return a 1844 ['fileformat'] of 'riff' rather than 'wav' or 'avi'. 1845 ¤ ['filesize'] is no longer returned for files larger than 2GB 1846 because PHP does not support large file access. Attempting to 1847 parse a file larger than 2GB will result in a message stored in 1848 ['error'] and ['filesize'] not set. 1849 ¤ APEtag, ID3v1, and ID3v2 are now supported on ALL multimedia 1850 files - even if illegal by format. Ogg will return warning if 1851 ID3/APE tags are present. (thanks ahØartemis*dk) 1852 ¤ All files: non-critical errors are now returned in the root key 1853 ['warning'] rather than ['error'] (only critical errors that 1854 prevent getID3() from correctly parsing the file are returned in 1855 ['error'] (thanks ahØartemis*dk) 1856 ¤ Renamed all references to $MP3fileInfo to $ThisFileInfo 1857 ¤ Joliet now supported for ISO-9660. 1858 ['iso']['supplementary_volume_descriptor'] is now returned, if 1859 available, and ['iso']['files'] will contain ASCII equivalents 1860 of the Unicode directory structure & filenames stored. 1861 ¤ Moved Monkey's Audio code from getid3.ape.php to seperate file. 1862 New file: getid3.monkey.php 1863 ¤ Added new keys for ISO-9660: ['name_ascii'] for directories, 1864 ['file_identifier_ascii'] for files 1865 ¤ Added root key ['track'] for CD-audio files 1866 ¤ Ogg/Vorbis-comment files now have comments returned inside 1867 ['ogg']['comments_common'] as an array of strings, rather than 1868 simple strings in ['ogg'] 1869 ¤ Quicktime files now have comments returned inside 1870 ['quicktime']['comments'] as an array of strings, rather than 1871 simple strings in ['quicktime'] 1872 ¤ ['mime_type'] is a new root key returned for all supported 1873 formats (thanks ahØartemis*dk) 1874 ¤ ['fileformat'] now returns 'mp1' instead of 'mp3' for MPEG-1 1875 layer-I audio files (thanks ahØartemis*dk) 1876 ¤ ['mpeg']['audio']['bitratemode'] now returns lowercase 1877 ¤ MPEG-4 audio files which consist of MP3 data wrapped in a 1878 Quicktime fileformat will now return the usual data in 1879 ['mpeg']['audio'] 1880 ¤ Type-1 DV AVIs are now supported 1881 ¤ DV AVIs will return 1 or 2 in ['RIFF']['video'][x]['dv_type'] 1882 ¤ Changed ['fileformat'] from 'mpg' to 'mpeg' for MPEG video files 1883 ¤ ASF comments are now stored in ['asf']['comments'] instead of 1884 ['asf'] 1885 ¤ RealMedia chunk data is now returned inside ['real']['chunks'] 1886 instead of ['real'] 1887 ¤ ['replay_gain'] now properly populated from APE tags 1888 ¤ Added support for ASF_Old_ASF_Index_Object in ASF files 1889 (thanks ahØartemis*dk) 1890 ¤ AAC-ADTS files now return ['aac']['bitrate_distribution'] 1891 ¤ ParseVorbisComments() has been replaced with 1892 ParseVorbisCommentsFilepointer() (with different parameters) 1893 ¤ All references to any key ['frequency'] are now ['sample_rate'] 1894 ¤ Moved ID3v2 comments from ['id3v2'] into common root 1895 ['comments'] structure, and now returns more values than before 1896 * Bugfix: ['iso']['files'] and ['zip']['files'] could potentially 1897 contain duplicate entries (in a numeric-indexed array) for files 1898 if the directory structure specifies files multiple times. 1899 Entries are now guaranteed unique, with the last entry for the 1900 file overwriting any former ones. 1901 * Bugfix: RIFF parsing had numerous issues, including: 1902 - large AVIs would take a very very long time to parse 1903 - chunks with odd (not even) sizes would cause the parser fail 1904 - video and/or audio codecs not always identified 1905 The ParseRIFF() function has been completely rewritten and fixes 1906 all known issues with RIFF parsing. Users are, however, 1907 encouraged to double-check output of any parsed (AVI/WAV/CDDA) 1908 files. 1909 * Bugfix: Modified getid3.riff.php to return correct total 1910 bitrates for AVIs with multiple audio streams 1911 * Bugfix: GetFileFormat() was not creating array structure 1912 correctly (thanks ahØartemis*dk) 1913 * Bugfix: LAME tag for MP3s can only specify up to 255kbps, so any 1914 files with actual CBR bitrate of >=256 were reported incorrectly 1915 * Bugfix: Lyrics3 synched lyrics were not being correctly returned 1916 * Bugfix: CreateDeepArray() was broken for non-nested cases, which 1917 meant ZIP and ISO ['files'] structures were broken 1918 * Bugfix: Incorrect pattern matching for ZIP files meant no zip 1919 files were being detected as such 1920 * Bugfix: AAC-ADIF was returning an incorrect number of channels 1921 (too few) in some cases (thanks ahØartemis*dk) 1922 * Bugfix: Vorbis comments were returning an incorrect value for 1923 ['dataoffset'] in some cases 1924 * Bugfix: MPEG video ['marker_bit'] and ['vbv_buffer_size'] were 1925 incorrect 1926 * Bugfix: ['playtime_string'] could potentially have a value of 1927 x minutes and 60 seconds (ie 3:60 instead of 4:00) 1928 Added support for FLAC cuesheets (FLAC 1.1.0+) 1929 (thanks ahØartemis*dk) 1930 Improved parsing speed in MP3, MP2 and AAC (thanks ahØartemis*dk) 1931 Extra error-checking added to try and identify corrupt files for 1932 most audio formats (thanks ahØartemis*dk) 1933 More accurate playtime calculation for RealMedia 1934 (thanks ahØartemis*dk) 1935 Changed all relevant files to use ['audiodataoffset'] and 1936 ['audiodataend'] rather than ['filesize'] where appropriate 1937 (thanks ahØartemis*dk) 1938 Added text encoding type 255 as a duplicate of UTF-16BE but with 1939 Big-Endian rather than Little-Endian byte order 1940 Added many RIFF-AVI audio types and fourcc video types to the 1941 lookup functions in getid3.riff.php 1942 Added numerous new known GUIDs to getid3.asf.php 1943 Added PoweredBygetID3() function to easily get a "powered by" 1944 string with the current getID3() version. 1945 Added "Morgan Multimedia Motion JPEG2000" (MJ2C), "DivX v5" (DX50) 1946 and "XviD" (XVID) codecs to list of known codecs in 1947 getid3.riff.php 1948 Changed GETID3_INCLUDEPATH path seperators to forced / 1949 (from \ for Windows) 1950 Modified getid3.check.php to only change \ directory seperators to 1951 / on Windows operating systems 1952 Modified getid3.check.php to handle larger-than-2GB files (which 1953 now do not return a filesize) 1954 Modified getid3.check.php to handle ['dataformat_audio'] and 1955 ['dataformat_video'] 1956 Modified getid3.check.php to show a list of present tags in one 1957 column rather than one column for each of ID3v1, ID3v2, etc 1958 Modified getid3.check.php to show MD5 values. Initially disabled 1959 but can be enabled for a directory with a click. md5_file is 1960 always calculated when displaying detailed info about a single 1961 file; md5_data is calculated if the file is < 50MB 1962 Modified getid3.check.php to show errors and warnings. Details are 1963 visible with a mouseover or a click. 1964 Changed getid3.check.php to use SafeStripSlashes instead of a 1965 manual conditional directory name replacement for special 1966 characters 1967 Added sample recursive scanning sample code to getid3.readme.txt 1968 (thanks lipisinØmail*ru for the idea) 1969 1970 19711.5.7: [January-10-2003] James Heinrich 1972 » Added support for ISO 9660 (CD-ROM image) format. Most-useful 1973 data is directory structure returned under ['iso']['files'] 1974 Note: Only ISO-9660 supported, not (yet) Joliet extension 1975 (thanks nebula_djØsofthome*net for the idea) 1976 New file: getid3.iso.php 1977 ¤ ZIP files are now parsed by getID3() itself without relying on 1978 built-in PHP functions and/or ZZipLib support. 1979 (thanks Vince for the idea) 1980 ¤ ZIP files now return a simple directory listing with filename 1981 and filesize info only under ['zip']['files']. 1982 Note: empty subdirectories will note appear in here, only files 1983 and non-empty subdirectories. Information for all entries, 1984 including empty subdirectories, is available under 1985 ['zip']['central_directory'] (or under ['zip']['entries'] if the 1986 Central Directory cannot be located (usually due to a trucated 1987 file). 1988 ¤ RIFF-WAV files with MP3 data (or MP3s with RIFF headers, if you 1989 want to think of it that way) now have the MPEG audio portion 1990 scanned and the usual data returned in ['mpeg']['audio'] if the 1991 RIFF audio codec has wFormatTag of "85" (identified by getID3() 1992 as "MPEG Layer 3") 1993 (thanks ahØartemis*dk for the idea) 1994 ¤ EXIF data (if present) is returned for JPEG files under 1995 ['jpg']['exif'] (thanks nebula_djØsofthome*net) 1996 ¤ ['filepath'] now returned for all files with the directory part 1997 of the full filename. 1998 ¤ ['filenamepath'] is now returned for all files (equivalent to 1999 ['filepath'].'/'.['filename']) 2000 * Bugfix: ['id3']['id3v2'][<framename>]['dataoffset'] was wrong 2001 * Bugfix: MP3s tagged with iTunes have an invalid comment field 2002 frame name ('COM ' - should be 'COMM') but the data is valid 2003 otherwise; the frame is now renamed to 'COMM' and parsed 2004 normally (with the error noted in ['error']) 2005 (thanks kheller2Ømac*com for the sample file) 2006 * Bugfix: Some ASF/WMA audio files were not being identified as 2007 any format (thanks ahØartemis*dk) 2008 * Bugfix: Warning now generated and ASCII format assumed for 2009 invalid text encoding values in ID3v2 2010 * Bugfix: Changed ZIP detection pattern from 'PK' to 'PK\x04\x03' 2011 * Bugfix: Ogg/FLAC files with large Vorbis comments were dying in 2012 an infinite loop with lots of error messages due to missing $fd 2013 parameter on ParseVorbisComments() (thanks ahØartemis*dk) 2014 * Bugfix: ['data'] and ['image_mime'] were being returned for all 2015 Ogg comments even if they were not images for versions of PHP 2016 that have image_type_to_mime_type() built in (ie PHP 4.3.0+) 2017 2018 20191.5.6: [December-31-2002] James Heinrich 2020 » Added support for NSV (Nullsoft Streaming Video) 2021 (www.nullsoft.com/nsv/) 2022 (thanks demonØsoundplanet*com for the idea) 2023 New file: getid3.nsv.php 2024 » Added support for CD-audio track files (track01.cda etc) 2025 ¤ Added standard ['frame_rate'] root value when known (AVI, NSV, 2026 MPEG-video) 2027 ¤ ASF files now report ['fileformat'] of: 2028 'wmv' when Windows Media Video codec v7/v8/v9 is used; 2029 'wma' when any 'Windows Media Audio' named audio codec is used 2030 and no video stream is present; 2031 'asf' in all other cases (audio-only, video-only, or both) 2032 ¤ Removed support for ZIP functions (will be rewritten to not 2033 require ZZIPlib support in future versions) 2034 ¤ Added function SafeStripSlashes() as a drop-in replacement for 2035 stripslashes(), but that only strips slashes if magic_quotes_gpc 2036 is set 2037 ¤ Removed support for remote file scanning (HTTP / FTP) 2038 ¤ Added ['aac']['frames'] (number of AAC frames in file) 2039 ¤ Added ['mpeg']['audio']['frame_count'] when a bitrate histogram 2040 is created 2041 ¤ Average bitrate for VBR MP3/MP2 is calculated from actual counts 2042 of frames of various bitrates (rather than relying on the header 2043 values or filesize) when a bitrate histogram is created 2044 ¤ RecursiveFrameScanning() split out into seperate function 2045 (getid3.mp3.php) 2046 ¤ Removed old function getMP3header() from getid3.mp3.php 2047 ¤ Changed default MPEG_VALID_CHECK_FRAMES (number of mp3 frames 2048 scanned to ensure a valid audio sequence has been located) from 2049 10 to 25. This means scanning will be slightly slower, but more 2050 reliable/accurate 2051 * Bugfix: ID3v2.2 - valid frame names not correctly detected 2052 (thanks maeckerØweb*de for the sample file) 2053 * Bugfix: ID3v2.2 - valid padding not correctly detected 2054 (thanks maeckerØweb*de for the sample file) 2055 * Bugfix: MIDI files with flat key signatures were not being 2056 correctly reported (thanks alexleeisØshaw*ca for sample file) 2057 * Bugfix: now returns message in ['error'] if file does not exist 2058 * Bugfix: ['RIFF']['video'][x]['codec'] wasn't always being 2059 correctly populated 2060 * Bugfix: ['bitrate'] was incorrect for multi-stream RealMedia 2061 * Bugfix: ['playtime_seconds'] was sometimes null or incorrect 2062 for multi-stream RealMedia 2063 * Bugfix: ChannelTypeID was incorrect in RVA2 ID3v2.4 frames 2064 * Bugfix: Fixed potential divide-by-zero error for corrupt FLAC 2065 files (thanks ahØartemis*dk) 2066 * Bugfix: AAC-ADTS was not returning ['bitrate_mode'] unless 2067 $ReturnExtendedInfo was TRUE (thanks ahØartemis*dk) 2068 * Bugfix: LAME-encoded CBR MP3s now properly identified as CBR 2069 with correct bitrate (thanks ahØartemis*dk) 2070 * Bugfix: VBR MP2 (or headerless MP3) is now identified as VBR 2071 rather than CBR. Note: to obtain VBR bitrate for headerless 2072 files, the entire file is scanned and a histogram distribution 2073 of bitrates is created, and the average bitrate calculated from 2074 that. (thanks ahØartemis*dk for sample file) 2075 Added support for DSIZ chunks in VQF, and checks to make sure size 2076 of audio data matches DSIZ value, if present 2077 (thanks ahØartemis*dk for sample file) 2078 Rewrote GetAllMP3info() - removed some unneccesary code, changed 2079 format-detection routine from ParseAsThisFormat() to 2080 GetFileFormat() to allow for more flexible format parsing 2081 (needed for ISO CD-ROM images, helpful for Quicktime and others) 2082 Changed references in all files from string-cast indexes: ["$i"] 2083 to non-cast indexes: [$i] where appropriate 2084 Put a sans-serif 9pt style on all text in getid3.check.php 2085 getAACADTSheaderFilepointer() now return TRUE if synch is lost 2086 after the first frame has been successfully parsed (previously 2087 it would return FALSE if synch was lost at any time, meaning the 2088 file is most likely MP3, which was incorrect) 2089 (thanks ahØartemis*dk for sample file) 2090 Speed improvement code changes to getid3.mp3.php (up to 24% faster 2091 in some cases) (thanks ahØartemis*dk for the code) 2092 Changed all include_once() to require_once() 2093 2094 20951.5.5: [November-25-2002] James Heinrich 2096 » Added support for La (Lossless Audio - www.lossless-audio.com) 2097 (thanks ahØartemis*dk for the idea) 2098 New file: getid3.la.php 2099 ¤ Moved lookup functions from getid3.lookup.php to the files where 2100 they are used. 2101 New file: getid3.id3.php 2102 New file: getid3.rgad.php 2103 Removed file: getid3.lookup.php 2104 ¤ getID3v1Filepointer() returns FALSE if ID3v1 tag not found 2105 ¤ Added new paramter "ReturnExtendedInfo" to the function 2106 getAACADTSheaderFilepointer() in getid3.aac.php which now 2107 defaults to FALSE - if TRUE then the data for every frame is 2108 returned (containing aac_frame_length, adts_buffer_fullness and 2109 num_raw_data_blocks, which aren't usually very useful). Speed 2110 improvement with FALSE is about 35%. 2111 ¤ Now returns fopen() errors in ['error'], for example if a remote 2112 file is not accessible. 2113 ¤ Changed default number of MP3 audio frames to scan to determine 2114 if a valid stream has been found from 5 to 10, now also defined 2115 as a constant at the top of getid3.mp3.php This will result in 2116 slightly slower MP3 parsing, but greater reliability in 2117 detecting false/invalid/corrupted VBR headers. 2118 ¤ fopen() errors now displayed in getid3.putid3.php 2119 (thanks miguel.dieckmannØhamburg*de) 2120 ¤ Added 4th parameter to decodeMPEGaudioHeader() $ScanAsCBR which 2121 will force an MP3 audio frame sequence to be force-scanned in 2122 CBR mode. You should never need to call this directly, it's only 2123 used internally to scan for MP3 files that have an illegal VBR 2124 header with CBR data. (thanks fletchØpobox*com) 2125 * Bugfix: ASF_Marker_Object in getid3.asf.php was always returning 2126 an error in non-existant "reserved_1" and failing 2127 * Bugfix: VBR bitrate calculations in getid3.mp3.php only occur if 2128 ['mpeg']['audio']['VBR_frames'] is defined. 2129 (thanks fletchØpobox*com) 2130 * Bugfix: getid3.putid3.php no longer deletes original MP3 if 2131 ID3v2 tag writing fails (thanks miguel*dieckmannØhamburg*de) 2132 * Bugfix: incorrect order of if-statement error messages in 2133 getid3.putid3.php (thanks miguel*dieckmannØhamburg*de) 2134 getid3.asf.php now notes the error and continues parsing rather 2135 than failing when it encounters an error parsing a chunk 2136 Now actually scan 1000 frames for AAC ADTS as reported in the 2137 v1.5.4 changelog, rather than 100. (thanks ahØartemis*dk) 2138 Improved scanning speed in getAACADTSheaderFilepointer() by ~30% 2139 (thanks ahØartemis*dk for the fix) 2140 Added FileSizeNiceDisplay() function to getid3.functions.php for 2141 formatting filesize output in kB, MB, GB, etc. 2142 2143 21441.5.4: [October-07-2002] James Heinrich 2145 » Added support for Quicktime. 2146 New file: getid3.quicktime.php 2147 » Added support for AAC files, both ADTS and ADIF header formats. 2148 ADIF format is a pain because it's very similar to standard MP3 2149 header format, and it's hard to distinguish between the two. I 2150 have tried to make the detection accurate, but I have a limited 2151 number of AAC test files to play with so if you have an AAC file 2152 that gets detected as MP3/MP2 (or vice-versa), please send me 2153 the details via email at infoØgetid3Øorg 2154 ADTS format is very slow to parse because to get the bitrate of 2155 VBR files the whole file has to be stepped through frame by 2156 frame (getID3() scans up to the first 1000 frames and assumes 2157 that to be close enough). 2158 Note: I would suggest commenting out support for AAC (see top of 2159 GetAllMP3info() function in getid3.php) unless you need it. 2160 (thanks jfaulØgmx*de for the idea and sample Delphi source code) 2161 New file: getid3.aac.php 2162 » Added bitrate distribution analysis option for MP3 VBR files. A 2163 new boolean parameter for getOnlyMPEGaudioInfo() enabled this 2164 feature which steps through the MP3 file frame by frame and 2165 counts how many frames of each bitrate exist. This information 2166 is returned in ['mpeg']['audio']['bitrate_distribution'] 2167 Caution: this feature is very inefficient for large files and 2168 takes a very long time and does lots of disk I/O. Use with care. 2169 ¤ Changed layout of allowedFormats in GetAllMP3info() function in 2170 getid3.php to allow easy removal of support for any of the 2171 supported format. As stated above, I recommend commenting out 2172 AAC unless needed. 2173 ¤ Added ['flac']['compressed_audio_bytes'], 2174 ['flac']['uncompressed_audio_bytes'], and 2175 ['flac']['compression_ratio'] 2176 ¤ Replaced FXPT2DOT30toFloat() function with FixedPoint2_30() 2177 * Bugfix: getid3.mpc.php was slightly miscalculating the number of 2178 samples, therefore also bitrate and playtime 2179 (thanks ahØartemis*dk for the fix) 2180 * Bugfix: MonkeyCompressionLevelNameLookup() didn't know about 2181 'insane' compression (thanks ahØartemis*dk for the fix) 2182 * Bugfix: MonkeySamplesPerFrame() was incorrect for MAC v3.95+ 2183 (thanks ahØartemis*dk for the fix) 2184 * Bugfix: getid3.check.php wasn't processing the assumeFormat 2185 directive when (register_globals == off) 2186 * Bugfix: detecting of synch pattern for MP3 files with invalid 2187 data at the beginning wasn't always correct, also meant possible 2188 incorrect bitrate/duration/etc info for such corrupt files. 2189 getid3.functions.php now includes a replacement utf8_decode() 2190 function for those PHP installations that are not configured 2191 with the --with-xml option. (thanks stephaneØtekartists*com) 2192 2193 21941.5.3: [September-30-2002] James Heinrich 2195 » Added support for VQF. (thanks mtØmansonthomas*com for the idea) 2196 New file: getid3.vqf.php 2197 » Added support for FLAC. Comments, if present, are returned under 2198 ['ogg'] because they follow the Ogg Vorbis structure standard. 2199 New file: getid3.flac.php 2200 ¤ OS/2-format bitmaps are now correctly interpreted. The format of 2201 the bitmap is now returned in ['bmp']['type_os'] and 2202 ['bmp']['type_version']. OS/2 bitmaps can be v1 or v2, Windows 2203 can be v1, v4 or v5 2204 2205 22061.5.2: [September-25-2002] James Heinrich 2207 » Support for RealMedia (audio & video) added 2208 Note: only tested on G2 and v5 audio and video files - if anyone 2209 has older and/or newer sample files, please test it and/or send 2210 me the sample files. 2211 (thanks stephaneØtekartists*com for idea) 2212 New file: getid3.real.php 2213 » Support for BMP added. Palette and pixel data can optionally be 2214 extracted as well - this is slow and generally unneccesary, but 2215 the option is there if you need it. Also includes PlotBMP() 2216 which will take the extracted pixel data and output it as a true 2217 color PNG. This function requires GD v2.0+ 2218 Note: Untested on 16-bit and 32-bit BMPs because I couldn't find 2219 any sample files - if you know of a program that can create such 2220 files, please email infoØgetid3Øorg 2221 Note: Support for RGB (uncompressed), RLE8 and RLE4 is included 2222 and tested. BITFIELDS support is also included for 16- & 32-bit 2223 formats, but it's untested, so if anybody has any test files 2224 please send them to infoØgetid3Øorg 2225 Note: Support currently only for Windows-format BMPs, and trying 2226 to parse an OS/2-format bitmap leads to unpredictable/invalid 2227 results. 2228 New file: getid3.bmp.php 2229 » PNG now fully parsed, including all information chunks 2230 New file: getid3.png.php 2231 ¤ Support for GIF/JPG/PNG moved to seperate files and expanded, 2232 including standard ['resolution_x'] and ['resolution_y'] as well 2233 as more thorough parsing of header information 2234 New file: getid3.gif.php 2235 New file: getid3.jpg.php 2236 table_var_dump() simplified and now outputs {-style character 2237 entities for characters outside the normal alphanumeric range 2238 CleanOggCommentName() changed to a regular expression 2239 (thanks chris-getid3Øbolt*cx for rewriting the function) 2240 2241 22421.5.1: [September-20-2002] James Heinrich 2243 » Added support for MPEGplus/Musepack SV7. ['fileformat'] is 'SV7' 2244 for version 7 files (versions 4, 5 ,6 and 8 are not supported 2245 yet, but will be of ['fileformat'] SV4, SV5, SV6 and SV8) when 2246 they are supported (thanks Christian Fritz for the idea) 2247 New file: getid3.mpc.php 2248 ¤ ['bitrate_audio'], ['bitrate_video'], ['bitrate_mode'], 2249 ['channels'], ['resolution_x'], and ['resolution_y'] keys added 2250 for all appropriate formats 2251 ¤ Ogg files with a COVERART comment now save and display the 2252 attached image the same way as is done with ID3v2 APICs 2253 ¤ ['ogg']['comments'][n]['data'] and 2254 ['ogg']['comments'][n]['dataoffset'] is now returned for all 2255 comments. ['ogg']['comments'][n]['data'] is only useful if 2256 the field is supposed to contain binary data. It is a 2257 base64_decode()'d version of ['value']. 2258 ['ogg']['comments'][n]['dataoffset'] is the byte offset in the 2259 file at which the 'COMMENTNAME=value string' starts, not the 2260 start of just 'value' 2261 ¤ ['ogg']['comments'][n]['image_mime'] is now returned if 2262 ['ogg']['comments'][n]['data'] contains valid image data. 2263 ¤ More than 3 Ogg pages may now be read in, if the comment data 2264 is longer than 1 page (usually about 4kB) 2265 ¤ ['fileformat'] is now 'mp2' rather than 'mp3' if it's MPEG-1, 2266 Layer-II audio 2267 ¤ ASF bitrates now calculated even if stream_bitrate_properties 2268 object not present 2269 ¤ ['asf']['stream_properties_object'] is now a numeric-key array 2270 with one entry for each stream - the key being the stream number 2271 ¤ ['replay_gain'] is returned for all audio formats that support 2272 it (MP3-LAME, ID3v2, Ogg) (thanks Christian Fritz for the idea) 2273 ¤ ['mpeg']['audio']['LAME']['RGAD']['radio_replay_gain'] is now 2274 ['mpeg']['audio']['LAME']['RGAD']['radio'] (same for audiophile) 2275 ¤ ASF/WMA files now use WM/Track to get track number from if 2276 WM/TrackNumber is not available (thanks stephaneØtekartists*com) 2277 ¤ ASF/WMV files now returns ['year'] and ['asf']['year'] 2278 ¤ ASV/WMV files now use ['content_description']['description'] for 2279 the ['comment'] field (thanks stephaneØtekartists*com) 2280 ¤ ['track'] is now always returned as an integer 2281 * Bugfix: Ogg comments that are larger than one data page (usually 2282 about 4kB) are now correctly parsed (thanks Christian Fritz) 2283 * Bugfix: Ogg comment data is now UTF8-decoded 2284 * Bugfix: Ogg comment writing now UTF8-encodes the data 2285 * Bugfix: playtime for ASF files was off by <preroll> (usually 2286 between 3 and 12 seconds) 2287 * Bugfix: ['asf']['stream_properties_objects']['flags'] data was 2288 possibly incorrect 2289 * Bugfix: ASF Padding Object was overwriting 2290 Stream Bitrate Properties Object data (now returned correctly in 2291 ['asf']['padding_object'] 2292 * Bugfix: ASF Marker Object Reserved_2 field was incorrect 2293 * Bugfix: ASF Bitrate Mutual Exclusion Object had incorrect stream 2294 numbers 2295 Warning displayed if incorrectly-formatted Ogg comment is present 2296 (known to be an issue with CDex v1.40, but fixed by v1.50b7) 2297 (thanks Christian Fritz) 2298 Ogg comment writing now checks for valid comment names 2299 Added bitrate column in getid3.check.php, and added some formatting 2300 (font, colour) 2301 Performance tweaks using bitwise math instead of binary string 2302 operations 2303 2304 23051.5.0: [September-18-2002] James Heinrich 2306 » Ogg comment writing support added. getid3.write.php has been 2307 updated to allow for writing comment tags to both MP3 and Ogg. 2308 Big thanks to Chris Bolt <chris-getid3Øbolt*cx> for writing the 2309 OggWrite() function and offering it for inclusion in getID3() 2310 New file: getid3.ogginfo.php 2311 » Support for Monkey's Audio and APE tag added. 2312 (thanks Christian Fritz for the idea) 2313 New file: getid3.ape.php 2314 ['fileformat'] now returns 'mac' for Monkey's Audio files, or 2315 'ape' for files with an APE tag (Monkey's Audio or other format) 2316 » getid3.thumbnail.php has been removed from the distribution and 2317 the table_var_dump() function now outputs APICs as seperate 2318 files in the same directory as the analyzed file. This should 2319 make the image-displaying more reliable as well as reduce 2320 complexity. The naming convention for the images is 2321 filename.ext.[byte offset of APIC data].[jpg|gif|png] 2322 If anybody still has any problems with corrupted images please 2323 let me know at infoØgetid3Øorg 2324 » Support for extended Xing/LAME tag 2325 (see http://users.belgacom.net/gc247244/extra/tag.html) 2326 Data is returned in ['mpeg']['audio']['LAME'] 2327 ¤ ['ogg']['tracknumber'] has been renamed to ['ogg']['track'] and 2328 ['track'] is now returned in the root of the array 2329 ¤ ['ogg']['pageheader'][n]['flag'] has been renamed to 2330 ['ogg']['pageheader'][n]['flags'] and the unprocessed flag byte 2331 is available in ['ogg']['pageheader'][n]['flags_raw'] 2332 ¤ ['frequency'] is now returned for WAVE files in the root of the 2333 array (thanks danielØelectroteque*org) 2334 ¤ ASF files now return codec, bitrate, resolution, etc information 2335 under ['asf']['video_media'] or ['asf']['audio_media'] 2336 * Bugfix: RVA2 and EQU2 writing in getid3.putid3.php were 2337 incorrectly writing Volume Adjustment field 2338 * Bugfix: EQU2 in getid3.frames.php was reading Volume Adjustment 2339 as unsigned integer instead of signed integer 2340 * Bugfix: handling of remote files over HTTP & FTP was broken 2341 (thanks Vince) 2342 * Bugfix: incorrect handling of some ASF packets 2343 ASF/Windows Media format now more fully parsed, including Index 2344 Objects 2345 Added several new fourCC video codecs 2346 2347 23481.4.3: [September-15-2002] James Heinrich 2349 » Now parses ASF / WMV / WMA files 2350 ¤ New file: getid3.asf.php 2351 * Bugfix: RoughTranslateUnicodeToASCII() would return nothing 2352 if didn't find a terminator it was expecting 2353 Added FILETIMEtoUNIXtime() function (for converting 64-bit 2354 Microsoft FILETIME timestamps, used in ASF files and elsewhere, 2355 to UNIX Epoch timestamps) 2356 Added GUIDtoBytestring() and BytestringToGUID() functions 2357 2358 23591.4.2: [September-12-2002] James Heinrich 2360 » getID3() now requires PHP v4.1.0 or higher because it now is 2361 designed to work with register_globals = off and the new auto- 2362 globals ($_GET, $_SERVER, etc). 2363 * Bugfix: VBR MP3 files with Fraunhofer-style VBR header were not 2364 being correctly detected in most cases 2365 (thanks dkushnerØoddcast*com and mikeØftl*com for sample files) 2366 * Bugfix: IsValidTextEncoding() was broken 2367 * Bugfix: Add stripslashes($EditorFilename) to getid3.write.php 2368 (writing was broken for files with ' or " in the filename) 2369 (thanks mikeØftl*com and kthejoker) 2370 * Bugfix: If there is garbage data between a valid VBR header 2371 frame and a sequence of valid MPEG-audio frames the VBR data is 2372 no longer discarded. (thanks to mikeØftl*com for sample 2373 Fraunhofer-style VBR file produced with MusicMatch v7.2) 2374 ¤ Changed variable system to work with (register_globals = off) 2375 ¤ Moved relevant code into seperate PlaytimeString() function 2376 ¤ Added nl2br() to table_var_dump() for cleaner output 2377 ¤ Now returns the following keys from Fraunhofer-VBR files: 2378 ['VBR_seek_offsets'], ['VBR_seek_offsets_stride'], 2379 ['VBR_offsets_relative'] and ['VBR_offsets_absolute'] 2380 ¤ Added ID3v1matchesID3v2() function and implemented in 2381 getid3.check.php (thanks to "Guest" in the forums for the idea) 2382 Changed amount of data read in getid3.getimagesize.php from 10kB 2383 to entire file. (thanks mikeØftl*com) 2384 Wrapped function_exists() checks around function definitions in 2385 getid3.functions.php 2386 Fixed a lot of E_WARNING and E_NOTICE situations, especially in 2387 ID3-writing code (getid3.putid3.php, etc) 2388 Added checks to make sure all needed data is available for writing 2389 ID3v2 tags 2390 2391 23921.4.1b5: [May-30-2002] James Heinrich 2393 * Bugfix: Unsynchronise() was broken, now fixed 2394 (thanks mikeØftl*com) 2395 * Bugfix: GenerateID3v2Tag() now correctly uses non-synchsafe 2396 integers for frame size descriptors in ID3v2.3 and ID3v2.2 2397 (thanks mikeØftl*com) 2398 ¤ Added ['artist'], ['title'], etc keys to root of returned 2399 array to provide a common place to access any returned info 2400 from any file type. Currently gets info from ID3v1, ID3v2, 2401 Ogg, and RIFF/WAVE. Possible returned keys are: 2402 title, artist, album, year, genre, comment, track 2403 ¤ Modified LookupGenre() function to search for either genre based 2404 on numeric ID, or now reverse lookup as well 2405 ¤ Added ['artist'], ['title'], etc keys to ['RIFF'] information 2406 if info tags are present 2407 Added functionality to attach a picture to the ID3v2 tag in 2408 getid3.write.php 2409 Sorted genres into alphabetical order (special 3 at end of list) 2410 in getid3.write.php 2411 Changed the comment-edit field in getid3.write.php to a multi-line 2412 <textarea> from a single-line <input> 2413 getid3.write.php now only writes ID3v2 frames that have data 2414 Added default TXXX field to getid3.write.php to put a tagger info 2415 field when writing ID3v2 tags. Description is "ID3v2-tagged by" 2416 and data is "getID3() v[version] (www.silisoftware.com)" 2417 Changed getid3.check.php to use the new common info keys 2418 Improved file-format detection in getid3.check.php - if the auto- 2419 detect based on the first few bytes of the file doesn't find a 2420 known format (for example if the header is corrupt), a more 2421 thorough scan is done based on the file extension 2422 Added 'Edit ID3' link from getid3.check.php to getid3.write.php for 2423 MP3 files (thanks maxØgutalin*com for the idea) 2424 Added 'Delete file' link from getid3.check.php to getid3.write.php 2425 allowing you to permanently delete a file (be careful with this!!) 2426 (thanks maxØgutalin*com for the idea) 2427 Added some mouse-over titles for links in getid3.check.php 2428 2429 24301.4.1b4: [May-15-2002] James Heinrich 2431 * Bugfix: getid3.check.php wasn't parsing MP3s with invalid headers 2432 or padding at the beginning of the file - added 'assumeFormat' 2433 parameter and 'Parse this file as:' options to force parsing in a 2434 particular format (thanks Alcohol for the sample file) 2435 * Bugfix: unset(['fileformat']) and ['error'] added in cases where 2436 file cannot be parsed in the assumed or forced format 2437 2438 24391.4.1b3: [May-01-2002] James Heinrich 2440 ¤ For Ogg files, now calculates the real average bitrate (returned 2441 in ['ogg']['bitrate_average']) and so the playtime of the file is 2442 calculated on actual average bitrate, not nominal bitrate, so it 2443 should be accurate now (thanks to stephaneØtekartists*com for 2444 telling me it was wrong) 2445 * Bugfix: ID3v2FrameIsAllowed() wasn't behaving properly if the 2446 writing functions were called for more than one file, because of 2447 the static array not being cleared between uses. This is an 2448 updated fix because the one in 1.4.1b2 didn't work :o) 2449 (thanks soulcatcherØevilsoft*org and yoyo) 2450 Added rawurlencode() to the filename parameter in table_var_dump() 2451 for images (wouldn't work with path/file names containing special 2452 characters (#, &, ", +) (thanks Christian Fritz) 2453 getid3.check.php no longer attempts to scan all MIDI tracks in 2454 directory-browse mode, since this can take a long time. Detailed 2455 single-file view is still fully scanned (new third parameter for 2456 getMIDIHeaderFilepointer() controls this) 2457 Small improvements to MoreNaturalSort() 2458 2459 24601.4.1b2: [April-18-2002] James Heinrich 2461 ¤ GetAllMP3Info()'s 2nd parameter has changed from boolean to string 2462 (now specifying the parse-this-file-as-this format, like 'mp3', 2463 but also can be FALSE to mean don't assume any format, auto-detect 2464 only), and a third parameter (array containing allowed formats) 2465 has been added. The assumedFormat parameter allows a file to be 2466 forced to be parsed as a certain format rather than relying on the 2467 auto-detection of getID3() (ex: an MP3 wrapped in a RIFF/WAV 2468 header will be auto-detected as RIFF/WAV, but if forced to parse 2469 as MP3 will extract the original MP3 information) 2470 (thanks reel_tazØusers*sourceforge*net) 2471 * Bugfix: ID3v2FrameIsAllowed() wasn't behaving properly if the 2472 writing functions were called for more than one file, because of 2473 the static array not being cleared between uses (thanks yoyo) 2474 * Bugfix: Lyrics3 data wasn't being properly copied from the ['raw'] 2475 keys to the easy keys (['title'], etc.) (thanks Christian Fritz) 2476 * Bugfix: some testing code was accidentally left in 2477 getid3.thumbnail.php (thanks Christian Fritz) 2478 * Bugfix: RIFF/WAVE files are now more likely to have all their 2479 chunks parsed. 2480 * Bugfix: RIFF/WAVE bitrate & playtime now better calculated 2481 * Bugfix: MP3 scanning for synch doesn't go beyond 64k now, to stop 2482 intensive scanning through large file that don't have a synch 2483 (thanks soulcatcherØevilsoft*org for a weird sample file) 2484 Improved performance when scanning for MP3 synch (about 600% faster 2485 if the synch is never found) 2486 ZIP files no longer return the contents of each compressed file, as 2487 that would very easily be more data than PHP could handle. 2488 (thanks davidbullockØtech-center*com) 2489 getid3.check.php now displays entries in a more natural sort order: 2490 case insensitive, ignores most punctuation, treats accented chars 2491 the same as their unaccent equivalent (thanks mikeØftl*com) 2492 Added support for SmartSound-format RIFF files (which are regular 2493 RIFF/WAVE files with the first 4 chars changed from RIFF to SDSS) 2494 All instances of while(list() = each()) replaced with foreach() 2495 2496 24971.4.1b1: [April-11-2002] James Heinrich 2498 » Parses MIDI files. 2499 NOTE: very slow at parsing, much slower than any other file type 2500 NOTE: playtime is generally mostly accurate, but not always 100% 2501 » Parses ZIP files (if ZZIPlib available, and only in PHP 4.0.7RC1 2502 and later (see http://www.php.net/manual/en/ref.zip.php) 2503 NOTE: currently untested as I'm unable to find php_zip.dll for 2504 PHP/Win32 - if someone has a copy of this file, please email me: 2505 infoØgetid3Øorg 2506 » Parses JPEG files (requires GD installed) 2507 » Parses PNG files (requires GD v1.6+ installed) 2508 » Parses GIF files (requires GD < v1.6 installed) 2509 » For MP3s, once a valid synch is detected, the next 5 frames are 2510 also scanned for valid synch signatures, to prevent false 2511 identification of synch. For corrupt MP3 files this will be a bit 2512 slower, but hopefully produce more reliable results. 2513 (Thanks to mpdjØbtinternet*com for bringing this to my attention, 2514 and xbhoffØpacbell*net for explaining what was happening) 2515 (Thanks also to macik for helping me with MP3 frame lengths: 2516 http://66.96.216.160/cgi-bin/YaBB.pl 2517 ?board=c&action=display&num=1018474068) 2518 » The actual image data is now displayed (for JPEG, PNG and GIF 2519 images only) rather than a binary text dump in getid3.check.php 2520 (specifically table_var_dump()) for APIC frames. Made possible 2521 by the inclusion of (a modified version of) GetURLImageSize() by 2522 Filipe Laborde-Basto (www.rezox.com). You can right-click, save-as 2523 to extract the image to a file. 2524 NOTE: The actual image data is still returned in ['data'] 2525 ¤ ['image_mime'], ['image_width'], ['image_height'], ['image_bytes'] 2526 are now returned for APICs 2527 ¤ split parsing functions out into seperate files: lyrics3, id3v1, 2528 id3v2, mp3, ogg, riff, mpeg, midi, zip 2529 ¤ ['ogg']['bitrate_ave'] -> ['ogg']['bitrate_nominal'] (thanks to 2530 stephaneØtekartists*com for pointing out that "nominal" bitrate 2531 may actually differ significantly from the "average" bitrate) 2532 The real average bitrate seems to be only extractable by parsing 2533 the entire file and calculating the average bitrate. This is not 2534 yet an option, but hopefully in a future version of getID3() 2535 ¤ ['filename'] now returned for all files 2536 ¤ ['ogg']['date'] and ['ogg']['description'] now returned when 2537 available (thanks stephaneØtekartists*com) 2538 ¤ ['mpeg']['audio']['crc'] now contains the CRC (if present) 2539 ¤ ['bitrate'] is now returned as a double instead of an int 2540 ¤ ['dataoffset'] is now returned for all ID3v2 frames 2541 * Bugfix: MP3 CRC presence ['mpeg']['audio']['protection'] was being 2542 reported as opposite of what it actually should be 2543 * Bugfix: MPEG videos weren't being detected (they were being 2544 parsed as MP3), and even if they were, there was a typo in 2545 getMPEGHeaderFilepointer() (thanks Christian Fritz) 2546 * Bugfix: getid3.functions.php wasn't being included in 2547 getid3.write.php (thanks mikeØftl*com) 2548 * Bugfix: Browse:___ directory name in getid3.check.php wasn't 2549 correct with directory names with ' and other strange characters 2550 (thanks Christian Fritz) 2551 ID3v2FrameProcessing() now checks to see if the next frame is valid 2552 after it encounters an invalid FrameID, and if the next frameID 2553 appears valid, it will just skip the current (invalid) frame and 2554 continue processing (it would previously abort at the first sign 2555 of incorrect structure) (thanks stephaneØtekartists*com) 2556 getid3.check.php now scans filetypes based on content, not filename 2557 extension, and shows the filetype in the displayed output. Files 2558 are only scanned as MP3 if ID3v2 or MPEG-audio signatures are at 2559 the immediate beginning of the file (MP3 used to be the default 2560 format), so a corrupt file may not show up as MP3 format in the 2561 browse screen, but in detail it will scan in-depth 2562 getid3.check.php now has columns to show the presence of ID3v1, 2563 ID3v2 and Lyrics3 content 2564 Helium2 (www.helium2.com) has been known to write ID3v2.4 tags with 2565 non-synchsafe-integer framesizes, getID3() now checks for this and 2566 will override and parse the tag as ID3v2.3 if the tag would parse 2567 fine as ID3v2.3 when it's really specified as ID3v2.4 (thanks 2568 Christian Fritz for the test files) 2569 2570 25711.4.0b9: [April-05-2002] James Heinrich 2572 » Ogg files now return bitrate and playtime (playtime calculated 2573 from nominal bitrate and filesize, so it's only approximately 2574 accurate). (thanks stephaneØtekartists*com for the idea) 2575 * Bugfix: ID3v1 tags were not properly being parsed - track, genre 2576 and comment fields were incorrect. (thanks Christian Fritz) 2577 * Bugfix: getid3.check.php would not browse directories with single 2578 quotes (') or double quotes (") in the directory name. 2579 (thanks Christian Fritz) 2580 * Bugfix: Improved detection of MPEG-video files (a sample MP3 file 2581 had a false MPEG video signature at the beginning), and the MPEG- 2582 video parsing function now only looks for the MPEG-video header 2583 in the first 100k bytes of the file, to prevent needlessly 2584 scanning very large files. Also will not infinitely loop if it 2585 does not find what it's looking for. (thanks Christian Fritz) 2586 ['error'] now returned if MP3 synch doesn't occur at beginning of 2587 file if ID3v2 not used (ie there's some kind of padding there that 2588 should not be) 2589 Reduced use of fread() in getMPEGHeaderFilepointer() (now faster) 2590 Added "file parsed in x.xxx seconds" to getid3.check.php 2591 Added "browse: <directory>" link to getid3.check.php 2592 Changed default ID3v2 majorversion from 2.4 to 2.3 in 2593 getid3.write.php because Winamp (and probably many other 2594 ID3v2-aware tools) can only read up to ID3v2.3 2595 (thanks mikeØftl*com) 2596 2597 25981.4.0b8: [April-04-2002] James Heinrich 2599 » Lyrics3 support added (thanks Christian Fritz for the idea) 2600 ¤ check.php renamed to getid3.check.php 2601 ¤ write.php renamed to getid3.write.php 2602 ¤ ['id3']['id3v2']['error'] (if present) now reported in ['error'] 2603 ¤ ['mpeg']['audio']['error'] (if present) now reported in ['error'] 2604 * Bugfix: RoughTranslateUnicodeToASCII() was completely mangling 2605 UTF-16/UTF-16BE encoded text 2606 * Bugfix: The warning about MP3ext wasn't always showing up 2607 (thanks davidbullockØtech-center*com) 2608 getID3v1Filepointer() cleaned up & shortened 2609 Moved the include_once() statements around so that a minimum of code 2610 is included 2611 2612 26131.4.0b7: [April-03-2002] James Heinrich 2614 » RIFFs (specifically AVIs) are now more completely parsed, 2615 almost everything in the returned ['RIFF'] array has been moved 2616 around and/or restructured. A lot of new data is in there too - 2617 codecs, frame size, etc. 2618 ¤ Better recursive parsing of RIFFs (sub-arrays are now in the right 2619 place) 2620 * Bugfix: the isset() idea introduced in beta 5 was incorrectly 2621 implemented, such that ['asciidata'] and ['asciidescription'] were 2622 never returned - this had the side effect that ID3v2 comments were 2623 not copied to ['id3']['id3v2']['comment'] (thanks mikeØftl*com) 2624 * Bugfix: MPEG audio synch wasn't being detected, and therefore MPEG 2625 audio data not parsed, if no ID3v2 header present in an MP3 2626 ID3v1 track number only returned if greater than zero 2627 Removed !== FALSE (introduced in 1.4.0b6) from while(fread()) loops, 2628 some users were reporting problems with that syntax. 2629 Changed substr($string, 0, 1) to $string{0} syntax in most files 2630 Reformatted changelog.txt to 72-column width 2631 2632 26331.4.0b6: [April-01-2002] James Heinrich 2634 * Bugfix: 1.4.0b5 introduced a bug where any RIFF file other than 2635 PCM WAVE (this includes any compressed WAV, as well as all AVIs) 2636 would crash getID3() 2637 Reduced use of fread() in getOggHeaderFilepointer() for increased 2638 speed 2639 Added constant FREAD_BUFFER_SIZE for many fread() operations 2640 Added !== FALSE check to while(fread()) loops 2641 (thanks davidbullockØtech-center*com) 2642 Added more entries to RIFFwFormatTagLookup() 2643 (still looking for a good complete list) 2644 Converted use of hexdec() in getid3.lookup.php to 0x1234 notation 2645 2646 26471.4.0b5: [March-28-2002] James Heinrich 2648 ¤ Renamed decodeheader() to decodeMPEGaudioHeader() 2649 * Bugfix: Fixed infinite loop problem for RIFF/WAV files with 2650 unknown chunks 2651 * Bugfix: WXXX frames were incorrectly writing from ['URL'] instead 2652 of ['url'] 2653 * Bugfix: RoughTranslateUnicodeToASCII() wasn't properly decoding 2654 UTF-16/UTF-16BE 2655 Changed all quoted strings from " to ' to hopefully improve speed 2656 (although benchmarks have not yet shown any significant 2657 improvement in speed) (thanks davidbullockØtech-center*com) 2658 Improved code in check.php for dealing with symbolic links 2659 (thanks davidbullockØtech-center*com) 2660 Changed '<?' tags to '<?php' (thanks davidbullockØtech-center*com) 2661 Added processing time indicator in check.php 2662 (ie 'directory scanned in 2.45 seconds') 2663 Replaced all instances of feof() to prevent infinite loop conditions 2664 Moved lookup portions of decodeMPEGaudioHeader() to 2665 getid3.lookup.php 2666 Replaced $arrayname[$index] with $arrayname["$index"] to avoid PHP 2667 E_NOTICEs (thanks davidbullockØtech-center*com) 2668 Wrapped isset() around many if statements, to avoid PHP E_NOTICEs, 2669 hence improve speed (up to 30x speed improvement reported in some 2670 cases :) 2671 2672 26731.4.0b4: [March-26-2002] James Heinrich 2674 ¤ RIFF/WAV file format now parsed, returned under ['riff'] 2675 ¤ Support for Relative Gain Adjustment in RIFF/WAV files 2676 ¤ ['channels'] (1 or 2) now returned for MP3 and WAV files 2677 ¤ ['bitrate'] now returned (in bits-per-second) at root level for 2678 MP3 and WAV files 2679 Added support for RGAD (Relative Gain ADjustment) ID3v2 frames, both 2680 reading & writing 2681 (see http://privatewww.essex.ac.uk/~djmrob/replaygain/ for details 2682 on RGAD) (thanks Christian Fritz for the idea) 2683 Removed some test data-dumping from the ID3v2 writing functions 2684 Language code 'XXX' now returns descriptive string 'unknown' instead 2685 of NULL 2686 Seperated out comments from top of getid3.php into getid3.readme.txt 2687 and changelog.txt 2688 Split out non-lookup functions from getid3.lookup.php to 2689 getid3.functions.php 2690 2691 26921.4.0b3: [March-25-2002] James Heinrich 2693 ¤ ['asciidata'] for WXXX frames now returns correct information, but 2694 under ['asciidescription'] (thanks Christian Fritz) 2695 ¤ Added ['framenamelong'] to all returned frame data arrays with 2696 text description of that frame (ie 'RVA2' would return 'Relative 2697 volume adjustment (2)') (thanks Christian Fritz) 2698 ¤ ['datalength'] is now ['indexeddatalength'] in ASPI frames (was 2699 confliciting with the all-frames ['datalength'] as introduced in 2700 v1.4.0b1 2701 ¤ ['datalength'] now returned as integer (rather than double) where 2702 possible 2703 2704 27051.4.0b2: [March-21-2002] James Heinrich 2706 ¤ ['mpeg']['audio']['bitrate'] now returned as int rather than 2707 double for VBR files 2708 * Bugfix: MPEG audio information wasn't being parsed on files that 2709 had neither ID3v1 or ID3v2 2710 * Bugfix: COMM/WXXX frames weren't returning 'asciidata' in 2711 ID3v2.2, which also meant the ['id3']['id3v2']['comment'] field 2712 wasn't being returned (thanks stephaneØtekartists*com) 2713 * Bugfix: file might not be found if filename actually contains 2714 escaped chars or %xx-formatted characters 2715 (thanks reel_tazØusers*sourceforge*net) 2716 Added support for running with Register Globals turned off 2717 (thanks reel_tazØusers*sourceforge*net) 2718 Added urlencode() where needed in check.php 2719 (thanks reel_tazØusers*sourceforge*net) 2720 Fixed IE buffering/display problem in progress counter in check.php 2721 2722 27231.4.0b1: [March-11-2002] James Heinrich 2724 » ID3v2 writing support via WriteID3v2() in putid3.php 2725 RemoveID3v2() and RemoveID3v1() functions now available in 2726 putid3.php All ID3v1 and ID3v2 writing functions have been moved 2727 to putid3.php and example file write.php has been added to the 2728 distribution 2729 ¤ MPEG audio frame information (bitrate, frequency, etc) now 2730 returned inside ['mpeg']['audio'] instead of just ['mpeg'] 2731 ¤ MPEG video information now parsed, returned in ['mpeg']['video'] 2732 Note: audio portion of video system files is not yet being parsed 2733 ¤ All flag bits are now returned as boolean rather than int or 2734 string 2735 ¤ RVA2 data now returned as an array (multiple RVA2 tags are 2736 allowed) 2737 ¤ RVA2/EQU2 description returned under ['description'] rather than 2738 ['identification'] 2739 ¤ RVAD/EQUA adjustments now returned as signed integers, rather than 2740 absolute values which required you to check flag bytes 2741 ¤ RVRB/REV data no longer returns under ['reverb'] array 2742 ¤ WXXX/W???/LINK frames now return ['url'] instead of ['URL'] 2743 ¤ USER now properly returns both ['language'] and ['languagename'] 2744 ¤ OWNE now returns ['purchasedateunix'] as a UNIX timestamp 2745 (only if ['purchasedate'] is a valid date) 2746 ¤ ['id3']['id3v2']['padding'] now returned with information on padding 2747 ¤ ['headerlength'] now includes the initial 6 or 10 bytes of the 2748 ID3v2 header 2749 ¤ ['artist'], ['title'], ['album'], ['tracknumber'], ['genre'] now 2750 returned for easier access for Ogg files 2751 ¤ added ['datalength'] to all ID3v2 frames: length of frame data, 2752 not including frame header 2753 ¤ ['fileformat'] now returns 'id3' if there are ID3v1 or ID3v2 tags 2754 but no audio data 2755 ¤ ['fileformat'] now returns 'mpg' if it's an MPEG system (video + 2756 audio) file 2757 * Bugfix: RVAD was being parsed incorrectly 2758 * Bugfix: ['currency'] and ['purchasedate'] now correctly returned 2759 in OWNE 2760 * Bugfix: Frequncies in 'EQU2' frames were incorrectly double 2761 * Bugfix: ['bytedeviation'] and ['msdeviation'] now properly 2762 returned as integer rather than binary string for 'MLLT' frames 2763 * Bugfix: ['filename'] now properly returned for 'GEOB' frames 2764 * Bugfix: ['imagetype'] now properly returned for 'PIC' frames in 2765 ID3v2.2 2766 * Bugfix: Genre not being written if not set in WriteID3v1() 2767 (thanks reel_tazØusers*sourceforge*net) 2768 * Bugfix: Changed write mode to 'r+b' from 'a+' because ID3v1 tags 2769 were being appended instead of overwritten if they already existed 2770 (thanks reel_tazØusers*sourceforge*net) 2771 * Bugfix: open would fail on filenames containing quotes 2772 (thanks javierØcrackdealer*com) 2773 * Bugfix: various values were incorrectly returned (unneeded ord()) 2774 in these frames: COMR, USER, ENCR, GRID, PRIV, SIGN 2775 * Bugfix: ASPI ['bitsperpoint'] was not correctly returned 2776 * Bugfix: RoughTranslateUnicodeToASCII() was not returning the last 2777 char for UTF-16 2778 * Bugfix: ['audiobytes'] now correctly 0 if no synch found 2779 * Bugfix: GenreLookup was incorrectly returning 'Remix' instead of 2780 'Blues' for GenreID 0 2781 Added sample directory browser to check.php 2782 Seperated out MPEGaudio-parsing functionality into 2783 getOnlyMPEGaudioInfo() which may be called directly if you don't 2784 need any ID3 parsing (thanks djpretzelØcox*rr*com for idea) 2785 Reduced use of fread() for increased performance in 2786 getID3v1Filepointer() 2787 Added clearstatcache() before checking filesize - size after writing 2788 tag now correct 2789 Added hack for mp3Rage (www.chaoticsoftware.com) that puts 2790 ID3v2.3-formatted MIME type instead of 3-char ID3v2.2-format image 2791 type (thanks xbhoffØpacbell*net for test file) 2792 2793 27941.3.2: [February-15-2002] James Heinrich 2795 ¤ UFID/UFI, USLT/ULT, COMM/COM, APIC/PIC, GEOB/GEO, CRM, RVA2, EQU2, 2796 POPM/POP, AENC/CRA, ENCR and GRID frame data now returned under 2797 numeric array index rather than by ownerID 2798 ¤ RVA2 frame data is now returned keyed by $channeltypeid instead of 2799 $frame_idstring 2800 ¤ WXXX/WXX frame description now returned under ['description'] 2801 instead of ['data'] 2802 Trailing null bytes now trimmed from frame (W??? & T???) text data 2803 (it shouldn't be there to begin with, but a sample file encoded by 2804 [unknown program] had data padded to 50 chars with null bytes, 2805 which caused ParseID3v2GenreString() to freeze). 2806 2807 28081.3.1: [February-13-2002] James Heinrich 2809 * Bugfix: ['playtime_seconds'] and ['playtime_string'] were not 2810 being returned 2811 * Bugfix: ['fileformat'] was incorrectly being returned as a 2812 2-element array 2813 * Bugfix: USLT wasn't being correctly parsed 2814 Improved RoughTranslateUnicodeToASCII() 2815 (thanks reel_tazØusers*sourceforge*net for Unicode test file) 2816 2817 28181.3.0: [February-13-2002] James Heinrich 2819 » ID3v1 writing support via WriteID3v1() 2820 ¤ MPEG audio frame information (bitrate, frequency, etc) now 2821 returned inside ['mpeg'] 2822 ¤ ['mpeg']['raw'] returns the integer values of the bits for MPEG 2823 audio information as returned in ['mpeg'] by decodeheader() 2824 (thanks reel_tazØusers*sourceforge*net) 2825 ¤ 'protection', 'padding', 'private', 'copyright' and 'original' now 2826 return as boolean 2827 ¤ 'bitrate' and 'frequency' now return as int (except in special 2828 case of 'free') 2829 Language name as well as code retured where appropriate 2830 (ie 'English' and 'eng') 2831 Text frames with invalid TextEncoding value are now passed through 2832 anyway 2833 ID3v1 data (title, artist, album, year, comment) is now trimmed 2834 (no more nulls) 2835 RoughTranslateUnicodeToASCII() now uses utf8_decode() for UTF-8 2836 2837 28381.2.5: [January-30-2002] James Heinrich 2839 * Bugfix: Playtime calculations for VBR files were off slightly 2840 (rounding error) 2841 * Bugfix: Extended header length was incorrectly calculated 2842 * Bugfix: Genre strings such as '03' weren't being handled correctly 2843 More complete support for ID3v2.3 FrameIDs 2844 Split out getid3.frames.php (FrameID-specific parsing function) 2845 Split out getid3.lookup.php (assorted lookup-table functions) 2846 Searches for what directory getid3.*.php support files are in (must 2847 be same as getid3.php, but doesn't have to be same as main file - 2848 for example your main file could be /index.php, but including 2849 /lib/getid3/getid3.php) 2850 Simplified, tweaked, changed and/or eliminated several functions. 2851 2852 28531.2.4: [January-26-2002] James Heinrich 2854 » Basic support for reading Ogg-Vorbis comment tags 2855 2856 28571.2.3: [January-24-2002] James Heinrich 2858 » ID3v2.2.x 3-char FrameIDs are now fully parsed 2859 Note: While I've included support for 22 FrameIDs as defined in 2860 the specs, I don't have test files for all of them. If anyone 2861 knows of programs that generate any of the untested tags, please 2862 email infoØgetid3Øorg ! Here's what's tested and not: 2863 Tested: T??, COM 2864 Untested: UFI, TXX, W??, WXX, IPL, MCI, ETC, MLL, STC, ULT, SLT, 2865 RVA, EQU, REV, PIC, GEO, CNT, POP, BUF, CRM, CRA, LNK 2866 table_var_dump() now displays boolean variables as TRUE or FALSE 2867 table_var_dump() now uses htmlspecialchars() to avoid broken-table 2868 problems 2869 2870 28711.2.2: [January-18-2002] James Heinrich 2872 ¤ Parses ID3v2 genres into ['id3']['id3v2']['genreid'] and 2873 ['id3']['id3v2']['genrelist'] where appropriate 2874 (thanks stephaneØtekartists*com for the idea) 2875 Added ID3v2 genre abbreviations 'RX' (remix) and 'CR' (cover) 2876 2877 28781.2.1: [January-17-2002] James Heinrich 2879 * Bugfix: 'mp3' was being returned in ['format'], but 'zip' was 2880 being returned in ['fileformat'], both are now returned in 2881 ['fileformat'] 2882 ¤ Splits ['id3']['id3v2']['track'] in the format '5/12' into 2883 ['track'] = '5' and ['totaltracks'] = '12' 2884 ¤ Enabled ['id3']['id3v2']['title'] etc for ID3v2.2.x 2885 (3-char frame names) (thanks stephaneØtekartists*com) 2886 ¤ Changed v1.?? version number format to v1.?.? 2887 Scans through the file until it finds the MPEG synch (start of audio 2888 frame) - some files encoded by LAME 3.91 had undocumented padding 2889 after the ID3v2 header; getMP3headerFilepointer() now scans until 2890 it finds synch (or EOF) (thanks adamØtrekjapan*com) 2891 Improved Unicode conversion in RoughTranslateUnicodeToASCII() 2892 2893 28941.20: [January-15-2002] James Heinrich 2895 » Support for variable-bitrate (VBR) files, both Xing and Fraunhofer 2896 headers 2897 » All 4-character FrameIDs are now fully parsed according to the 2898 specs at http://www.id3.org/id3v2.4.0-frames.txt 2899 ¤ This means that most no longer return ['flags'] and ['data'] 2900 Note: While I've included support for 30 FrameIDs as defined in 2901 the specs, I don't have test files for all of them. If anyone 2902 knows of programs that generate any of the untested tags, please 2903 email infoØgetid3Øorg ! Here's what's tested and not: 2904 Tested: UFID, T???, WXXX, USLT, SYLT, COMM, APIC, GEOB 2905 Untested: TXXX, W???, MCDI, ETCO, MLLT, SYTC, RVA2, EQU2, RVRB, 2906 PCNT, POPM, RBUF, AENC, USER, OWNE, COMR, ENCR, GRID, 2907 PRIV, SIGN, SEEK, ASPI 2908 ¤ Added 'title', 'artist', etc names to ID3v2 data (easier to access 2909 than the 4-character FrameIDs of the ID3v2 standard) 2910 (thanks jaksonØgmx.net) 2911 * Bugfix: added fclose() at end of GetAllMP3Info() 2912 (thanks stephaneØtekartists*com) 2913 * Bugfix: ID3v1 wasn't being parsed if ID3v2 wasn't present 2914 (thanks jaksonØgmx.net) 2915 * Bugfix: several flags were being parsed incorrectly (the structure 2916 had changed from ID3v2.3 to ID3v2.4) - v2.3 flags were being 2917 incorrectly parsed 2918 Much more compact implementation of decodeheader() 2919 (thanks jaksonØgmx.net for the idea) 2920 ID3v1 genres 126 through 147 (thanks jaksonØgmx.net) 2921 New table_var_dump() function in check.php 2922 (based partially on idea by jaksonØgmx.net) 2923 Seperated ID3v1 retrieval into seperate function 2924 2925 29261.11: [December-23-2001] James Heinrich 2927 All functions merged into file getid3.php 2928 Updated documentation to reflect new returned information 2929 2930 29311.10: [December-20-2001] James Heinrich 2932 * Bugfix: ID3v1 Track# was incorrectly being parsed whether it 2933 existed or not 2934 Changed calling procedure to recommend using 2935 GetAllMP3info($filename) from getmp3header.php 2936 Now includes check.php - example file 2937 ¤ Checks to see if file is in ZIP or MP3 format 2938 (returned in ['format']) 2939 [Ed. Note: ['fileformat'] as of v1.2.1] 2940 2941 29421.06: [November-05-2001] James Heinrich 2943 * Bugfix: ID3v2.2.x frames weren't being parsed since they use 2944 6-byte rather than 10-byte headers as v2.3+ does 2945 (thanks spunkØmac*com for pointing that out) 2946 2947 29481.05: [September-06-2001] James Heinrich 2949 * Bugfix: ID3v2 was being parsed even if it didn't exist 2950 2951 29521.04: [July-16-2001] James Heinrich 2953 * Bugfix: typo in Extended Header section (strpad() should be 2954 str_pad()) (thanks jurroonØyahoo*com) 2955 2956 29571.03: [May-07-2001] James Heinrich 2958 * Bugfix: Added missing ['id3']['id3v1']['genreid'] and 2959 ['id3']['id3v1']['genre'] 2960 2961 29621.02: [May-05-2001] James Heinrich 2963 ¤ Added ['getID3version'] 2964 2965 29661.01: [May-04-2001] James Heinrich 2967 » Added support for frame-level de-unsynchronisation (as per 2968 ID3v2.4.0 specs) in addition to ID3v2.3.x tag-level 2969 de-unsynchronisation 2970 2971 29721.00: [May-04-2001] James Heinrich 2973 » Initial public release 2974 2975