source: branches/MootoolsFileManager-Update/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/Assets/changelog.txt @ 1302

Last change on this file since 1302 was 1302, checked in by gogo, 9 years ago

Updates to from GerHoblett?

Changes to said updates by gogo (sleemanj @ github)

Modifications to MootoolsFileManager? to work with those updates, some courtesy of GerHoblett?, some sleemanj

GerHoblett? provided a large diff which accomplished the goal in a quite different way. It has merit, however I have opted for a less-affecting path in so far as Xinha's "way" is concerned, namely, not splitting the config for a single plugin into several calls to backend config passing functions which seemed a little cumbersome.

Instead I take the option of using POST to send backend data around, at the minor expense of an extra round trip when displaying thumbnails (for each one). This could be reduced by checking for thumbnail existence and returning the thumbnail name directly in "onView" rather than the backend request to generate said thumbnail.

Still to do, is to make the preview pane thumbnail also work.

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