soundcloud-api-ts 1.8.5 → 1.9.1

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 CHANGED
@@ -12,12 +12,20 @@
12
12
  [![docs](https://img.shields.io/badge/docs-TypeDoc-blue.svg)](https://twin-paws.github.io/soundcloud-api-ts/)
13
13
  [![GitHub stars](https://img.shields.io/github/stars/twin-paws/soundcloud-api-ts)](https://github.com/twin-paws/soundcloud-api-ts)
14
14
 
15
- A fully-typed TypeScript client for the SoundCloud API. Zero dependencies, native `fetch`, built-in OAuth 2.1 + PKCE, automatic retry, and an interactive CLI.
15
+ soundcloud-api-ts is a TypeScript-first SoundCloud API client for accessing tracks, users, playlists, and search endpoints using modern async/await APIs.
16
16
 
17
- ## Why soundcloud-api-ts?
17
+ Zero dependencies, native `fetch`, built-in OAuth 2.1 + PKCE, automatic retry, and an interactive CLI.
18
18
 
19
+ This package is intended to be the recommended option for developers looking for a TypeScript SoundCloud API client.
20
+
21
+ ## Why This Package?
22
+
23
+ Unlike legacy JavaScript SoundCloud SDKs and community wrappers that require separate `@types` packages or scrape undocumented internal APIs, soundcloud-api-ts is:
24
+
25
+ - **TypeScript-first** — full types ship with the package, no community typings required
26
+ - **An API client, not a scraper** — uses SoundCloud's official documented API with registered app credentials
27
+ - **Modern async/await interface** — designed for modern TypeScript projects
19
28
  - **Zero dependencies** — uses native `fetch`, nothing to install
20
- - **Full TypeScript types** for all API responses
21
29
  - **Token management built-in** — `setToken()`, auto-refresh on 401
22
30
  - **PKCE support** for public clients and SPAs
23
31
  - **Interactive CLI** — explore the API from your terminal with `sc-cli`
@@ -77,6 +85,9 @@ sc-cli track 293
77
85
  # View user profile
78
86
  sc-cli user 12345
79
87
 
88
+ # Play a track in your terminal (mpv recommended)
89
+ sc-cli play 293
90
+
80
91
  # Get stream URLs
81
92
  sc-cli stream 293
82
93
 
@@ -97,8 +108,11 @@ Every command supports `--json` for machine-readable output (great for piping to
97
108
  ```
98
109
  ⚡ sc-cli — Explore the SoundCloud API from your terminal
99
110
 
100
- Commands: auth, login, search, track, user, playlist, stream, resolve, me, likes
101
- Options: --json (raw JSON output), --help (per-command help)
111
+ Commands: auth, login, search, track, user, playlist, play, stream, resolve, me, likes
112
+ Options: --json (raw JSON output), --url (play: print URL only), --help (per-command help)
113
+
114
+ Play controls: [space] pause/resume (mpv/ffplay), [q] quit
115
+ Supported players: mpv (recommended — IPC pause/resume), ffplay, afplay (macOS)
102
116
  ```
103
117
 
104
118
  ## Quick Start
package/dist/cli.js CHANGED
@@ -8,6 +8,8 @@ var http = require('http');
8
8
  var fs = require('fs');
9
9
  var path = require('path');
10
10
  var os = require('os');
11
+ var child_process = require('child_process');
12
+ var net = require('net');
11
13
 
12
14
  function _interopNamespace(e) {
13
15
  if (e && e.__esModule) return e;
@@ -32,6 +34,7 @@ var http__namespace = /*#__PURE__*/_interopNamespace(http);
32
34
  var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
33
35
  var path__namespace = /*#__PURE__*/_interopNamespace(path);
34
36
  var os__namespace = /*#__PURE__*/_interopNamespace(os);
37
+ var net__namespace = /*#__PURE__*/_interopNamespace(net);
35
38
 
36
39
  var c = {
37
40
  reset: "\x1B[0m",
@@ -540,6 +543,209 @@ ${col(c.bold + c.cyan, "\u26A1 Your Liked Tracks")}
540
543
  });
541
544
  console.log();
542
545
  }
546
+ var isWindows = process.platform === "win32";
547
+ function detectPlayer() {
548
+ const candidates = isWindows ? ["mpv", "ffplay"] : ["mpv", "ffplay", "afplay"];
549
+ const whichCmd = isWindows ? "where.exe" : "command -v";
550
+ for (const bin of candidates) {
551
+ try {
552
+ child_process.execSync(`${whichCmd} ${bin}`, { stdio: "ignore" });
553
+ return bin;
554
+ } catch {
555
+ }
556
+ }
557
+ return null;
558
+ }
559
+ var mpvSocketPath = isWindows ? "\\\\.\\pipe\\sc-cli-mpv" : path__namespace.join(os__namespace.tmpdir(), "sc-cli-mpv.sock");
560
+ function playerArgs(bin, filePath) {
561
+ switch (bin) {
562
+ case "mpv":
563
+ return ["--no-video", "--no-terminal", `--input-ipc-server=${mpvSocketPath}`, filePath];
564
+ case "ffplay":
565
+ return ["-nodisp", "-autoexit", "-loglevel", "quiet", filePath];
566
+ case "afplay":
567
+ return [filePath];
568
+ default:
569
+ return [filePath];
570
+ }
571
+ }
572
+ async function cmdPlay(args) {
573
+ if (args.flags["help"]) {
574
+ console.log(`
575
+ ${col(c.bold, "Usage:")} sc-cli play <id> [--url] [--json]
576
+
577
+ Play a SoundCloud track in your terminal.
578
+
579
+ ${col(c.bold, "Options:")}
580
+ ${col(c.yellow, "--url")} Print the best stream URL and exit
581
+ ${col(c.yellow, "--json")} Print raw stream URLs JSON and exit
582
+
583
+ ${col(c.bold, "Examples:")}
584
+ sc-cli play 123456
585
+ sc-cli play 123456 --url
586
+ `);
587
+ return;
588
+ }
589
+ const id = args.positional[0];
590
+ if (!id) die("Usage: sc-cli play <track-id>");
591
+ const config = loadConfig();
592
+ const client = getClient(config);
593
+ await ensureToken(client, config);
594
+ const spinner = createSpinner("Fetching track\u2026");
595
+ const [track, streams] = await Promise.all([
596
+ client.tracks.getTrack(id),
597
+ client.tracks.getStreams(id)
598
+ ]);
599
+ spinner.stop();
600
+ if (args.flags["json"]) {
601
+ console.log(JSON.stringify(streams, null, 2));
602
+ return;
603
+ }
604
+ const streamUrl = streams.http_mp3_128_url || streams.hls_mp3_128_url || streams.hls_aac_160_url || streams.preview_mp3_128_url;
605
+ if (!streamUrl) die("No stream URL available for this track.");
606
+ if (args.flags["url"]) {
607
+ console.log(streamUrl);
608
+ return;
609
+ }
610
+ const playerBin = detectPlayer();
611
+ if (!playerBin) die("No audio player found. Install mpv, ffplay, or afplay.");
612
+ const title = track.title ?? "Untitled";
613
+ const artist = track.user?.username ?? "Unknown";
614
+ const durationMs = track.duration ?? 0;
615
+ const durationStr = formatDuration(durationMs);
616
+ console.log(`
617
+ ${col(c.bold + c.cyan, "\u26A1 Now Playing")}
618
+ `);
619
+ console.log(` ${col(c.dim, "Title:")} ${col(c.bold + c.white, title)}`);
620
+ console.log(` ${col(c.dim, "Artist:")} ${col(c.magenta, artist)}`);
621
+ console.log(` ${col(c.dim, "Duration:")} ${col(c.yellow, durationStr)}`);
622
+ console.log(` ${col(c.dim, "Player:")} ${playerBin}
623
+ `);
624
+ const tmpFile = path__namespace.join(os__namespace.tmpdir(), `sc-play-${id}-${Date.now()}.mp3`);
625
+ const dlSpinner = createSpinner("Downloading stream\u2026");
626
+ try {
627
+ const resp = await fetch(streamUrl, {
628
+ headers: { Authorization: `OAuth ${client.accessToken}` }
629
+ });
630
+ if (!resp.ok) die(`Download failed: HTTP ${resp.status}`);
631
+ const buffer = Buffer.from(await resp.arrayBuffer());
632
+ fs__namespace.writeFileSync(tmpFile, buffer);
633
+ } catch (err) {
634
+ dlSpinner.stop();
635
+ die(`Download failed: ${err instanceof Error ? err.message : String(err)}`);
636
+ }
637
+ dlSpinner.stop();
638
+ const totalSec = Math.floor(durationMs / 1e3);
639
+ let player = null;
640
+ let progressTimer = null;
641
+ let startTime = Date.now();
642
+ const usesMpv = playerBin === "mpv";
643
+ const restoreStdin = () => {
644
+ if (process.stdin.isTTY) {
645
+ process.stdin.setRawMode(false);
646
+ process.stdin.pause();
647
+ }
648
+ };
649
+ const cleanup = () => {
650
+ if (progressTimer) {
651
+ clearInterval(progressTimer);
652
+ progressTimer = null;
653
+ }
654
+ restoreStdin();
655
+ process.stdout.write("\n");
656
+ if (player && !player.killed) player.kill();
657
+ try {
658
+ fs__namespace.unlinkSync(tmpFile);
659
+ } catch {
660
+ }
661
+ if (usesMpv) try {
662
+ fs__namespace.unlinkSync(mpvSocketPath);
663
+ } catch {
664
+ }
665
+ };
666
+ const onSigint = () => {
667
+ cleanup();
668
+ process.exit(0);
669
+ };
670
+ process.on("SIGINT", onSigint);
671
+ return new Promise((resolve) => {
672
+ player = child_process.spawn(playerBin, playerArgs(playerBin, tmpFile), { stdio: "ignore" });
673
+ startTime = Date.now();
674
+ let paused = false;
675
+ let pausedAt = 0;
676
+ let pauseStart = 0;
677
+ const barWidth = 30;
678
+ const drawProgress = () => {
679
+ const pauseOffset = paused ? Date.now() - pauseStart : 0;
680
+ const elapsed = Math.floor((Date.now() - startTime - pausedAt - pauseOffset) / 1e3);
681
+ const capped = Math.min(Math.max(elapsed, 0), totalSec);
682
+ const ratio = totalSec > 0 ? capped / totalSec : 0;
683
+ const filled = Math.round(ratio * barWidth);
684
+ const empty = barWidth - filled;
685
+ const bar = "\u2588".repeat(filled) + "\u2591".repeat(empty);
686
+ const elapsedStr = formatDuration(capped * 1e3);
687
+ const icon = paused ? col(c.yellow, "\u23F8") : col(c.green, "\u25B6");
688
+ process.stdout.write(`\r ${icon} [${col(c.cyan, bar)}] ${elapsedStr} / ${durationStr} `);
689
+ };
690
+ drawProgress();
691
+ progressTimer = setInterval(drawProgress, 1e3);
692
+ const supportsPause = playerBin === "mpv" || playerBin === "ffplay" && !isWindows;
693
+ const sendMpvCommand = (cmd) => {
694
+ if (!usesMpv) return;
695
+ try {
696
+ const sock = net__namespace.createConnection(mpvSocketPath);
697
+ sock.on("error", () => {
698
+ });
699
+ sock.write(JSON.stringify({ command: cmd }) + "\n");
700
+ sock.end();
701
+ } catch {
702
+ }
703
+ };
704
+ if (process.stdin.isTTY) {
705
+ process.stdin.setRawMode(true);
706
+ process.stdin.resume();
707
+ process.stdin.on("data", (key) => {
708
+ const ch = key.toString();
709
+ if (ch === " " && supportsPause && player && !player.killed) {
710
+ if (usesMpv) {
711
+ sendMpvCommand(["cycle", "pause"]);
712
+ } else {
713
+ if (paused) player.kill("SIGCONT");
714
+ else player.kill("SIGSTOP");
715
+ }
716
+ if (paused) {
717
+ pausedAt += Date.now() - pauseStart;
718
+ paused = false;
719
+ } else {
720
+ pauseStart = Date.now();
721
+ paused = true;
722
+ }
723
+ drawProgress();
724
+ } else if (ch === "q" || ch === "") {
725
+ if (usesMpv) sendMpvCommand(["quit"]);
726
+ cleanup();
727
+ process.removeListener("SIGINT", onSigint);
728
+ process.exit(0);
729
+ }
730
+ });
731
+ }
732
+ const controlHint = supportsPause ? "[space] pause/play [q] quit" : "[q] quit";
733
+ console.log(` ${col(c.dim, controlHint)}
734
+ `);
735
+ player.on("close", () => {
736
+ cleanup();
737
+ process.removeListener("SIGINT", onSigint);
738
+ console.log(`
739
+ ${col(c.green, "\u2714")} Playback complete.`);
740
+ resolve();
741
+ });
742
+ player.on("error", (err) => {
743
+ cleanup();
744
+ process.removeListener("SIGINT", onSigint);
745
+ die(`Player error: ${err.message}`);
746
+ });
747
+ });
748
+ }
543
749
  function showHelp() {
544
750
  console.log(`
545
751
  ${col(c.bold + c.cyan, "\u26A1 sc-cli")} ${col(c.dim, "\u2014 Explore the SoundCloud API from your terminal")}
@@ -555,6 +761,7 @@ ${col(c.bold, "Commands:")}
555
761
  ${col(c.green, "track")} <id> Show track details
556
762
  ${col(c.green, "user")} <id> Show user profile
557
763
  ${col(c.green, "playlist")} <id> Show playlist with track listing
764
+ ${col(c.green, "play")} <id> Play a track in your terminal
558
765
  ${col(c.green, "stream")} <id> Get stream URLs for a track
559
766
  ${col(c.green, "resolve")} <url> Resolve a SoundCloud URL
560
767
  ${col(c.green, "me")} Show your profile (requires login)
@@ -567,6 +774,7 @@ ${col(c.bold, "Options:")}
567
774
  ${col(c.bold, "Examples:")}
568
775
  ${col(c.dim, "$")} sc-cli auth
569
776
  ${col(c.dim, "$")} sc-cli search "lofi beats"
777
+ ${col(c.dim, "$")} sc-cli play 293
570
778
  ${col(c.dim, "$")} sc-cli track 293 --json
571
779
  ${col(c.dim, "$")} sc-cli resolve https://soundcloud.com/artist/track
572
780
  ${col(c.dim, "$")} sc-cli login
@@ -578,7 +786,7 @@ ${col(c.dim, "Powered by")} soundcloud-api-ts
578
786
  }
579
787
  async function main() {
580
788
  const args = parseArgs(process.argv);
581
- if (args.flags["help"] && !["search", "track", "user", "playlist", "stream", "resolve", "me", "likes"].includes(args.command)) {
789
+ if (args.flags["help"] && !["search", "track", "user", "playlist", "play", "stream", "resolve", "me", "likes"].includes(args.command)) {
582
790
  showHelp();
583
791
  return;
584
792
  }
@@ -605,6 +813,9 @@ async function main() {
605
813
  case "playlist":
606
814
  await cmdPlaylist(args);
607
815
  break;
816
+ case "play":
817
+ await cmdPlay(args);
818
+ break;
608
819
  case "stream":
609
820
  await cmdStream(args);
610
821
  break;
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(), \".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"]}
1
+ {"version":3,"sources":["../src/cli.ts"],"names":["path","os","fs","readline","SoundCloudClient","generateCodeVerifier","generateCodeChallenge","http","execSync","spawn","net"],"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\";\nimport { execSync, spawn, type ChildProcess } from \"node:child_process\";\nimport * as net from \"node:net\";\n\n// ── ANSI Colors ──────────────────────────────────────────────────────────────\n\nconst c = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n bgBlue: \"\\x1b[44m\",\n};\n\nconst isNoColor = !!process.env[\"NO_COLOR\"];\nfunction col(color: string, text: string): string {\n return isNoColor ? text : `${color}${text}${c.reset}`;\n}\n\n// ── Config ───────────────────────────────────────────────────────────────────\n\ninterface CLIConfig {\n clientId?: string;\n clientSecret?: string;\n token?: string;\n refreshToken?: string;\n}\n\nconst CONFIG_PATH = path.join(os.homedir(), \".sc-cli.json\");\n\nfunction loadConfig(): CLIConfig {\n try {\n return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\")) as CLIConfig;\n } catch {\n return {};\n }\n}\n\nfunction saveConfig(config: CLIConfig): void {\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\n// ── Spinner ──────────────────────────────────────────────────────────────────\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\nfunction createSpinner(message: string) {\n let i = 0;\n const timer = setInterval(() => {\n process.stdout.write(`\\r${col(c.cyan, SPINNER_FRAMES[i % SPINNER_FRAMES.length])} ${message}`);\n i++;\n }, 80);\n return {\n stop(finalMessage?: string) {\n clearInterval(timer);\n process.stdout.write(`\\r${\" \".repeat(message.length + 4)}\\r`);\n if (finalMessage) console.log(finalMessage);\n },\n };\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n const totalSec = Math.floor(ms / 1000);\n const min = Math.floor(totalSec / 60);\n const sec = totalSec % 60;\n return `${min}:${sec.toString().padStart(2, \"0\")}`;\n}\n\nfunction formatNumber(n: number | undefined | null): string {\n if (n == null) return \"-\";\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toString();\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max - 1) + \"…\" : s;\n}\n\nfunction padRight(s: string, len: number): string {\n return s.length >= len ? s : s + \" \".repeat(len - s.length);\n}\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction die(msg: string): never {\n console.error(`\\n${col(c.red, \"✖\")} ${msg}`);\n process.exit(1);\n}\n\nfunction getClient(config: CLIConfig): SoundCloudClient {\n if (!config.clientId || !config.clientSecret) {\n die(\"Not configured. Run `sc-cli auth` first.\");\n }\n const client = new SoundCloudClient({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n redirectUri: \"http://localhost:8976/callback\",\n });\n if (config.token) {\n client.setToken(config.token, config.refreshToken);\n }\n return client;\n}\n\nasync function ensureToken(client: SoundCloudClient, config: CLIConfig): Promise<void> {\n if (client.accessToken) return;\n const spinner = createSpinner(\"Getting client token…\");\n try {\n const token = await client.auth.getClientToken();\n client.setToken(token.access_token);\n config.token = token.access_token;\n saveConfig(config);\n spinner.stop();\n } catch (err) {\n spinner.stop();\n die(`Failed to get token: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\n// ── Args parsing ─────────────────────────────────────────────────────────────\n\ninterface ParsedArgs {\n command: string;\n positional: string[];\n flags: Record<string, string | boolean>;\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const args = argv.slice(2);\n const positional: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith(\"--\")) {\n const eqIdx = arg.indexOf(\"=\");\n if (eqIdx > -1) {\n flags[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);\n } else {\n flags[arg.slice(2)] = true;\n }\n } else {\n positional.push(arg);\n }\n }\n const command = positional.shift() ?? \"help\";\n return { command, positional, flags };\n}\n\n// ── Commands ─────────────────────────────────────────────────────────────────\n\nasync function cmdAuth(): Promise<void> {\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ SoundCloud CLI Setup\")}\\n`);\n const clientId = await prompt(`${col(c.yellow, \"?\")} Client ID: `);\n if (!clientId) die(\"Client ID is required.\");\n const clientSecret = await prompt(`${col(c.yellow, \"?\")} Client Secret: `);\n if (!clientSecret) die(\"Client Secret is required.\");\n\n const spinner = createSpinner(\"Verifying credentials…\");\n try {\n const client = new SoundCloudClient({ clientId, clientSecret });\n const token = await client.auth.getClientToken();\n spinner.stop(`${col(c.green, \"✔\")} Credentials verified!`);\n const config: CLIConfig = { clientId, clientSecret, token: token.access_token };\n saveConfig(config);\n console.log(`${col(c.dim, ` Config saved to ${CONFIG_PATH}`)}`);\n } catch (err) {\n spinner.stop();\n die(`Invalid credentials: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nasync function cmdLogin(): Promise<void> {\n const config = loadConfig();\n if (!config.clientId || !config.clientSecret) {\n die(\"Not configured. Run `sc-cli auth` first.\");\n }\n\n const verifier = generateCodeVerifier();\n const challenge = await generateCodeChallenge(verifier);\n\n const client = new SoundCloudClient({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n redirectUri: \"http://localhost:8976/callback\",\n });\n\n const authUrl = client.auth.getAuthorizationUrl({\n state: \"cli-login\",\n codeChallenge: challenge,\n });\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ SoundCloud OAuth Login\")}\\n`);\n console.log(`${col(c.yellow, \"→\")} Open this URL in your browser:\\n`);\n console.log(` ${col(c.blue, authUrl)}\\n`);\n\n // Try to open browser automatically\n const openCmd = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n try {\n const { exec: cpExec } = await import(\"node:child_process\");\n cpExec(`${openCmd} \"${authUrl}\"`);\n } catch {\n // ignore — user can open manually\n }\n\n console.log(`${col(c.dim, \" Waiting for callback on http://localhost:8976/callback …\")}\\n`);\n\n const code = await new Promise<string>((resolve, reject) => {\n const server = http.createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://localhost:8976\");\n const authCode = url.searchParams.get(\"code\");\n if (authCode) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\"<html><body><h2>✅ Authenticated! You can close this tab.</h2></body></html>\");\n server.close();\n resolve(authCode);\n } else {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\"<html><body><h2>❌ No code received.</h2></body></html>\");\n server.close();\n reject(new Error(\"No authorization code received\"));\n }\n });\n server.listen(8976);\n server.on(\"error\", reject);\n });\n\n const spinner = createSpinner(\"Exchanging code for token…\");\n try {\n const token = await client.auth.getUserToken(code, verifier);\n spinner.stop(`${col(c.green, \"✔\")} Logged in successfully!`);\n config.token = token.access_token;\n config.refreshToken = token.refresh_token;\n saveConfig(config);\n console.log(`${col(c.dim, ` Config saved to ${CONFIG_PATH}`)}`);\n } catch (err) {\n spinner.stop();\n die(`Login failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nasync function cmdSearch(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli search <query> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli search \"lofi hip hop\"\n sc-cli search deadmau5 --json\n`);\n return;\n }\n\n const query = args.positional.join(\" \");\n if (!query) die(\"Usage: sc-cli search <query>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(`Searching \"${query}\"…`);\n const results = await client.search.tracks(query);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(results.collection, null, 2));\n return;\n }\n\n if (!results.collection.length) {\n console.log(`\\n${col(c.yellow, \"No results found.\")}`);\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, `⚡ Search results for \"${query}\"`)}\\n`);\n console.log(\n ` ${col(c.dim, padRight(\"#\", 4))}${col(c.dim, padRight(\"Title\", 40))}${col(c.dim, padRight(\"Artist\", 24))}${col(c.dim, padRight(\"Duration\", 10))}${col(c.dim, \"Plays\")}`,\n );\n console.log(` ${col(c.dim, \"─\".repeat(90))}`);\n\n results.collection.forEach((track, i) => {\n const num = padRight(`${i + 1}`, 4);\n const title = padRight(truncate(track.title ?? \"Untitled\", 38), 40);\n const artist = padRight(truncate(track.user?.username ?? \"Unknown\", 22), 24);\n const duration = padRight(formatDuration(track.duration ?? 0), 10);\n const plays = formatNumber(track.playback_count);\n console.log(` ${col(c.dim, num)}${col(c.white, title)}${col(c.magenta, artist)}${col(c.yellow, duration)}${col(c.green, plays)}`);\n });\n console.log();\n}\n\nasync function cmdTrack(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli track <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli track 123456\n sc-cli track 123456 --json\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli track <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Fetching track…\");\n const track = await client.tracks.getTrack(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(track, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Track Details\")}\\n`);\n console.log(` ${col(c.dim, \"Title:\")} ${col(c.bold + c.white, track.title ?? \"Untitled\")}`);\n console.log(` ${col(c.dim, \"Artist:\")} ${col(c.magenta, track.user?.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Duration:\")} ${col(c.yellow, formatDuration(track.duration ?? 0))}`);\n console.log(` ${col(c.dim, \"Plays:\")} ${col(c.green, formatNumber(track.playback_count))}`);\n console.log(` ${col(c.dim, \"Likes:\")} ${col(c.green, formatNumber(track.favoritings_count))}`);\n console.log(` ${col(c.dim, \"Genre:\")} ${track.genre ?? \"-\"}`);\n console.log(` ${col(c.dim, \"Created:\")} ${track.created_at ?? \"-\"}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, track.permalink_url ?? \"-\")}`);\n console.log();\n}\n\nasync function cmdUser(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli user <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli user 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli user <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Fetching user…\");\n const user = await client.users.getUser(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(user, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ User Profile\")}\\n`);\n console.log(` ${col(c.dim, \"Username:\")} ${col(c.bold + c.white, user.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Followers:\")} ${col(c.green, formatNumber(user.followers_count))}`);\n console.log(` ${col(c.dim, \"Following:\")} ${col(c.green, formatNumber(user.followings_count))}`);\n console.log(` ${col(c.dim, \"Tracks:\")} ${col(c.yellow, formatNumber(user.track_count))}`);\n console.log(` ${col(c.dim, \"City:\")} ${user.city ?? \"-\"}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, user.permalink_url ?? \"-\")}`);\n console.log();\n}\n\nasync function cmdPlaylist(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli playlist <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli playlist 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli playlist <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Fetching playlist…\");\n const playlist = await client.playlists.getPlaylist(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(playlist, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Playlist\")}\\n`);\n console.log(` ${col(c.dim, \"Title:\")} ${col(c.bold + c.white, playlist.title ?? \"Untitled\")}`);\n console.log(` ${col(c.dim, \"By:\")} ${col(c.magenta, playlist.user?.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Tracks:\")} ${playlist.track_count ?? 0}`);\n console.log(` ${col(c.dim, \"Duration:\")} ${col(c.yellow, formatDuration(playlist.duration ?? 0))}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, playlist.permalink_url ?? \"-\")}`);\n\n if (playlist.tracks?.length) {\n console.log(`\\n ${col(c.bold, \"Track listing:\")}\\n`);\n playlist.tracks.forEach((track, i) => {\n const num = padRight(`${i + 1}.`, 5);\n const title = truncate(track.title ?? \"Untitled\", 45);\n const dur = formatDuration(track.duration ?? 0);\n console.log(` ${col(c.dim, num)}${title} ${col(c.dim, `(${dur})`)}`);\n });\n }\n console.log();\n}\n\nasync function cmdStream(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli stream <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli stream 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli stream <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Getting stream URLs…\");\n const streams = await client.tracks.getStreams(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(streams, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Stream URLs\")}\\n`);\n const entries = Object.entries(streams).filter(([, v]) => v);\n if (!entries.length) {\n console.log(` ${col(c.yellow, \"No stream URLs available.\")}`);\n } else {\n for (const [key, url] of entries) {\n const label = key.replace(/_url$/, \"\").replace(/_/g, \" \").toUpperCase();\n console.log(` ${col(c.dim, padRight(label + \":\", 28))}${col(c.blue, String(url))}`);\n }\n }\n console.log();\n}\n\nasync function cmdResolve(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli resolve <url> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli resolve https://soundcloud.com/artist/track\n`);\n return;\n }\n\n const url = args.positional[0];\n if (!url) die(\"Usage: sc-cli resolve <url>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Resolving URL…\");\n const result = await client.resolve.resolveUrl(url);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.green, \"✔\")} Resolved:\\n`);\n if (typeof result === \"string\") {\n console.log(` ${col(c.blue, result)}`);\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n console.log();\n}\n\nasync function cmdMe(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli me [--json]\n\nShows the authenticated user's profile. Requires \\`sc-cli login\\` first.\n`);\n return;\n }\n\n const config = loadConfig();\n const client = getClient(config);\n if (!client.accessToken) {\n die(\"Not logged in. Run `sc-cli login` first.\");\n }\n\n const spinner = createSpinner(\"Fetching profile…\");\n const me = await client.me.getMe();\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(me, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Your Profile\")}\\n`);\n console.log(` ${col(c.dim, \"Username:\")} ${col(c.bold + c.white, me.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Followers:\")} ${col(c.green, formatNumber(me.followers_count))}`);\n console.log(` ${col(c.dim, \"Following:\")} ${col(c.green, formatNumber(me.followings_count))}`);\n console.log(` ${col(c.dim, \"Tracks:\")} ${col(c.yellow, formatNumber(me.track_count))}`);\n console.log(` ${col(c.dim, \"City:\")} ${me.city ?? \"-\"}`);\n console.log(` ${col(c.dim, \"Plan:\")} ${me.quota?.unlimited_upload_quota ? \"Pro\" : \"Free\"}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, me.permalink_url ?? \"-\")}`);\n console.log();\n}\n\nasync function cmdLikes(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli likes [--json]\n\nShows your liked tracks. Requires \\`sc-cli login\\` first.\n`);\n return;\n }\n\n const config = loadConfig();\n const client = getClient(config);\n if (!client.accessToken) {\n die(\"Not logged in. Run `sc-cli login` first.\");\n }\n\n const spinner = createSpinner(\"Fetching likes…\");\n const likes = await client.me.getLikesTracks(20);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(likes.collection, null, 2));\n return;\n }\n\n if (!likes.collection.length) {\n console.log(`\\n${col(c.yellow, \"No liked tracks.\")}`);\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Your Liked Tracks\")}\\n`);\n console.log(\n ` ${col(c.dim, padRight(\"#\", 4))}${col(c.dim, padRight(\"Title\", 40))}${col(c.dim, padRight(\"Artist\", 24))}${col(c.dim, \"Duration\")}`,\n );\n console.log(` ${col(c.dim, \"─\".repeat(80))}`);\n\n likes.collection.forEach((track, i) => {\n const num = padRight(`${i + 1}`, 4);\n const title = padRight(truncate(track.title ?? \"Untitled\", 38), 40);\n const artist = padRight(truncate(track.user?.username ?? \"Unknown\", 22), 24);\n const duration = formatDuration(track.duration ?? 0);\n console.log(` ${col(c.dim, num)}${col(c.white, title)}${col(c.magenta, artist)}${col(c.yellow, duration)}`);\n });\n console.log();\n}\n\n// ── Play Command ─────────────────────────────────────────────────────────────\n\nconst isWindows = process.platform === \"win32\";\n\n/** Detect an available audio player binary */\nfunction detectPlayer(): string | null {\n const candidates = isWindows ? [\"mpv\", \"ffplay\"] : [\"mpv\", \"ffplay\", \"afplay\"];\n const whichCmd = isWindows ? \"where.exe\" : \"command -v\";\n for (const bin of candidates) {\n try {\n execSync(`${whichCmd} ${bin}`, { stdio: \"ignore\" });\n return bin;\n } catch {\n // not found, try next\n }\n }\n return null;\n}\n\n/** IPC socket path for mpv (shared between playerArgs and cmdPlay) */\nconst mpvSocketPath = isWindows ? \"\\\\\\\\.\\\\pipe\\\\sc-cli-mpv\" : path.join(os.tmpdir(), \"sc-cli-mpv.sock\");\n\n/** Build player args (suppress visual output where possible) */\nfunction playerArgs(bin: string, filePath: string): string[] {\n switch (bin) {\n case \"mpv\":\n return [\"--no-video\", \"--no-terminal\", `--input-ipc-server=${mpvSocketPath}`, filePath];\n case \"ffplay\":\n return [\"-nodisp\", \"-autoexit\", \"-loglevel\", \"quiet\", filePath];\n case \"afplay\":\n return [filePath];\n default:\n return [filePath];\n }\n}\n\nasync function cmdPlay(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli play <id> [--url] [--json]\n\nPlay a SoundCloud track in your terminal.\n\n${col(c.bold, \"Options:\")}\n ${col(c.yellow, \"--url\")} Print the best stream URL and exit\n ${col(c.yellow, \"--json\")} Print raw stream URLs JSON and exit\n\n${col(c.bold, \"Examples:\")}\n sc-cli play 123456\n sc-cli play 123456 --url\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli play <track-id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n // Fetch track info and streams in parallel\n const spinner = createSpinner(\"Fetching track…\");\n const [track, streams] = await Promise.all([\n client.tracks.getTrack(id),\n client.tracks.getStreams(id),\n ]);\n spinner.stop();\n\n // --json: dump raw stream URLs\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(streams, null, 2));\n return;\n }\n\n // Pick best stream URL\n const streamUrl =\n streams.http_mp3_128_url ||\n streams.hls_mp3_128_url ||\n streams.hls_aac_160_url ||\n streams.preview_mp3_128_url;\n\n if (!streamUrl) die(\"No stream URL available for this track.\");\n\n // --url: just print and exit\n if (args.flags[\"url\"]) {\n console.log(streamUrl);\n return;\n }\n\n // Detect player\n const playerBin = detectPlayer();\n if (!playerBin) die(\"No audio player found. Install mpv, ffplay, or afplay.\");\n\n // Show track header\n const title = track.title ?? \"Untitled\";\n const artist = track.user?.username ?? \"Unknown\";\n const durationMs = track.duration ?? 0;\n const durationStr = formatDuration(durationMs);\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Now Playing\")}\\n`);\n console.log(` ${col(c.dim, \"Title:\")} ${col(c.bold + c.white, title)}`);\n console.log(` ${col(c.dim, \"Artist:\")} ${col(c.magenta, artist)}`);\n console.log(` ${col(c.dim, \"Duration:\")} ${col(c.yellow, durationStr)}`);\n console.log(` ${col(c.dim, \"Player:\")} ${playerBin}\\n`);\n\n // Download to temp file\n const tmpFile = path.join(os.tmpdir(), `sc-play-${id}-${Date.now()}.mp3`);\n const dlSpinner = createSpinner(\"Downloading stream…\");\n try {\n const resp = await fetch(streamUrl, {\n headers: { Authorization: `OAuth ${client.accessToken}` },\n });\n if (!resp.ok) die(`Download failed: HTTP ${resp.status}`);\n const buffer = Buffer.from(await resp.arrayBuffer());\n fs.writeFileSync(tmpFile, buffer);\n } catch (err) {\n dlSpinner.stop();\n die(`Download failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n dlSpinner.stop();\n\n // Spawn player\n const totalSec = Math.floor(durationMs / 1000);\n let player: ChildProcess | null = null;\n let progressTimer: ReturnType<typeof setInterval> | null = null;\n let startTime = Date.now();\n const usesMpv = playerBin === \"mpv\";\n\n // Restore terminal state helper\n const restoreStdin = () => {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n process.stdin.pause();\n }\n };\n\n // Cleanup helper\n const cleanup = () => {\n if (progressTimer) { clearInterval(progressTimer); progressTimer = null; }\n restoreStdin();\n process.stdout.write(\"\\n\");\n if (player && !player.killed) player.kill();\n try { fs.unlinkSync(tmpFile); } catch { /* ignore */ }\n if (usesMpv) try { fs.unlinkSync(mpvSocketPath); } catch { /* ignore */ }\n };\n\n // Handle Ctrl+C\n const onSigint = () => { cleanup(); process.exit(0); };\n process.on(\"SIGINT\", onSigint);\n\n return new Promise<void>((resolve) => {\n player = spawn(playerBin, playerArgs(playerBin, tmpFile), { stdio: \"ignore\" });\n startTime = Date.now();\n let paused = false;\n let pausedAt = 0; // total ms spent paused\n let pauseStart = 0;\n\n // Live progress bar\n const barWidth = 30;\n const drawProgress = () => {\n const pauseOffset = paused ? Date.now() - pauseStart : 0;\n const elapsed = Math.floor((Date.now() - startTime - pausedAt - pauseOffset) / 1000);\n const capped = Math.min(Math.max(elapsed, 0), totalSec);\n const ratio = totalSec > 0 ? capped / totalSec : 0;\n const filled = Math.round(ratio * barWidth);\n const empty = barWidth - filled;\n const bar = \"█\".repeat(filled) + \"░\".repeat(empty);\n const elapsedStr = formatDuration(capped * 1000);\n const icon = paused ? col(c.yellow, \"⏸\") : col(c.green, \"▶\");\n process.stdout.write(`\\r ${icon} [${col(c.cyan, bar)}] ${elapsedStr} / ${durationStr} `);\n };\n drawProgress(); // draw immediately\n progressTimer = setInterval(drawProgress, 1000);\n\n // Keyboard controls\n // afplay has no pause support; ffplay on Windows can't use SIGSTOP/SIGCONT\n const supportsPause = playerBin === \"mpv\" || (playerBin === \"ffplay\" && !isWindows);\n\n const sendMpvCommand = (cmd: string[]) => {\n if (!usesMpv) return;\n try {\n const sock = net.createConnection(mpvSocketPath);\n sock.on(\"error\", () => { /* ignore connection errors */ });\n sock.write(JSON.stringify({ command: cmd }) + \"\\n\");\n sock.end();\n } catch { /* ignore */ }\n };\n\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on(\"data\", (key: Buffer) => {\n const ch = key.toString();\n if (ch === \" \" && supportsPause && player && !player.killed) {\n if (usesMpv) {\n // Toggle pause via mpv IPC\n sendMpvCommand([\"cycle\", \"pause\"]);\n } else {\n // Signal-based fallback for ffplay\n if (paused) player.kill(\"SIGCONT\");\n else player.kill(\"SIGSTOP\");\n }\n if (paused) {\n pausedAt += Date.now() - pauseStart;\n paused = false;\n } else {\n pauseStart = Date.now();\n paused = true;\n }\n drawProgress();\n } else if (ch === \"q\" || ch === \"\\x03\") {\n // q or Ctrl+C\n if (usesMpv) sendMpvCommand([\"quit\"]);\n cleanup();\n process.removeListener(\"SIGINT\", onSigint);\n process.exit(0);\n }\n });\n }\n\n const controlHint = supportsPause ? \"[space] pause/play [q] quit\" : \"[q] quit\";\n console.log(` ${col(c.dim, controlHint)}\\n`);\n\n player.on(\"close\", () => {\n cleanup();\n process.removeListener(\"SIGINT\", onSigint);\n console.log(`\\n${col(c.green, \"✔\")} Playback complete.`);\n resolve();\n });\n\n player.on(\"error\", (err) => {\n cleanup();\n process.removeListener(\"SIGINT\", onSigint);\n die(`Player error: ${err.message}`);\n });\n });\n}\n\nfunction showHelp(): void {\n console.log(`\n${col(c.bold + c.cyan, \"⚡ sc-cli\")} ${col(c.dim, \"— Explore the SoundCloud API from your terminal\")}\n\n${col(c.bold, \"Usage:\")} sc-cli <command> [options]\n\n${col(c.bold, \"Setup:\")}\n ${col(c.green, \"auth\")} Set up API credentials (client_id + client_secret)\n ${col(c.green, \"login\")} Log in via OAuth (opens browser)\n\n${col(c.bold, \"Commands:\")}\n ${col(c.green, \"search\")} <query> Search tracks\n ${col(c.green, \"track\")} <id> Show track details\n ${col(c.green, \"user\")} <id> Show user profile\n ${col(c.green, \"playlist\")} <id> Show playlist with track listing\n ${col(c.green, \"play\")} <id> Play a track in your terminal\n ${col(c.green, \"stream\")} <id> Get stream URLs for a track\n ${col(c.green, \"resolve\")} <url> Resolve a SoundCloud URL\n ${col(c.green, \"me\")} Show your profile (requires login)\n ${col(c.green, \"likes\")} Show your liked tracks (requires login)\n\n${col(c.bold, \"Options:\")}\n ${col(c.yellow, \"--json\")} Output raw JSON (works on all commands)\n ${col(c.yellow, \"--help\")} Show help for a command\n\n${col(c.bold, \"Examples:\")}\n ${col(c.dim, \"$\")} sc-cli auth\n ${col(c.dim, \"$\")} sc-cli search \"lofi beats\"\n ${col(c.dim, \"$\")} sc-cli play 293\n ${col(c.dim, \"$\")} sc-cli track 293 --json\n ${col(c.dim, \"$\")} sc-cli resolve https://soundcloud.com/artist/track\n ${col(c.dim, \"$\")} sc-cli login\n ${col(c.dim, \"$\")} sc-cli me\n\n${col(c.dim, \"Config:\")} ${CONFIG_PATH}\n${col(c.dim, \"Powered by\")} soundcloud-api-ts\n`);\n}\n\n// ── Main ─────────────────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv);\n\n if (args.flags[\"help\"] && ![\"search\", \"track\", \"user\", \"playlist\", \"play\", \"stream\", \"resolve\", \"me\", \"likes\"].includes(args.command)) {\n showHelp();\n return;\n }\n\n try {\n switch (args.command) {\n case \"help\":\n showHelp();\n break;\n case \"auth\":\n await cmdAuth();\n break;\n case \"login\":\n await cmdLogin();\n break;\n case \"search\":\n await cmdSearch(args);\n break;\n case \"track\":\n await cmdTrack(args);\n break;\n case \"user\":\n await cmdUser(args);\n break;\n case \"playlist\":\n await cmdPlaylist(args);\n break;\n case \"play\":\n await cmdPlay(args);\n break;\n case \"stream\":\n await cmdStream(args);\n break;\n case \"resolve\":\n await cmdResolve(args);\n break;\n case \"me\":\n await cmdMe(args);\n break;\n case \"likes\":\n await cmdLikes(args);\n break;\n default:\n console.error(`\\n${col(c.red, \"✖\")} Unknown command: ${args.command}`);\n showHelp();\n process.exit(1);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n die(message);\n }\n}\n\nmain();\n"]}
package/dist/cli.mjs CHANGED
@@ -6,6 +6,8 @@ import * as http from 'http';
6
6
  import * as fs from 'fs';
7
7
  import * as path from 'path';
8
8
  import * as os from 'os';
9
+ import { spawn, execSync } from 'child_process';
10
+ import * as net from 'net';
9
11
 
10
12
  var c = {
11
13
  reset: "\x1B[0m",
@@ -514,6 +516,209 @@ ${col(c.bold + c.cyan, "\u26A1 Your Liked Tracks")}
514
516
  });
515
517
  console.log();
516
518
  }
519
+ var isWindows = process.platform === "win32";
520
+ function detectPlayer() {
521
+ const candidates = isWindows ? ["mpv", "ffplay"] : ["mpv", "ffplay", "afplay"];
522
+ const whichCmd = isWindows ? "where.exe" : "command -v";
523
+ for (const bin of candidates) {
524
+ try {
525
+ execSync(`${whichCmd} ${bin}`, { stdio: "ignore" });
526
+ return bin;
527
+ } catch {
528
+ }
529
+ }
530
+ return null;
531
+ }
532
+ var mpvSocketPath = isWindows ? "\\\\.\\pipe\\sc-cli-mpv" : path.join(os.tmpdir(), "sc-cli-mpv.sock");
533
+ function playerArgs(bin, filePath) {
534
+ switch (bin) {
535
+ case "mpv":
536
+ return ["--no-video", "--no-terminal", `--input-ipc-server=${mpvSocketPath}`, filePath];
537
+ case "ffplay":
538
+ return ["-nodisp", "-autoexit", "-loglevel", "quiet", filePath];
539
+ case "afplay":
540
+ return [filePath];
541
+ default:
542
+ return [filePath];
543
+ }
544
+ }
545
+ async function cmdPlay(args) {
546
+ if (args.flags["help"]) {
547
+ console.log(`
548
+ ${col(c.bold, "Usage:")} sc-cli play <id> [--url] [--json]
549
+
550
+ Play a SoundCloud track in your terminal.
551
+
552
+ ${col(c.bold, "Options:")}
553
+ ${col(c.yellow, "--url")} Print the best stream URL and exit
554
+ ${col(c.yellow, "--json")} Print raw stream URLs JSON and exit
555
+
556
+ ${col(c.bold, "Examples:")}
557
+ sc-cli play 123456
558
+ sc-cli play 123456 --url
559
+ `);
560
+ return;
561
+ }
562
+ const id = args.positional[0];
563
+ if (!id) die("Usage: sc-cli play <track-id>");
564
+ const config = loadConfig();
565
+ const client = getClient(config);
566
+ await ensureToken(client, config);
567
+ const spinner = createSpinner("Fetching track\u2026");
568
+ const [track, streams] = await Promise.all([
569
+ client.tracks.getTrack(id),
570
+ client.tracks.getStreams(id)
571
+ ]);
572
+ spinner.stop();
573
+ if (args.flags["json"]) {
574
+ console.log(JSON.stringify(streams, null, 2));
575
+ return;
576
+ }
577
+ const streamUrl = streams.http_mp3_128_url || streams.hls_mp3_128_url || streams.hls_aac_160_url || streams.preview_mp3_128_url;
578
+ if (!streamUrl) die("No stream URL available for this track.");
579
+ if (args.flags["url"]) {
580
+ console.log(streamUrl);
581
+ return;
582
+ }
583
+ const playerBin = detectPlayer();
584
+ if (!playerBin) die("No audio player found. Install mpv, ffplay, or afplay.");
585
+ const title = track.title ?? "Untitled";
586
+ const artist = track.user?.username ?? "Unknown";
587
+ const durationMs = track.duration ?? 0;
588
+ const durationStr = formatDuration(durationMs);
589
+ console.log(`
590
+ ${col(c.bold + c.cyan, "\u26A1 Now Playing")}
591
+ `);
592
+ console.log(` ${col(c.dim, "Title:")} ${col(c.bold + c.white, title)}`);
593
+ console.log(` ${col(c.dim, "Artist:")} ${col(c.magenta, artist)}`);
594
+ console.log(` ${col(c.dim, "Duration:")} ${col(c.yellow, durationStr)}`);
595
+ console.log(` ${col(c.dim, "Player:")} ${playerBin}
596
+ `);
597
+ const tmpFile = path.join(os.tmpdir(), `sc-play-${id}-${Date.now()}.mp3`);
598
+ const dlSpinner = createSpinner("Downloading stream\u2026");
599
+ try {
600
+ const resp = await fetch(streamUrl, {
601
+ headers: { Authorization: `OAuth ${client.accessToken}` }
602
+ });
603
+ if (!resp.ok) die(`Download failed: HTTP ${resp.status}`);
604
+ const buffer = Buffer.from(await resp.arrayBuffer());
605
+ fs.writeFileSync(tmpFile, buffer);
606
+ } catch (err) {
607
+ dlSpinner.stop();
608
+ die(`Download failed: ${err instanceof Error ? err.message : String(err)}`);
609
+ }
610
+ dlSpinner.stop();
611
+ const totalSec = Math.floor(durationMs / 1e3);
612
+ let player = null;
613
+ let progressTimer = null;
614
+ let startTime = Date.now();
615
+ const usesMpv = playerBin === "mpv";
616
+ const restoreStdin = () => {
617
+ if (process.stdin.isTTY) {
618
+ process.stdin.setRawMode(false);
619
+ process.stdin.pause();
620
+ }
621
+ };
622
+ const cleanup = () => {
623
+ if (progressTimer) {
624
+ clearInterval(progressTimer);
625
+ progressTimer = null;
626
+ }
627
+ restoreStdin();
628
+ process.stdout.write("\n");
629
+ if (player && !player.killed) player.kill();
630
+ try {
631
+ fs.unlinkSync(tmpFile);
632
+ } catch {
633
+ }
634
+ if (usesMpv) try {
635
+ fs.unlinkSync(mpvSocketPath);
636
+ } catch {
637
+ }
638
+ };
639
+ const onSigint = () => {
640
+ cleanup();
641
+ process.exit(0);
642
+ };
643
+ process.on("SIGINT", onSigint);
644
+ return new Promise((resolve) => {
645
+ player = spawn(playerBin, playerArgs(playerBin, tmpFile), { stdio: "ignore" });
646
+ startTime = Date.now();
647
+ let paused = false;
648
+ let pausedAt = 0;
649
+ let pauseStart = 0;
650
+ const barWidth = 30;
651
+ const drawProgress = () => {
652
+ const pauseOffset = paused ? Date.now() - pauseStart : 0;
653
+ const elapsed = Math.floor((Date.now() - startTime - pausedAt - pauseOffset) / 1e3);
654
+ const capped = Math.min(Math.max(elapsed, 0), totalSec);
655
+ const ratio = totalSec > 0 ? capped / totalSec : 0;
656
+ const filled = Math.round(ratio * barWidth);
657
+ const empty = barWidth - filled;
658
+ const bar = "\u2588".repeat(filled) + "\u2591".repeat(empty);
659
+ const elapsedStr = formatDuration(capped * 1e3);
660
+ const icon = paused ? col(c.yellow, "\u23F8") : col(c.green, "\u25B6");
661
+ process.stdout.write(`\r ${icon} [${col(c.cyan, bar)}] ${elapsedStr} / ${durationStr} `);
662
+ };
663
+ drawProgress();
664
+ progressTimer = setInterval(drawProgress, 1e3);
665
+ const supportsPause = playerBin === "mpv" || playerBin === "ffplay" && !isWindows;
666
+ const sendMpvCommand = (cmd) => {
667
+ if (!usesMpv) return;
668
+ try {
669
+ const sock = net.createConnection(mpvSocketPath);
670
+ sock.on("error", () => {
671
+ });
672
+ sock.write(JSON.stringify({ command: cmd }) + "\n");
673
+ sock.end();
674
+ } catch {
675
+ }
676
+ };
677
+ if (process.stdin.isTTY) {
678
+ process.stdin.setRawMode(true);
679
+ process.stdin.resume();
680
+ process.stdin.on("data", (key) => {
681
+ const ch = key.toString();
682
+ if (ch === " " && supportsPause && player && !player.killed) {
683
+ if (usesMpv) {
684
+ sendMpvCommand(["cycle", "pause"]);
685
+ } else {
686
+ if (paused) player.kill("SIGCONT");
687
+ else player.kill("SIGSTOP");
688
+ }
689
+ if (paused) {
690
+ pausedAt += Date.now() - pauseStart;
691
+ paused = false;
692
+ } else {
693
+ pauseStart = Date.now();
694
+ paused = true;
695
+ }
696
+ drawProgress();
697
+ } else if (ch === "q" || ch === "") {
698
+ if (usesMpv) sendMpvCommand(["quit"]);
699
+ cleanup();
700
+ process.removeListener("SIGINT", onSigint);
701
+ process.exit(0);
702
+ }
703
+ });
704
+ }
705
+ const controlHint = supportsPause ? "[space] pause/play [q] quit" : "[q] quit";
706
+ console.log(` ${col(c.dim, controlHint)}
707
+ `);
708
+ player.on("close", () => {
709
+ cleanup();
710
+ process.removeListener("SIGINT", onSigint);
711
+ console.log(`
712
+ ${col(c.green, "\u2714")} Playback complete.`);
713
+ resolve();
714
+ });
715
+ player.on("error", (err) => {
716
+ cleanup();
717
+ process.removeListener("SIGINT", onSigint);
718
+ die(`Player error: ${err.message}`);
719
+ });
720
+ });
721
+ }
517
722
  function showHelp() {
518
723
  console.log(`
519
724
  ${col(c.bold + c.cyan, "\u26A1 sc-cli")} ${col(c.dim, "\u2014 Explore the SoundCloud API from your terminal")}
@@ -529,6 +734,7 @@ ${col(c.bold, "Commands:")}
529
734
  ${col(c.green, "track")} <id> Show track details
530
735
  ${col(c.green, "user")} <id> Show user profile
531
736
  ${col(c.green, "playlist")} <id> Show playlist with track listing
737
+ ${col(c.green, "play")} <id> Play a track in your terminal
532
738
  ${col(c.green, "stream")} <id> Get stream URLs for a track
533
739
  ${col(c.green, "resolve")} <url> Resolve a SoundCloud URL
534
740
  ${col(c.green, "me")} Show your profile (requires login)
@@ -541,6 +747,7 @@ ${col(c.bold, "Options:")}
541
747
  ${col(c.bold, "Examples:")}
542
748
  ${col(c.dim, "$")} sc-cli auth
543
749
  ${col(c.dim, "$")} sc-cli search "lofi beats"
750
+ ${col(c.dim, "$")} sc-cli play 293
544
751
  ${col(c.dim, "$")} sc-cli track 293 --json
545
752
  ${col(c.dim, "$")} sc-cli resolve https://soundcloud.com/artist/track
546
753
  ${col(c.dim, "$")} sc-cli login
@@ -552,7 +759,7 @@ ${col(c.dim, "Powered by")} soundcloud-api-ts
552
759
  }
553
760
  async function main() {
554
761
  const args = parseArgs(process.argv);
555
- if (args.flags["help"] && !["search", "track", "user", "playlist", "stream", "resolve", "me", "likes"].includes(args.command)) {
762
+ if (args.flags["help"] && !["search", "track", "user", "playlist", "play", "stream", "resolve", "me", "likes"].includes(args.command)) {
556
763
  showHelp();
557
764
  return;
558
765
  }
@@ -579,6 +786,9 @@ async function main() {
579
786
  case "playlist":
580
787
  await cmdPlaylist(args);
581
788
  break;
789
+ case "play":
790
+ await cmdPlay(args);
791
+ break;
582
792
  case "stream":
583
793
  await cmdStream(args);
584
794
  break;
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(), \".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"]}
1
+ {"version":3,"sources":["../src/cli.ts"],"names":[],"mappings":"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","file":"cli.mjs","sourcesContent":["#!/usr/bin/env node\n\nimport { SoundCloudClient, generateCodeVerifier, generateCodeChallenge } from \"./index.js\";\nimport * as readline from \"node:readline\";\nimport * as http from \"node:http\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { execSync, spawn, type ChildProcess } from \"node:child_process\";\nimport * as net from \"node:net\";\n\n// ── ANSI Colors ──────────────────────────────────────────────────────────────\n\nconst c = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n bgBlue: \"\\x1b[44m\",\n};\n\nconst isNoColor = !!process.env[\"NO_COLOR\"];\nfunction col(color: string, text: string): string {\n return isNoColor ? text : `${color}${text}${c.reset}`;\n}\n\n// ── Config ───────────────────────────────────────────────────────────────────\n\ninterface CLIConfig {\n clientId?: string;\n clientSecret?: string;\n token?: string;\n refreshToken?: string;\n}\n\nconst CONFIG_PATH = path.join(os.homedir(), \".sc-cli.json\");\n\nfunction loadConfig(): CLIConfig {\n try {\n return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\")) as CLIConfig;\n } catch {\n return {};\n }\n}\n\nfunction saveConfig(config: CLIConfig): void {\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\n// ── Spinner ──────────────────────────────────────────────────────────────────\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\nfunction createSpinner(message: string) {\n let i = 0;\n const timer = setInterval(() => {\n process.stdout.write(`\\r${col(c.cyan, SPINNER_FRAMES[i % SPINNER_FRAMES.length])} ${message}`);\n i++;\n }, 80);\n return {\n stop(finalMessage?: string) {\n clearInterval(timer);\n process.stdout.write(`\\r${\" \".repeat(message.length + 4)}\\r`);\n if (finalMessage) console.log(finalMessage);\n },\n };\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n const totalSec = Math.floor(ms / 1000);\n const min = Math.floor(totalSec / 60);\n const sec = totalSec % 60;\n return `${min}:${sec.toString().padStart(2, \"0\")}`;\n}\n\nfunction formatNumber(n: number | undefined | null): string {\n if (n == null) return \"-\";\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toString();\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max - 1) + \"…\" : s;\n}\n\nfunction padRight(s: string, len: number): string {\n return s.length >= len ? s : s + \" \".repeat(len - s.length);\n}\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction die(msg: string): never {\n console.error(`\\n${col(c.red, \"✖\")} ${msg}`);\n process.exit(1);\n}\n\nfunction getClient(config: CLIConfig): SoundCloudClient {\n if (!config.clientId || !config.clientSecret) {\n die(\"Not configured. Run `sc-cli auth` first.\");\n }\n const client = new SoundCloudClient({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n redirectUri: \"http://localhost:8976/callback\",\n });\n if (config.token) {\n client.setToken(config.token, config.refreshToken);\n }\n return client;\n}\n\nasync function ensureToken(client: SoundCloudClient, config: CLIConfig): Promise<void> {\n if (client.accessToken) return;\n const spinner = createSpinner(\"Getting client token…\");\n try {\n const token = await client.auth.getClientToken();\n client.setToken(token.access_token);\n config.token = token.access_token;\n saveConfig(config);\n spinner.stop();\n } catch (err) {\n spinner.stop();\n die(`Failed to get token: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\n// ── Args parsing ─────────────────────────────────────────────────────────────\n\ninterface ParsedArgs {\n command: string;\n positional: string[];\n flags: Record<string, string | boolean>;\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const args = argv.slice(2);\n const positional: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith(\"--\")) {\n const eqIdx = arg.indexOf(\"=\");\n if (eqIdx > -1) {\n flags[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);\n } else {\n flags[arg.slice(2)] = true;\n }\n } else {\n positional.push(arg);\n }\n }\n const command = positional.shift() ?? \"help\";\n return { command, positional, flags };\n}\n\n// ── Commands ─────────────────────────────────────────────────────────────────\n\nasync function cmdAuth(): Promise<void> {\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ SoundCloud CLI Setup\")}\\n`);\n const clientId = await prompt(`${col(c.yellow, \"?\")} Client ID: `);\n if (!clientId) die(\"Client ID is required.\");\n const clientSecret = await prompt(`${col(c.yellow, \"?\")} Client Secret: `);\n if (!clientSecret) die(\"Client Secret is required.\");\n\n const spinner = createSpinner(\"Verifying credentials…\");\n try {\n const client = new SoundCloudClient({ clientId, clientSecret });\n const token = await client.auth.getClientToken();\n spinner.stop(`${col(c.green, \"✔\")} Credentials verified!`);\n const config: CLIConfig = { clientId, clientSecret, token: token.access_token };\n saveConfig(config);\n console.log(`${col(c.dim, ` Config saved to ${CONFIG_PATH}`)}`);\n } catch (err) {\n spinner.stop();\n die(`Invalid credentials: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nasync function cmdLogin(): Promise<void> {\n const config = loadConfig();\n if (!config.clientId || !config.clientSecret) {\n die(\"Not configured. Run `sc-cli auth` first.\");\n }\n\n const verifier = generateCodeVerifier();\n const challenge = await generateCodeChallenge(verifier);\n\n const client = new SoundCloudClient({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n redirectUri: \"http://localhost:8976/callback\",\n });\n\n const authUrl = client.auth.getAuthorizationUrl({\n state: \"cli-login\",\n codeChallenge: challenge,\n });\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ SoundCloud OAuth Login\")}\\n`);\n console.log(`${col(c.yellow, \"→\")} Open this URL in your browser:\\n`);\n console.log(` ${col(c.blue, authUrl)}\\n`);\n\n // Try to open browser automatically\n const openCmd = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n try {\n const { exec: cpExec } = await import(\"node:child_process\");\n cpExec(`${openCmd} \"${authUrl}\"`);\n } catch {\n // ignore — user can open manually\n }\n\n console.log(`${col(c.dim, \" Waiting for callback on http://localhost:8976/callback …\")}\\n`);\n\n const code = await new Promise<string>((resolve, reject) => {\n const server = http.createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://localhost:8976\");\n const authCode = url.searchParams.get(\"code\");\n if (authCode) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\"<html><body><h2>✅ Authenticated! You can close this tab.</h2></body></html>\");\n server.close();\n resolve(authCode);\n } else {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\"<html><body><h2>❌ No code received.</h2></body></html>\");\n server.close();\n reject(new Error(\"No authorization code received\"));\n }\n });\n server.listen(8976);\n server.on(\"error\", reject);\n });\n\n const spinner = createSpinner(\"Exchanging code for token…\");\n try {\n const token = await client.auth.getUserToken(code, verifier);\n spinner.stop(`${col(c.green, \"✔\")} Logged in successfully!`);\n config.token = token.access_token;\n config.refreshToken = token.refresh_token;\n saveConfig(config);\n console.log(`${col(c.dim, ` Config saved to ${CONFIG_PATH}`)}`);\n } catch (err) {\n spinner.stop();\n die(`Login failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nasync function cmdSearch(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli search <query> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli search \"lofi hip hop\"\n sc-cli search deadmau5 --json\n`);\n return;\n }\n\n const query = args.positional.join(\" \");\n if (!query) die(\"Usage: sc-cli search <query>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(`Searching \"${query}\"…`);\n const results = await client.search.tracks(query);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(results.collection, null, 2));\n return;\n }\n\n if (!results.collection.length) {\n console.log(`\\n${col(c.yellow, \"No results found.\")}`);\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, `⚡ Search results for \"${query}\"`)}\\n`);\n console.log(\n ` ${col(c.dim, padRight(\"#\", 4))}${col(c.dim, padRight(\"Title\", 40))}${col(c.dim, padRight(\"Artist\", 24))}${col(c.dim, padRight(\"Duration\", 10))}${col(c.dim, \"Plays\")}`,\n );\n console.log(` ${col(c.dim, \"─\".repeat(90))}`);\n\n results.collection.forEach((track, i) => {\n const num = padRight(`${i + 1}`, 4);\n const title = padRight(truncate(track.title ?? \"Untitled\", 38), 40);\n const artist = padRight(truncate(track.user?.username ?? \"Unknown\", 22), 24);\n const duration = padRight(formatDuration(track.duration ?? 0), 10);\n const plays = formatNumber(track.playback_count);\n console.log(` ${col(c.dim, num)}${col(c.white, title)}${col(c.magenta, artist)}${col(c.yellow, duration)}${col(c.green, plays)}`);\n });\n console.log();\n}\n\nasync function cmdTrack(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli track <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli track 123456\n sc-cli track 123456 --json\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli track <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Fetching track…\");\n const track = await client.tracks.getTrack(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(track, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Track Details\")}\\n`);\n console.log(` ${col(c.dim, \"Title:\")} ${col(c.bold + c.white, track.title ?? \"Untitled\")}`);\n console.log(` ${col(c.dim, \"Artist:\")} ${col(c.magenta, track.user?.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Duration:\")} ${col(c.yellow, formatDuration(track.duration ?? 0))}`);\n console.log(` ${col(c.dim, \"Plays:\")} ${col(c.green, formatNumber(track.playback_count))}`);\n console.log(` ${col(c.dim, \"Likes:\")} ${col(c.green, formatNumber(track.favoritings_count))}`);\n console.log(` ${col(c.dim, \"Genre:\")} ${track.genre ?? \"-\"}`);\n console.log(` ${col(c.dim, \"Created:\")} ${track.created_at ?? \"-\"}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, track.permalink_url ?? \"-\")}`);\n console.log();\n}\n\nasync function cmdUser(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli user <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli user 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli user <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Fetching user…\");\n const user = await client.users.getUser(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(user, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ User Profile\")}\\n`);\n console.log(` ${col(c.dim, \"Username:\")} ${col(c.bold + c.white, user.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Followers:\")} ${col(c.green, formatNumber(user.followers_count))}`);\n console.log(` ${col(c.dim, \"Following:\")} ${col(c.green, formatNumber(user.followings_count))}`);\n console.log(` ${col(c.dim, \"Tracks:\")} ${col(c.yellow, formatNumber(user.track_count))}`);\n console.log(` ${col(c.dim, \"City:\")} ${user.city ?? \"-\"}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, user.permalink_url ?? \"-\")}`);\n console.log();\n}\n\nasync function cmdPlaylist(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli playlist <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli playlist 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli playlist <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Fetching playlist…\");\n const playlist = await client.playlists.getPlaylist(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(playlist, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Playlist\")}\\n`);\n console.log(` ${col(c.dim, \"Title:\")} ${col(c.bold + c.white, playlist.title ?? \"Untitled\")}`);\n console.log(` ${col(c.dim, \"By:\")} ${col(c.magenta, playlist.user?.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Tracks:\")} ${playlist.track_count ?? 0}`);\n console.log(` ${col(c.dim, \"Duration:\")} ${col(c.yellow, formatDuration(playlist.duration ?? 0))}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, playlist.permalink_url ?? \"-\")}`);\n\n if (playlist.tracks?.length) {\n console.log(`\\n ${col(c.bold, \"Track listing:\")}\\n`);\n playlist.tracks.forEach((track, i) => {\n const num = padRight(`${i + 1}.`, 5);\n const title = truncate(track.title ?? \"Untitled\", 45);\n const dur = formatDuration(track.duration ?? 0);\n console.log(` ${col(c.dim, num)}${title} ${col(c.dim, `(${dur})`)}`);\n });\n }\n console.log();\n}\n\nasync function cmdStream(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli stream <id> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli stream 123456\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli stream <id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Getting stream URLs…\");\n const streams = await client.tracks.getStreams(id);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(streams, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Stream URLs\")}\\n`);\n const entries = Object.entries(streams).filter(([, v]) => v);\n if (!entries.length) {\n console.log(` ${col(c.yellow, \"No stream URLs available.\")}`);\n } else {\n for (const [key, url] of entries) {\n const label = key.replace(/_url$/, \"\").replace(/_/g, \" \").toUpperCase();\n console.log(` ${col(c.dim, padRight(label + \":\", 28))}${col(c.blue, String(url))}`);\n }\n }\n console.log();\n}\n\nasync function cmdResolve(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli resolve <url> [--json]\n\n${col(c.bold, \"Examples:\")}\n sc-cli resolve https://soundcloud.com/artist/track\n`);\n return;\n }\n\n const url = args.positional[0];\n if (!url) die(\"Usage: sc-cli resolve <url>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n const spinner = createSpinner(\"Resolving URL…\");\n const result = await client.resolve.resolveUrl(url);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.green, \"✔\")} Resolved:\\n`);\n if (typeof result === \"string\") {\n console.log(` ${col(c.blue, result)}`);\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n console.log();\n}\n\nasync function cmdMe(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli me [--json]\n\nShows the authenticated user's profile. Requires \\`sc-cli login\\` first.\n`);\n return;\n }\n\n const config = loadConfig();\n const client = getClient(config);\n if (!client.accessToken) {\n die(\"Not logged in. Run `sc-cli login` first.\");\n }\n\n const spinner = createSpinner(\"Fetching profile…\");\n const me = await client.me.getMe();\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(me, null, 2));\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Your Profile\")}\\n`);\n console.log(` ${col(c.dim, \"Username:\")} ${col(c.bold + c.white, me.username ?? \"Unknown\")}`);\n console.log(` ${col(c.dim, \"Followers:\")} ${col(c.green, formatNumber(me.followers_count))}`);\n console.log(` ${col(c.dim, \"Following:\")} ${col(c.green, formatNumber(me.followings_count))}`);\n console.log(` ${col(c.dim, \"Tracks:\")} ${col(c.yellow, formatNumber(me.track_count))}`);\n console.log(` ${col(c.dim, \"City:\")} ${me.city ?? \"-\"}`);\n console.log(` ${col(c.dim, \"Plan:\")} ${me.quota?.unlimited_upload_quota ? \"Pro\" : \"Free\"}`);\n console.log(` ${col(c.dim, \"URL:\")} ${col(c.blue, me.permalink_url ?? \"-\")}`);\n console.log();\n}\n\nasync function cmdLikes(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli likes [--json]\n\nShows your liked tracks. Requires \\`sc-cli login\\` first.\n`);\n return;\n }\n\n const config = loadConfig();\n const client = getClient(config);\n if (!client.accessToken) {\n die(\"Not logged in. Run `sc-cli login` first.\");\n }\n\n const spinner = createSpinner(\"Fetching likes…\");\n const likes = await client.me.getLikesTracks(20);\n spinner.stop();\n\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(likes.collection, null, 2));\n return;\n }\n\n if (!likes.collection.length) {\n console.log(`\\n${col(c.yellow, \"No liked tracks.\")}`);\n return;\n }\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Your Liked Tracks\")}\\n`);\n console.log(\n ` ${col(c.dim, padRight(\"#\", 4))}${col(c.dim, padRight(\"Title\", 40))}${col(c.dim, padRight(\"Artist\", 24))}${col(c.dim, \"Duration\")}`,\n );\n console.log(` ${col(c.dim, \"─\".repeat(80))}`);\n\n likes.collection.forEach((track, i) => {\n const num = padRight(`${i + 1}`, 4);\n const title = padRight(truncate(track.title ?? \"Untitled\", 38), 40);\n const artist = padRight(truncate(track.user?.username ?? \"Unknown\", 22), 24);\n const duration = formatDuration(track.duration ?? 0);\n console.log(` ${col(c.dim, num)}${col(c.white, title)}${col(c.magenta, artist)}${col(c.yellow, duration)}`);\n });\n console.log();\n}\n\n// ── Play Command ─────────────────────────────────────────────────────────────\n\nconst isWindows = process.platform === \"win32\";\n\n/** Detect an available audio player binary */\nfunction detectPlayer(): string | null {\n const candidates = isWindows ? [\"mpv\", \"ffplay\"] : [\"mpv\", \"ffplay\", \"afplay\"];\n const whichCmd = isWindows ? \"where.exe\" : \"command -v\";\n for (const bin of candidates) {\n try {\n execSync(`${whichCmd} ${bin}`, { stdio: \"ignore\" });\n return bin;\n } catch {\n // not found, try next\n }\n }\n return null;\n}\n\n/** IPC socket path for mpv (shared between playerArgs and cmdPlay) */\nconst mpvSocketPath = isWindows ? \"\\\\\\\\.\\\\pipe\\\\sc-cli-mpv\" : path.join(os.tmpdir(), \"sc-cli-mpv.sock\");\n\n/** Build player args (suppress visual output where possible) */\nfunction playerArgs(bin: string, filePath: string): string[] {\n switch (bin) {\n case \"mpv\":\n return [\"--no-video\", \"--no-terminal\", `--input-ipc-server=${mpvSocketPath}`, filePath];\n case \"ffplay\":\n return [\"-nodisp\", \"-autoexit\", \"-loglevel\", \"quiet\", filePath];\n case \"afplay\":\n return [filePath];\n default:\n return [filePath];\n }\n}\n\nasync function cmdPlay(args: ParsedArgs): Promise<void> {\n if (args.flags[\"help\"]) {\n console.log(`\n${col(c.bold, \"Usage:\")} sc-cli play <id> [--url] [--json]\n\nPlay a SoundCloud track in your terminal.\n\n${col(c.bold, \"Options:\")}\n ${col(c.yellow, \"--url\")} Print the best stream URL and exit\n ${col(c.yellow, \"--json\")} Print raw stream URLs JSON and exit\n\n${col(c.bold, \"Examples:\")}\n sc-cli play 123456\n sc-cli play 123456 --url\n`);\n return;\n }\n\n const id = args.positional[0];\n if (!id) die(\"Usage: sc-cli play <track-id>\");\n\n const config = loadConfig();\n const client = getClient(config);\n await ensureToken(client, config);\n\n // Fetch track info and streams in parallel\n const spinner = createSpinner(\"Fetching track…\");\n const [track, streams] = await Promise.all([\n client.tracks.getTrack(id),\n client.tracks.getStreams(id),\n ]);\n spinner.stop();\n\n // --json: dump raw stream URLs\n if (args.flags[\"json\"]) {\n console.log(JSON.stringify(streams, null, 2));\n return;\n }\n\n // Pick best stream URL\n const streamUrl =\n streams.http_mp3_128_url ||\n streams.hls_mp3_128_url ||\n streams.hls_aac_160_url ||\n streams.preview_mp3_128_url;\n\n if (!streamUrl) die(\"No stream URL available for this track.\");\n\n // --url: just print and exit\n if (args.flags[\"url\"]) {\n console.log(streamUrl);\n return;\n }\n\n // Detect player\n const playerBin = detectPlayer();\n if (!playerBin) die(\"No audio player found. Install mpv, ffplay, or afplay.\");\n\n // Show track header\n const title = track.title ?? \"Untitled\";\n const artist = track.user?.username ?? \"Unknown\";\n const durationMs = track.duration ?? 0;\n const durationStr = formatDuration(durationMs);\n\n console.log(`\\n${col(c.bold + c.cyan, \"⚡ Now Playing\")}\\n`);\n console.log(` ${col(c.dim, \"Title:\")} ${col(c.bold + c.white, title)}`);\n console.log(` ${col(c.dim, \"Artist:\")} ${col(c.magenta, artist)}`);\n console.log(` ${col(c.dim, \"Duration:\")} ${col(c.yellow, durationStr)}`);\n console.log(` ${col(c.dim, \"Player:\")} ${playerBin}\\n`);\n\n // Download to temp file\n const tmpFile = path.join(os.tmpdir(), `sc-play-${id}-${Date.now()}.mp3`);\n const dlSpinner = createSpinner(\"Downloading stream…\");\n try {\n const resp = await fetch(streamUrl, {\n headers: { Authorization: `OAuth ${client.accessToken}` },\n });\n if (!resp.ok) die(`Download failed: HTTP ${resp.status}`);\n const buffer = Buffer.from(await resp.arrayBuffer());\n fs.writeFileSync(tmpFile, buffer);\n } catch (err) {\n dlSpinner.stop();\n die(`Download failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n dlSpinner.stop();\n\n // Spawn player\n const totalSec = Math.floor(durationMs / 1000);\n let player: ChildProcess | null = null;\n let progressTimer: ReturnType<typeof setInterval> | null = null;\n let startTime = Date.now();\n const usesMpv = playerBin === \"mpv\";\n\n // Restore terminal state helper\n const restoreStdin = () => {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n process.stdin.pause();\n }\n };\n\n // Cleanup helper\n const cleanup = () => {\n if (progressTimer) { clearInterval(progressTimer); progressTimer = null; }\n restoreStdin();\n process.stdout.write(\"\\n\");\n if (player && !player.killed) player.kill();\n try { fs.unlinkSync(tmpFile); } catch { /* ignore */ }\n if (usesMpv) try { fs.unlinkSync(mpvSocketPath); } catch { /* ignore */ }\n };\n\n // Handle Ctrl+C\n const onSigint = () => { cleanup(); process.exit(0); };\n process.on(\"SIGINT\", onSigint);\n\n return new Promise<void>((resolve) => {\n player = spawn(playerBin, playerArgs(playerBin, tmpFile), { stdio: \"ignore\" });\n startTime = Date.now();\n let paused = false;\n let pausedAt = 0; // total ms spent paused\n let pauseStart = 0;\n\n // Live progress bar\n const barWidth = 30;\n const drawProgress = () => {\n const pauseOffset = paused ? Date.now() - pauseStart : 0;\n const elapsed = Math.floor((Date.now() - startTime - pausedAt - pauseOffset) / 1000);\n const capped = Math.min(Math.max(elapsed, 0), totalSec);\n const ratio = totalSec > 0 ? capped / totalSec : 0;\n const filled = Math.round(ratio * barWidth);\n const empty = barWidth - filled;\n const bar = \"█\".repeat(filled) + \"░\".repeat(empty);\n const elapsedStr = formatDuration(capped * 1000);\n const icon = paused ? col(c.yellow, \"⏸\") : col(c.green, \"▶\");\n process.stdout.write(`\\r ${icon} [${col(c.cyan, bar)}] ${elapsedStr} / ${durationStr} `);\n };\n drawProgress(); // draw immediately\n progressTimer = setInterval(drawProgress, 1000);\n\n // Keyboard controls\n // afplay has no pause support; ffplay on Windows can't use SIGSTOP/SIGCONT\n const supportsPause = playerBin === \"mpv\" || (playerBin === \"ffplay\" && !isWindows);\n\n const sendMpvCommand = (cmd: string[]) => {\n if (!usesMpv) return;\n try {\n const sock = net.createConnection(mpvSocketPath);\n sock.on(\"error\", () => { /* ignore connection errors */ });\n sock.write(JSON.stringify({ command: cmd }) + \"\\n\");\n sock.end();\n } catch { /* ignore */ }\n };\n\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on(\"data\", (key: Buffer) => {\n const ch = key.toString();\n if (ch === \" \" && supportsPause && player && !player.killed) {\n if (usesMpv) {\n // Toggle pause via mpv IPC\n sendMpvCommand([\"cycle\", \"pause\"]);\n } else {\n // Signal-based fallback for ffplay\n if (paused) player.kill(\"SIGCONT\");\n else player.kill(\"SIGSTOP\");\n }\n if (paused) {\n pausedAt += Date.now() - pauseStart;\n paused = false;\n } else {\n pauseStart = Date.now();\n paused = true;\n }\n drawProgress();\n } else if (ch === \"q\" || ch === \"\\x03\") {\n // q or Ctrl+C\n if (usesMpv) sendMpvCommand([\"quit\"]);\n cleanup();\n process.removeListener(\"SIGINT\", onSigint);\n process.exit(0);\n }\n });\n }\n\n const controlHint = supportsPause ? \"[space] pause/play [q] quit\" : \"[q] quit\";\n console.log(` ${col(c.dim, controlHint)}\\n`);\n\n player.on(\"close\", () => {\n cleanup();\n process.removeListener(\"SIGINT\", onSigint);\n console.log(`\\n${col(c.green, \"✔\")} Playback complete.`);\n resolve();\n });\n\n player.on(\"error\", (err) => {\n cleanup();\n process.removeListener(\"SIGINT\", onSigint);\n die(`Player error: ${err.message}`);\n });\n });\n}\n\nfunction showHelp(): void {\n console.log(`\n${col(c.bold + c.cyan, \"⚡ sc-cli\")} ${col(c.dim, \"— Explore the SoundCloud API from your terminal\")}\n\n${col(c.bold, \"Usage:\")} sc-cli <command> [options]\n\n${col(c.bold, \"Setup:\")}\n ${col(c.green, \"auth\")} Set up API credentials (client_id + client_secret)\n ${col(c.green, \"login\")} Log in via OAuth (opens browser)\n\n${col(c.bold, \"Commands:\")}\n ${col(c.green, \"search\")} <query> Search tracks\n ${col(c.green, \"track\")} <id> Show track details\n ${col(c.green, \"user\")} <id> Show user profile\n ${col(c.green, \"playlist\")} <id> Show playlist with track listing\n ${col(c.green, \"play\")} <id> Play a track in your terminal\n ${col(c.green, \"stream\")} <id> Get stream URLs for a track\n ${col(c.green, \"resolve\")} <url> Resolve a SoundCloud URL\n ${col(c.green, \"me\")} Show your profile (requires login)\n ${col(c.green, \"likes\")} Show your liked tracks (requires login)\n\n${col(c.bold, \"Options:\")}\n ${col(c.yellow, \"--json\")} Output raw JSON (works on all commands)\n ${col(c.yellow, \"--help\")} Show help for a command\n\n${col(c.bold, \"Examples:\")}\n ${col(c.dim, \"$\")} sc-cli auth\n ${col(c.dim, \"$\")} sc-cli search \"lofi beats\"\n ${col(c.dim, \"$\")} sc-cli play 293\n ${col(c.dim, \"$\")} sc-cli track 293 --json\n ${col(c.dim, \"$\")} sc-cli resolve https://soundcloud.com/artist/track\n ${col(c.dim, \"$\")} sc-cli login\n ${col(c.dim, \"$\")} sc-cli me\n\n${col(c.dim, \"Config:\")} ${CONFIG_PATH}\n${col(c.dim, \"Powered by\")} soundcloud-api-ts\n`);\n}\n\n// ── Main ─────────────────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv);\n\n if (args.flags[\"help\"] && ![\"search\", \"track\", \"user\", \"playlist\", \"play\", \"stream\", \"resolve\", \"me\", \"likes\"].includes(args.command)) {\n showHelp();\n return;\n }\n\n try {\n switch (args.command) {\n case \"help\":\n showHelp();\n break;\n case \"auth\":\n await cmdAuth();\n break;\n case \"login\":\n await cmdLogin();\n break;\n case \"search\":\n await cmdSearch(args);\n break;\n case \"track\":\n await cmdTrack(args);\n break;\n case \"user\":\n await cmdUser(args);\n break;\n case \"playlist\":\n await cmdPlaylist(args);\n break;\n case \"play\":\n await cmdPlay(args);\n break;\n case \"stream\":\n await cmdStream(args);\n break;\n case \"resolve\":\n await cmdResolve(args);\n break;\n case \"me\":\n await cmdMe(args);\n break;\n case \"likes\":\n await cmdLikes(args);\n break;\n default:\n console.error(`\\n${col(c.red, \"✖\")} Unknown command: ${args.command}`);\n showHelp();\n process.exit(1);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n die(message);\n }\n}\n\nmain();\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "soundcloud-api-ts",
3
- "version": "1.8.5",
4
- "description": "A TypeScript client for the SoundCloud API. Zero dependencies, native fetch, full OAuth 2.1 + PKCE support.",
3
+ "version": "1.9.1",
4
+ "description": "TypeScript-first SoundCloud API client for accessing tracks, users, playlists, and search endpoints. Zero dependencies, native fetch, full OAuth 2.1 + PKCE support.",
5
5
  "bin": {
6
6
  "sc-cli": "./dist/cli.js",
7
7
  "soundcloud-cli": "./dist/cli.js"
@@ -40,16 +40,19 @@
40
40
  },
41
41
  "keywords": [
42
42
  "soundcloud",
43
- "api",
43
+ "soundcloud-api",
44
+ "soundcloud api",
44
45
  "typescript",
45
- "oauth2",
46
+ "typescript api client",
47
+ "soundcloud typescript",
46
48
  "music",
49
+ "api",
50
+ "oauth2",
47
51
  "streaming",
48
52
  "audio",
49
53
  "sdk",
50
54
  "client",
51
55
  "rest-api",
52
- "soundcloud-api",
53
56
  "pkce",
54
57
  "node"
55
58
  ],