fuzzyworld

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

Branch time-arrows · default branch · all branches

api.js

3.3 KB · history · blame

1const apiExpiry = 3600 * 1000; // 1 hour
2
3function createCallbackState(processedCount, totalCount) {
4 return {
5 processedCount: processedCount,
6 totalCount: totalCount
7 };
8}
9
10async function getAlbums(statusCallback) {
11 const db = await openDb();
12 const cacheKey = 'albums';
13 const cachedAlbums = await getWithExpiry(db, cacheKey);
14 if (cachedAlbums) {
15 if (statusCallback) {
16 statusCallback(createCallbackState(cachedAlbums.length, cachedAlbums.length))
17 }
18 return cachedAlbums;
19 }
20
21 const accessToken = await getAccessToken();
22 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);
32 if (statusCallback) {
33 statusCallback(createCallbackState(albums.length, data.total))
34 }
35 url = data.next;
36 }
37
38 await setWithExpiry(db, cacheKey, albums, apiExpiry);
39 return albums;
40}
41
42async function getTracks(albumId, statusCallback) {
43 const db = await openDb();
44 const cacheKey = `tracks-${albumId}`;
45 const cachedTracks = await getWithExpiry(db, cacheKey);
46 if (cachedTracks) {
47 if (statusCallback) {
48 statusCallback(createCallbackState(cachedTracks.length, cachedTracks.length))
49 }
50 return cachedTracks;
51 }
52
53 const tracks = [];
54 const accessToken = await getAccessToken();
55 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);
64 if (statusCallback) {
65 statusCallback(createCallbackState(tracks.length, data.total))
66 }
67 url = data.next;
68 }
69
70 await setWithExpiry(db, cacheKey, tracks, apiExpiry);
71 return tracks;
72}
73
74async function playTrack(trackId) {
75 let accessToken = await getAccessToken();
76 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}
87
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
96 if (response.status == 204) {
97 return null;
98 }
99
100 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 });
122}