soundcloud-api-ts 1.13.3 → 1.14.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/AGENTS.md +8 -8
- package/README.md +15 -10
- package/dist/{chunk-QNL6UJL5.mjs → chunk-4FNI5QIN.mjs} +98 -40
- package/dist/chunk-4FNI5QIN.mjs.map +1 -0
- package/dist/{chunk-ZOHFLO4B.js → chunk-YBNVXQ2E.js} +98 -40
- package/dist/chunk-YBNVXQ2E.js.map +1 -0
- package/dist/cli.js +8 -8
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +3 -3
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +90 -82
- package/dist/index.d.ts +90 -82
- package/dist/index.js +68 -68
- package/dist/index.mjs +1 -1
- package/llms.txt +7 -7
- package/package.json +7 -1
- package/dist/chunk-QNL6UJL5.mjs.map +0 -1
- package/dist/chunk-ZOHFLO4B.js.map +0 -1
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"names":[],"mappings":"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","file":"cli.mjs","sourcesContent":["#!/usr/bin/env node\n\nimport { SoundCloudClient, generateCodeVerifier, generateCodeChallenge } from \"./index.js\";\nimport * as readline from \"node:readline\";\nimport * as http from \"node:http\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { execSync, spawn, type ChildProcess } from \"node:child_process\";\nimport * as net from \"node:net\";\n\n// ── ANSI Colors ──────────────────────────────────────────────────────────────\n\nconst c = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n bgBlue: \"\\x1b[44m\",\n};\n\nconst isNoColor = !!process.env[\"NO_COLOR\"];\nfunction col(color: string, text: string): string {\n return isNoColor ? text : `${color}${text}${c.reset}`;\n}\n\n// ── Config ───────────────────────────────────────────────────────────────────\n\ninterface CLIConfig {\n clientId?: string;\n clientSecret?: string;\n token?: string;\n refreshToken?: string;\n}\n\nconst CONFIG_PATH = path.join(os.homedir(), \".sc-cli.json\");\n\nfunction loadConfig(): CLIConfig {\n try {\n return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\")) as CLIConfig;\n } catch {\n return {};\n }\n}\n\nfunction saveConfig(config: CLIConfig): void {\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\n// ── Spinner ──────────────────────────────────────────────────────────────────\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\nfunction createSpinner(message: string) {\n let i = 0;\n const timer = setInterval(() => {\n process.stdout.write(`\\r${col(c.cyan, SPINNER_FRAMES[i % SPINNER_FRAMES.length])} ${message}`);\n i++;\n }, 80);\n return {\n stop(finalMessage?: string) {\n clearInterval(timer);\n process.stdout.write(`\\r${\" \".repeat(message.length + 4)}\\r`);\n if (finalMessage) console.log(finalMessage);\n },\n };\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n const totalSec = Math.floor(ms / 1000);\n const min = Math.floor(totalSec / 60);\n const sec = totalSec % 60;\n return `${min}:${sec.toString().padStart(2, \"0\")}`;\n}\n\nfunction formatNumber(n: number | undefined | null): string {\n if (n == null) return \"-\";\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toString();\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max - 1) + \"…\" : s;\n}\n\nfunction padRight(s: string, len: number): string {\n return s.length >= len ? s : s + \" \".repeat(len - s.length);\n}\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction die(msg: string): never {\n console.error(`\\n${col(c.red, \"✖\")} ${msg}`);\n process.exit(1);\n}\n\nfunction getClient(config: CLIConfig): SoundCloudClient {\n if (!config.clientId || !config.clientSecret) {\n die(\"Not configured. Run `sc-cli auth` first.\");\n }\n const client = new SoundCloudClient({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n redirectUri: \"http://localhost:8976/callback\",\n });\n if (config.token) {\n client.setToken(config.token, config.refreshToken);\n }\n return client;\n}\n\nasync function ensureToken(client: SoundCloudClient, config: CLIConfig): Promise<void> {\n if (client.accessToken) return;\n const spinner = createSpinner(\"Getting client token…\");\n try {\n const token = await client.auth.getClientToken();\n client.setToken(token.access_token);\n config.token = token.access_token;\n saveConfig(config);\n spinner.stop();\n } catch (err) {\n spinner.stop();\n die(`Failed to get token: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\n// ── Args parsing ─────────────────────────────────────────────────────────────\n\ninterface ParsedArgs {\n command: string;\n positional: string[];\n flags: Record<string, string | boolean>;\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const args = argv.slice(2);\n const positional: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith(\"--\")) {\n const eqIdx = arg.indexOf(\"=\");\n if (eqIdx > -1) {\n flags[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);\n } else {\n flags[arg.slice(2)] = true;\n }\n } else {\n positional.push(arg);\n }\n }\n const command = positional.shift() ?? \"help\";\n return { command, positional, flags };\n}\n\n// ── Commands ─────────────────────────────────────────────────────────────────\n\nasync function cmdAuth(): Promise<void> {\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ SoundCloud CLI Setup\")}\\n`);\n const clientId = await prompt(`${col(c.yellow, \"?\")} Client ID: `);\n if (!clientId) die(\"Client ID is required.\");\n const clientSecret = await prompt(`${col(c.yellow, \"?\")} Client Secret: `);\n if (!clientSecret) die(\"Client Secret is required.\");\n\n const spinner = createSpinner(\"Verifying credentials…\");\n try {\n const client = new SoundCloudClient({ clientId, clientSecret });\n const token = await client.auth.getClientToken();\n spinner.stop(`${col(c.green, \"✔\")} Credentials verified!`);\n const config: CLIConfig = { clientId, clientSecret, token: token.access_token };\n saveConfig(config);\n console.log(`${col(c.dim, ` Config saved to ${CONFIG_PATH}`)}`);\n } catch (err) {\n spinner.stop();\n die(`Invalid credentials: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nasync function cmdLogin(): Promise<void> {\n const config = loadConfig();\n if (!config.clientId || !config.clientSecret) {\n die(\"Not configured. Run `sc-cli auth` first.\");\n }\n\n const verifier = generateCodeVerifier();\n const challenge = await generateCodeChallenge(verifier);\n\n const client = new SoundCloudClient({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n redirectUri: \"http://localhost:8976/callback\",\n });\n\n const authUrl = client.auth.getAuthorizationUrl({\n state: \"cli-login\",\n codeChallenge: challenge,\n });\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ SoundCloud OAuth Login\")}\\n`);\n console.log(`${col(c.yellow, \"→\")} Open this URL in your browser:\\n`);\n console.log(` ${col(c.blue, authUrl)}\\n`);\n\n // Try to open browser automatically\n const openCmd = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n try {\n const { exec: cpExec } = await import(\"node:child_process\");\n cpExec(`${openCmd} \"${authUrl}\"`);\n } catch {\n // ignore — user can open manually\n }\n\n console.log(`${col(c.dim, \" Waiting for callback on http://localhost:8976/callback …\")}\\n`);\n\n const code = await new Promise<string>((resolve, reject) => {\n const server = http.createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://localhost:8976\");\n const authCode = url.searchParams.get(\"code\");\n if (authCode) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\"<html><body><h2>✅ Authenticated! You can close this tab.</h2></body></html>\");\n server.close();\n resolve(authCode);\n } else {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\"<html><body><h2>❌ No code received.</h2></body></html>\");\n server.close();\n reject(new Error(\"No authorization code received\"));\n }\n });\n server.listen(8976);\n server.on(\"error\", reject);\n });\n\n const spinner = createSpinner(\"Exchanging code for token…\");\n try {\n const token = await client.auth.getUserToken(code, verifier);\n spinner.stop(`${col(c.green, \"✔\")} Logged in successfully!`);\n config.token = token.access_token;\n config.refreshToken = token.refresh_token;\n saveConfig(config);\n console.log(`${col(c.dim, ` Config saved to ${CONFIG_PATH}`)}`);\n } catch (err) {\n spinner.stop();\n die(`Login failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nasync function cmdSearch(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli search <query> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli search \"lofi hip hop\"\n sc-cli search deadmau5 --json\n`);\n return;\n }\n\n const query = args.positional.join(\" \");\n if (!query) die(\"Usage: sc-cli search <query>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(`Searching \"${query}\"…`);\n const results = await client.search.tracks(query);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(results.collection, null, 2));\n return;\n }\n\n if (!results.collection.length) {\n console.log(`\\n${col(c.yellow, \"No results found.\")}`);\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, `⚡ Search results for \"${query}\"`)}\\n`);\n console.log(\n ` ${col(c.dim, padRight(\"#\", 4))}${col(c.dim, padRight(\"Title\", 40))}${col(c.dim, padRight(\"Artist\", 24))}${col(c.dim, padRight(\"Duration\", 10))}${col(c.dim, \"Plays\")}`,\n );\n console.log(` ${col(c.dim, \"─\".repeat(90))}`);\n\n results.collection.forEach((track, i) => {\n const num = padRight(`${i + 1}`, 4);\n const title = padRight(truncate(track.title ?? \"Untitled\", 38), 40);\n const artist = padRight(truncate(track.user?.username ?? \"Unknown\", 22), 24);\n const duration = padRight(formatDuration(track.duration ?? 0), 10);\n const plays = formatNumber(track.playback_count);\n console.log(` ${col(c.dim, num)}${col(c.white, title)}${col(c.magenta, artist)}${col(c.yellow, duration)}${col(c.green, plays)}`);\n });\n console.log();\n}\n\nasync function cmdTrack(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli track <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli track 123456\n sc-cli track 123456 --json\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli track <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Fetching track…\");\n const track = await client.tracks.getTrack(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(track, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Track Details\")}\\n`);\n console.log(` ${col(c.dim, \"Title:\")} ${col(c.bold + c.white, track.title ?? \"Untitled\")}`);\n console.log(` ${col(c.dim, \"Artist:\")} ${col(c.magenta, track.user?.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Duration:\")} ${col(c.yellow, formatDuration(track.duration ?? 0))}`);\n console.log(` ${col(c.dim, \"Plays:\")} ${col(c.green, formatNumber(track.playback_count))}`);\n console.log(` ${col(c.dim, \"Likes:\")} ${col(c.green, formatNumber(track.favoritings_count))}`);\n console.log(` ${col(c.dim, \"Genre:\")} ${track.genre ?? \"-\"}`);\n console.log(` ${col(c.dim, \"Created:\")} ${track.created_at ?? \"-\"}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, track.permalink_url ?? \"-\")}`);\n console.log();\n}\n\nasync function cmdUser(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli user <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli user 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli user <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Fetching user…\");\n const user = await client.users.getUser(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(user, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ User Profile\")}\\n`);\n console.log(` ${col(c.dim, \"Username:\")} ${col(c.bold + c.white, user.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Followers:\")} ${col(c.green, formatNumber(user.followers_count))}`);\n console.log(` ${col(c.dim, \"Following:\")} ${col(c.green, formatNumber(user.followings_count))}`);\n console.log(` ${col(c.dim, \"Tracks:\")} ${col(c.yellow, formatNumber(user.track_count))}`);\n console.log(` ${col(c.dim, \"City:\")} ${user.city ?? \"-\"}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, user.permalink_url ?? \"-\")}`);\n console.log();\n}\n\nasync function cmdPlaylist(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli playlist <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli playlist 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli playlist <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Fetching playlist…\");\n const playlist = await client.playlists.getPlaylist(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(playlist, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Playlist\")}\\n`);\n console.log(` ${col(c.dim, \"Title:\")} ${col(c.bold + c.white, playlist.title ?? \"Untitled\")}`);\n console.log(` ${col(c.dim, \"By:\")} ${col(c.magenta, playlist.user?.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Tracks:\")} ${playlist.track_count ?? 0}`);\n console.log(` ${col(c.dim, \"Duration:\")} ${col(c.yellow, formatDuration(playlist.duration ?? 0))}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, playlist.permalink_url ?? \"-\")}`);\n\n if (playlist.tracks?.length) {\n console.log(`\\n ${col(c.bold, \"Track listing:\")}\\n`);\n playlist.tracks.forEach((track, i) => {\n const num = padRight(`${i + 1}.`, 5);\n const title = truncate(track.title ?? \"Untitled\", 45);\n const dur = formatDuration(track.duration ?? 0);\n console.log(` ${col(c.dim, num)}${title} ${col(c.dim, `(${dur})`)}`);\n });\n }\n console.log();\n}\n\nasync function cmdStream(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli stream <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli stream 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli stream <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Getting stream URLs…\");\n const streams = await client.tracks.getStreams(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(streams, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Stream URLs\")}\\n`);\n const entries = Object.entries(streams).filter(([, v]) => v);\n if (!entries.length) {\n console.log(` ${col(c.yellow, \"No stream URLs available.\")}`);\n } else {\n for (const [key, url] of entries) {\n const label = key.replace(/_url$/, \"\").replace(/_/g, \" \").toUpperCase();\n console.log(` ${col(c.dim, padRight(label + \":\", 28))}${col(c.blue, String(url))}`);\n }\n }\n console.log();\n}\n\nasync function cmdResolve(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli resolve <url> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli resolve https://soundcloud.com/artist/track\n`);\n return;\n }\n\n const url = args.positional[0];\n if (!url) die(\"Usage: sc-cli resolve <url>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Resolving URL…\");\n const result = await client.resolve.resolveUrl(url);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.green, \"✔\")} Resolved:\\n`);\n if (typeof result === \"string\") {\n console.log(` ${col(c.blue, result)}`);\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n console.log();\n}\n\nasync function cmdMe(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli me [--json]\n\nShows the authenticated user's profile. Requires \\`sc-cli login\\` first.\n`);\n return;\n }\n\n const config = loadConfig();\n const client = getClient(config);\n if (!client.accessToken) {\n die(\"Not logged in. Run `sc-cli login` first.\");\n }\n\n const spinner = createSpinner(\"Fetching profile…\");\n const me = await client.me.getMe();\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(me, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Your Profile\")}\\n`);\n console.log(` ${col(c.dim, \"Username:\")} ${col(c.bold + c.white, me.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Followers:\")} ${col(c.green, formatNumber(me.followers_count))}`);\n console.log(` ${col(c.dim, \"Following:\")} ${col(c.green, formatNumber(me.followings_count))}`);\n console.log(` ${col(c.dim, \"Tracks:\")} ${col(c.yellow, formatNumber(me.track_count))}`);\n console.log(` ${col(c.dim, \"City:\")} ${me.city ?? \"-\"}`);\n console.log(` ${col(c.dim, \"Plan:\")} ${me.quota?.unlimited_upload_quota ? \"Pro\" : \"Free\"}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, me.permalink_url ?? \"-\")}`);\n console.log();\n}\n\nasync function cmdLikes(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli likes [--json]\n\nShows your liked tracks. Requires \\`sc-cli login\\` first.\n`);\n return;\n }\n\n const config = loadConfig();\n const client = getClient(config);\n if (!client.accessToken) {\n die(\"Not logged in. Run `sc-cli login` first.\");\n }\n\n const spinner = createSpinner(\"Fetching likes…\");\n const likes = await client.me.getLikesTracks(20);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(likes.collection, null, 2));\n return;\n }\n\n if (!likes.collection.length) {\n console.log(`\\n${col(c.yellow, \"No liked tracks.\")}`);\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Your Liked Tracks\")}\\n`);\n console.log(\n ` ${col(c.dim, padRight(\"#\", 4))}${col(c.dim, padRight(\"Title\", 40))}${col(c.dim, padRight(\"Artist\", 24))}${col(c.dim, \"Duration\")}`,\n );\n console.log(` ${col(c.dim, \"─\".repeat(80))}`);\n\n likes.collection.forEach((track, i) => {\n const num = padRight(`${i + 1}`, 4);\n const title = padRight(truncate(track.title ?? \"Untitled\", 38), 40);\n const artist = padRight(truncate(track.user?.username ?? \"Unknown\", 22), 24);\n const duration = formatDuration(track.duration ?? 0);\n console.log(` ${col(c.dim, num)}${col(c.white, title)}${col(c.magenta, artist)}${col(c.yellow, duration)}`);\n });\n console.log();\n}\n\n// ── Play Command ─────────────────────────────────────────────────────────────\n\nconst isWindows = process.platform === \"win32\";\n\n/** Detect an available audio player binary */\nfunction detectPlayer(): string | null {\n const candidates = isWindows ? [\"mpv\", \"ffplay\"] : [\"mpv\", \"ffplay\", \"afplay\"];\n const whichCmd = isWindows ? \"where.exe\" : \"command -v\";\n for (const bin of candidates) {\n try {\n execSync(`${whichCmd} ${bin}`, { stdio: \"ignore\" });\n return bin;\n } catch {\n // not found, try next\n }\n }\n return null;\n}\n\n/** IPC socket path for mpv (shared between playerArgs and cmdPlay) */\nconst mpvSocketPath = isWindows ? \"\\\\\\\\.\\\\pipe\\\\sc-cli-mpv\" : path.join(os.tmpdir(), \"sc-cli-mpv.sock\");\n\n/** Build player args (suppress visual output where possible) */\nfunction playerArgs(bin: string, filePath: string): string[] {\n switch (bin) {\n case \"mpv\":\n return [\"--no-video\", \"--no-terminal\", `--input-ipc-server=${mpvSocketPath}`, filePath];\n case \"ffplay\":\n return [\"-nodisp\", \"-autoexit\", \"-loglevel\", \"quiet\", filePath];\n case \"afplay\":\n return [filePath];\n default:\n return [filePath];\n }\n}\n\nasync function cmdPlay(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli play <id> [--url] [--json]\n\nPlay a SoundCloud track in your terminal.\n\n${col(c.bold, \"Options:\")}\n ${col(c.yellow, \"--url\")} Print the best stream URL and exit\n ${col(c.yellow, \"--json\")} Print raw stream URLs JSON and exit\n\n${col(c.bold, \"Examples:\")}\n sc-cli play 123456\n sc-cli play 123456 --url\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli play <track-id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n // Fetch track info and streams in parallel\n const spinner = createSpinner(\"Fetching track…\");\n const [track, streams] = await Promise.all([\n client.tracks.getTrack(id),\n client.tracks.getStreams(id),\n ]);\n spinner.stop();\n\n // --json: dump raw stream URLs\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(streams, null, 2));\n return;\n }\n\n // Pick best stream URL\n const streamUrl =\n streams.http_mp3_128_url ||\n streams.hls_mp3_128_url ||\n streams.hls_aac_160_url ||\n streams.preview_mp3_128_url;\n\n if (!streamUrl) die(\"No stream URL available for this track.\");\n\n // --url: just print and exit\n if (args.flags[\"url\"]) {\n console.log(streamUrl);\n return;\n }\n\n // Detect player\n const playerBin = detectPlayer();\n if (!playerBin) die(\"No audio player found. Install mpv, ffplay, or afplay.\");\n\n // Show track header\n const title = track.title ?? \"Untitled\";\n const artist = track.user?.username ?? \"Unknown\";\n const durationMs = track.duration ?? 0;\n const durationStr = formatDuration(durationMs);\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Now Playing\")}\\n`);\n console.log(` ${col(c.dim, \"Title:\")} ${col(c.bold + c.white, title)}`);\n console.log(` ${col(c.dim, \"Artist:\")} ${col(c.magenta, artist)}`);\n console.log(` ${col(c.dim, \"Duration:\")} ${col(c.yellow, durationStr)}`);\n console.log(` ${col(c.dim, \"Player:\")} ${playerBin}\\n`);\n\n // Download to temp file\n const tmpFile = path.join(os.tmpdir(), `sc-play-${id}-${Date.now()}.mp3`);\n const dlSpinner = createSpinner(\"Downloading stream…\");\n try {\n const resp = await fetch(streamUrl, {\n headers: { Authorization: `OAuth ${client.accessToken}` },\n });\n if (!resp.ok) die(`Download failed: HTTP ${resp.status}`);\n const buffer = Buffer.from(await resp.arrayBuffer());\n fs.writeFileSync(tmpFile, buffer);\n } catch (err) {\n dlSpinner.stop();\n die(`Download failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n dlSpinner.stop();\n\n // Spawn player\n const totalSec = Math.floor(durationMs / 1000);\n let player: ChildProcess | null = null;\n let progressTimer: ReturnType<typeof setInterval> | null = null;\n let startTime = Date.now();\n const usesMpv = playerBin === \"mpv\";\n\n // Restore terminal state helper\n const restoreStdin = () => {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n process.stdin.pause();\n }\n };\n\n // Cleanup helper\n const cleanup = () => {\n if (progressTimer) { clearInterval(progressTimer); progressTimer = null; }\n restoreStdin();\n process.stdout.write(\"\\n\");\n if (player && !player.killed) player.kill();\n try { fs.unlinkSync(tmpFile); } catch { /* ignore */ }\n if (usesMpv) try { fs.unlinkSync(mpvSocketPath); } catch { /* ignore */ }\n };\n\n // Handle Ctrl+C\n const onSigint = () => { cleanup(); process.exit(0); };\n process.on(\"SIGINT\", onSigint);\n\n return new Promise<void>((resolve) => {\n player = spawn(playerBin, playerArgs(playerBin, tmpFile), { stdio: \"ignore\" });\n startTime = Date.now();\n let paused = false;\n let pausedAt = 0; // total ms spent paused\n let pauseStart = 0;\n\n // Live progress bar\n const barWidth = 30;\n const drawProgress = () => {\n const pauseOffset = paused ? Date.now() - pauseStart : 0;\n const elapsed = Math.floor((Date.now() - startTime - pausedAt - pauseOffset) / 1000);\n const capped = Math.min(Math.max(elapsed, 0), totalSec);\n const ratio = totalSec > 0 ? capped / totalSec : 0;\n const filled = Math.round(ratio * barWidth);\n const empty = barWidth - filled;\n const bar = \"█\".repeat(filled) + \"░\".repeat(empty);\n const elapsedStr = formatDuration(capped * 1000);\n const icon = paused ? col(c.yellow, \"⏸\") : col(c.green, \"▶\");\n process.stdout.write(`\\r ${icon} [${col(c.cyan, bar)}] ${elapsedStr} / ${durationStr} `);\n };\n drawProgress(); // draw immediately\n progressTimer = setInterval(drawProgress, 1000);\n\n // Keyboard controls\n // afplay has no pause support; ffplay on Windows can't use SIGSTOP/SIGCONT\n const supportsPause = playerBin === \"mpv\" || (playerBin === \"ffplay\" && !isWindows);\n\n const sendMpvCommand = (cmd: string[]) => {\n if (!usesMpv) return;\n try {\n const sock = net.createConnection(mpvSocketPath);\n sock.on(\"error\", () => { /* ignore connection errors */ });\n sock.write(JSON.stringify({ command: cmd }) + \"\\n\");\n sock.end();\n } catch { /* ignore */ }\n };\n\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on(\"data\", (key: Buffer) => {\n const ch = key.toString();\n if (ch === \" \" && supportsPause && player && !player.killed) {\n if (usesMpv) {\n // Toggle pause via mpv IPC\n sendMpvCommand([\"cycle\", \"pause\"]);\n } else {\n // Signal-based fallback for ffplay\n if (paused) player.kill(\"SIGCONT\");\n else player.kill(\"SIGSTOP\");\n }\n if (paused) {\n pausedAt += Date.now() - pauseStart;\n paused = false;\n } else {\n pauseStart = Date.now();\n paused = true;\n }\n drawProgress();\n } else if (ch === \"q\" || ch === \"\\x03\") {\n // q or Ctrl+C\n if (usesMpv) sendMpvCommand([\"quit\"]);\n cleanup();\n process.removeListener(\"SIGINT\", onSigint);\n process.exit(0);\n }\n });\n }\n\n const controlHint = supportsPause ? \"[space] pause/play [q] quit\" : \"[q] quit\";\n console.log(` ${col(c.dim, controlHint)}\\n`);\n\n player.on(\"close\", () => {\n cleanup();\n process.removeListener(\"SIGINT\", onSigint);\n console.log(`\\n${col(c.green, \"✔\")} Playback complete.`);\n resolve();\n });\n\n player.on(\"error\", (err) => {\n cleanup();\n process.removeListener(\"SIGINT\", onSigint);\n die(`Player error: ${err.message}`);\n });\n });\n}\n\nfunction showHelp(): void {\n console.log(`\n${col(c.bold + c.cyan, \"⚡ sc-cli\")} ${col(c.dim, \"— Explore the SoundCloud API from your terminal\")}\n\n${col(c.bold, \"Usage:\")} sc-cli <command> [options]\n\n${col(c.bold, \"Setup:\")}\n ${col(c.green, \"auth\")} Set up API credentials (client_id + client_secret)\n ${col(c.green, \"login\")} Log in via OAuth (opens browser)\n\n${col(c.bold, \"Commands:\")}\n ${col(c.green, \"search\")} <query> Search tracks\n ${col(c.green, \"track\")} <id> Show track details\n ${col(c.green, \"user\")} <id> Show user profile\n ${col(c.green, \"playlist\")} <id> Show playlist with track listing\n ${col(c.green, \"play\")} <id> Play a track in your terminal\n ${col(c.green, \"stream\")} <id> Get stream URLs for a track\n ${col(c.green, \"resolve\")} <url> Resolve a SoundCloud URL\n ${col(c.green, \"me\")} Show your profile (requires login)\n ${col(c.green, \"likes\")} Show your liked tracks (requires login)\n\n${col(c.bold, \"Options:\")}\n ${col(c.yellow, \"--json\")} Output raw JSON (works on all commands)\n ${col(c.yellow, \"--help\")} Show help for a command\n\n${col(c.bold, \"Examples:\")}\n ${col(c.dim, \"$\")} sc-cli auth\n ${col(c.dim, \"$\")} sc-cli search \"lofi beats\"\n ${col(c.dim, \"$\")} sc-cli play 293\n ${col(c.dim, \"$\")} sc-cli track 293 --json\n ${col(c.dim, \"$\")} sc-cli resolve https://soundcloud.com/artist/track\n ${col(c.dim, \"$\")} sc-cli login\n ${col(c.dim, \"$\")} sc-cli me\n\n${col(c.dim, \"Config:\")} ${CONFIG_PATH}\n${col(c.dim, \"Powered by\")} soundcloud-api-ts\n`);\n}\n\n// ── Main ─────────────────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv);\n\n if (args.flags[\"help\"] && ![\"search\", \"track\", \"user\", \"playlist\", \"play\", \"stream\", \"resolve\", \"me\", \"likes\"].includes(args.command)) {\n showHelp();\n return;\n }\n\n try {\n switch (args.command) {\n case \"help\":\n showHelp();\n break;\n case \"auth\":\n await cmdAuth();\n break;\n case \"login\":\n await cmdLogin();\n break;\n case \"search\":\n await cmdSearch(args);\n break;\n case \"track\":\n await cmdTrack(args);\n break;\n case \"user\":\n await cmdUser(args);\n break;\n case \"playlist\":\n await cmdPlaylist(args);\n break;\n case \"play\":\n await cmdPlay(args);\n break;\n case \"stream\":\n await cmdStream(args);\n break;\n case \"resolve\":\n await cmdResolve(args);\n break;\n case \"me\":\n await cmdMe(args);\n break;\n case \"likes\":\n await cmdLikes(args);\n break;\n default:\n console.error(`\\n${col(c.red, \"✖\")} Unknown command: ${args.command}`);\n showHelp();\n process.exit(1);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n die(message);\n }\n}\n\nmain();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"names":[],"mappings":"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","file":"cli.mjs","sourcesContent":["#!/usr/bin/env node\n\nimport { SoundCloudClient, generateCodeVerifier, generateCodeChallenge } from \"./index.js\";\nimport * as readline from \"node:readline\";\nimport * as http from \"node:http\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { execSync, spawn, type ChildProcess } from \"node:child_process\";\nimport * as net from \"node:net\";\n\n// ── ANSI Colors ──────────────────────────────────────────────────────────────\n\nconst c = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n bgBlue: \"\\x1b[44m\",\n};\n\nconst isNoColor = !!process.env[\"NO_COLOR\"];\nfunction col(color: string, text: string): string {\n return isNoColor ? text : `${color}${text}${c.reset}`;\n}\n\n// ── Config ───────────────────────────────────────────────────────────────────\n\ninterface CLIConfig {\n clientId?: string;\n clientSecret?: string;\n token?: string;\n refreshToken?: string;\n}\n\nconst CONFIG_PATH = path.join(os.homedir(), \".sc-cli.json\");\n\nfunction loadConfig(): CLIConfig {\n try {\n return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\")) as CLIConfig;\n } catch {\n return {};\n }\n}\n\nfunction saveConfig(config: CLIConfig): void {\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\n// ── Spinner ──────────────────────────────────────────────────────────────────\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\nfunction createSpinner(message: string) {\n let i = 0;\n const timer = setInterval(() => {\n process.stdout.write(`\\r${col(c.cyan, SPINNER_FRAMES[i % SPINNER_FRAMES.length])} ${message}`);\n i++;\n }, 80);\n return {\n stop(finalMessage?: string) {\n clearInterval(timer);\n process.stdout.write(`\\r${\" \".repeat(message.length + 4)}\\r`);\n if (finalMessage) console.log(finalMessage);\n },\n };\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n const totalSec = Math.floor(ms / 1000);\n const min = Math.floor(totalSec / 60);\n const sec = totalSec % 60;\n return `${min}:${sec.toString().padStart(2, \"0\")}`;\n}\n\nfunction formatNumber(n: number | undefined | null): string {\n if (n == null) return \"-\";\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toString();\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max - 1) + \"…\" : s;\n}\n\nfunction padRight(s: string, len: number): string {\n return s.length >= len ? s : s + \" \".repeat(len - s.length);\n}\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction die(msg: string): never {\n console.error(`\\n${col(c.red, \"✖\")} ${msg}`);\n process.exit(1);\n}\n\nfunction getClient(config: CLIConfig): SoundCloudClient {\n if (!config.clientId || !config.clientSecret) {\n die(\"Not configured. Run `sc-cli auth` first.\");\n }\n const client = new SoundCloudClient({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n redirectUri: \"http://localhost:8976/callback\",\n });\n if (config.token) {\n client.setToken(config.token, config.refreshToken);\n }\n return client;\n}\n\nasync function ensureToken(client: SoundCloudClient, config: CLIConfig): Promise<void> {\n if (client.accessToken) return;\n const spinner = createSpinner(\"Getting client token…\");\n try {\n const token = await client.auth.getClientToken();\n client.setToken(token.access_token);\n config.token = token.access_token;\n saveConfig(config);\n spinner.stop();\n } catch (err) {\n spinner.stop();\n die(`Failed to get token: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\n// ── Args parsing ─────────────────────────────────────────────────────────────\n\ninterface ParsedArgs {\n command: string;\n positional: string[];\n flags: Record<string, string | boolean>;\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const args = argv.slice(2);\n const positional: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith(\"--\")) {\n const eqIdx = arg.indexOf(\"=\");\n if (eqIdx > -1) {\n flags[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);\n } else {\n flags[arg.slice(2)] = true;\n }\n } else {\n positional.push(arg);\n }\n }\n const command = positional.shift() ?? \"help\";\n return { command, positional, flags };\n}\n\n// ── Commands ─────────────────────────────────────────────────────────────────\n\nasync function cmdAuth(): Promise<void> {\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ SoundCloud CLI Setup\")}\\n`);\n const clientId = await prompt(`${col(c.yellow, \"?\")} Client ID: `);\n if (!clientId) die(\"Client ID is required.\");\n const clientSecret = await prompt(`${col(c.yellow, \"?\")} Client Secret: `);\n if (!clientSecret) die(\"Client Secret is required.\");\n\n const spinner = createSpinner(\"Verifying credentials…\");\n try {\n const client = new SoundCloudClient({ clientId, clientSecret });\n const token = await client.auth.getClientToken();\n spinner.stop(`${col(c.green, \"✔\")} Credentials verified!`);\n const config: CLIConfig = { clientId, clientSecret, token: token.access_token };\n saveConfig(config);\n console.log(`${col(c.dim, ` Config saved to ${CONFIG_PATH}`)}`);\n } catch (err) {\n spinner.stop();\n die(`Invalid credentials: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nasync function cmdLogin(): Promise<void> {\n const config = loadConfig();\n if (!config.clientId || !config.clientSecret) {\n die(\"Not configured. Run `sc-cli auth` first.\");\n }\n\n const verifier = generateCodeVerifier();\n const challenge = await generateCodeChallenge(verifier);\n\n const client = new SoundCloudClient({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n redirectUri: \"http://localhost:8976/callback\",\n });\n\n const authUrl = client.auth.getAuthorizationUrl({\n state: \"cli-login\",\n codeChallenge: challenge,\n });\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ SoundCloud OAuth Login\")}\\n`);\n console.log(`${col(c.yellow, \"→\")} Open this URL in your browser:\\n`);\n console.log(` ${col(c.blue, authUrl)}\\n`);\n\n // Try to open browser automatically\n // cmd.exe `start` treats the first quoted arg as a window title, so pass an empty title\n const openCmd =\n process.platform === \"darwin\" ? `open \"${authUrl}\"`\n : process.platform === \"win32\" ? `start \"\" \"${authUrl}\"`\n : `xdg-open \"${authUrl}\"`;\n try {\n const { exec: cpExec } = await import(\"node:child_process\");\n cpExec(openCmd);\n } catch {\n // ignore — user can open manually\n }\n\n console.log(`${col(c.dim, \" Waiting for callback on http://localhost:8976/callback …\")}\\n`);\n\n const code = await new Promise<string>((resolve, reject) => {\n const server = http.createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://localhost:8976\");\n const authCode = url.searchParams.get(\"code\");\n if (authCode) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\"<html><body><h2>✅ Authenticated! You can close this tab.</h2></body></html>\");\n server.close();\n resolve(authCode);\n } else {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\"<html><body><h2>❌ No code received.</h2></body></html>\");\n server.close();\n reject(new Error(\"No authorization code received\"));\n }\n });\n server.listen(8976);\n server.on(\"error\", reject);\n });\n\n const spinner = createSpinner(\"Exchanging code for token…\");\n try {\n const token = await client.auth.getUserToken(code, verifier);\n spinner.stop(`${col(c.green, \"✔\")} Logged in successfully!`);\n config.token = token.access_token;\n config.refreshToken = token.refresh_token;\n saveConfig(config);\n console.log(`${col(c.dim, ` Config saved to ${CONFIG_PATH}`)}`);\n } catch (err) {\n spinner.stop();\n die(`Login failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nasync function cmdSearch(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli search <query> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli search \"lofi hip hop\"\n sc-cli search deadmau5 --json\n`);\n return;\n }\n\n const query = args.positional.join(\" \");\n if (!query) die(\"Usage: sc-cli search <query>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(`Searching \"${query}\"…`);\n const results = await client.search.tracks(query);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(results.collection, null, 2));\n return;\n }\n\n if (!results.collection.length) {\n console.log(`\\n${col(c.yellow, \"No results found.\")}`);\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, `⚡ Search results for \"${query}\"`)}\\n`);\n console.log(\n ` ${col(c.dim, padRight(\"#\", 4))}${col(c.dim, padRight(\"Title\", 40))}${col(c.dim, padRight(\"Artist\", 24))}${col(c.dim, padRight(\"Duration\", 10))}${col(c.dim, \"Plays\")}`,\n );\n console.log(` ${col(c.dim, \"─\".repeat(90))}`);\n\n results.collection.forEach((track, i) => {\n const num = padRight(`${i + 1}`, 4);\n const title = padRight(truncate(track.title ?? \"Untitled\", 38), 40);\n const artist = padRight(truncate(track.user?.username ?? \"Unknown\", 22), 24);\n const duration = padRight(formatDuration(track.duration ?? 0), 10);\n const plays = formatNumber(track.playback_count);\n console.log(` ${col(c.dim, num)}${col(c.white, title)}${col(c.magenta, artist)}${col(c.yellow, duration)}${col(c.green, plays)}`);\n });\n console.log();\n}\n\nasync function cmdTrack(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli track <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli track 123456\n sc-cli track 123456 --json\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli track <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Fetching track…\");\n const track = await client.tracks.getTrack(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(track, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Track Details\")}\\n`);\n console.log(` ${col(c.dim, \"Title:\")} ${col(c.bold + c.white, track.title ?? \"Untitled\")}`);\n console.log(` ${col(c.dim, \"Artist:\")} ${col(c.magenta, track.user?.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Duration:\")} ${col(c.yellow, formatDuration(track.duration ?? 0))}`);\n console.log(` ${col(c.dim, \"Plays:\")} ${col(c.green, formatNumber(track.playback_count))}`);\n console.log(` ${col(c.dim, \"Likes:\")} ${col(c.green, formatNumber(track.favoritings_count))}`);\n console.log(` ${col(c.dim, \"Genre:\")} ${track.genre ?? \"-\"}`);\n console.log(` ${col(c.dim, \"Created:\")} ${track.created_at ?? \"-\"}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, track.permalink_url ?? \"-\")}`);\n console.log();\n}\n\nasync function cmdUser(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli user <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli user 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli user <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Fetching user…\");\n const user = await client.users.getUser(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(user, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ User Profile\")}\\n`);\n console.log(` ${col(c.dim, \"Username:\")} ${col(c.bold + c.white, user.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Followers:\")} ${col(c.green, formatNumber(user.followers_count))}`);\n console.log(` ${col(c.dim, \"Following:\")} ${col(c.green, formatNumber(user.followings_count))}`);\n console.log(` ${col(c.dim, \"Tracks:\")} ${col(c.yellow, formatNumber(user.track_count))}`);\n console.log(` ${col(c.dim, \"City:\")} ${user.city ?? \"-\"}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, user.permalink_url ?? \"-\")}`);\n console.log();\n}\n\nasync function cmdPlaylist(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli playlist <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli playlist 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli playlist <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Fetching playlist…\");\n const playlist = await client.playlists.getPlaylist(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(playlist, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Playlist\")}\\n`);\n console.log(` ${col(c.dim, \"Title:\")} ${col(c.bold + c.white, playlist.title ?? \"Untitled\")}`);\n console.log(` ${col(c.dim, \"By:\")} ${col(c.magenta, playlist.user?.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Tracks:\")} ${playlist.track_count ?? 0}`);\n console.log(` ${col(c.dim, \"Duration:\")} ${col(c.yellow, formatDuration(playlist.duration ?? 0))}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, playlist.permalink_url ?? \"-\")}`);\n\n if (playlist.tracks?.length) {\n console.log(`\\n ${col(c.bold, \"Track listing:\")}\\n`);\n playlist.tracks.forEach((track, i) => {\n const num = padRight(`${i + 1}.`, 5);\n const title = truncate(track.title ?? \"Untitled\", 45);\n const dur = formatDuration(track.duration ?? 0);\n console.log(` ${col(c.dim, num)}${title} ${col(c.dim, `(${dur})`)}`);\n });\n }\n console.log();\n}\n\nasync function cmdStream(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli stream <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli stream 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli stream <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Getting stream URLs…\");\n const streams = await client.tracks.getStreams(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(streams, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Stream URLs\")}\\n`);\n const entries = Object.entries(streams).filter(([, v]) => v);\n if (!entries.length) {\n console.log(` ${col(c.yellow, \"No stream URLs available.\")}`);\n } else {\n for (const [key, url] of entries) {\n const label = key.replace(/_url$/, \"\").replace(/_/g, \" \").toUpperCase();\n console.log(` ${col(c.dim, padRight(label + \":\", 28))}${col(c.blue, String(url))}`);\n }\n }\n console.log();\n}\n\nasync function cmdResolve(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli resolve <url> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli resolve https://soundcloud.com/artist/track\n`);\n return;\n }\n\n const url = args.positional[0];\n if (!url) die(\"Usage: sc-cli resolve <url>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Resolving URL…\");\n const result = await client.resolve.resolveUrl(url);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.green, \"✔\")} Resolved:\\n`);\n if (typeof result === \"string\") {\n console.log(` ${col(c.blue, result)}`);\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n console.log();\n}\n\nasync function cmdMe(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli me [--json]\n\nShows the authenticated user's profile. Requires \\`sc-cli login\\` first.\n`);\n return;\n }\n\n const config = loadConfig();\n const client = getClient(config);\n if (!client.accessToken) {\n die(\"Not logged in. Run `sc-cli login` first.\");\n }\n\n const spinner = createSpinner(\"Fetching profile…\");\n const me = await client.me.getMe();\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(me, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Your Profile\")}\\n`);\n console.log(` ${col(c.dim, \"Username:\")} ${col(c.bold + c.white, me.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Followers:\")} ${col(c.green, formatNumber(me.followers_count))}`);\n console.log(` ${col(c.dim, \"Following:\")} ${col(c.green, formatNumber(me.followings_count))}`);\n console.log(` ${col(c.dim, \"Tracks:\")} ${col(c.yellow, formatNumber(me.track_count))}`);\n console.log(` ${col(c.dim, \"City:\")} ${me.city ?? \"-\"}`);\n console.log(` ${col(c.dim, \"Plan:\")} ${me.quota?.unlimited_upload_quota ? \"Pro\" : \"Free\"}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, me.permalink_url ?? \"-\")}`);\n console.log();\n}\n\nasync function cmdLikes(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli likes [--json]\n\nShows your liked tracks. Requires \\`sc-cli login\\` first.\n`);\n return;\n }\n\n const config = loadConfig();\n const client = getClient(config);\n if (!client.accessToken) {\n die(\"Not logged in. Run `sc-cli login` first.\");\n }\n\n const spinner = createSpinner(\"Fetching likes…\");\n const likes = await client.me.getLikesTracks(20);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(likes.collection, null, 2));\n return;\n }\n\n if (!likes.collection.length) {\n console.log(`\\n${col(c.yellow, \"No liked tracks.\")}`);\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Your Liked Tracks\")}\\n`);\n console.log(\n ` ${col(c.dim, padRight(\"#\", 4))}${col(c.dim, padRight(\"Title\", 40))}${col(c.dim, padRight(\"Artist\", 24))}${col(c.dim, \"Duration\")}`,\n );\n console.log(` ${col(c.dim, \"─\".repeat(80))}`);\n\n likes.collection.forEach((track, i) => {\n const num = padRight(`${i + 1}`, 4);\n const title = padRight(truncate(track.title ?? \"Untitled\", 38), 40);\n const artist = padRight(truncate(track.user?.username ?? \"Unknown\", 22), 24);\n const duration = formatDuration(track.duration ?? 0);\n console.log(` ${col(c.dim, num)}${col(c.white, title)}${col(c.magenta, artist)}${col(c.yellow, duration)}`);\n });\n console.log();\n}\n\n// ── Play Command ─────────────────────────────────────────────────────────────\n\nconst isWindows = process.platform === \"win32\";\n\n/** Detect an available audio player binary */\nfunction detectPlayer(): string | null {\n const candidates = isWindows ? [\"mpv\", \"ffplay\"] : [\"mpv\", \"ffplay\", \"afplay\"];\n const whichCmd = isWindows ? \"where.exe\" : \"command -v\";\n for (const bin of candidates) {\n try {\n execSync(`${whichCmd} ${bin}`, { stdio: \"ignore\" });\n return bin;\n } catch {\n // not found, try next\n }\n }\n return null;\n}\n\n/** IPC socket path for mpv (shared between playerArgs and cmdPlay) */\nconst mpvSocketPath = isWindows ? \"\\\\\\\\.\\\\pipe\\\\sc-cli-mpv\" : path.join(os.tmpdir(), \"sc-cli-mpv.sock\");\n\n/** Build player args (suppress visual output where possible) */\nfunction playerArgs(bin: string, filePath: string): string[] {\n switch (bin) {\n case \"mpv\":\n return [\"--no-video\", \"--no-terminal\", `--input-ipc-server=${mpvSocketPath}`, filePath];\n case \"ffplay\":\n return [\"-nodisp\", \"-autoexit\", \"-loglevel\", \"quiet\", filePath];\n case \"afplay\":\n return [filePath];\n default:\n return [filePath];\n }\n}\n\nasync function cmdPlay(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli play <id> [--url] [--json]\n\nPlay a SoundCloud track in your terminal.\n\n${col(c.bold, \"Options:\")}\n ${col(c.yellow, \"--url\")} Print the best stream URL and exit\n ${col(c.yellow, \"--json\")} Print raw stream URLs JSON and exit\n\n${col(c.bold, \"Examples:\")}\n sc-cli play 123456\n sc-cli play 123456 --url\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli play <track-id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n // Fetch track info and streams in parallel\n const spinner = createSpinner(\"Fetching track…\");\n const [track, streams] = await Promise.all([\n client.tracks.getTrack(id),\n client.tracks.getStreams(id),\n ]);\n spinner.stop();\n\n // --json: dump raw stream URLs\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(streams, null, 2));\n return;\n }\n\n // Pick best stream URL\n const streamUrl =\n streams.http_mp3_128_url ||\n streams.hls_mp3_128_url ||\n streams.hls_aac_160_url ||\n streams.preview_mp3_128_url;\n\n if (!streamUrl) die(\"No stream URL available for this track.\");\n\n // --url: just print and exit\n if (args.flags[\"url\"]) {\n console.log(streamUrl);\n return;\n }\n\n // Detect player\n const playerBin = detectPlayer();\n if (!playerBin) die(\"No audio player found. Install mpv, ffplay, or afplay.\");\n\n // Show track header\n const title = track.title ?? \"Untitled\";\n const artist = track.user?.username ?? \"Unknown\";\n const durationMs = track.duration ?? 0;\n const durationStr = formatDuration(durationMs);\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Now Playing\")}\\n`);\n console.log(` ${col(c.dim, \"Title:\")} ${col(c.bold + c.white, title)}`);\n console.log(` ${col(c.dim, \"Artist:\")} ${col(c.magenta, artist)}`);\n console.log(` ${col(c.dim, \"Duration:\")} ${col(c.yellow, durationStr)}`);\n console.log(` ${col(c.dim, \"Player:\")} ${playerBin}\\n`);\n\n // Download to temp file\n const tmpFile = path.join(os.tmpdir(), `sc-play-${id}-${Date.now()}.mp3`);\n const dlSpinner = createSpinner(\"Downloading stream…\");\n try {\n const resp = await fetch(streamUrl, {\n headers: { Authorization: `OAuth ${client.accessToken}` },\n });\n if (!resp.ok) die(`Download failed: HTTP ${resp.status}`);\n const buffer = Buffer.from(await resp.arrayBuffer());\n fs.writeFileSync(tmpFile, buffer);\n } catch (err) {\n dlSpinner.stop();\n die(`Download failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n dlSpinner.stop();\n\n // Spawn player\n const totalSec = Math.floor(durationMs / 1000);\n let player: ChildProcess | null = null;\n let progressTimer: ReturnType<typeof setInterval> | null = null;\n let startTime = Date.now();\n const usesMpv = playerBin === \"mpv\";\n\n // Restore terminal state helper\n const restoreStdin = () => {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n process.stdin.pause();\n }\n };\n\n // Cleanup helper\n const cleanup = () => {\n if (progressTimer) { clearInterval(progressTimer); progressTimer = null; }\n restoreStdin();\n process.stdout.write(\"\\n\");\n if (player && !player.killed) player.kill();\n try { fs.unlinkSync(tmpFile); } catch { /* ignore */ }\n if (usesMpv) try { fs.unlinkSync(mpvSocketPath); } catch { /* ignore */ }\n };\n\n // Handle Ctrl+C\n const onSigint = () => { cleanup(); process.exit(0); };\n process.on(\"SIGINT\", onSigint);\n\n return new Promise<void>((resolve) => {\n player = spawn(playerBin, playerArgs(playerBin, tmpFile), { stdio: \"ignore\" });\n startTime = Date.now();\n let paused = false;\n let pausedAt = 0; // total ms spent paused\n let pauseStart = 0;\n\n // Live progress bar\n const barWidth = 30;\n const drawProgress = () => {\n const pauseOffset = paused ? Date.now() - pauseStart : 0;\n const elapsed = Math.floor((Date.now() - startTime - pausedAt - pauseOffset) / 1000);\n const capped = Math.min(Math.max(elapsed, 0), totalSec);\n const ratio = totalSec > 0 ? capped / totalSec : 0;\n const filled = Math.round(ratio * barWidth);\n const empty = barWidth - filled;\n const bar = \"█\".repeat(filled) + \"░\".repeat(empty);\n const elapsedStr = formatDuration(capped * 1000);\n const icon = paused ? col(c.yellow, \"⏸\") : col(c.green, \"▶\");\n process.stdout.write(`\\r ${icon} [${col(c.cyan, bar)}] ${elapsedStr} / ${durationStr} `);\n };\n drawProgress(); // draw immediately\n progressTimer = setInterval(drawProgress, 1000);\n\n // Keyboard controls\n // afplay has no pause support; ffplay on Windows can't use SIGSTOP/SIGCONT\n const supportsPause = playerBin === \"mpv\" || (playerBin === \"ffplay\" && !isWindows);\n\n const sendMpvCommand = (cmd: string[]) => {\n if (!usesMpv) return;\n try {\n const sock = net.createConnection(mpvSocketPath);\n sock.on(\"error\", () => { /* ignore connection errors */ });\n sock.write(JSON.stringify({ command: cmd }) + \"\\n\");\n sock.end();\n } catch { /* ignore */ }\n };\n\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on(\"data\", (key: Buffer) => {\n const ch = key.toString();\n if (ch === \" \" && supportsPause && player && !player.killed) {\n if (usesMpv) {\n // Toggle pause via mpv IPC\n sendMpvCommand([\"cycle\", \"pause\"]);\n } else {\n // Signal-based fallback for ffplay\n if (paused) player.kill(\"SIGCONT\");\n else player.kill(\"SIGSTOP\");\n }\n if (paused) {\n pausedAt += Date.now() - pauseStart;\n paused = false;\n } else {\n pauseStart = Date.now();\n paused = true;\n }\n drawProgress();\n } else if (ch === \"q\" || ch === \"\\x03\") {\n // q or Ctrl+C\n if (usesMpv) sendMpvCommand([\"quit\"]);\n cleanup();\n process.removeListener(\"SIGINT\", onSigint);\n process.exit(0);\n }\n });\n }\n\n const controlHint = supportsPause ? \"[space] pause/play [q] quit\" : \"[q] quit\";\n console.log(` ${col(c.dim, controlHint)}\\n`);\n\n player.on(\"close\", () => {\n cleanup();\n process.removeListener(\"SIGINT\", onSigint);\n console.log(`\\n${col(c.green, \"✔\")} Playback complete.`);\n resolve();\n });\n\n player.on(\"error\", (err) => {\n cleanup();\n process.removeListener(\"SIGINT\", onSigint);\n die(`Player error: ${err.message}`);\n });\n });\n}\n\nfunction showHelp(): void {\n console.log(`\n${col(c.bold + c.cyan, \"⚡ sc-cli\")} ${col(c.dim, \"— Explore the SoundCloud API from your terminal\")}\n\n${col(c.bold, \"Usage:\")} sc-cli <command> [options]\n\n${col(c.bold, \"Setup:\")}\n ${col(c.green, \"auth\")} Set up API credentials (client_id + client_secret)\n ${col(c.green, \"login\")} Log in via OAuth (opens browser)\n\n${col(c.bold, \"Commands:\")}\n ${col(c.green, \"search\")} <query> Search tracks\n ${col(c.green, \"track\")} <id> Show track details\n ${col(c.green, \"user\")} <id> Show user profile\n ${col(c.green, \"playlist\")} <id> Show playlist with track listing\n ${col(c.green, \"play\")} <id> Play a track in your terminal\n ${col(c.green, \"stream\")} <id> Get stream URLs for a track\n ${col(c.green, \"resolve\")} <url> Resolve a SoundCloud URL\n ${col(c.green, \"me\")} Show your profile (requires login)\n ${col(c.green, \"likes\")} Show your liked tracks (requires login)\n\n${col(c.bold, \"Options:\")}\n ${col(c.yellow, \"--json\")} Output raw JSON (works on all commands)\n ${col(c.yellow, \"--help\")} Show help for a command\n\n${col(c.bold, \"Examples:\")}\n ${col(c.dim, \"$\")} sc-cli auth\n ${col(c.dim, \"$\")} sc-cli search \"lofi beats\"\n ${col(c.dim, \"$\")} sc-cli play 293\n ${col(c.dim, \"$\")} sc-cli track 293 --json\n ${col(c.dim, \"$\")} sc-cli resolve https://soundcloud.com/artist/track\n ${col(c.dim, \"$\")} sc-cli login\n ${col(c.dim, \"$\")} sc-cli me\n\n${col(c.dim, \"Config:\")} ${CONFIG_PATH}\n${col(c.dim, \"Powered by\")} soundcloud-api-ts\n`);\n}\n\n// ── Main ─────────────────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv);\n\n if (args.flags[\"help\"] && ![\"search\", \"track\", \"user\", \"playlist\", \"play\", \"stream\", \"resolve\", \"me\", \"likes\"].includes(args.command)) {\n showHelp();\n return;\n }\n\n try {\n switch (args.command) {\n case \"help\":\n showHelp();\n break;\n case \"auth\":\n await cmdAuth();\n break;\n case \"login\":\n await cmdLogin();\n break;\n case \"search\":\n await cmdSearch(args);\n break;\n case \"track\":\n await cmdTrack(args);\n break;\n case \"user\":\n await cmdUser(args);\n break;\n case \"playlist\":\n await cmdPlaylist(args);\n break;\n case \"play\":\n await cmdPlay(args);\n break;\n case \"stream\":\n await cmdStream(args);\n break;\n case \"resolve\":\n await cmdResolve(args);\n break;\n case \"me\":\n await cmdMe(args);\n break;\n case \"likes\":\n await cmdLikes(args);\n break;\n default:\n console.error(`\\n${col(c.red, \"✖\")} Unknown command: ${args.command}`);\n showHelp();\n process.exit(1);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n die(message);\n }\n}\n\nmain();\n"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,84 @@
|
|
|
1
1
|
import { S as SoundCloudTrack, a as SoundCloudPlaylist, b as SoundCloudToken, c as SoundCloudPaginatedResponse, d as SoundCloudMe, e as SoundCloudActivitiesResponse, f as SoundCloudUser, g as SoundCloudConnection, h as SoundCloudWebProfile, i as SoundCloudStreams, j as SoundCloudComment } from './index-DX6Anc1-.mjs';
|
|
2
2
|
export { k as SoundCloudActivity, l as SoundCloudCommentUser, m as SoundCloudError, n as SoundCloudQuota, o as SoundCloudSubscription, p as SoundCloudSubscriptionProduct } from './index-DX6Anc1-.mjs';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Deduplicates concurrent in-flight requests with the same key.
|
|
6
|
+
*
|
|
7
|
+
* When multiple callers request the same resource simultaneously,
|
|
8
|
+
* only one underlying promise is created — all callers share the result.
|
|
9
|
+
* The key is cleaned up automatically once the promise settles.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const deduper = new InFlightDeduper();
|
|
14
|
+
*
|
|
15
|
+
* // Both calls share a single fetch:
|
|
16
|
+
* const [a, b] = await Promise.all([
|
|
17
|
+
* deduper.add('track:123', () => fetchTrack(123)),
|
|
18
|
+
* deduper.add('track:123', () => fetchTrack(123)),
|
|
19
|
+
* ]);
|
|
20
|
+
* // a === b (same resolved value)
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare class InFlightDeduper {
|
|
24
|
+
private inFlight;
|
|
25
|
+
/**
|
|
26
|
+
* Return an existing in-flight promise for `key`, or start a new one via `factory`.
|
|
27
|
+
* The entry is removed from the map once the promise settles (resolve or reject).
|
|
28
|
+
*/
|
|
29
|
+
add<T>(key: string, factory: () => Promise<T>): Promise<T>;
|
|
30
|
+
/** Number of currently in-flight requests */
|
|
31
|
+
get size(): number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* A cache entry with an expiration timestamp.
|
|
36
|
+
*/
|
|
37
|
+
interface SoundCloudCacheEntry<T> {
|
|
38
|
+
/** The cached value */
|
|
39
|
+
value: T;
|
|
40
|
+
/** Unix timestamp (ms) when this entry expires */
|
|
41
|
+
expiresAt: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Cache interface for SoundCloud API responses.
|
|
45
|
+
*
|
|
46
|
+
* Implement this interface to plug in any caching backend (in-memory, Redis, etc.).
|
|
47
|
+
* Pass an instance as `cache` in {@link SoundCloudClientConfig} to enable caching.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* // Simple in-memory implementation
|
|
52
|
+
* class SimpleCache implements SoundCloudCache {
|
|
53
|
+
* private store = new Map<string, SoundCloudCacheEntry<unknown>>();
|
|
54
|
+
*
|
|
55
|
+
* get<T>(key: string): T | undefined {
|
|
56
|
+
* const entry = this.store.get(key) as SoundCloudCacheEntry<T> | undefined;
|
|
57
|
+
* if (!entry || Date.now() > entry.expiresAt) return undefined;
|
|
58
|
+
* return entry.value;
|
|
59
|
+
* }
|
|
60
|
+
*
|
|
61
|
+
* set<T>(key: string, value: T, { ttlMs }: { ttlMs: number }): void {
|
|
62
|
+
* this.store.set(key, { value, expiresAt: Date.now() + ttlMs });
|
|
63
|
+
* }
|
|
64
|
+
*
|
|
65
|
+
* delete(key: string): void {
|
|
66
|
+
* this.store.delete(key);
|
|
67
|
+
* }
|
|
68
|
+
* }
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
interface SoundCloudCache {
|
|
72
|
+
/** Retrieve a cached value by key, or `undefined` if missing or expired */
|
|
73
|
+
get<T>(key: string): Promise<T | undefined> | T | undefined;
|
|
74
|
+
/** Store a value with a TTL in milliseconds */
|
|
75
|
+
set<T>(key: string, value: T, options: {
|
|
76
|
+
ttlMs: number;
|
|
77
|
+
}): Promise<void> | void;
|
|
78
|
+
/** Remove a cached entry */
|
|
79
|
+
delete(key: string): Promise<void> | void;
|
|
80
|
+
}
|
|
81
|
+
|
|
4
82
|
/**
|
|
5
83
|
* Options for making a request to the SoundCloud API via {@link scFetch}.
|
|
6
84
|
*/
|
|
@@ -81,6 +159,14 @@ interface AutoRefreshContext {
|
|
|
81
159
|
retry?: RetryConfig;
|
|
82
160
|
/** Called after every API request with structured telemetry */
|
|
83
161
|
onRequest?: (telemetry: SCRequestTelemetry) => void;
|
|
162
|
+
/** Custom fetch implementation (defaults to `globalThis.fetch`) */
|
|
163
|
+
fetchImpl?: typeof globalThis.fetch;
|
|
164
|
+
/** Deduplicates concurrent identical GET requests when set */
|
|
165
|
+
deduper?: InFlightDeduper;
|
|
166
|
+
/** Optional cache backend for GET responses */
|
|
167
|
+
cache?: SoundCloudCache;
|
|
168
|
+
/** TTL in milliseconds for cached GET responses (default: 60000) */
|
|
169
|
+
cacheTtlMs?: number;
|
|
84
170
|
}
|
|
85
171
|
/**
|
|
86
172
|
* Make a request to the SoundCloud API using native `fetch`.
|
|
@@ -129,7 +215,7 @@ declare function scFetch<T>(options: RequestOptions, refreshCtx?: AutoRefreshCon
|
|
|
129
215
|
* );
|
|
130
216
|
* ```
|
|
131
217
|
*/
|
|
132
|
-
declare function scFetchUrl<T>(url: string, token?: string, retryConfig?: RetryConfig, onRequest?: (telemetry: SCRequestTelemetry) => void): Promise<T>;
|
|
218
|
+
declare function scFetchUrl<T>(url: string, token?: string, retryConfig?: RetryConfig, onRequest?: (telemetry: SCRequestTelemetry) => void, fetchImpl?: typeof globalThis.fetch): Promise<T>;
|
|
133
219
|
|
|
134
220
|
/**
|
|
135
221
|
* Raw response from the SoundCloud API, including status code and headers.
|
|
@@ -180,54 +266,6 @@ declare class RawClient {
|
|
|
180
266
|
delete<T = unknown>(path: string): Promise<RawResponse<T>>;
|
|
181
267
|
}
|
|
182
268
|
|
|
183
|
-
/**
|
|
184
|
-
* A cache entry with an expiration timestamp.
|
|
185
|
-
*/
|
|
186
|
-
interface SoundCloudCacheEntry<T> {
|
|
187
|
-
/** The cached value */
|
|
188
|
-
value: T;
|
|
189
|
-
/** Unix timestamp (ms) when this entry expires */
|
|
190
|
-
expiresAt: number;
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Cache interface for SoundCloud API responses.
|
|
194
|
-
*
|
|
195
|
-
* Implement this interface to plug in any caching backend (in-memory, Redis, etc.).
|
|
196
|
-
* Pass an instance as `cache` in {@link SoundCloudClientConfig} to enable caching.
|
|
197
|
-
*
|
|
198
|
-
* @example
|
|
199
|
-
* ```ts
|
|
200
|
-
* // Simple in-memory implementation
|
|
201
|
-
* class SimpleCache implements SoundCloudCache {
|
|
202
|
-
* private store = new Map<string, SoundCloudCacheEntry<unknown>>();
|
|
203
|
-
*
|
|
204
|
-
* get<T>(key: string): T | undefined {
|
|
205
|
-
* const entry = this.store.get(key) as SoundCloudCacheEntry<T> | undefined;
|
|
206
|
-
* if (!entry || Date.now() > entry.expiresAt) return undefined;
|
|
207
|
-
* return entry.value;
|
|
208
|
-
* }
|
|
209
|
-
*
|
|
210
|
-
* set<T>(key: string, value: T, { ttlMs }: { ttlMs: number }): void {
|
|
211
|
-
* this.store.set(key, { value, expiresAt: Date.now() + ttlMs });
|
|
212
|
-
* }
|
|
213
|
-
*
|
|
214
|
-
* delete(key: string): void {
|
|
215
|
-
* this.store.delete(key);
|
|
216
|
-
* }
|
|
217
|
-
* }
|
|
218
|
-
* ```
|
|
219
|
-
*/
|
|
220
|
-
interface SoundCloudCache {
|
|
221
|
-
/** Retrieve a cached value by key, or `undefined` if missing or expired */
|
|
222
|
-
get<T>(key: string): Promise<T | undefined> | T | undefined;
|
|
223
|
-
/** Store a value with a TTL in milliseconds */
|
|
224
|
-
set<T>(key: string, value: T, options: {
|
|
225
|
-
ttlMs: number;
|
|
226
|
-
}): Promise<void> | void;
|
|
227
|
-
/** Remove a cached entry */
|
|
228
|
-
delete(key: string): Promise<void> | void;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
269
|
/**
|
|
232
270
|
* Parameters for updating a track's metadata via {@link updateTrack}.
|
|
233
271
|
*/
|
|
@@ -437,11 +475,11 @@ interface SoundCloudClientConfig {
|
|
|
437
475
|
onRequest?: (telemetry: SCRequestTelemetry) => void;
|
|
438
476
|
/** Custom fetch implementation (defaults to `globalThis.fetch`) */
|
|
439
477
|
fetch?: typeof globalThis.fetch;
|
|
440
|
-
/** Deduplicate concurrent identical requests (default: true) */
|
|
478
|
+
/** Deduplicate concurrent identical GET requests (default: true) */
|
|
441
479
|
dedupe?: boolean;
|
|
442
|
-
/** Optional cache backend for
|
|
480
|
+
/** Optional cache backend for GET responses */
|
|
443
481
|
cache?: SoundCloudCache;
|
|
444
|
-
/** Default TTL in milliseconds for cached responses (default: 60000) */
|
|
482
|
+
/** Default TTL in milliseconds for cached GET responses (default: 60000) */
|
|
445
483
|
cacheTtlMs?: number;
|
|
446
484
|
/** Called before each retry attempt with structured retry info */
|
|
447
485
|
onRetry?: (info: RetryInfo) => void;
|
|
@@ -1477,36 +1515,6 @@ declare namespace SoundCloudClient {
|
|
|
1477
1515
|
}
|
|
1478
1516
|
}
|
|
1479
1517
|
|
|
1480
|
-
/**
|
|
1481
|
-
* Deduplicates concurrent in-flight requests with the same key.
|
|
1482
|
-
*
|
|
1483
|
-
* When multiple callers request the same resource simultaneously,
|
|
1484
|
-
* only one underlying promise is created — all callers share the result.
|
|
1485
|
-
* The key is cleaned up automatically once the promise settles.
|
|
1486
|
-
*
|
|
1487
|
-
* @example
|
|
1488
|
-
* ```ts
|
|
1489
|
-
* const deduper = new InFlightDeduper();
|
|
1490
|
-
*
|
|
1491
|
-
* // Both calls share a single fetch:
|
|
1492
|
-
* const [a, b] = await Promise.all([
|
|
1493
|
-
* deduper.add('track:123', () => fetchTrack(123)),
|
|
1494
|
-
* deduper.add('track:123', () => fetchTrack(123)),
|
|
1495
|
-
* ]);
|
|
1496
|
-
* // a === b (same resolved value)
|
|
1497
|
-
* ```
|
|
1498
|
-
*/
|
|
1499
|
-
declare class InFlightDeduper {
|
|
1500
|
-
private inFlight;
|
|
1501
|
-
/**
|
|
1502
|
-
* Return an existing in-flight promise for `key`, or start a new one via `factory`.
|
|
1503
|
-
* The entry is removed from the map once the promise settles (resolve or reject).
|
|
1504
|
-
*/
|
|
1505
|
-
add<T>(key: string, factory: () => Promise<T>): Promise<T>;
|
|
1506
|
-
/** Number of currently in-flight requests */
|
|
1507
|
-
get size(): number;
|
|
1508
|
-
}
|
|
1509
|
-
|
|
1510
1518
|
/**
|
|
1511
1519
|
* List of operation IDs currently implemented by soundcloud-api-ts.
|
|
1512
1520
|
* Used for OpenAPI coverage reporting.
|