// +----------------------------------------------------------------------+
// | PHP version 5                                                        |
// +----------------------------------------------------------------------+
// | Copyright (c) 2002-2006 James Heinrich, Allan Hansen                 |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2 of the GPL license,         |
// | that is bundled with this package in the file license.txt and is     |
// | available through the world-wide-web at the following url:           |
// | http://www.gnu.org/copyleft/gpl.html                                 |
// +----------------------------------------------------------------------+
// | getID3() - http://getid3.sourceforge.net or http://www.getid3.org    |
// +----------------------------------------------------------------------+
// | Authors: James Heinrich <infoØgetid3*org>                            |
// |          Allan Hansen <ahØartemis*dk>                                |
// +----------------------------------------------------------------------+
// | Changelog                                                            |
// +----------------------------------------------------------------------+
//
// $Id: changelog.txt,v 1.47 2007/02/12 10:00:15 ah Exp $



        »  denotes a major feature addition/change
        €  denotes a change in the returned structure
        !  denotes a cry for help from developers
* Bugfix:  denotes a fixed bug


getID3() 2.x Version History
============================


2.0.0b4: [2007-01-12] Allan Hansen

    GENERAL
    » Major update to readme.txt
    » Added new section sample apps
    »    Added well-written sample application "morg". 
         See sample_apps/morg/screen_shots for more
    € option_tags_process now generates root key 'comments' with merged 
      values from 'tags'.
    € Removed option_tags_html. HTML entities is a thing of the past. 
      Use UTF-8 encoded pages instead. Saves bandwidth and is much easier.
    * Bugfix: PHP_NOTICE issue in BigEndian2Float().
    » Tag writing support: ID3v1
    » Tag writing support: APEtag
    » Tag writing support: FLAC
    » Tag writing support: Ogg Vorbis
    » Tag writing support: Lyrics3
    » SVG  file detection (no parsing)
    » PAR2 file detection (no parsing)
    » Got rid of windowed and option_helperapps_dir. Helper apps must be 
      somewhere in the path, e.g. c:\windows\system32 or /usr/bin

    ASF MODULE:
    * Bugfix: Wrong mime type (video/x-ms-wma instead of video/x-ms-wmv)
    for certain FourCCs.
    * Bugfix: Padding offset bug.

    DATA_HASH MODULE:
    € copy md5_data_source to md5_data if option set to true
    
    DTS MODULE:
    » New module (module.audio.dts.php)
    
    FLV MODULE:
    * Bugfix: DivByZero on zero length FLV files.
    * Bugfix: PHP_NOTICE one some files.
    
    ID3v1 MODULE:
    € Removed: Padding check.
    
    ID3v2 MODULE:
    * Bugfix: PHP_NOTICE issues with broken ID3v2 tag/garbage.
    * Bugfix: UTF-8/16 encoded frames terminated by \x00.
    * Bugfix: ID3v2 LINK frames iconv error.
    * Bugfix: Padding length calculated incorrectly.
    * Bugfix: ID3v2.3 extended headers non-conformance.

    LYRICS3 MODULE
    * Bugfix: Minor issues with lyrics3 (avoid PHP_NOTICE).
    
    PNG MODULE:
    * Bugfix: Module broken in regards to gIFg and gIFx chunks.
    
    MIDI MODULE
    * Bugfix: Minor issues with midi module (avoid PHP_NOTICE).

    MP3 MODULE:
    * Bugfix: Removed whitespace after ?>
    * Bugfix: Some CBR MP3 files detected as VBR with plenty of warnings.
    * Bugfix: PHP_NOTICE issues.
    
    MPC MODULE:
    € Mime type returned: audio/x-musepack 
    
    QUICKTIME MODULE:
    * Bugfix: TYPO in variable, resulting in unknown errors.
    * Bugfix: Incorrect frame rate returned.
    
    REAL MODULE:
    * Bugfix: fread() zero bytes issue.
    
    RIFF MODULE:
    * Bugfix: Wave files being detected as MP3.
    € Zero sized chunk invokes warning instead of error.
    
    SHORTEN MODULE:
    * Bugfix: Not working for wav files with fmt chunks <> 16 bytes.
    
    XIPH MODULE:
    » replaygain_reference_loudness from FLAC 1.1.3 moved from comments
      to ['replay_gain']['reference_volume'].
    » Supporting FLAC 1.1.3 PICTURE block.
    € FLAC: Removed some ['raw'] keys.
    

