From d71fa237a2c54275871b057d7849a829831f13ba Mon Sep 17 00:00:00 2001 From: Eric Lambrecht Date: Sun, 13 Oct 2019 22:07:04 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B=20All=20of=20the=20user's?= =?UTF-8?q?=20playlists=20are=20now=20fetched=20(instead=20of=20only=2020)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #75, fixes #47 --- src/components/init/AppInitializer.vue | 1 + src/utils/Spotify.js | 33 ++++++++++++++++---------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/components/init/AppInitializer.vue b/src/components/init/AppInitializer.vue index 69119709..c7c53ebf 100644 --- a/src/components/init/AppInitializer.vue +++ b/src/components/init/AppInitializer.vue @@ -29,6 +29,7 @@ export default { try { this.status = 'Authenticating...' await this.$store.dispatch('user/requestToken') + this.status = 'Fetching playlists...' await this.$router.replace({ name: 'home' }) } catch (e) { if (e.trigger_login) { diff --git a/src/utils/Spotify.js b/src/utils/Spotify.js index c7c91851..58912bb0 100644 --- a/src/utils/Spotify.js +++ b/src/utils/Spotify.js @@ -71,8 +71,21 @@ export default class Spotify { * @returns {Promise} * @throws */ - static async getUserPlaylists(options = {}) { + static async getUserPlaylists(options = { offset: 0, limit: 50 }) { const apiResult = await api.getUserPlaylists(options) + let numberOfFetchedPlaylists = apiResult.items.length + apiResult.offset + + // Do we have all playlists yet? + while (numberOfFetchedPlaylists < apiResult.total) { + // eslint-disable-next-line no-await-in-loop + const nextSlice = await api.getUserPlaylists({ + offset: numberOfFetchedPlaylists, + limit: 50, + }) + apiResult.items = apiResult.items.concat(nextSlice.items) + numberOfFetchedPlaylists = apiResult.items.length + apiResult.offset + } + return apiResult.items } @@ -85,19 +98,10 @@ export default class Spotify { * @throws */ static async getPlaylistSlice(playlistId, offset = 0, limit = 0) { - const tracks = await api.getPlaylistTracks(playlistId, { + return api.getPlaylistTracks(playlistId, { limit, offset, }) - const numberOfFetchedTracks = tracks.items.length + tracks.offset - if (numberOfFetchedTracks < tracks.total) { - const remainingTracks = await Spotify.getTracks( - numberOfFetchedTracks, - 100 - ) - tracks.items = tracks.items.concat(remainingTracks.items) - } - return tracks } /** @@ -110,15 +114,18 @@ export default class Spotify { const playlist = await api.getPlaylist(playlistId) // Do we have all tracks? - const numberOfFetchedTracks = + let numberOfFetchedTracks = playlist.tracks.items.length + playlist.tracks.offset - if (numberOfFetchedTracks < playlist.tracks.total) { + while (numberOfFetchedTracks < playlist.tracks.total) { + // eslint-disable-next-line no-await-in-loop const nextSlice = await Spotify.getPlaylistSlice( playlistId, numberOfFetchedTracks, 100 ) playlist.tracks.items = playlist.tracks.items.concat(nextSlice.items) + numberOfFetchedTracks = + playlist.tracks.items.length + playlist.tracks.offset } return playlist }