distube 4.0.0-dev.1 → 4.0.0-dev.4
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 +1 -1
- package/dist/index.d.ts +604 -8
- package/dist/index.js +2437 -22
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2375 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +82 -46
- package/dist/DisTube.d.ts +0 -521
- package/dist/DisTube.d.ts.map +0 -1
- package/dist/DisTube.js +0 -793
- package/dist/DisTube.js.map +0 -1
- package/dist/constant.d.ts +0 -124
- package/dist/constant.d.ts.map +0 -1
- package/dist/constant.js +0 -144
- package/dist/constant.js.map +0 -1
- package/dist/core/DisTubeBase.d.ts +0 -54
- package/dist/core/DisTubeBase.d.ts.map +0 -1
- package/dist/core/DisTubeBase.js +0 -75
- package/dist/core/DisTubeBase.js.map +0 -1
- package/dist/core/DisTubeHandler.d.ts +0 -93
- package/dist/core/DisTubeHandler.d.ts.map +0 -1
- package/dist/core/DisTubeHandler.js +0 -292
- package/dist/core/DisTubeHandler.js.map +0 -1
- package/dist/core/DisTubeOptions.d.ts +0 -23
- package/dist/core/DisTubeOptions.d.ts.map +0 -1
- package/dist/core/DisTubeOptions.js +0 -90
- package/dist/core/DisTubeOptions.js.map +0 -1
- package/dist/core/DisTubeStream.d.ts +0 -52
- package/dist/core/DisTubeStream.d.ts.map +0 -1
- package/dist/core/DisTubeStream.js +0 -108
- package/dist/core/DisTubeStream.js.map +0 -1
- package/dist/core/index.d.ts +0 -7
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -19
- package/dist/core/index.js.map +0 -1
- package/dist/core/manager/BaseManager.d.ts +0 -22
- package/dist/core/manager/BaseManager.d.ts.map +0 -1
- package/dist/core/manager/BaseManager.js +0 -42
- package/dist/core/manager/BaseManager.js.map +0 -1
- package/dist/core/manager/QueueManager.d.ts +0 -33
- package/dist/core/manager/QueueManager.d.ts.map +0 -1
- package/dist/core/manager/QueueManager.js +0 -193
- package/dist/core/manager/QueueManager.js.map +0 -1
- package/dist/core/manager/index.d.ts +0 -3
- package/dist/core/manager/index.d.ts.map +0 -1
- package/dist/core/manager/index.js +0 -15
- package/dist/core/manager/index.js.map +0 -1
- package/dist/core/voice/DisTubeVoice.d.ts +0 -82
- package/dist/core/voice/DisTubeVoice.d.ts.map +0 -1
- package/dist/core/voice/DisTubeVoice.js +0 -250
- package/dist/core/voice/DisTubeVoice.js.map +0 -1
- package/dist/core/voice/DisTubeVoiceManager.d.ts +0 -41
- package/dist/core/voice/DisTubeVoiceManager.d.ts.map +0 -1
- package/dist/core/voice/DisTubeVoiceManager.js +0 -67
- package/dist/core/voice/DisTubeVoiceManager.js.map +0 -1
- package/dist/core/voice/index.d.ts +0 -3
- package/dist/core/voice/index.d.ts.map +0 -1
- package/dist/core/voice/index.js +0 -15
- package/dist/core/voice/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/plugin/http.d.ts +0 -10
- package/dist/plugin/http.d.ts.map +0 -1
- package/dist/plugin/http.js +0 -18
- package/dist/plugin/http.js.map +0 -1
- package/dist/plugin/https.d.ts +0 -19
- package/dist/plugin/https.d.ts.map +0 -1
- package/dist/plugin/https.js +0 -47
- package/dist/plugin/https.js.map +0 -1
- package/dist/plugin/index.d.ts +0 -3
- package/dist/plugin/index.d.ts.map +0 -1
- package/dist/plugin/index.js +0 -15
- package/dist/plugin/index.js.map +0 -1
- package/dist/struct/CustomPlugin.d.ts +0 -51
- package/dist/struct/CustomPlugin.d.ts.map +0 -1
- package/dist/struct/CustomPlugin.js +0 -50
- package/dist/struct/CustomPlugin.js.map +0 -1
- package/dist/struct/DisTubeError.d.ts +0 -55
- package/dist/struct/DisTubeError.d.ts.map +0 -1
- package/dist/struct/DisTubeError.js +0 -64
- package/dist/struct/DisTubeError.js.map +0 -1
- package/dist/struct/ExtractorPlugin.d.ts +0 -45
- package/dist/struct/ExtractorPlugin.d.ts.map +0 -1
- package/dist/struct/ExtractorPlugin.js +0 -39
- package/dist/struct/ExtractorPlugin.js.map +0 -1
- package/dist/struct/Playlist.d.ts +0 -54
- package/dist/struct/Playlist.d.ts.map +0 -1
- package/dist/struct/Playlist.js +0 -131
- package/dist/struct/Playlist.js.map +0 -1
- package/dist/struct/Plugin.d.ts +0 -75
- package/dist/struct/Plugin.d.ts.map +0 -1
- package/dist/struct/Plugin.js +0 -99
- package/dist/struct/Plugin.js.map +0 -1
- package/dist/struct/Queue.d.ts +0 -216
- package/dist/struct/Queue.d.ts.map +0 -1
- package/dist/struct/Queue.js +0 -479
- package/dist/struct/Queue.js.map +0 -1
- package/dist/struct/SearchResult.d.ts +0 -27
- package/dist/struct/SearchResult.d.ts.map +0 -1
- package/dist/struct/SearchResult.js +0 -77
- package/dist/struct/SearchResult.js.map +0 -1
- package/dist/struct/Song.d.ts +0 -78
- package/dist/struct/Song.d.ts.map +0 -1
- package/dist/struct/Song.js +0 -259
- package/dist/struct/Song.js.map +0 -1
- package/dist/struct/TaskQueue.d.ts +0 -28
- package/dist/struct/TaskQueue.d.ts.map +0 -1
- package/dist/struct/TaskQueue.js +0 -64
- package/dist/struct/TaskQueue.js.map +0 -1
- package/dist/struct/index.d.ts +0 -10
- package/dist/struct/index.d.ts.map +0 -1
- package/dist/struct/index.js +0 -22
- package/dist/struct/index.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/type.d.ts +0 -169
- package/dist/type.d.ts.map +0 -1
- package/dist/type.js +0 -3
- package/dist/type.js.map +0 -1
- package/dist/util.d.ts +0 -51
- package/dist/util.d.ts.map +0 -1
- package/dist/util.js +0 -225
- package/dist/util.js.map +0 -1
|
@@ -1,292 +0,0 @@
|
|
|
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.DisTubeHandler = void 0;
|
|
7
|
-
const ytdl_core_1 = __importDefault(require("@distube/ytdl-core"));
|
|
8
|
-
const ytpl_1 = __importDefault(require("@distube/ytpl"));
|
|
9
|
-
const _1 = require(".");
|
|
10
|
-
const __1 = require("..");
|
|
11
|
-
const util_1 = require("../util");
|
|
12
|
-
/**
|
|
13
|
-
* DisTube's Handler
|
|
14
|
-
* @extends DisTubeBase
|
|
15
|
-
* @private
|
|
16
|
-
*/
|
|
17
|
-
class DisTubeHandler extends _1.DisTubeBase {
|
|
18
|
-
constructor(distube) {
|
|
19
|
-
super(distube);
|
|
20
|
-
if (this.options.youtubeCookie) {
|
|
21
|
-
const requestOptions = {
|
|
22
|
-
headers: {
|
|
23
|
-
cookie: this.options.youtubeCookie,
|
|
24
|
-
},
|
|
25
|
-
};
|
|
26
|
-
if (this.options.youtubeIdentityToken) {
|
|
27
|
-
requestOptions.headers["x-youtube-identity-token"] = this.options.youtubeIdentityToken;
|
|
28
|
-
}
|
|
29
|
-
Object.assign(this.ytdlOptions, { requestOptions });
|
|
30
|
-
}
|
|
31
|
-
const client = this.client;
|
|
32
|
-
if (this.options.leaveOnEmpty) {
|
|
33
|
-
client.on("voiceStateUpdate", oldState => {
|
|
34
|
-
if (!oldState?.channel)
|
|
35
|
-
return;
|
|
36
|
-
const queue = this.queues.get(oldState);
|
|
37
|
-
if (!queue) {
|
|
38
|
-
if ((0, __1.isVoiceChannelEmpty)(oldState)) {
|
|
39
|
-
setTimeout(() => {
|
|
40
|
-
if (!this.queues.get(oldState) && (0, __1.isVoiceChannelEmpty)(oldState))
|
|
41
|
-
this.voices.leave(oldState);
|
|
42
|
-
}, this.options.emptyCooldown * 1e3).unref();
|
|
43
|
-
}
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
if (queue.emptyTimeout) {
|
|
47
|
-
clearTimeout(queue.emptyTimeout);
|
|
48
|
-
delete queue.emptyTimeout;
|
|
49
|
-
}
|
|
50
|
-
if ((0, __1.isVoiceChannelEmpty)(oldState)) {
|
|
51
|
-
queue.emptyTimeout = setTimeout(() => {
|
|
52
|
-
delete queue.emptyTimeout;
|
|
53
|
-
if ((0, __1.isVoiceChannelEmpty)(oldState)) {
|
|
54
|
-
queue.voice.leave();
|
|
55
|
-
this.emit("empty", queue);
|
|
56
|
-
if (queue.stopped)
|
|
57
|
-
queue.delete();
|
|
58
|
-
}
|
|
59
|
-
}, this.options.emptyCooldown * 1e3).unref();
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
get ytdlOptions() {
|
|
65
|
-
return this.options.ytdlOptions;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* @param {string} url url
|
|
69
|
-
* @param {boolean} [basic=false] getBasicInfo?
|
|
70
|
-
* @returns {Promise<ytdl.videoInfo>}
|
|
71
|
-
*/
|
|
72
|
-
getYouTubeInfo(url, basic = false) {
|
|
73
|
-
if (basic)
|
|
74
|
-
return ytdl_core_1.default.getBasicInfo(url, this.ytdlOptions);
|
|
75
|
-
return ytdl_core_1.default.getInfo(url, this.ytdlOptions);
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Resolve a Song
|
|
79
|
-
* @param {string|Song|SearchResult|Playlist} song URL | Search string | {@link Song}
|
|
80
|
-
* @param {Object} [options] Optional options
|
|
81
|
-
* @param {Discord.GuildMember} [options.member] Requested user
|
|
82
|
-
* @param {*} [options.metadata] Metadata
|
|
83
|
-
* @returns {Promise<Song|Playlist|null>} Resolved
|
|
84
|
-
*/
|
|
85
|
-
async resolveSong(song, options = {}) {
|
|
86
|
-
if (song instanceof __1.Song || song instanceof __1.Playlist) {
|
|
87
|
-
if ("metadata" in options)
|
|
88
|
-
song.metadata = options.metadata;
|
|
89
|
-
if ("member" in options)
|
|
90
|
-
song.member = options.member;
|
|
91
|
-
return song;
|
|
92
|
-
}
|
|
93
|
-
if (song instanceof __1.SearchResult) {
|
|
94
|
-
if (song.type === "video")
|
|
95
|
-
return new __1.Song(song, options);
|
|
96
|
-
return this.resolvePlaylist(song.url, options);
|
|
97
|
-
}
|
|
98
|
-
if ((0, util_1.isObject)(song))
|
|
99
|
-
return new __1.Song(song, options);
|
|
100
|
-
if (ytdl_core_1.default.validateURL(song))
|
|
101
|
-
return new __1.Song(await this.getYouTubeInfo(song), options);
|
|
102
|
-
if ((0, __1.isURL)(song)) {
|
|
103
|
-
for (const plugin of this.distube.extractorPlugins) {
|
|
104
|
-
if (await plugin.validate(song))
|
|
105
|
-
return plugin.resolve(song, options);
|
|
106
|
-
}
|
|
107
|
-
throw new __1.DisTubeError("NOT_SUPPORTED_URL");
|
|
108
|
-
}
|
|
109
|
-
throw new __1.DisTubeError("CANNOT_RESOLVE_SONG", song);
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Resolve Song[] or url to a Playlist
|
|
113
|
-
* @param {Playlist|Song[]|string} playlist Resolvable playlist
|
|
114
|
-
* @param {Object} options Optional options
|
|
115
|
-
* @param {Discord.GuildMember} [options.member] Requested user
|
|
116
|
-
* @param {string} [options.source="youtube"] Playlist source
|
|
117
|
-
* @param {*} [options.metadata] Metadata
|
|
118
|
-
* @returns {Promise<Playlist>}
|
|
119
|
-
*/
|
|
120
|
-
async resolvePlaylist(playlist, options = {}) {
|
|
121
|
-
const { member, source, metadata } = { source: "youtube", ...options };
|
|
122
|
-
if (playlist instanceof __1.Playlist) {
|
|
123
|
-
if (metadata)
|
|
124
|
-
playlist._patchMetadata(metadata);
|
|
125
|
-
if (member)
|
|
126
|
-
playlist._patchMember(member);
|
|
127
|
-
return playlist;
|
|
128
|
-
}
|
|
129
|
-
let solvablePlaylist;
|
|
130
|
-
if (typeof playlist === "string") {
|
|
131
|
-
solvablePlaylist = await (0, ytpl_1.default)(playlist, { limit: Infinity });
|
|
132
|
-
solvablePlaylist.items = solvablePlaylist.items
|
|
133
|
-
.filter(v => !v.thumbnail.includes("no_thumbnail"))
|
|
134
|
-
.map(v => new __1.Song(v, { member, metadata }));
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
solvablePlaylist = playlist;
|
|
138
|
-
}
|
|
139
|
-
return new __1.Playlist(solvablePlaylist, { member, properties: { source }, metadata });
|
|
140
|
-
}
|
|
141
|
-
async handlePlaylist(voice, playlist, options = {}) {
|
|
142
|
-
const { textChannel, skip, unshift } = { skip: false, unshift: false, ...options };
|
|
143
|
-
let position = Number(options.position);
|
|
144
|
-
if (!position) {
|
|
145
|
-
if (skip && position !== 0)
|
|
146
|
-
position = 1;
|
|
147
|
-
else
|
|
148
|
-
position = 0;
|
|
149
|
-
}
|
|
150
|
-
if (unshift)
|
|
151
|
-
position = 1;
|
|
152
|
-
if (!(playlist instanceof __1.Playlist))
|
|
153
|
-
throw new __1.DisTubeError("INVALID_TYPE", "Playlist", playlist, "playlist");
|
|
154
|
-
if (!this.options.nsfw && !textChannel?.nsfw) {
|
|
155
|
-
playlist.songs = playlist.songs.filter(s => !s.age_restricted);
|
|
156
|
-
}
|
|
157
|
-
if (!playlist.songs.length) {
|
|
158
|
-
if (!this.options.nsfw && !textChannel?.nsfw)
|
|
159
|
-
throw new __1.DisTubeError("EMPTY_FILTERED_PLAYLIST");
|
|
160
|
-
throw new __1.DisTubeError("EMPTY_PLAYLIST");
|
|
161
|
-
}
|
|
162
|
-
const songs = playlist.songs;
|
|
163
|
-
const queue = this.queues.get(voice);
|
|
164
|
-
if (queue) {
|
|
165
|
-
queue.addToQueue(songs, position);
|
|
166
|
-
if (skip)
|
|
167
|
-
queue.skip();
|
|
168
|
-
else
|
|
169
|
-
this.emit("addList", queue, playlist);
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
const newQueue = await this.queues.create(voice, songs, textChannel);
|
|
173
|
-
if (newQueue instanceof __1.Queue) {
|
|
174
|
-
if (this.options.emitAddListWhenCreatingQueue)
|
|
175
|
-
this.emit("addList", newQueue, playlist);
|
|
176
|
-
this.emit("playSong", newQueue, newQueue.songs[0]);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Search for a song, fire {@link DisTube#event:error} if not found.
|
|
182
|
-
* @param {Discord.Message} message The original message from an user
|
|
183
|
-
* @param {string} query The query string
|
|
184
|
-
* @returns {Promise<SearchResult?>} Song info
|
|
185
|
-
*/
|
|
186
|
-
async searchSong(message, query) {
|
|
187
|
-
if (!(0, __1.isMessageInstance)(message))
|
|
188
|
-
throw new __1.DisTubeError("INVALID_TYPE", "Discord.Message", message, "message");
|
|
189
|
-
if (typeof query !== "string")
|
|
190
|
-
throw new __1.DisTubeError("INVALID_TYPE", "string", query, "query");
|
|
191
|
-
if (query.length === 0)
|
|
192
|
-
throw new __1.DisTubeError("EMPTY_STRING", "query");
|
|
193
|
-
const limit = this.options.searchSongs > 1 ? this.options.searchSongs : 1;
|
|
194
|
-
const results = await this.distube
|
|
195
|
-
.search(query, {
|
|
196
|
-
limit,
|
|
197
|
-
safeSearch: this.options.nsfw ? false : !message.channel?.nsfw,
|
|
198
|
-
})
|
|
199
|
-
.catch(() => {
|
|
200
|
-
if (!this.emit("searchNoResult", message, query)) {
|
|
201
|
-
// eslint-disable-next-line no-console
|
|
202
|
-
console.warn("searchNoResult event does not have any listeners! Emits `error` event instead.");
|
|
203
|
-
throw new __1.DisTubeError("NO_RESULT");
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
if (!results)
|
|
207
|
-
return null;
|
|
208
|
-
return this.createSearchMessageCollector(message, results, query);
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Create a message collector for selecting search results.
|
|
212
|
-
*
|
|
213
|
-
* Needed events: {@link DisTube#event:searchResult}, {@link DisTube#event:searchCancel},
|
|
214
|
-
* {@link DisTube#event:searchInvalidAnswer}, {@link DisTube#event:searchDone}.
|
|
215
|
-
* @param {Discord.Message} message The original message from an user
|
|
216
|
-
* @param {Array<SearchResult|Song|Playlist>} results The search results
|
|
217
|
-
* @param {string?} [query] The query string
|
|
218
|
-
* @returns {Promise<SearchResult|Song|Playlist|null>} Selected result
|
|
219
|
-
*/
|
|
220
|
-
async createSearchMessageCollector(message, results, query) {
|
|
221
|
-
if (!(0, __1.isMessageInstance)(message))
|
|
222
|
-
throw new __1.DisTubeError("INVALID_TYPE", "Discord.Message", message, "message");
|
|
223
|
-
if (!Array.isArray(results) || results.length == 0) {
|
|
224
|
-
throw new __1.DisTubeError("INVALID_TYPE", "Array<SearchResult|Song|Playlist>", results, "results");
|
|
225
|
-
}
|
|
226
|
-
if (this.options.searchSongs > 1) {
|
|
227
|
-
const searchEvents = [
|
|
228
|
-
"searchNoResult",
|
|
229
|
-
"searchResult",
|
|
230
|
-
"searchCancel",
|
|
231
|
-
"searchInvalidAnswer",
|
|
232
|
-
"searchDone",
|
|
233
|
-
];
|
|
234
|
-
for (const evn of searchEvents) {
|
|
235
|
-
if (this.distube.listenerCount(evn) === 0) {
|
|
236
|
-
/* eslint-disable no-console */
|
|
237
|
-
console.warn(`"searchSongs" option is disabled due to missing "${evn}" listener.`);
|
|
238
|
-
console.warn(`If you don't want to use "${evn}" event, simply add an empty listener (not recommended):\n` +
|
|
239
|
-
`<DisTube>.on("${evn}", () => {})`);
|
|
240
|
-
/* eslint-enable no-console */
|
|
241
|
-
this.options.searchSongs = 0;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
const limit = this.options.searchSongs > 1 ? this.options.searchSongs : 1;
|
|
246
|
-
let result = results[0];
|
|
247
|
-
if (limit > 1) {
|
|
248
|
-
results.splice(limit);
|
|
249
|
-
this.emit("searchResult", message, results, query);
|
|
250
|
-
const c = message.channel;
|
|
251
|
-
const answers = await c
|
|
252
|
-
.awaitMessages({
|
|
253
|
-
filter: (m) => m.author.id === message.author.id,
|
|
254
|
-
max: 1,
|
|
255
|
-
time: this.options.searchCooldown * 1e3,
|
|
256
|
-
errors: ["time"],
|
|
257
|
-
})
|
|
258
|
-
.catch(() => undefined);
|
|
259
|
-
const ans = answers?.first();
|
|
260
|
-
if (!ans) {
|
|
261
|
-
this.emit("searchCancel", message, query);
|
|
262
|
-
return null;
|
|
263
|
-
}
|
|
264
|
-
const index = parseInt(ans.content, 10);
|
|
265
|
-
if (isNaN(index) || index > results.length || index < 1) {
|
|
266
|
-
this.emit("searchInvalidAnswer", message, ans, query);
|
|
267
|
-
return null;
|
|
268
|
-
}
|
|
269
|
-
this.emit("searchDone", message, ans, query);
|
|
270
|
-
result = results[index - 1];
|
|
271
|
-
}
|
|
272
|
-
return result;
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Create a ytdl stream
|
|
276
|
-
* @param {Queue} queue Queue
|
|
277
|
-
* @returns {DisTubeStream}
|
|
278
|
-
*/
|
|
279
|
-
createStream(queue) {
|
|
280
|
-
const { duration, formats, isLive, source, streamURL } = queue.songs[0];
|
|
281
|
-
const filterArgs = [];
|
|
282
|
-
queue.filters.forEach((filter) => filterArgs.push(this.distube.filters[filter]));
|
|
283
|
-
const ffmpegArgs = queue.filters?.length ? ["-af", filterArgs.join(",")] : undefined;
|
|
284
|
-
const seek = duration ? queue.beginTime : undefined;
|
|
285
|
-
const streamOptions = { ffmpegArgs, seek, isLive };
|
|
286
|
-
if (source === "youtube")
|
|
287
|
-
return _1.DisTubeStream.YouTube(formats, streamOptions);
|
|
288
|
-
return _1.DisTubeStream.DirectLink(streamURL, streamOptions);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
exports.DisTubeHandler = DisTubeHandler;
|
|
292
|
-
//# sourceMappingURL=DisTubeHandler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DisTubeHandler.js","sourceRoot":"","sources":["../../src/core/DisTubeHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import ytdl from \"@distube/ytdl-core\";\nimport ytpl from \"@distube/ytpl\";\nimport { DisTubeBase, DisTubeStream } from \".\";\nimport { DisTubeError, Playlist, Queue, SearchResult, Song, isMessageInstance, isURL, isVoiceChannelEmpty } from \"..\";\nimport type { DisTube, OtherSongInfo } from \"..\";\nimport type { GuildMember, GuildTextBasedChannel, Message, TextChannel, VoiceBasedChannel } from \"discord.js\";\nimport { isObject } from \"../util\";\n/**\n * DisTube's Handler\n * @extends DisTubeBase\n * @private\n */\nexport class DisTubeHandler extends DisTubeBase {\n constructor(distube: DisTube) {\n super(distube);\n\n if (this.options.youtubeCookie) {\n const requestOptions: any = {\n headers: {\n cookie: this.options.youtubeCookie,\n },\n };\n if (this.options.youtubeIdentityToken) {\n requestOptions.headers[\"x-youtube-identity-token\"] = this.options.youtubeIdentityToken;\n }\n Object.assign(this.ytdlOptions, { requestOptions });\n }\n\n const client = this.client;\n if (this.options.leaveOnEmpty) {\n client.on(\"voiceStateUpdate\", oldState => {\n if (!oldState?.channel) return;\n const queue = this.queues.get(oldState);\n if (!queue) {\n if (isVoiceChannelEmpty(oldState)) {\n setTimeout(() => {\n if (!this.queues.get(oldState) && isVoiceChannelEmpty(oldState)) this.voices.leave(oldState);\n }, this.options.emptyCooldown * 1e3).unref();\n }\n return;\n }\n if (queue.emptyTimeout) {\n clearTimeout(queue.emptyTimeout);\n delete queue.emptyTimeout;\n }\n if (isVoiceChannelEmpty(oldState)) {\n queue.emptyTimeout = setTimeout(() => {\n delete queue.emptyTimeout;\n if (isVoiceChannelEmpty(oldState)) {\n queue.voice.leave();\n this.emit(\"empty\", queue);\n if (queue.stopped) queue.delete();\n }\n }, this.options.emptyCooldown * 1e3).unref();\n }\n });\n }\n }\n\n get ytdlOptions() {\n return this.options.ytdlOptions;\n }\n\n /**\n * @param {string} url url\n * @param {boolean} [basic=false] getBasicInfo?\n * @returns {Promise<ytdl.videoInfo>}\n */\n getYouTubeInfo(url: string, basic = false): Promise<ytdl.videoInfo> {\n if (basic) return ytdl.getBasicInfo(url, this.ytdlOptions);\n return ytdl.getInfo(url, this.ytdlOptions);\n }\n\n /**\n * Resolve a Song\n * @param {string|Song|SearchResult|Playlist} song URL | Search string | {@link Song}\n * @param {Object} [options] Optional options\n * @param {Discord.GuildMember} [options.member] Requested user\n * @param {*} [options.metadata] Metadata\n * @returns {Promise<Song|Playlist|null>} Resolved\n */\n async resolveSong(\n song: string | ytdl.videoInfo | Song | Playlist | SearchResult | OtherSongInfo | ytdl.relatedVideo,\n options: {\n member?: GuildMember;\n metadata?: any;\n } = {},\n ): Promise<Song | Playlist> {\n if (song instanceof Song || song instanceof Playlist) {\n if (\"metadata\" in options) song.metadata = options.metadata;\n if (\"member\" in options) song.member = options.member;\n return song;\n }\n if (song instanceof SearchResult) {\n if (song.type === \"video\") return new Song(song, options);\n return this.resolvePlaylist(song.url, options);\n }\n if (isObject(song)) return new Song(song, options);\n if (ytdl.validateURL(song)) return new Song(await this.getYouTubeInfo(song), options);\n if (isURL(song)) {\n for (const plugin of this.distube.extractorPlugins) {\n if (await plugin.validate(song)) return plugin.resolve(song, options);\n }\n throw new DisTubeError(\"NOT_SUPPORTED_URL\");\n }\n throw new DisTubeError(\"CANNOT_RESOLVE_SONG\", song);\n }\n\n /**\n * Resolve Song[] or url to a Playlist\n * @param {Playlist|Song[]|string} playlist Resolvable playlist\n * @param {Object} options Optional options\n * @param {Discord.GuildMember} [options.member] Requested user\n * @param {string} [options.source=\"youtube\"] Playlist source\n * @param {*} [options.metadata] Metadata\n * @returns {Promise<Playlist>}\n */\n async resolvePlaylist(\n playlist: Playlist | Song[] | string,\n options: {\n member?: GuildMember;\n source?: string;\n metadata?: any;\n } = {},\n ): Promise<Playlist> {\n const { member, source, metadata } = { source: \"youtube\", ...options };\n if (playlist instanceof Playlist) {\n if (metadata) playlist._patchMetadata(metadata);\n if (member) playlist._patchMember(member);\n return playlist;\n }\n let solvablePlaylist: Song[] | ytpl.result;\n if (typeof playlist === \"string\") {\n solvablePlaylist = await ytpl(playlist, { limit: Infinity });\n (solvablePlaylist as any).items = solvablePlaylist.items\n .filter(v => !v.thumbnail.includes(\"no_thumbnail\"))\n .map(v => new Song(v as OtherSongInfo, { member, metadata }));\n } else {\n solvablePlaylist = playlist;\n }\n return new Playlist(solvablePlaylist, { member, properties: { source }, metadata });\n }\n\n /**\n * Play / add a playlist\n * @returns {Promise<void>}\n * @param {Discord.BaseGuildVoiceChannel} voice A voice channel\n * @param {Playlist|string} playlist A YouTube playlist url | a Playlist\n * @param {Object} [options] Optional options\n * @param {Discord.BaseGuildTextChannel} [options.textChannel] The default text channel of the queue\n * @param {boolean} [options.skip=false] Skip the playing song (if exists) and play the added playlist instantly\n * @param {boolean} [options.unshift=false] Add the playlist after the playing song if exists\n */\n async handlePlaylist(\n voice: VoiceBasedChannel,\n playlist: Playlist,\n options?: {\n textChannel?: GuildTextBasedChannel;\n skip?: boolean;\n position?: number;\n },\n ): Promise<void>;\n /** @deprecated `options.unshift` is deprecated, use `options.position` instead */\n async handlePlaylist(\n voice: VoiceBasedChannel,\n playlist: Playlist,\n options?: {\n textChannel?: GuildTextBasedChannel;\n skip?: boolean;\n position?: number;\n unshift?: boolean;\n },\n ): Promise<void>;\n async handlePlaylist(\n voice: VoiceBasedChannel,\n playlist: Playlist,\n options: {\n textChannel?: GuildTextBasedChannel;\n skip?: boolean;\n position?: number;\n unshift?: boolean;\n } = {},\n ): Promise<void> {\n const { textChannel, skip, unshift } = { skip: false, unshift: false, ...options };\n\n let position = Number(options.position);\n if (!position) {\n if (skip && position !== 0) position = 1;\n else position = 0;\n }\n if (unshift) position = 1;\n\n if (!(playlist instanceof Playlist)) throw new DisTubeError(\"INVALID_TYPE\", \"Playlist\", playlist, \"playlist\");\n if (!this.options.nsfw && !(textChannel as TextChannel)?.nsfw) {\n playlist.songs = playlist.songs.filter(s => !s.age_restricted);\n }\n if (!playlist.songs.length) {\n if (!this.options.nsfw && !(textChannel as TextChannel)?.nsfw) throw new DisTubeError(\"EMPTY_FILTERED_PLAYLIST\");\n throw new DisTubeError(\"EMPTY_PLAYLIST\");\n }\n const songs = playlist.songs;\n const queue = this.queues.get(voice);\n if (queue) {\n queue.addToQueue(songs, position);\n if (skip) queue.skip();\n else this.emit(\"addList\", queue, playlist);\n } else {\n const newQueue = await this.queues.create(voice, songs, textChannel);\n if (newQueue instanceof Queue) {\n if (this.options.emitAddListWhenCreatingQueue) this.emit(\"addList\", newQueue, playlist);\n this.emit(\"playSong\", newQueue, newQueue.songs[0]);\n }\n }\n }\n\n /**\n * Search for a song, fire {@link DisTube#event:error} if not found.\n * @param {Discord.Message} message The original message from an user\n * @param {string} query The query string\n * @returns {Promise<SearchResult?>} Song info\n */\n async searchSong(message: Message<true>, query: string): Promise<SearchResult | null> {\n if (!isMessageInstance(message)) throw new DisTubeError(\"INVALID_TYPE\", \"Discord.Message\", message, \"message\");\n if (typeof query !== \"string\") throw new DisTubeError(\"INVALID_TYPE\", \"string\", query, \"query\");\n if (query.length === 0) throw new DisTubeError(\"EMPTY_STRING\", \"query\");\n const limit = this.options.searchSongs > 1 ? this.options.searchSongs : 1;\n const results = await this.distube\n .search(query, {\n limit,\n safeSearch: this.options.nsfw ? false : !(message.channel as TextChannel)?.nsfw,\n })\n .catch(() => {\n if (!this.emit(\"searchNoResult\", message, query)) {\n // eslint-disable-next-line no-console\n console.warn(\"searchNoResult event does not have any listeners! Emits `error` event instead.\");\n throw new DisTubeError(\"NO_RESULT\");\n }\n });\n if (!results) return null;\n return this.createSearchMessageCollector(message, results, query);\n }\n\n /**\n * Create a message collector for selecting search results.\n *\n * Needed events: {@link DisTube#event:searchResult}, {@link DisTube#event:searchCancel},\n * {@link DisTube#event:searchInvalidAnswer}, {@link DisTube#event:searchDone}.\n * @param {Discord.Message} message The original message from an user\n * @param {Array<SearchResult|Song|Playlist>} results The search results\n * @param {string?} [query] The query string\n * @returns {Promise<SearchResult|Song|Playlist|null>} Selected result\n */\n async createSearchMessageCollector<R extends SearchResult | Song | Playlist>(\n message: Message<true>,\n results: Array<R>,\n query?: string,\n ): Promise<R | null> {\n if (!isMessageInstance(message)) throw new DisTubeError(\"INVALID_TYPE\", \"Discord.Message\", message, \"message\");\n if (!Array.isArray(results) || results.length == 0) {\n throw new DisTubeError(\"INVALID_TYPE\", \"Array<SearchResult|Song|Playlist>\", results, \"results\");\n }\n if (this.options.searchSongs > 1) {\n const searchEvents = [\n \"searchNoResult\",\n \"searchResult\",\n \"searchCancel\",\n \"searchInvalidAnswer\",\n \"searchDone\",\n ] as const;\n for (const evn of searchEvents) {\n if (this.distube.listenerCount(evn) === 0) {\n /* eslint-disable no-console */\n console.warn(`\"searchSongs\" option is disabled due to missing \"${evn}\" listener.`);\n console.warn(\n `If you don't want to use \"${evn}\" event, simply add an empty listener (not recommended):\\n` +\n `<DisTube>.on(\"${evn}\", () => {})`,\n );\n /* eslint-enable no-console */\n this.options.searchSongs = 0;\n }\n }\n }\n const limit = this.options.searchSongs > 1 ? this.options.searchSongs : 1;\n let result = results[0];\n if (limit > 1) {\n results.splice(limit);\n this.emit(\"searchResult\", message, results, query);\n const c = message.channel;\n const answers = await c\n .awaitMessages({\n filter: (m: Message) => m.author.id === message.author.id,\n max: 1,\n time: this.options.searchCooldown * 1e3,\n errors: [\"time\"],\n })\n .catch(() => undefined);\n const ans = answers?.first();\n if (!ans) {\n this.emit(\"searchCancel\", message, query);\n return null;\n }\n const index = parseInt(ans.content, 10);\n if (isNaN(index) || index > results.length || index < 1) {\n this.emit(\"searchInvalidAnswer\", message, ans, query);\n return null;\n }\n this.emit(\"searchDone\", message, ans, query);\n result = results[index - 1];\n }\n return result;\n }\n\n /**\n * Create a ytdl stream\n * @param {Queue} queue Queue\n * @returns {DisTubeStream}\n */\n createStream(queue: Queue): DisTubeStream {\n const { duration, formats, isLive, source, streamURL } = queue.songs[0];\n const filterArgs: string[] = [];\n queue.filters.forEach((filter: string | number) => filterArgs.push(this.distube.filters[filter]));\n const ffmpegArgs = queue.filters?.length ? [\"-af\", filterArgs.join(\",\")] : undefined;\n const seek = duration ? queue.beginTime : undefined;\n const streamOptions = { ffmpegArgs, seek, isLive };\n if (source === \"youtube\") return DisTubeStream.YouTube(formats, streamOptions);\n return DisTubeStream.DirectLink(streamURL as string, streamOptions);\n }\n}\n"]}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type ytdl from "@distube/ytdl-core";
|
|
2
|
-
import type { CustomPlugin, DisTubeOptions, ExtractorPlugin, Filters } from "..";
|
|
3
|
-
export declare class Options {
|
|
4
|
-
#private;
|
|
5
|
-
plugins: (CustomPlugin | ExtractorPlugin)[];
|
|
6
|
-
emitNewSongOnly: boolean;
|
|
7
|
-
leaveOnFinish: boolean;
|
|
8
|
-
leaveOnStop: boolean;
|
|
9
|
-
leaveOnEmpty: boolean;
|
|
10
|
-
emptyCooldown: number;
|
|
11
|
-
savePreviousSongs: boolean;
|
|
12
|
-
searchSongs: number;
|
|
13
|
-
searchCooldown: number;
|
|
14
|
-
youtubeCookie?: string;
|
|
15
|
-
youtubeIdentityToken?: string;
|
|
16
|
-
customFilters?: Filters;
|
|
17
|
-
ytdlOptions: ytdl.getInfoOptions;
|
|
18
|
-
nsfw: boolean;
|
|
19
|
-
emitAddSongWhenCreatingQueue: boolean;
|
|
20
|
-
emitAddListWhenCreatingQueue: boolean;
|
|
21
|
-
constructor(options: DisTubeOptions);
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=DisTubeOptions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DisTubeOptions.d.ts","sourceRoot":"","sources":["../../src/core/DisTubeOptions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAEjF,qBAAa,OAAO;;IAClB,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,CAAC;IAC5C,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,4BAA4B,EAAE,OAAO,CAAC;IACtC,4BAA4B,EAAE,OAAO,CAAC;gBAC1B,OAAO,EAAE,cAAc;CA6FpC"}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
-
};
|
|
7
|
-
var _Options_instances, _Options_validateOptions;
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.Options = void 0;
|
|
10
|
-
const __1 = require("..");
|
|
11
|
-
class Options {
|
|
12
|
-
constructor(options) {
|
|
13
|
-
_Options_instances.add(this);
|
|
14
|
-
if (typeof options !== "object" || Array.isArray(options)) {
|
|
15
|
-
throw new __1.DisTubeError("INVALID_TYPE", "object", options, "DisTubeOptions");
|
|
16
|
-
}
|
|
17
|
-
const opts = { ...__1.defaultOptions, ...options };
|
|
18
|
-
this.plugins = opts.plugins;
|
|
19
|
-
this.emitNewSongOnly = opts.emitNewSongOnly;
|
|
20
|
-
this.leaveOnEmpty = opts.leaveOnEmpty;
|
|
21
|
-
this.leaveOnFinish = opts.leaveOnFinish;
|
|
22
|
-
this.leaveOnStop = opts.leaveOnStop;
|
|
23
|
-
this.savePreviousSongs = opts.savePreviousSongs;
|
|
24
|
-
this.searchSongs = opts.searchSongs;
|
|
25
|
-
this.youtubeCookie = opts.youtubeCookie;
|
|
26
|
-
this.youtubeIdentityToken = opts.youtubeIdentityToken;
|
|
27
|
-
this.customFilters = opts.customFilters;
|
|
28
|
-
this.ytdlOptions = opts.ytdlOptions;
|
|
29
|
-
this.searchCooldown = opts.searchCooldown;
|
|
30
|
-
this.emptyCooldown = opts.emptyCooldown;
|
|
31
|
-
this.nsfw = opts.nsfw;
|
|
32
|
-
this.emitAddSongWhenCreatingQueue = opts.emitAddSongWhenCreatingQueue;
|
|
33
|
-
this.emitAddListWhenCreatingQueue = opts.emitAddListWhenCreatingQueue;
|
|
34
|
-
(0, __1.checkInvalidKey)(opts, this, "DisTubeOptions");
|
|
35
|
-
__classPrivateFieldGet(this, _Options_instances, "m", _Options_validateOptions).call(this);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
exports.Options = Options;
|
|
39
|
-
_Options_instances = new WeakSet(), _Options_validateOptions = function _Options_validateOptions(options = this) {
|
|
40
|
-
if (typeof options.emitNewSongOnly !== "boolean") {
|
|
41
|
-
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.emitNewSongOnly, "DisTubeOptions.emitNewSongOnly");
|
|
42
|
-
}
|
|
43
|
-
if (typeof options.leaveOnEmpty !== "boolean") {
|
|
44
|
-
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.leaveOnEmpty, "DisTubeOptions.leaveOnEmpty");
|
|
45
|
-
}
|
|
46
|
-
if (typeof options.leaveOnFinish !== "boolean") {
|
|
47
|
-
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.leaveOnFinish, "DisTubeOptions.leaveOnFinish");
|
|
48
|
-
}
|
|
49
|
-
if (typeof options.leaveOnStop !== "boolean") {
|
|
50
|
-
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.leaveOnStop, "DisTubeOptions.leaveOnStop");
|
|
51
|
-
}
|
|
52
|
-
if (typeof options.savePreviousSongs !== "boolean") {
|
|
53
|
-
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.savePreviousSongs, "DisTubeOptions.savePreviousSongs");
|
|
54
|
-
}
|
|
55
|
-
if (typeof options.youtubeCookie !== "undefined" && typeof options.youtubeCookie !== "string") {
|
|
56
|
-
throw new __1.DisTubeError("INVALID_TYPE", "string", options.youtubeCookie, "DisTubeOptions.youtubeCookie");
|
|
57
|
-
}
|
|
58
|
-
if (typeof options.youtubeIdentityToken !== "undefined" && typeof options.youtubeIdentityToken !== "string") {
|
|
59
|
-
throw new __1.DisTubeError("INVALID_TYPE", "string", options.youtubeIdentityToken, "DisTubeOptions.youtubeIdentityToken");
|
|
60
|
-
}
|
|
61
|
-
if ((typeof options.customFilters !== "undefined" && typeof options.customFilters !== "object") ||
|
|
62
|
-
Array.isArray(options.customFilters)) {
|
|
63
|
-
throw new __1.DisTubeError("INVALID_TYPE", "object", options.customFilters, "DisTubeOptions.customFilters");
|
|
64
|
-
}
|
|
65
|
-
if (typeof options.ytdlOptions !== "object" || Array.isArray(options.ytdlOptions)) {
|
|
66
|
-
throw new __1.DisTubeError("INVALID_TYPE", "object", options.ytdlOptions, "DisTubeOptions.ytdlOptions");
|
|
67
|
-
}
|
|
68
|
-
if (typeof options.searchCooldown !== "number" || isNaN(options.searchCooldown)) {
|
|
69
|
-
throw new __1.DisTubeError("INVALID_TYPE", "number", options.searchCooldown, "DisTubeOptions.searchCooldown");
|
|
70
|
-
}
|
|
71
|
-
if (typeof options.emptyCooldown !== "number" || isNaN(options.emptyCooldown)) {
|
|
72
|
-
throw new __1.DisTubeError("INVALID_TYPE", "number", options.emptyCooldown, "DisTubeOptions.emptyCooldown");
|
|
73
|
-
}
|
|
74
|
-
if (typeof options.searchSongs !== "number" || isNaN(options.searchSongs)) {
|
|
75
|
-
throw new __1.DisTubeError("INVALID_TYPE", "number", options.searchSongs, "DisTubeOptions.searchSongs");
|
|
76
|
-
}
|
|
77
|
-
if (!Array.isArray(options.plugins)) {
|
|
78
|
-
throw new __1.DisTubeError("INVALID_TYPE", "Array<Plugin>", options.plugins, "DisTubeOptions.plugins");
|
|
79
|
-
}
|
|
80
|
-
if (typeof options.nsfw !== "boolean") {
|
|
81
|
-
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.nsfw, "DisTubeOptions.nsfw");
|
|
82
|
-
}
|
|
83
|
-
if (typeof options.emitAddSongWhenCreatingQueue !== "boolean") {
|
|
84
|
-
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.emitAddSongWhenCreatingQueue, "DisTubeOptions.emitAddSongWhenCreatingQueue");
|
|
85
|
-
}
|
|
86
|
-
if (typeof options.emitAddListWhenCreatingQueue !== "boolean") {
|
|
87
|
-
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.emitAddListWhenCreatingQueue, "DisTubeOptions.emitAddListWhenCreatingQueue");
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
//# sourceMappingURL=DisTubeOptions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DisTubeOptions.js","sourceRoot":"","sources":["../../src/core/DisTubeOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import { DisTubeError, checkInvalidKey, defaultOptions } from \"..\";\nimport type ytdl from \"@distube/ytdl-core\";\nimport type { CustomPlugin, DisTubeOptions, ExtractorPlugin, Filters } from \"..\";\n\nexport class Options {\n plugins: (CustomPlugin | ExtractorPlugin)[];\n emitNewSongOnly: boolean;\n leaveOnFinish: boolean;\n leaveOnStop: boolean;\n leaveOnEmpty: boolean;\n emptyCooldown: number;\n savePreviousSongs: boolean;\n searchSongs: number;\n searchCooldown: number;\n youtubeCookie?: string;\n youtubeIdentityToken?: string;\n customFilters?: Filters;\n ytdlOptions: ytdl.getInfoOptions;\n nsfw: boolean;\n emitAddSongWhenCreatingQueue: boolean;\n emitAddListWhenCreatingQueue: boolean;\n constructor(options: DisTubeOptions) {\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new DisTubeError(\"INVALID_TYPE\", \"object\", options, \"DisTubeOptions\");\n }\n const opts = { ...defaultOptions, ...options };\n this.plugins = opts.plugins;\n this.emitNewSongOnly = opts.emitNewSongOnly;\n this.leaveOnEmpty = opts.leaveOnEmpty;\n this.leaveOnFinish = opts.leaveOnFinish;\n this.leaveOnStop = opts.leaveOnStop;\n this.savePreviousSongs = opts.savePreviousSongs;\n this.searchSongs = opts.searchSongs;\n this.youtubeCookie = opts.youtubeCookie;\n this.youtubeIdentityToken = opts.youtubeIdentityToken;\n this.customFilters = opts.customFilters;\n this.ytdlOptions = opts.ytdlOptions;\n this.searchCooldown = opts.searchCooldown;\n this.emptyCooldown = opts.emptyCooldown;\n this.nsfw = opts.nsfw;\n this.emitAddSongWhenCreatingQueue = opts.emitAddSongWhenCreatingQueue;\n this.emitAddListWhenCreatingQueue = opts.emitAddListWhenCreatingQueue;\n checkInvalidKey(opts, this, \"DisTubeOptions\");\n this.#validateOptions();\n }\n\n #validateOptions(options = this) {\n if (typeof options.emitNewSongOnly !== \"boolean\") {\n throw new DisTubeError(\"INVALID_TYPE\", \"boolean\", options.emitNewSongOnly, \"DisTubeOptions.emitNewSongOnly\");\n }\n if (typeof options.leaveOnEmpty !== \"boolean\") {\n throw new DisTubeError(\"INVALID_TYPE\", \"boolean\", options.leaveOnEmpty, \"DisTubeOptions.leaveOnEmpty\");\n }\n if (typeof options.leaveOnFinish !== \"boolean\") {\n throw new DisTubeError(\"INVALID_TYPE\", \"boolean\", options.leaveOnFinish, \"DisTubeOptions.leaveOnFinish\");\n }\n if (typeof options.leaveOnStop !== \"boolean\") {\n throw new DisTubeError(\"INVALID_TYPE\", \"boolean\", options.leaveOnStop, \"DisTubeOptions.leaveOnStop\");\n }\n if (typeof options.savePreviousSongs !== \"boolean\") {\n throw new DisTubeError(\"INVALID_TYPE\", \"boolean\", options.savePreviousSongs, \"DisTubeOptions.savePreviousSongs\");\n }\n if (typeof options.youtubeCookie !== \"undefined\" && typeof options.youtubeCookie !== \"string\") {\n throw new DisTubeError(\"INVALID_TYPE\", \"string\", options.youtubeCookie, \"DisTubeOptions.youtubeCookie\");\n }\n if (typeof options.youtubeIdentityToken !== \"undefined\" && typeof options.youtubeIdentityToken !== \"string\") {\n throw new DisTubeError(\n \"INVALID_TYPE\",\n \"string\",\n options.youtubeIdentityToken,\n \"DisTubeOptions.youtubeIdentityToken\",\n );\n }\n if (\n (typeof options.customFilters !== \"undefined\" && typeof options.customFilters !== \"object\") ||\n Array.isArray(options.customFilters)\n ) {\n throw new DisTubeError(\"INVALID_TYPE\", \"object\", options.customFilters, \"DisTubeOptions.customFilters\");\n }\n if (typeof options.ytdlOptions !== \"object\" || Array.isArray(options.ytdlOptions)) {\n throw new DisTubeError(\"INVALID_TYPE\", \"object\", options.ytdlOptions, \"DisTubeOptions.ytdlOptions\");\n }\n if (typeof options.searchCooldown !== \"number\" || isNaN(options.searchCooldown)) {\n throw new DisTubeError(\"INVALID_TYPE\", \"number\", options.searchCooldown, \"DisTubeOptions.searchCooldown\");\n }\n if (typeof options.emptyCooldown !== \"number\" || isNaN(options.emptyCooldown)) {\n throw new DisTubeError(\"INVALID_TYPE\", \"number\", options.emptyCooldown, \"DisTubeOptions.emptyCooldown\");\n }\n if (typeof options.searchSongs !== \"number\" || isNaN(options.searchSongs)) {\n throw new DisTubeError(\"INVALID_TYPE\", \"number\", options.searchSongs, \"DisTubeOptions.searchSongs\");\n }\n if (!Array.isArray(options.plugins)) {\n throw new DisTubeError(\"INVALID_TYPE\", \"Array<Plugin>\", options.plugins, \"DisTubeOptions.plugins\");\n }\n if (typeof options.nsfw !== \"boolean\") {\n throw new DisTubeError(\"INVALID_TYPE\", \"boolean\", options.nsfw, \"DisTubeOptions.nsfw\");\n }\n if (typeof options.emitAddSongWhenCreatingQueue !== \"boolean\") {\n throw new DisTubeError(\n \"INVALID_TYPE\",\n \"boolean\",\n options.emitAddSongWhenCreatingQueue,\n \"DisTubeOptions.emitAddSongWhenCreatingQueue\",\n );\n }\n if (typeof options.emitAddListWhenCreatingQueue !== \"boolean\") {\n throw new DisTubeError(\n \"INVALID_TYPE\",\n \"boolean\",\n options.emitAddListWhenCreatingQueue,\n \"DisTubeOptions.emitAddListWhenCreatingQueue\",\n );\n }\n }\n}\n"]}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { FFmpeg } from "prism-media";
|
|
2
|
-
import { StreamType } from "@discordjs/voice";
|
|
3
|
-
import type ytdl from "@distube/ytdl-core";
|
|
4
|
-
interface StreamOptions {
|
|
5
|
-
/**
|
|
6
|
-
* Time to seek in seconds
|
|
7
|
-
*/
|
|
8
|
-
seek?: number;
|
|
9
|
-
/**
|
|
10
|
-
* Additional FFmpeg arguments
|
|
11
|
-
*/
|
|
12
|
-
ffmpegArgs?: string[];
|
|
13
|
-
/**
|
|
14
|
-
* If the stream url is live
|
|
15
|
-
*/
|
|
16
|
-
isLive?: boolean;
|
|
17
|
-
}
|
|
18
|
-
export declare const chooseBestVideoFormat: (formats: ytdl.videoFormat[], isLive?: boolean) => ytdl.videoFormat;
|
|
19
|
-
/**
|
|
20
|
-
* Create a stream to play with {@link DisTubeVoice}
|
|
21
|
-
* @private
|
|
22
|
-
*/
|
|
23
|
-
export declare class DisTubeStream {
|
|
24
|
-
/**
|
|
25
|
-
* Create a stream from ytdl video formats
|
|
26
|
-
* @param {ytdl.videoFormat[]} formats ytdl video formats
|
|
27
|
-
* @param {StreamOptions} options options
|
|
28
|
-
* @returns {DisTubeStream}
|
|
29
|
-
* @private
|
|
30
|
-
*/
|
|
31
|
-
static YouTube(formats: ytdl.videoFormat[] | undefined, options?: StreamOptions): DisTubeStream;
|
|
32
|
-
/**
|
|
33
|
-
* Create a stream from a stream url
|
|
34
|
-
* @param {string} url stream url
|
|
35
|
-
* @param {StreamOptions} options options
|
|
36
|
-
* @returns {DisTubeStream}
|
|
37
|
-
* @private
|
|
38
|
-
*/
|
|
39
|
-
static DirectLink(url: string, options?: StreamOptions): DisTubeStream;
|
|
40
|
-
type: StreamType.Raw;
|
|
41
|
-
stream: FFmpeg;
|
|
42
|
-
url: string;
|
|
43
|
-
/**
|
|
44
|
-
* Create a DisTubeStream to play with {@link DisTubeVoice}
|
|
45
|
-
* @param {string} url Stream URL
|
|
46
|
-
* @param {StreamOptions} options Stream options
|
|
47
|
-
* @private
|
|
48
|
-
*/
|
|
49
|
-
constructor(url: string, options: StreamOptions);
|
|
50
|
-
}
|
|
51
|
-
export {};
|
|
52
|
-
//# sourceMappingURL=DisTubeStream.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DisTubeStream.d.ts","sourceRoot":"","sources":["../../src/core/DisTubeStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAE3C,UAAU,aAAa;IACrB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,qBAAqB,YAAa,KAAK,WAAW,EAAE,uCAOhE,CAAC;AAEF;;;GAGG;AACH,qBAAa,aAAa;IACxB;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,EAAE,OAAO,GAAE,aAAkB,GAAG,aAAa;IASnG;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,aAAa;IAS1E,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;OAKG;gBACS,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;CA2ChD"}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DisTubeStream = exports.chooseBestVideoFormat = void 0;
|
|
4
|
-
const __1 = require("..");
|
|
5
|
-
const prism_media_1 = require("prism-media");
|
|
6
|
-
const struct_1 = require("../struct");
|
|
7
|
-
const voice_1 = require("@discordjs/voice");
|
|
8
|
-
const chooseBestVideoFormat = (formats, isLive = false) => {
|
|
9
|
-
let filter = (format) => format.hasAudio;
|
|
10
|
-
if (isLive)
|
|
11
|
-
filter = (format) => format.hasAudio && format.isHLS;
|
|
12
|
-
formats = formats
|
|
13
|
-
.filter(filter)
|
|
14
|
-
.sort((a, b) => Number(b.audioBitrate) - Number(a.audioBitrate) || Number(a.bitrate) - Number(b.bitrate));
|
|
15
|
-
return formats.find(format => !format.hasVideo) || formats.sort((a, b) => Number(a.bitrate) - Number(b.bitrate))[0];
|
|
16
|
-
};
|
|
17
|
-
exports.chooseBestVideoFormat = chooseBestVideoFormat;
|
|
18
|
-
/**
|
|
19
|
-
* Create a stream to play with {@link DisTubeVoice}
|
|
20
|
-
* @private
|
|
21
|
-
*/
|
|
22
|
-
class DisTubeStream {
|
|
23
|
-
/**
|
|
24
|
-
* Create a DisTubeStream to play with {@link DisTubeVoice}
|
|
25
|
-
* @param {string} url Stream URL
|
|
26
|
-
* @param {StreamOptions} options Stream options
|
|
27
|
-
* @private
|
|
28
|
-
*/
|
|
29
|
-
constructor(url, options) {
|
|
30
|
-
/**
|
|
31
|
-
* Stream URL
|
|
32
|
-
* @type {string}
|
|
33
|
-
*/
|
|
34
|
-
this.url = url;
|
|
35
|
-
/**
|
|
36
|
-
* Stream type
|
|
37
|
-
* @type {DiscordVoice.StreamType.Raw}
|
|
38
|
-
*/
|
|
39
|
-
this.type = voice_1.StreamType.Raw;
|
|
40
|
-
const args = [
|
|
41
|
-
"-reconnect",
|
|
42
|
-
"1",
|
|
43
|
-
"-reconnect_streamed",
|
|
44
|
-
"1",
|
|
45
|
-
"-reconnect_delay_max",
|
|
46
|
-
"5",
|
|
47
|
-
"-i",
|
|
48
|
-
url,
|
|
49
|
-
"-analyzeduration",
|
|
50
|
-
"0",
|
|
51
|
-
"-loglevel",
|
|
52
|
-
"0",
|
|
53
|
-
"-ar",
|
|
54
|
-
"48000",
|
|
55
|
-
"-ac",
|
|
56
|
-
"2",
|
|
57
|
-
"-f",
|
|
58
|
-
"s16le",
|
|
59
|
-
];
|
|
60
|
-
if (typeof options.seek === "number" && options.seek > 0) {
|
|
61
|
-
args.unshift("-ss", options.seek.toString());
|
|
62
|
-
}
|
|
63
|
-
if (Array.isArray(options.ffmpegArgs)) {
|
|
64
|
-
args.push(...options.ffmpegArgs);
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* FFmpeg stream (Duplex)
|
|
68
|
-
* @type {FFmpeg}
|
|
69
|
-
*/
|
|
70
|
-
this.stream = new prism_media_1.FFmpeg({ args, shell: false });
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Create a stream from ytdl video formats
|
|
74
|
-
* @param {ytdl.videoFormat[]} formats ytdl video formats
|
|
75
|
-
* @param {StreamOptions} options options
|
|
76
|
-
* @returns {DisTubeStream}
|
|
77
|
-
* @private
|
|
78
|
-
*/
|
|
79
|
-
static YouTube(formats, options = {}) {
|
|
80
|
-
if (!formats || !formats.length)
|
|
81
|
-
throw new struct_1.DisTubeError("UNAVAILABLE_VIDEO");
|
|
82
|
-
if (!options || typeof options !== "object" || Array.isArray(options)) {
|
|
83
|
-
throw new struct_1.DisTubeError("INVALID_TYPE", "object", options, "options");
|
|
84
|
-
}
|
|
85
|
-
const bestFormat = (0, exports.chooseBestVideoFormat)(formats, options.isLive);
|
|
86
|
-
if (!bestFormat)
|
|
87
|
-
throw new struct_1.DisTubeError("UNPLAYABLE_FORMATS");
|
|
88
|
-
return new DisTubeStream(bestFormat.url, options);
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Create a stream from a stream url
|
|
92
|
-
* @param {string} url stream url
|
|
93
|
-
* @param {StreamOptions} options options
|
|
94
|
-
* @returns {DisTubeStream}
|
|
95
|
-
* @private
|
|
96
|
-
*/
|
|
97
|
-
static DirectLink(url, options = {}) {
|
|
98
|
-
if (!options || typeof options !== "object" || Array.isArray(options)) {
|
|
99
|
-
throw new struct_1.DisTubeError("INVALID_TYPE", "object", options, "options");
|
|
100
|
-
}
|
|
101
|
-
if (typeof url !== "string" || !(0, __1.isURL)(url)) {
|
|
102
|
-
throw new struct_1.DisTubeError("INVALID_TYPE", "an URL", url);
|
|
103
|
-
}
|
|
104
|
-
return new DisTubeStream(url, options);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
exports.DisTubeStream = DisTubeStream;
|
|
108
|
-
//# sourceMappingURL=DisTubeStream.js.map
|