clicking Download Discography → Add all to wishlist added ~1 track every 15-30s. trace: the endpoint's per-track library-ownership check (track_already_owned → check_track_exists) ran the LEGACY path — firing search_tracks for every title-variation × artist-variation, per track. on a large library and an artist you own NOTHING of, STRATEGY-1 (indexed LIKE) always missed and fell through to the fuzzy fallback (full-table scan), ~10-15 scans/track = the 15-30s. metadata fetch was never the bottleneck (deezer returns each album in ~1s). fix: pre-fetch the artist's owned tracks ONCE (get_candidate_albums_for_artist → get_candidate_tracks_for_albums) and pass candidate_tracks to check_track_exists's batched in-memory path — the same path the discography backfill job + completion-stream already use. pass an EMPTY list (not None) when nothing is owned so the owns-nothing case still takes the fast path → instant. per-track cost drops from ~20s to ~1ms. safe: track_already_owned's only real caller is this endpoint; the new param is optional (None = unchanged legacy behaviour for any other caller). normal ownership still detected (same artist-variation breadth); the one divergence is a track owned ONLY via a compilation → a harmless redundant wishlist add, which is the endpoint's explicitly-accepted failure mode and already how the backfill job behaves. 4 new tests; 1134 discog/metadata/wishlist tests green. |
||
|---|---|---|
| .. | ||
| __init__.py | ||
| album_mbid_cache.py | ||
| album_tracks.py | ||
| art_apply.py | ||
| art_lookup.py | ||
| art_preservation.py | ||
| art_sources.py | ||
| artist_album_cache.py | ||
| artist_image.py | ||
| artist_resolution.py | ||
| artwork.py | ||
| caa_art.py | ||
| cache.py | ||
| canonical_resolver.py | ||
| canonical_version.py | ||
| common.py | ||
| completion.py | ||
| discography.py | ||
| discography_filters.py | ||
| enrichment.py | ||
| lookup.py | ||
| lyrics.py | ||
| multi_source_search.py | ||
| registry.py | ||
| release_dates.py | ||
| release_type.py | ||
| relevance.py | ||
| service.py | ||
| similar_artists.py | ||
| source.py | ||
| status.py | ||
| track_number_format.py | ||
| types.py | ||