distube 2.8.18 → 3.0.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.
- package/README.md +32 -98
- package/dist/DisTube.d.ts +522 -0
- package/dist/DisTube.d.ts.map +1 -0
- package/dist/DisTube.js +794 -0
- package/dist/DisTube.js.map +1 -0
- package/dist/constant.d.ts +130 -0
- package/dist/constant.d.ts.map +1 -0
- package/dist/constant.js +150 -0
- package/dist/constant.js.map +1 -0
- package/dist/core/DisTubeBase.d.ts +55 -0
- package/dist/core/DisTubeBase.d.ts.map +1 -0
- package/dist/core/DisTubeBase.js +76 -0
- package/dist/core/DisTubeBase.js.map +1 -0
- package/dist/core/DisTubeHandler.d.ts +84 -0
- package/dist/core/DisTubeHandler.d.ts.map +1 -0
- package/dist/core/DisTubeHandler.js +311 -0
- package/dist/core/DisTubeHandler.js.map +1 -0
- package/dist/core/DisTubeOptions.d.ts +26 -0
- package/dist/core/DisTubeOptions.d.ts.map +1 -0
- package/dist/core/DisTubeOptions.js +93 -0
- package/dist/core/DisTubeOptions.js.map +1 -0
- package/dist/core/DisTubeStream.d.ts +52 -0
- package/dist/core/DisTubeStream.d.ts.map +1 -0
- package/dist/core/DisTubeStream.js +109 -0
- package/dist/core/DisTubeStream.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +19 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/manager/BaseManager.d.ts +18 -0
- package/dist/core/manager/BaseManager.d.ts.map +1 -0
- package/dist/core/manager/BaseManager.js +44 -0
- package/dist/core/manager/BaseManager.js.map +1 -0
- package/dist/core/manager/QueueManager.d.ts +60 -0
- package/dist/core/manager/QueueManager.d.ts.map +1 -0
- package/dist/core/manager/QueueManager.js +202 -0
- package/dist/core/manager/QueueManager.js.map +1 -0
- package/dist/core/manager/index.d.ts +3 -0
- package/dist/core/manager/index.d.ts.map +1 -0
- package/dist/core/manager/index.js +15 -0
- package/dist/core/manager/index.js.map +1 -0
- package/dist/core/voice/DJSAdapter.d.ts +4 -0
- package/dist/core/voice/DJSAdapter.d.ts.map +1 -0
- package/dist/core/voice/DJSAdapter.js +61 -0
- package/dist/core/voice/DJSAdapter.js.map +1 -0
- package/dist/core/voice/DisTubeVoice.d.ts +83 -0
- package/dist/core/voice/DisTubeVoice.d.ts.map +1 -0
- package/dist/core/voice/DisTubeVoice.js +236 -0
- package/dist/core/voice/DisTubeVoice.js.map +1 -0
- package/dist/core/voice/DisTubeVoiceManager.d.ts +41 -0
- package/dist/core/voice/DisTubeVoiceManager.d.ts.map +1 -0
- package/dist/core/voice/DisTubeVoiceManager.js +67 -0
- package/dist/core/voice/DisTubeVoiceManager.js.map +1 -0
- package/dist/core/voice/index.d.ts +4 -0
- package/dist/core/voice/index.d.ts.map +1 -0
- package/dist/core/voice/index.js +16 -0
- package/dist/core/voice/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin/http.d.ts +8 -0
- package/dist/plugin/http.d.ts.map +1 -0
- package/dist/plugin/http.js +20 -0
- package/dist/plugin/http.js.map +1 -0
- package/dist/plugin/https.d.ts +14 -0
- package/dist/plugin/https.d.ts.map +1 -0
- package/dist/plugin/https.js +50 -0
- package/dist/plugin/https.js.map +1 -0
- package/dist/plugin/index.d.ts +4 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +16 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/youtube-dl.d.ts +11 -0
- package/dist/plugin/youtube-dl.d.ts.map +1 -0
- package/dist/plugin/youtube-dl.js +75 -0
- package/dist/plugin/youtube-dl.js.map +1 -0
- package/dist/struct/CustomPlugin.d.ts +27 -0
- package/dist/struct/CustomPlugin.d.ts.map +1 -0
- package/dist/struct/CustomPlugin.js +35 -0
- package/dist/struct/CustomPlugin.js.map +1 -0
- package/dist/struct/DisTubeError.d.ts +54 -0
- package/dist/struct/DisTubeError.d.ts.map +1 -0
- package/dist/struct/DisTubeError.js +72 -0
- package/dist/struct/DisTubeError.js.map +1 -0
- package/dist/struct/ExtractorPlugin.d.ts +29 -0
- package/dist/struct/ExtractorPlugin.d.ts.map +1 -0
- package/dist/struct/ExtractorPlugin.js +32 -0
- package/dist/struct/ExtractorPlugin.js.map +1 -0
- package/dist/struct/Playlist.d.ts +42 -0
- package/dist/struct/Playlist.d.ts.map +1 -0
- package/dist/struct/Playlist.js +104 -0
- package/dist/struct/Playlist.js.map +1 -0
- package/dist/struct/Plugin.d.ts +82 -0
- package/dist/struct/Plugin.d.ts.map +1 -0
- package/dist/struct/Plugin.js +108 -0
- package/dist/struct/Plugin.js.map +1 -0
- package/dist/struct/Queue.d.ts +217 -0
- package/dist/struct/Queue.d.ts.map +1 -0
- package/dist/struct/Queue.js +480 -0
- package/dist/struct/Queue.js.map +1 -0
- package/dist/struct/SearchResult.d.ts +28 -0
- package/dist/struct/SearchResult.d.ts.map +1 -0
- package/dist/struct/SearchResult.js +79 -0
- package/dist/struct/SearchResult.js.map +1 -0
- package/dist/struct/Song.d.ts +68 -0
- package/dist/struct/Song.d.ts.map +1 -0
- package/dist/struct/Song.js +229 -0
- package/dist/struct/Song.js.map +1 -0
- package/dist/struct/TaskQueue.d.ts +33 -0
- package/dist/struct/TaskQueue.d.ts.map +1 -0
- package/dist/struct/TaskQueue.js +58 -0
- package/dist/struct/TaskQueue.js.map +1 -0
- package/dist/struct/index.d.ts +10 -0
- package/dist/struct/index.d.ts.map +1 -0
- package/dist/struct/index.js +22 -0
- package/dist/struct/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/type.d.ts +159 -0
- package/dist/type.d.ts.map +1 -0
- package/dist/type.js +3 -0
- package/dist/type.js.map +1 -0
- package/dist/util.d.ts +47 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +205 -0
- package/dist/util.js.map +1 -0
- package/package.json +50 -24
- package/src/DisTube.js +0 -1121
- package/src/Playlist.js +0 -107
- package/src/Queue.js +0 -120
- package/src/SearchResult.js +0 -81
- package/src/Song.js +0 -135
- package/src/duration.js +0 -39
- package/typings/DisTube.d.ts +0 -635
- package/typings/Playlist.d.ts +0 -73
- package/typings/Queue.d.ts +0 -106
- package/typings/SearchResult.d.ts +0 -59
- package/typings/Song.d.ts +0 -104
- package/typings/duration.d.ts +0 -2
|
@@ -0,0 +1,311 @@
|
|
|
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
|
+
/**
|
|
12
|
+
* DisTube's Handler
|
|
13
|
+
* @extends DisTubeBase
|
|
14
|
+
* @private
|
|
15
|
+
*/
|
|
16
|
+
class DisTubeHandler extends _1.DisTubeBase {
|
|
17
|
+
constructor(distube) {
|
|
18
|
+
super(distube);
|
|
19
|
+
this.ytdlOptions = this.options.ytdlOptions;
|
|
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 === null || oldState === void 0 ? void 0 : 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
|
+
/**
|
|
65
|
+
* Create a new guild queue
|
|
66
|
+
* @param {Discord.Message|Discord.VoiceChannel|Discord.StageChannel} message A user message | a voice channel
|
|
67
|
+
* @param {Song|Song[]} song Song to play
|
|
68
|
+
* @param {Discord.TextChannel} textChannel A text channel of the queue
|
|
69
|
+
* @throws {Error}
|
|
70
|
+
* @returns {Promise<Queue|true>} `true` if queue is not generated
|
|
71
|
+
*/
|
|
72
|
+
async createQueue(message, song, textChannel = message.channel) {
|
|
73
|
+
var _a, _b, _c;
|
|
74
|
+
const voice = ((_c = (_b = (_a = message) === null || _a === void 0 ? void 0 : _a.member) === null || _b === void 0 ? void 0 : _b.voice) === null || _c === void 0 ? void 0 : _c.channel) || message;
|
|
75
|
+
if (!voice || (0, __1.isMessageInstance)(voice))
|
|
76
|
+
throw new __1.DisTubeError("NOT_IN_VOICE");
|
|
77
|
+
if (!(0, __1.isSupportedVoiceChannel)(voice))
|
|
78
|
+
throw new __1.DisTubeError("NOT_SUPPORTED_VOICE");
|
|
79
|
+
return this.queues.create(voice, song, textChannel);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* @param {string} url url
|
|
83
|
+
* @param {boolean} [basic=false] getBasicInfo?
|
|
84
|
+
* @returns {Promise<ytdl.videoInfo>}
|
|
85
|
+
*/
|
|
86
|
+
getYouTubeInfo(url, basic = false) {
|
|
87
|
+
if (basic)
|
|
88
|
+
return ytdl_core_1.default.getBasicInfo(url, this.ytdlOptions);
|
|
89
|
+
return ytdl_core_1.default.getInfo(url, this.ytdlOptions);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Resolve a Song
|
|
93
|
+
* @param {Discord.GuildMember} member Requested user
|
|
94
|
+
* @param {string|Song|SearchResult|Playlist} song URL | Search string | {@link Song}
|
|
95
|
+
* @returns {Promise<Song|Playlist|null>} Resolved
|
|
96
|
+
*/
|
|
97
|
+
async resolveSong(member, song) {
|
|
98
|
+
if (!song)
|
|
99
|
+
return null;
|
|
100
|
+
if (song instanceof __1.Song || song instanceof __1.Playlist)
|
|
101
|
+
return song._patchMember(member);
|
|
102
|
+
if (song instanceof __1.SearchResult) {
|
|
103
|
+
if (song.type === "video")
|
|
104
|
+
return new __1.Song(song, member);
|
|
105
|
+
return this.resolvePlaylist(member, song.url);
|
|
106
|
+
}
|
|
107
|
+
if (typeof song === "object")
|
|
108
|
+
return new __1.Song(song, member);
|
|
109
|
+
if (ytdl_core_1.default.validateURL(song))
|
|
110
|
+
return new __1.Song(await this.getYouTubeInfo(song), member);
|
|
111
|
+
if ((0, __1.isURL)(song)) {
|
|
112
|
+
for (const plugin of this.distube.extractorPlugins) {
|
|
113
|
+
if (await plugin.validate(song))
|
|
114
|
+
return plugin.resolve(song, member);
|
|
115
|
+
}
|
|
116
|
+
throw new __1.DisTubeError("NOT_SUPPORTED_URL");
|
|
117
|
+
}
|
|
118
|
+
throw new __1.DisTubeError("CANNOT_RESOLVE_SONG", typeof song);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Resole Song[] or url to a Playlist
|
|
122
|
+
* @param {Discord.GuildMember} member Requested user
|
|
123
|
+
* @param {Song[]|string} playlist Resolvable playlist
|
|
124
|
+
* @param {string} [source="youtube"] Playlist source
|
|
125
|
+
* @returns {Promise<Playlist>}
|
|
126
|
+
*/
|
|
127
|
+
async resolvePlaylist(member, playlist, source = "youtube") {
|
|
128
|
+
if (playlist instanceof __1.Playlist)
|
|
129
|
+
return playlist;
|
|
130
|
+
let solvablePlaylist;
|
|
131
|
+
if (typeof playlist === "string") {
|
|
132
|
+
solvablePlaylist = await (0, ytpl_1.default)(playlist, { limit: Infinity });
|
|
133
|
+
solvablePlaylist.items = solvablePlaylist.items
|
|
134
|
+
.filter(v => !v.thumbnail.includes("no_thumbnail"))
|
|
135
|
+
.map(v => new __1.Song(v, member));
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
solvablePlaylist = playlist;
|
|
139
|
+
}
|
|
140
|
+
return new __1.Playlist(solvablePlaylist, member, { source });
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Create a custom playlist
|
|
144
|
+
* @returns {Promise<Playlist>}
|
|
145
|
+
* @param {Discord.Message|Discord.GuildMember} message A message from guild channel | A guild member
|
|
146
|
+
* @param {Array<string|Song|SearchResult>} songs Array of url, Song or SearchResult
|
|
147
|
+
* @param {Object} [properties={}] Additional properties such as `name`
|
|
148
|
+
* @param {boolean} [parallel=true] Whether or not fetch the songs in parallel
|
|
149
|
+
* @example
|
|
150
|
+
* const songs = ["https://www.youtube.com/watch?v=xxx", "https://www.youtube.com/watch?v=yyy"];
|
|
151
|
+
* const playlist = await distube.handler.createCustomPlaylist(member, songs, { name: "My playlist name" }, true);
|
|
152
|
+
* // Or fetching custom playlist sequentially (reduce lag for low specs)
|
|
153
|
+
* const playlist = await distube.handler.createCustomPlaylist(member, songs, false);
|
|
154
|
+
* distube.playVoiceChannel(voiceChannel, playlist, { ... });
|
|
155
|
+
*/
|
|
156
|
+
async createCustomPlaylist(message, songs, properties = {}, parallel = true) {
|
|
157
|
+
var _a;
|
|
158
|
+
const member = ((_a = message) === null || _a === void 0 ? void 0 : _a.member) || message;
|
|
159
|
+
if (!Array.isArray(songs))
|
|
160
|
+
throw new __1.DisTubeError("INVALID_TYPE", "Array", songs, "songs");
|
|
161
|
+
if (!songs.length)
|
|
162
|
+
throw new __1.DisTubeError("EMPTY_ARRAY", "songs");
|
|
163
|
+
songs = songs.filter(song => song instanceof __1.Song || (song instanceof __1.SearchResult && song.type === "video") || (0, __1.isURL)(song));
|
|
164
|
+
if (!songs.length)
|
|
165
|
+
throw new __1.DisTubeError("NO_VALID_SONG");
|
|
166
|
+
let resolvedSongs;
|
|
167
|
+
if (parallel) {
|
|
168
|
+
const promises = songs.map((song) => this.resolveSong(member, song).catch(() => undefined));
|
|
169
|
+
resolvedSongs = (await Promise.all(promises)).filter((s) => !!s);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
const resolved = [];
|
|
173
|
+
for (const song of songs) {
|
|
174
|
+
resolved.push(await this.resolveSong(member, song).catch(() => undefined));
|
|
175
|
+
}
|
|
176
|
+
resolvedSongs = resolved.filter((s) => !!s);
|
|
177
|
+
}
|
|
178
|
+
return new __1.Playlist(resolvedSongs, member, properties);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Play / add a playlist
|
|
182
|
+
* @returns {Promise<void>}
|
|
183
|
+
* @param {Discord.Message|Discord.VoiceChannel|Discord.StageChannel} message A message | a voice channel
|
|
184
|
+
* @param {Playlist|string} playlist A YouTube playlist url | a Playlist
|
|
185
|
+
* @param {Discord.TextChannel|boolean} [textChannel] The default text channel of the queue
|
|
186
|
+
* @param {boolean} [skip=false] Skip the playing song (if exists) and play the added playlist instantly
|
|
187
|
+
* @param {boolean} [unshift=false] Add the playlist to the beginning of the queue (after the playing song if exists)
|
|
188
|
+
*/
|
|
189
|
+
async handlePlaylist(message, playlist, textChannel, skip = false, unshift = false) {
|
|
190
|
+
if (!(playlist instanceof __1.Playlist))
|
|
191
|
+
throw new __1.DisTubeError("INVALID_TYPE", "Playlist", playlist, "playlist");
|
|
192
|
+
if (!this.options.nsfw && !(textChannel === null || textChannel === void 0 ? void 0 : textChannel.nsfw))
|
|
193
|
+
playlist.songs = playlist.songs.filter(s => !s.age_restricted);
|
|
194
|
+
if (!playlist.songs.length) {
|
|
195
|
+
if (!this.options.nsfw && !(textChannel === null || textChannel === void 0 ? void 0 : textChannel.nsfw))
|
|
196
|
+
throw new __1.DisTubeError("EMPTY_FILTERED_PLAYLIST");
|
|
197
|
+
throw new __1.DisTubeError("EMPTY_PLAYLIST");
|
|
198
|
+
}
|
|
199
|
+
const songs = playlist.songs;
|
|
200
|
+
const queue = this.queues.get(message);
|
|
201
|
+
if (queue) {
|
|
202
|
+
queue.addToQueue(songs, skip || unshift ? 1 : -1);
|
|
203
|
+
if (skip)
|
|
204
|
+
queue.skip();
|
|
205
|
+
else
|
|
206
|
+
this.emit("addList", queue, playlist);
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
const newQueue = await this.createQueue(message, songs, textChannel);
|
|
210
|
+
if (newQueue instanceof __1.Queue) {
|
|
211
|
+
if (this.options.emitAddListWhenCreatingQueue)
|
|
212
|
+
this.emit("addList", newQueue, playlist);
|
|
213
|
+
this.emit("playSong", newQueue, newQueue.songs[0]);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Search for a song, fire {@link DisTube#event:error} if not found.
|
|
219
|
+
* @param {Discord.Message} message A message from guild channel
|
|
220
|
+
* @param {string} query The query string
|
|
221
|
+
* @returns {Promise<SearchResult?>} Song info
|
|
222
|
+
*/
|
|
223
|
+
async searchSong(message, query) {
|
|
224
|
+
var _a;
|
|
225
|
+
if (this.options.searchSongs > 1) {
|
|
226
|
+
const searchEvents = [
|
|
227
|
+
"searchNoResult",
|
|
228
|
+
"searchResult",
|
|
229
|
+
"searchCancel",
|
|
230
|
+
"searchInvalidAnswer",
|
|
231
|
+
"searchDone",
|
|
232
|
+
];
|
|
233
|
+
for (const evn of searchEvents) {
|
|
234
|
+
if (this.distube.listenerCount(evn) === 0) {
|
|
235
|
+
/* eslint-disable no-console */
|
|
236
|
+
console.warn(`"searchSongs" option is disabled due to missing "${evn}" listener.`);
|
|
237
|
+
console.warn(`If you don't want to use "${evn}" event, simply add an empty listener (not recommended):\n` +
|
|
238
|
+
`<DisTube>.on("${evn}", () => {})`);
|
|
239
|
+
/* eslint-enable no-console */
|
|
240
|
+
this.options.searchSongs = 0;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const limit = this.options.searchSongs > 1 ? this.options.searchSongs : 1;
|
|
245
|
+
const results = await this.distube
|
|
246
|
+
.search(query, {
|
|
247
|
+
limit,
|
|
248
|
+
safeSearch: this.options.nsfw ? false : !((_a = message.channel) === null || _a === void 0 ? void 0 : _a.nsfw),
|
|
249
|
+
})
|
|
250
|
+
.catch(() => {
|
|
251
|
+
if (!this.emit("searchNoResult", message, query)) {
|
|
252
|
+
// eslint-disable-next-line no-console
|
|
253
|
+
console.warn("searchNoResult event does not have any listeners! Emits `error` event instead.");
|
|
254
|
+
throw new __1.DisTubeError("NO_RESULT");
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
if (!results)
|
|
258
|
+
return null;
|
|
259
|
+
let result = results[0];
|
|
260
|
+
if (limit > 1) {
|
|
261
|
+
this.emit("searchResult", message, results, query);
|
|
262
|
+
const c = message.channel;
|
|
263
|
+
const answers = await (c.awaitMessages.length === 0
|
|
264
|
+
? c.awaitMessages({
|
|
265
|
+
filter: (m) => m.author.id === message.author.id,
|
|
266
|
+
max: 1,
|
|
267
|
+
time: this.options.searchCooldown * 1e3,
|
|
268
|
+
errors: ["time"],
|
|
269
|
+
})
|
|
270
|
+
: c.awaitMessages((m) => m.author.id === message.author.id, {
|
|
271
|
+
max: 1,
|
|
272
|
+
time: this.options.searchCooldown * 1e3,
|
|
273
|
+
errors: ["time"],
|
|
274
|
+
})).catch(() => undefined);
|
|
275
|
+
const ans = answers === null || answers === void 0 ? void 0 : answers.first();
|
|
276
|
+
if (!ans) {
|
|
277
|
+
this.emit("searchCancel", message, query);
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
const index = parseInt(ans.content, 10);
|
|
281
|
+
if (isNaN(index) || index > results.length || index < 1) {
|
|
282
|
+
this.emit("searchInvalidAnswer", message, ans, query);
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
this.emit("searchDone", message, ans, query);
|
|
286
|
+
result = results[index - 1];
|
|
287
|
+
}
|
|
288
|
+
return result;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Create a ytdl stream
|
|
292
|
+
* @param {Queue} queue Queue
|
|
293
|
+
* @returns {DisTubeStream}
|
|
294
|
+
*/
|
|
295
|
+
createStream(queue) {
|
|
296
|
+
var _a;
|
|
297
|
+
const { duration, formats, isLive, source, streamURL } = queue.songs[0];
|
|
298
|
+
const filterArgs = [];
|
|
299
|
+
queue.filters.forEach((filter) => filterArgs.push(this.distube.filters[filter]));
|
|
300
|
+
const ffmpegArgs = ((_a = queue.filters) === null || _a === void 0 ? void 0 : _a.length) ? ["-af", filterArgs.join(",")] : undefined;
|
|
301
|
+
const seek = duration ? queue.beginTime : undefined;
|
|
302
|
+
const streamOptions = { ffmpegArgs, seek, isLive };
|
|
303
|
+
Object.assign(streamOptions, this.ytdlOptions);
|
|
304
|
+
if (source === "youtube")
|
|
305
|
+
return _1.DisTubeStream.YouTube(formats, streamOptions);
|
|
306
|
+
return _1.DisTubeStream.DirectLink(streamURL, streamOptions);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
exports.DisTubeHandler = DisTubeHandler;
|
|
310
|
+
exports.default = DisTubeHandler;
|
|
311
|
+
//# sourceMappingURL=DisTubeHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 {\n DisTubeError,\n Playlist,\n Queue,\n SearchResult,\n Song,\n isMessageInstance,\n isSupportedVoiceChannel,\n isURL,\n isVoiceChannelEmpty,\n} from \"..\";\nimport type { DisTube, OtherSongInfo } from \"..\";\nimport type { GuildMember, Message, StageChannel, TextChannel, VoiceChannel } from \"discord.js\";\n\n/**\n * DisTube's Handler\n * @extends DisTubeBase\n * @private\n */\nexport class DisTubeHandler extends DisTubeBase {\n ytdlOptions: ytdl.downloadOptions;\n constructor(distube: DisTube) {\n super(distube);\n this.ytdlOptions = this.options.ytdlOptions;\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 /**\n * Create a new guild queue\n * @param {Discord.Message|Discord.VoiceChannel|Discord.StageChannel} message A user message | a voice channel\n * @param {Song|Song[]} song Song to play\n * @param {Discord.TextChannel} textChannel A text channel of the queue\n * @throws {Error}\n * @returns {Promise<Queue|true>} `true` if queue is not generated\n */\n async createQueue(\n message: Message | VoiceChannel | StageChannel,\n song: Song | Song[],\n textChannel: TextChannel = (message as Message).channel as TextChannel,\n ): Promise<Queue | true> {\n const voice = (message as Message)?.member?.voice?.channel || message;\n if (!voice || isMessageInstance(voice)) throw new DisTubeError(\"NOT_IN_VOICE\");\n if (!isSupportedVoiceChannel(voice)) throw new DisTubeError(\"NOT_SUPPORTED_VOICE\");\n return this.queues.create(voice, song, textChannel);\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 {Discord.GuildMember} member Requested user\n * @param {string|Song|SearchResult|Playlist} song URL | Search string | {@link Song}\n * @returns {Promise<Song|Playlist|null>} Resolved\n */\n async resolveSong(\n member: GuildMember,\n song: string | ytdl.videoInfo | Song | Playlist | SearchResult | OtherSongInfo | ytdl.relatedVideo | null,\n ): Promise<Song | Playlist | null> {\n if (!song) return null;\n if (song instanceof Song || song instanceof Playlist) return song._patchMember(member);\n if (song instanceof SearchResult) {\n if (song.type === \"video\") return new Song(song, member);\n return this.resolvePlaylist(member, song.url);\n }\n if (typeof song === \"object\") return new Song(song, member);\n if (ytdl.validateURL(song)) return new Song(await this.getYouTubeInfo(song), member);\n if (isURL(song)) {\n for (const plugin of this.distube.extractorPlugins) {\n if (await plugin.validate(song)) return plugin.resolve(song, member);\n }\n throw new DisTubeError(\"NOT_SUPPORTED_URL\");\n }\n throw new DisTubeError(\"CANNOT_RESOLVE_SONG\", typeof song);\n }\n\n /**\n * Resole Song[] or url to a Playlist\n * @param {Discord.GuildMember} member Requested user\n * @param {Song[]|string} playlist Resolvable playlist\n * @param {string} [source=\"youtube\"] Playlist source\n * @returns {Promise<Playlist>}\n */\n async resolvePlaylist(\n member: GuildMember,\n playlist: Playlist | Song[] | string,\n source = \"youtube\",\n ): Promise<Playlist> {\n if (playlist instanceof Playlist) return playlist;\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));\n } else {\n solvablePlaylist = playlist;\n }\n return new Playlist(solvablePlaylist, member, { source });\n }\n\n /**\n * Create a custom playlist\n * @returns {Promise<Playlist>}\n * @param {Discord.Message|Discord.GuildMember} message A message from guild channel | A guild member\n * @param {Array<string|Song|SearchResult>} songs Array of url, Song or SearchResult\n * @param {Object} [properties={}] Additional properties such as `name`\n * @param {boolean} [parallel=true] Whether or not fetch the songs in parallel\n * @example\n * const songs = [\"https://www.youtube.com/watch?v=xxx\", \"https://www.youtube.com/watch?v=yyy\"];\n * const playlist = await distube.handler.createCustomPlaylist(member, songs, { name: \"My playlist name\" }, true);\n * // Or fetching custom playlist sequentially (reduce lag for low specs)\n * const playlist = await distube.handler.createCustomPlaylist(member, songs, false);\n * distube.playVoiceChannel(voiceChannel, playlist, { ... });\n */\n async createCustomPlaylist(\n message: Message | GuildMember,\n songs: (string | Song | SearchResult)[],\n properties: any = {},\n parallel = true,\n ): Promise<Playlist> {\n const member = (message as Message)?.member || (message as GuildMember);\n if (!Array.isArray(songs)) throw new DisTubeError(\"INVALID_TYPE\", \"Array\", songs, \"songs\");\n if (!songs.length) throw new DisTubeError(\"EMPTY_ARRAY\", \"songs\");\n songs = songs.filter(\n song => song instanceof Song || (song instanceof SearchResult && song.type === \"video\") || isURL(song),\n );\n if (!songs.length) throw new DisTubeError(\"NO_VALID_SONG\");\n let resolvedSongs: Song[];\n if (parallel) {\n const promises = songs.map((song: string | Song | SearchResult) =>\n this.resolveSong(member, song).catch(() => undefined),\n );\n resolvedSongs = (await Promise.all(promises)).filter((s: any): s is Song => !!s);\n } else {\n const resolved = [];\n for (const song of songs) {\n resolved.push(await this.resolveSong(member, song).catch(() => undefined));\n }\n resolvedSongs = resolved.filter((s: any): s is Song => !!s);\n }\n return new Playlist(resolvedSongs, member, properties);\n }\n\n /**\n * Play / add a playlist\n * @returns {Promise<void>}\n * @param {Discord.Message|Discord.VoiceChannel|Discord.StageChannel} message A message | a voice channel\n * @param {Playlist|string} playlist A YouTube playlist url | a Playlist\n * @param {Discord.TextChannel|boolean} [textChannel] The default text channel of the queue\n * @param {boolean} [skip=false] Skip the playing song (if exists) and play the added playlist instantly\n * @param {boolean} [unshift=false] Add the playlist to the beginning of the queue (after the playing song if exists)\n */\n async handlePlaylist(\n message: Message | VoiceChannel | StageChannel,\n playlist: Playlist,\n textChannel?: TextChannel,\n skip = false,\n unshift = false,\n ): Promise<void> {\n if (!(playlist instanceof Playlist)) throw new DisTubeError(\"INVALID_TYPE\", \"Playlist\", playlist, \"playlist\");\n if (!this.options.nsfw && !textChannel?.nsfw) playlist.songs = playlist.songs.filter(s => !s.age_restricted);\n if (!playlist.songs.length) {\n if (!this.options.nsfw && !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(message);\n if (queue) {\n queue.addToQueue(songs, skip || unshift ? 1 : -1);\n if (skip) queue.skip();\n else this.emit(\"addList\", queue, playlist);\n } else {\n const newQueue = await this.createQueue(message, 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 A message from guild channel\n * @param {string} query The query string\n * @returns {Promise<SearchResult?>} Song info\n */\n async searchSong(message: Message, query: string): Promise<SearchResult | null> {\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 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 let result = results[0];\n if (limit > 1) {\n this.emit(\"searchResult\", message, results, query);\n const c = message.channel;\n const answers = await (c.awaitMessages.length === 0\n ? c.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 : (c.awaitMessages as any)((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 Object.assign(streamOptions, this.ytdlOptions);\n if (source === \"youtube\") return DisTubeStream.YouTube(formats, streamOptions);\n return DisTubeStream.DirectLink(streamURL as string, streamOptions);\n }\n}\n\nexport default DisTubeHandler;\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type ytdl from "@distube/ytdl-core";
|
|
2
|
+
import type { CustomPlugin, DisTubeOptions, ExtractorPlugin, Filters } from "..";
|
|
3
|
+
export declare class Options {
|
|
4
|
+
plugins: (CustomPlugin | ExtractorPlugin)[];
|
|
5
|
+
emitNewSongOnly: boolean;
|
|
6
|
+
leaveOnFinish: boolean;
|
|
7
|
+
leaveOnStop: boolean;
|
|
8
|
+
leaveOnEmpty: boolean;
|
|
9
|
+
emptyCooldown: number;
|
|
10
|
+
savePreviousSongs: boolean;
|
|
11
|
+
searchSongs: number;
|
|
12
|
+
searchCooldown: number;
|
|
13
|
+
youtubeCookie?: string;
|
|
14
|
+
youtubeIdentityToken?: string;
|
|
15
|
+
youtubeDL: boolean;
|
|
16
|
+
updateYouTubeDL: boolean;
|
|
17
|
+
customFilters: Filters;
|
|
18
|
+
ytdlOptions: ytdl.getInfoOptions;
|
|
19
|
+
nsfw: boolean;
|
|
20
|
+
emitAddSongWhenCreatingQueue: boolean;
|
|
21
|
+
emitAddListWhenCreatingQueue: boolean;
|
|
22
|
+
constructor(options: DisTubeOptions);
|
|
23
|
+
private _validateOptions;
|
|
24
|
+
}
|
|
25
|
+
export default Options;
|
|
26
|
+
//# sourceMappingURL=DisTubeOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,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;IA6BnC,OAAO,CAAC,gBAAgB;CAuEzB;AAED,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Options = void 0;
|
|
4
|
+
const __1 = require("..");
|
|
5
|
+
class Options {
|
|
6
|
+
constructor(options) {
|
|
7
|
+
if (typeof options !== "object" || Array.isArray(options)) {
|
|
8
|
+
throw new __1.DisTubeError("INVALID_TYPE", "object", options, "DisTubeOptions");
|
|
9
|
+
}
|
|
10
|
+
const def = { ...__1.defaultOptions };
|
|
11
|
+
// Object.assign(this, defaultOptions, options);
|
|
12
|
+
const opts = Object.assign({}, def, options);
|
|
13
|
+
this.plugins = opts.plugins;
|
|
14
|
+
this.emitNewSongOnly = opts.emitNewSongOnly;
|
|
15
|
+
this.leaveOnEmpty = opts.leaveOnEmpty;
|
|
16
|
+
this.leaveOnFinish = opts.leaveOnFinish;
|
|
17
|
+
this.leaveOnStop = opts.leaveOnStop;
|
|
18
|
+
this.savePreviousSongs = opts.savePreviousSongs;
|
|
19
|
+
this.youtubeDL = opts.youtubeDL;
|
|
20
|
+
this.updateYouTubeDL = opts.updateYouTubeDL;
|
|
21
|
+
this.searchSongs = opts.searchSongs;
|
|
22
|
+
this.youtubeCookie = opts.youtubeCookie;
|
|
23
|
+
this.youtubeIdentityToken = opts.youtubeIdentityToken;
|
|
24
|
+
this.customFilters = opts.customFilters;
|
|
25
|
+
this.ytdlOptions = opts.ytdlOptions;
|
|
26
|
+
this.searchCooldown = opts.searchCooldown;
|
|
27
|
+
this.emptyCooldown = opts.emptyCooldown;
|
|
28
|
+
this.nsfw = opts.nsfw;
|
|
29
|
+
this.emitAddSongWhenCreatingQueue = opts.emitAddSongWhenCreatingQueue;
|
|
30
|
+
this.emitAddListWhenCreatingQueue = opts.emitAddListWhenCreatingQueue;
|
|
31
|
+
(0, __1.checkInvalidKey)(opts, this, "DisTubeOptions");
|
|
32
|
+
this._validateOptions();
|
|
33
|
+
}
|
|
34
|
+
_validateOptions(options = this) {
|
|
35
|
+
if (typeof options.emitNewSongOnly !== "boolean") {
|
|
36
|
+
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.emitNewSongOnly, "DisTubeOptions.emitNewSongOnly");
|
|
37
|
+
}
|
|
38
|
+
if (typeof options.leaveOnEmpty !== "boolean") {
|
|
39
|
+
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.leaveOnEmpty, "DisTubeOptions.leaveOnEmpty");
|
|
40
|
+
}
|
|
41
|
+
if (typeof options.leaveOnFinish !== "boolean") {
|
|
42
|
+
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.leaveOnFinish, "DisTubeOptions.leaveOnFinish");
|
|
43
|
+
}
|
|
44
|
+
if (typeof options.leaveOnStop !== "boolean") {
|
|
45
|
+
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.leaveOnStop, "DisTubeOptions.leaveOnStop");
|
|
46
|
+
}
|
|
47
|
+
if (typeof options.savePreviousSongs !== "boolean") {
|
|
48
|
+
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.savePreviousSongs, "DisTubeOptions.savePreviousSongs");
|
|
49
|
+
}
|
|
50
|
+
if (typeof options.youtubeDL !== "boolean") {
|
|
51
|
+
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.youtubeDL, "DisTubeOptions.youtubeDL");
|
|
52
|
+
}
|
|
53
|
+
if (typeof options.updateYouTubeDL !== "boolean") {
|
|
54
|
+
throw new __1.DisTubeError("INVALID_TYPE", "boolean", options.updateYouTubeDL, "DisTubeOptions.updateYouTubeDL");
|
|
55
|
+
}
|
|
56
|
+
if (typeof options.youtubeCookie !== "undefined" && typeof options.youtubeCookie !== "string") {
|
|
57
|
+
throw new __1.DisTubeError("INVALID_TYPE", "string", options.youtubeCookie, "DisTubeOptions.youtubeCookie");
|
|
58
|
+
}
|
|
59
|
+
if (typeof options.youtubeIdentityToken !== "undefined" && typeof options.youtubeIdentityToken !== "string") {
|
|
60
|
+
throw new __1.DisTubeError("INVALID_TYPE", "string", options.youtubeIdentityToken, "DisTubeOptions.youtubeIdentityToken");
|
|
61
|
+
}
|
|
62
|
+
if (typeof options.customFilters !== "object" || 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
|
+
}
|
|
91
|
+
exports.Options = Options;
|
|
92
|
+
exports.default = Options;
|
|
93
|
+
//# sourceMappingURL=DisTubeOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 youtubeDL: boolean;\n updateYouTubeDL: boolean;\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 def = { ...defaultOptions };\n // Object.assign(this, defaultOptions, options);\n const opts = Object.assign({}, def, 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.youtubeDL = opts.youtubeDL;\n this.updateYouTubeDL = opts.updateYouTubeDL;\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 private _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.youtubeDL !== \"boolean\") {\n throw new DisTubeError(\"INVALID_TYPE\", \"boolean\", options.youtubeDL, \"DisTubeOptions.youtubeDL\");\n }\n if (typeof options.updateYouTubeDL !== \"boolean\") {\n throw new DisTubeError(\"INVALID_TYPE\", \"boolean\", options.updateYouTubeDL, \"DisTubeOptions.updateYouTubeDL\");\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 (typeof options.customFilters !== \"object\" || Array.isArray(options.customFilters)) {\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\nexport default Options;\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { FFmpeg } from "prism-media";
|
|
2
|
+
import { StreamType } from "@discordjs/voice";
|
|
3
|
+
import type ytdl from "@distube/ytdl-core";
|
|
4
|
+
interface StreamOptions extends ytdl.downloadOptions {
|
|
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 default DisTubeStream;
|
|
52
|
+
//# sourceMappingURL=DisTubeStream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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,aAAc,SAAQ,IAAI,CAAC,eAAe;IAClD;;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;AAED,eAAe,aAAa,CAAC"}
|