Add _build_library_tag_db_data helper

Extract repeated DB tag payload construction into a new _build_library_tag_db_data(track_data, album_genres) helper and replace in multiple endpoints. The helper builds the metadata dict (title, artist_name, track_artist, album_title, year, genres, track/disc numbers, bpm, track_count, thumb_url) and populates artists_list by splitting track_artist on ';'. Added tests (tests/test_library_tag_payload.py) to verify artists_list creation, genre propagation, thumb_url selection, and fallback behavior when track_artist is missing. This reduces duplication and ensures consistent tag payloads across tag-preview, batch preview, and tag-writing flows.
This commit is contained in:
Broque Thomas 2026-05-25 18:48:45 -07:00
parent 26eeb1e9a1
commit dad1b5109e
2 changed files with 75 additions and 47 deletions

View file

@ -0,0 +1,45 @@
from __future__ import annotations
from web_server import _build_library_tag_db_data
def test_library_tag_payload_preserves_track_artist_and_artists_list():
payload = _build_library_tag_db_data(
{
'title': 'Duet',
'artist_name': 'Album Artist',
'track_artist': 'Artist A; Artist B',
'album_title': 'Compilation',
'year': 2026,
'track_number': 3,
'disc_number': 1,
'bpm': 124,
'track_count': 12,
'album_thumb_url': 'https://example.test/cover.jpg',
'artist_thumb_url': 'https://example.test/artist.jpg',
},
['Electronic', 'Dance'],
)
assert payload['artist_name'] == 'Album Artist'
assert payload['track_artist'] == 'Artist A; Artist B'
assert payload['artists_list'] == ['Artist A', 'Artist B']
assert payload['genres'] == ['Electronic', 'Dance']
assert payload['thumb_url'] == 'https://example.test/cover.jpg'
def test_library_tag_payload_falls_back_without_track_artist():
payload = _build_library_tag_db_data(
{
'title': 'Solo',
'artist_name': 'Solo Artist',
'track_artist': None,
'album_title': 'Solo Album',
'artist_thumb_url': 'https://example.test/artist.jpg',
}
)
assert payload['track_artist'] is None
assert 'artists_list' not in payload
assert payload['artist_name'] == 'Solo Artist'
assert payload['thumb_url'] == 'https://example.test/artist.jpg'

View file

@ -9025,6 +9025,32 @@ def batch_update_library_tracks():
# ── Write Tags to File endpoints ──
def _build_library_tag_db_data(track_data, album_genres=None):
"""Build the metadata payload consumed by core.tag_writer."""
album_genres = album_genres or []
db_data = {
'title': track_data.get('title'),
'artist_name': track_data.get('artist_name'),
'track_artist': track_data.get('track_artist'),
'album_title': track_data.get('album_title'),
'year': track_data.get('year'),
'genres': album_genres,
'track_number': track_data.get('track_number'),
'disc_number': track_data.get('disc_number'),
'bpm': track_data.get('bpm'),
'track_count': track_data.get('track_count'),
'thumb_url': track_data.get('album_thumb_url') or track_data.get('artist_thumb_url'),
}
track_artist = track_data.get('track_artist')
if isinstance(track_artist, str) and ';' in track_artist:
artists_list = [name.strip() for name in track_artist.split(';') if name.strip()]
if artists_list:
db_data['artists_list'] = artists_list
return db_data
@app.route('/api/library/track/<track_id>/tag-preview', methods=['GET'])
def get_track_tag_preview(track_id):
"""Read current file tags and compare against DB metadata for a single track."""
@ -9072,19 +9098,7 @@ def get_track_tag_preview(track_id):
album_genres = [g.strip() for g in track_data['album_genres'].split(',') if g.strip()]
# Build DB metadata dict for comparison
db_data = {
'title': track_data.get('title'),
'artist_name': track_data.get('artist_name'),
'track_artist': track_data.get('track_artist'),
'album_title': track_data.get('album_title'),
'year': track_data.get('year'),
'genres': album_genres,
'track_number': track_data.get('track_number'),
'disc_number': track_data.get('disc_number'),
'bpm': track_data.get('bpm'),
'track_count': track_data.get('track_count'),
'thumb_url': track_data.get('album_thumb_url') or track_data.get('artist_thumb_url'),
}
db_data = _build_library_tag_db_data(track_data, album_genres)
diff = build_tag_diff(file_tags, db_data)
has_changes = any(d['changed'] for d in diff)
@ -9166,18 +9180,7 @@ def get_batch_tag_preview():
except (ValueError, TypeError):
album_genres = [g.strip() for g in track_data['album_genres'].split(',') if g.strip()]
db_data = {
'title': track_data.get('title'),
'artist_name': track_data.get('artist_name'),
'album_title': track_data.get('album_title'),
'year': track_data.get('year'),
'genres': album_genres,
'track_number': track_data.get('track_number'),
'disc_number': track_data.get('disc_number'),
'bpm': track_data.get('bpm'),
'track_count': track_data.get('track_count'),
'thumb_url': track_data.get('album_thumb_url') or track_data.get('artist_thumb_url'),
}
db_data = _build_library_tag_db_data(track_data, album_genres)
diff = build_tag_diff(file_tags, db_data)
has_changes = any(d['changed'] for d in diff)
@ -9249,17 +9252,7 @@ def write_track_tags(track_id):
album_genres = [g.strip() for g in track_data['album_genres'].split(',') if g.strip()]
# Build data for writer
db_data = {
'title': track_data.get('title'),
'artist_name': track_data.get('artist_name'),
'album_title': track_data.get('album_title'),
'year': track_data.get('year'),
'genres': album_genres,
'track_number': track_data.get('track_number'),
'disc_number': track_data.get('disc_number'),
'bpm': track_data.get('bpm'),
'track_count': track_data.get('track_count'),
}
db_data = _build_library_tag_db_data(track_data, album_genres)
# Resolve cover URL
cover_url = None
@ -9408,17 +9401,7 @@ def write_tracks_tags_batch():
except (ValueError, TypeError):
album_genres = [g.strip() for g in track_data['album_genres'].split(',') if g.strip()]
db_data = {
'title': track_data.get('title'),
'artist_name': track_data.get('artist_name'),
'album_title': track_data.get('album_title'),
'year': track_data.get('year'),
'genres': album_genres,
'track_number': track_data.get('track_number'),
'disc_number': track_data.get('disc_number'),
'bpm': track_data.get('bpm'),
'track_count': track_data.get('track_count'),
}
db_data = _build_library_tag_db_data(track_data, album_genres)
# Get pre-downloaded cover art for this track's album
art_data = None