Expose Navidrome album coverArt as a Subsonic getCoverArt thumbnail so library refreshes keep a real album-art URL. Preserve existing album thumb_url when an incoming server album has no thumbnail, preventing manual or server-corrected covers from being cleared and later replaced by loose missing-cover searches. Add regression tests for Navidrome album thumbnails and DB thumb preservation.
87 lines
2.2 KiB
Python
87 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
import sqlite3
|
|
|
|
from database.music_database import MusicDatabase
|
|
|
|
|
|
class _InMemoryDB(MusicDatabase):
|
|
def __init__(self):
|
|
self._conn = sqlite3.connect(":memory:")
|
|
self._conn.row_factory = sqlite3.Row
|
|
|
|
def _get_connection(self):
|
|
return _NonClosingConn(self._conn)
|
|
|
|
|
|
class _NonClosingConn:
|
|
def __init__(self, real):
|
|
self._real = real
|
|
|
|
def cursor(self):
|
|
return self._real.cursor()
|
|
|
|
def commit(self):
|
|
return self._real.commit()
|
|
|
|
def close(self):
|
|
pass
|
|
|
|
|
|
class _Album:
|
|
ratingKey = "album-1"
|
|
title = "Flower Boy"
|
|
year = 2017
|
|
leafCount = 15
|
|
duration = 2940
|
|
genres = []
|
|
thumb = None
|
|
|
|
|
|
def _seed(db):
|
|
cur = db._conn.cursor()
|
|
cur.execute("""
|
|
CREATE TABLE albums (
|
|
id TEXT PRIMARY KEY,
|
|
artist_id TEXT,
|
|
title TEXT,
|
|
year INTEGER,
|
|
thumb_url TEXT,
|
|
genres TEXT,
|
|
track_count INTEGER,
|
|
duration INTEGER,
|
|
server_source TEXT,
|
|
created_at TEXT,
|
|
updated_at TEXT
|
|
)
|
|
""")
|
|
cur.execute("""
|
|
INSERT INTO albums
|
|
(id, artist_id, title, year, thumb_url, server_source)
|
|
VALUES
|
|
('album-1', 'artist-1', 'Flower Boy', 2017, '/rest/getCoverArt?id=correct-cover', 'navidrome')
|
|
""")
|
|
db._conn.commit()
|
|
|
|
|
|
def test_album_refresh_preserves_existing_thumb_when_incoming_thumb_missing():
|
|
db = _InMemoryDB()
|
|
_seed(db)
|
|
|
|
assert db.insert_or_update_media_album(_Album(), "artist-1", server_source="navidrome") is True
|
|
|
|
row = db._conn.execute("SELECT thumb_url FROM albums WHERE id = 'album-1'").fetchone()
|
|
assert row["thumb_url"] == "/rest/getCoverArt?id=correct-cover"
|
|
|
|
|
|
def test_album_refresh_updates_existing_thumb_when_incoming_thumb_present():
|
|
db = _InMemoryDB()
|
|
_seed(db)
|
|
|
|
album = _Album()
|
|
album.thumb = "/rest/getCoverArt?id=new-cover"
|
|
|
|
assert db.insert_or_update_media_album(album, "artist-1", server_source="navidrome") is True
|
|
|
|
row = db._conn.execute("SELECT thumb_url FROM albums WHERE id = 'album-1'").fetchone()
|
|
assert row["thumb_url"] == "/rest/getCoverArt?id=new-cover"
|