2.0.0b3: [2006-06-25] Allan Hansen
     
    AAC_ADTS MODULE
    * Bugfix: Static bitrate cache wrong result when parsing several files 
    
    ASF MODULE
    * Bugfix: Do not return NULL video bitrate for ASF v3.
    * Bugfix: ['codec'] key warning in module.audio-video.asf.php from 1.7.6,
    * Bugfix: audio & video bitrates sometimes wrong in ASF files from 1.7.6,
    € ASF lyrics now returned under [comments][lyrics] from 1.7.5,
    
    BMP MODULE
    * Bugfix: Undocumented bugfix between 1.7.3 and 1.7.6,
     
    DATA_HASH MODULE
    * Bugfix: Filenames not escaped with escapeshellarg() under UNIX.
    * Bugfix: UNIX: head and tail called with -cNNN instead of "-c NNN".
    
    FLV MODULE
    » No longer reads entire file into memory.
    
    ID3v1 MODULE
    €  Put back id3v1 padding check, since it exists in 1.7.6. 
    
    ID3v2 MODULE
    * Bugfix: PHP notices on bad ID3v2 frames from 1.7.6.
    * Bugfix: 'url_source' typo in module.tag.id3v2.php from 1.7.3.
    € ID3v2 "TDRC" frame now used as "year" in comments if TYER
      unavailable (TYER is deprecated in ID3v2.4)
    € Bugfix: gmmktime() instead of mktime(). 
     
    ISO MODULE
    € Using gmmktime() instead of mktime(). 
    
    GZIP MODULE
    ! Module is a memory hog. Reads entire file into memory. It also 
      gzdeflates() it to memory. Will use lots of memory on huge files.
      Please someone rewrite it to work with filepointers and seeking.
    » info['gzip']['files'] removed. Contains redundant information only. 
    » Replaced ['tar'] key with ['parsed_content']. Module can now parse 
      anything that getID3() can parse - not just tar files.
     
    JPEG MODULE
    * Bugfix: Error when php exif support enabled.

    LYRICS MODULE
    € Comments are no longer trimmed.

    QUICKTIME MODULE
    * Bugfix: incorrect dimensions from disabled Quicktime tracks from 1.7.6,
    € Added ['quicktime']['hinting'] key (boolean) from 1.7.4,
    * Bugfix: Quicktime 'mvhd' matrix values were wrong from 1.7.3,

    MIDI MODULE
    * Bugfix: Fixed bug that reported wrong playing time on some files.
    
    MP3 MODULE
    » Module fully working.
    » Memory caches are reset when scanning new file. Might make analyse 
      slightly slower, but will save lots of memory.
    » Removed unrecommended bruteforce code.
    * Bugfix: Encoder options should now return proper "--alt-preset n" /  
      "--alt-preset cbr n" when scanning more files. 
    * Bugfix: added LAME preset guessing for presets 410,420,440,490
      (thanks adminØlogbud*com)
    
    RIFF MODULE
    € No longer returns zero bits_per_sample for multiple formats.
    * Bugfix: Missing 'lossless' key in RIFF-WAV from 1.7.4.
    € Using gmmktime() instead of mktime(). 
    
    SHORTEN MODULE
    * Bugfix: Filenames not escaped with escapeshellarg() under UNIX.
    
    TAR MODULE
    » Module rewritten to work with filepointer only. Makes parsing a lot 
      faster (will fseek() past data). Also saves a lot of memory, expecially 
      with large files.
    » Added warning for non ASCII filenames, which breaks specification.  
    » info['tar']['files'] removed. Contains redundant information only. Also
      causes problems for non ASCII tar files, as filenames are used as keys
      in PHP arrays.
    
    XIPH MODULE
    * Bugfix: Error message when padding in FLAC files were used up.
    
    ZIP MODULE
    € Using gmmktime() instead of mktime(). 
    
    ICONV_REPLACEMENT MODULE
    * Bugfix: Major UTF-8 to UTF-16/ISO-8859-1 conversion bug (empty string 
    returned) when iconv() not available - from 1.7.4.
    * Bugfix: Other major bugfixes that broke the module.

    demo.joinmp3.php
    Demo removed - out of getID3()'s scope.
    
    PDF files can now be detected, but not parsed/analyzed.
    MSOffice files can now be detected, but not parsed/analyzed.
    

