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 @@
|
|
|
1
|
+
{"version":3,"file":"Playlist.js","sourceRoot":"","sources":["../../src/struct/Playlist.ts"],"names":[],"mappings":"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","sourcesContent":["import { DisTubeError, formatDuration } from \"..\";\nimport type ytpl from \"@distube/ytpl\";\nimport type { PlaylistInfo, Song } from \"..\";\nimport type { GuildMember, User } from \"discord.js\";\n\n/**\n * Class representing a playlist.\n * @prop {string} source Playlist source\n */\nexport class Playlist implements PlaylistInfo {\n source: string;\n member?: GuildMember;\n user?: User;\n songs: Song[];\n name: string;\n url?: string;\n thumbnail?: string;\n [x: string]: any;\n /**\n * Create a playlist\n * @param {Song[]|PlaylistInfo} playlist Playlist\n * @param {Discord.GuildMember} member Requested user\n * @param {Object} properties Custom properties\n */\n constructor(playlist: Song[] | ytpl.result | PlaylistInfo, member?: GuildMember, properties: any = {}) {\n if (typeof playlist !== \"object\") {\n throw new DisTubeError(\"INVALID_TYPE\", [\"Array<Song>\", \"object\"], playlist, \"playlist\");\n }\n if (typeof properties !== \"object\") {\n throw new DisTubeError(\"INVALID_TYPE\", \"object\", properties, \"properties\");\n }\n // FIXME\n const info = playlist as any;\n /**\n * The source of the playlist\n * @type {string}\n */\n this.source = (info.source || properties.source || \"youtube\").toLowerCase();\n /**\n * Playlist songs.\n * @type {Array<Song>}\n */\n this.songs = Array.isArray(info) ? info : info.items || info.songs;\n if (!Array.isArray(this.songs) || !this.songs.length) {\n throw new DisTubeError(\"EMPTY_PLAYLIST\");\n }\n this._patchMember(member || info.member);\n /**\n * Playlist name.\n * @type {string}\n */\n this.name =\n info.name ||\n info.title ||\n (this.songs[0].name\n ? `${this.songs[0].name} and ${this.songs.length - 1} more songs.`\n : `${this.songs.length} songs playlist`);\n /**\n * Playlist URL.\n * @type {string}\n */\n this.url = info.url || info.webpage_url;\n /**\n * Playlist thumbnail.\n * @type {?string}\n */\n this.thumbnail = info.thumbnail?.url || info.thumbnail || this.songs[0].thumbnail;\n for (const [key, value] of Object.entries(properties)) {\n this[key] = value;\n }\n }\n\n /**\n * Playlist duration in second.\n * @type {number}\n */\n get duration() {\n return this.songs?.reduce((prev, next) => prev + (next.duration || 0), 0) || 0;\n }\n\n /**\n * Formatted duration string `hh:mm:ss`.\n * @type {string}\n */\n get formattedDuration() {\n return formatDuration(this.duration);\n }\n\n /**\n * @param {?Discord.GuildMember} [member] Requested user\n * @private\n * @returns {Playlist}\n */\n _patchMember(member?: GuildMember): Playlist {\n if (member) {\n /**\n * User requested.\n * @type {?Discord.GuildMember}\n */\n this.member = member;\n /**\n * User requested.\n * @type {?Discord.User}\n */\n this.user = this.member?.user;\n }\n this.songs.map(s => s.constructor.name === \"Song\" && s._patchPlaylist(this, this.member));\n return this;\n }\n}\n\nexport default Playlist;\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { Client, TextChannel } from "discord.js";
|
|
2
|
+
import type { DisTube, DisTubeEvents, DisTubeHandler, DisTubeVoiceManager, Options, PluginType, QueueManager, Song } from "..";
|
|
3
|
+
/**
|
|
4
|
+
* DisTube Plugin
|
|
5
|
+
* @abstract
|
|
6
|
+
* @private
|
|
7
|
+
*/
|
|
8
|
+
export declare abstract class Plugin {
|
|
9
|
+
type: PluginType;
|
|
10
|
+
distube: DisTube;
|
|
11
|
+
init(distube: DisTube): void;
|
|
12
|
+
/**
|
|
13
|
+
* Type of the plugin
|
|
14
|
+
* @name Plugin#type
|
|
15
|
+
* @type {PluginType}
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Emit the {@link DisTube} of this base
|
|
19
|
+
* @param {string} eventName Event name
|
|
20
|
+
* @param {...any} args arguments
|
|
21
|
+
* @returns {boolean}
|
|
22
|
+
*/
|
|
23
|
+
emit(eventName: keyof DisTubeEvents, ...args: any): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Emit error event
|
|
26
|
+
* @param {Error} error error
|
|
27
|
+
* @param {Discord.TextChannel?} channel Text channel where the error is encountered.
|
|
28
|
+
*/
|
|
29
|
+
emitError(error: Error, channel?: TextChannel): void;
|
|
30
|
+
/**
|
|
31
|
+
* The queue manager
|
|
32
|
+
* @type {QueueManager}
|
|
33
|
+
* @readonly
|
|
34
|
+
*/
|
|
35
|
+
get queues(): QueueManager;
|
|
36
|
+
/**
|
|
37
|
+
* The voice manager
|
|
38
|
+
* @type {DisTubeVoiceManager}
|
|
39
|
+
* @readonly
|
|
40
|
+
*/
|
|
41
|
+
get voices(): DisTubeVoiceManager;
|
|
42
|
+
/**
|
|
43
|
+
* Discord.js client
|
|
44
|
+
* @type {Discord.Client}
|
|
45
|
+
* @readonly
|
|
46
|
+
*/
|
|
47
|
+
get client(): Client;
|
|
48
|
+
/**
|
|
49
|
+
* DisTube options
|
|
50
|
+
* @type {DisTubeOptions}
|
|
51
|
+
* @readonly
|
|
52
|
+
*/
|
|
53
|
+
get options(): Options;
|
|
54
|
+
/**
|
|
55
|
+
* DisTube handler
|
|
56
|
+
* @type {DisTubeHandler}
|
|
57
|
+
* @readonly
|
|
58
|
+
*/
|
|
59
|
+
get handler(): DisTubeHandler;
|
|
60
|
+
/**
|
|
61
|
+
* Check if the url is working with this plugin
|
|
62
|
+
* @param {string} url Input url
|
|
63
|
+
* @returns {Promise<boolean>}
|
|
64
|
+
*/
|
|
65
|
+
validate(url: string): Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* Get the stream url from {@link Song#url}. Returns {@link Song#url} by default.
|
|
68
|
+
* Not needed if the plugin plays song from YouTube.
|
|
69
|
+
* @param {string} url Input url
|
|
70
|
+
* @returns {Promise<string>}
|
|
71
|
+
*/
|
|
72
|
+
getStreamURL(url: string): Promise<string>;
|
|
73
|
+
/**
|
|
74
|
+
* (Optional) Get related songs from a supported url. {@link Song#member} should be `undefined`.
|
|
75
|
+
* Not needed to add {@link Song#related} because it will be added with this function later.
|
|
76
|
+
* @param {string} url Input url
|
|
77
|
+
* @returns {Promise<Song[]>}
|
|
78
|
+
*/
|
|
79
|
+
getRelatedSongs(url: string): Promise<Song[]>;
|
|
80
|
+
}
|
|
81
|
+
export default Plugin;
|
|
82
|
+
//# sourceMappingURL=Plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/struct/Plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,OAAO,EACP,UAAU,EACV,YAAY,EACZ,IAAI,EACL,MAAM,IAAI,CAAC;AAEZ;;;;GAIG;AACH,8BAAsB,MAAM;IAC1B,IAAI,EAAG,UAAU,CAAC;IAClB,OAAO,EAAG,OAAO,CAAC;IAClB,IAAI,CAAC,OAAO,EAAE,OAAO;IAOrB;;;;OAIG;IACH;;;;;OAKG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,aAAa,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,OAAO;IAG3D;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,WAAW;IAG7C;;;;OAIG;IACH,IAAI,MAAM,IAAI,YAAY,CAEzB;IACD;;;;OAIG;IACH,IAAI,MAAM,IAAI,mBAAmB,CAEhC;IACD;;;;OAIG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IACD;;;;OAIG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IACD;;;;OAIG;IACH,IAAI,OAAO,IAAI,cAAc,CAE5B;IACD;;;;OAIG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAG7C;;;;;OAKG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAGhD;;;;;OAKG;IACG,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;CAGpD;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Plugin = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* DisTube Plugin
|
|
6
|
+
* @abstract
|
|
7
|
+
* @private
|
|
8
|
+
*/
|
|
9
|
+
class Plugin {
|
|
10
|
+
init(distube) {
|
|
11
|
+
/**
|
|
12
|
+
* DisTube
|
|
13
|
+
* @type {DisTube}
|
|
14
|
+
*/
|
|
15
|
+
this.distube = distube;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Type of the plugin
|
|
19
|
+
* @name Plugin#type
|
|
20
|
+
* @type {PluginType}
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Emit the {@link DisTube} of this base
|
|
24
|
+
* @param {string} eventName Event name
|
|
25
|
+
* @param {...any} args arguments
|
|
26
|
+
* @returns {boolean}
|
|
27
|
+
*/
|
|
28
|
+
emit(eventName, ...args) {
|
|
29
|
+
return this.distube.emit(eventName, ...args);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Emit error event
|
|
33
|
+
* @param {Error} error error
|
|
34
|
+
* @param {Discord.TextChannel?} channel Text channel where the error is encountered.
|
|
35
|
+
*/
|
|
36
|
+
emitError(error, channel) {
|
|
37
|
+
this.distube.emitError(error, channel);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The queue manager
|
|
41
|
+
* @type {QueueManager}
|
|
42
|
+
* @readonly
|
|
43
|
+
*/
|
|
44
|
+
get queues() {
|
|
45
|
+
return this.distube.queues;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The voice manager
|
|
49
|
+
* @type {DisTubeVoiceManager}
|
|
50
|
+
* @readonly
|
|
51
|
+
*/
|
|
52
|
+
get voices() {
|
|
53
|
+
return this.distube.voices;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Discord.js client
|
|
57
|
+
* @type {Discord.Client}
|
|
58
|
+
* @readonly
|
|
59
|
+
*/
|
|
60
|
+
get client() {
|
|
61
|
+
return this.distube.client;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* DisTube options
|
|
65
|
+
* @type {DisTubeOptions}
|
|
66
|
+
* @readonly
|
|
67
|
+
*/
|
|
68
|
+
get options() {
|
|
69
|
+
return this.distube.options;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* DisTube handler
|
|
73
|
+
* @type {DisTubeHandler}
|
|
74
|
+
* @readonly
|
|
75
|
+
*/
|
|
76
|
+
get handler() {
|
|
77
|
+
return this.distube.handler;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Check if the url is working with this plugin
|
|
81
|
+
* @param {string} url Input url
|
|
82
|
+
* @returns {Promise<boolean>}
|
|
83
|
+
*/
|
|
84
|
+
async validate(url) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the stream url from {@link Song#url}. Returns {@link Song#url} by default.
|
|
89
|
+
* Not needed if the plugin plays song from YouTube.
|
|
90
|
+
* @param {string} url Input url
|
|
91
|
+
* @returns {Promise<string>}
|
|
92
|
+
*/
|
|
93
|
+
async getStreamURL(url) {
|
|
94
|
+
return url;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* (Optional) Get related songs from a supported url. {@link Song#member} should be `undefined`.
|
|
98
|
+
* Not needed to add {@link Song#related} because it will be added with this function later.
|
|
99
|
+
* @param {string} url Input url
|
|
100
|
+
* @returns {Promise<Song[]>}
|
|
101
|
+
*/
|
|
102
|
+
async getRelatedSongs(url) {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.Plugin = Plugin;
|
|
107
|
+
exports.default = Plugin;
|
|
108
|
+
//# sourceMappingURL=Plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Plugin.js","sourceRoot":"","sources":["../../src/struct/Plugin.ts"],"names":[],"mappings":";;;AAaA;;;;GAIG;AACH,MAAsB,MAAM;IAG1B,IAAI,CAAC,OAAgB;QACnB;;;WAGG;QACH,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IACD;;;;OAIG;IACH;;;;;OAKG;IACH,IAAI,CAAC,SAA8B,EAAE,GAAG,IAAS;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IAC/C,CAAC;IACD;;;;OAIG;IACH,SAAS,CAAC,KAAY,EAAE,OAAqB;QAC3C,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IACD;;;;OAIG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IACD;;;;OAIG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IACD;;;;OAIG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IACD;;;;OAIG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;IACD;;;;OAIG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;IACD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IACD;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CAAC,GAAW;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAlGD,wBAkGC;AAED,kBAAe,MAAM,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/require-await, @typescript-eslint/no-unused-vars */\nimport type { Client, TextChannel } from \"discord.js\";\nimport type {\n DisTube,\n DisTubeEvents,\n DisTubeHandler,\n DisTubeVoiceManager,\n Options,\n PluginType,\n QueueManager,\n Song,\n} from \"..\";\n\n/**\n * DisTube Plugin\n * @abstract\n * @private\n */\nexport abstract class Plugin {\n type!: PluginType;\n distube!: DisTube;\n init(distube: DisTube) {\n /**\n * DisTube\n * @type {DisTube}\n */\n this.distube = distube;\n }\n /**\n * Type of the plugin\n * @name Plugin#type\n * @type {PluginType}\n */\n /**\n * Emit the {@link DisTube} of this base\n * @param {string} eventName Event name\n * @param {...any} args arguments\n * @returns {boolean}\n */\n emit(eventName: keyof DisTubeEvents, ...args: any): boolean {\n return this.distube.emit(eventName, ...args);\n }\n /**\n * Emit error event\n * @param {Error} error error\n * @param {Discord.TextChannel?} channel Text channel where the error is encountered.\n */\n emitError(error: Error, channel?: TextChannel) {\n this.distube.emitError(error, channel);\n }\n /**\n * The queue manager\n * @type {QueueManager}\n * @readonly\n */\n get queues(): QueueManager {\n return this.distube.queues;\n }\n /**\n * The voice manager\n * @type {DisTubeVoiceManager}\n * @readonly\n */\n get voices(): DisTubeVoiceManager {\n return this.distube.voices;\n }\n /**\n * Discord.js client\n * @type {Discord.Client}\n * @readonly\n */\n get client(): Client {\n return this.distube.client;\n }\n /**\n * DisTube options\n * @type {DisTubeOptions}\n * @readonly\n */\n get options(): Options {\n return this.distube.options;\n }\n /**\n * DisTube handler\n * @type {DisTubeHandler}\n * @readonly\n */\n get handler(): DisTubeHandler {\n return this.distube.handler;\n }\n /**\n * Check if the url is working with this plugin\n * @param {string} url Input url\n * @returns {Promise<boolean>}\n */\n async validate(url: string): Promise<boolean> {\n return false;\n }\n /**\n * Get the stream url from {@link Song#url}. Returns {@link Song#url} by default.\n * Not needed if the plugin plays song from YouTube.\n * @param {string} url Input url\n * @returns {Promise<string>}\n */\n async getStreamURL(url: string): Promise<string> {\n return url;\n }\n /**\n * (Optional) Get related songs from a supported url. {@link Song#member} should be `undefined`.\n * Not needed to add {@link Song#related} because it will be added with this function later.\n * @param {string} url Input url\n * @returns {Promise<Song[]>}\n */\n async getRelatedSongs(url: string): Promise<Song[]> {\n return [];\n }\n}\n\nexport default Plugin;\n"]}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { DisTubeBase } from "../core";
|
|
3
|
+
import { RepeatMode, Song, TaskQueue } from "..";
|
|
4
|
+
import type { GuildMember, Snowflake, TextChannel } from "discord.js";
|
|
5
|
+
import type { DisTube, DisTubeVoice, DisTubeVoiceEvents, SearchResult } from "..";
|
|
6
|
+
/**
|
|
7
|
+
* Represents a queue.
|
|
8
|
+
* @extends DisTubeBase
|
|
9
|
+
*/
|
|
10
|
+
export declare class Queue extends DisTubeBase {
|
|
11
|
+
id: Snowflake;
|
|
12
|
+
/**
|
|
13
|
+
* Voice connection of this queue
|
|
14
|
+
*/
|
|
15
|
+
voice: DisTubeVoice;
|
|
16
|
+
/**
|
|
17
|
+
* List of songs in the queue (The first one is the playing song)
|
|
18
|
+
*/
|
|
19
|
+
songs: Song[];
|
|
20
|
+
/**
|
|
21
|
+
* List of the previous songs.
|
|
22
|
+
*/
|
|
23
|
+
previousSongs: Song[];
|
|
24
|
+
/**
|
|
25
|
+
* Whether stream is currently stopped.
|
|
26
|
+
* @private
|
|
27
|
+
*/
|
|
28
|
+
stopped: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Whether or not the last song was skipped to next song.
|
|
31
|
+
* @private
|
|
32
|
+
*/
|
|
33
|
+
next: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Whether or not the last song was skipped to previous song.
|
|
36
|
+
* @private
|
|
37
|
+
*/
|
|
38
|
+
prev: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Whether or not the stream is currently playing.
|
|
41
|
+
*/
|
|
42
|
+
playing: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Whether or not the stream is currently paused.
|
|
45
|
+
*/
|
|
46
|
+
paused: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Type of repeat mode (`0` is disabled, `1` is repeating a song, `2` is repeating all the queue).
|
|
49
|
+
* Default value: `0` (disabled)
|
|
50
|
+
*/
|
|
51
|
+
repeatMode: RepeatMode;
|
|
52
|
+
/**
|
|
53
|
+
* Whether or not the autoplay mode is enabled.
|
|
54
|
+
* Default value: `false`
|
|
55
|
+
*/
|
|
56
|
+
autoplay: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Enabled audio filters.
|
|
59
|
+
* Available filters: {@link Filters}
|
|
60
|
+
*/
|
|
61
|
+
filters: string[];
|
|
62
|
+
/**
|
|
63
|
+
* What time in the song to begin (in seconds).
|
|
64
|
+
*/
|
|
65
|
+
beginTime: number;
|
|
66
|
+
/**
|
|
67
|
+
* The text channel of the Queue. (Default: where the first command is called).
|
|
68
|
+
*/
|
|
69
|
+
textChannel?: TextChannel;
|
|
70
|
+
/**
|
|
71
|
+
* Timeout for checking empty channel
|
|
72
|
+
* @private
|
|
73
|
+
*/
|
|
74
|
+
emptyTimeout?: NodeJS.Timeout;
|
|
75
|
+
/**
|
|
76
|
+
* The client user as a `GuildMember` of this queue's guild
|
|
77
|
+
*/
|
|
78
|
+
clientMember: GuildMember;
|
|
79
|
+
/**
|
|
80
|
+
* Task queuing system
|
|
81
|
+
*/
|
|
82
|
+
taskQueue: TaskQueue;
|
|
83
|
+
listeners?: DisTubeVoiceEvents;
|
|
84
|
+
/**
|
|
85
|
+
* Create a queue for the guild
|
|
86
|
+
* @param {DisTube} distube DisTube
|
|
87
|
+
* @param {DisTubeVoice} voice Voice connection
|
|
88
|
+
* @param {Song|Song[]} song First song(s)
|
|
89
|
+
* @param {Discord.TextChannel?} textChannel Default text channel
|
|
90
|
+
*/
|
|
91
|
+
constructor(distube: DisTube, voice: DisTubeVoice, song: Song | Song[], textChannel?: TextChannel);
|
|
92
|
+
/**
|
|
93
|
+
* Formatted duration string.
|
|
94
|
+
* @type {string}
|
|
95
|
+
*/
|
|
96
|
+
get formattedDuration(): string;
|
|
97
|
+
/**
|
|
98
|
+
* Queue's duration.
|
|
99
|
+
* @type {number}
|
|
100
|
+
*/
|
|
101
|
+
get duration(): number;
|
|
102
|
+
/**
|
|
103
|
+
* What time in the song is playing (in seconds).
|
|
104
|
+
* @type {number}
|
|
105
|
+
*/
|
|
106
|
+
get currentTime(): number;
|
|
107
|
+
/**
|
|
108
|
+
* Formatted {@link Queue#currentTime} string.
|
|
109
|
+
* @type {string}
|
|
110
|
+
*/
|
|
111
|
+
get formattedCurrentTime(): string;
|
|
112
|
+
/**
|
|
113
|
+
* The voice channel playing in.
|
|
114
|
+
* @type {Discord.VoiceChannel|Discord.StageChannel|null}
|
|
115
|
+
*/
|
|
116
|
+
get voiceChannel(): import("discord.js").VoiceChannel | import("discord.js").StageChannel | null;
|
|
117
|
+
get volume(): number;
|
|
118
|
+
set volume(value: number);
|
|
119
|
+
/**
|
|
120
|
+
* Add a Song or an array of Song to the queue
|
|
121
|
+
* @param {Song|Song[]} song Song to add
|
|
122
|
+
* @param {number} [position=-1] Position to add, < 0 to add to the end of the queue
|
|
123
|
+
* @param {boolean} [queuing=true] Wether or not waiting for unfinished tasks
|
|
124
|
+
* @throws {Error}
|
|
125
|
+
* @returns {Queue} The guild queue
|
|
126
|
+
*/
|
|
127
|
+
addToQueue(song: Song | SearchResult | (Song | SearchResult)[], position?: number): Queue;
|
|
128
|
+
/**
|
|
129
|
+
* Pause the guild stream
|
|
130
|
+
* @returns {Queue} The guild queue
|
|
131
|
+
*/
|
|
132
|
+
pause(): Queue;
|
|
133
|
+
/**
|
|
134
|
+
* Resume the guild stream
|
|
135
|
+
* @returns {Queue} The guild queue
|
|
136
|
+
*/
|
|
137
|
+
resume(): Queue;
|
|
138
|
+
/**
|
|
139
|
+
* Set the guild stream's volume
|
|
140
|
+
* @param {number} percent The percentage of volume you want to set
|
|
141
|
+
* @returns {Queue} The guild queue
|
|
142
|
+
*/
|
|
143
|
+
setVolume(percent: number): Queue;
|
|
144
|
+
/**
|
|
145
|
+
* Skip the playing song if there is a next song in the queue.
|
|
146
|
+
* <info>If {@link Queue#autoplay} is `true` and there is no up next song,
|
|
147
|
+
* DisTube will add and play a related song.</info>
|
|
148
|
+
* @returns {Promise<Song>} The song will skip to
|
|
149
|
+
* @throws {Error}
|
|
150
|
+
*/
|
|
151
|
+
skip(): Promise<Song>;
|
|
152
|
+
/**
|
|
153
|
+
* Play the previous song if exists
|
|
154
|
+
* @returns {Song} The guild queue
|
|
155
|
+
* @throws {Error}
|
|
156
|
+
*/
|
|
157
|
+
previous(): Promise<Song>;
|
|
158
|
+
/**
|
|
159
|
+
* Shuffle the queue's songs
|
|
160
|
+
* @returns {Promise<Queue>} The guild queue
|
|
161
|
+
*/
|
|
162
|
+
shuffle(): Promise<Queue>;
|
|
163
|
+
/**
|
|
164
|
+
* Jump to the song position in the queue.
|
|
165
|
+
* The next one is 1, 2,...
|
|
166
|
+
* The previous one is -1, -2,...
|
|
167
|
+
* @param {number} position The song position to play
|
|
168
|
+
* @returns {Promise<Queue>} The guild queue
|
|
169
|
+
* @throws {Error} if `num` is invalid number
|
|
170
|
+
*/
|
|
171
|
+
jump(position: number): Promise<Queue>;
|
|
172
|
+
/**
|
|
173
|
+
* Set the repeat mode of the guild queue.\
|
|
174
|
+
* Toggle mode `(Disabled -> Song -> Queue -> Disabled ->...)` if `mode` is `undefined`
|
|
175
|
+
* @param {RepeatMode?} [mode] The repeat modes (toggle if `undefined`)
|
|
176
|
+
* @returns {RepeatMode} The new repeat mode
|
|
177
|
+
*/
|
|
178
|
+
setRepeatMode(mode?: RepeatMode): RepeatMode;
|
|
179
|
+
/**
|
|
180
|
+
* Enable or disable filter(s) of the queue.
|
|
181
|
+
* Available filters: {@link Filters}
|
|
182
|
+
* @param {string|string[]|false} filter A filter name, an array of filter name or `false` to clear all the filters
|
|
183
|
+
* @param {boolean} [force=false] Force enable the input filter(s) even if it's enabled
|
|
184
|
+
* @returns {Array<string>} Enabled filters.
|
|
185
|
+
* @throws {Error}
|
|
186
|
+
*/
|
|
187
|
+
setFilter(filter: string | string[] | false, force?: boolean): Array<string>;
|
|
188
|
+
/**
|
|
189
|
+
* Set the playing time to another position
|
|
190
|
+
* @param {number} time Time in seconds
|
|
191
|
+
* @returns {Queue} The guild queue
|
|
192
|
+
*/
|
|
193
|
+
seek(time: number): Queue;
|
|
194
|
+
/**
|
|
195
|
+
* Add a related song of the playing song to the queue
|
|
196
|
+
* @returns {Promise<Song>} The added song
|
|
197
|
+
* @throws {Error}
|
|
198
|
+
*/
|
|
199
|
+
addRelatedSong(): Promise<Song>;
|
|
200
|
+
/**
|
|
201
|
+
* Stop the guild stream
|
|
202
|
+
*/
|
|
203
|
+
stop(): Promise<void>;
|
|
204
|
+
/**
|
|
205
|
+
* Delete the queue from the manager
|
|
206
|
+
* (This does not leave the queue even if {@link DisTubeOptions|DisTubeOptions.leaveOnStop} is enabled)
|
|
207
|
+
* @private
|
|
208
|
+
*/
|
|
209
|
+
delete(): void;
|
|
210
|
+
/**
|
|
211
|
+
* Toggle autoplay mode
|
|
212
|
+
* @returns {boolean} Autoplay mode state
|
|
213
|
+
*/
|
|
214
|
+
toggleAutoplay(): boolean;
|
|
215
|
+
}
|
|
216
|
+
export default Queue;
|
|
217
|
+
//# sourceMappingURL=Queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Queue.d.ts","sourceRoot":"","sources":["../../src/struct/Queue.ts"],"names":[],"mappings":"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"}
|