fuzzyworld

hawk / time-arrows / files / public / api.js

Branch time-arrows · default branch · all branches

api.js

Blame: the commit that last changed each line · file · history

6e3f55a5 2023-10-13 Pavel Safronov1const apiExpiry = 3600 * 1000; // 1 hour
2
e39bdb17 2023-10-14 Pavel Safronov3function createCallbackState(processedCount, totalCount) {
4 return {
5 processedCount: processedCount,
6 totalCount: totalCount
7 };
8}
9
8c91be32 2023-10-13 Pavel Safronov10async function getAlbums(statusCallback) {
6e3f55a5 2023-10-13 Pavel Safronov11 const db = await openDb();
12 const cacheKey = 'albums';
4d32aa41 2023-10-13 Pavel Safronov13 const cachedAlbums = await getWithExpiry(db, cacheKey);
14 if (cachedAlbums) {
8c91be32 2023-10-13 Pavel Safronov15 if (statusCallback) {
e39bdb17 2023-10-14 Pavel Safronov16 statusCallback(createCallbackState(cachedAlbums.length, cachedAlbums.length))
8c91be32 2023-10-13 Pavel Safronov17 }
4d32aa41 2023-10-13 Pavel Safronov18 return cachedAlbums;
6e3f55a5 2023-10-13 Pavel Safronov19 }
20
cc1af884 2023-10-13 Pavel Safronov21 const accessToken = await getAccessToken();
4d32aa41 2023-10-13 Pavel Safronov22 const albums = [];
23 let url = 'https://api.spotify.com/v1/me/albums?limit=50';
24 while (url) {
25 const response = await fetch(url, {
26 headers: {
27 Authorization: 'Bearer ' + accessToken
28 }
29 });
30 const data = await response.json();
31 albums.push(...data.items);
8c91be32 2023-10-13 Pavel Safronov32 if (statusCallback) {
e39bdb17 2023-10-14 Pavel Safronov33 statusCallback(createCallbackState(albums.length, data.total))
8c91be32 2023-10-13 Pavel Safronov34 }
4d32aa41 2023-10-13 Pavel Safronov35 url = data.next;
36 }
601035fb 2023-10-12 Pavel Safronov37
4d32aa41 2023-10-13 Pavel Safronov38 await setWithExpiry(db, cacheKey, albums, apiExpiry);
39 return albums;
8edcc887 2023-10-13 Pavel Safronov40}
41
8c91be32 2023-10-13 Pavel Safronov42async function getTracks(albumId, statusCallback) {
6e3f55a5 2023-10-13 Pavel Safronov43 const db = await openDb();
44 const cacheKey = `tracks-${albumId}`;
4d32aa41 2023-10-13 Pavel Safronov45 const cachedTracks = await getWithExpiry(db, cacheKey);
46 if (cachedTracks) {
8c91be32 2023-10-13 Pavel Safronov47 if (statusCallback) {
e39bdb17 2023-10-14 Pavel Safronov48 statusCallback(createCallbackState(cachedTracks.length, cachedTracks.length))
8c91be32 2023-10-13 Pavel Safronov49 }
4d32aa41 2023-10-13 Pavel Safronov50 return cachedTracks;
6e3f55a5 2023-10-13 Pavel Safronov51 }
52
4d32aa41 2023-10-13 Pavel Safronov53 const tracks = [];
cc1af884 2023-10-13 Pavel Safronov54 const accessToken = await getAccessToken();
4d32aa41 2023-10-13 Pavel Safronov55 let url = `https://api.spotify.com/v1/albums/${albumId}/tracks?limit=50`;
56 while (url) {
57 const response = await fetch(url, {
58 headers: {
59 Authorization: 'Bearer ' + accessToken
60 }
61 });
62 const data = await response.json();
63 tracks.push(...data.items);
8c91be32 2023-10-13 Pavel Safronov64 if (statusCallback) {
e39bdb17 2023-10-14 Pavel Safronov65 statusCallback(createCallbackState(tracks.length, data.total))
8c91be32 2023-10-13 Pavel Safronov66 }
4d32aa41 2023-10-13 Pavel Safronov67 url = data.next;
68 }
601035fb 2023-10-12 Pavel Safronov69
4d32aa41 2023-10-13 Pavel Safronov70 await setWithExpiry(db, cacheKey, tracks, apiExpiry);
71 return tracks;
8edcc887 2023-10-13 Pavel Safronov72}
73
74async function playTrack(trackId) {
3bf5fcbb 2023-10-13 Pavel Safronov75 let accessToken = await getAccessToken();
8edcc887 2023-10-13 Pavel Safronov76 console.info(`Playing track ${trackId}`);
77 await fetch(`https://api.spotify.com/v1/me/player/play`, {
78 method: 'PUT',
79 headers: {
80 Authorization: 'Bearer ' + accessToken
81 },
82 body: JSON.stringify({
83 uris: [`spotify:track:${trackId}`]
84 })
85 });
86}
cc1af884 2023-10-13 Pavel Safronov87
88async function getPlayingTrack() {
89 const accessToken = await getAccessToken();
90 const response = await fetch("https://api.spotify.com/v1/me/player", {
91 headers: {
92 Authorization: 'Bearer ' + accessToken
93 }
94 });
95
4d32aa41 2023-10-13 Pavel Safronov96 if (response.status == 204) {
97 return null;
98 }
99
cc1af884 2023-10-13 Pavel Safronov100 const data = await response.json();
101 return data;
102}
103
104async function play() {
105 const accessToken = await getAccessToken();
106 await fetch("https://api.spotify.com/v1/me/player/play", {
107 method: "PUT",
108 headers: {
109 Authorization: 'Bearer ' + accessToken
110 }
111 });
112}
113
114async function pause() {
115 const accessToken = await getAccessToken();
116 await fetch("https://api.spotify.com/v1/me/player/pause", {
117 method: "PUT",
118 headers: {
119 Authorization: 'Bearer ' + accessToken
120 }
121 });
8c91be32 2023-10-13 Pavel Safronov122}