soundcloud-api-ts 1.8.5 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -2
- package/dist/cli.js +212 -1
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +211 -1
- package/dist/cli.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -77,6 +77,9 @@ sc-cli track 293
|
|
|
77
77
|
# View user profile
|
|
78
78
|
sc-cli user 12345
|
|
79
79
|
|
|
80
|
+
# Play a track in your terminal (mpv recommended)
|
|
81
|
+
sc-cli play 293
|
|
82
|
+
|
|
80
83
|
# Get stream URLs
|
|
81
84
|
sc-cli stream 293
|
|
82
85
|
|
|
@@ -97,8 +100,11 @@ Every command supports `--json` for machine-readable output (great for piping to
|
|
|
97
100
|
```
|
|
98
101
|
⚡ sc-cli — Explore the SoundCloud API from your terminal
|
|
99
102
|
|
|
100
|
-
Commands: auth, login, search, track, user, playlist, stream, resolve, me, likes
|
|
101
|
-
Options: --json (raw JSON output), --help (per-command help)
|
|
103
|
+
Commands: auth, login, search, track, user, playlist, play, stream, resolve, me, likes
|
|
104
|
+
Options: --json (raw JSON output), --url (play: print URL only), --help (per-command help)
|
|
105
|
+
|
|
106
|
+
Play controls: [space] pause/resume (mpv/ffplay), [q] quit
|
|
107
|
+
Supported players: mpv (recommended — IPC pause/resume), ffplay, afplay (macOS)
|
|
102
108
|
```
|
|
103
109
|
|
|
104
110
|
## 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