Skip to content

v1.7.0: full-reliability Fast mode (batch default), player scroll fix, fluke closure - #17

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

v1.7.0: full-reliability Fast mode (batch default), player scroll fix, fluke closure#17
DynamycSound merged 1 commit into
masterfrom
claude/song-matching-improvements-7tp3qn

Conversation

@DynamycSound

Copy link
Copy Markdown
Owner

Fast mode: reliability restored, promoted to batch

Live-probe diagnosis of the latest "no lyrics found" screenshots: most of those songs ARE on LRCLib, synced ("Ili Ili" by Seksi, "Peta Brzina" by Vlada Matovic, "TMM TMM" by Summer Cem) — but the user ran fast mode, which truncated the provider list to the top 2, so the provider that has them never ran (rows show only QQ/Netease tried). Since providers already race in parallel, truncation bought ~nothing and cost real matches.

  • MatchConfig.fast() now keeps all enabled providers and the full candidate ladder; speed comes from tight retry/timeout budgets + the early auto-accept stop.
  • New batchFastMode setting (default on), surfaced at the top of batch download options labeled Recommended; batch runs now use the fast config when enabled.

Player: the real "stuck at first line" bug

val currentIndex by remember { derivedStateOf { ... lines ... } } — unkeyed remember captured the initially-empty lines list forever when lyrics load asynchronously (the from-Home path added with the issue-#11 fix), so the highlight and the auto-scroll never moved for the whole song. Now remember(lines). Also:

  • Enhanced-LRC word stamps (<00:40.49>) are stripped from displayed text (they were rendered raw), and lines carrying only word stamps now parse using the first word stamp as line time.
  • Same stamp-stripping in the result-screen preview.

Batch impostor guard (the "200" fluke)

"200" (Ourmoney) got Russian lyrics from a same-length "200" by Tveth/Sevnz/Лора — the exact-runtime escape let a disagreeing artist through and the cover second-opinion was advisory only. In batch (which saves unattended), a hit or rescue or plain-fallback whose artist agrees with none of the file's artist readings now requires positive cover-art confirmation, else it's skipped. The single-song screen keeps the escape since the user visually judges results there. The correct "200" exists on LRCLib as plain lyrics and is reachable via the unsynced fallback.

Cross-script matching

Serbian/Russian Cyrillic → Latin transliteration in normalizeForCompare (aligned with diacritic stripping: ж→z like ž→z): "Секси" == "Seksi". Cyrillic-indexed provider entries stop counting as strangers; genuinely different Cyrillic acts still disagree.

Query recovery

Double quotes (straight + smart) stripped from titles: Summer Cem - "TMM TMM" now reaches providers (LRCLib has it synced ×3).

Providers investigated, honestly

Verified live: QQ indexes the missing Serbian songs (Prazan Disko, Volim Pare — exact ids found) but its lyric backend returns empty for them (sanity-checked working on Shape of You); Genius is Cloudflare-blocked with no usable tokenless API; tekstovi.net has no machine-readable search. No new provider is added because none would deliver lyrics — recovery comes from the fixes above. Songs absent from every catalogue keep failing honestly.

Version

1.6.4 (164)1.7.0 (170).

Testing

  • 2 new tests (quoted titles, Cyrillic transliteration + "200" disagreement) in MessyNameRecoveryTest — pass.
  • Full matching suite green except pre-existing live-network SuicideboysMatchTest.loot (fails on unmodified master).
  • :app:compileDebugKotlin clean.
  • Live catalogue probes for every recovery claim (LRCLib/QQ/Deezer/iTunes/paxsenix).

🤖 Generated with Claude Code

https://claude.ai/code/session_01QADiJzVyNycc1w28sirc1a


Generated by Claude Code

… closure

- Fast mode no longer truncates to 2 providers: all enabled providers race
  in parallel with tight budgets (the truncation silently skipped LRCLib
  and cost real matches: Ili Ili, Peta Brzina). Added batch fast-mode
  toggle at the top of batch options, default on, marked Recommended.
- Player: currentIndex derivedStateOf was unkeyed and captured the
  initially-empty async-loaded lines list forever (Home entry) — the
  highlight and auto-scroll never moved. Keyed on lines. Enhanced-LRC
  word stamps stripped from display; word-stamp-only lines now play.
- Batch impostor guard: a hit or rescue whose artist agrees with no local
  reading now requires positive cover-art confirmation — a duration
  coincidence alone no longer saves wrong lyrics ('200' by Tveth case).
  Plain fallback gets the same guard.
- Cyrillic→Latin transliteration in normalizeForCompare (Секси == Seksi).
- Double quotes stripped from queries ('Summer Cem - "TMM TMM"').
- Version 1.7.0 (170); release notes; 2 new regression tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QADiJzVyNycc1w28sirc1a
@DynamycSound
DynamycSound merged commit 34ea651 into master Jul 20, 2026
4 checks passed
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.

1 participant