fix: invalidate index discographies after library rescan

The search index's Tier 3 (library artists) depends on MBIDs from
the artists table. If the index built before a rescan populated
those MBIDs, library artists like Flatbush Zombies wouldn't be
indexed — they're not in the sitewide top 1000 and their name
didn't match via fuzzy matching.

Fix: OnAllScansComplete hook now calls InvalidateIndexDiscographies
before StartIndexBuild. This clears the discog_built timestamp so
Tiers 2-4 re-run incrementally, picking up any new library artists
whose MBIDs were just populated by the scan.

The rebuild is incremental — only artists not already in the index
get their discographies fetched.
This commit is contained in:
2026-03-28 12:40:23 -04:00
parent 48a8713091
commit 15a0b94348
3 changed files with 18 additions and 0 deletions
+3
View File
@@ -218,6 +218,9 @@ func (yj *YellowJacketApp) OnStartup(ctx context.Context) {
yj.library.SetScanHooks(library.ScanHooks{
ResolvePhantoms: yj.playlist.ResolvePhantomTracksAfterScan,
OnAllScansComplete: func() {
// Force index Tiers 2-4 to re-check for new library
// artists whose MBIDs were just populated by the scan.
yj.explore.InvalidateIndexDiscographies()
yj.explore.StartIndexBuild()
},
})
+7
View File
@@ -78,6 +78,13 @@ func (e *Service) StopIndexBuild() {
e.index.StopBuild()
}
// InvalidateIndexDiscographies clears the discography build
// timestamp so the next index build re-runs Tiers 2-4. Call
// after a library rescan that may have populated new MBIDs.
func (e *Service) InvalidateIndexDiscographies() {
e.index.InvalidateDiscographies()
}
// ---------------------------------------------------------------------------
// MusicBrainz search
// ---------------------------------------------------------------------------
+8
View File
@@ -1381,6 +1381,14 @@ func filterUnindexed(artists []lbSitewideArtist, indexed map[string]bool) []lbSi
return out
}
// InvalidateDiscographies clears the discography build timestamp
// so the next build re-runs Tiers 2-4.
func (si *SearchIndex) InvalidateDiscographies() {
_, _ = si.db.ExecContext(
"DELETE FROM explore_index_meta WHERE key = 'discog_built'",
)
}
func (si *SearchIndex) setMeta(key, value string) {
if _, err := si.db.ExecContext(
"INSERT OR REPLACE INTO explore_index_meta (key, value) VALUES (?, ?)",