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