///////////////////////////////////////////////////////////////// /// getID3() by James Heinrich // // available at http://getid3.sourceforge.net // // or http://www.getid3.org // ///////////////////////////////////////////////////////////////// // // // changelog.txt - part of getID3() // // See readme.txt for more details // // /// ///////////////////////////////////////////////////////////////// » denotes a major feature addition/change € denotes a change in the returned structure * Bugfix: denotes a fixed bug Version History =============== 1.7.7: [2006-06-25] Allan Hansen * Bugfix: AAC static bitrate cache wrong result when parsing several files. * Bugfix: Do not return NULL video bitrate for ASF v3. * Bugfix: getid3_lib::GetImageSize() broken => JPG module broken. * Bugfix: Encoder options should now be returned with correct "--alt-preset n" / "--alt-preset cbr n" when scanning more files. * Bugfix: Shorten module not escapeshellarg() filenames (UNIX only). * Bugfix: Filenames not escapeshellarg() for md5_data and sha1_data (UNIX only). * Bugfix: UNIX: head and tail called with -cNNN instead of "-c NNN". » Added detection support for PDF and MS Office documents (*.doc, *.xls, *.pps, etc) (thanks zeromassmediaØgmail*com) € Bugfix: ID3v2 "TDRC" frame now used as "year" in comments if TYER unavailable (TYER is deprecated in ID3v2.4) (thanks matthiasØpanczyk*org) € Removed GETID3_OS_DIRSLASH, replaced with DIRECTORY_SEPARATOR * Bugfix: added LAME preset guessing for presets 410,420,440,490 (thanks adminØlogbud*com) * Bugfix: Added escapeshellarg() call in getid3_lib::hash_data (thanks towbØgmx*net) » TAR module no longer reads entire file into memory » FLV module no longer reads entire file into memory * Bugfix: added LAME preset guessing for presets 410,420,440,490 (thanks adminØlogbud*com) * Bugfix: Added escapeshellarg() call in getid3_lib::hash_data (thanks towbØgmx*net) * Bugfix: Error message when padding in FLAC files were used up. * Bugfix: Shorten module not working under windows. € Bugfix: gmmktime() instead of mktime(). € Using gmmktime() instead of mktime() in ISO, ZIP, PNG and RIFF modules to avoid E_STRICT notices with PHP5.1+. * Bugfix: ['comments_html'] and ['comments'] contains different value when having multiple tags (one of them ID3v1) and the long field names. 1.7.6: [2006-03-12] James Heinrich * Rewrote getid3_lib::GetDataImageSize() to use GetImageSize() instead of using code by filØrezox*com * Bugfix: incorrect dimensions from disabled Quicktime tracks (thanks m-1Øgmx*net) * Bugfix: ['codec'] key warning in module.audio-video.asf.php (thanks niel*archerØblueyonder*co*uk) * Bugfix: undefined array in write.php (thanks drewishØkatherinehouse*com) * Bugfix: DeleteAPEtag() incorrectly failing when no tag present (thanks drewishØkatherinehouse*com) * Bugfix: ID3v2 writing frames with URL fields failing when URL is not in ISO-8859-1 (thanks drewishØkatherinehouse*com) * Bugfix: PHP notices on bad ID3v2 frames (thanks cw264701Øohiou*edu) * Bugfix: audio & video bitrates sometimes wrong in ASF files (thanks kris_kauperØexcite*com) 1.7.5: [2005-12-29] James Heinrich » Added FLV (FLash Video) support -- new file: module.audio-video.flv.php (thanks Seth Kaufman for code) » Real tags can now be written (previous Real tag writing code was not supposed to be in public releases, as it was not complete) » GETID3_HELPERAPPSDIR now autodetected under Windows € ASF lyrics now returned under [comments][lyrics] * Bugfix: removed "--lowpass xxxxx" info from guessed LAME presets when source frequency <= 32kHz * Bugfix: ID3v2 extended header errors * Bugfix: missing ob_end_clean() in write.id3v2.php (thanks rasherØgmail*com) 1.7.4: [2005-05-04] James Heinrich € Added ['quicktime']['hinting'] key (boolean) (thanks jonØwebignition*net) * Bugfix: major UTF-8 to UTF-16/ISO-8859-1 conversion bug (empty string returned) when using iconv_fallback (thanks chrisØfmgp*com) * Bugfix: Missing 'lossless' key in RIFF-WAV (thanks bobbfwedØcomcast*net) 1.7.3: [2005-04-22] James Heinrich » Added TAR support -- new file: module.archive.tar.php (thanks Mike Mozolin for code!) » Added GZIP support -- new file: module.archive.gzip.php (thanks Mike Mozolin for code!) * Bugfix: demo.browse.php now displays embedded images internally instead of passing local filename as IMG SRC (should allow demo.browse.php to correctly show embedded images over a network) (thanks patpowermanØhotmail*com) * Bugfix: minor UTF-8 display issues in demo.browse.php * Bugfix: demo.browse.php now works even if the evil setting magic_quotes_gpc is turned on (thanks patpowermanØhotmail*com) * Bugfix: incorrect MIDI playtime for some files (thanks joelØoneporpoise*com) * Bugfix: 'url_source' typo in module.tag.id3v2.php (thanks richardlynchØusers*sourceforge*net) * Bugfix: Quicktime 'mvhd' matrix values were wrong (thanks webØbobbymac*net) € ID3v2 now returns xx/yy for ['track'] (if available), with xx in ['tracknum'] and yy in ['totaltracks']. Previously ['tracknum'] was not available and ['track'] had only xx. Bugfixes and improvements to /demo/demo.mysql.php: - remix/version parsed from tags and stored in database, can be used when renaming files - track number can be used for renaming files 1.7.2: [2004-10-18] Allan Hansen » Added support for WavPack v4.0+ (thanks ahØartemis*dk) » Removed code for parsing EXE files (thanks ahØartemis*dk) Removed file: module.misc.exe.php * Bugfix: Large ID3v2 tags inside ASF not parsed properly under PHP5. * Bugfix: Certain Wavpack3 files failed under PHP5 due to new undocumented tmpfile() limit (same problem as above). * Bugfix: New iTunes crashes PHP - temp fix - no tags on those files. * Bugfix: ['nsv']['NSVs']['framerate_index'] might be wrong (thanks ahØartemis*dk) * Bugfix: transparent color was wrong from truecolor PNG (thanks ahØartemis*dk) * Bugfix: Changed MPC SV7 header size from 30 to 28, this will change hash values for MPC files (thanks ahØartemis*dk) * Bugfix: Changed MPC SV4-6 header size from 28 to 8, this will change hash values for MPC files (thanks ahØartemis*dk) € Trim/unset wavpack encoder_options to match 2.0.0b2 output. € Commented-out unknown/unused values in NSV and ISO modules (thanks ahØartemis*dk) 1.7.1b1: [July-26-2004] James Heinrich » Added support for Apple Lossless Audio Codec » Added support for RealAudio Lossless » Added support for TTA v3 » Added support for TIFF New file: /getid3/module.graphic.tiff.php » Modified iconv_fallback to work with UTF-8, UTF-16, UTF-16LE, UTF-16BE and ISO-8859-1 even if iconv() and/or XML support is not available. This means that iconv() is no longer required for most users of getID3() (thanks Jeremia, khleeØbitpass*com) » Added support for Monkey's Audio v3.98+ (thanks ahØartemis*dk) » Included new demo showing most-basic getID3() usage New file: /demos/demo.basic.php * Bugfix: LAME3.94+ presets cached incorrectly if multiple files are scanned in one batch and first file is LAME3.93 or earlier (thanks enoyandØyahoo*com) * Bugfix: Added warning if compressed ID3v2 frame decompression fails. (thanks Mike Billings) * Bugfix: Assorted small fixes to ensure compatability with PHP5 * Bugfix: ID3v1 genre "Blues" could not be written (thanks Jeremia) * Bugfix: ['bitrate_mode'] typo in module.audio-video.real.php (thanks asukakenjiØusers*sourceforge*net) * Bugfix: ['zip']['files'] is now populated with filenames even if End Of Central Directory couldn't be parsed * Bugfix: ['audio']['lossless'] was incorrect for FLAC (thanks WaldoMonster) * Bugfix: MD5 File was incorrect in directory browse mode for /demo/getid3.browse.php * Bugfix: PHP v5 compatability changes (float array keys, fread() calls with zero data length) (thanks getid3Øjsc*pp*ru) * Bugfix: was dying if on compressed ID3v2 frames if gzuncompress() function was unavailable * Bugfix: ['vqf']['COMM'] was always empty * Bugfix: MIDI playtime was missing for single-track MIDI files * Bugfix: removed � characters from ['comments_html'] (thanks p*quaedackersØplanet*nl) * Bugfix: improved MIDI playtime accuracy (thanks joelØoneporpoise*com) * Bugfix: BMP subtypes 4 and 5 were not being identified * Bugfix: frame_rate in AVI was incorrectly truncated to integer * Bugfix: FLAC cuesheet track index was incorrect (thanks tetsuo*yokozukaØoperamail*com) € ['quicktime']['display_scale'] now contains the playback scale multiplier for QuickTime movies - a movie set to playback at double-size will have "2" here. Other values are "1" and "0.5" € Added LAME preset guessing for --preset medium with v3.90.3 (thanks phwipØfish*co*uk) € Added $encoding_id3v1 to allow for ID3v1 encodings other than the standard ISO-8859-1 € Default AVI video bitrate_mode is now 'vbr' (thanks eltoderØpisem*net) Force getID3() to abort if Shorten files have ID3 or APE tags (thanks ahØartemis*dk) Editable textbox for parent directory in demo.browse.php (thanks eltoderØpisem*net) 1.7.0-hotfix [2004-03-17] Allan Hansen (hotfix version released by Allan Hansen) * Bugfix: PHP 4.1.x compatiblity - fgets($fp) => fgets($fp, 1024) * Bugfix: Added default charset to TextEncodingNameLookup() in module.tag.id3v2.php Ø Removed option_no_iconv iconv() support is only a requirement for WMA/WMW/ASF, and for destination encodings other than ISO-8859-1 and UTF-8, iconv is not needed otherwise. New 'iconv_req' in GetFileFormatArray() only set for WMA/WMV/ASF. analyze() now refuses to analyse WMA/ASF file if iconv is not present. iconv_fallback() only dies on internal errors not missing iconv() 1.7.0: [January-19-2004] James Heinrich » Added support for RIFF/CDXA files (MPEG video in RIFF container format (thanks chrisØdigitekdesign*com) » Added support for TTA v2 (thanks ahØartemis*dk) € ID3v2 unsynchronisation scheme disabled by default because most tag-reading programs cannot read unsynchronised tags. Can be overridden by setting id3v2_use_unsynchronisation to true. (thanks mikeØdelusion*org) € extention.*.php renamed to extension.*.php (thanks tp62Øcornell*edu) € /demo/demo.check.php renamed to /demo/demo.browse.php € Added id3v2_paddedlength configuration parameter to WriteTags() and renamed tag_language to id3v2_tag_language € MPEG audio layers are now represented as 1, 2 or 3 instead of 'I', 'II', or 'III' € Added [audio][wformattag] and [video][fourcc] for WAV and AVI € Added [audio][streams] which contains one entry for each audio stream present in the file (usually only one). The data is a copy of what is usually found in [audio]. If there are multiple audio streams then [audio] will contain a sum of the bitrates of all audio streams, and the data format of the first stream (if streams are of different data types) € Added BruteForce mode to mp3 scanning. Disabled by default as it is extremely slow and only files that are broken enough to not really play will gain any benefit from this. € Suppress '--resample xxxxx' appended to encoder options for mp3 with low-quality presets for default sampling frequencies € Enhanced LAME preset guessing for pre-3.93 with a better lookup table, --resample/--lowpass guessing (thanks phwipØfish*co*uk) € RIFF files with non-MP3 contents no longer have [audio][encoder_options] set € Added [audio][encoder_options] to audio formats where possible (including LiteWave, LPAC, OptimFROG, TTA) € Moved [quantization] and [max_prediction_order] from [lpac][flags] to just [lpac] € WavPack flags are now parsed into [wavpack][flags] * Bugfix: APEtags with ReplayGain information stored with comma- seperated decimal values (ie "0,95" instead of "0.95") were giving wrong peak and gain values * Bugfix: Filesize > 2GB not always detected correctly * Bugfix: Some ID3v2 frames had data key unset incorrectly (thanks chrisØdigitekdesign*com) * Bugfix: Warnings on empty-strings-only comments * Bugfix: ID3v2 tag writing may have had incorrect padding length if padded length less than current ID3v2 tag length and merge_existing_data is false (thanks mikeØdelusion*org) * Bugfix: hash_data() for SHA1 was broken under Windows * Bugfix: BigEndian2Float()/LittleEndian2Float() were broken * Bugfix: LAME header calculated track peaks were incorrect for LAME3.94a15 and earlier * Bugfix: AVIs with VBR MP3 audio data reported incorrect bitrate and bitrate_mode * Bugfix: AVIs sometimes had incorrect or missing video and total bitrates * Bugifx: AVIs sometimes had incorrect ['avdataend'] and therefore also incorrect data hashes (md5_data, sha1_data) * Bugfix: ID3v1 genreid no longer returned for Unknown genre * Bugfix: ID3v1 SCMPX genres were broken Modified LAME header parsing to correctly process peak track value for LAME3.94a16+ (thanks Gabriel) md5_file() and sha1_file() now work under Windows in PHP < 4.2.0 and 4.3.0 respectively with helper apps Default md5_data() tempfile location is now system temp directory instead of same directory as file (thanks towbØtiscali*de) Improved list of RIFF ['INFO'] comment key translations More helpful error message when GETID3_HELPERAPPSDIR has spaces /demo/demo.browse.php now autogets both MD5 and SHA1 hashes for files < 50MB Replaced PHP_OS comparisons with GETID3_OS_ISWINDOWS define (thanks necroticØusers*sourceforge*net) 1.7.0b5: [December-29-2003] James Heinrich » Windows only: Various binary files are now required for some file formats, especially for tag writing, as well as md5sum (and other) calculations. These binaries are now stored in the directory defined as GETID3_HELPERAPPSDIR in getid3.php (default is /helperapps/ parallel to /getid3/). Note: This directory must not have any spaces in the pathname. All neccesary files are available as a seperate download. See /helperapps/readme.txt for more information New file: /helperapps/readme.txt » Unified tag-writing interface for all tag formats New file: /getid3/write.php /getid3/write.apetag.php /getid3/write.id3v1.php /getid3/write.id3v2.php /getid3/write.lyrics3.php /getid3/write.metaflac.php /getid3/write.vorbiscomment.php » Added support for Shorten - requires shorten binary (head.exe is also required under Windows). New file: /getid3/module.audio.shorten.php » Added support for RKAU New file: /getid3/module.audio.rkau.php » Added (minimal) support for SZIP New file: /getid3/module.archive.szip.php » Added MySQL caching extention (thanks ahØartemis*dk) New file: /getid3/extention.cache.mysql.php » Added DBM caching extention (thanks ahØartemis*dk) New file: /getid3/extention.cache.dbm.php » Added sha1_data hash option (thanks ahØartemis*dk) » Added option to allow getID3() to skip ID3v2 without parsing it for faster scanning when ID3v2 data is not required. If you want to enable this feature delete /getid3/module.tag.id3v2.php (thanks ahØartemis*dk) € 8-bit WAV data now calculates MD5 checksums as normal, not converting to signed data as before, so stored md5_data_source in FLAC files will no longer match md5_data for the equivalent decoded 8-bit WAV. A warning will be generated for 8-bit FLAC files € Added option_no_iconv option to allow getID3() to work partially without iconv() support enabled in PHP (thanks ahØartemis*dk) € All '*_ascii' keys removed for ASF/WMA/WMV files € All 'ascii*' keys removed for ID3v2 tags € Ogg filetypes now return MIME of "application/ogg" instead of the previous "application/x-ogg" (thanks blakewattersØusers*sourceforge*net) € Force contents of ['id3v2']['comments'] to UTF-8 format from whatever encoding each frame may have (text encoding can vary from frame to frame in ID3v2) € MP3Gain information from APE tags suppressed from ['tags'] and parsed into ['replay_gain'] € ReplayGain information (all formats) changed from "Radio" and "Audiophile" to "Track" and "Album" respectively € ['volume'] and ['max_noclip_gain'] are now available in both ['replay_gain']['track'] and ['replay_gain']['album'] for all formats that calculate ReplayGain. € ['video']['total_frames'] is available for AVIs € All parsed ID3v2 frame data is now in ['id3v2'][XXXX][#] (previously some frame types would have numeric array keys if multiple instances of that frame type were allowed and other frame types would not) € ASF/WMA "WM/Picture" images are now parsed in the same manner as ID3v2 with the image (ex JPEG) data returned in [data] rather than [value] * Bugfix: Optional tag processing options were being ignored (ie ID3v1 still processed even if option_tag_id3v1 == false) (thanks ahØartemis*dk) * Bugfix: fixed MultiByteCharString2HTML() for UTF-8 * Bugfix: Quicktime files not always reporting video frame_rate * Bugfix: False ID3v1 synch patterns in APE or Lyrics3 tags are now detected and incorrect ID3v1 data not returned (thanks sebastian_maresØusers*sourceforge*net for the idea) * Bugfix: WMA9 Lossless now reported as lossless * Bugfix: two typos in ID3v1 genre list * Bugfix: MPEG-2/2.5 ABR/VBR MP3 files had doubled playtime * Bugfix: MPEG-2/2.5 LayerII (ie MP2: 24/22.05/16kHz) files were not detected due to incorrect frame length calculation * Bugfix: MPEG LayerI files were not detected due to incorrect frame length calculation (must be multiple of slot length) Added alternative md5_data via system call - twice as fast. Needs "getID3()-WindowsSupport" to work under Windows. (thanks ahØartemis*dk) ID3v2.4 compressed frames are now supported php_uname() calls changed to use PHP_OS constant Added SCMPX extensions to ID3v1 genres (0xF0-0xFE) Obfuscated contributor email address in changelog and sourcecode Added memory-saving EmbeddedLookup() function for lookup tables in RIFF and ID3v2 modules (thanks ahØartemis*dk) Major memory patches to many modules by using $var = &$INFO_ARRAY_AT_SOME_INDEX in place of large multi-dimensional array declarations. Memory saved: RIFF: ~200kB; ID3v2: ~475kB; ASF: ~50kB etc. (thanks ahØartemis*dk) 1.7.0b4: [November-19-2003] James Heinrich » Support added for MPC files with old SV4-SV6 structure » RealVideo now properly supported with resolution, framerate, etc (thanks jcsston) » RealAudio files with old-style file format (v2-v4) are now fully supported » Support added for DolbyDigital WAV files (thanks ahØartemis*dk) € ['RIFF'] is now ['riff'] to conform to make all root key names lowercase € ['OFR'] is now ['ofr'] to conform to make all root key names lowercase € ['tags_html'] is now available as a copy of ['tags'] but with all text replaced with an HTML version of all characters above chr(127), translated according to whatever the encoding of the source tag is, in the HTML form Ӓ € CopyTagsToComments() is now available in getid3_lib € QuicktimeVR files now return a ['video']['dataformat'] of 'quicktimevr' instead of 'quicktime' (thanks gtsØtsu*biz) € Quicktime video files with DivX, Xvid, 3ivx or MPEG4 video streams now return those names as ['video']['dataformat'] € MPEG video files are now identified with ['video']['codec'] set to either 'MPEG-1' or 'MPEG-2' (rather than just 'MPEG'). If you see a file wrongly identified, please report it! (thanks fccHandler) € All bitrate values in ['mpeg']['audio'] is now reported in bps rather than kbps (ie 128000 instead of 128) for consistancy € AVIs with MP2 audio now report ['audio']['dataformat'] as 'mp2' rather than 'wav' (thanks metalbrainØnetian*com) € Added ['md5_data_source'] for OptimFROG € AC3 in RIFF-WAV now identified with ['audio']['dataformat'] returning 'ac3' € WavPack ['extra_bc'] now returned as integer € WavPack ['extras'] now returned as 3-element array of integers € MP3 ['audio']['encoder options'] now returns 'VBR' or 'CBR' only (no bitrate) if no LAME preset is used, or 'VBR q??' where ?? is a number 0-100 for Fraunhofer-encoded VBR MP3s * Bugfix: VBR MP3s could have incorrect bitrate reported * Bugfix: Quicktime files with MP4 audio were not returning ['video']['dataformat'] (thanks robØmassive-interactive*nl) * Bugfix: strpad vs str_pad typo in module.riff.php (thanks nicojunØusers*sourceforge*net) * Bugfix: ReplayGain information was often wrong for MPC files * Bugfix: MD5 and other post-TAIL chunks were not being processed in module.audio.optimfrog.php * Bugfix: Undefined variable in table_var_dump() in demo/check.php * Bugfix: QuickTime files now only return information in [audio] or [video] if those exist in the file * Bugfix: WavPack no longer tries to read entire compressed data chunk * Bugfix: Properly handle VBR MP3s with "Info" (rather than "Xing") header frame. foobar2000 adds this to MP3 files when "Fix MP3 Header" function is used (thanks ahØartemis*dk) * Bugfix: Fraunhofer VBRI headers for MP3s were assuming 2-byte entries for TOC rather than using stride, and were ignoring the scaling value. (thanks sebastianØmaresweb*net) Several QuickTime atoms have been added to an exclusion list because they have been observed, but I have no idea what they are supposed to do so I can't add real support for them, but they should not generate warnings (robØmassive-interactive*nl) Old MPC encoder (before v1.06) was return as v0.00, now returned as 'Buschmann v1.7.0-v1.7.9 or Klemm v0.90-v1.05' (thanks ahØartemis*dk) Added check for magic_quotes_runtime and code to disable it if neccesary (thanks stefan*kischkelØt-online*de) Added 3ivx fourCCs to module.audio-video.quicktime.php MP3 and AC3 streams are now parsed when contained inside RIFF-WAV or RIFF-AVI container formats Better detection of named presets in LAME 3.93/3.94 1.7.0b3: [October-17-2003] James Heinrich » AC-3 (aka Dolby Digital) is now supported. New file: /getid3/module.audio.ac3.php * Bugfix: ID3v2-writing function Unsynchronise() was broken, which made ID3v2 tag containing binary data (typically pictures) get corrupted. (thanks t*coombesØbendigo*vic*gov*au, i*kuehlbornØndh*net, mikeØdelusion*org, mikeØftl*com) * Bugfix: Zip comments now returned as array instead of string, as they're supposed to be. * Bugfix: Quicktime/MP4 files may have reported extremely low bitrates (thanks spunkØdasspunk*com) Improved double-ID3v1 check to prevent false detection when string "TAG" is present in APE or Lyrics3 Fixed /demo/simple.php Fixed /demo/joinmp3.php Fixed /demo/mimeonly.php Fixed /demo/write.php 1.7.0b2: [October-15-2003] James Heinrich » TTA Lossless Audio Compressor format now supported. (http://tta.iszf.irk.ru) New file: /getid3/module.graphic.tta.php » PhotoCD (PCD) format now supported. Image data for the three lowest resolutions (192x128, 384x256, 768x512) can be optionally extracted. New file: /getid3/module.graphic.pcd.php € RIFF-MP3 files now should return the same ['md5_data'] as the identical MP3 file outside the RIFF container € Name of LAME preset used (if available, needs LAME v3.90+) returned in ['mpeg']['audio']['LAME']['preset_used'] and also as part of ['audio']['encoder_options'] € VQF module now sets ['audio']['encoder_options'] to i.e. CBR96 € MP3 module now sets ['audio']['encoder_options'] on CBR files and all LAME-encoded files € MPC module now sets ['audio']['encoder_options'] € Monkey module now sets ['audio']['encoder_options'] € AAC module now sets ['audio']['encoder_options'] to profile name € ASF module now sets ['audio']['encoder_options'] € Ogg module adds ['audio']['encoder_options'] -b 128 on Ogg Vorbis 1.0+ ABR files € Ogg module adds ['audio']['encoder_options'] -q N on Ogg Vorbis 1.0+ VBR files 44k/48k sample rate/stereo files only. € Ogg module ['audio']['encoder_options'] "Nominal birate: 80k" to other Ogg Vorbis files. € ID3v2 track number now returned as string (with leading zeros, if present in data) rather than integer (thanks Plamen) € ASF module returns ['asf']['comments']['encoding_time_unix'] if available (from WM/EncodingTime) € Fixed /demo/mysql.php and added some new features: - encoder options - ID3v2 "Encoded By" - non-empty comments - total entries in database summary (totals & averages) - database version update * Bugfix: 'UNICODE' iconv() charset changed to 'UTF-16LE' or 'UTF-16BE' as appropriate * Bugfix: iconv_fallback() function created in case iconv() fails * Bugfix: fixed MD5 calls in demo/check.php * Bugfix: reenabled detection of APE + Lyrics3 tags in same file * Bugfix: ASF module now returns ID3v1 genre as string instead of number - patch from Eugene Toder. * Bugfix: ASF module now reads non-standard field names, i.e. "date" as well as WM/Year - patch from Eugene Toder. * Bugfix: ASF module now returns genre as-is if it is not a standard ID3v1 genre (thanks wonderboy) * Bugfix: Eliminated false-synch problem in MP3 module * Bugfix: Fixed missing root ['bitrate'] for most formats * Bugfix: ['audio']['compression_ration'] missing for MPC (thanks WaldoMonster) * Bugfix: NSV module died in 1.7.0b1 * Bugfix: ASF module died in 1.7.0b1 when WM/Picture preset * Bugfix: ASF tracknumber incorrect when specified by WM/Track rather than WM/TrackNumber (thanks jgriffiniiiØhotmail*com) * Bugfix: MPEG audio+video playtime should now be pretty accurate (ie within 0.1% variation at most) (thanks mgrimmØhealthtvchannel*org) * Bugfix: ID3v2 not being copied to ['tags'] in some cases * Bugfix: LAME CBR files with Info tag were being incorrectly flagged as VBR (thanks Jojo) * Bugfix: LAME tag not being detected for LAME 3.90 (original) Changed regex pattern match for MP3 to include 3rd byte for more reliable/accurate pattern matching Added duplicate-ID3v1 tag checking (two ID3v1 tags, one after the other) that has been known to occur with iTunes (thanks towbØtiscali*de) Added instructions for enabling iconv() support under Windows Removed some unneccesary debugging code Suppressed duplicate PHP warnings for missing include files Included some missing dependencies in various files /demo/audioinfo.class.php now copies ['audio']['encoder_options'] 1.7.0b1: [2003-09-28] Allan Hansen This beta version was not made by James Heinrich. It was made by Allan Hansen - please send bug reports on this beta directly to me. James Heinrich will release 1.7.0 final, but it may take some time to work out the bugs from the major rewrite. This version could be called getID3lite. It makes a lot of checks optional and makes it easy to remove support for undesired formats It also is more library-like. Older versions of getID3() declared an incredible amount of global scope functions and defined several constants. 1.7.0beta1 still declares constants, but they are all prepended by GETID3_. It declares no global scope functions - they are all wrapped into classes. » Made getID3() depend on iconv library: compile PHP --with-iconv » Created new directory structure Moved all demos to demos/ Moved all getID3() files to getid3/ Renamed most files to module.something Changed header in all module.something to explain what they do Simply remove all modules you don't need Wrapped all modules into classes * Bugfix: Implemented misc patches from Eugene Toder * Bugfix: Implemented misc patches from "six" € Added root key 'encoding' € Added prefix GETID3_ to all defined constants. € Wrapped getid3.php into getid3 class € Wrapped getid3.functions.php into getid3_lib class Removed unused functions Moved several functions away from getid3.functions.php and into the files where they are actually used. Renamed getid3.functions.php to getid3.lib.php Moved getid3.rgad.php functions into getid3_lib Moved getid3.getimagesize.php funcitons ingo getid3_lib € Moved getid3.ogginfo.php into ogg module € Combined GetTagOnly() and GetAllFileInfo() in method analyze € Removed redundant and unuseful root keys 'file_modified_time' == filemtime($filename) 'md5_file' == md5_file($filename) 'exist' == file_exists($filename) € Changed root key ['tags'] from array of string to array of array of comments. Simplified code for detecting base path. Removed ob_ from InitializeFilepointerArray(). That was really a ugly HACK to get output from fopen. If user want the reason, he should open the file himself! Checking for APE tags before lyrics3 - makes Lyrics3 not depend on APE tag. It seems to work on my test file. Changed ['error'] and ['warning'] in multiple files to append to array instead of appending to string. That simplified code in getid3.php too. Simplified clean-up procedure: simply remove all empty root keys Setting tags in individual modules instead of main getid3.php Made Bonk and ASF modules non-dependent on id3 modules - id3 optional. Rewrote HandleAllTags() - simplified and convert comments to desired encoding. Replaced all calls to RoughTranslateUnicodeToASCII() in ASF module with a TrimConvert() method. This uses iconv() for conversion. It also converts from UNICODE instead of UTF-16BE, as the spec says it should. Replaced all calls to RoughTranslateUnicodeToASCII() in id3v2 module with iconv(). id3v2 module also reads $ThisFileInfo['encoding'] and converts all comments to this format. All other formats just add their comments in their native charset, but every comment field in id3v2 can have a different encoding, so this is needed. Did same thing as above with ISO module. However - it does not work. I need to find out how to specify big-endian unicode != UNICODING encoding name given to iconv(). Built-in assume mp3 format in getid3.php Temporarily nuked root key ['comments'] and CopyCommentsToRoot() Updated demo/audioinfo.class.php Updated demo/check.php - some thing don't work! Other demos are out of order! 1.6.5: [October-06-2003] James Heinrich » Added support for LiteWave (thanks supportØclearjump*com) Ø Split out speedup info from ['OFR']['OFR']['compression'] into ['OFR']['OFR']['speedup'] Ø If EXIF functions for JPEG not available, now warning not error Ø ID3v2 track number now returned as string (with leading zeros, if present in data) rather than integer (thanks Plamen) * Bugfix: now correctly parses cbSize element of WAVEFORMATEX structure (thanks supportØclearjump*com) * Bugfix: ASF module now reads non-standard field names, i.e. "date" as well as WM/Year - patch from Eugene Toder. * Bugfix: ASF module now returns genre as-is if it is not a standard ID3v1 genre (thanks wonderboy) * Bugfix: ['audio']['compression_ration'] missing for MPC (thanks WaldoMonster) Prevent infinite loop in MP3 histogram if framelength == 0 Added wFormatTag values 0x00FF and 0x2001 - 0x2005 (thanks steveØheadbands*com) Added "twos" and "sowt" FourCCs for Mac AIFC 1.6.4: [June-30-2003] James Heinrich » Added support for free-format MP3s (thanks Sebastian Mares for the idea) » Compressed (Flash 6+) SWF files are now handled properly (thanks alan*cheungØalumni*ust*hk) » Added DeleteLyrics3() to getid3.lyrics3.php » Added FixID3v1Padding() to getid3.putid3.php » Added new simple MP3-splicing sample file (thanks tommybobØmailandnews*com for the idea) New file: getid3.demo.joinmp3.php » Moved all contents of getid3.putid3.php into either getid3.id3v1.php or getid3.id3v2.php or getid3.functions.php as appropriate Removed file: getid3.putid3.php € ['error'] and ['warning'] keys now return as arrays, not strings € New root key for all files: ['file_modified_time'] (UNIX time) € getid3.demo.scandir.php renamed to getid3.demo.mysql.php € New demo file returns the MIME type only for a single file (thanks adminØe-tones*co*uk for the idea) New file: getid3.demo.mimeonly.php € Added check for valid ID3v1 padding (strings should be padded with null characters but some taggers incorrectly use spaces). A warning will be generated if padding is invalid. New boolean key ['id3v1']['padding_valid'] indicates padding validity. € CleanUpGetAllMP3info() removes more useless root keys for unknown-format files € Extended LAME information in ['mpeg']['audio']['LAME'] is now only returned for LAME v3.90+ € LAME-encoded MP3s now return ['mpeg']['audio']['LAME']['long_version'] as well as ['mpeg']['audio']['LAME']['short_version'] - these are identical in LAME v3.90+ but older versions will report longer more detailed version information if available € New Lyrics3 values: ['lyrics3']['raw']['offset_start'] and ['lyrics3']['raw']['offset_end'] € New optional parameter on getAPEtagFilepointer() to scan from a defined offset rather than end-of-file to allow scanning of APE tags before Lyrics3 tags € ['tag_offset_start'] and ['tag_offset_end'] are now present in ['ape'], ['lyrics3'], ['id3v1'] and ['id3v2'] € Numerous changes to the returned structure and content for La files, including parsing the seektable (if applicable) and parsing RIFF data occuring after the end of the compressed audio data (notably RIFF comments) (thanks mikeØbevin*de) € getSWFHeaderFilepointer() now has optional 3rd parameter $ReturnAllTagData (default == false) which if set to true will return data on all tags in ['swf']['tags'] € ['swf']['bgcolor'] now returns the 6-character string representing the background color in HTML hex color format (thanks ubergeekØubergeek*tv) € ['swf']['header']['frame_delay'] is no longer returned € getQuicktimeHeaderFilepointer() now has two additional optional parameters: $ReturnAtomData (default == true) and $ParseAllPossibleAtoms (default == false). Setting $ReturnAtomData to false will reduce the size of the returned data array by unsetting ['quicktime']['moov'] before returning. Leaving $ParseAllPossibleAtoms as false now suppresses parsing of several atom types that contain very large tables of data that are not typically useful. Atom type suppressed are: stts, stss, stsc, stsz, and stco (thanks ubergeekØubergeek*tv) € ['fileformat'] no longer set to 'id3' if ID3v1 or ID3v2 tag detected but no other data format recognized * Bugfix: La files now return the correct values for ['avdataoffset'] and ['avdataend'] and therefore the correct values for ['md5_data'] - note that ['md5_data'] values will not match values from previous versions of getID3() - the previous versions were incorrect (thanks mikeØbevin*de) * Bugfix: A temporary file was being created in the web server's root directory (not DocumentRoot) each time ['md5_data'] was calculated, and not removed due to lack of permissions. Temp file is now created (as it was supposed to be) in the directory of the file being examined, or the system temp directory, and properly removed when done. * Bugfix: Several incorrect values were being returned inside ['mpeg']['audio']['LAME'] (thanks bouvigneØmp3-tech*org) * Bugfix: SWF frame rates values were usually incorrect. (thanks alan.cheungØalumni*ust*hk and ubergeekØubergeek*tv) * Bugfix: ID3v2.2 files always flagged 4 bytes of invalid padding (thanks marcaØmac*com) * Bugfix: Lyrics3 without ID3v1 was not working properly * Bugfix: Lyrics3, APE & ID3v1 can all now exist in the same file. A warning is issued if APE comes after Lyrics3 (because Lyrics3- aware taggers probably are not APE-aware and therefore won't be able to find the Lyrics3 tag) (thanks mp3gainØhotmail*com) * Bugfix: WriteAPEtag() now writes the APE tag before any Lyrics3 tags (if present) and removes any incorrect ones that are after existing Lyrics3 tags (thanks mp3gainØhotmail*com) * Bugfix: RIFF-WAVE file with incorrect NumberOfSamples values in the 'fact' chunk no longer cause incorrect playtime calculation (thanks stprasadØindusnetworks*com) * Bugfix: getid3.demo.simple.php had undefined variables if the file needed to be deep-scanned with assumeFormat * Bugfix: fixed previously-incorrect ['avdataend'] values for APE and Lyrics3 tags in some cases, which in some cases means that ['md5_data'] is different than previously (now correct) Much-improved detection of AAC-ADTS, which also means MP3 format detection should now be nearly twice as fast Truncated AVIs and WAVs are now reported Number of new features and bugfixes in getid3.demo.mysql.php Quicktime 'meta' atoms now parsed, so Quicktime MP4 files can now return artist, title, album, etc (thanks spunkØdasspunk*com) Consolidated all comments processing functions (processing the ['comments'] and ['tags'] keys) into HandleAllTags() which now also checks to ensure that APE tags are really better than ID3v2 before using them in ['comments'] Known issue with Meracl ID3 Tag Writer v1.3.4 truncating last byte of MP3 file when appending new ID3v1 tag now specifically noted (rather than generic Probably Truncated File message) getid3.demo.mysql.php now stores last-modified time for each file getid3.demo.mysql.php is now case-sensitive for filenames getid3.demo.mysql.php can generate M3U playlists of any of the groups of files it can select (duplicate filenames, tag types, etc.) getid3.demo.mysql.php can now find mismatched tag contents and filenames getid3.demo.check.php now shows total number of errors & warnings GetFileFormatArray() now matches actual patterns for MP3 files based on the first two bytes of the file, rather than just the first one Simplified DeleteAPEtag() and made it work properly with Lyrics3 1.6.3: [May-17-2003] James Heinrich » Added support for Bonk (thanks ahØartemis*dk) New file: getid3.bonk.php » Added support for AVR (thanks ahØartemis*dk) New file: getid3.avr.php € Contents of getid3.id3.php moved to getid3.id3v1.php Removed file: getid3.id3.php € Contents of getid3.frames.php moved to getid3.id3v2.php Removed file: getid3.frames.php € Returned data structure documentation improved and updated and now stored in getid3.structure.txt rather than getid3.readme.txt New file: getid3.structure.txt € Now including the GNU General Public License in the distribution as getid3.license.txt New file: getid3.license.txt € Added new, optional, parameter to WriteAPEtag() (and also GenerateAPEtag()) which must be set to TRUE if the values you are passing are already UTF8-encoded, otherwise all data is encoded to UTF8 by default. For all ASCII/ANSI data this value should be left at the defaul value of FALSE. € Added third, optional, parameter to getID3v2Filepointer() - $StartingOffset (default == 0) which can parse an ID3v2 tag in a file at a position other than the start-of-file. € ['video']['pixel_aspect_ratio'] now returned when known € AVI files with WMA audio now return ['audio']['dataformat'] of 'wma' rather than 'wav' € ASF-WMA files now return the artist value from WM/AlbumArtist in ['comments']['artist'] (thanks msibbaldØsaebauld*com) € ASF-WMA files now return the 'author' value from ['asf']['content_description'] in ['comments']['artist'] instead of ['comments']['author'] € ASF-WMA files now return the 'description' value from ['asf']['content_description'] in ['comments']['comment'] instead of ['comments']['description'] * Bugfix: APE tag writing with multiple values for a tag (more than one ARTIST for example) was not being correctly written (thanks ahØartemis*dk) * Bugfix: CreateDeepArray() was returning an empty-string key as the top-level returned value - ['iso']['files'] now directly contains the file listing without an empty array in between. * Bugfix: ID3v2 genreid was not being returned in some cases. * Bugfix: APEv1 tags would generate error messages * Bugfix: APE tags would sometimes show phantom second entry for each item (title, artist, etc) with no data * Bugfix: APE tag writing was not UTF8-encoding the data - non-ASCII characters (above chr(127)) were being incorrectly stored (thanks ahØartemis*dk) * Bugfix: getid3.demo.scandir.php had undefined function error * Bugfix: getid3.demo.scandir.php would not display list of files with no tags Added link to getid3.demo.check.php from list of specific-tags files in getid3.demo.scandir.php 1.6.2: [May-04-2003] James Heinrich » New official mirror site for getID3() - http://www.getid3.org » Added basic support for SWF (Flash) (thanks n8n8Øyahoo*com) New file: getid3.swf.php » Added experimental support for parsing the audio portion of MPEG-video files. I don't have any actual documentation for this, so this part is experimental and not guaranteed accurate, but it seems to be working OK as far as I have been able to test it. Bug reports (or even better - documentation!) are welcome at info@getid3.org » Added new simple directory-scanning sample file New file: getid3.demo.simple.php » getid3.demo.write.php now writes APE tags as well. € Renamed getid3.write.php to getid3.demo.write.php € Renamed audioinfo.class.php to getid3.demo.audioinfo.class.php € getid3.php now automatically includes the getid3.functions.php function library file, no need to include it seperately. € getLyrics3Filepointer() has been changed to be consistant with all the other similar function structures - the parameters have changed. The old function has been renamed to getLyrics3Data() € Added DeleteAPEtag() function to getid3.ape.php € HandleID3v1Tag() now only handles ID3v1. Lyrics3 processing is now done by HandleLyrics3Tag() € If BitrateHistogram is enabled in getOnlyMPEGaudioInfo() it now also returns ['mpeg']['audio']['version_distribution'] showing the number of frames of each MPEG version (1, 2 or 2.5) - all frames *should* be of the same MPEG version € getID3v1Filepointer() always returns TRUE now, even if it didn't find a valid ID3v1 tag € getOnlyMPEGaudioInfo() now looks for MPEG sync in the first 128k bytes rather than the first 64k bytes € Added dummy function GetAllMP3info() to generate warning not to use that deprecated function. € ['video']['codec'] is now 'MPEG' for all MPEG video files (this will change to 'MPEG-1' or 'MPEG-2' as soon as I figure out how to determine that) (thanks jigalØspill*nl) € ['mpeg']['audio']['LAME']['mp3_gain'] renamed to ['mpeg']['audio']['LAME']['mp3_gain_db'] (gain in dB) € Added ['mpeg']['audio']['LAME']['mp3_gain_factor'] (gain as a multiplication factor) € Added support for Preset and Surround Info bytes from LAME VBR tag (http://gabriel.mp3-tech.org/mp3infotag.html) * Bugfix: APE tag writing would put the string 'Array' for all values rather than the actual data (thanks ahØartemis*dk) * Bugfix: Warning now generated for VBR MPEG-video files because getID3() cannot determine average bitrate. If you know of documentation that would tell me how to do this, please email info@getid3.org * Bugfix: Replay Gain values from Vorbis comments are now returned in ['replay_gain'] (and not in ['comments']) (thanks ahØartemis*dk) * Bugfix: Replay Gain values from APE comments are now correctly returned in ['replay_gain'] (thanks ahØartemis*dk) * Bugfix: getid3.demo.check.php is now case-insensitive when assuming a format for a corrupted file if standard detection does not identify the file type. * Bugfix: RIFF comments were overwriting/suppressing ID3 comments for RIFF-MP3 files (thanks wmØwofuer*com) * Bugfix: RIFF-MP3 files with 'RMP3' chunks instead of 'WAVE' were not being correctly identified. * Bugfix: ID3v2 padding shorter than the length of an ID3v2 frame header was not correctly detected * Bugfix: getid3.demo.check.php now does in-depth scanning for MP2 and MP1 files the same as for MP3 files based on file extension if a MPEG-audio structure isn't found immediately at the start of the file * Bugfix: removed condition where RIFF-WAV was being scanned for MPEG-audio signature when it shouldn't be present (non-MP3 WAV) * Bugfix: ASF files were not always showing correct audio datatype * Bugfix: array_merge_clobber() and array_merge_noclobber() were not being conditionally defined in getid3.functions.php (thanks rich.martinØreden-anders*com) * Bugfix: stream_numbers was not being correctly returned in bitrate_mutual_exclusion_object chunks of ASF files * Bugfix: Added support for 24kHz and 12kHz audio in ASF files * Bugfix: Removed possible undefined offset error in MP3s where cannot find synch before end of file * Bugfix: Removed potential out-of-memory crash situation when parsing Real files with chunks larger than the available memory (thanks jigalØspill*nl) * Bugfix: ID3v1 was incorrectly taking precedence over ID3v2 in the ['comments'] array (thanks lionelflØwanadoo*fr) * Bugfix: No longer calculates overall bitrate and playtime for VBR MPEG video files based on the audio bitrate. * Bugfix: AssumeFormat was not working properly Added summary footer line to getid3.demo.check.php Added '.mpeg' to the list of assume-format-from-filenames list in getid3.demo.check.php MPEG-video files now more reliably detected A number of additional features have been added to getid3.demo.scandir.php Added many RIFF-AVI audio types and fourcc video types to the lookup functions in getid3.riff.php Now identifes files with Lyrics3 v1 tags that are of incorrect length (v1 Lyrics3 is supposed to be 5100 bytes long, but [unknown program] writes variable-length tags (which is illegal for Lyrics3 v1)). getID3() now correctly parses these tags and issues a warning. Split GetFileFormat() to GetFileFormat() and GetFileFormatArray() HTML colors in getid3.demo.check.php are now defined as constant variables at the top of the file (if you want to change them) Added support for OptimFROG v4.50x (non-alpha) (new header fields) (thanks floringhidoØyahoo*com) Added support for Lossless Audio v0.4 (thanks mikeØbevin*de) 1.6.1: [March-03-2003] James Heinrich » Added support for writing APE v2. WriteAPEtag() in getid3.ape.php NOTE: APE v1 writing support will *not* be added to future versions of getID3() (thanks ahØartemis*dk and adamØphysco*com for the idea) » Added support for AIFF (Audio Interchange File Format) including AIFF, AIFC and 8SVX (thanks ahØartemis*dk for the idea) Removed file: getid3.aiff.php » Added support for OptimFROG (v4.50a and v4.2x) (thanks ahØartemis*dk for the idea) New file: getid3.optimfrog.php » Added support for WavPack (thanks ahØartemis*dk for the idea) » Added support for LPAC (thanks ahØartemis*dk for the idea) » Added support for NeXT/Sun .au format New file: getid3.au.php » Added support for Creative SoundBlaster VOC format New file: getid3.voc.php » Added support for the BWF (Broadcast Wave File) RIFF chunks "bext" and "MEXT" (thanks Ryan and njhØsurgeradio*co*uk) » Added support for the CART (Broadcast Wave File) RIFF chunks (thanks Ryan) » Added getid3.demo.scandir.php - a sample recursive scanning demo that scans every file in a given directory, and all sub- directories, and stores the resulting data in MySQL database, and then displays a list of duplicate files based on md5_data € ['md5_data_source'] now contains the MD5 value for the original uncompressed data for formats that store that information (currently only FLAC v0.5+). ['md5_data'] (if chosen to be calculated) will contain the calculated MD5 value for the compressed file. To check if 2 files are identical in every way, including all comments: compare ['md5_file']. To check if two files were compressed from the same source file: compare ['md5_data_source']. To check if the compressed audio/video data of two files is identical, even if comments or even the container file format is different (MP3 in RIFF container, FLAC in Ogg container, etc): compare ['md5_data']. € ['md5_data'] for 8-bit WAV files is now calculated based on a converted version of the data from unsigned to signed (MSB inverted) to match the MD5 value calculated by FLAC € New optional parameter added to GetAllFileInfo() - $MD5dataIfMD5SourceKnown (default: false). If false the md5_data value will NOT be calculated for files (such as FLAC) that have ['md5_data_source'] set, even if $MD5data == true. (thanks ahØartemis*dk) € getid3.check.php renamed to getid3.demo.check.php € Added GetTagOnly() function to getid3.php - similar to GetAllFileInfo() except only takes a filename as a parameter and only returns ID3v2, APE, Lyrics3 and ID3v1 tag information - no attempt is made to parse the data contents of the file at all. (thanks Phil for the idea) € Added ['audio']['lossless'] and ['video']['lossless'] for all formats (when known). Both are boolean values - true means the data is lossless-compressed, false means the data is lossy- compressed. € Added ['audio']['compression_ratio'] and/or ['video']['compression_ratio'] for all formats. Returns a number (usually) less than 1, where 1 represents no compression and 0.5 represents a compressed file half the size of the original file € Added ['video']['bits_per_sample'] to all video formats (when known) € Added ['video']['frame_rate'] to all video formats (when known) € ['fileformat'] set to 'mp1' or 'mp2' instead of 'mp3' when ['audio']['dataformat'] is one of those (thanks ahØartemis*dk) € Added 4th parameter to md5_data(), $invertsign, which will invert the MSB of each byte before MD5'ing. This is needed for 8-bit WAV files because FLAC calculates the stored MD5 value on signed data rather than the original byte values. ['md5_data'] of an 8-bit WAV will now match the ['md5_data_source'] value (thanks lichvarmØphoenix*inf*upol*cz) € ['ape']['items']['data'] and ['ape']['items']['data_ascii'] now contains an array of values, if the tag contains UTF-8 text (as opposed to binary data) € ['mpeg']['audio']['bitratemode'] renamed to ['mpeg']['audio']['bitrate_mode'] * Bugfix: Removed potential bug that could replace all MP3 file contents with only the new ID3v2 tag in getid3.putid3.php * Bugfix: md5_data values calculated for RIFF (WAV, AVI) files were incorrect (thanks ahØartemis*dk) * Bugfix: MP3 data in an MP4 wrapper fileformat could not identify bitrate (thanks ahØartemis*dk) * Bugfix: ['audio'] and/or ['video'] keys would sometimes get removed even if not empty * Bugfix: Prevented creation of null entries in ['RIFF']['WAVE']['INFO'] if a comment entry was not present * Bugfix: Potential infinite-loop condition in getid3.ogg.php (thanks afshin.behniaØsbcglobal*net) * Bugfix: Ogg files with illegal ID3v1 (and/or APE or Lyrics3) tags were not finding the last Ogg page (thanks afshin.behniaØsbcglobal*net) * Bugfix: replay-gain values not properly set from LAME tag * Bugfix: RIFF-MP3 had incorrect md5_data * Bugfix: the LAME DLL CBR problem of not re-writing the LAME frame at the beginning of the data is now detected for MP3s with ID3v2 tags as well * Bugfix: APE tags with multiple values (ie multiple entries in the "artist" tag) are now shown properly in ['ape']['items'] * Bugfix: fixed condition where APE tag with no ID3v1 tag could be mistaken for APE tag with ID3v1 (and incorrectly parsed) * Bugfix: added warning if ID3v2 frame has zero-length data (thanks cmassetØclubinternet*fr) * Bugfix: getid3.frames.php looking for non-existant key in USER frames Improved detection of RIFF-MP3 data. [unknown program] encodes RIFF-WAV data with a chunk name of 'RMP3' instead of the standard 'RIFF' Encoder now returned in both ['comments'] and ['audio']['encoder'] for RIFF-WAV files with an INFO.ISFT chunk Generate a warning for FLAC files encoded with v0.3 or v0.4 because audio_signature is not calculated during encoding (thanks ahØartemis*dk) Modified getid3.check.php to display md5_data_source as well as md5_file and md5_data if display-MD5 mode is selected Modified getid3.check.php to assume-format based on file extension in browse mode if fileformat is found to be 'id3' (formerly only if the fileformat was null) Changed scaling of BitrateColor() from representing 1-256kbps to representing 1-768kbps for better display of high-bitrate files, specifically lossless-compressed CD-audio (FLAC, LA, etc) 1.6.0: [January-30-2003] James Heinrich » Added support for OggFLAC (FLAC data stored in an Ogg container) (thanks ahØartemis*dk for the idea) » Added support for Speex (the data stored in an Ogg container) » Comments are now available in the root 2-dimensional array ['comments'] - each entry in this array will contain one or more strings. For example, if there are two artists then ['comments']['artist'][0] will contain the first one and ['comments']['artist'][1] the other. All keys are forced lowercase. Comments will be stored in the ['comments'] array in this order of precedence: 1) Native format tags (ASF, VQF, NSV, RIFF, Quicktime, Vorbis) 2) APE tags 3) ID3v2 4) Lyrics3 5) ID3v1 Lower-priority tags will not overwrite or append existing values of higher-priority tags (for example, 'artist' in ID3v1 will be ignored if already specified in APE), but missing values will be filled in (for example, if 'album' is specified in ID3v2 but not in APE, it will be included in the ['comments'] array). Note: Root keys (['title'], ['artist'], etc) are NOT available in this or future versions of getID3(). (thanks ahØartemis*dk) » MD5 hashes are now available for all formats for both the entire file (['md5_file']) and the portion of the file containing only the audio/video data, stripped of all prepended/appended tags like ID3v2, ID3v1, APE, etc - ['md5_data'] (thanks ahØartemis*dk for alternate md5_file() function that runs on UNIX system running PHP < 4.2.0) NOTE: Ogg files require the use of vorbiscomment to obtain the md5_data value. vorbiscomment must be downloaded from http://www.vorbis.com/download.psp and placed in the getID3() directory. All Ogg formats (Vorbis, OggFLAC, Speex) are affected by this problem, but only OggVorbis files can be processed with vorbiscomment. OggFLAC and Speex files will be processed by getID3(), but this may result in an incorrect value for md5_data in the event that VorbisComments are larger than 1 page (4-8kB). NOTE: md5_data for Ogg will not work if PHP is running in Safe Mode » There is now a wrapper class available, written by Allan Hansen, which should simplify extracting most common basic information (such as format, bitrate, comments). New file: audioinfo.class.php » OggWrite() in getid3.ogginfo.php has been replaced with a new version that uses vorbiscomment to write the comments, because of a reported bug that can corrupt OggVorbis files such they cannot be played. NOTE: Ogg comment writing now requires the use of vorbiscomment which must be downloaded from http://www.vorbis.com/download.psp and placed in the getID3() directory. NOTE: Ogg comment writing will not work if PHP is running in Safe Mode € New root key ['tags'] is now always returned for all formats. It is an array that may contain any of: * Native format tags: 'vqf', 'riff', 'vorbiscomment', 'asf', 'nsv', 'real', 'midi', 'zip', 'quicktime' * Appended data tags: 'ape', 'lyrics3', 'id3v2', 'id3v1' € New root key ['audio'] is an array containing any or all of: codec, channels, channelmode, bitrate, bits_per_sample, dataformat, bitrate_mode, sample_rate, encoder Note: This replaces several root keys, including: bitrate_audio, bits_per_sample, frequency, channels € New root key ['video'] is an array containing any or all of: bitrate_mode, bitrate, codec, resolution_x, resolution_y, resolution_y, frame_rate, encoder Note: This replaces several root keys, including: bitrate_video, resolution_x, resolution_y, frame_rate € ['id3']['id3v1'] has moved to ['id3v1'] € ['id3']['id3v2'] has moved to ['id3v2'] € ['audiodataoffset'] and ['audiodataend'] have been renamed to ['avdataoffset'] and ['avdataend'] respectively € GetAllMP3info() has been changed to GetAllFileInfo() with a different parameter list ($allowedFormats is no longer a parameter). Check your code where you're calling GetAllMP3Info() - you will need to change both the function name and the parameter list if you pass more than 2 parameters € All formats now return ['audio']['dataformat'] and/or ['video']['dataformat'] where appropriate - this goes along with ['fileformat'] - ['fileformat'] will return the actual structure of the file, whereas ['dataformat'] will return the format of the data inside that structure. For example, an Ogg file can contain Vobis data (normal), or it can contain FLAC data in the Ogg container format. In that case, ['fileformat'] would be 'ogg', but ['dataformat'] would be 'flac'. Note: this means that WAV and AVI files now return a ['fileformat'] of 'riff' rather than 'wav' or 'avi'. € ['filesize'] is no longer returned for files larger than 2GB because PHP does not support large file access. Attempting to parse a file larger than 2GB will result in a message stored in ['error'] and ['filesize'] not set. € APEtag, ID3v1, and ID3v2 are now supported on ALL multimedia files - even if illegal by format. Ogg will return warning if ID3/APE tags are present. (thanks ahØartemis*dk) € All files: non-critical errors are now returned in the root key ['warning'] rather than ['error'] (only critical errors that prevent getID3() from correctly parsing the file are returned in ['error'] (thanks ahØartemis*dk) € Renamed all references to $MP3fileInfo to $ThisFileInfo € Joliet now supported for ISO-9660. ['iso']['supplementary_volume_descriptor'] is now returned, if available, and ['iso']['files'] will contain ASCII equivalents of the Unicode directory structure & filenames stored. € Moved Monkey's Audio code from getid3.ape.php to seperate file. New file: getid3.monkey.php € Added new keys for ISO-9660: ['name_ascii'] for directories, ['file_identifier_ascii'] for files € Added root key ['track'] for CD-audio files € Ogg/Vorbis-comment files now have comments returned inside ['ogg']['comments_common'] as an array of strings, rather than simple strings in ['ogg'] € Quicktime files now have comments returned inside ['quicktime']['comments'] as an array of strings, rather than simple strings in ['quicktime'] € ['mime_type'] is a new root key returned for all supported formats (thanks ahØartemis*dk) € ['fileformat'] now returns 'mp1' instead of 'mp3' for MPEG-1 layer-I audio files (thanks ahØartemis*dk) € ['mpeg']['audio']['bitratemode'] now returns lowercase € MPEG-4 audio files which consist of MP3 data wrapped in a Quicktime fileformat will now return the usual data in ['mpeg']['audio'] € Type-1 DV AVIs are now supported € DV AVIs will return 1 or 2 in ['RIFF']['video'][x]['dv_type'] € Changed ['fileformat'] from 'mpg' to 'mpeg' for MPEG video files € ASF comments are now stored in ['asf']['comments'] instead of ['asf'] € RealMedia chunk data is now returned inside ['real']['chunks'] instead of ['real'] € ['replay_gain'] now properly populated from APE tags € Added support for ASF_Old_ASF_Index_Object in ASF files (thanks ahØartemis*dk) € AAC-ADTS files now return ['aac']['bitrate_distribution'] € ParseVorbisComments() has been replaced with ParseVorbisCommentsFilepointer() (with different parameters) € All references to any key ['frequency'] are now ['sample_rate'] € Moved ID3v2 comments from ['id3v2'] into common root ['comments'] structure, and now returns more values than before * Bugfix: ['iso']['files'] and ['zip']['files'] could potentially contain duplicate entries (in a numeric-indexed array) for files if the directory structure specifies files multiple times. Entries are now guaranteed unique, with the last entry for the file overwriting any former ones. * Bugfix: RIFF parsing had numerous issues, including: - large AVIs would take a very very long time to parse - chunks with odd (not even) sizes would cause the parser fail - video and/or audio codecs not always identified The ParseRIFF() function has been completely rewritten and fixes all known issues with RIFF parsing. Users are, however, encouraged to double-check output of any parsed (AVI/WAV/CDDA) files. * Bugfix: Modified getid3.riff.php to return correct total bitrates for AVIs with multiple audio streams * Bugfix: GetFileFormat() was not creating array structure correctly (thanks ahØartemis*dk) * Bugfix: LAME tag for MP3s can only specify up to 255kbps, so any files with actual CBR bitrate of >=256 were reported incorrectly * Bugfix: Lyrics3 synched lyrics were not being correctly returned * Bugfix: CreateDeepArray() was broken for non-nested cases, which meant ZIP and ISO ['files'] structures were broken * Bugfix: Incorrect pattern matching for ZIP files meant no zip files were being detected as such * Bugfix: AAC-ADIF was returning an incorrect number of channels (too few) in some cases (thanks ahØartemis*dk) * Bugfix: Vorbis comments were returning an incorrect value for ['dataoffset'] in some cases * Bugfix: MPEG video ['marker_bit'] and ['vbv_buffer_size'] were incorrect * Bugfix: ['playtime_string'] could potentially have a value of x minutes and 60 seconds (ie 3:60 instead of 4:00) Added support for FLAC cuesheets (FLAC 1.1.0+) (thanks ahØartemis*dk) Improved parsing speed in MP3, MP2 and AAC (thanks ahØartemis*dk) Extra error-checking added to try and identify corrupt files for most audio formats (thanks ahØartemis*dk) More accurate playtime calculation for RealMedia (thanks ahØartemis*dk) Changed all relevant files to use ['audiodataoffset'] and ['audiodataend'] rather than ['filesize'] where appropriate (thanks ahØartemis*dk) Added text encoding type 255 as a duplicate of UTF-16BE but with Big-Endian rather than Little-Endian byte order Added many RIFF-AVI audio types and fourcc video types to the lookup functions in getid3.riff.php Added numerous new known GUIDs to getid3.asf.php Added PoweredBygetID3() function to easily get a "powered by" string with the current getID3() version. Added "Morgan Multimedia Motion JPEG2000" (MJ2C), "DivX v5" (DX50) and "XviD" (XVID) codecs to list of known codecs in getid3.riff.php Changed GETID3_INCLUDEPATH path seperators to forced / (from \ for Windows) Modified getid3.check.php to only change \ directory seperators to / on Windows operating systems Modified getid3.check.php to handle larger-than-2GB files (which now do not return a filesize) Modified getid3.check.php to handle ['dataformat_audio'] and ['dataformat_video'] Modified getid3.check.php to show a list of present tags in one column rather than one column for each of ID3v1, ID3v2, etc Modified getid3.check.php to show MD5 values. Initially disabled but can be enabled for a directory with a click. md5_file is always calculated when displaying detailed info about a single file; md5_data is calculated if the file is < 50MB Modified getid3.check.php to show errors and warnings. Details are visible with a mouseover or a click. Changed getid3.check.php to use SafeStripSlashes instead of a manual conditional directory name replacement for special characters Added sample recursive scanning sample code to getid3.readme.txt (thanks lipisinØmail*ru for the idea) 1.5.7: [January-10-2003] James Heinrich » Added support for ISO 9660 (CD-ROM image) format. Most-useful data is directory structure returned under ['iso']['files'] Note: Only ISO-9660 supported, not (yet) Joliet extension (thanks nebula_djØsofthome*net for the idea) New file: getid3.iso.php € ZIP files are now parsed by getID3() itself without relying on built-in PHP functions and/or ZZipLib support. (thanks Vince for the idea) € ZIP files now return a simple directory listing with filename and filesize info only under ['zip']['files']. Note: empty subdirectories will note appear in here, only files and non-empty subdirectories. Information for all entries, including empty subdirectories, is available under ['zip']['central_directory'] (or under ['zip']['entries'] if the Central Directory cannot be located (usually due to a trucated file). € RIFF-WAV files with MP3 data (or MP3s with RIFF headers, if you want to think of it that way) now have the MPEG audio portion scanned and the usual data returned in ['mpeg']['audio'] if the RIFF audio codec has wFormatTag of "85" (identified by getID3() as "MPEG Layer 3") (thanks ahØartemis*dk for the idea) € EXIF data (if present) is returned for JPEG files under ['jpg']['exif'] (thanks nebula_djØsofthome*net) € ['filepath'] now returned for all files with the directory part of the full filename. € ['filenamepath'] is now returned for all files (equivalent to ['filepath'].'/'.['filename']) * Bugfix: ['id3']['id3v2'][]['dataoffset'] was wrong * Bugfix: MP3s tagged with iTunes have an invalid comment field frame name ('COM ' - should be 'COMM') but the data is valid otherwise; the frame is now renamed to 'COMM' and parsed normally (with the error noted in ['error']) (thanks kheller2Ømac*com for the sample file) * Bugfix: Some ASF/WMA audio files were not being identified as any format (thanks ahØartemis*dk) * Bugfix: Warning now generated and ASCII format assumed for invalid text encoding values in ID3v2 * Bugfix: Changed ZIP detection pattern from 'PK' to 'PK\x04\x03' * Bugfix: Ogg/FLAC files with large Vorbis comments were dying in an infinite loop with lots of error messages due to missing $fd parameter on ParseVorbisComments() (thanks ahØartemis*dk) * Bugfix: ['data'] and ['image_mime'] were being returned for all Ogg comments even if they were not images for versions of PHP that have image_type_to_mime_type() built in (ie PHP 4.3.0+) 1.5.6: [December-31-2002] James Heinrich » Added support for NSV (Nullsoft Streaming Video) (www.nullsoft.com/nsv/) (thanks demonØsoundplanet*com for the idea) New file: getid3.nsv.php » Added support for CD-audio track files (track01.cda etc) € Added standard ['frame_rate'] root value when known (AVI, NSV, MPEG-video) € ASF files now report ['fileformat'] of: 'wmv' when Windows Media Video codec v7/v8/v9 is used; 'wma' when any 'Windows Media Audio' named audio codec is used and no video stream is present; 'asf' in all other cases (audio-only, video-only, or both) € Removed support for ZIP functions (will be rewritten to not require ZZIPlib support in future versions) € Added function SafeStripSlashes() as a drop-in replacement for stripslashes(), but that only strips slashes if magic_quotes_gpc is set € Removed support for remote file scanning (HTTP / FTP) € Added ['aac']['frames'] (number of AAC frames in file) € Added ['mpeg']['audio']['frame_count'] when a bitrate histogram is created € Average bitrate for VBR MP3/MP2 is calculated from actual counts of frames of various bitrates (rather than relying on the header values or filesize) when a bitrate histogram is created € RecursiveFrameScanning() split out into seperate function (getid3.mp3.php) € Removed old function getMP3header() from getid3.mp3.php € Changed default MPEG_VALID_CHECK_FRAMES (number of mp3 frames scanned to ensure a valid audio sequence has been located) from 10 to 25. This means scanning will be slightly slower, but more reliable/accurate * Bugfix: ID3v2.2 - valid frame names not correctly detected (thanks maeckerØweb*de for the sample file) * Bugfix: ID3v2.2 - valid padding not correctly detected (thanks maeckerØweb*de for the sample file) * Bugfix: MIDI files with flat key signatures were not being correctly reported (thanks alexleeisØshaw*ca for sample file) * Bugfix: now returns message in ['error'] if file does not exist * Bugfix: ['RIFF']['video'][x]['codec'] wasn't always being correctly populated * Bugfix: ['bitrate'] was incorrect for multi-stream RealMedia * Bugfix: ['playtime_seconds'] was sometimes null or incorrect for multi-stream RealMedia * Bugfix: ChannelTypeID was incorrect in RVA2 ID3v2.4 frames * Bugfix: Fixed potential divide-by-zero error for corrupt FLAC files (thanks ahØartemis*dk) * Bugfix: AAC-ADTS was not returning ['bitrate_mode'] unless $ReturnExtendedInfo was TRUE (thanks ahØartemis*dk) * Bugfix: LAME-encoded CBR MP3s now properly identified as CBR with correct bitrate (thanks ahØartemis*dk) * Bugfix: VBR MP2 (or headerless MP3) is now identified as VBR rather than CBR. Note: to obtain VBR bitrate for headerless files, the entire file is scanned and a histogram distribution of bitrates is created, and the average bitrate calculated from that. (thanks ahØartemis*dk for sample file) Added support for DSIZ chunks in VQF, and checks to make sure size of audio data matches DSIZ value, if present (thanks ahØartemis*dk for sample file) Rewrote GetAllMP3info() - removed some unneccesary code, changed format-detection routine from ParseAsThisFormat() to GetFileFormat() to allow for more flexible format parsing (needed for ISO CD-ROM images, helpful for Quicktime and others) Changed references in all files from string-cast indexes: ["$i"] to non-cast indexes: [$i] where appropriate Put a sans-serif 9pt style on all text in getid3.check.php getAACADTSheaderFilepointer() now return TRUE if synch is lost after the first frame has been successfully parsed (previously it would return FALSE if synch was lost at any time, meaning the file is most likely MP3, which was incorrect) (thanks ahØartemis*dk for sample file) Speed improvement code changes to getid3.mp3.php (up to 24% faster in some cases) (thanks ahØartemis*dk for the code) Changed all include_once() to require_once() 1.5.5: [November-25-2002] James Heinrich » Added support for La (Lossless Audio - www.lossless-audio.com) (thanks ahØartemis*dk for the idea) New file: getid3.la.php € Moved lookup functions from getid3.lookup.php to the files where they are used. New file: getid3.id3.php New file: getid3.rgad.php Removed file: getid3.lookup.php € getID3v1Filepointer() returns FALSE if ID3v1 tag not found € Added new paramter "ReturnExtendedInfo" to the function getAACADTSheaderFilepointer() in getid3.aac.php which now defaults to FALSE - if TRUE then the data for every frame is returned (containing aac_frame_length, adts_buffer_fullness and num_raw_data_blocks, which aren't usually very useful). Speed improvement with FALSE is about 35%. € Now returns fopen() errors in ['error'], for example if a remote file is not accessible. € Changed default number of MP3 audio frames to scan to determine if a valid stream has been found from 5 to 10, now also defined as a constant at the top of getid3.mp3.php This will result in slightly slower MP3 parsing, but greater reliability in detecting false/invalid/corrupted VBR headers. € fopen() errors now displayed in getid3.putid3.php (thanks miguel.dieckmannØhamburg*de) € Added 4th parameter to decodeMPEGaudioHeader() $ScanAsCBR which will force an MP3 audio frame sequence to be force-scanned in CBR mode. You should never need to call this directly, it's only used internally to scan for MP3 files that have an illegal VBR header with CBR data. (thanks fletchØpobox*com) * Bugfix: ASF_Marker_Object in getid3.asf.php was always returning an error in non-existant "reserved_1" and failing * Bugfix: VBR bitrate calculations in getid3.mp3.php only occur if ['mpeg']['audio']['VBR_frames'] is defined. (thanks fletchØpobox*com) * Bugfix: getid3.putid3.php no longer deletes original MP3 if ID3v2 tag writing fails (thanks miguel*dieckmannØhamburg*de) * Bugfix: incorrect order of if-statement error messages in getid3.putid3.php (thanks miguel*dieckmannØhamburg*de) getid3.asf.php now notes the error and continues parsing rather than failing when it encounters an error parsing a chunk Now actually scan 1000 frames for AAC ADTS as reported in the v1.5.4 changelog, rather than 100. (thanks ahØartemis*dk) Improved scanning speed in getAACADTSheaderFilepointer() by ~30% (thanks ahØartemis*dk for the fix) Added FileSizeNiceDisplay() function to getid3.functions.php for formatting filesize output in kB, MB, GB, etc. 1.5.4: [October-07-2002] James Heinrich » Added support for Quicktime. New file: getid3.quicktime.php » Added support for AAC files, both ADTS and ADIF header formats. ADIF format is a pain because it's very similar to standard MP3 header format, and it's hard to distinguish between the two. I have tried to make the detection accurate, but I have a limited number of AAC test files to play with so if you have an AAC file that gets detected as MP3/MP2 (or vice-versa), please send me the details via email at getid3Øsilisoftware*com ADTS format is very slow to parse because to get the bitrate of VBR files the whole file has to be stepped through frame by frame (getID3() scans up to the first 1000 frames and assumes that to be close enough). Note: I would suggest commenting out support for AAC (see top of GetAllMP3info() function in getid3.php) unless you need it. (thanks jfaulØgmx*de for the idea and sample Delphi source code) New file: getid3.aac.php » Added bitrate distribution analysis option for MP3 VBR files. A new boolean parameter for getOnlyMPEGaudioInfo() enabled this feature which steps through the MP3 file frame by frame and counts how many frames of each bitrate exist. This information is returned in ['mpeg']['audio']['bitrate_distribution'] Caution: this feature is very inefficient for large files and takes a very long time and does lots of disk I/O. Use with care. € Changed layout of allowedFormats in GetAllMP3info() function in getid3.php to allow easy removal of support for any of the supported format. As stated above, I recommend commenting out AAC unless needed. € Added ['flac']['compressed_audio_bytes'], ['flac']['uncompressed_audio_bytes'], and ['flac']['compression_ratio'] € Replaced FXPT2DOT30toFloat() function with FixedPoint2_30() * Bugfix: getid3.mpc.php was slightly miscalculating the number of samples, therefore also bitrate and playtime (thanks ahØartemis*dk for the fix) * Bugfix: MonkeyCompressionLevelNameLookup() didn't know about 'insane' compression (thanks ahØartemis*dk for the fix) * Bugfix: MonkeySamplesPerFrame() was incorrect for MAC v3.95+ (thanks ahØartemis*dk for the fix) * Bugfix: getid3.check.php wasn't processing the assumeFormat directive when (register_globals == off) * Bugfix: detecting of synch pattern for MP3 files with invalid data at the beginning wasn't always correct, also meant possible incorrect bitrate/duration/etc info for such corrupt files. getid3.functions.php now includes a replacement utf8_decode() function for those PHP installations that are not configured with the --with-xml option. (thanks stephaneØtekartists*com) 1.5.3: [September-30-2002] James Heinrich » Added support for VQF. (thanks mtØmansonthomas*com for the idea) New file: getid3.vqf.php » Added support for FLAC. Comments, if present, are returned under ['ogg'] because they follow the Ogg Vorbis structure standard. New file: getid3.flac.php € OS/2-format bitmaps are now correctly interpreted. The format of the bitmap is now returned in ['bmp']['type_os'] and ['bmp']['type_version']. OS/2 bitmaps can be v1 or v2, Windows can be v1, v4 or v5 1.5.2: [September-25-2002] James Heinrich » Support for RealMedia (audio & video) added Note: only tested on G2 and v5 audio and video files - if anyone has older and/or newer sample files, please test it and/or send me the sample files. (thanks stephaneØtekartists*com for idea) New file: getid3.real.php » Support for BMP added. Palette and pixel data can optionally be extracted as well - this is slow and generally unneccesary, but the option is there if you need it. Also includes PlotBMP() which will take the extracted pixel data and output it as a true color PNG. This function requires GD v2.0+ Note: Untested on 16-bit and 32-bit BMPs because I couldn't find any sample files - if you know of a program that can create such files, please email getid3Øsilisoftware*com Note: Support for RGB (uncompressed), RLE8 and RLE4 is included and tested. BITFIELDS support is also included for 16- & 32-bit formats, but it's untested, so if anybody has any test files please send them to getid3Øsilisoftware*com Note: Support currently only for Windows-format BMPs, and trying to parse an OS/2-format bitmap leads to unpredictable/invalid results. New file: getid3.bmp.php » PNG now fully parsed, including all information chunks New file: getid3.png.php € Support for GIF/JPG/PNG moved to seperate files and expanded, including standard ['resolution_x'] and ['resolution_y'] as well as more thorough parsing of header information New file: getid3.gif.php New file: getid3.jpg.php table_var_dump() simplified and now outputs {-style character entities for characters outside the normal alphanumeric range CleanOggCommentName() changed to a regular expression (thanks chris-getid3Øbolt*cx for rewriting the function) 1.5.1: [September-20-2002] James Heinrich » Added support for MPEGplus/Musepack SV7. ['fileformat'] is 'SV7' for version 7 files (versions 4, 5 ,6 and 8 are not supported yet, but will be of ['fileformat'] SV4, SV5, SV6 and SV8) when they are supported (thanks Christian Fritz for the idea) New file: getid3.mpc.php € ['bitrate_audio'], ['bitrate_video'], ['bitrate_mode'], ['channels'], ['resolution_x'], and ['resolution_y'] keys added for all appropriate formats € Ogg files with a COVERART comment now save and display the attached image the same way as is done with ID3v2 APICs € ['ogg']['comments'][n]['data'] and ['ogg']['comments'][n]['dataoffset'] is now returned for all comments. ['ogg']['comments'][n]['data'] is only useful if the field is supposed to contain binary data. It is a base64_decode()'d version of ['value']. ['ogg']['comments'][n]['dataoffset'] is the byte offset in the file at which the 'COMMENTNAME=value string' starts, not the start of just 'value' € ['ogg']['comments'][n]['image_mime'] is now returned if ['ogg']['comments'][n]['data'] contains valid image data. € More than 3 Ogg pages may now be read in, if the comment data is longer than 1 page (usually about 4kB) € ['fileformat'] is now 'mp2' rather than 'mp3' if it's MPEG-1, Layer-II audio € ASF bitrates now calculated even if stream_bitrate_properties object not present € ['asf']['stream_properties_object'] is now a numeric-key array with one entry for each stream - the key being the stream number € ['replay_gain'] is returned for all audio formats that support it (MP3-LAME, ID3v2, Ogg) (thanks Christian Fritz for the idea) € ['mpeg']['audio']['LAME']['RGAD']['radio_replay_gain'] is now ['mpeg']['audio']['LAME']['RGAD']['radio'] (same for audiophile) € ASF/WMA files now use WM/Track to get track number from if WM/TrackNumber is not available (thanks stephaneØtekartists*com) € ASF/WMV files now returns ['year'] and ['asf']['year'] € ASV/WMV files now use ['content_description']['description'] for the ['comment'] field (thanks stephaneØtekartists*com) € ['track'] is now always returned as an integer * Bugfix: Ogg comments that are larger than one data page (usually about 4kB) are now correctly parsed (thanks Christian Fritz) * Bugfix: Ogg comment data is now UTF8-decoded * Bugfix: Ogg comment writing now UTF8-encodes the data * Bugfix: playtime for ASF files was off by (usually between 3 and 12 seconds) * Bugfix: ['asf']['stream_properties_objects']['flags'] data was possibly incorrect * Bugfix: ASF Padding Object was overwriting Stream Bitrate Properties Object data (now returned correctly in ['asf']['padding_object'] * Bugfix: ASF Marker Object Reserved_2 field was incorrect * Bugfix: ASF Bitrate Mutual Exclusion Object had incorrect stream numbers Warning displayed if incorrectly-formatted Ogg comment is present (known to be an issue with CDex v1.40, but fixed by v1.50b7) (thanks Christian Fritz) Ogg comment writing now checks for valid comment names Added bitrate column in getid3.check.php, and added some formatting (font, colour) Performance tweaks using bitwise math instead of binary string operations 1.5.0: [September-18-2002] James Heinrich » Ogg comment writing support added. getid3.write.php has been updated to allow for writing comment tags to both MP3 and Ogg. Big thanks to Chris Bolt for writing the OggWrite() function and offering it for inclusion in getID3() New file: getid3.ogginfo.php » Support for Monkey's Audio and APE tag added. (thanks Christian Fritz for the idea) New file: getid3.ape.php ['fileformat'] now returns 'mac' for Monkey's Audio files, or 'ape' for files with an APE tag (Monkey's Audio or other format) » getid3.thumbnail.php has been removed from the distribution and the table_var_dump() function now outputs APICs as seperate files in the same directory as the analyzed file. This should make the image-displaying more reliable as well as reduce complexity. The naming convention for the images is filename.ext.[byte offset of APIC data].[jpg|gif|png] If anybody still has any problems with corrupted images please let me know at getid3Øsilisoftware*com » Support for extended Xing/LAME tag (see http://users.belgacom.net/gc247244/extra/tag.html) Data is returned in ['mpeg']['audio']['LAME'] € ['ogg']['tracknumber'] has been renamed to ['ogg']['track'] and ['track'] is now returned in the root of the array € ['ogg']['pageheader'][n]['flag'] has been renamed to ['ogg']['pageheader'][n]['flags'] and the unprocessed flag byte is available in ['ogg']['pageheader'][n]['flags_raw'] € ['frequency'] is now returned for WAVE files in the root of the array (thanks danielØelectroteque*org) € ASF files now return codec, bitrate, resolution, etc information under ['asf']['video_media'] or ['asf']['audio_media'] * Bugfix: RVA2 and EQU2 writing in getid3.putid3.php were incorrectly writing Volume Adjustment field * Bugfix: EQU2 in getid3.frames.php was reading Volume Adjustment as unsigned integer instead of signed integer * Bugfix: handling of remote files over HTTP & FTP was broken (thanks Vince) * Bugfix: incorrect handling of some ASF packets ASF/Windows Media format now more fully parsed, including Index Objects Added several new fourCC video codecs 1.4.3: [September-15-2002] James Heinrich » Now parses ASF / WMV / WMA files € New file: getid3.asf.php * Bugfix: RoughTranslateUnicodeToASCII() would return nothing if didn't find a terminator it was expecting Added FILETIMEtoUNIXtime() function (for converting 64-bit Microsoft FILETIME timestamps, used in ASF files and elsewhere, to UNIX Epoch timestamps) Added GUIDtoBytestring() and BytestringToGUID() functions 1.4.2: [September-12-2002] James Heinrich » getID3() now requires PHP v4.1.0 or higher because it now is designed to work with register_globals = off and the new auto- globals ($_GET, $_SERVER, etc). * Bugfix: VBR MP3 files with Fraunhofer-style VBR header were not being correctly detected in most cases (thanks dkushnerØoddcast*com and mikeØftl*com for sample files) * Bugfix: IsValidTextEncoding() was broken * Bugfix: Add stripslashes($EditorFilename) to getid3.write.php (writing was broken for files with ' or " in the filename) (thanks mikeØftl*com and kthejoker) * Bugfix: If there is garbage data between a valid VBR header frame and a sequence of valid MPEG-audio frames the VBR data is no longer discarded. (thanks to mikeØftl*com for sample Fraunhofer-style VBR file produced with MusicMatch v7.2) € Changed variable system to work with (register_globals = off) € Moved relevant code into seperate PlaytimeString() function € Added nl2br() to table_var_dump() for cleaner output € Now returns the following keys from Fraunhofer-VBR files: ['VBR_seek_offsets'], ['VBR_seek_offsets_stride'], ['VBR_offsets_relative'] and ['VBR_offsets_absolute'] € Added ID3v1matchesID3v2() function and implemented in getid3.check.php (thanks to "Guest" in the forums for the idea) Changed amount of data read in getid3.getimagesize.php from 10kB to entire file. (thanks mikeØftl*com) Wrapped function_exists() checks around function definitions in getid3.functions.php Fixed a lot of E_WARNING and E_NOTICE situations, especially in ID3-writing code (getid3.putid3.php, etc) Added checks to make sure all needed data is available for writing ID3v2 tags 1.4.1b5: [May-30-2002] James Heinrich * Bugfix: Unsynchronise() was broken, now fixed (thanks mikeØftl*com) * Bugfix: GenerateID3v2Tag() now correctly uses non-synchsafe integers for frame size descriptors in ID3v2.3 and ID3v2.2 (thanks mikeØftl*com) € Added ['artist'], ['title'], etc keys to root of returned array to provide a common place to access any returned info from any file type. Currently gets info from ID3v1, ID3v2, Ogg, and RIFF/WAVE. Possible returned keys are: title, artist, album, year, genre, comment, track € Modified LookupGenre() function to search for either genre based on numeric ID, or now reverse lookup as well € Added ['artist'], ['title'], etc keys to ['RIFF'] information if info tags are present Added functionality to attach a picture to the ID3v2 tag in getid3.write.php Sorted genres into alphabetical order (special 3 at end of list) in getid3.write.php Changed the comment-edit field in getid3.write.php to a multi-line