yukimu 2.0.0 → 2.0.8
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/package.json +1 -1
- package/dist/BitrateOptimizer.d.ts +0 -52
- package/dist/BitrateOptimizer.d.ts.map +0 -1
- package/dist/BitrateOptimizer.js +0 -115
- package/dist/BitrateOptimizer.js.map +0 -1
- package/dist/ConnectionPool.d.ts +0 -84
- package/dist/ConnectionPool.d.ts.map +0 -1
- package/dist/ConnectionPool.js +0 -203
- package/dist/ConnectionPool.js.map +0 -1
- package/dist/Constants.d.ts +0 -45
- package/dist/Constants.d.ts.map +0 -1
- package/dist/Constants.js +0 -168
- package/dist/Constants.js.map +0 -1
- package/dist/Logger.d.ts +0 -22
- package/dist/Logger.d.ts.map +0 -1
- package/dist/Logger.js +0 -74
- package/dist/Logger.js.map +0 -1
- package/dist/Node.d.ts +0 -61
- package/dist/Node.d.ts.map +0 -1
- package/dist/Node.js +0 -446
- package/dist/Node.js.map +0 -1
- package/dist/Player.d.ts +0 -135
- package/dist/Player.d.ts.map +0 -1
- package/dist/Player.js +0 -530
- package/dist/Player.js.map +0 -1
- package/dist/Plugin.d.ts +0 -25
- package/dist/Plugin.d.ts.map +0 -1
- package/dist/Plugin.js +0 -15
- package/dist/Plugin.js.map +0 -1
- package/dist/Queue.d.ts +0 -89
- package/dist/Queue.d.ts.map +0 -1
- package/dist/Queue.js +0 -188
- package/dist/Queue.js.map +0 -1
- package/dist/Resolver.d.ts +0 -44
- package/dist/Resolver.d.ts.map +0 -1
- package/dist/Resolver.js +0 -289
- package/dist/Resolver.js.map +0 -1
- package/dist/Rest.d.ts +0 -46
- package/dist/Rest.d.ts.map +0 -1
- package/dist/Rest.js +0 -246
- package/dist/Rest.js.map +0 -1
- package/dist/TrackCache.d.ts +0 -41
- package/dist/TrackCache.d.ts.map +0 -1
- package/dist/TrackCache.js +0 -144
- package/dist/TrackCache.js.map +0 -1
- package/dist/WsQueue.d.ts +0 -41
- package/dist/WsQueue.d.ts.map +0 -1
- package/dist/WsQueue.js +0 -116
- package/dist/WsQueue.js.map +0 -1
- package/dist/Yukimu.d.ts +0 -84
- package/dist/Yukimu.d.ts.map +0 -1
- package/dist/Yukimu.js +0 -290
- package/dist/Yukimu.js.map +0 -1
- package/dist/connector/Connector.d.ts +0 -34
- package/dist/connector/Connector.d.ts.map +0 -1
- package/dist/connector/Connector.js +0 -39
- package/dist/connector/Connector.js.map +0 -1
- package/dist/connector/DiscordJS.d.ts +0 -27
- package/dist/connector/DiscordJS.d.ts.map +0 -1
- package/dist/connector/DiscordJS.js +0 -69
- package/dist/connector/DiscordJS.js.map +0 -1
- package/dist/connector/Eris.d.ts +0 -19
- package/dist/connector/Eris.d.ts.map +0 -1
- package/dist/connector/Eris.js +0 -62
- package/dist/connector/Eris.js.map +0 -1
- package/dist/connector/Oceanic.d.ts +0 -19
- package/dist/connector/Oceanic.d.ts.map +0 -1
- package/dist/connector/Oceanic.js +0 -60
- package/dist/connector/Oceanic.js.map +0 -1
- package/dist/errors/YukimuError.d.ts +0 -51
- package/dist/errors/YukimuError.d.ts.map +0 -1
- package/dist/errors/YukimuError.js +0 -105
- package/dist/errors/YukimuError.js.map +0 -1
- package/dist/index.d.ts +0 -29
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -70
- package/dist/index.js.map +0 -1
- package/dist/plugins/AutoResume.d.ts +0 -25
- package/dist/plugins/AutoResume.d.ts.map +0 -1
- package/dist/plugins/AutoResume.js +0 -132
- package/dist/plugins/AutoResume.js.map +0 -1
- package/dist/plugins/AutoplayPlugin.d.ts +0 -35
- package/dist/plugins/AutoplayPlugin.d.ts.map +0 -1
- package/dist/plugins/AutoplayPlugin.js +0 -111
- package/dist/plugins/AutoplayPlugin.js.map +0 -1
- package/dist/plugins/InactivityPlugin.d.ts +0 -30
- package/dist/plugins/InactivityPlugin.d.ts.map +0 -1
- package/dist/plugins/InactivityPlugin.js +0 -86
- package/dist/plugins/InactivityPlugin.js.map +0 -1
- package/dist/plugins/PlayerMoved.d.ts +0 -29
- package/dist/plugins/PlayerMoved.d.ts.map +0 -1
- package/dist/plugins/PlayerMoved.js +0 -75
- package/dist/plugins/PlayerMoved.js.map +0 -1
- package/dist/types.d.ts +0 -309
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -4
- package/dist/types.js.map +0 -1
package/dist/Queue.d.ts
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/** Yukimu v2.0.0 — Track Queue with Enhanced Operations */
|
|
2
|
-
import type { Track } from "./types";
|
|
3
|
-
/**
|
|
4
|
-
* Manages the track queue for a player.
|
|
5
|
-
*
|
|
6
|
-
* Improvements from v1:
|
|
7
|
-
* - Configurable previous history size
|
|
8
|
-
* - New methods: reverse(), removeDuplicates(), swap(), insertAt()
|
|
9
|
-
* - Serialization/deserialization for persistence
|
|
10
|
-
* - Bounds checking with meaningful errors
|
|
11
|
-
* - Proper readonly access
|
|
12
|
-
*/
|
|
13
|
-
export declare class Queue {
|
|
14
|
-
current: Track | null;
|
|
15
|
-
previous: Track[];
|
|
16
|
-
private tracks;
|
|
17
|
-
private readonly maxPreviousSize;
|
|
18
|
-
constructor(maxPreviousSize?: 25);
|
|
19
|
-
/**
|
|
20
|
-
* Add one or more tracks to the queue.
|
|
21
|
-
* @param tracks - Track or array of tracks to add
|
|
22
|
-
* @param position - Optional position to insert at (default: end of queue)
|
|
23
|
-
*/
|
|
24
|
-
add(tracks: Track | Track[], position?: number): void;
|
|
25
|
-
/**
|
|
26
|
-
* Advance the queue: move current to previous, shift next track to current.
|
|
27
|
-
* @returns The new current track, or null if the queue is empty
|
|
28
|
-
*/
|
|
29
|
-
next(): Track | null;
|
|
30
|
-
/**
|
|
31
|
-
* Remove a track at a specific index.
|
|
32
|
-
* @returns The removed track, or null if index is out of bounds
|
|
33
|
-
*/
|
|
34
|
-
remove(index: number): Track | null;
|
|
35
|
-
/**
|
|
36
|
-
* Remove a range of tracks.
|
|
37
|
-
* @param start - Start index (inclusive)
|
|
38
|
-
* @param end - End index (exclusive)
|
|
39
|
-
*/
|
|
40
|
-
removeRange(start: number, end: number): Track[];
|
|
41
|
-
/** Clear the entire queue, current track, and history */
|
|
42
|
-
clear(): void;
|
|
43
|
-
/** Clear only the queue (keep current track and history) */
|
|
44
|
-
clearQueue(): void;
|
|
45
|
-
/** Shuffle the queue using Fisher-Yates algorithm */
|
|
46
|
-
shuffle(): void;
|
|
47
|
-
/** Move a track from one position to another */
|
|
48
|
-
move(from: number, to: number): boolean;
|
|
49
|
-
/** Swap two tracks in the queue */
|
|
50
|
-
swap(i: number, j: number): boolean;
|
|
51
|
-
/**
|
|
52
|
-
* Skip to a specific index in the queue, removing everything before it.
|
|
53
|
-
* @returns The track at the given index, or null if out of bounds
|
|
54
|
-
*/
|
|
55
|
-
skipto(index: number): Track | null;
|
|
56
|
-
/** Reverse the queue order */
|
|
57
|
-
reverse(): void;
|
|
58
|
-
/**
|
|
59
|
-
* Remove duplicate tracks based on their encoded data.
|
|
60
|
-
* Keeps the first occurrence.
|
|
61
|
-
*/
|
|
62
|
-
removeDuplicates(): number;
|
|
63
|
-
/** Peek at the next N tracks without modifying the queue */
|
|
64
|
-
peek(count?: number): Track[];
|
|
65
|
-
/** Find the first track matching a predicate */
|
|
66
|
-
find(predicate: (track: Track) => boolean): Track | undefined;
|
|
67
|
-
/** Filter tracks by a predicate */
|
|
68
|
-
filter(predicate: (track: Track) => boolean): Track[];
|
|
69
|
-
/** Get the index of a track by its encoded data */
|
|
70
|
-
indexOf(encoded: string): number;
|
|
71
|
-
/** Serialize the queue state for persistence */
|
|
72
|
-
toJSON(): {
|
|
73
|
-
current: Track | null;
|
|
74
|
-
tracks: Track[];
|
|
75
|
-
previous: Track[];
|
|
76
|
-
};
|
|
77
|
-
/** Restore queue state from serialized data */
|
|
78
|
-
fromJSON(data: {
|
|
79
|
-
current?: Track | null;
|
|
80
|
-
tracks?: Track[];
|
|
81
|
-
previous?: Track[];
|
|
82
|
-
}): void;
|
|
83
|
-
get size(): number;
|
|
84
|
-
get isEmpty(): boolean;
|
|
85
|
-
get totalDuration(): number;
|
|
86
|
-
/** Readonly access to the underlying track array */
|
|
87
|
-
get list(): readonly Track[];
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=Queue.d.ts.map
|
package/dist/Queue.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Queue.d.ts","sourceRoot":"","sources":["../src/Queue.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAG3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC;;;;;;;;;GASG;AACH,qBAAa,KAAK;IACT,OAAO,EAAE,KAAK,GAAG,IAAI,CAAQ;IAC7B,QAAQ,EAAE,KAAK,EAAE,CAAM;IAC9B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,eAAe,KAAiC;IAI5D;;;;OAIG;IACI,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAW5D;;;OAGG;IACI,IAAI,IAAI,KAAK,GAAG,IAAI;IAW3B;;;OAGG;IACI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAM1C;;;;OAIG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,EAAE;IAOvD,yDAAyD;IAClD,KAAK,IAAI,IAAI;IAMpB,4DAA4D;IACrD,UAAU,IAAI,IAAI;IAIzB,qDAAqD;IAC9C,OAAO,IAAI,IAAI;IAOtB,gDAAgD;IACzC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;IAQ9C,mCAAmC;IAC5B,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;IAM1C;;;OAGG;IACI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAM1C,8BAA8B;IACvB,OAAO,IAAI,IAAI;IAItB;;;OAGG;IACI,gBAAgB,IAAI,MAAM;IAWjC,4DAA4D;IACrD,IAAI,CAAC,KAAK,SAAK,GAAG,KAAK,EAAE;IAIhC,gDAAgD;IACzC,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,GAAG,KAAK,GAAG,SAAS;IAIpE,mCAAmC;IAC5B,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,GAAG,KAAK,EAAE;IAI5D,mDAAmD;IAC5C,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAMvC,gDAAgD;IACzC,MAAM,IAAI;QACf,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC;QACtB,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,QAAQ,EAAE,KAAK,EAAE,CAAC;KACnB;IAQD,+CAA+C;IACxC,QAAQ,CAAC,IAAI,EAAE;QACpB,OAAO,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;QACvB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;QACjB,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;KACpB,GAAG,IAAI;IAQR,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,oDAAoD;IACpD,IAAI,IAAI,IAAI,SAAS,KAAK,EAAE,CAE3B;CACF"}
|
package/dist/Queue.js
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/** Yukimu v2.0.0 — Track Queue with Enhanced Operations */
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.Queue = void 0;
|
|
5
|
-
const Constants_1 = require("./Constants");
|
|
6
|
-
/**
|
|
7
|
-
* Manages the track queue for a player.
|
|
8
|
-
*
|
|
9
|
-
* Improvements from v1:
|
|
10
|
-
* - Configurable previous history size
|
|
11
|
-
* - New methods: reverse(), removeDuplicates(), swap(), insertAt()
|
|
12
|
-
* - Serialization/deserialization for persistence
|
|
13
|
-
* - Bounds checking with meaningful errors
|
|
14
|
-
* - Proper readonly access
|
|
15
|
-
*/
|
|
16
|
-
class Queue {
|
|
17
|
-
current = null;
|
|
18
|
-
previous = [];
|
|
19
|
-
tracks = [];
|
|
20
|
-
maxPreviousSize;
|
|
21
|
-
constructor(maxPreviousSize = Constants_1.DEFAULTS.PREVIOUS_HISTORY_SIZE) {
|
|
22
|
-
this.maxPreviousSize = maxPreviousSize;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Add one or more tracks to the queue.
|
|
26
|
-
* @param tracks - Track or array of tracks to add
|
|
27
|
-
* @param position - Optional position to insert at (default: end of queue)
|
|
28
|
-
*/
|
|
29
|
-
add(tracks, position) {
|
|
30
|
-
const arr = Array.isArray(tracks) ? tracks : [tracks];
|
|
31
|
-
if (arr.length === 0)
|
|
32
|
-
return;
|
|
33
|
-
if (position !== undefined && position >= 0 && position <= this.tracks.length) {
|
|
34
|
-
this.tracks.splice(position, 0, ...arr);
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
this.tracks.push(...arr);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Advance the queue: move current to previous, shift next track to current.
|
|
42
|
-
* @returns The new current track, or null if the queue is empty
|
|
43
|
-
*/
|
|
44
|
-
next() {
|
|
45
|
-
if (this.current) {
|
|
46
|
-
this.previous.unshift(this.current);
|
|
47
|
-
if (this.previous.length > this.maxPreviousSize) {
|
|
48
|
-
this.previous.length = this.maxPreviousSize;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
this.current = this.tracks.shift() ?? null;
|
|
52
|
-
return this.current;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Remove a track at a specific index.
|
|
56
|
-
* @returns The removed track, or null if index is out of bounds
|
|
57
|
-
*/
|
|
58
|
-
remove(index) {
|
|
59
|
-
if (index < 0 || index >= this.tracks.length)
|
|
60
|
-
return null;
|
|
61
|
-
const [removed] = this.tracks.splice(index, 1);
|
|
62
|
-
return removed ?? null;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Remove a range of tracks.
|
|
66
|
-
* @param start - Start index (inclusive)
|
|
67
|
-
* @param end - End index (exclusive)
|
|
68
|
-
*/
|
|
69
|
-
removeRange(start, end) {
|
|
70
|
-
if (start < 0)
|
|
71
|
-
start = 0;
|
|
72
|
-
if (end > this.tracks.length)
|
|
73
|
-
end = this.tracks.length;
|
|
74
|
-
if (start >= end)
|
|
75
|
-
return [];
|
|
76
|
-
return this.tracks.splice(start, end - start);
|
|
77
|
-
}
|
|
78
|
-
/** Clear the entire queue, current track, and history */
|
|
79
|
-
clear() {
|
|
80
|
-
this.tracks = [];
|
|
81
|
-
this.current = null;
|
|
82
|
-
this.previous = [];
|
|
83
|
-
}
|
|
84
|
-
/** Clear only the queue (keep current track and history) */
|
|
85
|
-
clearQueue() {
|
|
86
|
-
this.tracks = [];
|
|
87
|
-
}
|
|
88
|
-
/** Shuffle the queue using Fisher-Yates algorithm */
|
|
89
|
-
shuffle() {
|
|
90
|
-
for (let i = this.tracks.length - 1; i > 0; i--) {
|
|
91
|
-
const j = Math.floor(Math.random() * (i + 1));
|
|
92
|
-
[this.tracks[i], this.tracks[j]] = [this.tracks[j], this.tracks[i]];
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
/** Move a track from one position to another */
|
|
96
|
-
move(from, to) {
|
|
97
|
-
if (from < 0 || to < 0 || from >= this.tracks.length || to >= this.tracks.length)
|
|
98
|
-
return false;
|
|
99
|
-
const [track] = this.tracks.splice(from, 1);
|
|
100
|
-
if (!track)
|
|
101
|
-
return false;
|
|
102
|
-
this.tracks.splice(to, 0, track);
|
|
103
|
-
return true;
|
|
104
|
-
}
|
|
105
|
-
/** Swap two tracks in the queue */
|
|
106
|
-
swap(i, j) {
|
|
107
|
-
if (i < 0 || j < 0 || i >= this.tracks.length || j >= this.tracks.length)
|
|
108
|
-
return false;
|
|
109
|
-
[this.tracks[i], this.tracks[j]] = [this.tracks[j], this.tracks[i]];
|
|
110
|
-
return true;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Skip to a specific index in the queue, removing everything before it.
|
|
114
|
-
* @returns The track at the given index, or null if out of bounds
|
|
115
|
-
*/
|
|
116
|
-
skipto(index) {
|
|
117
|
-
if (index < 0 || index >= this.tracks.length)
|
|
118
|
-
return null;
|
|
119
|
-
this.tracks.splice(0, index);
|
|
120
|
-
return this.next();
|
|
121
|
-
}
|
|
122
|
-
/** Reverse the queue order */
|
|
123
|
-
reverse() {
|
|
124
|
-
this.tracks.reverse();
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Remove duplicate tracks based on their encoded data.
|
|
128
|
-
* Keeps the first occurrence.
|
|
129
|
-
*/
|
|
130
|
-
removeDuplicates() {
|
|
131
|
-
const seen = new Set();
|
|
132
|
-
const before = this.tracks.length;
|
|
133
|
-
this.tracks = this.tracks.filter((track) => {
|
|
134
|
-
if (seen.has(track.encoded))
|
|
135
|
-
return false;
|
|
136
|
-
seen.add(track.encoded);
|
|
137
|
-
return true;
|
|
138
|
-
});
|
|
139
|
-
return before - this.tracks.length;
|
|
140
|
-
}
|
|
141
|
-
/** Peek at the next N tracks without modifying the queue */
|
|
142
|
-
peek(count = 10) {
|
|
143
|
-
return this.tracks.slice(0, count);
|
|
144
|
-
}
|
|
145
|
-
/** Find the first track matching a predicate */
|
|
146
|
-
find(predicate) {
|
|
147
|
-
return this.tracks.find(predicate);
|
|
148
|
-
}
|
|
149
|
-
/** Filter tracks by a predicate */
|
|
150
|
-
filter(predicate) {
|
|
151
|
-
return this.tracks.filter(predicate);
|
|
152
|
-
}
|
|
153
|
-
/** Get the index of a track by its encoded data */
|
|
154
|
-
indexOf(encoded) {
|
|
155
|
-
return this.tracks.findIndex((t) => t.encoded === encoded);
|
|
156
|
-
}
|
|
157
|
-
// ─── Serialization ────────────────────────────────────────────────────
|
|
158
|
-
/** Serialize the queue state for persistence */
|
|
159
|
-
toJSON() {
|
|
160
|
-
return {
|
|
161
|
-
current: this.current,
|
|
162
|
-
tracks: [...this.tracks],
|
|
163
|
-
previous: [...this.previous],
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
/** Restore queue state from serialized data */
|
|
167
|
-
fromJSON(data) {
|
|
168
|
-
this.current = data.current ?? null;
|
|
169
|
-
this.tracks = data.tracks ? [...data.tracks] : [];
|
|
170
|
-
this.previous = data.previous ? [...data.previous] : [];
|
|
171
|
-
}
|
|
172
|
-
// ─── Getters ──────────────────────────────────────────────────────────
|
|
173
|
-
get size() {
|
|
174
|
-
return this.tracks.length;
|
|
175
|
-
}
|
|
176
|
-
get isEmpty() {
|
|
177
|
-
return this.tracks.length === 0;
|
|
178
|
-
}
|
|
179
|
-
get totalDuration() {
|
|
180
|
-
return this.tracks.reduce((acc, t) => acc + (t.info?.length ?? 0), 0);
|
|
181
|
-
}
|
|
182
|
-
/** Readonly access to the underlying track array */
|
|
183
|
-
get list() {
|
|
184
|
-
return this.tracks;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
exports.Queue = Queue;
|
|
188
|
-
//# sourceMappingURL=Queue.js.map
|
package/dist/Queue.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Queue.js","sourceRoot":"","sources":["../src/Queue.ts"],"names":[],"mappings":"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"}
|
package/dist/Resolver.d.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/** Yukimu v2.0.0 — Track Resolver with Retry, Caching & Fallback */
|
|
2
|
-
import type { Yukimu } from "./Yukimu";
|
|
3
|
-
import type { Node } from "./Node";
|
|
4
|
-
import type { SearchResult, SearchSource } from "./types";
|
|
5
|
-
/**
|
|
6
|
-
* Resolves search queries and URLs into playable tracks.
|
|
7
|
-
*
|
|
8
|
-
* Improvements from v1:
|
|
9
|
-
* - Accepts optional `node` parameter (loads on the correct node for a player)
|
|
10
|
-
* - Search retry with fallback sources
|
|
11
|
-
* - Search result caching
|
|
12
|
-
* - Spotify playlist/album resolution
|
|
13
|
-
* - Spotify token refresh with retry and timeout
|
|
14
|
-
* - Rate limit handling for Spotify API
|
|
15
|
-
*/
|
|
16
|
-
export declare class Resolver {
|
|
17
|
-
private readonly manager;
|
|
18
|
-
private spotifyToken;
|
|
19
|
-
private spotifyExpiry;
|
|
20
|
-
private spotifyRefreshing;
|
|
21
|
-
constructor(manager: Yukimu);
|
|
22
|
-
/**
|
|
23
|
-
* Resolve a query (URL or search term) into tracks.
|
|
24
|
-
*
|
|
25
|
-
* @param query - A URL or search query string
|
|
26
|
-
* @param source - The search source to use (ignored for URLs)
|
|
27
|
-
* @param requester - Optional requester metadata to attach to tracks
|
|
28
|
-
* @param node - Optional specific node to use for loading
|
|
29
|
-
*/
|
|
30
|
-
resolve(query: string, source: SearchSource, requester?: unknown, node?: Node): Promise<SearchResult>;
|
|
31
|
-
/**
|
|
32
|
-
* Detect the source platform from a URL.
|
|
33
|
-
*/
|
|
34
|
-
detectSource(url: string): SearchSource | null;
|
|
35
|
-
private trySpotifyFallback;
|
|
36
|
-
private getSpotifyToken;
|
|
37
|
-
private resolveSpotifyMeta;
|
|
38
|
-
private resolveSpotifyPlaylist;
|
|
39
|
-
private resolveSpotifyAlbum;
|
|
40
|
-
private getLoadNode;
|
|
41
|
-
private attachRequester;
|
|
42
|
-
private sleep;
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=Resolver.d.ts.map
|
package/dist/Resolver.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Resolver.d.ts","sourceRoot":"","sources":["../src/Resolver.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAGpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAS,MAAM,SAAS,CAAC;AAEjE;;;;;;;;;;GAUG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,iBAAiB,CAAS;gBAEtB,OAAO,EAAE,MAAM;IAI3B;;;;;;;OAOG;IACU,OAAO,CAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,YAAY,EACpB,SAAS,CAAC,EAAE,OAAO,EACnB,IAAI,CAAC,EAAE,IAAI,GACV,OAAO,CAAC,YAAY,CAAC;IAiExB;;OAEG;IACI,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;YASvC,kBAAkB;YA4DlB,eAAe;YAiDf,kBAAkB;YA6BlB,sBAAsB;YAqCtB,mBAAmB;IAqCjC,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,KAAK;CAGd"}
|
package/dist/Resolver.js
DELETED
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/** Yukimu v2.0.0 — Track Resolver with Retry, Caching & Fallback */
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.Resolver = void 0;
|
|
5
|
-
const Constants_1 = require("./Constants");
|
|
6
|
-
/**
|
|
7
|
-
* Resolves search queries and URLs into playable tracks.
|
|
8
|
-
*
|
|
9
|
-
* Improvements from v1:
|
|
10
|
-
* - Accepts optional `node` parameter (loads on the correct node for a player)
|
|
11
|
-
* - Search retry with fallback sources
|
|
12
|
-
* - Search result caching
|
|
13
|
-
* - Spotify playlist/album resolution
|
|
14
|
-
* - Spotify token refresh with retry and timeout
|
|
15
|
-
* - Rate limit handling for Spotify API
|
|
16
|
-
*/
|
|
17
|
-
class Resolver {
|
|
18
|
-
manager;
|
|
19
|
-
spotifyToken = null;
|
|
20
|
-
spotifyExpiry = 0;
|
|
21
|
-
spotifyRefreshing = false;
|
|
22
|
-
constructor(manager) {
|
|
23
|
-
this.manager = manager;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Resolve a query (URL or search term) into tracks.
|
|
27
|
-
*
|
|
28
|
-
* @param query - A URL or search query string
|
|
29
|
-
* @param source - The search source to use (ignored for URLs)
|
|
30
|
-
* @param requester - Optional requester metadata to attach to tracks
|
|
31
|
-
* @param node - Optional specific node to use for loading
|
|
32
|
-
*/
|
|
33
|
-
async resolve(query, source, requester, node) {
|
|
34
|
-
const targetNode = node ?? this.getLoadNode();
|
|
35
|
-
const isUrl = /^https?:\/\//.test(query);
|
|
36
|
-
const prefix = Constants_1.SOURCE_PREFIXES[source];
|
|
37
|
-
const identifier = isUrl ? query : `${prefix ?? "ytsearch"}:${query}`;
|
|
38
|
-
// Check search cache first
|
|
39
|
-
const cached = this.manager.trackCache.getSearch(identifier);
|
|
40
|
-
if (cached) {
|
|
41
|
-
this.manager.logger.debug(`Search cache hit for: ${identifier.slice(0, 80)}`);
|
|
42
|
-
// Clone and attach requester
|
|
43
|
-
const result = { ...cached, tracks: [...cached.tracks] };
|
|
44
|
-
if (requester)
|
|
45
|
-
this.attachRequester(result.tracks, requester);
|
|
46
|
-
return result;
|
|
47
|
-
}
|
|
48
|
-
// Try loading tracks with retry
|
|
49
|
-
let result = null;
|
|
50
|
-
let lastError = null;
|
|
51
|
-
for (let attempt = 0; attempt <= Constants_1.DEFAULTS.MAX_SEARCH_RETRIES; attempt++) {
|
|
52
|
-
try {
|
|
53
|
-
result = await targetNode.loadTracks(identifier);
|
|
54
|
-
if (result && result.loadType !== "error")
|
|
55
|
-
break;
|
|
56
|
-
lastError = result?.exception;
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
lastError = err;
|
|
60
|
-
this.manager.logger.debug(`loadTracks attempt ${attempt + 1} failed for "${identifier.slice(0, 80)}": ${err}`);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
if (!result) {
|
|
64
|
-
this.manager.logger.warn(`All loadTracks attempts failed for: ${identifier.slice(0, 80)}`);
|
|
65
|
-
return { loadType: "error", tracks: [], exception: { severity: "common", cause: String(lastError), message: String(lastError) } };
|
|
66
|
-
}
|
|
67
|
-
if (!result.tracks)
|
|
68
|
-
result.tracks = [];
|
|
69
|
-
// Attach requester
|
|
70
|
-
if (requester && result.tracks.length > 0) {
|
|
71
|
-
this.attachRequester(result.tracks, requester);
|
|
72
|
-
}
|
|
73
|
-
// Spotify fallback — if LavaSrc is not installed, try to resolve via metadata
|
|
74
|
-
if ((result.loadType === "error" || result.loadType === "empty") && isUrl) {
|
|
75
|
-
const spotifyFallback = await this.trySpotifyFallback(query, source, requester);
|
|
76
|
-
if (spotifyFallback)
|
|
77
|
-
return spotifyFallback;
|
|
78
|
-
}
|
|
79
|
-
// Cache successful results
|
|
80
|
-
if (result.tracks.length > 0) {
|
|
81
|
-
this.manager.trackCache.setSearch(identifier, result);
|
|
82
|
-
// Also cache individual tracks
|
|
83
|
-
for (const track of result.tracks) {
|
|
84
|
-
if (track?.encoded) {
|
|
85
|
-
this.manager.trackCache.set(track.encoded, track);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return result;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Detect the source platform from a URL.
|
|
93
|
-
*/
|
|
94
|
-
detectSource(url) {
|
|
95
|
-
for (const [source, patterns] of Object.entries(Constants_1.URL_PATTERNS)) {
|
|
96
|
-
if (patterns.some((p) => p.test(url)))
|
|
97
|
-
return source;
|
|
98
|
-
}
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
// ─── Spotify Fallback ─────────────────────────────────────────────────
|
|
102
|
-
async trySpotifyFallback(query, _source, requester) {
|
|
103
|
-
// Single track
|
|
104
|
-
const trackMatch = query.match(/spotify\.com\/track\/([a-zA-Z0-9]+)/);
|
|
105
|
-
if (trackMatch?.[1]) {
|
|
106
|
-
const meta = await this.resolveSpotifyMeta(trackMatch[1]);
|
|
107
|
-
if (meta) {
|
|
108
|
-
return this.resolve(`${meta.title} ${meta.artist}`, "youtube", requester);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
// Playlist
|
|
112
|
-
const playlistMatch = query.match(/spotify\.com\/playlist\/([a-zA-Z0-9]+)/);
|
|
113
|
-
if (playlistMatch?.[1]) {
|
|
114
|
-
const tracks = await this.resolveSpotifyPlaylist(playlistMatch[1]);
|
|
115
|
-
if (tracks.length > 0) {
|
|
116
|
-
// Resolve first 50 tracks via YouTube search
|
|
117
|
-
const resolved = [];
|
|
118
|
-
for (const meta of tracks.slice(0, 50)) {
|
|
119
|
-
try {
|
|
120
|
-
const result = await this.resolve(`${meta.title} ${meta.artist}`, "youtube", requester);
|
|
121
|
-
if (result.tracks[0])
|
|
122
|
-
resolved.push(result.tracks[0]);
|
|
123
|
-
}
|
|
124
|
-
catch {
|
|
125
|
-
// Skip failed tracks
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
if (resolved.length > 0) {
|
|
129
|
-
return { loadType: "playlist", tracks: resolved, playlistInfo: { name: "Spotify Playlist", selectedTrack: 0 } };
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
// Album
|
|
134
|
-
const albumMatch = query.match(/spotify\.com\/album\/([a-zA-Z0-9]+)/);
|
|
135
|
-
if (albumMatch?.[1]) {
|
|
136
|
-
const tracks = await this.resolveSpotifyAlbum(albumMatch[1]);
|
|
137
|
-
if (tracks.length > 0) {
|
|
138
|
-
const resolved = [];
|
|
139
|
-
for (const meta of tracks.slice(0, 50)) {
|
|
140
|
-
try {
|
|
141
|
-
const result = await this.resolve(`${meta.title} ${meta.artist}`, "youtube", requester);
|
|
142
|
-
if (result.tracks[0])
|
|
143
|
-
resolved.push(result.tracks[0]);
|
|
144
|
-
}
|
|
145
|
-
catch {
|
|
146
|
-
// Skip failed tracks
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
if (resolved.length > 0) {
|
|
150
|
-
return { loadType: "playlist", tracks: resolved, playlistInfo: { name: "Spotify Album", selectedTrack: 0 } };
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
// ─── Spotify API ──────────────────────────────────────────────────────
|
|
157
|
-
async getSpotifyToken() {
|
|
158
|
-
const opts = this.manager.options.spotify;
|
|
159
|
-
if (!opts)
|
|
160
|
-
return null;
|
|
161
|
-
// Return cached token if still valid
|
|
162
|
-
if (this.spotifyToken && Date.now() < this.spotifyExpiry) {
|
|
163
|
-
return this.spotifyToken;
|
|
164
|
-
}
|
|
165
|
-
// Prevent concurrent refresh
|
|
166
|
-
if (this.spotifyRefreshing) {
|
|
167
|
-
await this.sleep(1000);
|
|
168
|
-
return this.spotifyToken;
|
|
169
|
-
}
|
|
170
|
-
this.spotifyRefreshing = true;
|
|
171
|
-
try {
|
|
172
|
-
const controller = new AbortController();
|
|
173
|
-
const timeout = setTimeout(() => controller.abort(), 10_000);
|
|
174
|
-
const res = await fetch("https://accounts.spotify.com/api/token", {
|
|
175
|
-
method: "POST",
|
|
176
|
-
headers: {
|
|
177
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
178
|
-
Authorization: `Basic ${Buffer.from(`${opts.clientId}:${opts.clientSecret}`).toString("base64")}`,
|
|
179
|
-
},
|
|
180
|
-
body: "grant_type=client_credentials",
|
|
181
|
-
signal: controller.signal,
|
|
182
|
-
});
|
|
183
|
-
clearTimeout(timeout);
|
|
184
|
-
if (!res.ok) {
|
|
185
|
-
this.manager.logger.warn(`Spotify token request failed: ${res.status}`);
|
|
186
|
-
return null;
|
|
187
|
-
}
|
|
188
|
-
const data = (await res.json());
|
|
189
|
-
this.spotifyToken = data.access_token;
|
|
190
|
-
this.spotifyExpiry = Date.now() + data.expires_in * 1000 - Constants_1.DEFAULTS.SPOTIFY_TOKEN_REFRESH_BUFFER;
|
|
191
|
-
return this.spotifyToken;
|
|
192
|
-
}
|
|
193
|
-
catch (err) {
|
|
194
|
-
this.manager.logger.warn(`Spotify token refresh failed: ${err}`);
|
|
195
|
-
return null;
|
|
196
|
-
}
|
|
197
|
-
finally {
|
|
198
|
-
this.spotifyRefreshing = false;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
async resolveSpotifyMeta(trackId) {
|
|
202
|
-
const token = await this.getSpotifyToken();
|
|
203
|
-
if (!token)
|
|
204
|
-
return null;
|
|
205
|
-
try {
|
|
206
|
-
const controller = new AbortController();
|
|
207
|
-
const timeout = setTimeout(() => controller.abort(), 10_000);
|
|
208
|
-
const res = await fetch(`https://api.spotify.com/v1/tracks/${encodeURIComponent(trackId)}`, {
|
|
209
|
-
headers: { Authorization: `Bearer ${token}` },
|
|
210
|
-
signal: controller.signal,
|
|
211
|
-
});
|
|
212
|
-
clearTimeout(timeout);
|
|
213
|
-
if (!res.ok)
|
|
214
|
-
return null;
|
|
215
|
-
const data = (await res.json());
|
|
216
|
-
return {
|
|
217
|
-
title: data.name,
|
|
218
|
-
artist: data.artists?.[0]?.name ?? "Unknown",
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
catch {
|
|
222
|
-
return null;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
async resolveSpotifyPlaylist(playlistId) {
|
|
226
|
-
const token = await this.getSpotifyToken();
|
|
227
|
-
if (!token)
|
|
228
|
-
return [];
|
|
229
|
-
try {
|
|
230
|
-
const controller = new AbortController();
|
|
231
|
-
const timeout = setTimeout(() => controller.abort(), 15_000);
|
|
232
|
-
const res = await fetch(`https://api.spotify.com/v1/playlists/${encodeURIComponent(playlistId)}/tracks?limit=50`, {
|
|
233
|
-
headers: { Authorization: `Bearer ${token}` },
|
|
234
|
-
signal: controller.signal,
|
|
235
|
-
});
|
|
236
|
-
clearTimeout(timeout);
|
|
237
|
-
if (!res.ok)
|
|
238
|
-
return [];
|
|
239
|
-
const data = (await res.json());
|
|
240
|
-
return data.items
|
|
241
|
-
.filter((item) => item.track)
|
|
242
|
-
.map((item) => ({
|
|
243
|
-
title: item.track.name,
|
|
244
|
-
artist: item.track.artists?.[0]?.name ?? "Unknown",
|
|
245
|
-
}));
|
|
246
|
-
}
|
|
247
|
-
catch {
|
|
248
|
-
return [];
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
async resolveSpotifyAlbum(albumId) {
|
|
252
|
-
const token = await this.getSpotifyToken();
|
|
253
|
-
if (!token)
|
|
254
|
-
return [];
|
|
255
|
-
try {
|
|
256
|
-
const controller = new AbortController();
|
|
257
|
-
const timeout = setTimeout(() => controller.abort(), 15_000);
|
|
258
|
-
const res = await fetch(`https://api.spotify.com/v1/albums/${encodeURIComponent(albumId)}/tracks?limit=50`, {
|
|
259
|
-
headers: { Authorization: `Bearer ${token}` },
|
|
260
|
-
signal: controller.signal,
|
|
261
|
-
});
|
|
262
|
-
clearTimeout(timeout);
|
|
263
|
-
if (!res.ok)
|
|
264
|
-
return [];
|
|
265
|
-
const data = (await res.json());
|
|
266
|
-
return data.items.map((item) => ({
|
|
267
|
-
title: item.name,
|
|
268
|
-
artist: item.artists?.[0]?.name ?? "Unknown",
|
|
269
|
-
}));
|
|
270
|
-
}
|
|
271
|
-
catch {
|
|
272
|
-
return [];
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
// ─── Helpers ──────────────────────────────────────────────────────────
|
|
276
|
-
getLoadNode() {
|
|
277
|
-
return this.manager.getBestNode();
|
|
278
|
-
}
|
|
279
|
-
attachRequester(tracks, requester) {
|
|
280
|
-
for (const t of tracks) {
|
|
281
|
-
t["requester"] = requester;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
sleep(ms) {
|
|
285
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
exports.Resolver = Resolver;
|
|
289
|
-
//# sourceMappingURL=Resolver.js.map
|
package/dist/Resolver.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Resolver.js","sourceRoot":"","sources":["../src/Resolver.ts"],"names":[],"mappings":"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"}
|