disvoice 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 (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +410 -0
  3. package/dist/MusicPlayer.d.ts +81 -0
  4. package/dist/MusicPlayer.d.ts.map +1 -0
  5. package/dist/MusicPlayer.js +258 -0
  6. package/dist/MusicPlayer.js.map +1 -0
  7. package/dist/Queue.d.ts +69 -0
  8. package/dist/Queue.d.ts.map +1 -0
  9. package/dist/Queue.js +149 -0
  10. package/dist/Queue.js.map +1 -0
  11. package/dist/index.d.ts +9 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +34 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/sources/BaseSource.d.ts +22 -0
  16. package/dist/sources/BaseSource.d.ts.map +1 -0
  17. package/dist/sources/BaseSource.js +19 -0
  18. package/dist/sources/BaseSource.js.map +1 -0
  19. package/dist/sources/SoundCloudSource.d.ts +10 -0
  20. package/dist/sources/SoundCloudSource.d.ts.map +1 -0
  21. package/dist/sources/SoundCloudSource.js +124 -0
  22. package/dist/sources/SoundCloudSource.js.map +1 -0
  23. package/dist/sources/SpotifySource.d.ts +12 -0
  24. package/dist/sources/SpotifySource.d.ts.map +1 -0
  25. package/dist/sources/SpotifySource.js +129 -0
  26. package/dist/sources/SpotifySource.js.map +1 -0
  27. package/dist/sources/YouTubeSource.d.ts +14 -0
  28. package/dist/sources/YouTubeSource.d.ts.map +1 -0
  29. package/dist/sources/YouTubeSource.js +174 -0
  30. package/dist/sources/YouTubeSource.js.map +1 -0
  31. package/dist/types/index.d.ts +47 -0
  32. package/dist/types/index.d.ts.map +1 -0
  33. package/dist/types/index.js +11 -0
  34. package/dist/types/index.js.map +1 -0
  35. package/dist/utils/TimeFormat.d.ts +3 -0
  36. package/dist/utils/TimeFormat.d.ts.map +1 -0
  37. package/dist/utils/TimeFormat.js +29 -0
  38. package/dist/utils/TimeFormat.js.map +1 -0
  39. package/package.json +57 -0
@@ -0,0 +1,258 @@
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.MusicPlayer = void 0;
7
+ const voice_1 = require("@discordjs/voice");
8
+ const ffmpeg_static_1 = __importDefault(require("ffmpeg-static"));
9
+ process.env.FFMPEG_PATH = ffmpeg_static_1.default || 'ffmpeg';
10
+ const events_1 = require("events");
11
+ const Queue_1 = require("./Queue");
12
+ const types_1 = require("./types");
13
+ const YouTubeSource_1 = require("./sources/YouTubeSource");
14
+ const SpotifySource_1 = require("./sources/SpotifySource");
15
+ const SoundCloudSource_1 = require("./sources/SoundCloudSource");
16
+ class MusicPlayer extends events_1.EventEmitter {
17
+ constructor(options = {}) {
18
+ super();
19
+ this.connection = null;
20
+ this.currentVolume = 100;
21
+ this.leaveTimeout = null;
22
+ this.isPlaying = false;
23
+ this.options = {
24
+ leaveOnEmpty: true,
25
+ leaveOnEmptyCooldown: 60000,
26
+ leaveOnEnd: true,
27
+ volume: 100,
28
+ ...options
29
+ };
30
+ this.currentVolume = this.options.volume || 100;
31
+ this.player = (0, voice_1.createAudioPlayer)();
32
+ this.queue = new Queue_1.Queue();
33
+ // Initialize sources
34
+ this.sources = [
35
+ new YouTubeSource_1.YouTubeSource(),
36
+ new SpotifySource_1.SpotifySource(),
37
+ new SoundCloudSource_1.SoundCloudSource()
38
+ ];
39
+ this.setupPlayerEvents();
40
+ }
41
+ /**
42
+ * Connect to a voice channel
43
+ */
44
+ connect(channel) {
45
+ if (this.connection) {
46
+ this.connection.destroy();
47
+ }
48
+ this.connection = (0, voice_1.joinVoiceChannel)({
49
+ channelId: channel.id,
50
+ guildId: channel.guild.id,
51
+ adapterCreator: channel.guild.voiceAdapterCreator
52
+ });
53
+ this.connection.subscribe(this.player);
54
+ this.connection.on(voice_1.VoiceConnectionStatus.Disconnected, async () => {
55
+ try {
56
+ await Promise.race([
57
+ (0, voice_1.entersState)(this.connection, voice_1.VoiceConnectionStatus.Signalling, 5000),
58
+ (0, voice_1.entersState)(this.connection, voice_1.VoiceConnectionStatus.Connecting, 5000),
59
+ ]);
60
+ }
61
+ catch {
62
+ this.connection?.destroy();
63
+ this.connection = null;
64
+ }
65
+ });
66
+ return this.connection;
67
+ }
68
+ /**
69
+ * Play a track or search query
70
+ */
71
+ async play(query, requester, channel) {
72
+ if (channel && !this.connection) {
73
+ this.connect(channel);
74
+ }
75
+ if (!this.connection) {
76
+ throw new Error('Not connected to a voice channel');
77
+ }
78
+ // Clear leave timeout if exists
79
+ if (this.leaveTimeout) {
80
+ clearTimeout(this.leaveTimeout);
81
+ this.leaveTimeout = null;
82
+ }
83
+ // Find appropriate source
84
+ const source = this.sources.find(s => s.validate(query)) || this.sources[0]; // Default to YouTube
85
+ const result = await source.search(query, requester);
86
+ if (result.tracks.length === 0) {
87
+ throw new Error('No tracks found');
88
+ }
89
+ // Add tracks to queue
90
+ if (result.playlist) {
91
+ this.queue.addMany(result.tracks);
92
+ }
93
+ else {
94
+ this.queue.addMany(result.tracks);
95
+ }
96
+ // If not currently playing, start playing
97
+ if (!this.isPlaying) {
98
+ await this.playNext();
99
+ }
100
+ return result;
101
+ }
102
+ /**
103
+ * Play the next track in queue
104
+ */
105
+ async playNext() {
106
+ const track = this.queue.next();
107
+ if (!track) {
108
+ this.isPlaying = false;
109
+ this.emit('queueEnd');
110
+ if (this.options.leaveOnEnd) {
111
+ this.scheduleLeave();
112
+ }
113
+ return;
114
+ }
115
+ try {
116
+ const source = this.sources.find(s => {
117
+ if (track.source === types_1.SourceType.YouTube)
118
+ return s instanceof YouTubeSource_1.YouTubeSource;
119
+ if (track.source === types_1.SourceType.Spotify)
120
+ return s instanceof SpotifySource_1.SpotifySource;
121
+ if (track.source === types_1.SourceType.SoundCloud)
122
+ return s instanceof SoundCloudSource_1.SoundCloudSource;
123
+ return false;
124
+ }) || this.sources[0];
125
+ const stream = await source.getStream(track);
126
+ const resource = (0, voice_1.createAudioResource)(stream, {
127
+ inputType: voice_1.StreamType.Arbitrary,
128
+ inlineVolume: true
129
+ });
130
+ resource.volume?.setVolume(this.currentVolume / 100);
131
+ this.player.play(resource);
132
+ this.isPlaying = true;
133
+ this.emit('trackStart', track);
134
+ }
135
+ catch (error) {
136
+ console.error('Error playing track:', error);
137
+ this.emit('error', error, track);
138
+ await this.playNext(); // Try next track
139
+ }
140
+ }
141
+ /**
142
+ * Skip the current track
143
+ */
144
+ skip() {
145
+ const nextTrack = this.queue.skip();
146
+ this.player.stop();
147
+ return nextTrack;
148
+ }
149
+ /**
150
+ * Pause playback
151
+ */
152
+ pause() {
153
+ return this.player.pause();
154
+ }
155
+ /**
156
+ * Resume playback
157
+ */
158
+ resume() {
159
+ return this.player.unpause();
160
+ }
161
+ /**
162
+ * Stop playback and clear queue
163
+ */
164
+ stop() {
165
+ this.queue.clear();
166
+ this.player.stop();
167
+ this.isPlaying = false;
168
+ }
169
+ /**
170
+ * Set volume (0-100)
171
+ */
172
+ setVolume(volume) {
173
+ const oldVolume = this.currentVolume;
174
+ this.currentVolume = Math.max(0, Math.min(100, volume));
175
+ // Apply volume to current resource if playing
176
+ if (this.player.state.status === voice_1.AudioPlayerStatus.Playing) {
177
+ const resource = this.player.state.resource;
178
+ if (resource && resource.volume) {
179
+ resource.volume.setVolume(this.currentVolume / 100);
180
+ }
181
+ }
182
+ this.emit('volumeChange', oldVolume, this.currentVolume);
183
+ }
184
+ /**
185
+ * Get current volume
186
+ */
187
+ getVolume() {
188
+ return this.currentVolume;
189
+ }
190
+ /**
191
+ * Get the queue
192
+ */
193
+ getQueue() {
194
+ return this.queue;
195
+ }
196
+ /**
197
+ * Disconnect from voice channel
198
+ */
199
+ disconnect() {
200
+ if (this.leaveTimeout) {
201
+ clearTimeout(this.leaveTimeout);
202
+ this.leaveTimeout = null;
203
+ }
204
+ this.stop();
205
+ this.connection?.destroy();
206
+ this.connection = null;
207
+ }
208
+ /**
209
+ * Schedule automatic leave
210
+ */
211
+ scheduleLeave() {
212
+ if (this.leaveTimeout) {
213
+ clearTimeout(this.leaveTimeout);
214
+ }
215
+ if (this.options.leaveOnEmpty) {
216
+ this.leaveTimeout = setTimeout(() => {
217
+ this.disconnect();
218
+ }, this.options.leaveOnEmptyCooldown || 60000);
219
+ }
220
+ }
221
+ /**
222
+ * Setup player event handlers
223
+ */
224
+ setupPlayerEvents() {
225
+ this.player.on(voice_1.AudioPlayerStatus.Idle, () => {
226
+ const currentTrack = this.queue.current();
227
+ if (currentTrack) {
228
+ this.emit('trackEnd', currentTrack);
229
+ }
230
+ this.playNext();
231
+ });
232
+ this.player.on('error', (error) => {
233
+ console.error('Audio player error:', error);
234
+ this.emit('error', new Error(error.message), this.queue.current() || undefined);
235
+ this.playNext();
236
+ });
237
+ }
238
+ /**
239
+ * Get current track
240
+ */
241
+ getCurrentTrack() {
242
+ return this.queue.current();
243
+ }
244
+ /**
245
+ * Check if player is connected
246
+ */
247
+ isConnected() {
248
+ return this.connection !== null;
249
+ }
250
+ /**
251
+ * Check if currently playing
252
+ */
253
+ isCurrentlyPlaying() {
254
+ return this.isPlaying;
255
+ }
256
+ }
257
+ exports.MusicPlayer = MusicPlayer;
258
+ //# sourceMappingURL=MusicPlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MusicPlayer.js","sourceRoot":"","sources":["../src/MusicPlayer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { Track, QueueOptions } from './types';
2
+ export declare class Queue {
3
+ private tracks;
4
+ private history;
5
+ private currentIndex;
6
+ private options;
7
+ constructor(options?: QueueOptions);
8
+ /**
9
+ * Add a track to the queue
10
+ */
11
+ add(track: Track): void;
12
+ /**
13
+ * Add multiple tracks to the queue
14
+ */
15
+ addMany(tracks: Track[]): void;
16
+ /**
17
+ * Get the next track in the queue
18
+ */
19
+ next(): Track | null;
20
+ /**
21
+ * Get the current track
22
+ */
23
+ current(): Track | null;
24
+ /**
25
+ * Skip the current track
26
+ */
27
+ skip(): Track | null;
28
+ /**
29
+ * Clear the entire queue
30
+ */
31
+ clear(): void;
32
+ /**
33
+ * Remove a track at a specific index
34
+ */
35
+ remove(index: number): Track | null;
36
+ /**
37
+ * Shuffle the queue
38
+ */
39
+ shuffle(): void;
40
+ /**
41
+ * Get all tracks in the queue
42
+ */
43
+ getTracks(): Track[];
44
+ /**
45
+ * Get the queue size
46
+ */
47
+ size(): number;
48
+ /**
49
+ * Check if the queue is empty
50
+ */
51
+ isEmpty(): boolean;
52
+ /**
53
+ * Get queue history
54
+ */
55
+ getHistory(): Track[];
56
+ /**
57
+ * Set queue options
58
+ */
59
+ setOptions(options: QueueOptions): void;
60
+ /**
61
+ * Get queue options
62
+ */
63
+ getOptions(): QueueOptions;
64
+ /**
65
+ * Reset the queue position
66
+ */
67
+ reset(): void;
68
+ }
69
+ //# sourceMappingURL=Queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Queue.d.ts","sourceRoot":"","sources":["../src/Queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE9C,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,GAAE,YAAiB;IAUtC;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAIvB;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAI9B;;OAEG;IACH,IAAI,IAAI,KAAK,GAAG,IAAI;IAyBpB;;OAEG;IACH,OAAO,IAAI,KAAK,GAAG,IAAI;IAOvB;;OAEG;IACH,IAAI,IAAI,KAAK,GAAG,IAAI;IAcpB;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAWnC;;OAEG;IACH,OAAO,IAAI,IAAI;IAQf;;OAEG;IACH,SAAS,IAAI,KAAK,EAAE;IAIpB;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,UAAU,IAAI,KAAK,EAAE;IAIrB;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAIvC;;OAEG;IACH,UAAU,IAAI,YAAY;IAI1B;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
package/dist/Queue.js ADDED
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Queue = void 0;
4
+ class Queue {
5
+ constructor(options = {}) {
6
+ this.tracks = [];
7
+ this.history = [];
8
+ this.currentIndex = -1;
9
+ this.options = {
10
+ loop: false,
11
+ loopQueue: false,
12
+ shuffle: false,
13
+ autoplay: false,
14
+ ...options
15
+ };
16
+ }
17
+ /**
18
+ * Add a track to the queue
19
+ */
20
+ add(track) {
21
+ this.tracks.push(track);
22
+ }
23
+ /**
24
+ * Add multiple tracks to the queue
25
+ */
26
+ addMany(tracks) {
27
+ this.tracks.push(...tracks);
28
+ }
29
+ /**
30
+ * Get the next track in the queue
31
+ */
32
+ next() {
33
+ if (this.options.loop && this.currentIndex >= 0) {
34
+ return this.tracks[this.currentIndex];
35
+ }
36
+ if (this.options.shuffle && this.tracks.length > 0) {
37
+ const randomIndex = Math.floor(Math.random() * this.tracks.length);
38
+ const track = this.tracks[randomIndex];
39
+ this.currentIndex = randomIndex;
40
+ return track;
41
+ }
42
+ this.currentIndex++;
43
+ if (this.currentIndex >= this.tracks.length) {
44
+ if (this.options.loopQueue && this.tracks.length > 0) {
45
+ this.currentIndex = 0;
46
+ return this.tracks[0];
47
+ }
48
+ return null;
49
+ }
50
+ return this.tracks[this.currentIndex];
51
+ }
52
+ /**
53
+ * Get the current track
54
+ */
55
+ current() {
56
+ if (this.currentIndex < 0 || this.currentIndex >= this.tracks.length) {
57
+ return null;
58
+ }
59
+ return this.tracks[this.currentIndex];
60
+ }
61
+ /**
62
+ * Skip the current track
63
+ */
64
+ skip() {
65
+ const currentTrack = this.current();
66
+ if (currentTrack) {
67
+ this.history.push(currentTrack);
68
+ }
69
+ if (!this.options.loop) {
70
+ this.remove(this.currentIndex);
71
+ this.currentIndex--;
72
+ }
73
+ return this.next();
74
+ }
75
+ /**
76
+ * Clear the entire queue
77
+ */
78
+ clear() {
79
+ this.tracks = [];
80
+ this.currentIndex = -1;
81
+ }
82
+ /**
83
+ * Remove a track at a specific index
84
+ */
85
+ remove(index) {
86
+ if (index < 0 || index >= this.tracks.length) {
87
+ return null;
88
+ }
89
+ const removed = this.tracks.splice(index, 1)[0];
90
+ if (index < this.currentIndex) {
91
+ this.currentIndex--;
92
+ }
93
+ return removed;
94
+ }
95
+ /**
96
+ * Shuffle the queue
97
+ */
98
+ shuffle() {
99
+ for (let i = this.tracks.length - 1; i > 0; i--) {
100
+ const j = Math.floor(Math.random() * (i + 1));
101
+ [this.tracks[i], this.tracks[j]] = [this.tracks[j], this.tracks[i]];
102
+ }
103
+ this.currentIndex = -1;
104
+ }
105
+ /**
106
+ * Get all tracks in the queue
107
+ */
108
+ getTracks() {
109
+ return [...this.tracks];
110
+ }
111
+ /**
112
+ * Get the queue size
113
+ */
114
+ size() {
115
+ return this.tracks.length;
116
+ }
117
+ /**
118
+ * Check if the queue is empty
119
+ */
120
+ isEmpty() {
121
+ return this.tracks.length === 0;
122
+ }
123
+ /**
124
+ * Get queue history
125
+ */
126
+ getHistory() {
127
+ return [...this.history];
128
+ }
129
+ /**
130
+ * Set queue options
131
+ */
132
+ setOptions(options) {
133
+ this.options = { ...this.options, ...options };
134
+ }
135
+ /**
136
+ * Get queue options
137
+ */
138
+ getOptions() {
139
+ return { ...this.options };
140
+ }
141
+ /**
142
+ * Reset the queue position
143
+ */
144
+ reset() {
145
+ this.currentIndex = -1;
146
+ }
147
+ }
148
+ exports.Queue = Queue;
149
+ //# sourceMappingURL=Queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Queue.js","sourceRoot":"","sources":["../src/Queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { MusicPlayer } from './MusicPlayer';
2
+ export { Queue } from './Queue';
3
+ export { BaseSource } from './sources/BaseSource';
4
+ export { YouTubeSource } from './sources/YouTubeSource';
5
+ export { SpotifySource } from './sources/SpotifySource';
6
+ export { SoundCloudSource } from './sources/SoundCloudSource';
7
+ export * from './types';
8
+ export { formatDuration, parseDuration } from './utils/TimeFormat';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.parseDuration = exports.formatDuration = exports.SoundCloudSource = exports.SpotifySource = exports.YouTubeSource = exports.BaseSource = exports.Queue = exports.MusicPlayer = void 0;
18
+ var MusicPlayer_1 = require("./MusicPlayer");
19
+ Object.defineProperty(exports, "MusicPlayer", { enumerable: true, get: function () { return MusicPlayer_1.MusicPlayer; } });
20
+ var Queue_1 = require("./Queue");
21
+ Object.defineProperty(exports, "Queue", { enumerable: true, get: function () { return Queue_1.Queue; } });
22
+ var BaseSource_1 = require("./sources/BaseSource");
23
+ Object.defineProperty(exports, "BaseSource", { enumerable: true, get: function () { return BaseSource_1.BaseSource; } });
24
+ var YouTubeSource_1 = require("./sources/YouTubeSource");
25
+ Object.defineProperty(exports, "YouTubeSource", { enumerable: true, get: function () { return YouTubeSource_1.YouTubeSource; } });
26
+ var SpotifySource_1 = require("./sources/SpotifySource");
27
+ Object.defineProperty(exports, "SpotifySource", { enumerable: true, get: function () { return SpotifySource_1.SpotifySource; } });
28
+ var SoundCloudSource_1 = require("./sources/SoundCloudSource");
29
+ Object.defineProperty(exports, "SoundCloudSource", { enumerable: true, get: function () { return SoundCloudSource_1.SoundCloudSource; } });
30
+ __exportStar(require("./types"), exports);
31
+ var TimeFormat_1 = require("./utils/TimeFormat");
32
+ Object.defineProperty(exports, "formatDuration", { enumerable: true, get: function () { return TimeFormat_1.formatDuration; } });
33
+ Object.defineProperty(exports, "parseDuration", { enumerable: true, get: function () { return TimeFormat_1.parseDuration; } });
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AACpB,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AACd,mDAAkD;AAAzC,wGAAA,UAAU,OAAA;AACnB,yDAAwD;AAA/C,8GAAA,aAAa,OAAA;AACtB,yDAAwD;AAA/C,8GAAA,aAAa,OAAA;AACtB,+DAA8D;AAArD,oHAAA,gBAAgB,OAAA;AACzB,0CAAwB;AACxB,iDAAmE;AAA1D,4GAAA,cAAc,OAAA;AAAE,2GAAA,aAAa,OAAA"}
@@ -0,0 +1,22 @@
1
+ import { Track, SearchResult } from '../types';
2
+ import { User } from 'discord.js';
3
+ export declare abstract class BaseSource {
4
+ abstract name: string;
5
+ /**
6
+ * Validate if the URL belongs to this source
7
+ */
8
+ abstract validate(query: string): boolean;
9
+ /**
10
+ * Search for tracks
11
+ */
12
+ abstract search(query: string, requester: User): Promise<SearchResult>;
13
+ /**
14
+ * Get stream URL for a track
15
+ */
16
+ abstract getStream(track: Track): Promise<string | NodeJS.ReadableStream>;
17
+ /**
18
+ * Check if query is a URL
19
+ */
20
+ protected isURL(query: string): boolean;
21
+ }
22
+ //# sourceMappingURL=BaseSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseSource.d.ts","sourceRoot":"","sources":["../../src/sources/BaseSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,8BAAsB,UAAU;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAEzC;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;IAEtE;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;IAEzE;;OAEG;IACH,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAQxC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseSource = void 0;
4
+ class BaseSource {
5
+ /**
6
+ * Check if query is a URL
7
+ */
8
+ isURL(query) {
9
+ try {
10
+ new URL(query);
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ }
18
+ exports.BaseSource = BaseSource;
19
+ //# sourceMappingURL=BaseSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseSource.js","sourceRoot":"","sources":["../../src/sources/BaseSource.ts"],"names":[],"mappings":";;;AAGA,MAAsB,UAAU;IAkB9B;;OAEG;IACO,KAAK,CAAC,KAAa;QAC3B,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AA7BD,gCA6BC"}
@@ -0,0 +1,10 @@
1
+ import { BaseSource } from './BaseSource';
2
+ import { Track, SearchResult } from '../types';
3
+ import { User } from 'discord.js';
4
+ export declare class SoundCloudSource extends BaseSource {
5
+ name: string;
6
+ validate(query: string): boolean;
7
+ search(query: string, requester: User): Promise<SearchResult>;
8
+ getStream(track: Track): Promise<string | NodeJS.ReadableStream>;
9
+ }
10
+ //# sourceMappingURL=SoundCloudSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SoundCloudSource.d.ts","sourceRoot":"","sources":["../../src/sources/SoundCloudSource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,YAAY,EAAc,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGlC,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,IAAI,SAAgB;IAEpB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAK1B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;IAsE7D,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;CASvE"}