2.0.0b2: [2004-11-01] Allan Hansen 

    GENERAL
    * Bugfixes: Analyzed 3,000 files and compared result with 1.7.2 - several 
      minor bugs were fixed. Output of 2.0.0 should match 1.7.2 reasonable well.
    * Bugfix: fail_id3 and fail_ape code never executed.
      Wavpack4 support
      Quicktime/MP3-in-MP4, Apple Lossless support
    » New encoding_id3v2 option/hack for broken ID3v2 tags
    € Tags are no longer trim()ed.
    € Some ['bits_per_sample'] == 0 removed
    » New option_analyze - disable to detect format only.
    » New option_accurate_results - disable to greatly speed up parsing of
      AAC/ADTS, headerless MP3/MP2 VBR, midi (later), possible more in future.
      Warnings issued when disabled and accuracy affected!

    AAC/ADTS
    » Memory caches destroyed after analyze() to free up memory. 
    
    LA MODULE
    * Bugfix: RIFF tags now parsed properly
    
    OPTIMFROG MODULE
    * Bugfix: RIFF tags now parsed properly
    
    WAVPACK MODULE
    * Bugfix: RIFF trailer now parsed properly
    
    QUICKTIME MODULE
    € option_extra_info determines whether atom_data is returned
    € Removed $ParseAllPossibleAtoms option. We should only return useful data.
      zlib support in PHP optional reqirement
    * Bugfix: New iTunes crashes PHP - temp fix - no tags on those files.
      
    RIFF MODULE
    * Bugfix: Wavpack3 extra fields now parsed properly.
    € RIFF tags in Litewave files now parsed properly
    
    BONK MODULE
    * Bugfix: ['bonk']['ID3']['valid'] now returns bool instead of object
    
    NSV MODULE
    * Bugfix: PCM part ignored
    
    APETAG MODULE
    * Bugfix: APEtag 1.0 broken
    
    ASF MODULE
    € Embedded ID3v2 tags processes again - supported by Windows Media Player.
    
    DEMOS
    » demo.browse.php scans directories faster with inaccurate results.
    » demo.browse.php now uses javascript alert to show longer warnings etc
      instead of tool tips.
    » demo.browse.php now shows embedded covers just like the 1.7.x demo.
    » demo.browse.dhtml.php - DHTML version of the browser. Has progressive 
      display in MSIE - but quite slow when scanning LOTS of files.
    » New demo.mime_only.php for returning mime type only.
    » Search example in demo.mysql.php
    

