Edits history of script submission #13969 for ' Get recently liked tracks (spotify)'

  • bun
    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