Skip to content

Migrate mm-core metadata I/O to MeedyaSuite-core #134

@Salem874

Description

@Salem874

Summary

Replace mm-core/src/metadata/ (1886 lines) with MeedyaSuite-core's meedya-metadata tag I/O module and tag registry. The core library provides format-agnostic metadata reading/writing via lofty, supporting MP4, ID3v2, Vorbis, APE, and RIFF formats.

What changes

Replace tag I/O operations

Replace mm-core's metadata read/write code with meedya_metadata::tag_io:

mm-core function MeedyaSuite-core replacement
Tag reading meedya_metadata::tag_io::extract_tags(path) -> HashMap<String, String>
Tag writing meedya_metadata::tag_io::write_tags(path, &HashMap<String, String>)
Cover art extraction meedya_metadata::tag_io::extract_cover_art(path) -> Option<Vec<u8>>
Cover art embedding meedya_metadata::tag_io::embed_cover_art(path, data, mime_type)
Audio properties meedya_metadata::tag_io::extract_audio_properties(path) -> AudioProperties
Tag removal meedya_metadata::tag_io::remove_tag(path, key)

Replace tag registry

Replace mm-core's tag constants and definitions with meedya_metadata::tag_registry:

TagRegistry (crates/meedya-metadata/src/tag_registry.rs):

  • TagRegistry::from_toml(toml_str) — parse custom tag definitions
  • DEFAULT_REGISTRY static — built-in tag definitions loaded from config/tags.toml
  • TagScope::Album / TagScope::Track — scope-based tag lookup
  • registry.get(scope, id) -> Option<&TagDefinition> — tag lookup
  • registry.all_paths() — list all JSON paths for audit diffing
  • extract_json_value(json, path) — dotted-path JSON extraction with array indexing
  • value_to_string(value, value_type) — type-aware JSON-to-string conversion

Standardized tag constants (meedya_metadata::tag_registry::tags):

  • Standard: TITLE, ARTIST, ALBUM, ALBUM_ARTIST, GENRE, YEAR, TRACK_NUMBER, DISC_NUMBER, COMPOSER, COMMENT, COPYRIGHT, LYRICS
  • Identifiers: ISRC, UPC, RECORD_LABEL, RELEASE_DATE, CONTENT_RATING
  • Sort keys: TITLE_SORT, ARTIST_SORT, ALBUM_SORT, ALBUM_ARTIST_SORT, COMPOSER_SORT
  • Classical: WORK, MOVEMENT, MOVEMENT_NUMBER, MOVEMENT_COUNT
  • ReplayGain: REPLAYGAIN_TRACK_GAIN, REPLAYGAIN_TRACK_PEAK, REPLAYGAIN_ALBUM_GAIN, REPLAYGAIN_ALBUM_PEAK
  • MeedyaSuite: SOURCE_STORE, ENCODE_SOURCE, SPATIAL_TYPE, CHANNEL_CONFIG, IS_LOSSLESS, IS_BINAURAL, IS_DOWNMIX

AudioProperties struct: duration_ms, sample_rate, bit_depth, channels, bitrate

Key mapping (tag_io::string_to_item_key): Automatic mapping of standard keys (isrc, composer, conductor, encoder, copyright, lyrics, album_artist, release_date, record_label, sort keys, work, movement) to format-specific ItemKey values.

Error types

Use meedya_metadata::error::TagError:

  • ReadFailed(String) — file read errors
  • WriteFailed(String) — tag write errors
  • UnsupportedFormat(String) — unsupported audio format
  • TagNotFound(String) — tag lookup failures

Migration steps

  1. Replace direct tag reading code with meedya_metadata::tag_io::extract_tags(path)
  2. Replace tag writing code with meedya_metadata::tag_io::write_tags(path, &tags)
  3. Replace cover art operations with extract_cover_art / embed_cover_art
  4. Replace hardcoded tag name strings with meedya_metadata::tag_registry::tags::* constants
  5. Replace custom TOML tag registry loading with meedya_metadata::tag_registry::DEFAULT_REGISTRY
  6. Replace mp4ameta direct usage with lofty-based tag_io (supports more formats)
  7. Delete mm-core/src/metadata/ directory (~1886 lines)

Acceptance criteria

  • All metadata read operations use meedya_metadata::tag_io::extract_tags
  • All metadata write operations use meedya_metadata::tag_io::write_tags
  • Cover art operations use meedya_metadata::tag_io::{extract_cover_art, embed_cover_art}
  • Tag name constants come from meedya_metadata::tag_registry::tags::*
  • Tag registry uses meedya_metadata::tag_registry::DEFAULT_REGISTRY or custom TagRegistry::from_toml()
  • mm-core/src/metadata/ removed (~1886 lines)
  • Audio format support expanded (MP4 + ID3v2 + Vorbis + APE + RIFF via lofty)
  • All metadata-related tests pass

Dependencies

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions