fix: download notification opened the wrong song (same-name album)

The finished-download notification resolved the album by name via search3, then fell back to
a same-named album by a DIFFERENT artist (or the first result) when the exact artist match
wasn't found — e.g. right after download, before Navidrome rescans. Many artists share an album
title ("I LIKE IT!"), so the notification navigated to a completely different song.

- Web (notify.js) + Android (AppNavigation): require the artist to match when known (fuzzy for
  multi-artist / album-artist drift); drop the name-only and first-result fallbacks. If nothing
  matches, show "wird evtl. gerade gescannt" instead of opening a wrong album.

The download itself was correct all along (verified: it grabbed UPSAHL's official "I LIKE IT!"
visualizer) — only the notification's navigation was wrong. SW ns-v63.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Opus 4.8 committed 2026-08-01 02:30:53 +02:00
1 parent 1e206e8df3
commit 17bb527e1d
4 files changed
+23 -11

No files matched your search

@@ -576,13 +576,19 @@ fun AppNavigation() {
val res = repo.search(n.navAlbum)
val albums = res.album
val norm = { s: String -> s.lowercase().trim() }
val na = norm(n.navArtist)
// REQUIRE the artist match when we know it — several artists share an
// album title ("I LIKE IT!"); the old name-only / firstOrNull fallback
// opened a completely different artist's album (wrong song).
val match = albums.firstOrNull {
norm(it.name) == norm(n.navAlbum) &&
(n.navArtist.isBlank() || norm(it.artist ?: "") == norm(n.navArtist))
} ?: albums.firstOrNull { norm(it.name) == norm(n.navAlbum) }
?: albums.firstOrNull()
val aa = norm(it.artist ?: "")
norm(it.name) == norm(n.navAlbum) && na.isNotBlank() &&
(aa == na || aa.contains(na) || na.contains(aa))
} ?: if (na.isBlank()) albums.firstOrNull { norm(it.name) == norm(n.navAlbum) } else null
if (match != null) {
navController.navigate("album/${match.id}")
} else {
Toast.makeText(context, "Album noch nicht gefunden — evtl. wird die Library gerade gescannt", Toast.LENGTH_SHORT).show()
}
}
}