Skip to content

YouTube admin review page + per-link verify/reject parity with Spotify #172

@dprodger

Description

@dprodger

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

  1. 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
  2. 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.
  3. 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.
  4. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions