[ Index ]

PHP Cross Reference of Drupal 6 (yi-drupal)

title

Body

[close]

/sites/all/modules/getid3/ -> changelog.txt (source)

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


Generated: Mon Jul 9 18:01:44 2012 Cross-referenced by PHPXref 0.7