mirror of
https://github.com/darkzoul5/YoutubePlaylistSync.git
synced 2026-07-03 04:23:59 +03:00
5.9 KiB
5.9 KiB
MP3 Metadata Plan
Subject Area
- Add MP3 tag writing for downloaded YouTube playlist items.
- Scope is limited to
.mp3outputs produced byaudiomode and the MP3 side ofbothmode. - Metadata is sourced from YouTube/yt-dlp and embedded after audio extraction.
Goal
- Write useful MP3 metadata for downloaded playlist items without affecting video-only downloads.
- Keep the implementation reliable when optional fields are missing.
- Preserve successful downloads even when metadata embedding partially fails.
- Provide a per-playlist setting to enable or disable MP3 metadata embedding.
Required Metadata
title← video titleartist← uploader, fallback to channelalbum← album name if presenttracknumber← playlist indexdate/year← upload datecomment← source URLgenre← if availablealbum_art← thumbnail
Configuration Requirement
- Add a per-playlist setting to turn MP3 metadata embedding on or off.
- Default should be explicitly defined during implementation; recommended default is
enabledfor new configs. - The setting should only affect
.mp3metadata writing and should not change download selection, extraction, or.mp4handling.
Current Constraints
- The current playlist scan keeps only a minimal item shape: title, video id, and playlist index.
- The scanner uses flat extraction, which is sufficient for diffing but not for full tag data.
- MP3 extraction currently transcodes audio but does not write ID3 metadata.
Implementation Strategy
- Keep playlist diffing fast by retaining the current flat scan for remote playlist structure.
- Fetch full metadata only for items that are actually going to be downloaded or repaired.
- Write metadata only after MP3 extraction completes successfully.
- Treat metadata embedding as a post-processing step that can fail softly without discarding the MP3.
Work Breakdown
1. Extend the metadata model
- Add optional fields to
PlaylistItemfor:- uploader
- channel
- album
- upload_date
- genre
- thumbnail_url
- webpage_url
- Keep
artistas a derived value instead of storing a separate field.
2. Fetch full per-video metadata
- Introduce a metadata fetch step for each item selected for download.
- Use yt-dlp per-video extraction to retrieve richer fields than the flat playlist entry provides.
- Prefer canonical values from the video page payload for upload date, uploader/channel, album, genre, thumbnail, and source URL.
3. Carry metadata through the download pipeline
- Ensure the enriched
PlaylistItemreaches the download job and post-processing stage. - Keep this propagation in-memory unless restart-safe metadata persistence becomes necessary later.
- Avoid changing unrelated sync behavior for video-only items.
- Carry the per-playlist MP3 metadata enabled/disabled setting into the post-processing step.
4. Add an MP3 tag writer
- Add
mutagenas the ID3 writing dependency. - Implement a focused tagging component that maps
PlaylistItemmetadata into ID3 frames. - Omit fields when the source value is missing instead of writing placeholders.
5. Map fields into ID3 tags
title→ video titleartist→ uploader, fallback to channelalbum→ album if presenttracknumber→ playlist indexdate/year→ parsed upload datecomment→ canonical source URLgenre→ genre if present
6. Embed album art
- Download the selected thumbnail for the video after the media download succeeds.
- Attach thumbnail data as embedded cover art when the image type is supported.
- Fail soft if thumbnail retrieval or embedding fails, and keep the MP3 intact.
7. Integrate into modes
audiomode:- download source media
- extract MP3
- write MP3 tags only when the setting is enabled
- delete temporary/source MP4 if configured
bothmode:- download source media
- extract MP3
- write MP3 tags only when the setting is enabled
- keep MP4 unchanged
videomode:- no MP3 tagging path
8. Add configuration surface
- Add the new per-playlist setting to the playlist config model and default config output.
- Expose the setting in the playlist configuration UI, not as a global app setting.
- Keep the naming explicit, for example
write_mp3_metadataorembed_mp3_metadata.
Error Handling Rules
- If download fails, no tagging runs.
- If extraction fails, no tagging runs.
- If metadata embedding is disabled, skip the tagging step entirely.
- If tagging fails, mark the tag step as failed in logs/events but keep the MP3 file.
- If thumbnail embedding fails, continue with text metadata only.
- Missing
albumorgenreis normal and should not be treated as an error.
Testing Plan
- Unit test metadata mapping from yt-dlp info to the internal metadata model.
- Unit test ID3 writing against a temporary MP3 fixture.
- Unit test fallback behavior:
- uploader missing, channel present
- album missing
- genre missing
- thumbnail missing
- Integration test the audio post-processing path with tagging mocked.
- Integration test the both-mode MP3 path with tagging mocked.
Documentation Updates
- Document that MP3 tags are written only for
.mp3outputs. - Document the new per-playlist setting that enables or disables MP3 metadata embedding.
- Document the field fallback rules, especially artist and album behavior.
- Document that album art comes from the video thumbnail, not playlist artwork.
- Document that some YouTube items will not expose album or genre information.
Dependency Decision
- Recommended library:
mutagen - Reason:
- direct ID3 support
- reliable field-level control
- suitable for embedding cover art
- avoids depending on ffmpeg metadata flags for all tag logic
Delivery Order
- First: add config setting and defaults
- Second: extend metadata model and add full metadata fetch
- Third: add MP3 tag writer and field mapping
- Fourth: add thumbnail embedding
- Fifth: wire tagging into
audioandboth - Sixth: add tests and docs