import dayjs from '[email protected]';
import isBetween from 'dayjs/plugin/isBetween';
import { Client, Saved, Track } from '[email protected]';
dayjs.extend(isBetween);
type Spotify = {
token: string;
}
const MAX_TRACKS_PER_PAGE = 50;
export async function main(
spotifyCredentials: Spotify,
lookbackLength: number,
lookbackUnits: 'years' | 'months' | 'weeks' | 'days' | 'hours' | 'minutes' | 'seconds' | 'milliseconds' = 'minutes',
fetchIntervalMs: number = 1000,
) {
const client = await Client.create({
token: spotifyCredentials.token,
userAuthorizedToken: true
});
const now = dayjs();
const startTime = now.subtract(lookbackLength, lookbackUnits);
console.log(`Finding ${client.user.displayName}'s liked tracks from the last ${lookbackLength} ${lookbackUnits}`);
let offset = 0;
const results: Saved<Track>[] = [];
while (true) {
const likedTracks = await client.user.getSavedTracks({
limit: MAX_TRACKS_PER_PAGE,
offset: offset
});
offset += likedTracks.length;
console.log(`Searching ${likedTracks.length} liked tracks (${offset} searched total)`);
let foundTracks = 0;
for (const track of likedTracks) {
if (dayjs(track.addedAt).isBetween(startTime, now)) {
console.log(`Found track '${track.item.name}' (liked at ${track.addedAt})`);
results.push(track);
foundTracks += 1;
}
}
console.log(`Found ${foundTracks} recently liked tracks`);
if (foundTracks === 0) {
break;
}
// wait for a specified interval between calls to avoid being rate limited
await new Promise(res => setTimeout(res, fetchIntervalMs));
}
console.log(`Found a total of ${results.length} liked tracks in the last ${lookbackLength} ${lookbackUnits}`);
return results;
}
Submitted by alec minchington932 473 days ago