Skip to content

Commit af7ced5

Browse files
authored
Merge pull request #28 from jeroentvb/fix-content-fetch - fixes #26
Fix content fetch
2 parents ee3414d + bcaf34b commit af7ced5

File tree

5 files changed

+19
-24
lines changed

5 files changed

+19
-24
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/constants/index.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,6 @@ import { SpotifyPlaylist } from '../types';
22

33
export const GET_PLAYLISTS_URL = 'https://api.spotify.com/v1/me/playlists?limit=50';
44

5-
/**
6-
* Get only uri and next fields from paginated track call
7-
*/
8-
export const TRACKS_FROM_PLAYLIST_URL_FILTER = '?fields=items(track(uri)),next';
9-
10-
export const GET_PLAYLIST_TRACKS_URL = (uri: string) => `sp://core-playlist/v1/playlist/${uri}/rows`;
11-
12-
export const GET_LIKED_SONGS_LIST_URL = 'sp://core-collection/unstable/@/list/tracks/all?responseFormat=protobufJson';
13-
145
export const ADD_TRACKS_TO_PLAYLIST_URL = (id: string) => `https://api.spotify.com/v1/playlists/${id}/tracks`;
156

167
export const LS_KEY = 'combined-playlists';

src/types/collection-call-response.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
export interface PlaylistRowsResponse {
2-
rows: {
3-
link: string
4-
}[]
1+
export interface PlaylistContentsResponse {
2+
items: {
3+
uri: string;
4+
isPlayable?: boolean;
5+
}[];
56
}

src/utils/combine-playlists.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { ADD_TRACKS_TO_PLAYLIST_URL, GET_LIKED_SONGS_LIST_URL, GET_PLAYLIST_TRACKS_URL, LIKED_SONGS_PLAYLIST_FACADE } from '../constants';
2-
import { PlaylistInfo, PlaylistRowsResponse, SpotifyCollectionCallResponse } from '../types';
1+
import { ADD_TRACKS_TO_PLAYLIST_URL, LIKED_SONGS_PLAYLIST_FACADE } from '../constants';
2+
import { PlaylistInfo, PlaylistContentsResponse } from '../types';
33
import { splitArrayInChunks } from './';
44

55
// Cache used when fetching playlist tracks to avoid unnecessary API calls
@@ -8,8 +8,8 @@ export const playlistCache = new Map<string, string[]>();
88
export async function combinePlaylists(sourcePlaylists: PlaylistInfo[], targetPlaylist: PlaylistInfo, autoSync = false) {
99
const sourceUris = await Promise.all(sourcePlaylists.map(async (playlist): Promise<string[]> => {
1010
if (playlist.id === LIKED_SONGS_PLAYLIST_FACADE.id) {
11-
return Spicetify.CosmosAsync.get(GET_LIKED_SONGS_LIST_URL)
12-
.then((res: SpotifyCollectionCallResponse) => res.item.map(item => item.trackMetadata.link));
11+
const res: PlaylistContentsResponse = await Spicetify.Platform.LibraryAPI.getTracks({ limit: 99999 });
12+
return extractTrackUris(res.items);
1313
} else {
1414
return getPlaylistTracksWithCache(playlist.uri);
1515
}
@@ -46,9 +46,15 @@ async function getPlaylistTracksWithCache(uri: string) {
4646
if (cachedPlaylistTracks) {
4747
return Promise.resolve(cachedPlaylistTracks);
4848
} else {
49-
const tracks = await Spicetify.CosmosAsync.get(GET_PLAYLIST_TRACKS_URL(uri))
50-
.then((res: PlaylistRowsResponse) => res.rows.map((row) => row.link));
49+
const res: PlaylistContentsResponse = await Spicetify.Platform.PlaylistAPI.getContents(uri);
50+
const tracks = extractTrackUris(res.items);
5151
playlistCache.set(uri, tracks);
5252
return tracks;
5353
}
5454
}
55+
56+
function extractTrackUris(items: PlaylistContentsResponse['items']): string[] {
57+
return items
58+
.filter((item) => item.uri?.startsWith("spotify:track:") && item.isPlayable)
59+
.map((item) => item.uri);
60+
}

0 commit comments

Comments
 (0)