///////////////////////////////////////////////////////////////// /// getID3() by James Heinrich // // available at http://getid3.sourceforge.net /// ///////////////////////////////////////////////////////////////// // // // getid3.changelog.txt - part of getID3() // // See getid3.readme.txt for more details // // // ///////////////////////////////////////////////////////////////// » denotes a major feature addition/change Ø denotes a change in the returned structure * Bugfix: denote a fixed bug Version History =============== 1.6.0: [Jan-30-2003] » 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'][0] 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: [Jan-10-2003] » 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 "Microsoft ACM: LAME MP3 encoder (ACM)") (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: [Dec-31-2002] » 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: [Nov-25-2002] » 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: [Oct-07-2002] » 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: [Sep-30-2002] » 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: [Sep-25-2002] » 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: [Sep-20-2002] » 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: [Sep-18-2002] » 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: [Sep-15-2002] » 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: [Sep-12-2002] » 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] * 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