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

Configure Feed

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

Closes #259

+33 -7
+4 -2
src/Applications/UI/Tracks/State.elm
··· 505 505 506 506 selectCover : Cover -> Manager 507 507 selectCover cover model = 508 - Return.singleton { model | selectedCover = Just cover } 508 + return 509 + { model | selectedCover = Just cover } 510 + (Ports.loadAlbumCovers ()) 509 511 510 512 511 513 setSearchResults : Json.Value -> Manager ··· 645 647 model.covers.harvested 646 648 |> List.find (\cover -> List.member track.id cover.trackIds) 647 649 |> Maybe.unwrap model (\cover -> { model | selectedCover = Just cover }) 648 - |> Return.singleton 650 + |> Return.communicate (Ports.loadAlbumCovers ()) 649 651 650 652 List -> 651 653 return
+13 -2
src/Javascript/audio-engine.js
··· 157 157 // Playback 158 158 // -------- 159 159 160 - export function insertTrack(orchestrion, queueItem) { 160 + export function insertTrack(orchestrion, queueItem, maybeArtwork) { 161 161 if (queueItem.url == undefined) console.error("insertTrack, missing `url`"); 162 162 if (queueItem.trackId == undefined) console.error("insertTrack, missing `trackId`"); 163 163 ··· 174 174 175 175 // metadata 176 176 if ("mediaSession" in navigator && queueItem.trackTags) { 177 + let artwork = [] 178 + 179 + if (maybeArtwork) { 180 + artwork = [{ 181 + src: "https://dummyimage.com/512x512", 182 + sizes: "512x512", 183 + type: "image/png" 184 + }] 185 + } 186 + 177 187 navigator.mediaSession.metadata = new MediaMetadata({ 178 188 title: queueItem.trackTags.title, 179 189 artist: queueItem.trackTags.artist, 180 - album: queueItem.trackTags.album 190 + album: queueItem.trackTags.album, 191 + artwork: artwork 181 192 }) 182 193 } 183 194
+16 -3
src/Javascript/index.js
··· 178 178 : audioEngine.removeOlderAudioElements(timestampInMilliseconds) 179 179 180 180 if (item) { 181 - audioEngine.insertTrack(orchestrion, item) 181 + albumCover() 182 + 183 + audioEngine.insertTrack( 184 + orchestrion, 185 + item, 186 + albumCover 187 + ) 182 188 } else { 183 189 app.ports.setAudioIsPlaying.send(false) 184 190 app.ports.setAudioPosition.send(0) ··· 385 391 } 386 392 387 393 394 + function albumCover(cacheKey) { 395 + return db.getFromIndex({ key: `coverCache.${cacheKey}` }) 396 + } 397 + 398 + 388 399 function loadAlbumCovers() { 389 400 const nodes = Array.from( 390 401 document.querySelectorAll("#diffuse__track-covers [data-key]") 391 - ) 402 + ).concat(Array.from( 403 + document.querySelectorAll("#diffuse__track-covers + div [data-key]") 404 + )) 392 405 393 406 if (!nodes.length) return; 394 407 ··· 413 426 414 427 artworkPrep.reduce((acc, prep) => { 415 428 return acc.then(arr => { 416 - return db.getFromIndex({ key: `coverCache.${prep.cacheKey}` }).then(a => { 429 + return albumCover(prep.cacheKey).then(a => { 417 430 if (!a) return arr.concat([ prep ]) 418 431 return arr 419 432 })