Fix: ID gate missed Deezer-track-id-only rows
The original gate baked into `_select_discovery_tracks` only checked
Spotify + iTunes:
AND (spotify_track_id IS NOT NULL OR itunes_track_id IS NOT NULL)
For Deezer-primary users, discovery_pool rows have populated
`deezer_track_id` but NULL Spotify + NULL iTunes IDs. The gate
filtered every row out — Time Machine, Genre Browser, Hidden Gems,
Discovery Shuffle, Popular Picks all rendered "no tracks found" for
every tab on every Deezer-primary install.
Extended the gate to include `deezer_track_id` and added that column
to the standard SELECT column tuple. `_build_track_dict` already
exposed `deezer_track_id` in its output shape, so frontend rendering
needed no changes.
Regression pinned via new test
`test_discovery_helper_accepts_deezer_only_id_rows` — inserts a row
with NULL Spotify + NULL iTunes but a populated `deezer_track_id`
and asserts it survives the gate.
2220/2220 full suite green.
This commit is contained in:
parent
959562f6b0
commit
d123581a39
2 changed files with 26 additions and 2 deletions
|
|
@ -111,6 +111,7 @@ class PersonalizedPlaylistsService:
|
||||||
_STANDARD_DISCOVERY_COLUMNS: Tuple[str, ...] = (
|
_STANDARD_DISCOVERY_COLUMNS: Tuple[str, ...] = (
|
||||||
'spotify_track_id',
|
'spotify_track_id',
|
||||||
'itunes_track_id',
|
'itunes_track_id',
|
||||||
|
'deezer_track_id',
|
||||||
'track_name',
|
'track_name',
|
||||||
'artist_name',
|
'artist_name',
|
||||||
'album_name',
|
'album_name',
|
||||||
|
|
@ -141,7 +142,7 @@ class PersonalizedPlaylistsService:
|
||||||
|
|
||||||
The WHERE clause always includes:
|
The WHERE clause always includes:
|
||||||
source = ?
|
source = ?
|
||||||
AND (spotify_track_id IS NOT NULL OR itunes_track_id IS NOT NULL)
|
AND (spotify_track_id IS NOT NULL OR itunes_track_id IS NOT NULL OR deezer_track_id IS NOT NULL)
|
||||||
AND LOWER(artist_name) NOT IN
|
AND LOWER(artist_name) NOT IN
|
||||||
(SELECT LOWER(artist_name) FROM discovery_artist_blacklist)
|
(SELECT LOWER(artist_name) FROM discovery_artist_blacklist)
|
||||||
|
|
||||||
|
|
@ -181,7 +182,7 @@ class PersonalizedPlaylistsService:
|
||||||
{select_cols}
|
{select_cols}
|
||||||
FROM discovery_pool
|
FROM discovery_pool
|
||||||
WHERE source = ?
|
WHERE source = ?
|
||||||
AND (spotify_track_id IS NOT NULL OR itunes_track_id IS NOT NULL)
|
AND (spotify_track_id IS NOT NULL OR itunes_track_id IS NOT NULL OR deezer_track_id IS NOT NULL)
|
||||||
AND LOWER(artist_name) NOT IN (SELECT LOWER(artist_name) FROM discovery_artist_blacklist)
|
AND LOWER(artist_name) NOT IN (SELECT LOWER(artist_name) FROM discovery_artist_blacklist)
|
||||||
{extra_where}
|
{extra_where}
|
||||||
ORDER BY {order_by}
|
ORDER BY {order_by}
|
||||||
|
|
|
||||||
|
|
@ -135,6 +135,29 @@ def test_discovery_helper_filters_null_id_rows(service):
|
||||||
assert names == ['Has Spotify ID', 'Has iTunes ID']
|
assert names == ['Has Spotify ID', 'Has iTunes ID']
|
||||||
|
|
||||||
|
|
||||||
|
def test_discovery_helper_accepts_deezer_only_id_rows(service):
|
||||||
|
"""Discovery pool rows with NULL spotify + NULL itunes but a populated
|
||||||
|
deezer_track_id MUST pass the gate. Regression test — early version
|
||||||
|
of the gate only checked Spotify + iTunes, which silently filtered
|
||||||
|
out every row for Deezer-primary users (entire Time Machine /
|
||||||
|
Genre / Hidden Gems / Shuffle / Popular Picks rendered empty)."""
|
||||||
|
svc, db = service
|
||||||
|
db.insert_discovery_track(
|
||||||
|
source='deezer', deezer_track_id='dz1',
|
||||||
|
spotify_track_id=None, itunes_track_id=None,
|
||||||
|
track_name='Deezer Only', artist_name='A', album_name='X',
|
||||||
|
popularity=50, release_date='2024-01-01',
|
||||||
|
)
|
||||||
|
with patch.object(svc, '_get_active_source', return_value='deezer'):
|
||||||
|
tracks = svc._select_discovery_tracks(
|
||||||
|
source='deezer',
|
||||||
|
order_by='track_name',
|
||||||
|
fetch_limit=100,
|
||||||
|
)
|
||||||
|
assert [t['track_name'] for t in tracks] == ['Deezer Only']
|
||||||
|
assert tracks[0]['deezer_track_id'] == 'dz1'
|
||||||
|
|
||||||
|
|
||||||
def test_discovery_helper_filters_blacklisted_artists(service):
|
def test_discovery_helper_filters_blacklisted_artists(service):
|
||||||
svc, db = service
|
svc, db = service
|
||||||
db.insert_discovery_track(
|
db.insert_discovery_track(
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue