fix: preserve local search results when full search returns empty
When searching 'lord', library cache instantly showed Lord Huron, Lorde, etc. But the full MB+LB search returned empty (filtered by minBlendedScore) and overwrote the local results with 'no results'. Now executeFullSearch preserves local results: - If full search has results, merge library-only entries into them (dedup by name) so local artists aren't lost - If full search is empty but local results exist, keep local results - Only show empty state when both are empty Added mergeLocalIntoFull() for deduplicating local results against the full search response by artist name and album title+artist.
This commit is contained in:
@@ -655,6 +655,45 @@ export class ExploreView extends LitElement {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge library-only results from this.results into the full
|
||||||
|
* search result. Adds local artists/albums that the MB search
|
||||||
|
* didn't find (by name dedup) so they aren't lost.
|
||||||
|
*/
|
||||||
|
private mergeLocalIntoFull(full: MBSearchResult) {
|
||||||
|
const prev = this.results;
|
||||||
|
if (!prev) return;
|
||||||
|
|
||||||
|
// Dedup artists by name (case-insensitive).
|
||||||
|
if (prev.artists?.length) {
|
||||||
|
const existing = new Set(
|
||||||
|
(full.artists || []).map((a) => a.name.toLowerCase()),
|
||||||
|
);
|
||||||
|
for (const a of prev.artists) {
|
||||||
|
if (!existing.has(a.name.toLowerCase())) {
|
||||||
|
full.artists = full.artists || [];
|
||||||
|
full.artists.push(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dedup albums by title + artist (case-insensitive).
|
||||||
|
if (prev.releaseGroups?.length) {
|
||||||
|
const existing = new Set(
|
||||||
|
(full.releaseGroups || []).map(
|
||||||
|
(rg) => `${rg.title}|${rg.artistCredit}`.toLowerCase(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
for (const rg of prev.releaseGroups) {
|
||||||
|
const key = `${rg.title}|${rg.artistCredit}`.toLowerCase();
|
||||||
|
if (!existing.has(key)) {
|
||||||
|
full.releaseGroups = full.releaseGroups || [];
|
||||||
|
full.releaseGroups.push(rg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private async executeFullSearch(version: number, query: string, startTime: number) {
|
private async executeFullSearch(version: number, query: string, startTime: number) {
|
||||||
try {
|
try {
|
||||||
const result = await Search(query);
|
const result = await Search(query);
|
||||||
@@ -667,10 +706,36 @@ export class ExploreView extends LitElement {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.results = this.mergeWithLibrary(result);
|
const merged = this.mergeWithLibrary(result);
|
||||||
|
|
||||||
|
// If the full search returned results, use them.
|
||||||
|
// If it returned nothing but we had local results, keep those.
|
||||||
|
const hasFullResults =
|
||||||
|
(merged.artists?.length ?? 0) > 0 ||
|
||||||
|
(merged.releaseGroups?.length ?? 0) > 0 ||
|
||||||
|
(merged.recordings?.length ?? 0) > 0;
|
||||||
|
const hadLocalResults = this.results &&
|
||||||
|
((this.results.artists?.length ?? 0) > 0 ||
|
||||||
|
(this.results.releaseGroups?.length ?? 0) > 0 ||
|
||||||
|
(this.results.recordings?.length ?? 0) > 0);
|
||||||
|
|
||||||
|
if (hasFullResults) {
|
||||||
|
// Preserve any library-only artists/albums that the MB
|
||||||
|
// search didn't find (no MBID, or MB didn't match).
|
||||||
|
if (hadLocalResults) {
|
||||||
|
this.mergeLocalIntoFull(merged);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.results = merged;
|
||||||
|
} else if (!hadLocalResults) {
|
||||||
|
// Both local and full are empty — show empty state.
|
||||||
|
this.results = merged;
|
||||||
|
}
|
||||||
|
// else: keep existing local results as-is.
|
||||||
|
|
||||||
exploreCache.populateFromSearch(
|
exploreCache.populateFromSearch(
|
||||||
this.results.artists || [],
|
this.results?.artists || [],
|
||||||
this.results.releaseGroups || [],
|
this.results?.releaseGroups || [],
|
||||||
);
|
);
|
||||||
this.loadThumbnails();
|
this.loadThumbnails();
|
||||||
this.loadArtistImages();
|
this.loadArtistImages();
|
||||||
|
|||||||
Reference in New Issue
Block a user