- add core/wishlist as the home for wishlist payload, resolution, state, processing, reporting, and selection helpers - move wishlist-specific tests into tests/wishlist alongside the new package layout - keep web_server.py and the import/search callers as thin adapters for now
48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
"""Wishlist lookup helpers for search and library checks."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
|
|
def load_wishlist_keys(cursor, profile_id: int) -> set[str]:
|
|
"""Build a set of `name|||artist` keys from the wishlist for fast lookup.
|
|
|
|
Try the profile-aware schema first; fall back to the legacy schema if
|
|
profile_id column is missing (older DBs). Errors at any level are
|
|
swallowed — wishlist annotation is best-effort.
|
|
"""
|
|
keys: set[str] = set()
|
|
|
|
def _absorb(rows):
|
|
for wr in rows:
|
|
try:
|
|
wd = json.loads(wr[0]) if isinstance(wr[0], str) else {}
|
|
wname = (wd.get("name") or "").lower()
|
|
wartists = wd.get("artists", [])
|
|
if wartists:
|
|
first = wartists[0]
|
|
wa = first.get("name", "") if isinstance(first, dict) else str(first)
|
|
else:
|
|
wa = ""
|
|
if wname:
|
|
keys.add(wname + "|||" + wa.lower().strip())
|
|
except Exception:
|
|
pass
|
|
|
|
try:
|
|
cursor.execute("SELECT spotify_data FROM wishlist_tracks WHERE profile_id = ?", (profile_id,))
|
|
_absorb(cursor.fetchall())
|
|
return keys
|
|
except Exception:
|
|
pass
|
|
|
|
try:
|
|
cursor.execute("SELECT spotify_data FROM wishlist_tracks")
|
|
_absorb(cursor.fetchall())
|
|
except Exception:
|
|
pass
|
|
return keys
|
|
|
|
|
|
__all__ = ["load_wishlist_keys"]
|