distube 4.0.0-dev.0 → 4.0.0-dev.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +1 -1
  2. package/dist/index.d.ts +593 -8
  3. package/dist/index.js +2360 -22
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +2300 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/package.json +79 -43
  8. package/dist/DisTube.d.ts +0 -521
  9. package/dist/DisTube.d.ts.map +0 -1
  10. package/dist/DisTube.js +0 -793
  11. package/dist/DisTube.js.map +0 -1
  12. package/dist/constant.d.ts +0 -124
  13. package/dist/constant.d.ts.map +0 -1
  14. package/dist/constant.js +0 -144
  15. package/dist/constant.js.map +0 -1
  16. package/dist/core/DisTubeBase.d.ts +0 -54
  17. package/dist/core/DisTubeBase.d.ts.map +0 -1
  18. package/dist/core/DisTubeBase.js +0 -75
  19. package/dist/core/DisTubeBase.js.map +0 -1
  20. package/dist/core/DisTubeHandler.d.ts +0 -93
  21. package/dist/core/DisTubeHandler.d.ts.map +0 -1
  22. package/dist/core/DisTubeHandler.js +0 -292
  23. package/dist/core/DisTubeHandler.js.map +0 -1
  24. package/dist/core/DisTubeOptions.d.ts +0 -23
  25. package/dist/core/DisTubeOptions.d.ts.map +0 -1
  26. package/dist/core/DisTubeOptions.js +0 -90
  27. package/dist/core/DisTubeOptions.js.map +0 -1
  28. package/dist/core/DisTubeStream.d.ts +0 -52
  29. package/dist/core/DisTubeStream.d.ts.map +0 -1
  30. package/dist/core/DisTubeStream.js +0 -108
  31. package/dist/core/DisTubeStream.js.map +0 -1
  32. package/dist/core/index.d.ts +0 -7
  33. package/dist/core/index.d.ts.map +0 -1
  34. package/dist/core/index.js +0 -19
  35. package/dist/core/index.js.map +0 -1
  36. package/dist/core/manager/BaseManager.d.ts +0 -22
  37. package/dist/core/manager/BaseManager.d.ts.map +0 -1
  38. package/dist/core/manager/BaseManager.js +0 -42
  39. package/dist/core/manager/BaseManager.js.map +0 -1
  40. package/dist/core/manager/QueueManager.d.ts +0 -33
  41. package/dist/core/manager/QueueManager.d.ts.map +0 -1
  42. package/dist/core/manager/QueueManager.js +0 -193
  43. package/dist/core/manager/QueueManager.js.map +0 -1
  44. package/dist/core/manager/index.d.ts +0 -3
  45. package/dist/core/manager/index.d.ts.map +0 -1
  46. package/dist/core/manager/index.js +0 -15
  47. package/dist/core/manager/index.js.map +0 -1
  48. package/dist/core/voice/DisTubeVoice.d.ts +0 -82
  49. package/dist/core/voice/DisTubeVoice.d.ts.map +0 -1
  50. package/dist/core/voice/DisTubeVoice.js +0 -250
  51. package/dist/core/voice/DisTubeVoice.js.map +0 -1
  52. package/dist/core/voice/DisTubeVoiceManager.d.ts +0 -41
  53. package/dist/core/voice/DisTubeVoiceManager.d.ts.map +0 -1
  54. package/dist/core/voice/DisTubeVoiceManager.js +0 -67
  55. package/dist/core/voice/DisTubeVoiceManager.js.map +0 -1
  56. package/dist/core/voice/index.d.ts +0 -3
  57. package/dist/core/voice/index.d.ts.map +0 -1
  58. package/dist/core/voice/index.js +0 -15
  59. package/dist/core/voice/index.js.map +0 -1
  60. package/dist/index.d.ts.map +0 -1
  61. package/dist/plugin/http.d.ts +0 -10
  62. package/dist/plugin/http.d.ts.map +0 -1
  63. package/dist/plugin/http.js +0 -18
  64. package/dist/plugin/http.js.map +0 -1
  65. package/dist/plugin/https.d.ts +0 -19
  66. package/dist/plugin/https.d.ts.map +0 -1
  67. package/dist/plugin/https.js +0 -47
  68. package/dist/plugin/https.js.map +0 -1
  69. package/dist/plugin/index.d.ts +0 -3
  70. package/dist/plugin/index.d.ts.map +0 -1
  71. package/dist/plugin/index.js +0 -15
  72. package/dist/plugin/index.js.map +0 -1
  73. package/dist/struct/CustomPlugin.d.ts +0 -51
  74. package/dist/struct/CustomPlugin.d.ts.map +0 -1
  75. package/dist/struct/CustomPlugin.js +0 -50
  76. package/dist/struct/CustomPlugin.js.map +0 -1
  77. package/dist/struct/DisTubeError.d.ts +0 -55
  78. package/dist/struct/DisTubeError.d.ts.map +0 -1
  79. package/dist/struct/DisTubeError.js +0 -64
  80. package/dist/struct/DisTubeError.js.map +0 -1
  81. package/dist/struct/ExtractorPlugin.d.ts +0 -45
  82. package/dist/struct/ExtractorPlugin.d.ts.map +0 -1
  83. package/dist/struct/ExtractorPlugin.js +0 -39
  84. package/dist/struct/ExtractorPlugin.js.map +0 -1
  85. package/dist/struct/Playlist.d.ts +0 -54
  86. package/dist/struct/Playlist.d.ts.map +0 -1
  87. package/dist/struct/Playlist.js +0 -131
  88. package/dist/struct/Playlist.js.map +0 -1
  89. package/dist/struct/Plugin.d.ts +0 -75
  90. package/dist/struct/Plugin.d.ts.map +0 -1
  91. package/dist/struct/Plugin.js +0 -99
  92. package/dist/struct/Plugin.js.map +0 -1
  93. package/dist/struct/Queue.d.ts +0 -216
  94. package/dist/struct/Queue.d.ts.map +0 -1
  95. package/dist/struct/Queue.js +0 -479
  96. package/dist/struct/Queue.js.map +0 -1
  97. package/dist/struct/SearchResult.d.ts +0 -27
  98. package/dist/struct/SearchResult.d.ts.map +0 -1
  99. package/dist/struct/SearchResult.js +0 -77
  100. package/dist/struct/SearchResult.js.map +0 -1
  101. package/dist/struct/Song.d.ts +0 -78
  102. package/dist/struct/Song.d.ts.map +0 -1
  103. package/dist/struct/Song.js +0 -259
  104. package/dist/struct/Song.js.map +0 -1
  105. package/dist/struct/TaskQueue.d.ts +0 -28
  106. package/dist/struct/TaskQueue.d.ts.map +0 -1
  107. package/dist/struct/TaskQueue.js +0 -64
  108. package/dist/struct/TaskQueue.js.map +0 -1
  109. package/dist/struct/index.d.ts +0 -10
  110. package/dist/struct/index.d.ts.map +0 -1
  111. package/dist/struct/index.js +0 -22
  112. package/dist/struct/index.js.map +0 -1
  113. package/dist/tsconfig.tsbuildinfo +0 -1
  114. package/dist/type.d.ts +0 -169
  115. package/dist/type.d.ts.map +0 -1
  116. package/dist/type.js +0 -3
  117. package/dist/type.js.map +0 -1
  118. package/dist/util.d.ts +0 -51
  119. package/dist/util.d.ts.map +0 -1
  120. package/dist/util.js +0 -225
  121. 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":";;;;;;;;;AAAA,0BAAmE;AAInE,MAAa,OAAO;IAiBlB,YAAY,OAAuB;;QACjC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACzD,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;SAC7E;QACD,MAAM,IAAI,GAAG,EAAE,GAAG,kBAAc,EAAE,GAAG,OAAO,EAAE,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,4BAA4B,CAAC;QACtE,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,4BAA4B,CAAC;QACtE,IAAA,mBAAe,EAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAC9C,uBAAA,IAAI,oDAAiB,MAArB,IAAI,CAAmB,CAAC;IAC1B,CAAC;CAsEF;AA9GD,0BA8GC;iGApEkB,OAAO,GAAG,IAAI;IAC7B,IAAI,OAAO,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE;QAChD,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,eAAe,EAAE,gCAAgC,CAAC,CAAC;KAC9G;IACD,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE;QAC7C,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,6BAA6B,CAAC,CAAC;KACxG;IACD,IAAI,OAAO,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE;QAC9C,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,aAAa,EAAE,8BAA8B,CAAC,CAAC;KAC1G;IACD,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE;QAC5C,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;KACtG;IACD,IAAI,OAAO,OAAO,CAAC,iBAAiB,KAAK,SAAS,EAAE;QAClD,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,iBAAiB,EAAE,kCAAkC,CAAC,CAAC;KAClH;IACD,IAAI,OAAO,OAAO,CAAC,aAAa,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ,EAAE;QAC7F,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,aAAa,EAAE,8BAA8B,CAAC,CAAC;KACzG;IACD,IAAI,OAAO,OAAO,CAAC,oBAAoB,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,oBAAoB,KAAK,QAAQ,EAAE;QAC3G,MAAM,IAAI,gBAAY,CACpB,cAAc,EACd,QAAQ,EACR,OAAO,CAAC,oBAAoB,EAC5B,qCAAqC,CACtC,CAAC;KACH;IACD,IACE,CAAC,OAAO,OAAO,CAAC,aAAa,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ,CAAC;QAC3F,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,EACpC;QACA,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,aAAa,EAAE,8BAA8B,CAAC,CAAC;KACzG;IACD,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;QACjF,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;KACrG;IACD,IAAI,OAAO,OAAO,CAAC,cAAc,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;QAC/E,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,cAAc,EAAE,+BAA+B,CAAC,CAAC;KAC3G;IACD,IAAI,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;QAC7E,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,aAAa,EAAE,8BAA8B,CAAC,CAAC;KACzG;IACD,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;QACzE,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;KACrG;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QACnC,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,eAAe,EAAE,OAAO,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;KACpG;IACD,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE;QACrC,MAAM,IAAI,gBAAY,CAAC,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;KACxF;IACD,IAAI,OAAO,OAAO,CAAC,4BAA4B,KAAK,SAAS,EAAE;QAC7D,MAAM,IAAI,gBAAY,CACpB,cAAc,EACd,SAAS,EACT,OAAO,CAAC,4BAA4B,EACpC,6CAA6C,CAC9C,CAAC;KACH;IACD,IAAI,OAAO,OAAO,CAAC,4BAA4B,KAAK,SAAS,EAAE;QAC7D,MAAM,IAAI,gBAAY,CACpB,cAAc,EACd,SAAS,EACT,OAAO,CAAC,4BAA4B,EACpC,6CAA6C,CAC9C,CAAC;KACH;AACH,CAAC","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