Commit 83a1614
Add Reject button: blocklist + delete a wrong Spotify match
Sits next to the Verify button on /admin/duration-mismatches/<song>.
Confirms first, then in a single transaction:
1. Inserts into bad_streaming_matches at block_level='track' so
get_blocked_tracks_for_song will return this Spotify track on the
next match attempt — the matcher already consults this list at the
top of match_track_to_recording and skips blocked candidates. The
block survives every rematch / refresh / sweep cycle.
2. DELETEs the recording_release_streaming_links row.
Idempotent: the unique constraint on bad_streaming_matches collapses
duplicate inserts; a second reject on the same link 404s on the
already-deleted row.
Concrete case from production: a Spotify track linked to the wrong
album entirely (different artists, different songs). Plain delete
without blocking would let the next rematch re-find and re-link the
same wrong track. The block tells the matcher "this Spotify track is
never a match for this song," permanently.
Plumbing:
- New helper integrations.spotify.db.block_streaming_track(conn, song_id,
track_id, ...) — inserts the blocklist row idempotently. Uses
column-list ON CONFLICT (not constraint-name) so test environments
bootstrapped from sql/jazz-db-schema.sql work without depending on
the named-constraint form in the migration file.
- New admin endpoint POST /admin/duration-mismatches/links/<id>/reject
with optional body {"reason": "..."} captured into
bad_streaming_matches.reason for human review. 404s for unknown link.
Goes through the existing admin gate + CSRF double-submit.
- Reject button on the Status column with a destructive confirm
dialog ("This is permanent until you remove the blocklist entry
manually"). Only shown on unverified rows — verified rows have
already been intentionally accepted, so a reject affordance there
would be confusing.
Tests: 7 new in test_admin_verify_match.py covering the db helper's
insert + idempotency, and the endpoint's auth gate, success path,
reason persistence, 404, and idempotency.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent 7fcde90 commit 83a1614
4 files changed
Lines changed: 363 additions & 0 deletions
File tree
- backend
- integrations/spotify
- routes
- templates/admin
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
668 | 668 | | |
669 | 669 | | |
670 | 670 | | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + | |
| 692 | + | |
| 693 | + | |
| 694 | + | |
| 695 | + | |
| 696 | + | |
| 697 | + | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
| 705 | + | |
| 706 | + | |
| 707 | + | |
| 708 | + | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
671 | 722 | | |
672 | 723 | | |
673 | 724 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| 28 | + | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
| |||
3041 | 3042 | | |
3042 | 3043 | | |
3043 | 3044 | | |
| 3045 | + | |
| 3046 | + | |
| 3047 | + | |
| 3048 | + | |
| 3049 | + | |
| 3050 | + | |
| 3051 | + | |
| 3052 | + | |
| 3053 | + | |
| 3054 | + | |
| 3055 | + | |
| 3056 | + | |
| 3057 | + | |
| 3058 | + | |
| 3059 | + | |
| 3060 | + | |
| 3061 | + | |
| 3062 | + | |
| 3063 | + | |
| 3064 | + | |
| 3065 | + | |
| 3066 | + | |
| 3067 | + | |
| 3068 | + | |
| 3069 | + | |
| 3070 | + | |
| 3071 | + | |
| 3072 | + | |
| 3073 | + | |
| 3074 | + | |
| 3075 | + | |
| 3076 | + | |
| 3077 | + | |
| 3078 | + | |
| 3079 | + | |
| 3080 | + | |
| 3081 | + | |
| 3082 | + | |
| 3083 | + | |
| 3084 | + | |
| 3085 | + | |
| 3086 | + | |
| 3087 | + | |
| 3088 | + | |
| 3089 | + | |
| 3090 | + | |
| 3091 | + | |
| 3092 | + | |
| 3093 | + | |
| 3094 | + | |
| 3095 | + | |
| 3096 | + | |
| 3097 | + | |
| 3098 | + | |
| 3099 | + | |
| 3100 | + | |
| 3101 | + | |
| 3102 | + | |
| 3103 | + | |
| 3104 | + | |
| 3105 | + | |
| 3106 | + | |
| 3107 | + | |
| 3108 | + | |
| 3109 | + | |
| 3110 | + | |
| 3111 | + | |
| 3112 | + | |
| 3113 | + | |
| 3114 | + | |
| 3115 | + | |
| 3116 | + | |
| 3117 | + | |
| 3118 | + | |
| 3119 | + | |
| 3120 | + | |
| 3121 | + | |
| 3122 | + | |
| 3123 | + | |
| 3124 | + | |
3044 | 3125 | | |
3045 | 3126 | | |
3046 | 3127 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
329 | 329 | | |
330 | 330 | | |
331 | 331 | | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
332 | 355 | | |
333 | 356 | | |
334 | 357 | | |
| |||
614 | 637 | | |
615 | 638 | | |
616 | 639 | | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
617 | 644 | | |
618 | 645 | | |
619 | 646 | | |
| |||
687 | 714 | | |
688 | 715 | | |
689 | 716 | | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + | |
| 743 | + | |
| 744 | + | |
| 745 | + | |
| 746 | + | |
| 747 | + | |
| 748 | + | |
| 749 | + | |
| 750 | + | |
| 751 | + | |
| 752 | + | |
| 753 | + | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + | |
| 759 | + | |
| 760 | + | |
690 | 761 | | |
691 | 762 | | |
692 | 763 | | |
| |||
0 commit comments