packages feed

monatone-0.3.0.0: CHANGELOG.md

# 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