Skip to content

Matching parity for batch, fast mode, and fixes for #11 & #12 - #13

Merged
DynamycSound merged 1 commit into
masterfrom
claude/song-matching-improvements-7tp3qn
Jul 20, 2026
Merged

Matching parity for batch, fast mode, and fixes for #11 & #12#13
DynamycSound merged 1 commit into
masterfrom
claude/song-matching-improvements-7tp3qn

Conversation

@DynamycSound

Copy link
Copy Markdown
Owner

Matching improvements ("single finds it, batch doesn't")

  • Candidate-view scoring: every provider hit is now scored against the candidate's parsed view of the track in addition to the raw tags, keeping the better one. Junk tags like title=Ariana Grande - Focus / artist=Unknown used to reject the correct hit (the raw view saw a ~30% title similarity and a "disagreeing" artist); the parsed view (Focus / Ariana Grande) now matches it directly — in batch too. This is what fixes Ariana Grande - Focus, Tyler, The Creator - Tamale and D-Devils - 6th Gate in batch runs.
    • Precision guard: a view without an artist (title-only candidate) only counts when the runtime matches exactly, so a same-titled song by a different artist can never auto-accept on title alone. Wrong-artist rejection, the title-evidence floor, and the remix REVIEW cap are all unchanged.
  • Batch now runs the last-resort rescue (iTunes/Deezer canonicalization → LRCLib re-query) that only the single-song screen had — the actual reason songs were "found when I opened them" but not in batch. Rescues stay behind the scorer gates and are always saved as REVIEW, never silently auto-accepted.
  • Junk artist tags (Unknown, Various Artists, <unknown>, …) are treated as absent instead of as contradicting evidence.
  • Biba - Harli Kvin (feat. AV47) [Official Audio] _420(MP3_320K).mp3: feat clauses are now extracted even when junk follows them mid-string, and trailing orphan numbers (_420 420) get an extra loose candidate (review-capped), yielding the clean Biba / Harli Kvin query.
  • Thumbnail confidence bonus: rescue candidates whose album art perceptually matches the local file's embedded cover (8×8 average hash) gain a small additive-only confidence bonus — a differing cover never subtracts, since covers legitimately vary between releases.

Fast mode

New Settings toggle (off by default): the single-song search races only the top two providers with a short per-provider budget (8s, one retry, fewer candidates) instead of the full chain. Faster answers, slightly less thorough.

Issue #11 — lyrics preview not detecting lyrics / infinite loading

  • The synced-lyrics player and the batch "tap to view lyrics" sheet only ever read the sidecar .lrc. For embed-only songs the player claimed "no lyrics" and the sheet spun forever. Both now fall back to lyrics embedded in the audio tags, load off the main thread, and always resolve to a terminal state (lyrics or an explicit "no lyrics in this file").

Issue #12 — redundant menu options

  • The home three-dot menu now contains only Settings. Batch download already has its own bottom button, and the provider order lives in Settings. (The selection-mode menu keeps its batch entry — it acts on the selected songs.)

Provider status honesty

  • Providers that returned a believable synced hit but were outranked by the winner are shown as "found lyrics" (green check) instead of a red X, and only providers that were actually queried can be recorded as failed — untried ones stay "not tried yet". Previously every non-winning provider was painted as failed.

UI polish

  • The Save .lrc / Embed lyrics buttons now animate on success: springy pulse, color morph to green, sliding label crossfade and a popping checkmark.

Tests

  • New BadMetadataMatchTest (7 JVM tests) covering the reported songs, the junk-artist handling, the Biba filename parse, and the precision guards. All existing matcher tests pass. (SuicideboysMatchTest.loot — a live-LRCLib test — fails identically on unmodified master; pre-existing data drift, unrelated.)

Closes #11
Closes #12

🤖 Generated with Claude Code

https://claude.ai/code/session_01QADiJzVyNycc1w28sirc1a


Generated by Claude Code

… feedback

Matching (the "single finds it, batch doesn't" reports):
- Score every provider hit against the candidate's parsed view of the track
  in addition to the raw tags. Junk tags like title="Ariana Grande - Focus" /
  artist="Unknown" used to reject the correct hit (30% title sim + disagreeing
  artist); the parsed view (Focus / Ariana Grande) now matches it directly.
  Artist-less views need an exact duration match so a same-titled song by a
  different artist can never auto-accept on title alone.
- Batch now runs the same iTunes/Deezer last-resort rescue the single-song
  screen had; rescued matches are validated by the scorer gates and always
  saved as REVIEW.
- Placeholder artists ("Unknown", "Various Artists", ...) are treated as
  absent instead of as disagreeing evidence.
- Feat clauses are extracted even mid-string ("Harli Kvin (feat. AV47) 420")
  and trailing orphan numbers from "_420"-style suffixes get a loose,
  review-capped candidate — fixes the Biba - Harli Kvin rip.
- New thumbnail check: a rescue candidate whose cover art perceptually matches
  the local file's embedded art gains a small additive-only confidence bonus
  (a differing cover never subtracts).

Fast mode (Settings > Provider): single-song search races only the top two
providers with a short timeout — faster, slightly less thorough, off by default.

Issue #11: the synced-lyrics player and the batch lyrics preview now fall back
to lyrics embedded in the audio tags (embed-only songs showed "no lyrics" /
an infinite spinner because only the sidecar .lrc was read), and both show a
real loading state that always terminates.

Issue #12: the home three-dot menu keeps only Settings — batch download has
its own button and the provider order lives in Settings.

Provider status honesty: providers that produced a believable synced hit but
lost the ranking are now shown as "found lyrics" instead of a red X, and only
providers that were actually queried can be marked as failed.

Save feedback: the Save .lrc / Embed buttons morph to green with a springy
pulse, sliding label and popping checkmark instead of an instant text swap.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QADiJzVyNycc1w28sirc1a
@DynamycSound
DynamycSound merged commit 4ba1d81 into master Jul 20, 2026
4 checks passed
@DynamycSound DynamycSound mentioned this pull request Jul 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FR] removing redundant options Bug: lyrics preview player not detecting lyrics

1 participant