soundcloud-api-ts 1.6.1 → 1.6.2
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 +13 -13
- package/dist/cli.js +37 -37
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +37 -37
- package/dist/cli.mjs.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ A fully-typed TypeScript client for the SoundCloud API. Zero dependencies, nativ
|
|
|
17
17
|
- **Full TypeScript types** for all API responses
|
|
18
18
|
- **Token management built-in** — `setToken()`, auto-refresh on 401
|
|
19
19
|
- **PKCE support** for public clients and SPAs
|
|
20
|
-
- **Interactive CLI** — explore the API from your terminal with `
|
|
20
|
+
- **Interactive CLI** — explore the API from your terminal with `sc-cli`
|
|
21
21
|
- **Clean API** — `sc.tracks.getTrack(id)` not `getTrack(token, id)`
|
|
22
22
|
- **Automatic retry** — exponential backoff on 429 and 5xx
|
|
23
23
|
- **Dual ESM/CJS output** — works everywhere
|
|
@@ -49,36 +49,36 @@ Explore the SoundCloud API right from your terminal — no code required:
|
|
|
49
49
|
npm install -g soundcloud-api-ts
|
|
50
50
|
|
|
51
51
|
# Set up credentials (interactive)
|
|
52
|
-
|
|
52
|
+
sc-cli auth
|
|
53
53
|
|
|
54
54
|
# Search tracks — colorful formatted table
|
|
55
|
-
|
|
55
|
+
sc-cli search "lofi beats"
|
|
56
56
|
|
|
57
57
|
# Get track details
|
|
58
|
-
|
|
58
|
+
sc-cli track 293
|
|
59
59
|
|
|
60
60
|
# View user profile
|
|
61
|
-
|
|
61
|
+
sc-cli user 12345
|
|
62
62
|
|
|
63
63
|
# Get stream URLs
|
|
64
|
-
|
|
64
|
+
sc-cli stream 293
|
|
65
65
|
|
|
66
66
|
# Show playlist with track listing
|
|
67
|
-
|
|
67
|
+
sc-cli playlist 456
|
|
68
68
|
|
|
69
69
|
# Resolve a SoundCloud URL
|
|
70
|
-
|
|
70
|
+
sc-cli resolve https://soundcloud.com/artist/track
|
|
71
71
|
|
|
72
72
|
# OAuth login for authenticated endpoints
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
sc-cli login
|
|
74
|
+
sc-cli me
|
|
75
|
+
sc-cli likes
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
Every command supports `--json` for machine-readable output (great for piping to `jq` or using in scripts). Run `
|
|
78
|
+
Every command supports `--json` for machine-readable output (great for piping to `jq` or using in scripts). Run `sc-cli --help` for the full command list.
|
|
79
79
|
|
|
80
80
|
```
|
|
81
|
-
⚡
|
|
81
|
+
⚡ sc-cli — Explore the SoundCloud API from your terminal
|
|
82
82
|
|
|
83
83
|
Commands: auth, login, search, track, user, playlist, stream, resolve, me, likes
|
|
84
84
|
Options: --json (raw JSON output), --help (per-command help)
|
package/dist/cli.js
CHANGED
|
@@ -50,7 +50,7 @@ var isNoColor = !!process.env["NO_COLOR"];
|
|
|
50
50
|
function col(color, text) {
|
|
51
51
|
return isNoColor ? text : `${color}${text}${c.reset}`;
|
|
52
52
|
}
|
|
53
|
-
var CONFIG_PATH = path__namespace.join(os__namespace.homedir(), ".
|
|
53
|
+
var CONFIG_PATH = path__namespace.join(os__namespace.homedir(), ".sc-cli.json");
|
|
54
54
|
function loadConfig() {
|
|
55
55
|
try {
|
|
56
56
|
return JSON.parse(fs__namespace.readFileSync(CONFIG_PATH, "utf-8"));
|
|
@@ -110,7 +110,7 @@ ${col(c.red, "\u2716")} ${msg}`);
|
|
|
110
110
|
}
|
|
111
111
|
function getClient(config) {
|
|
112
112
|
if (!config.clientId || !config.clientSecret) {
|
|
113
|
-
die("Not configured. Run `
|
|
113
|
+
die("Not configured. Run `sc-cli auth` first.");
|
|
114
114
|
}
|
|
115
115
|
const client = new chunkLNMDNQSC_js.SoundCloudClient({
|
|
116
116
|
clientId: config.clientId,
|
|
@@ -180,7 +180,7 @@ ${col(c.bold + c.cyan, "\u26A1 SoundCloud CLI Setup")}
|
|
|
180
180
|
async function cmdLogin() {
|
|
181
181
|
const config = loadConfig();
|
|
182
182
|
if (!config.clientId || !config.clientSecret) {
|
|
183
|
-
die("Not configured. Run `
|
|
183
|
+
die("Not configured. Run `sc-cli auth` first.");
|
|
184
184
|
}
|
|
185
185
|
const verifier = chunkLNMDNQSC_js.generateCodeVerifier();
|
|
186
186
|
const challenge = await chunkLNMDNQSC_js.generateCodeChallenge(verifier);
|
|
@@ -243,16 +243,16 @@ ${col(c.bold + c.cyan, "\u26A1 SoundCloud OAuth Login")}
|
|
|
243
243
|
async function cmdSearch(args) {
|
|
244
244
|
if (args.flags["help"]) {
|
|
245
245
|
console.log(`
|
|
246
|
-
${col(c.bold, "Usage:")}
|
|
246
|
+
${col(c.bold, "Usage:")} sc-cli search <query> [--json]
|
|
247
247
|
|
|
248
248
|
${col(c.bold, "Examples:")}
|
|
249
|
-
|
|
250
|
-
|
|
249
|
+
sc-cli search "lofi hip hop"
|
|
250
|
+
sc-cli search deadmau5 --json
|
|
251
251
|
`);
|
|
252
252
|
return;
|
|
253
253
|
}
|
|
254
254
|
const query = args.positional.join(" ");
|
|
255
|
-
if (!query) die("Usage:
|
|
255
|
+
if (!query) die("Usage: sc-cli search <query>");
|
|
256
256
|
const config = loadConfig();
|
|
257
257
|
const client = getClient(config);
|
|
258
258
|
await ensureToken(client, config);
|
|
@@ -288,16 +288,16 @@ ${col(c.bold + c.cyan, `\u26A1 Search results for "${query}"`)}
|
|
|
288
288
|
async function cmdTrack(args) {
|
|
289
289
|
if (args.flags["help"]) {
|
|
290
290
|
console.log(`
|
|
291
|
-
${col(c.bold, "Usage:")}
|
|
291
|
+
${col(c.bold, "Usage:")} sc-cli track <id> [--json]
|
|
292
292
|
|
|
293
293
|
${col(c.bold, "Examples:")}
|
|
294
|
-
|
|
295
|
-
|
|
294
|
+
sc-cli track 123456
|
|
295
|
+
sc-cli track 123456 --json
|
|
296
296
|
`);
|
|
297
297
|
return;
|
|
298
298
|
}
|
|
299
299
|
const id = args.positional[0];
|
|
300
|
-
if (!id) die("Usage:
|
|
300
|
+
if (!id) die("Usage: sc-cli track <id>");
|
|
301
301
|
const config = loadConfig();
|
|
302
302
|
const client = getClient(config);
|
|
303
303
|
await ensureToken(client, config);
|
|
@@ -324,15 +324,15 @@ ${col(c.bold + c.cyan, "\u26A1 Track Details")}
|
|
|
324
324
|
async function cmdUser(args) {
|
|
325
325
|
if (args.flags["help"]) {
|
|
326
326
|
console.log(`
|
|
327
|
-
${col(c.bold, "Usage:")}
|
|
327
|
+
${col(c.bold, "Usage:")} sc-cli user <id> [--json]
|
|
328
328
|
|
|
329
329
|
${col(c.bold, "Examples:")}
|
|
330
|
-
|
|
330
|
+
sc-cli user 123456
|
|
331
331
|
`);
|
|
332
332
|
return;
|
|
333
333
|
}
|
|
334
334
|
const id = args.positional[0];
|
|
335
|
-
if (!id) die("Usage:
|
|
335
|
+
if (!id) die("Usage: sc-cli user <id>");
|
|
336
336
|
const config = loadConfig();
|
|
337
337
|
const client = getClient(config);
|
|
338
338
|
await ensureToken(client, config);
|
|
@@ -357,15 +357,15 @@ ${col(c.bold + c.cyan, "\u26A1 User Profile")}
|
|
|
357
357
|
async function cmdPlaylist(args) {
|
|
358
358
|
if (args.flags["help"]) {
|
|
359
359
|
console.log(`
|
|
360
|
-
${col(c.bold, "Usage:")}
|
|
360
|
+
${col(c.bold, "Usage:")} sc-cli playlist <id> [--json]
|
|
361
361
|
|
|
362
362
|
${col(c.bold, "Examples:")}
|
|
363
|
-
|
|
363
|
+
sc-cli playlist 123456
|
|
364
364
|
`);
|
|
365
365
|
return;
|
|
366
366
|
}
|
|
367
367
|
const id = args.positional[0];
|
|
368
|
-
if (!id) die("Usage:
|
|
368
|
+
if (!id) die("Usage: sc-cli playlist <id>");
|
|
369
369
|
const config = loadConfig();
|
|
370
370
|
const client = getClient(config);
|
|
371
371
|
await ensureToken(client, config);
|
|
@@ -400,15 +400,15 @@ ${col(c.bold + c.cyan, "\u26A1 Playlist")}
|
|
|
400
400
|
async function cmdStream(args) {
|
|
401
401
|
if (args.flags["help"]) {
|
|
402
402
|
console.log(`
|
|
403
|
-
${col(c.bold, "Usage:")}
|
|
403
|
+
${col(c.bold, "Usage:")} sc-cli stream <id> [--json]
|
|
404
404
|
|
|
405
405
|
${col(c.bold, "Examples:")}
|
|
406
|
-
|
|
406
|
+
sc-cli stream 123456
|
|
407
407
|
`);
|
|
408
408
|
return;
|
|
409
409
|
}
|
|
410
410
|
const id = args.positional[0];
|
|
411
|
-
if (!id) die("Usage:
|
|
411
|
+
if (!id) die("Usage: sc-cli stream <id>");
|
|
412
412
|
const config = loadConfig();
|
|
413
413
|
const client = getClient(config);
|
|
414
414
|
await ensureToken(client, config);
|
|
@@ -436,15 +436,15 @@ ${col(c.bold + c.cyan, "\u26A1 Stream URLs")}
|
|
|
436
436
|
async function cmdResolve(args) {
|
|
437
437
|
if (args.flags["help"]) {
|
|
438
438
|
console.log(`
|
|
439
|
-
${col(c.bold, "Usage:")}
|
|
439
|
+
${col(c.bold, "Usage:")} sc-cli resolve <url> [--json]
|
|
440
440
|
|
|
441
441
|
${col(c.bold, "Examples:")}
|
|
442
|
-
|
|
442
|
+
sc-cli resolve https://soundcloud.com/artist/track
|
|
443
443
|
`);
|
|
444
444
|
return;
|
|
445
445
|
}
|
|
446
446
|
const url = args.positional[0];
|
|
447
|
-
if (!url) die("Usage:
|
|
447
|
+
if (!url) die("Usage: sc-cli resolve <url>");
|
|
448
448
|
const config = loadConfig();
|
|
449
449
|
const client = getClient(config);
|
|
450
450
|
await ensureToken(client, config);
|
|
@@ -468,16 +468,16 @@ ${col(c.green, "\u2714")} Resolved:
|
|
|
468
468
|
async function cmdMe(args) {
|
|
469
469
|
if (args.flags["help"]) {
|
|
470
470
|
console.log(`
|
|
471
|
-
${col(c.bold, "Usage:")}
|
|
471
|
+
${col(c.bold, "Usage:")} sc-cli me [--json]
|
|
472
472
|
|
|
473
|
-
Shows the authenticated user's profile. Requires \`
|
|
473
|
+
Shows the authenticated user's profile. Requires \`sc-cli login\` first.
|
|
474
474
|
`);
|
|
475
475
|
return;
|
|
476
476
|
}
|
|
477
477
|
const config = loadConfig();
|
|
478
478
|
const client = getClient(config);
|
|
479
479
|
if (!client.accessToken) {
|
|
480
|
-
die("Not logged in. Run `
|
|
480
|
+
die("Not logged in. Run `sc-cli login` first.");
|
|
481
481
|
}
|
|
482
482
|
const spinner = createSpinner("Fetching profile\u2026");
|
|
483
483
|
const me = await client.me.getMe();
|
|
@@ -501,16 +501,16 @@ ${col(c.bold + c.cyan, "\u26A1 Your Profile")}
|
|
|
501
501
|
async function cmdLikes(args) {
|
|
502
502
|
if (args.flags["help"]) {
|
|
503
503
|
console.log(`
|
|
504
|
-
${col(c.bold, "Usage:")}
|
|
504
|
+
${col(c.bold, "Usage:")} sc-cli likes [--json]
|
|
505
505
|
|
|
506
|
-
Shows your liked tracks. Requires \`
|
|
506
|
+
Shows your liked tracks. Requires \`sc-cli login\` first.
|
|
507
507
|
`);
|
|
508
508
|
return;
|
|
509
509
|
}
|
|
510
510
|
const config = loadConfig();
|
|
511
511
|
const client = getClient(config);
|
|
512
512
|
if (!client.accessToken) {
|
|
513
|
-
die("Not logged in. Run `
|
|
513
|
+
die("Not logged in. Run `sc-cli login` first.");
|
|
514
514
|
}
|
|
515
515
|
const spinner = createSpinner("Fetching likes\u2026");
|
|
516
516
|
const likes = await client.me.getLikesTracks(20);
|
|
@@ -542,9 +542,9 @@ ${col(c.bold + c.cyan, "\u26A1 Your Liked Tracks")}
|
|
|
542
542
|
}
|
|
543
543
|
function showHelp() {
|
|
544
544
|
console.log(`
|
|
545
|
-
${col(c.bold + c.cyan, "\u26A1
|
|
545
|
+
${col(c.bold + c.cyan, "\u26A1 sc-cli")} ${col(c.dim, "\u2014 Explore the SoundCloud API from your terminal")}
|
|
546
546
|
|
|
547
|
-
${col(c.bold, "Usage:")}
|
|
547
|
+
${col(c.bold, "Usage:")} sc-cli <command> [options]
|
|
548
548
|
|
|
549
549
|
${col(c.bold, "Setup:")}
|
|
550
550
|
${col(c.green, "auth")} Set up API credentials (client_id + client_secret)
|
|
@@ -565,12 +565,12 @@ ${col(c.bold, "Options:")}
|
|
|
565
565
|
${col(c.yellow, "--help")} Show help for a command
|
|
566
566
|
|
|
567
567
|
${col(c.bold, "Examples:")}
|
|
568
|
-
${col(c.dim, "$")}
|
|
569
|
-
${col(c.dim, "$")}
|
|
570
|
-
${col(c.dim, "$")}
|
|
571
|
-
${col(c.dim, "$")}
|
|
572
|
-
${col(c.dim, "$")}
|
|
573
|
-
${col(c.dim, "$")}
|
|
568
|
+
${col(c.dim, "$")} sc-cli auth
|
|
569
|
+
${col(c.dim, "$")} sc-cli search "lofi beats"
|
|
570
|
+
${col(c.dim, "$")} sc-cli track 293 --json
|
|
571
|
+
${col(c.dim, "$")} sc-cli resolve https://soundcloud.com/artist/track
|
|
572
|
+
${col(c.dim, "$")} sc-cli login
|
|
573
|
+
${col(c.dim, "$")} sc-cli me
|
|
574
574
|
|
|
575
575
|
${col(c.dim, "Config:")} ${CONFIG_PATH}
|
|
576
576
|
${col(c.dim, "Powered by")} soundcloud-api-ts
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"names":["path","os","fs","readline","SoundCloudClient","generateCodeVerifier","generateCodeChallenge","http"],"mappings":"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","file":"cli.js","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\";\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(), \".soundcloud-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 `soundcloud-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 `soundcloud-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:\")} soundcloud-cli search <query> [--json]\n\n${col(c.bold, \"Examples:\")}\n soundcloud-cli search \"lofi hip hop\"\n soundcloud-cli search deadmau5 --json\n`);\n return;\n }\n\n const query = args.positional.join(\" \");\n if (!query) die(\"Usage: soundcloud-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:\")} soundcloud-cli track <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n soundcloud-cli track 123456\n soundcloud-cli track 123456 --json\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: soundcloud-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:\")} soundcloud-cli user <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n soundcloud-cli user 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: soundcloud-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:\")} soundcloud-cli playlist <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n soundcloud-cli playlist 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: soundcloud-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:\")} soundcloud-cli stream <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n soundcloud-cli stream 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: soundcloud-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:\")} soundcloud-cli resolve <url> [--json]\n\n${col(c.bold, \"Examples:\")}\n soundcloud-cli resolve https://soundcloud.com/artist/track\n`);\n return;\n }\n\n const url = args.positional[0];\n if (!url) die(\"Usage: soundcloud-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:\")} soundcloud-cli me [--json]\n\nShows the authenticated user's profile. Requires \\`soundcloud-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 `soundcloud-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:\")} soundcloud-cli likes [--json]\n\nShows your liked tracks. Requires \\`soundcloud-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 `soundcloud-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\nfunction showHelp(): void {\n console.log(`\n${col(c.bold + c.cyan, \"⚡ soundcloud-cli\")} ${col(c.dim, \"— Explore the SoundCloud API from your terminal\")}\n\n${col(c.bold, \"Usage:\")} soundcloud-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, \"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, \"$\")} soundcloud-cli auth\n ${col(c.dim, \"$\")} soundcloud-cli search \"lofi beats\"\n ${col(c.dim, \"$\")} soundcloud-cli track 293 --json\n ${col(c.dim, \"$\")} soundcloud-cli resolve https://soundcloud.com/artist/track\n ${col(c.dim, \"$\")} soundcloud-cli login\n ${col(c.dim, \"$\")} soundcloud-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\", \"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 \"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":["path","os","fs","readline","SoundCloudClient","generateCodeVerifier","generateCodeChallenge","http"],"mappings":"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","file":"cli.js","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\";\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\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, \"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 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\", \"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 \"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/cli.mjs
CHANGED
|
@@ -24,7 +24,7 @@ var isNoColor = !!process.env["NO_COLOR"];
|
|
|
24
24
|
function col(color, text) {
|
|
25
25
|
return isNoColor ? text : `${color}${text}${c.reset}`;
|
|
26
26
|
}
|
|
27
|
-
var CONFIG_PATH = path.join(os.homedir(), ".
|
|
27
|
+
var CONFIG_PATH = path.join(os.homedir(), ".sc-cli.json");
|
|
28
28
|
function loadConfig() {
|
|
29
29
|
try {
|
|
30
30
|
return JSON.parse(fs.readFileSync(CONFIG_PATH, "utf-8"));
|
|
@@ -84,7 +84,7 @@ ${col(c.red, "\u2716")} ${msg}`);
|
|
|
84
84
|
}
|
|
85
85
|
function getClient(config) {
|
|
86
86
|
if (!config.clientId || !config.clientSecret) {
|
|
87
|
-
die("Not configured. Run `
|
|
87
|
+
die("Not configured. Run `sc-cli auth` first.");
|
|
88
88
|
}
|
|
89
89
|
const client = new SoundCloudClient({
|
|
90
90
|
clientId: config.clientId,
|
|
@@ -154,7 +154,7 @@ ${col(c.bold + c.cyan, "\u26A1 SoundCloud CLI Setup")}
|
|
|
154
154
|
async function cmdLogin() {
|
|
155
155
|
const config = loadConfig();
|
|
156
156
|
if (!config.clientId || !config.clientSecret) {
|
|
157
|
-
die("Not configured. Run `
|
|
157
|
+
die("Not configured. Run `sc-cli auth` first.");
|
|
158
158
|
}
|
|
159
159
|
const verifier = generateCodeVerifier();
|
|
160
160
|
const challenge = await generateCodeChallenge(verifier);
|
|
@@ -217,16 +217,16 @@ ${col(c.bold + c.cyan, "\u26A1 SoundCloud OAuth Login")}
|
|
|
217
217
|
async function cmdSearch(args) {
|
|
218
218
|
if (args.flags["help"]) {
|
|
219
219
|
console.log(`
|
|
220
|
-
${col(c.bold, "Usage:")}
|
|
220
|
+
${col(c.bold, "Usage:")} sc-cli search <query> [--json]
|
|
221
221
|
|
|
222
222
|
${col(c.bold, "Examples:")}
|
|
223
|
-
|
|
224
|
-
|
|
223
|
+
sc-cli search "lofi hip hop"
|
|
224
|
+
sc-cli search deadmau5 --json
|
|
225
225
|
`);
|
|
226
226
|
return;
|
|
227
227
|
}
|
|
228
228
|
const query = args.positional.join(" ");
|
|
229
|
-
if (!query) die("Usage:
|
|
229
|
+
if (!query) die("Usage: sc-cli search <query>");
|
|
230
230
|
const config = loadConfig();
|
|
231
231
|
const client = getClient(config);
|
|
232
232
|
await ensureToken(client, config);
|
|
@@ -262,16 +262,16 @@ ${col(c.bold + c.cyan, `\u26A1 Search results for "${query}"`)}
|
|
|
262
262
|
async function cmdTrack(args) {
|
|
263
263
|
if (args.flags["help"]) {
|
|
264
264
|
console.log(`
|
|
265
|
-
${col(c.bold, "Usage:")}
|
|
265
|
+
${col(c.bold, "Usage:")} sc-cli track <id> [--json]
|
|
266
266
|
|
|
267
267
|
${col(c.bold, "Examples:")}
|
|
268
|
-
|
|
269
|
-
|
|
268
|
+
sc-cli track 123456
|
|
269
|
+
sc-cli track 123456 --json
|
|
270
270
|
`);
|
|
271
271
|
return;
|
|
272
272
|
}
|
|
273
273
|
const id = args.positional[0];
|
|
274
|
-
if (!id) die("Usage:
|
|
274
|
+
if (!id) die("Usage: sc-cli track <id>");
|
|
275
275
|
const config = loadConfig();
|
|
276
276
|
const client = getClient(config);
|
|
277
277
|
await ensureToken(client, config);
|
|
@@ -298,15 +298,15 @@ ${col(c.bold + c.cyan, "\u26A1 Track Details")}
|
|
|
298
298
|
async function cmdUser(args) {
|
|
299
299
|
if (args.flags["help"]) {
|
|
300
300
|
console.log(`
|
|
301
|
-
${col(c.bold, "Usage:")}
|
|
301
|
+
${col(c.bold, "Usage:")} sc-cli user <id> [--json]
|
|
302
302
|
|
|
303
303
|
${col(c.bold, "Examples:")}
|
|
304
|
-
|
|
304
|
+
sc-cli user 123456
|
|
305
305
|
`);
|
|
306
306
|
return;
|
|
307
307
|
}
|
|
308
308
|
const id = args.positional[0];
|
|
309
|
-
if (!id) die("Usage:
|
|
309
|
+
if (!id) die("Usage: sc-cli user <id>");
|
|
310
310
|
const config = loadConfig();
|
|
311
311
|
const client = getClient(config);
|
|
312
312
|
await ensureToken(client, config);
|
|
@@ -331,15 +331,15 @@ ${col(c.bold + c.cyan, "\u26A1 User Profile")}
|
|
|
331
331
|
async function cmdPlaylist(args) {
|
|
332
332
|
if (args.flags["help"]) {
|
|
333
333
|
console.log(`
|
|
334
|
-
${col(c.bold, "Usage:")}
|
|
334
|
+
${col(c.bold, "Usage:")} sc-cli playlist <id> [--json]
|
|
335
335
|
|
|
336
336
|
${col(c.bold, "Examples:")}
|
|
337
|
-
|
|
337
|
+
sc-cli playlist 123456
|
|
338
338
|
`);
|
|
339
339
|
return;
|
|
340
340
|
}
|
|
341
341
|
const id = args.positional[0];
|
|
342
|
-
if (!id) die("Usage:
|
|
342
|
+
if (!id) die("Usage: sc-cli playlist <id>");
|
|
343
343
|
const config = loadConfig();
|
|
344
344
|
const client = getClient(config);
|
|
345
345
|
await ensureToken(client, config);
|
|
@@ -374,15 +374,15 @@ ${col(c.bold + c.cyan, "\u26A1 Playlist")}
|
|
|
374
374
|
async function cmdStream(args) {
|
|
375
375
|
if (args.flags["help"]) {
|
|
376
376
|
console.log(`
|
|
377
|
-
${col(c.bold, "Usage:")}
|
|
377
|
+
${col(c.bold, "Usage:")} sc-cli stream <id> [--json]
|
|
378
378
|
|
|
379
379
|
${col(c.bold, "Examples:")}
|
|
380
|
-
|
|
380
|
+
sc-cli stream 123456
|
|
381
381
|
`);
|
|
382
382
|
return;
|
|
383
383
|
}
|
|
384
384
|
const id = args.positional[0];
|
|
385
|
-
if (!id) die("Usage:
|
|
385
|
+
if (!id) die("Usage: sc-cli stream <id>");
|
|
386
386
|
const config = loadConfig();
|
|
387
387
|
const client = getClient(config);
|
|
388
388
|
await ensureToken(client, config);
|
|
@@ -410,15 +410,15 @@ ${col(c.bold + c.cyan, "\u26A1 Stream URLs")}
|
|
|
410
410
|
async function cmdResolve(args) {
|
|
411
411
|
if (args.flags["help"]) {
|
|
412
412
|
console.log(`
|
|
413
|
-
${col(c.bold, "Usage:")}
|
|
413
|
+
${col(c.bold, "Usage:")} sc-cli resolve <url> [--json]
|
|
414
414
|
|
|
415
415
|
${col(c.bold, "Examples:")}
|
|
416
|
-
|
|
416
|
+
sc-cli resolve https://soundcloud.com/artist/track
|
|
417
417
|
`);
|
|
418
418
|
return;
|
|
419
419
|
}
|
|
420
420
|
const url = args.positional[0];
|
|
421
|
-
if (!url) die("Usage:
|
|
421
|
+
if (!url) die("Usage: sc-cli resolve <url>");
|
|
422
422
|
const config = loadConfig();
|
|
423
423
|
const client = getClient(config);
|
|
424
424
|
await ensureToken(client, config);
|
|
@@ -442,16 +442,16 @@ ${col(c.green, "\u2714")} Resolved:
|
|
|
442
442
|
async function cmdMe(args) {
|
|
443
443
|
if (args.flags["help"]) {
|
|
444
444
|
console.log(`
|
|
445
|
-
${col(c.bold, "Usage:")}
|
|
445
|
+
${col(c.bold, "Usage:")} sc-cli me [--json]
|
|
446
446
|
|
|
447
|
-
Shows the authenticated user's profile. Requires \`
|
|
447
|
+
Shows the authenticated user's profile. Requires \`sc-cli login\` first.
|
|
448
448
|
`);
|
|
449
449
|
return;
|
|
450
450
|
}
|
|
451
451
|
const config = loadConfig();
|
|
452
452
|
const client = getClient(config);
|
|
453
453
|
if (!client.accessToken) {
|
|
454
|
-
die("Not logged in. Run `
|
|
454
|
+
die("Not logged in. Run `sc-cli login` first.");
|
|
455
455
|
}
|
|
456
456
|
const spinner = createSpinner("Fetching profile\u2026");
|
|
457
457
|
const me = await client.me.getMe();
|
|
@@ -475,16 +475,16 @@ ${col(c.bold + c.cyan, "\u26A1 Your Profile")}
|
|
|
475
475
|
async function cmdLikes(args) {
|
|
476
476
|
if (args.flags["help"]) {
|
|
477
477
|
console.log(`
|
|
478
|
-
${col(c.bold, "Usage:")}
|
|
478
|
+
${col(c.bold, "Usage:")} sc-cli likes [--json]
|
|
479
479
|
|
|
480
|
-
Shows your liked tracks. Requires \`
|
|
480
|
+
Shows your liked tracks. Requires \`sc-cli login\` first.
|
|
481
481
|
`);
|
|
482
482
|
return;
|
|
483
483
|
}
|
|
484
484
|
const config = loadConfig();
|
|
485
485
|
const client = getClient(config);
|
|
486
486
|
if (!client.accessToken) {
|
|
487
|
-
die("Not logged in. Run `
|
|
487
|
+
die("Not logged in. Run `sc-cli login` first.");
|
|
488
488
|
}
|
|
489
489
|
const spinner = createSpinner("Fetching likes\u2026");
|
|
490
490
|
const likes = await client.me.getLikesTracks(20);
|
|
@@ -516,9 +516,9 @@ ${col(c.bold + c.cyan, "\u26A1 Your Liked Tracks")}
|
|
|
516
516
|
}
|
|
517
517
|
function showHelp() {
|
|
518
518
|
console.log(`
|
|
519
|
-
${col(c.bold + c.cyan, "\u26A1
|
|
519
|
+
${col(c.bold + c.cyan, "\u26A1 sc-cli")} ${col(c.dim, "\u2014 Explore the SoundCloud API from your terminal")}
|
|
520
520
|
|
|
521
|
-
${col(c.bold, "Usage:")}
|
|
521
|
+
${col(c.bold, "Usage:")} sc-cli <command> [options]
|
|
522
522
|
|
|
523
523
|
${col(c.bold, "Setup:")}
|
|
524
524
|
${col(c.green, "auth")} Set up API credentials (client_id + client_secret)
|
|
@@ -539,12 +539,12 @@ ${col(c.bold, "Options:")}
|
|
|
539
539
|
${col(c.yellow, "--help")} Show help for a command
|
|
540
540
|
|
|
541
541
|
${col(c.bold, "Examples:")}
|
|
542
|
-
${col(c.dim, "$")}
|
|
543
|
-
${col(c.dim, "$")}
|
|
544
|
-
${col(c.dim, "$")}
|
|
545
|
-
${col(c.dim, "$")}
|
|
546
|
-
${col(c.dim, "$")}
|
|
547
|
-
${col(c.dim, "$")}
|
|
542
|
+
${col(c.dim, "$")} sc-cli auth
|
|
543
|
+
${col(c.dim, "$")} sc-cli search "lofi beats"
|
|
544
|
+
${col(c.dim, "$")} sc-cli track 293 --json
|
|
545
|
+
${col(c.dim, "$")} sc-cli resolve https://soundcloud.com/artist/track
|
|
546
|
+
${col(c.dim, "$")} sc-cli login
|
|
547
|
+
${col(c.dim, "$")} sc-cli me
|
|
548
548
|
|
|
549
549
|
${col(c.dim, "Config:")} ${CONFIG_PATH}
|
|
550
550
|
${col(c.dim, "Powered by")} soundcloud-api-ts
|
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\";\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(), \".soundcloud-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 `soundcloud-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 `soundcloud-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:\")} soundcloud-cli search <query> [--json]\n\n${col(c.bold, \"Examples:\")}\n soundcloud-cli search \"lofi hip hop\"\n soundcloud-cli search deadmau5 --json\n`);\n return;\n }\n\n const query = args.positional.join(\" \");\n if (!query) die(\"Usage: soundcloud-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:\")} soundcloud-cli track <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n soundcloud-cli track 123456\n soundcloud-cli track 123456 --json\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: soundcloud-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:\")} soundcloud-cli user <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n soundcloud-cli user 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: soundcloud-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:\")} soundcloud-cli playlist <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n soundcloud-cli playlist 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: soundcloud-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:\")} soundcloud-cli stream <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n soundcloud-cli stream 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: soundcloud-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:\")} soundcloud-cli resolve <url> [--json]\n\n${col(c.bold, \"Examples:\")}\n soundcloud-cli resolve https://soundcloud.com/artist/track\n`);\n return;\n }\n\n const url = args.positional[0];\n if (!url) die(\"Usage: soundcloud-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:\")} soundcloud-cli me [--json]\n\nShows the authenticated user's profile. Requires \\`soundcloud-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 `soundcloud-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:\")} soundcloud-cli likes [--json]\n\nShows your liked tracks. Requires \\`soundcloud-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 `soundcloud-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\nfunction showHelp(): void {\n console.log(`\n${col(c.bold + c.cyan, \"⚡ soundcloud-cli\")} ${col(c.dim, \"— Explore the SoundCloud API from your terminal\")}\n\n${col(c.bold, \"Usage:\")} soundcloud-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, \"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, \"$\")} soundcloud-cli auth\n ${col(c.dim, \"$\")} soundcloud-cli search \"lofi beats\"\n ${col(c.dim, \"$\")} soundcloud-cli track 293 --json\n ${col(c.dim, \"$\")} soundcloud-cli resolve https://soundcloud.com/artist/track\n ${col(c.dim, \"$\")} soundcloud-cli login\n ${col(c.dim, \"$\")} soundcloud-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\", \"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 \"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\";\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\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, \"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 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\", \"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 \"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/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "soundcloud-api-ts",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.2",
|
|
4
4
|
"description": "A TypeScript client for the SoundCloud API. Zero dependencies, native fetch, full OAuth 2.0 + PKCE support.",
|
|
5
5
|
"bin": {
|
|
6
|
+
"sc-cli": "./dist/cli.js",
|
|
6
7
|
"soundcloud-cli": "./dist/cli.js"
|
|
7
8
|
},
|
|
8
9
|
"main": "./dist/index.cjs",
|