All notable changes to TagLibSharp2 will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.6.0 - 2026-01-05
- Removed:
MusicIpIdproperty fromTagbase class (MusicIP service discontinued, use AcoustID instead) - Removed:
AiffFile.TryParsemethod (useAiffFile.Readwhich returnsAiffFileReadResultwith error context) - Removed:
WavFile.ReadFromDatamethod (useWavFile.Readfor span-based parsing) - Changed:
AudioPropertiesconverted from class to readonly record struct for better performance and immutability - Renamed:
AsfFile.AudioPropertiesproperty renamed toPropertiesfor consistency with other file types
- Comprehensive test suite expanded to 3,780 tests (from 3,175)
- Test coverage increased to 90.1% line coverage, 77.6% branch coverage
- Additional MP3 APE tag test coverage for edge cases
- Performance improvements from AudioProperties struct conversion
- Improved API consistency across file format implementations
- Enhanced documentation and code examples
0.5.0 - 2026-01-03
AsfFileclass for reading and writing ASF/WMA audio files- Header Object parsing with GUID-based child object navigation
- Content Description object for Title, Artist, Copyright, Description, Rating
- Extended Content Description for Album, Year, Genre, Track, and custom fields
- Stream Properties for audio properties (bitrate, sample rate, channels, bits per sample)
- File Properties for duration extraction
- Full read/write round-trip support with atomic file saves
- Async file I/O with cancellation support
- Result types:
AsfFileReadResult,AsfGuidParseResult
MusepackFileclass for reading Musepack audio files- SV7 and SV8 stream version detection
- Audio properties (sample rate, channels, duration, bitrate)
- APE tag support for metadata with full read/write
- Result type:
MusepackFileParseResult
WavPackFileclass for reading WavPack audio files- Block header parsing with format flags
- Sample rate table lookup (15 standard rates)
- Duration calculation from total samples and sample rate
- APE tag support for metadata with full read/write
- Result type:
WavPackFileParseResult
MonkeysAudioFileclass for reading Monkey's Audio files- Both old format (≤3.97) and new format (≥3.98) header parsing
- STREAMINFO extraction (sample rate, channels, bits per sample)
- Compression level detection (Fast, Normal, High, Extra High, Insane)
- APE tag support for metadata with full read/write
- Result type:
MonkeysAudioFileParseResult
OggFlacFileclass for reading Ogg FLAC audio files- Ogg container with embedded FLAC stream parsing
- STREAMINFO extraction (sample rate, channels, bits per sample)
- Vorbis Comment support with full read/write
- Duration calculation from total samples
- Result type:
OggFlacFileParseResult
DffFileclass for reading DFF audio files (Philips DSDIFF format)- IFF-based FRM8 container with big-endian byte order
- FVER chunk parsing for format version detection (DSDIFF 1.5)
- PROP chunk parsing with SND properties: FS (sample rate), CHNL (channels), CMPR (compression)
- DSD and DST compression type detection
DffAudioPropertieswith DSD-specific information- ID3v2 tag support as unofficial extension
- Result type:
DffFileParseResult - Full read/write round-trip support for metadata
DsfFile.SaveToFileandSaveToFileAsyncfor writing DSF filesDffFile.SaveToFileandSaveToFileAsyncfor writing DFF files- ID3v2 metadata modifications preserved through round-trip
ApeTagclass for reading and writing APE v2 tags- APE item types: Text (UTF-8), Binary, External (locators)
- Read-only flag support per APE specification
ApeTagFooterandApeTagHeaderparsing with version detectionApeTagItemfor individual tag items with flags- Result types:
ApeTagFooterParseResult,ApeTagHeaderParseResult,ApeTagItemParseResult,ApeTagParseResult - Full read/write round-trip support
- Standard metadata mappings: Title, Artist, Album, Track, Genre, Date, Comment
- Extended metadata: ReplayGain, MusicBrainz IDs, Performer roles
DsfFileclass for reading DSF audio files (Sony DSD format)- DSD64 (2.8MHz), DSD128 (5.6MHz), DSD256 (11.2MHz), DSD512 (22.4MHz) sample rate detection
DsfDsdChunkfor DSD header with total file size and metadata pointerDsfFmtChunkfor format specification (channels, sample rate, bits per sample)DsfDataChunkfor audio data boundariesDsfAudioPropertieswith DSD-specific information- ID3v2 tag support at end of file (per DSF specification)
- Result types:
DsfDsdChunkParseResult,DsfFmtChunkParseResult,DsfDataChunkParseResult,DsfFileParseResult - Channel type detection: Mono, Stereo, 3-channel, Quad, 4-channel, 5-channel, 5.1 surround
BinaryDataBuildernow implementsIDisposablefor proper resource cleanup- Automatic return of ArrayPool buffers on dispose
usingstatement support for deterministic cleanup
- Validated file operations with files >4GB
- Comprehensive test coverage for large file scenarios
MediaFormat.Asfenum value for ASF/WMA detectionMediaFormat.Musepackenum value for Musepack detectionMediaFormat.WavPackenum value for WavPack detectionMediaFormat.MonkeysAudioenum value for Monkey's Audio detectionMediaFormat.OggFlacenum value for Ogg FLAC detection- Automatic format detection for all new formats
- Test count increased from 2272 to 3175 (+903 tests)
- Code coverage: 90.1% line coverage, 77.6% branch coverage
- 15 audio formats now supported with full read/write
0.4.0 - 2025-12-31
Mp4Fileclass for reading and writing MP4/M4A audio files- ISO 14496-12 (ISOBMFF) and ISO 14496-14 compliant box parsing
- iTunes-style metadata (moov → udta → meta → ilst atoms)
- Full read/write round-trip support with atomic file saves
- 197 comprehensive tests covering parsing, rendering, and edge cases
Mp4Boxclass for hierarchical box (atom) parsingMp4BoxParserfor recursive child box parsingMp4FullBoxsupport for version and flags fieldsMp4DataAtomfor typed data atoms (text, integer, binary)Mp4BoxReadResultresult type with error context- Extended box size support (size=1 with 64-bit size field)
Mp4AudioPropertiesParserfor extracting audio information- Duration from mvhd (movie header) with timescale conversion
- Sample rate from stsd (sample description) or mdhd fallback
- High sample rate support (>65535 Hz via mdhd timescale)
- Channel count, bits per sample (for lossless codecs)
- Bitrate extraction from esds (Elementary Stream Descriptor)
Mp4AudioCodecenum: AAC, ALAC, FLAC, Opus, AC-3, E-AC-3, Unknown- Codec-specific parsing for accurate properties
EsdsParserfor AAC decoder configurationAlacMagicCookieparsing for ALAC parameters
- Text atoms: Title (©nam), Artist (©ART), Album (©alb), Genre (©gen)
- Date atoms: Year (©day)
- Comment atom: ©cmt
- Composer atom: ©wrt
- Album artist atom: aART
- Track/disc numbers: trkn and disk (8-byte binary format)
- BPM: tmpo (16-bit integer)
- Gapless playback: pgap (boolean)
- Compilation flag: cpil (boolean)
- Encoder: ©too
- Copyright: cprt
- AlbumSort (soal), ArtistSort (soar), TitleSort (sonm)
- AlbumArtistSort (soaa), ComposerSort (soco)
- Work name: ©wrk
- Movement name: ©mvn
- Movement number: ©mvi (integer)
- Movement count: ©mvc (integer)
- Show movement flag: shwm (boolean)
Mp4Pictureclass implementingIPictureinterface- JPEG (type code 13) and PNG (type code 14) support
- Multiple pictures per file via covr atom
- AddPicture/RemovePictures API on Mp4File
- Full support for mean/name/data structure
- GetFreeformTag/SetFreeformTag API for arbitrary metadata
- Track ID, Album ID, Artist ID, Album Artist ID
- Release Group ID, Work ID, Recording ID, Disc ID
- Release Status, Release Type, Release Country
- AcoustId Id
- AcoustId Fingerprint
- Track gain and peak (replaygain_track_gain/peak)
- Album gain and peak (replaygain_album_gain/peak)
- Track gain (R128_TRACK_GAIN) - Q7.8 fixed-point
- Album gain (R128_ALBUM_GAIN) - Q7.8 fixed-point
- Convenience properties: R128TrackGainDb, R128AlbumGainDb (decibels)
- Initial key (initialkey)
- Remixer (REMIXER)
- Mood (MOOD)
- Subtitle (SUBTITLE)
- Barcode (BARCODE)
- Catalog number (CATALOGNUMBER)
- Amazon ID (ASIN)
- Date tagged (date_tagged)
- Language (LANGUAGE)
- Media type (MEDIA)
- ISRC (ISRC)
- Conductor (CONDUCTOR)
- Original year (ORIGINAL YEAR)
MediaFormat.Mp4enum value- Automatic MP4 detection by ftyp box
.m4a,.mp4,.m4b,.m4p,.m4vfile extension support
- Test count increased from 2077 to 2272 (+195 tests)
0.3.0 - 2025-12-30
OggOpusFileclass for reading and writing Opus audio files- OpusHead identification header parsing (RFC 7845)
- Version, channels, pre-skip, input sample rate, output gain
- Channel mapping family support
- OpusTags (Vorbis Comment) metadata support (no framing bit, per RFC 7845)
OggOpusFileReadResultresult type with error context- Full read/write round-trip support with atomic file saves
AudioProperties.FromOpus()factory method- Duration calculation from granule position (always 48kHz output)
- Pre-skip compensation for accurate duration
- Bitrate calculation from file size
MediaFormat.Opusenum value- Automatic Opus vs Vorbis detection by inspecting first Ogg packet
.opusfile extension support
R128TrackGainDbandR128AlbumGainDbproperties onTagbase class- Convert Q7.8 fixed-point integers to/from decibels as doubles
- Uses
CultureInfo.InvariantCulturefor locale-independent parsing
- Add segment table overflow validation in
OggPageHelper.BuildOggPage- Throws
ArgumentExceptionwhen packets require >255 segments - Prevents corrupt Ogg files with large embedded artwork
- Throws
- Add bounds check in
FindLastGranulePositionfor truncated pages - Add
BuildMultiPagePackethelper for large metadata spanning multiple pages
- Add channel mapping family 1 validation (1-8 channels per §5.1.1.2)
- Existing OpusHead minimum size validation (19 bytes) now tested
- Replace C# 12 collection expressions
[]with explicitnew List<T>() - Fix
#if NET8_0_OR_GREATERto#if NET5_0_OR_GREATERfor CollectionsMarshal
- Fix integer overflow in
R128TrackGainDbandR128AlbumGainDbsetters for extreme values - Add
ClampToQ78helper to safely clamp dB values to Q7.8 format range (-128 to +127.99 dB)
- Add validation for invalid
vorbis_versionin identification header (must be 0 per spec) - Return explicit error for Vorbis files with zero sample rate or channel count
- Add 16 MB max packet size limit in
OggPageHelper.ExtractHeaderPacketsto prevent DoS - Add stream/coupled count validation for Opus mapping families 1 & 255 per RFC 7845 §5.1.1.2
- Refactor:
OggVorbisFilenow uses sharedOggPageHelpercode- Eliminates ~160 lines of duplicate code
BuildOggPagenow includes segment overflow validationFindLastGranulePositionproperly uses EOS flag per RFC 3533
- Add
SaveToFileAsyncconvenience overloads toOggVorbisFile - Change
OggPageWithSegmentsResult.SegmentstoIReadOnlyList<T>for encapsulation - Standardize magic bytes to char cast syntax for readability
- Test count increased from 1939 to 2077 (+138 tests)
0.2.1 - 2025-12-29
WavFileReadResultstruct withIsSuccess,File, andErrorpropertiesAiffFileReadResultstruct withIsSuccess,File, andErrorpropertiesWavFile.Read(ReadOnlySpan<byte>)returns result type with error contextAiffFile.Read(ReadOnlySpan<byte>)returns result type with error contextAiffFile.ReadFromFileandReadFromFileAsyncmethods for direct file loading
PolyfillsTests.cs- Hex conversion and Latin1 encoding testsOggCrcTests.cs- CRC-32 calculation and validation testsId3v1GenreTests.cs- Genre lookup for all 192 genresDocExamplesCompileTests.cs- Verify documentation code examples compileResultTypeEqualityTests.cs- IEquatable tests for 27 result typesStructEqualityTests.cs- Equality tests for SyncLyricsItem, FlacPreservedBlock, etc.
- Fix Cookbook.md: Correct SyncLyricsFrame API (SyncLyricsItem, SyncLyricsType)
- Fix Cookbook.md: Correct ChapterFrame API (StartTimeMs, EndTimeMs)
- Update MILESTONES.md and ROADMAP.md with current status
WavFile.ReadFromFileandReadFromFileAsyncnow returnWavFileReadResultAiffFile.ReadFromFileandReadFromFileAsyncnow returnAiffFileReadResult- Improved documentation for
Polyfills.ReplaceStringComparison limitation - Test count increased from 1756 to 1939 (+183 tests)
0.2.0 - 2025-12-29
- Full ID3v2.2 (3-character frame ID) parsing support
- Complete v2.2 → v2.3/v2.4 frame ID mapping (66 mappings)
- Proper 3-byte big-endian size handling for v2.2 frames
- Global unsynchronization support (tag-level, v2.3/v2.4)
- Per-frame unsynchronization support (v2.4 frame flag)
- Proper 0xFF 0x00 byte sequence removal during parsing
- Two-pass algorithm for efficient memory usage
- Compression support with zlib decompression (v2.3 and v2.4)
- Grouping identity flag handling (skips group ID byte)
- Data length indicator parsing (v2.4 syncsafe 4-byte prefix)
- Encryption flag detection (content preserved as-is)
FlacFile.AudioMd5Signatureproperty for 128-bit MD5 hash of unencoded audioFlacFile.AudioMd5SignatureHexfor hex string representationFlacFile.HasAudioMd5Signatureto detect if encoder computed the hash- Essential for bit-perfect archive verification
WavFile.PicturesandWavFile.HasPicturesvia embedded ID3v2 tagAiffFile.PicturesandAiffFile.HasPicturesvia embedded ID3v2 tagCoverArtconvenience property for primary album art- Full PictureType support (FrontCover, BackCover, etc.)
Mp3File.SaveToFile(path)- saves to specified pathFlacFile.SaveToFile(path)- saves to specified pathOggVorbisFile.SaveToFile(path)- saves to specified pathWavFile.SaveToFile(path)- saves to specified pathAiffFile.SaveToFile(path)- saves to specified path- All with async variants accepting CancellationToken
AiffFile.Renderfor serializing AIFF files to binary dataAiffFile.SaveToFileandSaveToFileAsyncfor atomic file savesAiffChunk.Renderfor chunk serialization with proper padding- Settable
Tagproperty onAiffFilefor modifying ID3v2 metadata - All existing chunks preserved during render (COMM, SSND, ANNO, etc.)
- FLAC: Preserve SEEKTABLE and APPLICATION blocks during render
FlacPreservedBlockstruct for block storagePreservedBlocksproperty onFlacFile
- WAV: Preserve all unknown chunks (fact, cue, smpl, etc.) during render
- Only LIST INFO and id3 chunks are replaced; all others preserved
AiffAudioProperties.CompressionTypefor AIFC compression type (e.g., "NONE", "sowt")AiffAudioProperties.CompressionNamefor human-readable compression description- Standard AIFF files return null for compression properties
- Format support matrix in README showing feature coverage per format
- Dedicated NuGet README with quick start guide
BextTagclass for parsing and writing bext chunks- Description, Originator, OriginatorReference fields
- OriginationDate and OriginationTime for timestamps
- TimeReference for sample-accurate synchronization
- UMID (Unique Material Identifier) for Version 1+
- CodingHistory for production chain tracking
WavFile.BextTagproperty for accessing bext metadata
WavAudioPropertiesParser.ParseExtendedfor parsing extensible fmt chunksWavExtendedPropertiesstruct with:- ValidBitsPerSample for actual signal precision
- ChannelMask for surround sound speaker positions
- SubFormat for actual audio format (PCM, IEEE Float, A-Law, mu-Law)
WavChannelMaskconstants for speaker positions (5.1, 7.1, etc.)WavSubFormatenum for format identificationWavFile.ExtendedPropertiesproperty for accessing extended audio info
- Optional
validateCrcparameter onOggVorbisFile.Read,ReadFromFile,ReadFromFileAsync - When enabled, validates CRC-32 checksums on each Ogg page
- Disabled by default for performance (existing behavior)
- Useful for detecting file corruption in critical applications
- Integer overflow protection for malformed chunk sizes
- AIFF/AIFC: Reject chunks claiming sizes > int.MaxValue
- RIFF/WAV: Reject chunks and INFO fields claiming sizes > int.MaxValue
- Defense-in-depth checks added to AiffChunk, RiffChunk, and RiffInfoTag
- Test count increased from 1528 to 1658 (+130 tests)
0.1.0 - 2025-12-26
BinaryDataimmutable binary wrapper with Span supportBinaryDataBuildermutable builder with ArrayPool integration for reduced GC pressure- Big-endian and little-endian integer parsing (16, 24, 32, 64-bit)
- Syncsafe integer support for ID3v2 format
- String encoding/decoding (Latin-1, UTF-8, UTF-16 with BOM detection)
- CRC computation (CRC-8, CRC-16-CCITT, CRC-32)
- Pattern matching operations (IndexOf, Contains, StartsWith, EndsWith)
- Hex string conversion
- Abstract
Tagbase class with standard metadata properties - Abstract
Picturebase class with picture type support TagReadResult<T>for safe parsing without exceptions- Multi-target framework support (netstandard2.0, netstandard2.1, net8.0, net10.0)
- ID3v1 tag reading and writing
- ID3v1.0 and v1.1 detection
- Genre lookup table (129 standard genres)
- Track number support (v1.1)
- ID3v2 tag support (versions 2.3 and 2.4)
- Header parsing with flags and syncsafe sizes
- Text frames (TIT2, TPE1, TALB, TYER, TDRC, TCON, TRCK, TPE2, TPOS, TCOM, TBPM, TENC, TSSE, TIT1, TIT3, TPE4, TKEY, TMOO, TMED, TLAN)
- Picture frames (APIC) with description and multiple picture types
- Multiple text encodings (Latin-1, UTF-8, UTF-16 BE/LE)
- Tag rendering with proper padding management
- Extended header support (v2.3 and v2.4)
- AlbumArtist, DiscNumber, Composer, and BeatsPerMinute properties
- FLAC file container
- Magic number validation ("fLaC")
- Metadata block parsing (STREAMINFO, VORBIS_COMMENT, PICTURE)
- CRC validation
- Vorbis Comment support
- Case-insensitive field handling
- UTF-8 encoding throughout
- Multiple values per field
- Standard field mappings (TITLE, ARTIST, ALBUM, DATE, GENRE, TRACKNUMBER)
- Extended fields (ALBUMARTIST, DISCNUMBER, COMPOSER)
- Picture embedding (base64-encoded METADATA_BLOCK_PICTURE)
- Ogg Vorbis file support
- Ogg page parsing with segment tables
- CRC-32 validation
- Vorbis comment extraction from packets
IFileSystemabstraction for testabilityDefaultFileSystemsingleton for real file operationsFileHelper.SafeReadAllByteswith consistent error handlingFileHelper.SafeReadAllBytesAsyncwith cancellation supportFlacFile.ReadFromFileAsyncandOggVorbisFile.ReadFromFileAsyncAtomicFileWriterfor safe file writes (temp file + rename pattern)FlacFile.SaveToFileandFlacFile.SaveToFileAsyncfor FLAC writing
IMediaPropertiesinterface for audio duration and quality informationAudioPropertiesstruct with Duration, Bitrate, SampleRate, Channels, BitsPerSample- FLAC media properties from STREAMINFO block
- Ogg Vorbis media properties from identification header
- COMM frame support for ID3v2 comments
- Language code (ISO 639-2) and description support
- Multiple encodings (Latin-1, UTF-8, UTF-16)
- TXXX frame support for custom metadata fields
- Multiple text encodings (Latin-1, UTF-8, UTF-16)
- GetUserText/SetUserText API for named fields
- ReplayGain tag support for ID3v2 (via TXXX frames)
- Track gain/peak and album gain/peak
- ReplayGain tag support for Vorbis Comments
- REPLAYGAIN_TRACK_GAIN, REPLAYGAIN_TRACK_PEAK, REPLAYGAIN_ALBUM_GAIN, REPLAYGAIN_ALBUM_PEAK
- MusicBrainz ID support for ID3v2 (via TXXX frames)
- Track ID, Release ID, Artist ID, Release Group ID, Album Artist ID
- MusicBrainz ID support for Vorbis Comments
- MUSICBRAINZ_TRACKID, MUSICBRAINZ_ALBUMID, MUSICBRAINZ_ARTISTID, MUSICBRAINZ_RELEASEGROUPID, MUSICBRAINZ_ALBUMARTISTID
- USLT (Unsynchronized Lyrics) frame support for ID3v2
- Multi-language support with ISO 639-2 language codes
- Description field for multiple lyrics per file
- Full encoding support (Latin-1, UTF-8, UTF-16)
- UFID (Unique File Identifier) frame support for ID3v2
- MusicBrainz Recording ID via canonical UFID frame
- Binary and string identifier formats
- Extended tag properties (ID3v2 and Vorbis Comments)
- Conductor (TPE3 frame)
- Copyright (TCOP frame)
- Compilation flag (TCMP frame)
- TotalTracks and TotalDiscs properties
- EncodedBy (TENC / ENCODED-BY) and EncoderSettings (TSSE / ENCODER)
- Grouping (TIT1 / GROUPING), Subtitle (TIT3 / SUBTITLE), Remixer (TPE4 / REMIXER)
- InitialKey (TKEY / KEY), Mood (TMOO / MOOD), Language (TLAN / LANGUAGE)
- MediaType (TMED / MEDIA), Barcode (TXXX:BARCODE / BARCODE), CatalogNumber (TXXX:CATALOGNUMBER / CATALOGNUMBER)
- PerformersRole property for musician credits
- ID3v2 TMCL (Musician Credits List) frame support
- ID3v2 TIPL (Involved People List) frame support
- ID3v2 IPLS (v2.3 Involved People) frame support
- Vorbis Comment PERFORMER_ROLE field support
- InvolvedPeopleFrame class for parsing/rendering role-person pairs
TagTypesflags enum for identifying tag format types (Id3v1, Id3v2, Xiph, Apple, Asf, etc.)TagTypeabstract property on baseTagclass- Array properties for multi-value metadata:
Performers[]- Multiple artists/performers with null-separator support (ID3v2) and multi-field support (Vorbis)AlbumArtists[]- Multiple album artistsComposers[]- Multiple composersGenres[]- Multiple genres
IPictureinterface for picture abstraction (TagLib# API compatibility)Picturesproperty returnsIPicture[]for format-agnostic picture access- Format-specific properties renamed:
PictureFrames(ID3v2) andPictureBlocks(Vorbis)
- ComposerSort (TSOC / COMPOSERSORT) - Sort order for composer names
- DateTagged (TDTG / DATETAGGED) - ISO 8601 tagging timestamp (ID3v2.4 only)
- Description (TXXX:DESCRIPTION / DESCRIPTION) - Content synopsis
- AmazonId (TXXX:ASIN / ASIN) - Amazon Standard Identification Number
MusicIpId- Removed (MusicIP service discontinued, use AcoustID instead)- Extended MusicBrainz identifiers (ID3v2 and Vorbis Comments):
- WorkId - Musical work/composition identifier
- DiscId - CD table of contents hash
- ReleaseStatus - official, promotional, bootleg, pseudo-release
- ReleaseType - album, single, ep, compilation, etc.
- ReleaseCountry - ISO 3166-1 alpha-2 country code
Mp3Fileclass for unified ID3v1/ID3v2 access- Automatic ID3v2 preference with ID3v1 fallback
- Read/write support with atomic file saves
- Async file operations with cancellation support
OggVorbisFile.Renderfor rebuilding files with updated metadataSaveToFileandSaveToFileAsyncfor atomic file saves- Proper Ogg page segment table handling for multi-packet pages
- BasicUsage example demonstrating BinaryData operations
- TagOperations example showing all tag reading/writing features
- GitHub Actions CI workflow for cross-platform builds (Ubuntu, Windows, macOS)
- Dependabot configuration for automated dependency updates
- Comprehensive test suite (1015 tests)
- Malformed input test suite for security and robustness
- Clean-room implementation (no TagLib# code)
BinaryData(byte[])constructor now copies the array to ensure true immutability