From 85b3a1f5753e625024f9dd107f7d7b56070a20f6 Mon Sep 17 00:00:00 2001 From: James Barnsley Date: Mon, 15 Feb 2021 20:05:58 +1300 Subject: [PATCH] Fetching full track objects, only when Ref is provided --- src/js/services/mopidy/middleware.js | 158 +++++++++++++-------------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/src/js/services/mopidy/middleware.js b/src/js/services/mopidy/middleware.js index 33396011..9f55cdf6 100755 --- a/src/js/services/mopidy/middleware.js +++ b/src/js/services/mopidy/middleware.js @@ -1648,6 +1648,77 @@ const MopidyMiddleware = (function () { uri, }); + const processResults = (results) => { + const tracks = []; + const trackUrisToLoad = []; + const subdirectories = []; + + results.forEach((item) => { + if (item.__model__ === 'Track') { + tracks.push(formatTrack(item)); + } else if (item.type === 'track' && item.__model__ === 'Ref') { + tracks.push(formatTrack({ ...item, loading: true })); + trackUrisToLoad.push(item.uri); + } else { + subdirectories.push(item); + } + }); + + store.dispatch({ + type: 'MOPIDY_DIRECTORY_LOADED', + directory: { + tracks, + subdirectories, + }, + }); + + if (trackUrisToLoad.length) { + request(store, 'library.lookup', { uris: trackUrisToLoad }) + .then((response) => { + const fullTrackObjects = Object.values(response).reduce( + (acc, results) => { + if (results.length) acc.push(results[0]); + return acc; + }, + [], + ); + + store.dispatch({ + type: 'MOPIDY_DIRECTORY_LOADED', + directory: { + tracks: fullTrackObjects, + }, + }); + }); + }; + + if (subdirectories.length) { + request(store, 'library.getImages', { uris: arrayOf('uri', subdirectories) }) + .then((response) => { + const subdirectories_with_images = subdirectories.map((subdir) => { + let images = response[subdir.uri] || undefined; + if (images) { + images = formatImages(digestMopidyImages(store.getState().mopidy, images)); + } + return { + ...subdir, + images, + }; + }); + + store.dispatch({ + type: 'MOPIDY_DIRECTORY_LOADED', + directory: { + subdirectories: subdirectories_with_images, + }, + }); + }); + } + }; + + const getBrowse = () => request(store, 'library.browse', { uri }) + .then((response) => processResults(response)); + if (uri) { request(store, 'library.lookup', { uris: [uri] }) .then((response) => { @@ -1655,87 +1726,16 @@ const MopidyMiddleware = (function () { [uri]: results = [], } = response; - if (!results.length) return; - const result = results[0]; - - store.dispatch({ - type: 'MOPIDY_DIRECTORY_LOADED', - directory: { - name: result.album ? result.album.name : result.name, - }, - }); - }); - } - - request(store, 'library.browse', { uri }) - .then((response) => { - const tracks_uris = []; - const tracks = []; - const subdirectories = []; - - for (const item of response) { - if (item.type === 'track') { - tracks_uris.push(item.uri); + // Not all endpoints give us tracks/subdirectories to library.lookup + if (!results.length) { + getBrowse(); } else { - subdirectories.push(item); + processResults(results); } - } - - if (subdirectories.length > 0) { - request(store, 'library.getImages', { uris: arrayOf('uri', subdirectories) }) - .then((response) => { - - const subdirectories_with_images = subdirectories.map((subdir) => { - let images = response[subdir.uri] || undefined; - if (images) { - images = formatImages(digestMopidyImages(store.getState().mopidy, images)); - } - return { - ...subdir, - images, - }; - }); - - store.dispatch({ - type: 'MOPIDY_DIRECTORY_LOADED', - directory: { - subdirectories: subdirectories_with_images, - }, - }); - }); - } - - if (tracks_uris.length > 0) { - request(store, 'library.lookup', { uris: tracks_uris }) - .then((response) => { - if (response.length <= 0) { - return; - } - - for (const uri in response) { - if (response.hasOwnProperty(uri) && response[uri].length > 0) { - tracks.push(formatTrack(response[uri][0])); - } - } - - store.dispatch({ - type: 'MOPIDY_DIRECTORY_LOADED', - directory: { - tracks, - subdirectories, - }, - }); - }); - } else { - store.dispatch({ - type: 'MOPIDY_DIRECTORY_LOADED', - directory: { - tracks, - subdirectories, - }, - }); - } - }); + }); + } else { + getBrowse(); + } break; case 'MOPIDY_DIRECTORY':