yukimu 1.0.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.
Files changed (48) hide show
  1. package/.cache/replit/modules/nodejs-20.res +1 -0
  2. package/.cache/replit/modules/replit.res +1 -0
  3. package/.cache/replit/modules.stamp +0 -0
  4. package/.cache/replit/nix/dotreplitenv.json +1 -0
  5. package/.cache/replit/toolchain.json +1 -0
  6. package/.local/state/workflow-logs/7zVU0iVo-fBL1ccMCmELy/configure_your_app.packager.installForAll.0 +9 -0
  7. package/.local/state/workflow-logs/7zVU0iVo-fBL1ccMCmELy/configure_your_app.shell.exec.1 +1 -0
  8. package/.local/state/workflow-logs/U0AinJQVHonnwGjj0RXLn/configure_your_app.packager.installForAll.0 +2 -0
  9. package/.replit +4 -0
  10. package/.upm/store.json +1 -0
  11. package/README.md +152 -0
  12. package/dist/Node.d.ts +32 -0
  13. package/dist/Node.d.ts.map +1 -0
  14. package/dist/Node.js +186 -0
  15. package/dist/Node.js.map +1 -0
  16. package/dist/Player.d.ts +63 -0
  17. package/dist/Player.d.ts.map +1 -0
  18. package/dist/Player.js +205 -0
  19. package/dist/Player.js.map +1 -0
  20. package/dist/Queue.d.ts +29 -0
  21. package/dist/Queue.d.ts.map +1 -0
  22. package/dist/Queue.js +75 -0
  23. package/dist/Queue.js.map +1 -0
  24. package/dist/Resolver.d.ts +30 -0
  25. package/dist/Resolver.d.ts.map +1 -0
  26. package/dist/Resolver.js +121 -0
  27. package/dist/Resolver.js.map +1 -0
  28. package/dist/Yukimu.d.ts +59 -0
  29. package/dist/Yukimu.d.ts.map +1 -0
  30. package/dist/Yukimu.js +135 -0
  31. package/dist/Yukimu.js.map +1 -0
  32. package/dist/index.d.ts +7 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +29 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/types.d.ts +137 -0
  37. package/dist/types.d.ts.map +1 -0
  38. package/dist/types.js +15 -0
  39. package/dist/types.js.map +1 -0
  40. package/package.json +24 -0
  41. package/src/Node.ts +326 -0
  42. package/src/Player.ts +245 -0
  43. package/src/Queue.ts +82 -0
  44. package/src/Resolver.ts +127 -0
  45. package/src/Yukimu.ts +177 -0
  46. package/src/index.ts +6 -0
  47. package/src/types.ts +178 -0
  48. package/tsconfig.json +18 -0
