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.

Improve album-cover downloading queue

+20 -23
+1 -1
src/Applications/UI/Ports.elm
··· 21 21 port copyToClipboard : String -> Cmd msg 22 22 23 23 24 - port loadAlbumCovers : () -> Cmd msg 24 + port loadAlbumCovers : { list : Bool, coverView : Bool } -> Cmd msg 25 25 26 26 27 27 port pause : () -> Cmd msg
+5 -5
src/Applications/UI/Tracks/State.elm
··· 198 198 changeScene scene model = 199 199 (case scene of 200 200 Covers -> 201 - Ports.loadAlbumCovers () 201 + Ports.loadAlbumCovers { list = True, coverView = True } 202 202 203 203 List -> 204 204 Cmd.none ··· 363 363 model.covers 364 364 |> Covers.harvest model.selectedCover model.sortBy model.tracks 365 365 |> (\( c, s ) -> { model | covers = c, selectedCover = s }) 366 - |> Return.communicate (Ports.loadAlbumCovers ()) 366 + |> Return.communicate (Ports.loadAlbumCovers { list = True, coverView = True }) 367 367 368 368 369 369 infiniteListMsg : InfiniteList.Model -> Manager 370 370 infiniteListMsg infiniteList model = 371 371 return 372 372 { model | infiniteList = infiniteList } 373 - (Ports.loadAlbumCovers ()) 373 + (Ports.loadAlbumCovers { list = True, coverView = False }) 374 374 375 375 376 376 insertCoverCache : Json.Value -> Manager ··· 507 507 selectCover cover model = 508 508 return 509 509 { model | selectedCover = Just cover } 510 - (Ports.loadAlbumCovers ()) 510 + (Ports.loadAlbumCovers { list = False, coverView = True }) 511 511 512 512 513 513 setSearchResults : Json.Value -> Manager ··· 647 647 model.covers.harvested 648 648 |> List.find (\cover -> List.member track.id cover.trackIds) 649 649 |> Maybe.unwrap model (\cover -> { model | selectedCover = Just cover }) 650 - |> Return.communicate (Ports.loadAlbumCovers ()) 650 + |> Return.communicate (Ports.loadAlbumCovers { list = True, coverView = True }) 651 651 652 652 List -> 653 653 return
+1 -3
src/Javascript/Brain/artwork.js
··· 11 11 12 12 13 13 export function find(prep) { 14 - prep.variousArtists = prep.variousArtists === "t" 15 - 16 14 return findUsingTags(prep) 17 15 .then(a => a ? a : findUsingMusicBrainz(prep)) 18 16 .then(a => a ? a : findUsingLastFm(prep)) ··· 55 53 const artist = parts[0] 56 54 const album = parts[1] || parts[0] 57 55 58 - const query = `release:"${album}"` + (prep.variousArtists ? `` : ` AND artist:"${artist}"`) 56 + const query = `release:"${album}"` + (prep.variousArtists === "t" ? `` : ` AND artist:"${artist}"`) 59 57 const encodedQuery = encodeURIComponent(query) 60 58 61 59 return fetch(`https://musicbrainz.org/ws/2/release/?query=${encodedQuery}&fmt=json`)
+3 -3
src/Javascript/Brain/index.js
··· 118 118 .then(blob => { 119 119 const url = URL.createObjectURL(blob) 120 120 121 - toCache(`coverCache.${prep.cacheKey}`, blob) 122 - 123 121 self.postMessage({ 124 122 tag: "GOT_CACHED_COVER", 125 123 data: { key: prep.cacheKey, url: url }, 126 124 error: null 127 125 }) 126 + 127 + return toCache(`coverCache.${prep.cacheKey}`, blob) 128 128 }) 129 129 .catch(_ => { 130 130 // Indicate that we've tried to find artwork, 131 131 // so that we don't try to find it each time we launch the app. 132 - toCache(`coverCache.${prep.cacheKey}`, "TRIED") 132 + return toCache(`coverCache.${prep.cacheKey}`, "TRIED") 133 133 }) 134 134 .finally(shiftArtworkQueue) 135 135 })
+10 -11
src/Javascript/index.js
··· 191 191 trackFilename: item.trackPath.split("/").reverse()[0], 192 192 trackPath: item.trackPath, 193 193 trackSourceId: item.sourceId, 194 - variousArtists: false 194 + variousArtists: "f" 195 195 } 196 196 197 197 albumCover(coverPrep.cacheKey).then(maybeCover => { 198 + maybeCover = maybeCover === "TRIED" ? null : maybeCover 198 199 orchestrion.coverPrep = coverPrep 199 200 200 201 audioEngine.insertTrack( ··· 414 415 // Covers 415 416 // ------ 416 417 417 - const loadingCovers = {} 418 - 419 - 420 418 wire.covers = () => { 421 419 app.ports.loadAlbumCovers.subscribe( 422 420 debounce(loadAlbumCoversFromDom, 500) ··· 445 443 } 446 444 447 445 448 - function loadAlbumCoversFromDom() { 449 - const nodes = Array.from( 446 + function loadAlbumCoversFromDom({ coverView, list } = {}) { 447 + let nodes = [] 448 + 449 + if (list) nodes = nodes.concat(Array.from( 450 450 document.querySelectorAll("#diffuse__track-covers [data-key]") 451 - ).concat(Array.from( 451 + )) 452 + 453 + if (coverView) nodes = nodes.concat(Array.from( 452 454 document.querySelectorAll("#diffuse__track-covers + div [data-key]") 453 455 )) 454 456 ··· 468 470 469 471 function loadAlbumCovers(coverPrepList) { 470 472 return coverPrepList.reduce((acc, prep) => { 471 - if (loadingCovers[prep.cacheKey]) return acc 472 - loadingCovers[prep.cacheKey] = true 473 - 474 473 return acc.then(arr => { 475 474 return albumCover(prep.cacheKey).then(a => { 476 475 if (!a) return arr.concat([ prep ]) ··· 510 509 511 510 cachePromise.then(cache => { 512 511 app.ports.insertCoverCache.send(cache) 513 - setTimeout(loadAlbumCoversFromDom, 500) 512 + setTimeout(() => loadAlbumCoversFromDom({ list: true, coverView: true }), 500) 514 513 }) 515 514 } 516 515