soundcloud-api-ts 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -0
- package/dist/chunk-34DWTDWF.js +52 -0
- package/dist/chunk-34DWTDWF.js.map +1 -0
- package/dist/chunk-GKNBLKPB.mjs +50 -0
- package/dist/chunk-GKNBLKPB.mjs.map +1 -0
- package/dist/index.d.mts +18 -3
- package/dist/index.d.ts +18 -3
- package/dist/index.js +105 -34
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +102 -34
- package/dist/index.mjs.map +1 -1
- package/dist/types/index.d.mts +60 -1
- package/dist/types/index.d.ts +60 -1
- package/dist/types/index.js +8 -0
- package/dist/types/index.mjs +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/http.ts","../src/client/paginate.ts","../src/client/SoundCloudClient.ts","../src/auth/getClientToken.ts","../src/auth/getUserToken.ts","../src/auth/refreshUserToken.ts","../src/auth/signOut.ts","../src/auth/getAuthorizationUrl.ts","../src/auth/pkce.ts","../src/users/getMe.ts","../src/users/getUser.ts","../src/users/getFollowers.ts","../src/users/getFollowings.ts","../src/users/getTracks.ts","../src/users/getPlaylists.ts","../src/users/getLikesTracks.ts","../src/users/getLikesPlaylists.ts","../src/users/getWebProfiles.ts","../src/tracks/getTrack.ts","../src/tracks/getComments.ts","../src/tracks/createComment.ts","../src/tracks/getLikes.ts","../src/tracks/getReposts.ts","../src/tracks/getRelated.ts","../src/tracks/getStreams.ts","../src/tracks/likeTrack.ts","../src/tracks/unlikeTrack.ts","../src/tracks/updateTrack.ts","../src/tracks/deleteTrack.ts","../src/playlists/getPlaylist.ts","../src/playlists/getTracks.ts","../src/playlists/getReposts.ts","../src/playlists/createPlaylist.ts","../src/playlists/updatePlaylist.ts","../src/playlists/deletePlaylist.ts","../src/search/searchTracks.ts","../src/search/searchUsers.ts","../src/search/searchPlaylists.ts","../src/resolve/resolveUrl.ts","../src/me/activities.ts","../src/me/likes.ts","../src/me/followings.ts","../src/me/followers.ts","../src/me/playlists.ts","../src/me/tracks.ts","../src/likes/index.ts","../src/reposts/index.ts","../src/utils/widget.ts"],"names":["SoundCloudClient"],"mappings":"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","file":"index.js","sourcesContent":["const BASE_URL = \"https://api.soundcloud.com\";\n\nexport interface RequestOptions {\n path: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n token?: string;\n body?: Record<string, unknown> | FormData | URLSearchParams;\n contentType?: string;\n}\n\nexport interface AutoRefreshContext {\n getToken: () => string | undefined;\n onTokenRefresh?: () => Promise<{ access_token: string; refresh_token?: string }>;\n setToken: (accessToken: string, refreshToken?: string) => void;\n}\n\n/**\n * Make a request to the SoundCloud API using native fetch.\n * Returns parsed JSON, or for 302 redirects returns the Location header.\n */\nexport async function scFetch<T>(\n options: RequestOptions,\n refreshCtx?: AutoRefreshContext,\n): Promise<T> {\n const execute = async (tokenOverride?: string): Promise<T> => {\n const url = `${BASE_URL}${options.path}`;\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n };\n\n const token = tokenOverride ?? options.token;\n if (token) {\n headers[\"Authorization\"] = `OAuth ${token}`;\n }\n\n let fetchBody: string | FormData | URLSearchParams | undefined;\n if (options.body) {\n if (options.body instanceof URLSearchParams) {\n fetchBody = options.body;\n headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n } else if (options.body instanceof FormData) {\n fetchBody = options.body;\n // Don't set Content-Type for FormData — browser/node sets boundary automatically\n } else {\n headers[\"Content-Type\"] = options.contentType ?? \"application/json\";\n fetchBody = JSON.stringify(options.body);\n }\n } else if (options.contentType) {\n headers[\"Content-Type\"] = options.contentType;\n }\n\n const response = await fetch(url, {\n method: options.method,\n headers,\n body: fetchBody,\n redirect: \"manual\",\n });\n\n if (response.status === 302) {\n const location = response.headers.get(\"location\");\n if (location) {\n return location as T;\n }\n }\n\n // 200-204 with no content\n if (response.status === 204 || response.headers.get(\"content-length\") === \"0\") {\n return undefined as T;\n }\n\n if (!response.ok) {\n throw new Error(\n `SoundCloud API error: ${response.status} ${response.statusText}`\n );\n }\n\n return response.json() as Promise<T>;\n };\n\n try {\n return await execute();\n } catch (err) {\n // Auto-refresh on 401\n if (\n refreshCtx?.onTokenRefresh &&\n err instanceof Error &&\n err.message.includes(\"401\")\n ) {\n const newToken = await refreshCtx.onTokenRefresh();\n refreshCtx.setToken(newToken.access_token, newToken.refresh_token);\n return execute(newToken.access_token);\n }\n throw err;\n }\n}\n\n/**\n * Fetch an absolute URL (e.g. next_href from paginated responses).\n * Adds OAuth token if provided.\n */\nexport async function scFetchUrl<T>(url: string, token?: string): Promise<T> {\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (token) headers[\"Authorization\"] = `OAuth ${token}`;\n\n const response = await fetch(url, { method: \"GET\", headers, redirect: \"manual\" });\n\n if (response.status === 302) {\n const location = response.headers.get(\"location\");\n if (location) return location as T;\n }\n\n if (response.status === 204 || response.headers.get(\"content-length\") === \"0\") {\n return undefined as T;\n }\n\n if (!response.ok) {\n throw new Error(`SoundCloud API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<T>;\n}\n","import type { SoundCloudPaginatedResponse } from \"../types/api.js\";\nimport { scFetchUrl } from \"./http.js\";\n\n/**\n * Async generator that follows `next_href` automatically, yielding each page's `collection`.\n */\nexport async function* paginate<T>(\n firstPage: () => Promise<SoundCloudPaginatedResponse<T>>,\n fetchNext: (url: string) => Promise<SoundCloudPaginatedResponse<T>>,\n): AsyncGenerator<T[], void, undefined> {\n let page = await firstPage();\n yield page.collection;\n\n while (page.next_href) {\n page = await fetchNext(page.next_href);\n yield page.collection;\n }\n}\n\n/**\n * Async generator that yields individual items across all pages.\n */\nexport async function* paginateItems<T>(\n firstPage: () => Promise<SoundCloudPaginatedResponse<T>>,\n fetchNext: (url: string) => Promise<SoundCloudPaginatedResponse<T>>,\n): AsyncGenerator<T, void, undefined> {\n for await (const page of paginate(firstPage, fetchNext)) {\n for (const item of page) {\n yield item;\n }\n }\n}\n\n/**\n * Collects all pages into a single flat array with an optional max items limit.\n */\nexport async function fetchAll<T>(\n firstPage: () => Promise<SoundCloudPaginatedResponse<T>>,\n fetchNext: (url: string) => Promise<SoundCloudPaginatedResponse<T>>,\n options?: { maxItems?: number },\n): Promise<T[]> {\n const result: T[] = [];\n const max = options?.maxItems ?? Infinity;\n\n for await (const page of paginate(firstPage, fetchNext)) {\n for (const item of page) {\n result.push(item);\n if (result.length >= max) return result;\n }\n }\n\n return result;\n}\n","import { scFetch, scFetchUrl, type AutoRefreshContext } from \"./http.js\";\nimport { paginate, paginateItems, fetchAll } from \"./paginate.js\";\nimport type {\n SoundCloudToken,\n SoundCloudUser,\n SoundCloudMe,\n SoundCloudTrack,\n SoundCloudPlaylist,\n SoundCloudComment,\n SoundCloudStreams,\n SoundCloudWebProfile,\n SoundCloudActivitiesResponse,\n SoundCloudPaginatedResponse,\n} from \"../types/api.js\";\nimport type { UpdateTrackParams } from \"../tracks/updateTrack.js\";\nimport type { CreatePlaylistParams } from \"../playlists/createPlaylist.js\";\nimport type { UpdatePlaylistParams } from \"../playlists/updatePlaylist.js\";\n\nexport interface SoundCloudClientConfig {\n clientId: string;\n clientSecret: string;\n redirectUri?: string;\n /** Called automatically when a request returns 401. Return new tokens to retry. */\n onTokenRefresh?: (client: SoundCloudClient) => Promise<SoundCloudToken>;\n}\n\n/** Optional token override, passed as the last parameter to client methods. */\nexport interface TokenOption {\n token?: string;\n}\n\n/** Resolve a token: use explicit override, fall back to stored, or throw. */\ntype TokenGetter = () => string | undefined;\n\nfunction resolveToken(tokenGetter: TokenGetter, explicit?: string): string {\n const t = explicit ?? tokenGetter();\n if (!t) throw new Error(\"No access token available. Call client.setToken() or pass a token explicitly.\");\n return t;\n}\n\nexport class SoundCloudClient {\n private config: SoundCloudClientConfig;\n private _accessToken?: string;\n private _refreshToken?: string;\n\n public auth: SoundCloudClient.Auth;\n public me: SoundCloudClient.Me;\n public users: SoundCloudClient.Users;\n public tracks: SoundCloudClient.Tracks;\n public playlists: SoundCloudClient.Playlists;\n public search: SoundCloudClient.Search;\n public resolve: SoundCloudClient.Resolve;\n public likes: SoundCloudClient.Likes;\n public reposts: SoundCloudClient.Reposts;\n\n constructor(config: SoundCloudClientConfig) {\n this.config = config;\n const getToken: TokenGetter = () => this._accessToken;\n const refreshCtx: AutoRefreshContext | undefined = config.onTokenRefresh\n ? {\n getToken,\n onTokenRefresh: async () => {\n const result = await config.onTokenRefresh!(this);\n return result;\n },\n setToken: (a, r) => this.setToken(a, r),\n }\n : undefined;\n\n this.auth = new SoundCloudClient.Auth(this.config);\n this.me = new SoundCloudClient.Me(getToken, refreshCtx);\n this.users = new SoundCloudClient.Users(getToken, refreshCtx);\n this.tracks = new SoundCloudClient.Tracks(getToken, refreshCtx);\n this.playlists = new SoundCloudClient.Playlists(getToken, refreshCtx);\n this.search = new SoundCloudClient.Search(getToken, refreshCtx);\n this.resolve = new SoundCloudClient.Resolve(getToken, refreshCtx);\n this.likes = new SoundCloudClient.Likes(getToken, refreshCtx);\n this.reposts = new SoundCloudClient.Reposts(getToken, refreshCtx);\n }\n\n /** Store an access token (and optionally refresh token) on this client instance. */\n setToken(accessToken: string, refreshToken?: string): void {\n this._accessToken = accessToken;\n if (refreshToken !== undefined) this._refreshToken = refreshToken;\n }\n\n /** Clear stored tokens. */\n clearToken(): void {\n this._accessToken = undefined;\n this._refreshToken = undefined;\n }\n\n /** Get the currently stored access token, if any. */\n get accessToken(): string | undefined {\n return this._accessToken;\n }\n\n /** Get the currently stored refresh token, if any. */\n get refreshToken(): string | undefined {\n return this._refreshToken;\n }\n\n /**\n * Async generator that follows `next_href` automatically, yielding each page's `collection`.\n *\n * ```ts\n * for await (const page of sc.paginate(() => sc.search.tracks(\"lofi\"))) {\n * console.log(page); // SoundCloudTrack[]\n * }\n * ```\n */\n paginate<T>(firstPage: () => Promise<SoundCloudPaginatedResponse<T>>): AsyncGenerator<T[], void, undefined> {\n const token = this._accessToken;\n return paginate(firstPage, (url) => scFetchUrl<SoundCloudPaginatedResponse<T>>(url, token));\n }\n\n /**\n * Async generator that yields individual items across all pages.\n *\n * ```ts\n * for await (const track of sc.paginateItems(() => sc.search.tracks(\"lofi\"))) {\n * console.log(track); // single SoundCloudTrack\n * }\n * ```\n */\n paginateItems<T>(firstPage: () => Promise<SoundCloudPaginatedResponse<T>>): AsyncGenerator<T, void, undefined> {\n const token = this._accessToken;\n return paginateItems(firstPage, (url) => scFetchUrl<SoundCloudPaginatedResponse<T>>(url, token));\n }\n\n /**\n * Collects all pages into a single flat array.\n *\n * ```ts\n * const allTracks = await sc.fetchAll(() => sc.search.tracks(\"lofi\"), { maxItems: 100 });\n * ```\n */\n fetchAll<T>(firstPage: () => Promise<SoundCloudPaginatedResponse<T>>, options?: { maxItems?: number }): Promise<T[]> {\n const token = this._accessToken;\n return fetchAll(firstPage, (url) => scFetchUrl<SoundCloudPaginatedResponse<T>>(url, token), options);\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace SoundCloudClient {\n export class Auth {\n constructor(private config: SoundCloudClientConfig) {}\n\n /** Build the authorization URL to redirect users to SoundCloud's login. */\n getAuthorizationUrl(options?: { state?: string; codeChallenge?: string }): string {\n if (!this.config.redirectUri) throw new Error(\"redirectUri is required for getAuthorizationUrl\");\n const params = new URLSearchParams({\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n response_type: \"code\",\n });\n if (options?.state) params.set(\"state\", options.state);\n if (options?.codeChallenge) {\n params.set(\"code_challenge\", options.codeChallenge);\n params.set(\"code_challenge_method\", \"S256\");\n }\n return `https://api.soundcloud.com/connect?${params}`;\n }\n\n /** POST /oauth2/token — client_credentials grant */\n async getClientToken(): Promise<SoundCloudToken> {\n return scFetch<SoundCloudToken>({\n path: \"/oauth2/token\",\n method: \"POST\",\n body: new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n }),\n });\n }\n\n /** POST /oauth2/token — authorization_code grant */\n async getUserToken(code: string, codeVerifier?: string): Promise<SoundCloudToken> {\n const params: Record<string, string> = {\n grant_type: \"authorization_code\",\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n redirect_uri: this.config.redirectUri!,\n code,\n };\n if (codeVerifier) params.code_verifier = codeVerifier;\n return scFetch<SoundCloudToken>({\n path: \"/oauth2/token\",\n method: \"POST\",\n body: new URLSearchParams(params),\n });\n }\n\n /** POST /oauth2/token — refresh_token grant */\n async refreshUserToken(refreshToken: string): Promise<SoundCloudToken> {\n return scFetch<SoundCloudToken>({\n path: \"/oauth2/token\",\n method: \"POST\",\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n redirect_uri: this.config.redirectUri!,\n refresh_token: refreshToken,\n }),\n });\n }\n\n /**\n * POST /sign-out — invalidates session.\n *\n * **Note:** This hits `https://secure.soundcloud.com`, NOT the regular\n * `api.soundcloud.com` host used by all other endpoints.\n */\n async signOut(accessToken: string): Promise<void> {\n const res = await fetch(\"https://secure.soundcloud.com/sign-out\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ access_token: accessToken }),\n });\n if (!res.ok) throw new Error(`Sign-out failed: ${res.status}`);\n }\n }\n\n export class Me {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** GET /me */\n async getMe(options?: TokenOption): Promise<SoundCloudMe> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudMe>({ path: \"/me\", method: \"GET\", token: t });\n }\n\n /** GET /me/activities */\n async getActivities(limit?: number, options?: TokenOption): Promise<SoundCloudActivitiesResponse> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/activities?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/activities/all/own */\n async getActivitiesOwn(limit?: number, options?: TokenOption): Promise<SoundCloudActivitiesResponse> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/activities/all/own?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/activities/tracks */\n async getActivitiesTracks(limit?: number, options?: TokenOption): Promise<SoundCloudActivitiesResponse> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/activities/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/likes/tracks */\n async getLikesTracks(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/likes/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/likes/playlists */\n async getLikesPlaylists(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/likes/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/followings */\n async getFollowings(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/followings?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/followings/tracks */\n async getFollowingsTracks(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/followings/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** PUT /me/followings/:user_urn — follow a user */\n async follow(userUrn: string | number, options?: TokenOption): Promise<void> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<void>({ path: `/me/followings/${userUrn}`, method: \"PUT\", token: t });\n }\n\n /** DELETE /me/followings/:user_urn — unfollow a user */\n async unfollow(userUrn: string | number, options?: TokenOption): Promise<void> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<void>({ path: `/me/followings/${userUrn}`, method: \"DELETE\", token: t });\n }\n\n /** GET /me/followers */\n async getFollowers(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/followers?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/playlists */\n async getPlaylists(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/tracks */\n async getTracks(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n }\n\n export class Users {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** GET /users/:id */\n async getUser(userId: string | number, options?: TokenOption): Promise<SoundCloudUser> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudUser>({ path: `/users/${userId}`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/followers */\n async getFollowers(userId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users/${userId}/followers?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/followings */\n async getFollowings(userId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users/${userId}/followings?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/tracks */\n async getTracks(userId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users/${userId}/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/playlists */\n async getPlaylists(userId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users/${userId}/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true&show_tracks=false`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/likes/tracks */\n async getLikesTracks(userId: string | number, limit?: number, cursor?: string, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users/${userId}/likes/tracks?${limit ? `limit=${limit}&` : \"\"}${cursor ? `cursor=${cursor}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/likes/playlists */\n async getLikesPlaylists(userId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users/${userId}/likes/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/web-profiles */\n async getWebProfiles(userId: string | number, options?: TokenOption): Promise<SoundCloudWebProfile[]> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudWebProfile[]>({ path: `/users/${userId}/web-profiles`, method: \"GET\", token: t });\n }\n }\n\n export class Tracks {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** GET /tracks/:id */\n async getTrack(trackId: string | number, options?: TokenOption): Promise<SoundCloudTrack> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudTrack>({ path: `/tracks/${trackId}`, method: \"GET\", token: t });\n }\n\n /** GET /tracks/:id/streams */\n async getStreams(trackId: string | number, options?: TokenOption): Promise<SoundCloudStreams> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudStreams>({ path: `/tracks/${trackId}/streams`, method: \"GET\", token: t });\n }\n\n /** GET /tracks/:id/comments */\n async getComments(trackId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudComment>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/tracks/${trackId}/comments?threaded=1&filter_replies=0${limit ? `&limit=${limit}` : \"\"}&linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** POST /tracks/:id/comments */\n async createComment(trackId: string | number, body: string, timestamp?: number, options?: TokenOption): Promise<SoundCloudComment> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudComment>({\n path: `/tracks/${trackId}/comments`,\n method: \"POST\",\n token: t,\n body: { comment: { body, ...(timestamp !== undefined ? { timestamp } : {}) } },\n });\n }\n\n /** GET /tracks/:id/favoriters */\n async getLikes(trackId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/tracks/${trackId}/favoriters?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /tracks/:id/reposters */\n async getReposts(trackId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/tracks/${trackId}/reposters?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /tracks/:id/related */\n async getRelated(trackId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudTrack[]> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudTrack[]>({ path: `/tracks/${trackId}/related${limit ? `?limit=${limit}` : \"\"}`, method: \"GET\", token: t });\n }\n\n /** PUT /tracks/:id — update track metadata */\n async update(trackId: string | number, params: UpdateTrackParams, options?: TokenOption): Promise<SoundCloudTrack> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudTrack>({ path: `/tracks/${trackId}`, method: \"PUT\", token: t, body: { track: params } });\n }\n\n /** DELETE /tracks/:id */\n async delete(trackId: string | number, options?: TokenOption): Promise<void> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<void>({ path: `/tracks/${trackId}`, method: \"DELETE\", token: t });\n }\n }\n\n export class Playlists {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** GET /playlists/:id */\n async getPlaylist(playlistId: string | number, options?: TokenOption): Promise<SoundCloudPlaylist> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudPlaylist>({ path: `/playlists/${playlistId}`, method: \"GET\", token: t });\n }\n\n /** GET /playlists/:id/tracks */\n async getTracks(playlistId: string | number, limit?: number, offset?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/playlists/${playlistId}/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true${offset ? `&offset=${offset}` : \"\"}`, method: \"GET\", token: t });\n }\n\n /** GET /playlists/:id/reposters */\n async getReposts(playlistId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/playlists/${playlistId}/reposters?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** POST /playlists — create a playlist */\n async create(params: CreatePlaylistParams, options?: TokenOption): Promise<SoundCloudPlaylist> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudPlaylist>({ path: \"/playlists\", method: \"POST\", token: t, body: { playlist: params } });\n }\n\n /** PUT /playlists/:id — update a playlist */\n async update(playlistId: string | number, params: UpdatePlaylistParams, options?: TokenOption): Promise<SoundCloudPlaylist> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudPlaylist>({ path: `/playlists/${playlistId}`, method: \"PUT\", token: t, body: { playlist: params } });\n }\n\n /** DELETE /playlists/:id */\n async delete(playlistId: string | number, options?: TokenOption): Promise<void> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<void>({ path: `/playlists/${playlistId}`, method: \"DELETE\", token: t });\n }\n }\n\n export class Search {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** GET /tracks?q= */\n async tracks(query: string, pageNumber?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/tracks?q=${encodeURIComponent(query)}&linked_partitioning=true&limit=10${pageNumber && pageNumber > 0 ? `&offset=${10 * pageNumber}` : \"\"}`, method: \"GET\", token: t });\n }\n\n /** GET /users?q= */\n async users(query: string, pageNumber?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users?q=${encodeURIComponent(query)}&linked_partitioning=true&limit=10${pageNumber && pageNumber > 0 ? `&offset=${10 * pageNumber}` : \"\"}`, method: \"GET\", token: t });\n }\n\n /** GET /playlists?q= */\n async playlists(query: string, pageNumber?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/playlists?q=${encodeURIComponent(query)}&linked_partitioning=true&limit=10${pageNumber && pageNumber > 0 ? `&offset=${10 * pageNumber}` : \"\"}`, method: \"GET\", token: t });\n }\n }\n\n export class Resolve {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** GET /resolve?url= */\n async resolveUrl(url: string, options?: TokenOption): Promise<string> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<string>({ path: `/resolve?url=${encodeURIComponent(url)}`, method: \"GET\", token: t });\n }\n }\n\n export class Likes {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** POST /likes/tracks/:id */\n async likeTrack(trackId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/likes/tracks/${trackId}`, method: \"POST\", token: t }); return true; } catch { return false; }\n }\n\n /** DELETE /likes/tracks/:id */\n async unlikeTrack(trackId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/likes/tracks/${trackId}`, method: \"DELETE\", token: t }); return true; } catch { return false; }\n }\n\n /** POST /likes/playlists/:id */\n async likePlaylist(playlistId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/likes/playlists/${playlistId}`, method: \"POST\", token: t }); return true; } catch { return false; }\n }\n\n /** DELETE /likes/playlists/:id */\n async unlikePlaylist(playlistId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/likes/playlists/${playlistId}`, method: \"DELETE\", token: t }); return true; } catch { return false; }\n }\n }\n\n export class Reposts {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** POST /reposts/tracks/:id */\n async repostTrack(trackId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/reposts/tracks/${trackId}`, method: \"POST\", token: t }); return true; } catch { return false; }\n }\n\n /** DELETE /reposts/tracks/:id */\n async unrepostTrack(trackId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/reposts/tracks/${trackId}`, method: \"DELETE\", token: t }); return true; } catch { return false; }\n }\n\n /** POST /reposts/playlists/:id */\n async repostPlaylist(playlistId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/reposts/playlists/${playlistId}`, method: \"POST\", token: t }); return true; } catch { return false; }\n }\n\n /** DELETE /reposts/playlists/:id */\n async unrepostPlaylist(playlistId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/reposts/playlists/${playlistId}`, method: \"DELETE\", token: t }); return true; } catch { return false; }\n }\n }\n}\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudToken } from \"../types/api.js\";\n\nexport const getClientToken = (clientId: string, clientSecret: string): Promise<SoundCloudToken> => {\n return scFetch<SoundCloudToken>({\n path: \"/oauth2/token\",\n method: \"POST\",\n body: new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: clientId,\n client_secret: clientSecret,\n }),\n });\n};\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudToken } from \"../types/api.js\";\n\nexport const getUserToken = (\n clientId: string,\n clientSecret: string,\n redirectUri: string,\n code: string,\n codeVerifier?: string,\n): Promise<SoundCloudToken> => {\n const params: Record<string, string> = {\n grant_type: \"authorization_code\",\n client_id: clientId,\n client_secret: clientSecret,\n redirect_uri: redirectUri,\n code,\n };\n if (codeVerifier) params.code_verifier = codeVerifier;\n return scFetch<SoundCloudToken>({\n path: \"/oauth2/token\",\n method: \"POST\",\n body: new URLSearchParams(params),\n });\n};\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudToken } from \"../types/api.js\";\n\nexport const refreshUserToken = (\n clientId: string,\n clientSecret: string,\n redirectUri: string,\n refreshToken: string,\n): Promise<SoundCloudToken> => {\n return scFetch<SoundCloudToken>({\n path: \"/oauth2/token\",\n method: \"POST\",\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: clientId,\n client_secret: clientSecret,\n redirect_uri: redirectUri,\n refresh_token: refreshToken,\n }),\n });\n};\n","/**\n * POST /sign-out — invalidates session associated with current token.\n *\n * **Note:** This hits `https://secure.soundcloud.com`, NOT the regular\n * `api.soundcloud.com` host used by all other endpoints.\n */\nexport const signOut = async (accessToken: string): Promise<void> => {\n const res = await fetch(\"https://secure.soundcloud.com/sign-out\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ access_token: accessToken }),\n });\n if (!res.ok) throw new Error(`Sign-out failed: ${res.status}`);\n};\n","/**\n * Build the SoundCloud authorization URL for the OAuth 2.0 code flow.\n *\n * Redirect the user to this URL so they can grant access to your application.\n */\nexport function getAuthorizationUrl(\n clientId: string,\n redirectUri: string,\n options?: { state?: string; codeChallenge?: string },\n): string {\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: \"code\",\n });\n if (options?.state) params.set(\"state\", options.state);\n if (options?.codeChallenge) {\n params.set(\"code_challenge\", options.codeChallenge);\n params.set(\"code_challenge_method\", \"S256\");\n }\n return `https://api.soundcloud.com/connect?${params}`;\n}\n","/**\n * Generate a random PKCE code verifier (43 chars, base64url).\n * Works in Node 18+ and modern browsers via globalThis.crypto.\n */\nexport function generateCodeVerifier(): string {\n const bytes = new Uint8Array(32);\n globalThis.crypto.getRandomValues(bytes);\n return base64url(bytes);\n}\n\n/**\n * Derive the S256 code challenge from a code verifier.\n * Uses the Web Crypto API (SubtleCrypto) available in Node 18+ and browsers.\n */\nexport async function generateCodeChallenge(verifier: string): Promise<string> {\n const data = new TextEncoder().encode(verifier);\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", data);\n return base64url(new Uint8Array(digest));\n}\n\nfunction base64url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const b of bytes) binary += String.fromCharCode(b);\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudMe } from \"../types/api.js\";\n\nexport const getMe = (token: string): Promise<SoundCloudMe> =>\n scFetch<SoundCloudMe>({ path: \"/me\", method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser } from \"../types/api.js\";\n\nexport const getUser = (token: string, userId: string | number): Promise<SoundCloudUser> =>\n scFetch<SoundCloudUser>({ path: `/users/${userId}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getFollowers = (token: string, userId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/users/${userId}/followers?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getFollowings = (token: string, userId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/users/${userId}/followings?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getUserTracks = (token: string, userId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/users/${userId}/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getUserPlaylists = (token: string, userId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> =>\n scFetch({ path: `/users/${userId}/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true&show_tracks=false`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getUserLikesTracks = (token: string, userId: string | number, limit?: number, cursor?: string): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/users/${userId}/likes/tracks?${limit ? `limit=${limit}&` : \"\"}${cursor ? `cursor=${cursor}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getUserLikesPlaylists = (token: string, userId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> =>\n scFetch({ path: `/users/${userId}/likes/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudWebProfile } from \"../types/api.js\";\n\n/** GET /users/:id/web-profiles — returns user's external links */\nexport const getUserWebProfiles = (token: string, userId: string | number): Promise<SoundCloudWebProfile[]> =>\n scFetch<SoundCloudWebProfile[]>({ path: `/users/${userId}/web-profiles`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack } from \"../types/api.js\";\n\nexport const getTrack = (token: string, trackId: string | number): Promise<SoundCloudTrack> =>\n scFetch<SoundCloudTrack>({ path: `/tracks/${trackId}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudComment, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getTrackComments = (token: string, trackId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudComment>> =>\n scFetch({ path: `/tracks/${trackId}/comments?threaded=1&filter_replies=0${limit ? `&limit=${limit}` : \"\"}&linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudComment } from \"../types/api.js\";\n\n/** POST /tracks/:id/comments — creates a comment on a track */\nexport const createTrackComment = (\n token: string,\n trackId: string | number,\n body: string,\n timestamp?: number,\n): Promise<SoundCloudComment> =>\n scFetch<SoundCloudComment>({\n path: `/tracks/${trackId}/comments`,\n method: \"POST\",\n token,\n body: { comment: { body, ...(timestamp !== undefined ? { timestamp } : {}) } },\n });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getTrackLikes = (token: string, trackId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/tracks/${trackId}/favoriters?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getTrackReposts = (token: string, trackId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/tracks/${trackId}/reposters?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack } from \"../types/api.js\";\n\nexport const getRelatedTracks = (token: string, trackId: string | number, limit?: number): Promise<SoundCloudTrack[]> =>\n scFetch<SoundCloudTrack[]>({ path: `/tracks/${trackId}/related${limit ? `?limit=${limit}` : \"\"}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudStreams } from \"../types/api.js\";\n\n/** GET /tracks/:id/streams — returns streamable URLs */\nexport const getTrackStreams = (token: string, trackId: string | number): Promise<SoundCloudStreams> =>\n scFetch<SoundCloudStreams>({ path: `/tracks/${trackId}/streams`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\n\nexport const likeTrack = async (token: string, trackId: string | number): Promise<boolean> => {\n try {\n await scFetch<unknown>({ path: `/likes/tracks/${trackId}`, method: \"POST\", token });\n return true;\n } catch {\n return false;\n }\n};\n","import { scFetch } from \"../client/http.js\";\n\n/** DELETE /likes/tracks/:id — unlikes a track */\nexport const unlikeTrack = async (token: string, trackId: string | number): Promise<boolean> => {\n try {\n await scFetch<unknown>({ path: `/likes/tracks/${trackId}`, method: \"DELETE\", token });\n return true;\n } catch {\n return false;\n }\n};\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack } from \"../types/api.js\";\n\nexport interface UpdateTrackParams {\n title?: string;\n description?: string;\n genre?: string;\n tag_list?: string;\n sharing?: \"public\" | \"private\";\n downloadable?: boolean;\n purchase_url?: string;\n purchase_title?: string;\n release?: string;\n release_day?: number;\n release_month?: number;\n release_year?: number;\n label_name?: string;\n license?: string;\n isrc?: string;\n bpm?: number;\n key_signature?: string;\n}\n\n/** PUT /tracks/:id — updates a track's metadata */\nexport const updateTrack = (\n token: string,\n trackId: string | number,\n params: UpdateTrackParams,\n): Promise<SoundCloudTrack> =>\n scFetch<SoundCloudTrack>({\n path: `/tracks/${trackId}`,\n method: \"PUT\",\n token,\n body: { track: params },\n });\n","import { scFetch } from \"../client/http.js\";\n\n/** DELETE /tracks/:id — deletes a track */\nexport const deleteTrack = (token: string, trackId: string | number): Promise<void> =>\n scFetch<void>({ path: `/tracks/${trackId}`, method: \"DELETE\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist } from \"../types/api.js\";\n\nexport const getPlaylist = (token: string, playlistId: string | number): Promise<SoundCloudPlaylist> =>\n scFetch<SoundCloudPlaylist>({ path: `/playlists/${playlistId}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getPlaylistTracks = (token: string, playlistId: string | number, limit?: number, offset?: number): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/playlists/${playlistId}/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true${offset ? `&offset=${offset}` : \"\"}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getPlaylistReposts = (token: string, playlistId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/playlists/${playlistId}/reposters?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist } from \"../types/api.js\";\n\nexport interface CreatePlaylistParams {\n title: string;\n description?: string;\n sharing?: \"public\" | \"private\";\n tracks?: { urn: string }[];\n ean?: string;\n genre?: string;\n label_name?: string;\n license?: string;\n permalink?: string;\n purchase_title?: string;\n purchase_url?: string;\n release?: string;\n release_date?: string;\n set_type?: \"album\" | \"playlist\";\n tag_list?: string;\n}\n\n/** POST /playlists — creates a playlist */\nexport const createPlaylist = (\n token: string,\n params: CreatePlaylistParams,\n): Promise<SoundCloudPlaylist> =>\n scFetch<SoundCloudPlaylist>({\n path: \"/playlists\",\n method: \"POST\",\n token,\n body: { playlist: params },\n });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist } from \"../types/api.js\";\n\nexport interface UpdatePlaylistParams {\n title?: string;\n description?: string;\n sharing?: \"public\" | \"private\";\n tracks?: { urn: string }[];\n ean?: string;\n genre?: string;\n label_name?: string;\n license?: string;\n permalink?: string;\n purchase_title?: string;\n purchase_url?: string;\n release?: string;\n release_date?: string;\n set_type?: \"album\" | \"playlist\";\n tag_list?: string;\n}\n\n/** PUT /playlists/:id — updates a playlist */\nexport const updatePlaylist = (\n token: string,\n playlistId: string | number,\n params: UpdatePlaylistParams,\n): Promise<SoundCloudPlaylist> =>\n scFetch<SoundCloudPlaylist>({\n path: `/playlists/${playlistId}`,\n method: \"PUT\",\n token,\n body: { playlist: params },\n });\n","import { scFetch } from \"../client/http.js\";\n\n/** DELETE /playlists/:id — deletes a playlist */\nexport const deletePlaylist = (token: string, playlistId: string | number): Promise<void> =>\n scFetch<void>({ path: `/playlists/${playlistId}`, method: \"DELETE\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const searchTracks = (token: string, query: string, pageNumber?: number): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/tracks?q=${encodeURIComponent(query)}&linked_partitioning=true&limit=10${pageNumber && pageNumber > 0 ? `&offset=${10 * pageNumber}` : \"\"}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const searchUsers = (token: string, query: string, pageNumber?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/users?q=${encodeURIComponent(query)}&linked_partitioning=true&limit=10${pageNumber && pageNumber > 0 ? `&offset=${10 * pageNumber}` : \"\"}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const searchPlaylists = (token: string, query: string, pageNumber?: number): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> =>\n scFetch({ path: `/playlists?q=${encodeURIComponent(query)}&linked_partitioning=true&limit=10${pageNumber && pageNumber > 0 ? `&offset=${10 * pageNumber}` : \"\"}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\n\nexport const resolveUrl = (token: string, url: string): Promise<string> =>\n scFetch<string>({ path: `/resolve?url=${encodeURIComponent(url)}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudActivitiesResponse } from \"../types/api.js\";\n\n/** GET /me/activities */\nexport const getMeActivities = (token: string, limit?: number): Promise<SoundCloudActivitiesResponse> =>\n scFetch({ path: `/me/activities?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n\n/** GET /me/activities/all/own */\nexport const getMeActivitiesOwn = (token: string, limit?: number): Promise<SoundCloudActivitiesResponse> =>\n scFetch({ path: `/me/activities/all/own?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n\n/** GET /me/activities/tracks */\nexport const getMeActivitiesTracks = (token: string, limit?: number): Promise<SoundCloudActivitiesResponse> =>\n scFetch({ path: `/me/activities/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack, SoundCloudPlaylist, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\n/** GET /me/likes/tracks */\nexport const getMeLikesTracks = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/me/likes/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n\n/** GET /me/likes/playlists */\nexport const getMeLikesPlaylists = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> =>\n scFetch({ path: `/me/likes/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudTrack, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\n/** GET /me/followings */\nexport const getMeFollowings = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/me/followings?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n\n/** GET /me/followings/tracks */\nexport const getMeFollowingsTracks = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/me/followings/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n\n/** PUT /me/followings/:user_urn — follow a user */\nexport const followUser = (token: string, userUrn: string | number): Promise<void> =>\n scFetch<void>({ path: `/me/followings/${userUrn}`, method: \"PUT\", token });\n\n/** DELETE /me/followings/:user_urn — unfollow a user */\nexport const unfollowUser = (token: string, userUrn: string | number): Promise<void> =>\n scFetch<void>({ path: `/me/followings/${userUrn}`, method: \"DELETE\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\n/** GET /me/followers */\nexport const getMeFollowers = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/me/followers?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\n/** GET /me/playlists */\nexport const getMePlaylists = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> =>\n scFetch({ path: `/me/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\n/** GET /me/tracks */\nexport const getMeTracks = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/me/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\n\n/** POST /likes/tracks/:id */\nexport const likeTrack = async (token: string, trackId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/likes/tracks/${trackId}`, method: \"POST\", token }); return true; } catch { return false; }\n};\n\n/** DELETE /likes/tracks/:id */\nexport const unlikeTrack = async (token: string, trackId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/likes/tracks/${trackId}`, method: \"DELETE\", token }); return true; } catch { return false; }\n};\n\n/** POST /likes/playlists/:id */\nexport const likePlaylist = async (token: string, playlistId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/likes/playlists/${playlistId}`, method: \"POST\", token }); return true; } catch { return false; }\n};\n\n/** DELETE /likes/playlists/:id */\nexport const unlikePlaylist = async (token: string, playlistId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/likes/playlists/${playlistId}`, method: \"DELETE\", token }); return true; } catch { return false; }\n};\n","import { scFetch } from \"../client/http.js\";\n\n/** POST /reposts/tracks/:id */\nexport const repostTrack = async (token: string, trackId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/reposts/tracks/${trackId}`, method: \"POST\", token }); return true; } catch { return false; }\n};\n\n/** DELETE /reposts/tracks/:id */\nexport const unrepostTrack = async (token: string, trackId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/reposts/tracks/${trackId}`, method: \"DELETE\", token }); return true; } catch { return false; }\n};\n\n/** POST /reposts/playlists/:id */\nexport const repostPlaylist = async (token: string, playlistId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/reposts/playlists/${playlistId}`, method: \"POST\", token }); return true; } catch { return false; }\n};\n\n/** DELETE /reposts/playlists/:id */\nexport const unrepostPlaylist = async (token: string, playlistId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/reposts/playlists/${playlistId}`, method: \"DELETE\", token }); return true; } catch { return false; }\n};\n","/**\n * Returns an encoded SoundCloud widget embed URL for a given track ID.\n */\nexport const getSoundCloudWidgetUrl = (trackId: string | number): string =>\n `https%3A//api.soundcloud.com/tracks/${trackId}&show_teaser=false&color=%2300a99d&inverse=false&show_user=false&sharing=false&buying=false&liking=false&show_artwork=false&show_name=false`;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/http.ts","../src/client/paginate.ts","../src/client/SoundCloudClient.ts","../src/auth/getClientToken.ts","../src/auth/getUserToken.ts","../src/auth/refreshUserToken.ts","../src/auth/signOut.ts","../src/auth/getAuthorizationUrl.ts","../src/auth/pkce.ts","../src/users/getMe.ts","../src/users/getUser.ts","../src/users/getFollowers.ts","../src/users/getFollowings.ts","../src/users/getTracks.ts","../src/users/getPlaylists.ts","../src/users/getLikesTracks.ts","../src/users/getLikesPlaylists.ts","../src/users/getWebProfiles.ts","../src/tracks/getTrack.ts","../src/tracks/getComments.ts","../src/tracks/createComment.ts","../src/tracks/getLikes.ts","../src/tracks/getReposts.ts","../src/tracks/getRelated.ts","../src/tracks/getStreams.ts","../src/tracks/likeTrack.ts","../src/tracks/unlikeTrack.ts","../src/tracks/updateTrack.ts","../src/tracks/deleteTrack.ts","../src/playlists/getPlaylist.ts","../src/playlists/getTracks.ts","../src/playlists/getReposts.ts","../src/playlists/createPlaylist.ts","../src/playlists/updatePlaylist.ts","../src/playlists/deletePlaylist.ts","../src/search/searchTracks.ts","../src/search/searchUsers.ts","../src/search/searchPlaylists.ts","../src/resolve/resolveUrl.ts","../src/me/activities.ts","../src/me/likes.ts","../src/me/followings.ts","../src/me/followers.ts","../src/me/playlists.ts","../src/me/tracks.ts","../src/likes/index.ts","../src/reposts/index.ts","../src/utils/widget.ts"],"names":["body","SoundCloudError","SoundCloudClient"],"mappings":"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","file":"index.js","sourcesContent":["import { SoundCloudError } from \"../errors.js\";\n\nconst BASE_URL = \"https://api.soundcloud.com\";\n\nexport interface RequestOptions {\n path: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n token?: string;\n body?: Record<string, unknown> | FormData | URLSearchParams;\n contentType?: string;\n}\n\nexport interface RetryConfig {\n /** Max retries on 429/5xx (default: 3) */\n maxRetries: number;\n /** Base delay in ms for exponential backoff (default: 1000) */\n retryBaseDelay: number;\n /** Optional debug logger */\n onDebug?: (message: string) => void;\n}\n\nexport interface AutoRefreshContext {\n getToken: () => string | undefined;\n onTokenRefresh?: () => Promise<{ access_token: string; refresh_token?: string }>;\n setToken: (accessToken: string, refreshToken?: string) => void;\n retry?: RetryConfig;\n}\n\nconst DEFAULT_RETRY: RetryConfig = { maxRetries: 3, retryBaseDelay: 1000 };\n\n/** Delay helper that can be mocked/awaited */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isRetryable(status: number): boolean {\n return status === 429 || (status >= 500 && status <= 599);\n}\n\nfunction getRetryDelay(\n response: { status: number; headers: { get(key: string): string | null } },\n attempt: number,\n config: RetryConfig,\n): number {\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"retry-after\");\n if (retryAfter) {\n const seconds = Number(retryAfter);\n if (!Number.isNaN(seconds)) return seconds * 1000;\n }\n }\n // Exponential backoff with jitter\n const base = config.retryBaseDelay * Math.pow(2, attempt);\n return base + Math.random() * base * 0.1;\n}\n\nasync function parseErrorBody(response: { json(): Promise<unknown> }): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return undefined;\n }\n}\n\n/**\n * Make a request to the SoundCloud API using native fetch.\n * Returns parsed JSON, or for 302 redirects returns the Location header.\n */\nexport async function scFetch<T>(\n options: RequestOptions,\n refreshCtx?: AutoRefreshContext,\n): Promise<T> {\n const retryConfig = refreshCtx?.retry ?? DEFAULT_RETRY;\n\n const execute = async (tokenOverride?: string): Promise<T> => {\n const url = `${BASE_URL}${options.path}`;\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n };\n\n const token = tokenOverride ?? options.token;\n if (token) {\n headers[\"Authorization\"] = `OAuth ${token}`;\n }\n\n let fetchBody: string | FormData | URLSearchParams | undefined;\n if (options.body) {\n if (options.body instanceof URLSearchParams) {\n fetchBody = options.body;\n headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n } else if (options.body instanceof FormData) {\n fetchBody = options.body;\n } else {\n headers[\"Content-Type\"] = options.contentType ?? \"application/json\";\n fetchBody = JSON.stringify(options.body);\n }\n } else if (options.contentType) {\n headers[\"Content-Type\"] = options.contentType;\n }\n\n let lastResponse: Awaited<ReturnType<typeof fetch>> | undefined;\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n const response = await fetch(url, {\n method: options.method,\n headers,\n body: fetchBody,\n redirect: \"manual\",\n });\n\n if (response.status === 302) {\n const location = response.headers.get(\"location\");\n if (location) return location as T;\n }\n\n if (response.status === 204 || response.headers.get(\"content-length\") === \"0\") {\n return undefined as T;\n }\n\n if (response.ok) {\n return response.json() as Promise<T>;\n }\n\n // Don't retry 401 (handled by token refresh) or non-retryable 4xx\n if (!isRetryable(response.status)) {\n const body = await parseErrorBody(response);\n throw new SoundCloudError(response.status, response.statusText, body as any);\n }\n\n lastResponse = response;\n\n if (attempt < retryConfig.maxRetries) {\n const delayMs = getRetryDelay(response, attempt, retryConfig);\n retryConfig.onDebug?.(\n `Retry ${attempt + 1}/${retryConfig.maxRetries} after ${Math.round(delayMs)}ms (status ${response.status})`,\n );\n await delay(delayMs);\n }\n }\n\n // All retries exhausted\n const body = await parseErrorBody(lastResponse!);\n throw new SoundCloudError(lastResponse!.status, lastResponse!.statusText, body as any);\n };\n\n try {\n return await execute();\n } catch (err) {\n // Auto-refresh on 401\n if (\n refreshCtx?.onTokenRefresh &&\n err instanceof SoundCloudError &&\n err.status === 401\n ) {\n const newToken = await refreshCtx.onTokenRefresh();\n refreshCtx.setToken(newToken.access_token, newToken.refresh_token);\n return execute(newToken.access_token);\n }\n throw err;\n }\n}\n\n/**\n * Fetch an absolute URL (e.g. next_href from paginated responses).\n * Adds OAuth token if provided.\n */\nexport async function scFetchUrl<T>(\n url: string,\n token?: string,\n retryConfig?: RetryConfig,\n): Promise<T> {\n const config = retryConfig ?? DEFAULT_RETRY;\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (token) headers[\"Authorization\"] = `OAuth ${token}`;\n\n let lastResponse: Awaited<ReturnType<typeof fetch>> | undefined;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n const response = await fetch(url, { method: \"GET\", headers, redirect: \"manual\" });\n\n if (response.status === 302) {\n const location = response.headers.get(\"location\");\n if (location) return location as T;\n }\n\n if (response.status === 204 || response.headers.get(\"content-length\") === \"0\") {\n return undefined as T;\n }\n\n if (response.ok) {\n return response.json() as Promise<T>;\n }\n\n if (!isRetryable(response.status)) {\n const body = await parseErrorBody(response);\n throw new SoundCloudError(response.status, response.statusText, body as any);\n }\n\n lastResponse = response;\n\n if (attempt < config.maxRetries) {\n const delayMs = getRetryDelay(response, attempt, config);\n config.onDebug?.(\n `Retry ${attempt + 1}/${config.maxRetries} after ${Math.round(delayMs)}ms (status ${response.status})`,\n );\n await delay(delayMs);\n }\n }\n\n const body = await parseErrorBody(lastResponse!);\n throw new SoundCloudError(lastResponse!.status, lastResponse!.statusText, body as any);\n}\n","import type { SoundCloudPaginatedResponse } from \"../types/api.js\";\nimport { scFetchUrl } from \"./http.js\";\n\n/**\n * Async generator that follows `next_href` automatically, yielding each page's `collection`.\n */\nexport async function* paginate<T>(\n firstPage: () => Promise<SoundCloudPaginatedResponse<T>>,\n fetchNext: (url: string) => Promise<SoundCloudPaginatedResponse<T>>,\n): AsyncGenerator<T[], void, undefined> {\n let page = await firstPage();\n yield page.collection;\n\n while (page.next_href) {\n page = await fetchNext(page.next_href);\n yield page.collection;\n }\n}\n\n/**\n * Async generator that yields individual items across all pages.\n */\nexport async function* paginateItems<T>(\n firstPage: () => Promise<SoundCloudPaginatedResponse<T>>,\n fetchNext: (url: string) => Promise<SoundCloudPaginatedResponse<T>>,\n): AsyncGenerator<T, void, undefined> {\n for await (const page of paginate(firstPage, fetchNext)) {\n for (const item of page) {\n yield item;\n }\n }\n}\n\n/**\n * Collects all pages into a single flat array with an optional max items limit.\n */\nexport async function fetchAll<T>(\n firstPage: () => Promise<SoundCloudPaginatedResponse<T>>,\n fetchNext: (url: string) => Promise<SoundCloudPaginatedResponse<T>>,\n options?: { maxItems?: number },\n): Promise<T[]> {\n const result: T[] = [];\n const max = options?.maxItems ?? Infinity;\n\n for await (const page of paginate(firstPage, fetchNext)) {\n for (const item of page) {\n result.push(item);\n if (result.length >= max) return result;\n }\n }\n\n return result;\n}\n","import { scFetch, scFetchUrl, type AutoRefreshContext, type RetryConfig } from \"./http.js\";\nimport { paginate, paginateItems, fetchAll } from \"./paginate.js\";\nimport type {\n SoundCloudToken,\n SoundCloudUser,\n SoundCloudMe,\n SoundCloudTrack,\n SoundCloudPlaylist,\n SoundCloudComment,\n SoundCloudStreams,\n SoundCloudWebProfile,\n SoundCloudActivitiesResponse,\n SoundCloudPaginatedResponse,\n} from \"../types/api.js\";\nimport type { UpdateTrackParams } from \"../tracks/updateTrack.js\";\nimport type { CreatePlaylistParams } from \"../playlists/createPlaylist.js\";\nimport type { UpdatePlaylistParams } from \"../playlists/updatePlaylist.js\";\n\nexport interface SoundCloudClientConfig {\n clientId: string;\n clientSecret: string;\n redirectUri?: string;\n /** Called automatically when a request returns 401. Return new tokens to retry. */\n onTokenRefresh?: (client: SoundCloudClient) => Promise<SoundCloudToken>;\n /** Max retries on 429/5xx (default: 3) */\n maxRetries?: number;\n /** Base delay in ms for exponential backoff (default: 1000) */\n retryBaseDelay?: number;\n /** Optional debug logger for retry attempts, etc. */\n onDebug?: (message: string) => void;\n}\n\n/** Optional token override, passed as the last parameter to client methods. */\nexport interface TokenOption {\n token?: string;\n}\n\n/** Resolve a token: use explicit override, fall back to stored, or throw. */\ntype TokenGetter = () => string | undefined;\n\nfunction resolveToken(tokenGetter: TokenGetter, explicit?: string): string {\n const t = explicit ?? tokenGetter();\n if (!t) throw new Error(\"No access token available. Call client.setToken() or pass a token explicitly.\");\n return t;\n}\n\nexport class SoundCloudClient {\n private config: SoundCloudClientConfig;\n private _accessToken?: string;\n private _refreshToken?: string;\n\n public auth: SoundCloudClient.Auth;\n public me: SoundCloudClient.Me;\n public users: SoundCloudClient.Users;\n public tracks: SoundCloudClient.Tracks;\n public playlists: SoundCloudClient.Playlists;\n public search: SoundCloudClient.Search;\n public resolve: SoundCloudClient.Resolve;\n public likes: SoundCloudClient.Likes;\n public reposts: SoundCloudClient.Reposts;\n\n constructor(config: SoundCloudClientConfig) {\n this.config = config;\n const getToken: TokenGetter = () => this._accessToken;\n const retryConfig: RetryConfig = {\n maxRetries: config.maxRetries ?? 3,\n retryBaseDelay: config.retryBaseDelay ?? 1000,\n onDebug: config.onDebug,\n };\n const refreshCtx: AutoRefreshContext = config.onTokenRefresh\n ? {\n getToken,\n onTokenRefresh: async () => {\n const result = await config.onTokenRefresh!(this);\n return result;\n },\n setToken: (a, r) => this.setToken(a, r),\n retry: retryConfig,\n }\n : {\n getToken,\n setToken: (a, r) => this.setToken(a, r),\n retry: retryConfig,\n };\n\n this.auth = new SoundCloudClient.Auth(this.config);\n this.me = new SoundCloudClient.Me(getToken, refreshCtx!);\n this.users = new SoundCloudClient.Users(getToken, refreshCtx!);\n this.tracks = new SoundCloudClient.Tracks(getToken, refreshCtx!);\n this.playlists = new SoundCloudClient.Playlists(getToken, refreshCtx!);\n this.search = new SoundCloudClient.Search(getToken, refreshCtx!);\n this.resolve = new SoundCloudClient.Resolve(getToken, refreshCtx!);\n this.likes = new SoundCloudClient.Likes(getToken, refreshCtx!);\n this.reposts = new SoundCloudClient.Reposts(getToken, refreshCtx!);\n }\n\n /** Store an access token (and optionally refresh token) on this client instance. */\n setToken(accessToken: string, refreshToken?: string): void {\n this._accessToken = accessToken;\n if (refreshToken !== undefined) this._refreshToken = refreshToken;\n }\n\n /** Clear stored tokens. */\n clearToken(): void {\n this._accessToken = undefined;\n this._refreshToken = undefined;\n }\n\n /** Get the currently stored access token, if any. */\n get accessToken(): string | undefined {\n return this._accessToken;\n }\n\n /** Get the currently stored refresh token, if any. */\n get refreshToken(): string | undefined {\n return this._refreshToken;\n }\n\n /**\n * Async generator that follows `next_href` automatically, yielding each page's `collection`.\n *\n * ```ts\n * for await (const page of sc.paginate(() => sc.search.tracks(\"lofi\"))) {\n * console.log(page); // SoundCloudTrack[]\n * }\n * ```\n */\n paginate<T>(firstPage: () => Promise<SoundCloudPaginatedResponse<T>>): AsyncGenerator<T[], void, undefined> {\n const token = this._accessToken;\n return paginate(firstPage, (url) => scFetchUrl<SoundCloudPaginatedResponse<T>>(url, token));\n }\n\n /**\n * Async generator that yields individual items across all pages.\n *\n * ```ts\n * for await (const track of sc.paginateItems(() => sc.search.tracks(\"lofi\"))) {\n * console.log(track); // single SoundCloudTrack\n * }\n * ```\n */\n paginateItems<T>(firstPage: () => Promise<SoundCloudPaginatedResponse<T>>): AsyncGenerator<T, void, undefined> {\n const token = this._accessToken;\n return paginateItems(firstPage, (url) => scFetchUrl<SoundCloudPaginatedResponse<T>>(url, token));\n }\n\n /**\n * Collects all pages into a single flat array.\n *\n * ```ts\n * const allTracks = await sc.fetchAll(() => sc.search.tracks(\"lofi\"), { maxItems: 100 });\n * ```\n */\n fetchAll<T>(firstPage: () => Promise<SoundCloudPaginatedResponse<T>>, options?: { maxItems?: number }): Promise<T[]> {\n const token = this._accessToken;\n return fetchAll(firstPage, (url) => scFetchUrl<SoundCloudPaginatedResponse<T>>(url, token), options);\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace SoundCloudClient {\n export class Auth {\n constructor(private config: SoundCloudClientConfig) {}\n\n /** Build the authorization URL to redirect users to SoundCloud's login. */\n getAuthorizationUrl(options?: { state?: string; codeChallenge?: string }): string {\n if (!this.config.redirectUri) throw new Error(\"redirectUri is required for getAuthorizationUrl\");\n const params = new URLSearchParams({\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n response_type: \"code\",\n });\n if (options?.state) params.set(\"state\", options.state);\n if (options?.codeChallenge) {\n params.set(\"code_challenge\", options.codeChallenge);\n params.set(\"code_challenge_method\", \"S256\");\n }\n return `https://api.soundcloud.com/connect?${params}`;\n }\n\n /** POST /oauth2/token — client_credentials grant */\n async getClientToken(): Promise<SoundCloudToken> {\n return scFetch<SoundCloudToken>({\n path: \"/oauth2/token\",\n method: \"POST\",\n body: new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n }),\n });\n }\n\n /** POST /oauth2/token — authorization_code grant */\n async getUserToken(code: string, codeVerifier?: string): Promise<SoundCloudToken> {\n const params: Record<string, string> = {\n grant_type: \"authorization_code\",\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n redirect_uri: this.config.redirectUri!,\n code,\n };\n if (codeVerifier) params.code_verifier = codeVerifier;\n return scFetch<SoundCloudToken>({\n path: \"/oauth2/token\",\n method: \"POST\",\n body: new URLSearchParams(params),\n });\n }\n\n /** POST /oauth2/token — refresh_token grant */\n async refreshUserToken(refreshToken: string): Promise<SoundCloudToken> {\n return scFetch<SoundCloudToken>({\n path: \"/oauth2/token\",\n method: \"POST\",\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n redirect_uri: this.config.redirectUri!,\n refresh_token: refreshToken,\n }),\n });\n }\n\n /**\n * POST /sign-out — invalidates session.\n *\n * **Note:** This hits `https://secure.soundcloud.com`, NOT the regular\n * `api.soundcloud.com` host used by all other endpoints.\n */\n async signOut(accessToken: string): Promise<void> {\n const res = await fetch(\"https://secure.soundcloud.com/sign-out\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ access_token: accessToken }),\n });\n if (!res.ok) throw new Error(`Sign-out failed: ${res.status}`);\n }\n }\n\n export class Me {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** GET /me */\n async getMe(options?: TokenOption): Promise<SoundCloudMe> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudMe>({ path: \"/me\", method: \"GET\", token: t });\n }\n\n /** GET /me/activities */\n async getActivities(limit?: number, options?: TokenOption): Promise<SoundCloudActivitiesResponse> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/activities?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/activities/all/own */\n async getActivitiesOwn(limit?: number, options?: TokenOption): Promise<SoundCloudActivitiesResponse> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/activities/all/own?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/activities/tracks */\n async getActivitiesTracks(limit?: number, options?: TokenOption): Promise<SoundCloudActivitiesResponse> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/activities/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/likes/tracks */\n async getLikesTracks(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/likes/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/likes/playlists */\n async getLikesPlaylists(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/likes/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/followings */\n async getFollowings(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/followings?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/followings/tracks */\n async getFollowingsTracks(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/followings/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** PUT /me/followings/:user_urn — follow a user */\n async follow(userUrn: string | number, options?: TokenOption): Promise<void> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<void>({ path: `/me/followings/${userUrn}`, method: \"PUT\", token: t });\n }\n\n /** DELETE /me/followings/:user_urn — unfollow a user */\n async unfollow(userUrn: string | number, options?: TokenOption): Promise<void> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<void>({ path: `/me/followings/${userUrn}`, method: \"DELETE\", token: t });\n }\n\n /** GET /me/followers */\n async getFollowers(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/followers?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/playlists */\n async getPlaylists(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /me/tracks */\n async getTracks(limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/me/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n }\n\n export class Users {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** GET /users/:id */\n async getUser(userId: string | number, options?: TokenOption): Promise<SoundCloudUser> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudUser>({ path: `/users/${userId}`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/followers */\n async getFollowers(userId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users/${userId}/followers?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/followings */\n async getFollowings(userId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users/${userId}/followings?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/tracks */\n async getTracks(userId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users/${userId}/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/playlists */\n async getPlaylists(userId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users/${userId}/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true&show_tracks=false`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/likes/tracks */\n async getLikesTracks(userId: string | number, limit?: number, cursor?: string, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users/${userId}/likes/tracks?${limit ? `limit=${limit}&` : \"\"}${cursor ? `cursor=${cursor}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/likes/playlists */\n async getLikesPlaylists(userId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users/${userId}/likes/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /users/:id/web-profiles */\n async getWebProfiles(userId: string | number, options?: TokenOption): Promise<SoundCloudWebProfile[]> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudWebProfile[]>({ path: `/users/${userId}/web-profiles`, method: \"GET\", token: t });\n }\n }\n\n export class Tracks {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** GET /tracks/:id */\n async getTrack(trackId: string | number, options?: TokenOption): Promise<SoundCloudTrack> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudTrack>({ path: `/tracks/${trackId}`, method: \"GET\", token: t });\n }\n\n /** GET /tracks/:id/streams */\n async getStreams(trackId: string | number, options?: TokenOption): Promise<SoundCloudStreams> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudStreams>({ path: `/tracks/${trackId}/streams`, method: \"GET\", token: t });\n }\n\n /** GET /tracks/:id/comments */\n async getComments(trackId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudComment>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/tracks/${trackId}/comments?threaded=1&filter_replies=0${limit ? `&limit=${limit}` : \"\"}&linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** POST /tracks/:id/comments */\n async createComment(trackId: string | number, body: string, timestamp?: number, options?: TokenOption): Promise<SoundCloudComment> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudComment>({\n path: `/tracks/${trackId}/comments`,\n method: \"POST\",\n token: t,\n body: { comment: { body, ...(timestamp !== undefined ? { timestamp } : {}) } },\n });\n }\n\n /** GET /tracks/:id/favoriters */\n async getLikes(trackId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/tracks/${trackId}/favoriters?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /tracks/:id/reposters */\n async getReposts(trackId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/tracks/${trackId}/reposters?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** GET /tracks/:id/related */\n async getRelated(trackId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudTrack[]> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudTrack[]>({ path: `/tracks/${trackId}/related${limit ? `?limit=${limit}` : \"\"}`, method: \"GET\", token: t });\n }\n\n /** PUT /tracks/:id — update track metadata */\n async update(trackId: string | number, params: UpdateTrackParams, options?: TokenOption): Promise<SoundCloudTrack> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudTrack>({ path: `/tracks/${trackId}`, method: \"PUT\", token: t, body: { track: params } });\n }\n\n /** DELETE /tracks/:id */\n async delete(trackId: string | number, options?: TokenOption): Promise<void> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<void>({ path: `/tracks/${trackId}`, method: \"DELETE\", token: t });\n }\n }\n\n export class Playlists {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** GET /playlists/:id */\n async getPlaylist(playlistId: string | number, options?: TokenOption): Promise<SoundCloudPlaylist> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudPlaylist>({ path: `/playlists/${playlistId}`, method: \"GET\", token: t });\n }\n\n /** GET /playlists/:id/tracks */\n async getTracks(playlistId: string | number, limit?: number, offset?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/playlists/${playlistId}/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true${offset ? `&offset=${offset}` : \"\"}`, method: \"GET\", token: t });\n }\n\n /** GET /playlists/:id/reposters */\n async getReposts(playlistId: string | number, limit?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/playlists/${playlistId}/reposters?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token: t });\n }\n\n /** POST /playlists — create a playlist */\n async create(params: CreatePlaylistParams, options?: TokenOption): Promise<SoundCloudPlaylist> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudPlaylist>({ path: \"/playlists\", method: \"POST\", token: t, body: { playlist: params } });\n }\n\n /** PUT /playlists/:id — update a playlist */\n async update(playlistId: string | number, params: UpdatePlaylistParams, options?: TokenOption): Promise<SoundCloudPlaylist> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<SoundCloudPlaylist>({ path: `/playlists/${playlistId}`, method: \"PUT\", token: t, body: { playlist: params } });\n }\n\n /** DELETE /playlists/:id */\n async delete(playlistId: string | number, options?: TokenOption): Promise<void> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<void>({ path: `/playlists/${playlistId}`, method: \"DELETE\", token: t });\n }\n }\n\n export class Search {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** GET /tracks?q= */\n async tracks(query: string, pageNumber?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/tracks?q=${encodeURIComponent(query)}&linked_partitioning=true&limit=10${pageNumber && pageNumber > 0 ? `&offset=${10 * pageNumber}` : \"\"}`, method: \"GET\", token: t });\n }\n\n /** GET /users?q= */\n async users(query: string, pageNumber?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/users?q=${encodeURIComponent(query)}&linked_partitioning=true&limit=10${pageNumber && pageNumber > 0 ? `&offset=${10 * pageNumber}` : \"\"}`, method: \"GET\", token: t });\n }\n\n /** GET /playlists?q= */\n async playlists(query: string, pageNumber?: number, options?: TokenOption): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch({ path: `/playlists?q=${encodeURIComponent(query)}&linked_partitioning=true&limit=10${pageNumber && pageNumber > 0 ? `&offset=${10 * pageNumber}` : \"\"}`, method: \"GET\", token: t });\n }\n }\n\n export class Resolve {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** GET /resolve?url= */\n async resolveUrl(url: string, options?: TokenOption): Promise<string> {\n const t = resolveToken(this.getToken, options?.token);\n return this.fetch<string>({ path: `/resolve?url=${encodeURIComponent(url)}`, method: \"GET\", token: t });\n }\n }\n\n export class Likes {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** POST /likes/tracks/:id */\n async likeTrack(trackId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/likes/tracks/${trackId}`, method: \"POST\", token: t }); return true; } catch { return false; }\n }\n\n /** DELETE /likes/tracks/:id */\n async unlikeTrack(trackId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/likes/tracks/${trackId}`, method: \"DELETE\", token: t }); return true; } catch { return false; }\n }\n\n /** POST /likes/playlists/:id */\n async likePlaylist(playlistId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/likes/playlists/${playlistId}`, method: \"POST\", token: t }); return true; } catch { return false; }\n }\n\n /** DELETE /likes/playlists/:id */\n async unlikePlaylist(playlistId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/likes/playlists/${playlistId}`, method: \"DELETE\", token: t }); return true; } catch { return false; }\n }\n }\n\n export class Reposts {\n constructor(private getToken: TokenGetter, private refreshCtx?: AutoRefreshContext) {}\n private fetch<T>(opts: Parameters<typeof scFetch>[0]) { return scFetch<T>(opts, this.refreshCtx); }\n\n /** POST /reposts/tracks/:id */\n async repostTrack(trackId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/reposts/tracks/${trackId}`, method: \"POST\", token: t }); return true; } catch { return false; }\n }\n\n /** DELETE /reposts/tracks/:id */\n async unrepostTrack(trackId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/reposts/tracks/${trackId}`, method: \"DELETE\", token: t }); return true; } catch { return false; }\n }\n\n /** POST /reposts/playlists/:id */\n async repostPlaylist(playlistId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/reposts/playlists/${playlistId}`, method: \"POST\", token: t }); return true; } catch { return false; }\n }\n\n /** DELETE /reposts/playlists/:id */\n async unrepostPlaylist(playlistId: string | number, options?: TokenOption): Promise<boolean> {\n const t = resolveToken(this.getToken, options?.token);\n try { await this.fetch<unknown>({ path: `/reposts/playlists/${playlistId}`, method: \"DELETE\", token: t }); return true; } catch { return false; }\n }\n }\n}\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudToken } from \"../types/api.js\";\n\nexport const getClientToken = (clientId: string, clientSecret: string): Promise<SoundCloudToken> => {\n return scFetch<SoundCloudToken>({\n path: \"/oauth2/token\",\n method: \"POST\",\n body: new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: clientId,\n client_secret: clientSecret,\n }),\n });\n};\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudToken } from \"../types/api.js\";\n\nexport const getUserToken = (\n clientId: string,\n clientSecret: string,\n redirectUri: string,\n code: string,\n codeVerifier?: string,\n): Promise<SoundCloudToken> => {\n const params: Record<string, string> = {\n grant_type: \"authorization_code\",\n client_id: clientId,\n client_secret: clientSecret,\n redirect_uri: redirectUri,\n code,\n };\n if (codeVerifier) params.code_verifier = codeVerifier;\n return scFetch<SoundCloudToken>({\n path: \"/oauth2/token\",\n method: \"POST\",\n body: new URLSearchParams(params),\n });\n};\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudToken } from \"../types/api.js\";\n\nexport const refreshUserToken = (\n clientId: string,\n clientSecret: string,\n redirectUri: string,\n refreshToken: string,\n): Promise<SoundCloudToken> => {\n return scFetch<SoundCloudToken>({\n path: \"/oauth2/token\",\n method: \"POST\",\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: clientId,\n client_secret: clientSecret,\n redirect_uri: redirectUri,\n refresh_token: refreshToken,\n }),\n });\n};\n","/**\n * POST /sign-out — invalidates session associated with current token.\n *\n * **Note:** This hits `https://secure.soundcloud.com`, NOT the regular\n * `api.soundcloud.com` host used by all other endpoints.\n */\nexport const signOut = async (accessToken: string): Promise<void> => {\n const res = await fetch(\"https://secure.soundcloud.com/sign-out\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ access_token: accessToken }),\n });\n if (!res.ok) throw new Error(`Sign-out failed: ${res.status}`);\n};\n","/**\n * Build the SoundCloud authorization URL for the OAuth 2.0 code flow.\n *\n * Redirect the user to this URL so they can grant access to your application.\n */\nexport function getAuthorizationUrl(\n clientId: string,\n redirectUri: string,\n options?: { state?: string; codeChallenge?: string },\n): string {\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: \"code\",\n });\n if (options?.state) params.set(\"state\", options.state);\n if (options?.codeChallenge) {\n params.set(\"code_challenge\", options.codeChallenge);\n params.set(\"code_challenge_method\", \"S256\");\n }\n return `https://api.soundcloud.com/connect?${params}`;\n}\n","/**\n * Generate a random PKCE code verifier (43 chars, base64url).\n * Works in Node 18+ and modern browsers via globalThis.crypto.\n */\nexport function generateCodeVerifier(): string {\n const bytes = new Uint8Array(32);\n globalThis.crypto.getRandomValues(bytes);\n return base64url(bytes);\n}\n\n/**\n * Derive the S256 code challenge from a code verifier.\n * Uses the Web Crypto API (SubtleCrypto) available in Node 18+ and browsers.\n */\nexport async function generateCodeChallenge(verifier: string): Promise<string> {\n const data = new TextEncoder().encode(verifier);\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", data);\n return base64url(new Uint8Array(digest));\n}\n\nfunction base64url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const b of bytes) binary += String.fromCharCode(b);\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudMe } from \"../types/api.js\";\n\nexport const getMe = (token: string): Promise<SoundCloudMe> =>\n scFetch<SoundCloudMe>({ path: \"/me\", method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser } from \"../types/api.js\";\n\nexport const getUser = (token: string, userId: string | number): Promise<SoundCloudUser> =>\n scFetch<SoundCloudUser>({ path: `/users/${userId}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getFollowers = (token: string, userId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/users/${userId}/followers?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getFollowings = (token: string, userId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/users/${userId}/followings?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getUserTracks = (token: string, userId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/users/${userId}/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getUserPlaylists = (token: string, userId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> =>\n scFetch({ path: `/users/${userId}/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true&show_tracks=false`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getUserLikesTracks = (token: string, userId: string | number, limit?: number, cursor?: string): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/users/${userId}/likes/tracks?${limit ? `limit=${limit}&` : \"\"}${cursor ? `cursor=${cursor}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getUserLikesPlaylists = (token: string, userId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> =>\n scFetch({ path: `/users/${userId}/likes/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudWebProfile } from \"../types/api.js\";\n\n/** GET /users/:id/web-profiles — returns user's external links */\nexport const getUserWebProfiles = (token: string, userId: string | number): Promise<SoundCloudWebProfile[]> =>\n scFetch<SoundCloudWebProfile[]>({ path: `/users/${userId}/web-profiles`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack } from \"../types/api.js\";\n\nexport const getTrack = (token: string, trackId: string | number): Promise<SoundCloudTrack> =>\n scFetch<SoundCloudTrack>({ path: `/tracks/${trackId}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudComment, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getTrackComments = (token: string, trackId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudComment>> =>\n scFetch({ path: `/tracks/${trackId}/comments?threaded=1&filter_replies=0${limit ? `&limit=${limit}` : \"\"}&linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudComment } from \"../types/api.js\";\n\n/** POST /tracks/:id/comments — creates a comment on a track */\nexport const createTrackComment = (\n token: string,\n trackId: string | number,\n body: string,\n timestamp?: number,\n): Promise<SoundCloudComment> =>\n scFetch<SoundCloudComment>({\n path: `/tracks/${trackId}/comments`,\n method: \"POST\",\n token,\n body: { comment: { body, ...(timestamp !== undefined ? { timestamp } : {}) } },\n });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getTrackLikes = (token: string, trackId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/tracks/${trackId}/favoriters?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getTrackReposts = (token: string, trackId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/tracks/${trackId}/reposters?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack } from \"../types/api.js\";\n\nexport const getRelatedTracks = (token: string, trackId: string | number, limit?: number): Promise<SoundCloudTrack[]> =>\n scFetch<SoundCloudTrack[]>({ path: `/tracks/${trackId}/related${limit ? `?limit=${limit}` : \"\"}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudStreams } from \"../types/api.js\";\n\n/** GET /tracks/:id/streams — returns streamable URLs */\nexport const getTrackStreams = (token: string, trackId: string | number): Promise<SoundCloudStreams> =>\n scFetch<SoundCloudStreams>({ path: `/tracks/${trackId}/streams`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\n\nexport const likeTrack = async (token: string, trackId: string | number): Promise<boolean> => {\n try {\n await scFetch<unknown>({ path: `/likes/tracks/${trackId}`, method: \"POST\", token });\n return true;\n } catch {\n return false;\n }\n};\n","import { scFetch } from \"../client/http.js\";\n\n/** DELETE /likes/tracks/:id — unlikes a track */\nexport const unlikeTrack = async (token: string, trackId: string | number): Promise<boolean> => {\n try {\n await scFetch<unknown>({ path: `/likes/tracks/${trackId}`, method: \"DELETE\", token });\n return true;\n } catch {\n return false;\n }\n};\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack } from \"../types/api.js\";\n\nexport interface UpdateTrackParams {\n title?: string;\n description?: string;\n genre?: string;\n tag_list?: string;\n sharing?: \"public\" | \"private\";\n downloadable?: boolean;\n purchase_url?: string;\n purchase_title?: string;\n release?: string;\n release_day?: number;\n release_month?: number;\n release_year?: number;\n label_name?: string;\n license?: string;\n isrc?: string;\n bpm?: number;\n key_signature?: string;\n}\n\n/** PUT /tracks/:id — updates a track's metadata */\nexport const updateTrack = (\n token: string,\n trackId: string | number,\n params: UpdateTrackParams,\n): Promise<SoundCloudTrack> =>\n scFetch<SoundCloudTrack>({\n path: `/tracks/${trackId}`,\n method: \"PUT\",\n token,\n body: { track: params },\n });\n","import { scFetch } from \"../client/http.js\";\n\n/** DELETE /tracks/:id — deletes a track */\nexport const deleteTrack = (token: string, trackId: string | number): Promise<void> =>\n scFetch<void>({ path: `/tracks/${trackId}`, method: \"DELETE\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist } from \"../types/api.js\";\n\nexport const getPlaylist = (token: string, playlistId: string | number): Promise<SoundCloudPlaylist> =>\n scFetch<SoundCloudPlaylist>({ path: `/playlists/${playlistId}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getPlaylistTracks = (token: string, playlistId: string | number, limit?: number, offset?: number): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/playlists/${playlistId}/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true${offset ? `&offset=${offset}` : \"\"}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const getPlaylistReposts = (token: string, playlistId: string | number, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/playlists/${playlistId}/reposters?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist } from \"../types/api.js\";\n\nexport interface CreatePlaylistParams {\n title: string;\n description?: string;\n sharing?: \"public\" | \"private\";\n tracks?: { urn: string }[];\n ean?: string;\n genre?: string;\n label_name?: string;\n license?: string;\n permalink?: string;\n purchase_title?: string;\n purchase_url?: string;\n release?: string;\n release_date?: string;\n set_type?: \"album\" | \"playlist\";\n tag_list?: string;\n}\n\n/** POST /playlists — creates a playlist */\nexport const createPlaylist = (\n token: string,\n params: CreatePlaylistParams,\n): Promise<SoundCloudPlaylist> =>\n scFetch<SoundCloudPlaylist>({\n path: \"/playlists\",\n method: \"POST\",\n token,\n body: { playlist: params },\n });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist } from \"../types/api.js\";\n\nexport interface UpdatePlaylistParams {\n title?: string;\n description?: string;\n sharing?: \"public\" | \"private\";\n tracks?: { urn: string }[];\n ean?: string;\n genre?: string;\n label_name?: string;\n license?: string;\n permalink?: string;\n purchase_title?: string;\n purchase_url?: string;\n release?: string;\n release_date?: string;\n set_type?: \"album\" | \"playlist\";\n tag_list?: string;\n}\n\n/** PUT /playlists/:id — updates a playlist */\nexport const updatePlaylist = (\n token: string,\n playlistId: string | number,\n params: UpdatePlaylistParams,\n): Promise<SoundCloudPlaylist> =>\n scFetch<SoundCloudPlaylist>({\n path: `/playlists/${playlistId}`,\n method: \"PUT\",\n token,\n body: { playlist: params },\n });\n","import { scFetch } from \"../client/http.js\";\n\n/** DELETE /playlists/:id — deletes a playlist */\nexport const deletePlaylist = (token: string, playlistId: string | number): Promise<void> =>\n scFetch<void>({ path: `/playlists/${playlistId}`, method: \"DELETE\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const searchTracks = (token: string, query: string, pageNumber?: number): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/tracks?q=${encodeURIComponent(query)}&linked_partitioning=true&limit=10${pageNumber && pageNumber > 0 ? `&offset=${10 * pageNumber}` : \"\"}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const searchUsers = (token: string, query: string, pageNumber?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/users?q=${encodeURIComponent(query)}&linked_partitioning=true&limit=10${pageNumber && pageNumber > 0 ? `&offset=${10 * pageNumber}` : \"\"}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\nexport const searchPlaylists = (token: string, query: string, pageNumber?: number): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> =>\n scFetch({ path: `/playlists?q=${encodeURIComponent(query)}&linked_partitioning=true&limit=10${pageNumber && pageNumber > 0 ? `&offset=${10 * pageNumber}` : \"\"}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\n\nexport const resolveUrl = (token: string, url: string): Promise<string> =>\n scFetch<string>({ path: `/resolve?url=${encodeURIComponent(url)}`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudActivitiesResponse } from \"../types/api.js\";\n\n/** GET /me/activities */\nexport const getMeActivities = (token: string, limit?: number): Promise<SoundCloudActivitiesResponse> =>\n scFetch({ path: `/me/activities?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n\n/** GET /me/activities/all/own */\nexport const getMeActivitiesOwn = (token: string, limit?: number): Promise<SoundCloudActivitiesResponse> =>\n scFetch({ path: `/me/activities/all/own?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n\n/** GET /me/activities/tracks */\nexport const getMeActivitiesTracks = (token: string, limit?: number): Promise<SoundCloudActivitiesResponse> =>\n scFetch({ path: `/me/activities/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack, SoundCloudPlaylist, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\n/** GET /me/likes/tracks */\nexport const getMeLikesTracks = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/me/likes/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n\n/** GET /me/likes/playlists */\nexport const getMeLikesPlaylists = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> =>\n scFetch({ path: `/me/likes/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudTrack, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\n/** GET /me/followings */\nexport const getMeFollowings = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/me/followings?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n\n/** GET /me/followings/tracks */\nexport const getMeFollowingsTracks = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/me/followings/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n\n/** PUT /me/followings/:user_urn — follow a user */\nexport const followUser = (token: string, userUrn: string | number): Promise<void> =>\n scFetch<void>({ path: `/me/followings/${userUrn}`, method: \"PUT\", token });\n\n/** DELETE /me/followings/:user_urn — unfollow a user */\nexport const unfollowUser = (token: string, userUrn: string | number): Promise<void> =>\n scFetch<void>({ path: `/me/followings/${userUrn}`, method: \"DELETE\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudUser, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\n/** GET /me/followers */\nexport const getMeFollowers = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudUser>> =>\n scFetch({ path: `/me/followers?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudPlaylist, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\n/** GET /me/playlists */\nexport const getMePlaylists = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudPlaylist>> =>\n scFetch({ path: `/me/playlists?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\nimport type { SoundCloudTrack, SoundCloudPaginatedResponse } from \"../types/api.js\";\n\n/** GET /me/tracks */\nexport const getMeTracks = (token: string, limit?: number): Promise<SoundCloudPaginatedResponse<SoundCloudTrack>> =>\n scFetch({ path: `/me/tracks?${limit ? `limit=${limit}&` : \"\"}linked_partitioning=true`, method: \"GET\", token });\n","import { scFetch } from \"../client/http.js\";\n\n/** POST /likes/tracks/:id */\nexport const likeTrack = async (token: string, trackId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/likes/tracks/${trackId}`, method: \"POST\", token }); return true; } catch { return false; }\n};\n\n/** DELETE /likes/tracks/:id */\nexport const unlikeTrack = async (token: string, trackId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/likes/tracks/${trackId}`, method: \"DELETE\", token }); return true; } catch { return false; }\n};\n\n/** POST /likes/playlists/:id */\nexport const likePlaylist = async (token: string, playlistId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/likes/playlists/${playlistId}`, method: \"POST\", token }); return true; } catch { return false; }\n};\n\n/** DELETE /likes/playlists/:id */\nexport const unlikePlaylist = async (token: string, playlistId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/likes/playlists/${playlistId}`, method: \"DELETE\", token }); return true; } catch { return false; }\n};\n","import { scFetch } from \"../client/http.js\";\n\n/** POST /reposts/tracks/:id */\nexport const repostTrack = async (token: string, trackId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/reposts/tracks/${trackId}`, method: \"POST\", token }); return true; } catch { return false; }\n};\n\n/** DELETE /reposts/tracks/:id */\nexport const unrepostTrack = async (token: string, trackId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/reposts/tracks/${trackId}`, method: \"DELETE\", token }); return true; } catch { return false; }\n};\n\n/** POST /reposts/playlists/:id */\nexport const repostPlaylist = async (token: string, playlistId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/reposts/playlists/${playlistId}`, method: \"POST\", token }); return true; } catch { return false; }\n};\n\n/** DELETE /reposts/playlists/:id */\nexport const unrepostPlaylist = async (token: string, playlistId: string | number): Promise<boolean> => {\n try { await scFetch<unknown>({ path: `/reposts/playlists/${playlistId}`, method: \"DELETE\", token }); return true; } catch { return false; }\n};\n","/**\n * Returns an encoded SoundCloud widget embed URL for a given track ID.\n */\nexport const getSoundCloudWidgetUrl = (trackId: string | number): string =>\n `https%3A//api.soundcloud.com/tracks/${trackId}&show_teaser=false&color=%2300a99d&inverse=false&show_user=false&sharing=false&buying=false&liking=false&show_artwork=false&show_name=false`;\n"]}
|