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 &#0; 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 &#1234;
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 &#123;-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