perf: batch artist image loading for library grid view

Replace per-artist sequential GetArtistMBID + GetArtistImageURL
calls (2 Wails round-trips × N artists) with a single batch
GetArtistImages(names[]) call that:

1. Resolves all names → MBIDs via AllArtistMBIDs() (one DB query)
2. Checks disk cache for each MBID via GetCachedImage (no network)
3. Returns map[name]→dataURL in one Wails bridge round-trip

Only returns already-cached images from the disk cache populated
by the index build. No network fetches triggered — artists whose
images haven't been cached yet keep the initial letter fallback
until the index build resolves them in the background.

Result: all cached artist images appear simultaneously on first
render instead of loading one-by-one over several seconds.
This commit is contained in:
2026-03-28 15:22:22 -04:00
parent df1d1785e9
commit 7ec9785463
5 changed files with 113 additions and 17 deletions
+11 -3
View File
@@ -7,16 +7,22 @@ export function BrowseReleaseGroups(arg1:string):Promise<Array<explore.MBRelease
export function BrowseReleases(arg1:string):Promise<Array<explore.MBRelease>>;
export function CheckLibraryMBIDs(arg1:Array<string>):Promise<Record<string, string>>;
export function CoverArtGroupURL(arg1:string):Promise<string>;
export function CoverArtURL(arg1:string):Promise<string>;
export function GetArtistImageURL(arg1:string):Promise<string>;
export function GetArtistMBID(arg1:string):Promise<string>;
export function GetThumbnail(arg1:string,arg2:string,arg3:string):Promise<string>;
export function GetThumbnails(arg1:Array<explore.ThumbnailRequest>):Promise<Record<string, string>>;
export function InvalidateIndexDiscographies():Promise<void>;
export function LookupArtist(arg1:string):Promise<explore.MBArtist>;
export function LookupReleaseGroup(arg1:string):Promise<explore.MBReleaseGroup>;
@@ -33,8 +39,10 @@ export function SetContext(arg1:context.Context):Promise<void>;
export function SimilarArtists(arg1:string):Promise<Array<explore.LBSimilarArtist>>;
export function StartIndexBuild():Promise<void>;
export function StopIndexBuild():Promise<void>;
export function TopRecordingsForArtist(arg1:string):Promise<Array<explore.LBTopRecording>>;
export function CheckLibraryMBIDs(arg1:string[]):Promise<Record<string, string>>;
export function GetArtistMBID(arg1:string):Promise<string>;
export function GetArtistImages(arg1:string[]):Promise<Record<string, string>>;
+22 -6
View File
@@ -10,6 +10,10 @@ export function BrowseReleases(arg1) {
return window['go']['explore']['Service']['BrowseReleases'](arg1);
}
export function CheckLibraryMBIDs(arg1) {
return window['go']['explore']['Service']['CheckLibraryMBIDs'](arg1);
}
export function CoverArtGroupURL(arg1) {
return window['go']['explore']['Service']['CoverArtGroupURL'](arg1);
}
@@ -22,6 +26,10 @@ export function GetArtistImageURL(arg1) {
return window['go']['explore']['Service']['GetArtistImageURL'](arg1);
}
export function GetArtistMBID(arg1) {
return window['go']['explore']['Service']['GetArtistMBID'](arg1);
}
export function GetThumbnail(arg1, arg2, arg3) {
return window['go']['explore']['Service']['GetThumbnail'](arg1, arg2, arg3);
}
@@ -30,6 +38,10 @@ export function GetThumbnails(arg1) {
return window['go']['explore']['Service']['GetThumbnails'](arg1);
}
export function InvalidateIndexDiscographies() {
return window['go']['explore']['Service']['InvalidateIndexDiscographies']();
}
export function LookupArtist(arg1) {
return window['go']['explore']['Service']['LookupArtist'](arg1);
}
@@ -62,14 +74,18 @@ export function SimilarArtists(arg1) {
return window['go']['explore']['Service']['SimilarArtists'](arg1);
}
export function StartIndexBuild() {
return window['go']['explore']['Service']['StartIndexBuild']();
}
export function StopIndexBuild() {
return window['go']['explore']['Service']['StopIndexBuild']();
}
export function TopRecordingsForArtist(arg1) {
return window['go']['explore']['Service']['TopRecordingsForArtist'](arg1);
}
export function CheckLibraryMBIDs(arg1) {
return window['go']['explore']['Service']['CheckLibraryMBIDs'](arg1);
}
export function GetArtistMBID(arg1) {
return window['go']['explore']['Service']['GetArtistMBID'](arg1);
export function GetArtistImages(arg1) {
return window['go']['explore']['Service']['GetArtistImages'](arg1);
}