UNPKG

@nasheedstation/soundcloud-downloader

Version:

Download Soundcloud audio with Node.js, this is a forked version, the original script was written by @zackradisic

81 lines (68 loc) 2.43 kB
import { AxiosInstance } from 'axios' import { TrackInfo } from './info' import { appendURL, kindMismatchError, PaginatedQuery } from './util' const baseURL = 'https://api-v2.soundcloud.com/users/' export interface Like { // eslint-disable-next-line camelcase created_at: string, kind: string, track: TrackInfo } export interface GetLikesOptions { profileUrl?: string id?: number limit?: number // -1 indicates no limit offset?: number nextHref?: string } /** @internal */ export const getLikes = async (options: GetLikesOptions, clientID: string, axiosInstance: AxiosInstance): Promise<PaginatedQuery<Like>> => { let u = '' if (!options.nextHref) { if (!options.limit) options.limit = -1 if (!options.offset) options.offset = 0 u = appendURL( `https://api-v2.soundcloud.com/users/${options.id}/likes`, 'client_id', clientID, 'limit', '' + (options.limit === -1 ? 200 : options.limit), 'offset', '' + options.offset) } else { u = appendURL(options.nextHref, 'client_id', clientID) } let response: PaginatedQuery<Like> let nextHref = 'start' // If options.limit > 0, query each page of likes until we have collected // `options.limit` liked tracks. // If options.limit === -1, query every page of likes while (nextHref && (options.limit > 0 || options.limit === -1)) { const { data } = await axiosInstance.get(u) const query = data as PaginatedQuery<Like> if (!query.collection) throw new Error('Invalid JSON response received') if (query.collection.length === 0) return data if (query.collection[0].kind !== 'like') throw kindMismatchError('like', query.collection[0].kind) // Only add tracks (for now) query.collection = query.collection.reduce((prev, curr) => curr.track ? prev.concat(curr) : prev, []) if (!response) { response = query } else { response.collection.push( ...query.collection ) } if (options.limit !== -1) { options.limit -= query.collection.length // We have collected enough likes if (options.limit <= 0) break } nextHref = query.next_href if (nextHref) { if (options.limit !== -1) { const url = new URL(nextHref) url.searchParams.set('limit', '' + options.limit) nextHref = url.toString() } u = appendURL(nextHref, 'client_id', clientID) } } return response }