Ampache PHP Cross Reference Groupware Applications

Source: /modules/getid3/docs/changelog.txt - 2781 lines - 145748 bytes - Summary - Text - Print

Description: part of getID3()                            //

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

title

Description

title

Description

title

Description

title

title

Body