diff --git a/src/Javascript/Brain/index.js b/src/Javascript/Brain/index.js index abd4c470..ad58ef47 100644 --- a/src/Javascript/Brain/index.js +++ b/src/Javascript/Brain/index.js @@ -113,7 +113,15 @@ function downloadArtwork(list) { function shiftArtworkQueue() { const next = artworkQueue.shift() - if (next) app.ports.makeArtworkTrackUrls.send(next) + + if (next) { + app.ports.makeArtworkTrackUrls.send(next) + } else { + self.postMessage({ + action: "FINISHED_DOWNLOADING_ARTWORK", + data: null + }) + } } diff --git a/src/Javascript/audio-engine.js b/src/Javascript/audio-engine.js index f048a2d7..56328b5c 100644 --- a/src/Javascript/audio-engine.js +++ b/src/Javascript/audio-engine.js @@ -112,23 +112,7 @@ export function insertTrack(orchestrion, queueItem, maybeArtwork) { timesStalled = 1 // metadata - if ("mediaSession" in navigator && queueItem.trackTags) { - let artwork = [] - - if (maybeArtwork && typeof maybeArtwork !== "string") { - artwork = [{ - src: URL.createObjectURL(maybeArtwork), - type: maybeArtwork.type - }] - } - - navigator.mediaSession.metadata = new MediaMetadata({ - title: queueItem.trackTags.title, - artist: queueItem.trackTags.artist, - album: queueItem.trackTags.album, - artwork: artwork - }) - } + setMediaSessionMetadata(queueItem, maybeArtwork) // initial promise const initialPromise = queueItem.isCached @@ -494,6 +478,27 @@ function setDurationIfNecessary(audio) { } +export function setMediaSessionMetadata(queueItem, maybeArtwork) { + if ("mediaSession" in navigator === false || !queueItem.trackTags) return + + let artwork = [] + + if (maybeArtwork && typeof maybeArtwork !== "string") { + artwork = [{ + src: URL.createObjectURL(maybeArtwork), + type: maybeArtwork.type + }] + } + + navigator.mediaSession.metadata = new MediaMetadata({ + title: queueItem.trackTags.title, + artist: queueItem.trackTags.artist, + album: queueItem.trackTags.album, + artwork: artwork + }) +} + + function unstallAudio(node) { const time = node.currentTime diff --git a/src/Javascript/index.js b/src/Javascript/index.js index aca9d2ad..76c97f00 100644 --- a/src/Javascript/index.js +++ b/src/Javascript/index.js @@ -143,6 +143,7 @@ wire.brain = () => { function handleAction(action, data, _ports) { switch (action) { case "DOWNLOAD_TRACKS": return downloadTracks(data) + case "FINISHED_DOWNLOADING_ARTWORK": return finishedDownloadingArtwork() }} @@ -219,11 +220,17 @@ function activeQueueItemChanged(item) { orchestrion, item, maybeCover - ) - if (!maybeCover) { - loadAlbumCovers([ coverPrep ]) - } + ).then(() => { + if (!maybeCover) { + if (!orchestrion.audio) return + orchestrion.audio.waitingForArtwork = coverPrep.cacheKey + loadAlbumCovers([ coverPrep ]) + } else { + orchestrion.audio.waitingForArtwork = null + } + + }) }) // ✋ @@ -506,6 +513,17 @@ function cachedCovers(keys) { } +function finishedDownloadingArtwork() { + if (!orchestrion.audio || !orchestrion.audio.waitingForArtwork || !orchestrion.activeQueueItem) return + + albumCover(orchestrion.audio.waitingForArtwork).then(maybeArtwork => { + audioEngine.setMediaSessionMetadata(orchestrion.activeQueueItem, maybeArtwork) + }) + + orchestrion.audio.waitingForArtwork = null +} + + // Dark mode // ---------