A music player that connects to your cloud/distributed storage.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: artwork improvements

+15 -5
+1 -3
src/components/artwork/musicbrainz/worker.js
··· 79 79 const album = track.tags?.album; 80 80 81 81 const query = `release:"${escapeLucene(album || "")}"` + 82 - (variousArtists 83 - ? `` 84 - : ` AND artistname:"${escapeLucene(artist || "")}"`); 82 + (variousArtists ? `` : ` AND artistname:"${escapeLucene(artist || "")}"`); 85 83 const encodedQuery = encodeURIComponent(query); 86 84 87 85 return await fetch(
+1
src/components/input/opensubsonic/worker.js
··· 41 41 () => null, 42 42 ); 43 43 if (!response?.ok) return null; 44 + if (!response.headers.get("content-type")?.startsWith("image/")) return null; 44 45 45 46 return new Uint8Array(await response.arrayBuffer()); 46 47 }
+12 -1
src/components/orchestrator/artwork/worker.js
··· 16 16 const IDB_PREFIX = "~/components/orchestrator/artwork"; 17 17 const IDB_ARTWORK_PREFIX = `${IDB_PREFIX}/cache`; 18 18 19 + /** @type {Map<string, Promise<Uint8Array | null>>} */ 20 + const inFlight = new Map(); 21 + 19 22 //////////////////////////////////////////// 20 23 // ACTIONS 21 24 //////////////////////////////////////////// ··· 24 27 * @type {ActionsWithTunnel<Actions>['get']} 25 28 */ 26 29 export async function get({ data: track, ports }) { 27 - return processRequest(track, ports); 30 + const existing = inFlight.get(track.id); 31 + if (existing) return existing; 32 + 33 + const promise = processRequest(track, ports).finally(() => { 34 + inFlight.delete(track.id); 35 + }); 36 + 37 + inFlight.set(track.id, promise); 38 + return promise; 28 39 } 29 40 30 41 ////////////////////////////////////////////
+1 -1
src/facets/data/artwork-bundle/index.inline.js
··· 20 20 21 21 inputArtwork(artwork, input); 22 22 audioMetadata(artwork, input); 23 - lastFm(artwork); 24 23 musicBrainz(artwork); 24 + lastFm(artwork); 25 25 }); 26 26 27 27 ////////////////////////////////////////////