YouTube matches today live in recording_release_streaming_links with service='youtube' but have no dedicated admin review page. Spotify has a full workflow at /admin/duration-mismatches/<song> with side-by-side tracklist comparison, Album Fit signal, per-link Verify/Reject actions, and manual-override persistence. YouTube needs equivalent affordances so an admin can find and fix bad YouTube matches without dropping into SQL.
What's missing
- Admin review page — list YouTube links surfaced by a "needs attention" signal. Spotify uses duration mismatch above 60s as the primary signal. YouTube candidates:
- Low
match_confidence (e.g. < 0.7)
- Mode =
youtube_conservative (the matcher accepted via the looser path)
- Both — most useful to surface first
- Per-link inspection panel — show the YouTube video metadata (channel, duration, title) alongside the MB recording's expected metadata, so the admin can decide quickly. Conceptually similar to the side-by-side tracklist comparison built for Spotify in fd3bf87.
- Verify/Reject actions — the existing
POST /admin/duration-mismatches/links/<id>/verify and /reject endpoints (added in 1aa6cf1 and 83a1614) hard-code service = 'spotify' in their SQL. They need to be generalised — either drop the service filter (since link_id is unique by itself) or accept ?service=youtube.
bad_streaming_matches already supports service='youtube' at block_level='track' so the reject-with-blocklist mechanism transfers cleanly.
Out of scope
- Bulk rematch sweep (filed separately).
- Catalog-wide collision detection equivalent (YouTube's per-recording target-type means the Spotify-style multi-junction collision pattern doesn't apply directly; revisit if collisions show up in practice).
References
- Spotify admin:
routes/admin.py /duration-mismatches and /duration-mismatches/<song_id> routes
- Spotify template:
templates/admin/duration_mismatches_review.html (the side-by-side panel + Verify/Reject UI is the model to match)
- YouTube data shape:
integrations/youtube/db.py upsert_youtube_for_recording writes confidence + match_method per row
YouTube matches today live in
recording_release_streaming_linkswithservice='youtube'but have no dedicated admin review page. Spotify has a full workflow at/admin/duration-mismatches/<song>with side-by-side tracklist comparison, Album Fit signal, per-link Verify/Reject actions, and manual-override persistence. YouTube needs equivalent affordances so an admin can find and fix bad YouTube matches without dropping into SQL.What's missing
match_confidence(e.g. < 0.7)youtube_conservative(the matcher accepted via the looser path)POST /admin/duration-mismatches/links/<id>/verifyand/rejectendpoints (added in 1aa6cf1 and 83a1614) hard-codeservice = 'spotify'in their SQL. They need to be generalised — either drop the service filter (sincelink_idis unique by itself) or accept?service=youtube.bad_streaming_matchesalready supportsservice='youtube'atblock_level='track'so the reject-with-blocklist mechanism transfers cleanly.Out of scope
References
routes/admin.py/duration-mismatchesand/duration-mismatches/<song_id>routestemplates/admin/duration_mismatches_review.html(the side-by-side panel + Verify/Reject UI is the model to match)integrations/youtube/db.pyupsert_youtube_for_recordingwrites confidence + match_method per row