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
- Replace direct tag reading code with
meedya_metadata::tag_io::extract_tags(path)
- Replace tag writing code with
meedya_metadata::tag_io::write_tags(path, &tags)
- Replace cover art operations with
extract_cover_art / embed_cover_art
- Replace hardcoded tag name strings with
meedya_metadata::tag_registry::tags::* constants
- Replace custom TOML tag registry loading with
meedya_metadata::tag_registry::DEFAULT_REGISTRY
- Replace
mp4ameta direct usage with lofty-based tag_io (supports more formats)
- Delete
mm-core/src/metadata/ directory (~1886 lines)
Acceptance criteria
Dependencies
Summary
Replace
mm-core/src/metadata/(1886 lines) with MeedyaSuite-core'smeedya-metadatatag I/O module and tag registry. The core library provides format-agnostic metadata reading/writing vialofty, 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:meedya_metadata::tag_io::extract_tags(path) -> HashMap<String, String>meedya_metadata::tag_io::write_tags(path, &HashMap<String, String>)meedya_metadata::tag_io::extract_cover_art(path) -> Option<Vec<u8>>meedya_metadata::tag_io::embed_cover_art(path, data, mime_type)meedya_metadata::tag_io::extract_audio_properties(path) -> AudioPropertiesmeedya_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 definitionsDEFAULT_REGISTRYstatic — built-in tag definitions loaded fromconfig/tags.tomlTagScope::Album/TagScope::Track— scope-based tag lookupregistry.get(scope, id) -> Option<&TagDefinition>— tag lookupregistry.all_paths()— list all JSON paths for audit diffingextract_json_value(json, path)— dotted-path JSON extraction with array indexingvalue_to_string(value, value_type)— type-aware JSON-to-string conversionStandardized tag constants (
meedya_metadata::tag_registry::tags):TITLE,ARTIST,ALBUM,ALBUM_ARTIST,GENRE,YEAR,TRACK_NUMBER,DISC_NUMBER,COMPOSER,COMMENT,COPYRIGHT,LYRICSISRC,UPC,RECORD_LABEL,RELEASE_DATE,CONTENT_RATINGTITLE_SORT,ARTIST_SORT,ALBUM_SORT,ALBUM_ARTIST_SORT,COMPOSER_SORTWORK,MOVEMENT,MOVEMENT_NUMBER,MOVEMENT_COUNTREPLAYGAIN_TRACK_GAIN,REPLAYGAIN_TRACK_PEAK,REPLAYGAIN_ALBUM_GAIN,REPLAYGAIN_ALBUM_PEAKSOURCE_STORE,ENCODE_SOURCE,SPATIAL_TYPE,CHANNEL_CONFIG,IS_LOSSLESS,IS_BINAURAL,IS_DOWNMIXAudioProperties struct:
duration_ms,sample_rate,bit_depth,channels,bitrateKey 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-specificItemKeyvalues.Error types
Use
meedya_metadata::error::TagError:ReadFailed(String)— file read errorsWriteFailed(String)— tag write errorsUnsupportedFormat(String)— unsupported audio formatTagNotFound(String)— tag lookup failuresMigration steps
meedya_metadata::tag_io::extract_tags(path)meedya_metadata::tag_io::write_tags(path, &tags)extract_cover_art/embed_cover_artmeedya_metadata::tag_registry::tags::*constantsmeedya_metadata::tag_registry::DEFAULT_REGISTRYmp4ametadirect usage withlofty-based tag_io (supports more formats)mm-core/src/metadata/directory (~1886 lines)Acceptance criteria
meedya_metadata::tag_io::extract_tagsmeedya_metadata::tag_io::write_tagsmeedya_metadata::tag_io::{extract_cover_art, embed_cover_art}meedya_metadata::tag_registry::tags::*meedya_metadata::tag_registry::DEFAULT_REGISTRYor customTagRegistry::from_toml()mm-core/src/metadata/removed (~1886 lines)Dependencies
meedya-metadatacrate