@hackage / monatone

Pure Haskell library for audio metadata parsing and writing

Changelog

Changelog for monatone

[0.3.0.0] - 2026-07-20

Fixed
  • M4A writer corrupted moov-first ("fast start") files: stco/co64 chunk offsets are now adjusted when the moov atom changes size, so audio stays playable after a tag update
  • M4A writer no longer silently discards errors from the file rewrite
  • Writes are now atomic: metadata is written to a temporary sibling file which is renamed over the original, so a failed write or crash can no longer corrupt or truncate the audio file
  • Updates no longer drop tags the writer does not map: MusicBrainz IDs and AcoustID tags (MP3), track/disc totals (MP3, FLAC), release status/type (M4A), unmapped ID3 text/TXXX frames, Vorbis comments, and iTunes text/freeform atoms are all preserved across updates
  • FLAC updates preserve SEEKTABLE, APPLICATION, CUESHEET and unknown metadata blocks instead of discarding them
  • Single date field per file: setYear no longer produces duplicate TDRC frames (MP3) or DATE comments (FLAC)
  • FLAC comment values containing = are no longer truncated
  • MP3 parser now reads disc number and track/disc totals from TRCK/TPOS
  • FLAC parser now populates rawTags; M4A parser now reads release status/type
  • FLAC vendor string now tracks the package version automatically
Changed
  • Breaking: removed writeMetadataToFile from Monatone.Writer; use writeMetadata, which is now atomic and no longer needs the .backup mechanism

[0.2.1.1] - 2025-12-10

Fixed
  • Added *.m4a to extra-source-files to include M4A test fixture in sdist tarball

[0.2.1.0] - 2025-12-10

Fixed
  • Fixed Hackage description formatting to display properly with multiline text
  • Escaped forward slashes in format names to prevent markdown italicization
  • Fixed M4A round-trip test to properly skip when fixture unavailable
  • Checked in test fixtures (MP3, FLAC) to support Nix builds without ffmpeg
Changed
  • Tests no longer require ffmpeg at build time (only for regenerating fixtures)

[0.2.0.0] - 2025-12-10

Added
  • M4A/AAC/ALAC Support: Complete read/write support for M4A audio files
    • Full metadata parsing with iTunes-style tags (©nam, ©ART, aART, etc.)
    • Audio properties extraction (duration, sample rate, channels, bit depth)
    • AAC and Apple Lossless (ALAC) codec detection and parsing
    • Album art extraction (JPEG, PNG, BMP)
    • Track/disc number parsing with iTunes binary format
    • Complete metadata writing with atom reconstruction
    • Freeform atom support for MusicBrainz-style fields:
      • Record label (LABEL)
      • Catalog number (CATALOGNUMBER)
      • Barcode (BARCODE)
      • Release country (MusicBrainz Album Release Country)
      • All MusicBrainz IDs (recording, release, artist, album artist, release group, work, disc)
      • Acoustid fingerprint and ID
    • Integration with unified Writer API
    • Comprehensive test coverage
Technical Details
  • Pure Haskell MP4 atom parser with hierarchical structure support
  • Efficient streaming implementation (no full file loading)
  • Support for both 32-bit and 64-bit atom sizes
  • Version-aware parsing (mvhd v0/v1, etc.)
  • Safe file writing with temporary file approach
  • Freeform (----) atom parsing and writing for custom metadata
  • Zero compiler warnings

[0.1.0.0] - Initial Release

Added
  • FLAC read/write support with Vorbis comments
  • MP3 read/write support with ID3v1, ID3v2.3, and ID3v2.4 tags
  • OGG/Vorbis and Opus basic support
  • Album art handling
  • Pure Haskell implementation