@@ -0,0 +1 @@
1
+ {"type":"resolve","resolvedModuleId":"nodejs-20","inputHash":"","resolutionPath":["nodejs-20"],"error":"","Changed":true}
@@ -0,0 +1 @@
1
+ {"type":"resolve","resolvedModuleId":"replit","inputHash":"","resolutionPath":["replit"],"error":"","Changed":true}
File without changes
@@ -0,0 +1 @@
1
+ {"channel":"","channel_nix_path":"/nix/store/42iv6n6l2izliq7lhy3gsaqsycj6np1h-nixpkgs/nixpkgs","env":null,"packages":null}
@@ -0,0 +1 @@
1
+ {"runs":[{"id":"module:nodejs-20/runner:nodeJS", "name":"Node.js", "fileParam":true, "language":"javascript", "fileTypeAttrs":{}, "displayVersion":"20.20.0", "run":{"command":{"args":["sh", "-c", "/nix/store/1lagpgadaybvs1n2312gysg2phjk89y8-nodejs-20.20.0-wrapped/bin/node $file"]}}, "defaultEntrypoints":["index.js", "main.js"]}], "languageServers":[{"id":"module:nodejs-20/languageServer:typescript-language-server", "name":"TypeScript Language Server", "language":"javascript", "fileTypeAttrs":{"extensions":[".js", ".jsx", ".ts", ".tsx", ".mjs", ".mts", ".cjs", ".cts", ".es6", ".json"]}, "config":{"startCommand":{"args":["sh", "-c", "/nix/store/pkx0287w1vx971gahfkggqa59v35d4bm-typescript-language-server-5.1.3/bin/typescript-language-server --stdio"]}, "initializationOptionsJson":"{\"disableAutomaticTypingAcquisition\":true,\"maxTsServerMemory\":1536,\"tsserver\":{\"fallbackPath\":\"/nix/store/6wjhsy7rpyxbpl65grd5a8aq96b50i8a-typescript-5.9.3/lib/node_modules/typescript/lib\"}}"}, "displayVersion":"5.1.3"}, {"id":"module:replit/languageServer:dotreplit-lsp", "name":".replit LSP", "language":"dotreplit", "fileTypeAttrs":{}, "config":{"startCommand":{"args":["sh", "-c", "/nix/store/qq4mijbp008lc0r1h42jy3fhwakqz6nf-taplo-0.patched/bin/taplo lsp -c /nix/store/7nplpw32gfk08i6d1v3wmwj3b1qd0apw-taplo-config.toml stdio"]}}}], "packagers":[{"id":"module:nodejs-20/packager:upmNodejs", "name":"Node.js packager (npm, yarn, pnpm, bun)", "language":"nodejs", "packageSearch":true, "guessImports":true}], "formatters":[{"id":"module:nodejs-20/formatter:prettier", "name":"Prettier", "startCommand":{"args":["/nix/store/h0yq53vj17w8bqs8bdldg2kg1llkqi7i-run-prettier/bin/run-prettier"], "lifecycle":"STDIN", "splitStderr":true}, "fileTypeAttrs":{"extensions":[".js", ".jsx", ".ts", ".tsx", ".json", ".html"]}, "displayVersion":"3.6.2", "supportsRangeFormatting":true}, {"id":"module:nodejs-20/languageServer:typescript-language-server", "name":"TypeScript Language Server", "fileTypeAttrs":{"extensions":[".js", ".jsx", ".ts", ".tsx", ".mjs", ".mts", ".cjs", ".cts", ".es6", ".json"]}, "displayVersion":"5.1.3"}, {"id":"module:replit/languageServer:dotreplit-lsp", "name":".replit LSP", "fileTypeAttrs":{}}]}
@@ -0,0 +1,9 @@
1
+ --> npm install
2
+ β ™β Ήβ Έβ Όβ ΄
3
+ up to date, audited 28 packages in 657ms
4
+ β ΄
5
+ β ΄7 packages are looking for funding
6
+ β ΄ run `npm fund` for details
7
+ β ΄
8
+ found 0 vulnerabilities
9
+ β ΄
@@ -0,0 +1 @@
1
+ Please use the ξΊ§Workflows pane to configure your app. For more info, see: https://docs.replit.com/replit-workspace/workflows#creating-workflows
@@ -0,0 +1,2 @@
1
+ --> npm install
2
+ β ™β Ή
package/.replit ADDED
@@ -0,0 +1,4 @@
1
+ modules = ["nodejs-20"]
2
+
3
+ [agent]
4
+ expertMode = true
@@ -0,0 +1 @@
1
+ {"version":2,"languages":{"nodejs-npm":{"specfileHash":"305f2ee63ccbb188aa67eb515c9baf60","lockfileHash":"993e663e31dc86082c38db12d1e2c218"}}}
package/README.md ADDED
@@ -0,0 +1,152 @@
1
+ # Yukimu 🎡
2
+
3
+ A powerful **Lavalink v4** wrapper for Discord bots β€” built like Shoukaku.
4
+
5
+ Supports: YouTube Β· YouTube Music Β· Spotify Β· Deezer Β· Apple Music Β· JioSaavn Β· Tidal Β· SoundCloud Β· Yandex Music
6
+
7
+ ---
8
+
9
+ ## Requirements
10
+
11
+ - Node.js 18+
12
+ - A running **Lavalink v4** server
13
+ - **LavaSrc plugin** on your Lavalink server (for Spotify, Deezer, Apple Music, Tidal, JioSaavn)
14
+
15
+ ## Install
16
+
17
+ ```bash
18
+ npm install yukimu ws
19
+ npm install -D typescript @types/node @types/ws
20
+ ```
21
+
22
+ ## Lavalink Setup
23
+
24
+ Your `application.yml` needs the LavaSrc plugin for multi-source support:
25
+
26
+ ```yaml
27
+ lavalink:
28
+ plugins:
29
+ - dependency: "com.github.topi314.lavasrc:lavasrc-plugin:4.3.0"
30
+ repository: "https://maven.topi.wtf/releases"
31
+
32
+ plugins:
33
+ lavasrc:
34
+ providers:
35
+ - "ytsearch:\"%ISRC%\""
36
+ - "ytsearch:%QUERY%"
37
+ sources:
38
+ spotify: true
39
+ appleMusic: true
40
+ deezer: true
41
+ yandexMusic: true
42
+ jiosaavn: true
43
+ spotify:
44
+ clientId: "YOUR_SPOTIFY_CLIENT_ID"
45
+ clientSecret: "YOUR_SPOTIFY_CLIENT_SECRET"
46
+ appleMusic:
47
+ mediaAPIToken: "YOUR_APPLE_MUSIC_TOKEN"
48
+ deezer:
49
+ masterDecryptionKey: "YOUR_DEEZER_KEY"
50
+ ```
51
+
52
+ ## Quick Start
53
+
54
+ ```ts
55
+ import { Client, GatewayIntentBits } from "discord.js";
56
+ import { Yukimu } from "yukimu";
57
+
58
+ const client = new Client({ intents: [...] });
59
+
60
+ const yukimu = new Yukimu({
61
+ clientId: "BOT_ID",
62
+ token: "BOT_TOKEN",
63
+ nodes: [{
64
+ name: "main",
65
+ host: "localhost",
66
+ port: 2333,
67
+ password: "youshallnotpass",
68
+ }],
69
+ defaultSource: "youtube",
70
+ });
71
+
72
+ // Required: forward voice payloads
73
+ yukimu.sendPayload = (guildId, payload) => {
74
+ client.guilds.cache.get(guildId)?.shard.send(payload);
75
+ };
76
+
77
+ // Required: forward voice events
78
+ client.on("raw", (packet) => {
79
+ if (packet.t === "VOICE_STATE_UPDATE") yukimu.handleVoiceStateUpdate(packet.d);
80
+ if (packet.t === "VOICE_SERVER_UPDATE") yukimu.handleVoiceServerUpdate(packet.d);
81
+ });
82
+ ```
83
+
84
+ ## Search Examples
85
+
86
+ ```ts
87
+ // Search YouTube (default)
88
+ const result = await yukimu.search("never gonna give you up");
89
+
90
+ // Search Spotify
91
+ const result = await yukimu.search("blinding lights", "spotify");
92
+
93
+ // Direct URL (any platform)
94
+ const result = await yukimu.search("https://open.spotify.com/track/...");
95
+ const result = await yukimu.search("https://www.jiosaavn.com/song/...");
96
+ const result = await yukimu.search("https://tidal.com/browse/track/...");
97
+ ```
98
+
99
+ ## Player API
100
+
101
+ ```ts
102
+ const player = yukimu.createPlayer({
103
+ guildId: "123",
104
+ voiceChannelId: "456",
105
+ selfDeaf: true,
106
+ volume: 80,
107
+ });
108
+
109
+ await player.add(track); // Add & auto-play
110
+ await player.pause(); // Pause
111
+ await player.resume(); // Resume
112
+ await player.skip(); // Skip
113
+ await player.seek(30000); // Seek to 30s
114
+ await player.setVolume(80); // Volume 0-1000
115
+ await player.setBassBoost("high"); // Bass boost
116
+ await player.setNightcore(true); // Nightcore
117
+ await player.set8D(true); // 8D audio
118
+ await player.clearFilters(); // Clear all filters
119
+ player.queue.shuffle(); // Shuffle queue
120
+ player.setLoop("track"); // Loop: none | track | queue
121
+ yukimu.destroyPlayer(guildId); // Disconnect
122
+ ```
123
+
124
+ ## Events
125
+
126
+ ```ts
127
+ yukimu.on("nodeReady", (node) => {});
128
+ yukimu.on("trackStart", (player, track) => {});
129
+ yukimu.on("trackEnd", (player, track, reason) => {});
130
+ yukimu.on("trackError", (player, track, exception) => {});
131
+ yukimu.on("queueEnd", (player) => {});
132
+ yukimu.on("nodeDisconnect", (node, code, reason) => {});
133
+ ```
134
+
135
+ ## Supported Sources
136
+
137
+ | Source | Search | Direct URL | Requires |
138
+ |--------|--------|------------|---------|
139
+ | YouTube | βœ… | βœ… | Lavalink default |
140
+ | YouTube Music | βœ… | βœ… | Lavalink default |
141
+ | SoundCloud | βœ… | βœ… | Lavalink default |
142
+ | Spotify | βœ… | βœ… | LavaSrc plugin |
143
+ | Deezer | βœ… | βœ… | LavaSrc plugin |
144
+ | Apple Music | βœ… | βœ… | LavaSrc plugin |
145
+ | Tidal | βœ… | βœ… | LavaSrc plugin |
146
+ | JioSaavn | βœ… | βœ… | LavaSrc plugin |
147
+ | Yandex Music | βœ… | βœ… | LavaSrc plugin |
148
+
149
+ ---
150
+
151
+ MIT License
152
+
package/dist/Node.d.ts ADDED
@@ -0,0 +1,32 @@
1
+ import WebSocket from "ws";
2
+ import { NodeOptions, NodeStats, Track } from "./types";
3
+ import type { Yukimu } from "./Yukimu";
4
+ export declare class Node {
5
+ readonly manager: Yukimu;
6
+ readonly options: NodeOptions;
7
+ ws: WebSocket | null;
8
+ connected: boolean;
9
+ stats: NodeStats | null;
10
+ sessionId: string | null;
11
+ private reconnectAttempts;
12
+ private reconnectTimeout?;
13
+ constructor(manager: Yukimu, options: NodeOptions);
14
+ get wsUrl(): string;
15
+ get restUrl(): string;
16
+ get headers(): Record<string, string>;
17
+ connect(): void;
18
+ destroy(): void;
19
+ private onOpen;
20
+ private onMessage;
21
+ private onClose;
22
+ private onError;
23
+ private scheduleReconnect;
24
+ private handlePlayerUpdate;
25
+ private handleEvent;
26
+ request<T = unknown>(method: string, path: string, body?: unknown): Promise<T>;
27
+ /** Load tracks from Lavalink */
28
+ loadTracks(identifier: string): Promise<import("./types").SearchResult>;
29
+ /** Decode a single track */
30
+ decodeTrack(encoded: string): Promise<Track>;
31
+ }
32
+ //# sourceMappingURL=Node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Node.d.ts","sourceRoot":"","sources":["../src/Node.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAqB,MAAM,SAAS,CAAC;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIvC,qBAAa,IAAI;IACf,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,SAAgB,OAAO,EAAE,WAAW,CAAC;IAC9B,EAAE,EAAE,SAAS,GAAG,IAAI,CAAQ;IAC5B,SAAS,EAAE,OAAO,CAAS;IAC3B,KAAK,EAAE,SAAS,GAAG,IAAI,CAAQ;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEvC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,gBAAgB,CAAC,CAAgC;gBAE7C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW;IAWjD,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED,IAAI,OAAO,IAAI,MAAM,CAGpB;IAED,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMpC;IAEM,OAAO,IAAI,IAAI;IAWf,OAAO,IAAI,IAAI;IAUtB,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,SAAS;IA6BjB,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,WAAW;IAyCN,OAAO,CAAC,CAAC,GAAG,OAAO,EAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC;IAsBb,gCAAgC;IACnB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,SAAS,EAAE,YAAY,CAAC;IAIpF,4BAA4B;IACf,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;CAG1D"}
package/dist/Node.js ADDED
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Node = void 0;
7
+ const ws_1 = __importDefault(require("ws"));
8
+ const LAVALINK_API_VERSION = "v4";
9
+ class Node {
10
+ constructor(manager, options) {
11
+ this.ws = null;
12
+ this.connected = false;
13
+ this.stats = null;
14
+ this.sessionId = null;
15
+ this.reconnectAttempts = 0;
16
+ this.manager = manager;
17
+ this.options = {
18
+ secure: false,
19
+ retries: 5,
20
+ ...options,
21
+ };
22
+ }
23
+ // ─── Connection ───────────────────────────────────────────────────
24
+ get wsUrl() {
25
+ const protocol = this.options.secure ? "wss" : "ws";
26
+ return `${protocol}://${this.options.host}:${this.options.port}/${LAVALINK_API_VERSION}/websocket`;
27
+ }
28
+ get restUrl() {
29
+ const protocol = this.options.secure ? "https" : "http";
30
+ return `${protocol}://${this.options.host}:${this.options.port}`;
31
+ }
32
+ get headers() {
33
+ return {
34
+ Authorization: this.options.password,
35
+ "User-Id": this.manager.options.clientId,
36
+ "Client-Name": "Yukimu/1.0.0",
37
+ };
38
+ }
39
+ connect() {
40
+ if (this.ws?.readyState === ws_1.default.OPEN)
41
+ return;
42
+ this.ws = new ws_1.default(this.wsUrl, { headers: this.headers });
43
+ this.ws.on("open", () => this.onOpen());
44
+ this.ws.on("message", (data) => this.onMessage(data));
45
+ this.ws.on("close", (code, reason) => this.onClose(code, reason.toString()));
46
+ this.ws.on("error", (err) => this.onError(err));
47
+ }
48
+ destroy() {
49
+ if (this.reconnectTimeout)
50
+ clearTimeout(this.reconnectTimeout);
51
+ this.ws?.removeAllListeners();
52
+ this.ws?.close();
53
+ this.ws = null;
54
+ this.connected = false;
55
+ }
56
+ // ─── WebSocket Events ─────────────────────────────────────────────
57
+ onOpen() {
58
+ this.connected = true;
59
+ this.reconnectAttempts = 0;
60
+ this.manager.emit("nodeConnect", this);
61
+ console.log(`[Yukimu] Node "${this.options.name}" connected`);
62
+ }
63
+ onMessage(raw) {
64
+ let payload;
65
+ try {
66
+ payload = JSON.parse(raw.toString());
67
+ }
68
+ catch {
69
+ return;
70
+ }
71
+ switch (payload.op) {
72
+ case "ready":
73
+ this.sessionId = payload.sessionId;
74
+ this.manager.emit("nodeReady", this);
75
+ console.log(`[Yukimu] Node "${this.options.name}" ready | session: ${this.sessionId}`);
76
+ break;
77
+ case "stats":
78
+ this.stats = payload;
79
+ break;
80
+ case "playerUpdate":
81
+ this.handlePlayerUpdate(payload);
82
+ break;
83
+ case "event":
84
+ this.handleEvent(payload);
85
+ break;
86
+ }
87
+ }
88
+ onClose(code, reason) {
89
+ this.connected = false;
90
+ this.manager.emit("nodeDisconnect", this, code, reason);
91
+ console.warn(`[Yukimu] Node "${this.options.name}" disconnected (${code}): ${reason}`);
92
+ this.scheduleReconnect();
93
+ }
94
+ onError(error) {
95
+ this.manager.emit("nodeError", this, error);
96
+ console.error(`[Yukimu] Node "${this.options.name}" error:`, error.message);
97
+ }
98
+ // ─── Reconnect ────────────────────────────────────────────────────
99
+ scheduleReconnect() {
100
+ const maxRetries = this.options.retries ?? 5;
101
+ if (this.reconnectAttempts >= maxRetries) {
102
+ console.error(`[Yukimu] Node "${this.options.name}" max reconnect attempts reached`);
103
+ return;
104
+ }
105
+ const delay = Math.min(1000 * 2 ** this.reconnectAttempts, 30000);
106
+ this.reconnectAttempts++;
107
+ console.log(`[Yukimu] Reconnecting node "${this.options.name}" in ${delay}ms (attempt ${this.reconnectAttempts})`);
108
+ this.reconnectTimeout = setTimeout(() => this.connect(), delay);
109
+ }
110
+ // ─── Event Handlers ───────────────────────────────────────────────
111
+ handlePlayerUpdate(payload) {
112
+ const player = this.manager.players.get(payload.guildId);
113
+ if (!player)
114
+ return;
115
+ const state = payload.state;
116
+ player.position = state.position ?? 0;
117
+ player.ping = state.ping ?? -1;
118
+ this.manager.emit("playerUpdate", player);
119
+ }
120
+ handleEvent(payload) {
121
+ const player = this.manager.players.get(payload.guildId);
122
+ if (!player)
123
+ return;
124
+ switch (payload.type) {
125
+ case "TrackStartEvent":
126
+ player.playing = true;
127
+ this.manager.emit("trackStart", player, payload.track);
128
+ break;
129
+ case "TrackEndEvent":
130
+ player.playing = false;
131
+ player.position = 0;
132
+ this.manager.emit("trackEnd", player, payload.track, payload.reason);
133
+ // Auto-play next in queue
134
+ if (payload.reason !== "replaced" && payload.reason !== "stopped") {
135
+ player.queue.next();
136
+ if (player.queue.current) {
137
+ player.play(player.queue.current);
138
+ }
139
+ else {
140
+ this.manager.emit("queueEnd", player);
141
+ }
142
+ }
143
+ break;
144
+ case "TrackExceptionEvent":
145
+ this.manager.emit("trackError", player, payload.track, payload.exception);
146
+ break;
147
+ case "TrackStuckEvent":
148
+ this.manager.emit("trackStuck", player, payload.track, payload.thresholdMs);
149
+ break;
150
+ case "WebSocketClosedEvent":
151
+ this.manager.emit("socketClosed", player, payload.code, payload.reason);
152
+ break;
153
+ }
154
+ }
155
+ // ─── REST API ─────────────────────────────────────────────────────
156
+ async request(method, path, body) {
157
+ if (!this.sessionId)
158
+ throw new Error("Node is not ready (no session ID)");
159
+ const url = `${this.restUrl}/${LAVALINK_API_VERSION}${path}`;
160
+ const res = await fetch(url, {
161
+ method,
162
+ headers: {
163
+ ...this.headers,
164
+ "Content-Type": "application/json",
165
+ },
166
+ body: body ? JSON.stringify(body) : undefined,
167
+ });
168
+ if (!res.ok) {
169
+ const text = await res.text();
170
+ throw new Error(`[Yukimu] REST error ${res.status} on ${method} ${path}: ${text}`);
171
+ }
172
+ if (res.status === 204)
173
+ return undefined;
174
+ return res.json();
175
+ }
176
+ /** Load tracks from Lavalink */
177
+ async loadTracks(identifier) {
178
+ return this.request("GET", `/loadtracks?identifier=${encodeURIComponent(identifier)}`);
179
+ }
180
+ /** Decode a single track */
181
+ async decodeTrack(encoded) {
182
+ return this.request("GET", `/decodetrack?encodedTrack=${encodeURIComponent(encoded)}`);
183
+ }
184
+ }
185
+ exports.Node = Node;
186
+ //# sourceMappingURL=Node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Node.js","sourceRoot":"","sources":["../src/Node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { Queue } from "./Queue";
2
+ import { Track, PlayerOptions } from "./types";
3
+ import type { Yukimu } from "./Yukimu";
4
+ import type { Node } from "./Node";
5
+ export declare class Player {
6
+ readonly manager: Yukimu;
7
+ readonly node: Node;
8
+ readonly queue: Queue;
9
+ readonly guildId: string;
10
+ voiceChannelId: string | null;
11
+ textChannelId?: string;
12
+ playing: boolean;
13
+ paused: boolean;
14
+ connected: boolean;
15
+ position: number;
16
+ ping: number;
17
+ volume: number;
18
+ sessionId: string | null;
19
+ voiceToken: string | null;
20
+ voiceEndpoint: string | null;
21
+ filters: Record<string, unknown>;
22
+ loop: "none" | "track" | "queue";
23
+ constructor(manager: Yukimu, node: Node, options: PlayerOptions);
24
+ private sendVoicePayload;
25
+ /** Called when both sessionId and voiceToken/endpoint are available */
26
+ checkVoiceReady(): void;
27
+ /** Play a track */
28
+ play(track: Track, options?: {
29
+ startTime?: number;
30
+ endTime?: number;
31
+ }): Promise<void>;
32
+ /** Pause or resume playback */
33
+ pause(state?: boolean): Promise<void>;
34
+ /** Resume playback */
35
+ resume(): Promise<void>;
36
+ /** Stop playback */
37
+ stop(): Promise<void>;
38
+ /** Skip to next track */
39
+ skip(): Promise<Track | null>;
40
+ /** Seek to position in milliseconds */
41
+ seek(position: number): Promise<void>;
42
+ /** Set volume (0–1000, Lavalink default 100) */
43
+ setVolume(volume: number): Promise<void>;
44
+ /** Apply audio filters (bass boost, nightcore, 8D, etc.) */
45
+ setFilters(filters: Record<string, unknown>): Promise<void>;
46
+ /** Enable bass boost */
47
+ setBassBoost(level: "low" | "medium" | "high" | "off"): Promise<void>;
48
+ /** Enable nightcore effect */
49
+ setNightcore(enabled: boolean): Promise<void>;
50
+ /** Enable 8D audio */
51
+ set8D(enabled: boolean): Promise<void>;
52
+ /** Clear all filters */
53
+ clearFilters(): Promise<void>;
54
+ /** Add track(s) to queue and optionally start playing */
55
+ add(tracks: Track | Track[], playNow?: boolean): Promise<void>;
56
+ /** Set loop mode */
57
+ setLoop(mode: "none" | "track" | "queue"): void;
58
+ /** Disconnect from voice and clean up */
59
+ destroy(): Promise<void>;
60
+ /** Move to a different voice channel */
61
+ move(channelId: string, selfDeaf?: boolean): Promise<void>;
62
+ }
63
+ //# sourceMappingURL=Player.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"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"}