2.0.0b1: [2004-08-23] Allan Hansen 

    » Major memory savings. 1.7.1 use 25% more memory under PHP 5.0.0 than 
      PHP 4.3.7. 2.0.0b1 memory usage is comparable to 1.7.1 under PHP 4.3.7.
      See Memory.xls for details (will not be included in 2.0.0 final).
      Loading all modules requires 4,277 kb of memory (4,171 with iconv() 
      support in PHP. Some of the modules  require more memory while scanning, 
      as they cache the results - MP3 and AAC/ADTS in particular. 

    » New internal testing method. Output of 2.0.0 matches that of 1.7.1
      exactly - except those places where we deliberately changed something.
      If something is changed it is because we did not have a test file
      to show it.

    » New extras directory.
      This contains multiple usefull code snips that really does not 
      belong to the main getID3() codebase - i.e. stuff that the user most
      likely can/will do differently.
      
    » Deleted getid3_lib.php 
      - Some common functions moved to getid3.php - getid3_lib declared 
        there.
      - Replaygain function moved to getid3.php   - new class 
        geti3_replaygain.
      - iconv() replacement function moved to new lib module.
      - md5/sha1 data hash function moved to new lib module.
      - Some function moved to the files that use them.
      - CopyTagsToComments() moved to extras dir.
      - EmbeddedLookup() gone - PHP5 use way more memory that way.
      
    » magic_quotes_runtime must be disabled before running getID3().
      If you use them, use set_magic_quotes_runtime(0) and
      set_magic_quotes_runtime(1) around your getID3() block.
      Older versions turned them on and off automatically. This would
      require a lot extra code, since they needed being restored before
      every first level throw.
      
    * Bugfix: Fixed multiple bugs in the caching extentions .
      
      Optimized most modules using new getid3_ReadSequence()
      
      Checked all(most) code using error_reporting (E_STRICT | E_ALL)

    € Removed all dead modules: EXE, RAR, Bink, Matroska, MOD*.
    € Kept magic bytes - getid3 will detect them and do nothing and return
      warning instead of error.
      
    € Disabled quicktime and mpeg modules as they depend on mp3-

    Reformatted and updated dependencies.txt


    GETID3 MAIN
    € getid3 option_tags_html     now defaults to false.
    € getid3 option_max_2gb_check now defaults to false.
    € New getid3 option_tags_images defaults to false. Scan tags for binary 
      image data - ID3v2 and vorbiscomments only. Possible apetag later.
      

    JPEG MODULE
    € Renamed module from jpg to jpeg.
    € Changed mime type to correct image/jpeg.
    € Added optional exif depency to depencies.txt for jpeg files.
      

    PNG MODULE
    € Made png zlib dependecy optional.
      

    BMP MODULE
    » Removed unused and unneeded PlotBMP() in bmp module.
      Removed extract_palette and extract_data code 
      - This does not belong in getid3. We should analyze files, not process 
        them.  If the user wants to display bmp files to the browser she can 
        convert them with ImageMagick or something similar. She will 
        probably have it installed already to resize user uploaded images.
      

    PCD MODULE
    » Removed $ExtractData from pcd module - same reason as BMP.
      

    SWF MODULE
    € Added zlib dependecy REQUIRED for swf.


    ID3v1 MODULE
    €  Removed id3v1 padding check - who cares? 
       - also removed in lyrics3 - if needed - it needs to be done differently 
       - no access to warnings and no sorting!
         

    ID3v2 MODULE
    € Made id3v2 zlib dependecy optional.
    € id3v2 - images  - changed 'image_mime' to actual mime type.


    AAC MODULE(s)
    » Split aac module in two - aac_adif and aac_adts.
      This saves memory if user only have files of one type (very likely).
      Replaced getid3_lib::Bin2Dec() with bindec() in aac modules - speed.


    AC3 MODULE
      Added ac3 optional dependency to dependencies.txt.
    € Changed riff module dependency on mp3 to optional.
      Changed wawpack references in riff module to wavpack3.
    * Bugfix: RIFFparseWavPackHeader() needs 28 bytes, not 22.
      
    
    ASF MODULE
    » Removed id3v1 dependency
    » Removed id3v2 dependency
    € ASF genres are no longer case adjustet to match standard ID3v1 ones. 
    € Embedded ID3v2 tags no longer processes. Not part of the ASF spec.
    € Changed warning at line 71 to error.
    » Removed a lot of unneeded conversions between Bytestring and GUID
    » Changed the constants from bytestring to GUID
    * Bugfix: Fixed incorrect warning messages on  
      	{4B1ACBE3-100B-11D0-A39B-00A0C90348F6}
      	{4CFEDB20-75F6-11CF-9C0F-00A0C90349CB}
    € Removed objectid, fileid, reserved_1_id and reserved where 'same'_guid
      exists.


    MP3 MODULE
    € MARKED MP3 MODULE BROKEN
      Removed echoerrors debugcode in mp3 module.
      Removed bruteforce code in mp3 module - never executed in 1.7.
      Removed $scan_as_cbr - not used.
    

    MPC MODULE(s)    
    » Split mpc module in two - SV7 in "mpc" and SV4-6 in mpc_old.
      This saves memory if user only have files of one type (very likely).
      
      
    OGG, FLAC MODULES
    » Merged interdependant modules ogg and flac into new module xiph.
    € Updated FLACapplicationIDLookup() with 2 new entries.

    
    REAL MODULE
    € Removed 'unknown' keys.

      
    SHORTEN MODULE
    » Improved UNIX shorten binary detection. Scanning `which shorten`, 
      /usr/bin, /usr/local/bin and checking is_executable()

    
    ISO MODULE      
    € Removed unused_ indexes in iso modules - they are afterall not used.
      

    DEMOS
    » Created new index.php in demos/ explaining what the different demos 
      does.

    » Rewrote demo.browse.php completely. 
      - Using public domain HTML abstraction library by Allan Hansen.
      - Removed security breach - able to browse any parent directory .
      - A $root_path must be set before browsing.
      - Screen width option.
      - Compressed filename column using title=.
      - Removed filesize column - not really that interesting.
      - Removed md5data column.
      - Removed total at the bottom - the user can probably figure out 
        how to implement this himself.
      - Added Audio column: sample_rate/bits_per_sample/channels columns.
      - Added scan_time columns - how long it took getid3 to process the 
        file.
      - Compressed artist, title and warning column using tool_tips.
      - Removed delete feature - possible security risk.
      - Repeating file header every 20 rows.
      - Added audio format/video format to format column.
      - Listing supported php modules in footer.
      - New colour scheme.
     
    » Rewrote demo.mysql.php completely.
      - Using multiple tables instead of just one. No string is stored 
        twice. Searching tags should be a lot faster for large databases.
      - Multiple artists, titles, genres, etc per file supported.
      - Using public domain HTML  abstraction library by Allan Hansen.
      - Using public domain MySQL abstraction library by Allan Hansen.
      - Scanning limited to $audio_path - security.
      - Included sample data that can be imported and browsed.
      
    » Rewrote demo.basic.php
    » Removed demo.simple.php - basic should be enough
    
    » Removed demo.joinmp3.php - this advanced demo should go in the extras
      module IF/WHEN the mp3 module is running again.
        
    € Updated demo.audioinfo.class - minor changes.
      

    MISC CODING SPECIFIC
      Partial new coding style - some is easily changed with Replace In Files
        - New file header - PEAR compatible
        - Indentation with four spaces instead of tab - PEAR compatible
        - array() changed to as array () - as suggested by PEAR standard
        - All(most) function names in MixedCase
        - Variables in $my_variable lowercase/underscores
        - (bool) $var changed to (bool)$var
        - A few "} else {" changed to "else {" to make room for easier 
          readable comments
        
      Removed all DivByZero checks. The plan was to catch them, but php 
      errors and warnings are not exceptions... Something needs to be 
      done here.

