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.
- package/README.md +1 -1
- package/dist/index.d.ts +593 -8
- package/dist/index.js +2360 -22
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2300 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +79 -43
- package/dist/DisTube.d.ts +0 -521
- package/dist/DisTube.d.ts.map +0 -1
- package/dist/DisTube.js +0 -793
- package/dist/DisTube.js.map +0 -1
- package/dist/constant.d.ts +0 -124
- package/dist/constant.d.ts.map +0 -1
- package/dist/constant.js +0 -144
- package/dist/constant.js.map +0 -1
- package/dist/core/DisTubeBase.d.ts +0 -54
- package/dist/core/DisTubeBase.d.ts.map +0 -1
- package/dist/core/DisTubeBase.js +0 -75
- package/dist/core/DisTubeBase.js.map +0 -1
- package/dist/core/DisTubeHandler.d.ts +0 -93
- package/dist/core/DisTubeHandler.d.ts.map +0 -1
- package/dist/core/DisTubeHandler.js +0 -292
- package/dist/core/DisTubeHandler.js.map +0 -1
- package/dist/core/DisTubeOptions.d.ts +0 -23
- package/dist/core/DisTubeOptions.d.ts.map +0 -1
- package/dist/core/DisTubeOptions.js +0 -90
- package/dist/core/DisTubeOptions.js.map +0 -1
- package/dist/core/DisTubeStream.d.ts +0 -52
- package/dist/core/DisTubeStream.d.ts.map +0 -1
- package/dist/core/DisTubeStream.js +0 -108
- package/dist/core/DisTubeStream.js.map +0 -1
- package/dist/core/index.d.ts +0 -7
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -19
- package/dist/core/index.js.map +0 -1
- package/dist/core/manager/BaseManager.d.ts +0 -22
- package/dist/core/manager/BaseManager.d.ts.map +0 -1
- package/dist/core/manager/BaseManager.js +0 -42
- package/dist/core/manager/BaseManager.js.map +0 -1
- package/dist/core/manager/QueueManager.d.ts +0 -33
- package/dist/core/manager/QueueManager.d.ts.map +0 -1
- package/dist/core/manager/QueueManager.js +0 -193
- package/dist/core/manager/QueueManager.js.map +0 -1
- package/dist/core/manager/index.d.ts +0 -3
- package/dist/core/manager/index.d.ts.map +0 -1
- package/dist/core/manager/index.js +0 -15
- package/dist/core/manager/index.js.map +0 -1
- package/dist/core/voice/DisTubeVoice.d.ts +0 -82
- package/dist/core/voice/DisTubeVoice.d.ts.map +0 -1
- package/dist/core/voice/DisTubeVoice.js +0 -250
- package/dist/core/voice/DisTubeVoice.js.map +0 -1
- package/dist/core/voice/DisTubeVoiceManager.d.ts +0 -41
- package/dist/core/voice/DisTubeVoiceManager.d.ts.map +0 -1
- package/dist/core/voice/DisTubeVoiceManager.js +0 -67
- package/dist/core/voice/DisTubeVoiceManager.js.map +0 -1
- package/dist/core/voice/index.d.ts +0 -3
- package/dist/core/voice/index.d.ts.map +0 -1
- package/dist/core/voice/index.js +0 -15
- package/dist/core/voice/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/plugin/http.d.ts +0 -10
- package/dist/plugin/http.d.ts.map +0 -1
- package/dist/plugin/http.js +0 -18
- package/dist/plugin/http.js.map +0 -1
- package/dist/plugin/https.d.ts +0 -19
- package/dist/plugin/https.d.ts.map +0 -1
- package/dist/plugin/https.js +0 -47
- package/dist/plugin/https.js.map +0 -1
- package/dist/plugin/index.d.ts +0 -3
- package/dist/plugin/index.d.ts.map +0 -1
- package/dist/plugin/index.js +0 -15
- package/dist/plugin/index.js.map +0 -1
- package/dist/struct/CustomPlugin.d.ts +0 -51
- package/dist/struct/CustomPlugin.d.ts.map +0 -1
- package/dist/struct/CustomPlugin.js +0 -50
- package/dist/struct/CustomPlugin.js.map +0 -1
- package/dist/struct/DisTubeError.d.ts +0 -55
- package/dist/struct/DisTubeError.d.ts.map +0 -1
- package/dist/struct/DisTubeError.js +0 -64
- package/dist/struct/DisTubeError.js.map +0 -1
- package/dist/struct/ExtractorPlugin.d.ts +0 -45
- package/dist/struct/ExtractorPlugin.d.ts.map +0 -1
- package/dist/struct/ExtractorPlugin.js +0 -39
- package/dist/struct/ExtractorPlugin.js.map +0 -1
- package/dist/struct/Playlist.d.ts +0 -54
- package/dist/struct/Playlist.d.ts.map +0 -1
- package/dist/struct/Playlist.js +0 -131
- package/dist/struct/Playlist.js.map +0 -1
- package/dist/struct/Plugin.d.ts +0 -75
- package/dist/struct/Plugin.d.ts.map +0 -1
- package/dist/struct/Plugin.js +0 -99
- package/dist/struct/Plugin.js.map +0 -1
- package/dist/struct/Queue.d.ts +0 -216
- package/dist/struct/Queue.d.ts.map +0 -1
- package/dist/struct/Queue.js +0 -479
- package/dist/struct/Queue.js.map +0 -1
- package/dist/struct/SearchResult.d.ts +0 -27
- package/dist/struct/SearchResult.d.ts.map +0 -1
- package/dist/struct/SearchResult.js +0 -77
- package/dist/struct/SearchResult.js.map +0 -1
- package/dist/struct/Song.d.ts +0 -78
- package/dist/struct/Song.d.ts.map +0 -1
- package/dist/struct/Song.js +0 -259
- package/dist/struct/Song.js.map +0 -1
- package/dist/struct/TaskQueue.d.ts +0 -28
- package/dist/struct/TaskQueue.d.ts.map +0 -1
- package/dist/struct/TaskQueue.js +0 -64
- package/dist/struct/TaskQueue.js.map +0 -1
- package/dist/struct/index.d.ts +0 -10
- package/dist/struct/index.d.ts.map +0 -1
- package/dist/struct/index.js +0 -22
- package/dist/struct/index.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/type.d.ts +0 -169
- package/dist/type.d.ts.map +0 -1
- package/dist/type.js +0 -3
- package/dist/type.js.map +0 -1
- package/dist/util.d.ts +0 -51
- package/dist/util.d.ts.map +0 -1
- package/dist/util.js +0 -225
- package/dist/util.js.map +0 -1
package/dist/struct/Song.d.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { Playlist } from "./Playlist";
|
|
2
|
-
import type ytdl from "@distube/ytdl-core";
|
|
3
|
-
import type { GuildMember } from "discord.js";
|
|
4
|
-
import type { Chapter, OtherSongInfo, RelatedSong, SearchResult } from "..";
|
|
5
|
-
/**
|
|
6
|
-
* Class representing a song.
|
|
7
|
-
*
|
|
8
|
-
* <info>If {@link Song} is added from a YouTube {@link SearchResult} or {@link Playlist},
|
|
9
|
-
* some info will be missing to save your resources. It will be filled when emitting {@link DisTube#playSong} event.
|
|
10
|
-
*
|
|
11
|
-
* Missing info: {@link Song#likes}, {@link Song#dislikes}, {@link Song#streamURL},
|
|
12
|
-
* {@link Song#related}, {@link Song#chapters}, {@link Song#age_restricted}</info>
|
|
13
|
-
* @template T - The type for the metadata (if any) of the song
|
|
14
|
-
*/
|
|
15
|
-
export declare class Song<T = unknown> {
|
|
16
|
-
#private;
|
|
17
|
-
source: string;
|
|
18
|
-
formats?: ytdl.videoFormat[];
|
|
19
|
-
id?: string;
|
|
20
|
-
name?: string;
|
|
21
|
-
isLive: boolean;
|
|
22
|
-
duration: number;
|
|
23
|
-
formattedDuration?: string;
|
|
24
|
-
url: string;
|
|
25
|
-
streamURL?: string;
|
|
26
|
-
thumbnail?: string;
|
|
27
|
-
related: RelatedSong[];
|
|
28
|
-
views: number;
|
|
29
|
-
likes: number;
|
|
30
|
-
dislikes: number;
|
|
31
|
-
uploader: {
|
|
32
|
-
name?: string;
|
|
33
|
-
url?: string;
|
|
34
|
-
};
|
|
35
|
-
age_restricted: boolean;
|
|
36
|
-
chapters: Chapter[];
|
|
37
|
-
reposts: number;
|
|
38
|
-
/**
|
|
39
|
-
* Create a Song
|
|
40
|
-
* @param {ytdl.videoInfo|SearchResult|OtherSongInfo} info Raw info
|
|
41
|
-
* @param {Object} [options] Optional options
|
|
42
|
-
* @param {Discord.GuildMember} [options.member] Requested user
|
|
43
|
-
* @param {string} [options.source="youtube"] Song source
|
|
44
|
-
* @param {T} [options.metadata] Song metadata
|
|
45
|
-
*/
|
|
46
|
-
constructor(info: ytdl.videoInfo | SearchResult | OtherSongInfo | ytdl.relatedVideo | RelatedSong, options?: {
|
|
47
|
-
member?: GuildMember;
|
|
48
|
-
source?: string;
|
|
49
|
-
metadata?: T;
|
|
50
|
-
});
|
|
51
|
-
_patchYouTube(i: ytdl.videoInfo | SearchResult): void;
|
|
52
|
-
/**
|
|
53
|
-
* Patch data from other source
|
|
54
|
-
* @param {OtherSongInfo} info Video info
|
|
55
|
-
* @private
|
|
56
|
-
*/
|
|
57
|
-
_patchOther(info: OtherSongInfo): void;
|
|
58
|
-
/**
|
|
59
|
-
* The playlist added this song
|
|
60
|
-
* @type {Playlist?}
|
|
61
|
-
*/
|
|
62
|
-
get playlist(): Playlist | undefined;
|
|
63
|
-
set playlist(playlist: Playlist | undefined);
|
|
64
|
-
/**
|
|
65
|
-
* User requested.
|
|
66
|
-
* @type {Discord.GuildMember?}
|
|
67
|
-
*/
|
|
68
|
-
get member(): GuildMember | undefined;
|
|
69
|
-
set member(member: GuildMember | undefined);
|
|
70
|
-
/**
|
|
71
|
-
* User requested.
|
|
72
|
-
* @type {Discord.User?}
|
|
73
|
-
*/
|
|
74
|
-
get user(): import("discord.js").User | undefined;
|
|
75
|
-
get metadata(): T;
|
|
76
|
-
set metadata(metadata: T);
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=Song.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Song.d.ts","sourceRoot":"","sources":["../../src/struct/Song.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAE5E;;;;;;;;;GASG;AACH,qBAAa,IAAI,CAAC,CAAC,GAAG,OAAO;;IAC3B,MAAM,EAAG,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IAE7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAG,OAAO,CAAC;IACjB,QAAQ,EAAG,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,GAAG,EAAG,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAG,WAAW,EAAE,CAAC;IACxB,KAAK,EAAG,MAAM,CAAC;IACf,KAAK,EAAG,MAAM,CAAC;IACf,QAAQ,EAAG,MAAM,CAAC;IAClB,QAAQ,EAAG;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,cAAc,EAAG,OAAO,CAAC;IACzB,QAAQ,EAAG,OAAO,EAAE,CAAC;IACrB,OAAO,EAAG,MAAM,CAAC;IAEjB;;;;;;;OAOG;gBAED,IAAI,EAAE,IAAI,CAAC,SAAS,GAAG,YAAY,GAAG,aAAa,GAAG,IAAI,CAAC,YAAY,GAAG,WAAW,EACrF,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,CAAC,CAAC;KACT;IA4BR,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,YAAY;IAsH9C;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,aAAa;IA8B/B;;;OAGG;IACH,IAAI,QAAQ,IAIW,QAAQ,GAAG,SAAS,CAF1C;IAED,IAAI,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAI1C;IAED;;;OAGG;IACH,IAAI,MAAM,IAIS,WAAW,GAAG,SAAS,CAFzC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,EAEzC;IAED;;;OAGG;IACH,IAAI,IAAI,0CAEP;IAED,IAAI,QAAQ,IAIW,CAAC,CAFvB;IAED,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAEvB;CACF"}
|
package/dist/struct/Song.js
DELETED
|
@@ -1,259 +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 __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
8
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
10
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
11
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
|
-
};
|
|
13
|
-
var _Song_metadata, _Song_member, _Song_playlist;
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.Song = void 0;
|
|
16
|
-
const Playlist_1 = require("./Playlist");
|
|
17
|
-
const __1 = require("..");
|
|
18
|
-
/**
|
|
19
|
-
* Class representing a song.
|
|
20
|
-
*
|
|
21
|
-
* <info>If {@link Song} is added from a YouTube {@link SearchResult} or {@link Playlist},
|
|
22
|
-
* some info will be missing to save your resources. It will be filled when emitting {@link DisTube#playSong} event.
|
|
23
|
-
*
|
|
24
|
-
* Missing info: {@link Song#likes}, {@link Song#dislikes}, {@link Song#streamURL},
|
|
25
|
-
* {@link Song#related}, {@link Song#chapters}, {@link Song#age_restricted}</info>
|
|
26
|
-
* @template T - The type for the metadata (if any) of the song
|
|
27
|
-
*/
|
|
28
|
-
class Song {
|
|
29
|
-
/**
|
|
30
|
-
* Create a Song
|
|
31
|
-
* @param {ytdl.videoInfo|SearchResult|OtherSongInfo} info Raw info
|
|
32
|
-
* @param {Object} [options] Optional options
|
|
33
|
-
* @param {Discord.GuildMember} [options.member] Requested user
|
|
34
|
-
* @param {string} [options.source="youtube"] Song source
|
|
35
|
-
* @param {T} [options.metadata] Song metadata
|
|
36
|
-
*/
|
|
37
|
-
constructor(info, options = {}) {
|
|
38
|
-
_Song_metadata.set(this, void 0);
|
|
39
|
-
_Song_member.set(this, void 0);
|
|
40
|
-
_Song_playlist.set(this, void 0);
|
|
41
|
-
const { member, source, metadata } = { source: "youtube", ...options };
|
|
42
|
-
if (typeof source !== "string" ||
|
|
43
|
-
(info.src && typeof info.src !== "string")) {
|
|
44
|
-
throw new __1.DisTubeError("INVALID_TYPE", "string", source, "source");
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* The source of the song
|
|
48
|
-
* @type {string}
|
|
49
|
-
*/
|
|
50
|
-
this.source = (info?.src || source).toLowerCase();
|
|
51
|
-
/**
|
|
52
|
-
* Optional metadata that can be used to identify the song.
|
|
53
|
-
* @type {T}
|
|
54
|
-
*/
|
|
55
|
-
this.metadata = metadata;
|
|
56
|
-
this.member = member;
|
|
57
|
-
if (this.source === "youtube") {
|
|
58
|
-
this._patchYouTube(info);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
this._patchOther(info);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
_patchYouTube(i) {
|
|
65
|
-
// FIXME
|
|
66
|
-
const info = i;
|
|
67
|
-
if (info.full === true) {
|
|
68
|
-
/**
|
|
69
|
-
* Stream formats (Available if the song is from YouTube and playing)
|
|
70
|
-
* @type {ytdl.videoFormat[]?}
|
|
71
|
-
* @private
|
|
72
|
-
*/
|
|
73
|
-
this.formats = info.formats;
|
|
74
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
|
|
75
|
-
const err = require("@distube/ytdl-core/lib/utils").playError(info.player_response, [
|
|
76
|
-
"UNPLAYABLE",
|
|
77
|
-
"LIVE_STREAM_OFFLINE",
|
|
78
|
-
"LOGIN_REQUIRED",
|
|
79
|
-
]);
|
|
80
|
-
if (err)
|
|
81
|
-
throw err;
|
|
82
|
-
if (!info.formats?.length)
|
|
83
|
-
throw new __1.DisTubeError("UNAVAILABLE_VIDEO");
|
|
84
|
-
}
|
|
85
|
-
const details = info.videoDetails || info;
|
|
86
|
-
/**
|
|
87
|
-
* YouTube video id
|
|
88
|
-
* @type {string?}
|
|
89
|
-
*/
|
|
90
|
-
this.id = details.videoId || details.id;
|
|
91
|
-
/**
|
|
92
|
-
* Song name.
|
|
93
|
-
* @type {string?}
|
|
94
|
-
*/
|
|
95
|
-
this.name = details.title || details.name;
|
|
96
|
-
/**
|
|
97
|
-
* Indicates if the video is an active live.
|
|
98
|
-
* @type {boolean}
|
|
99
|
-
*/
|
|
100
|
-
this.isLive = !!details.isLive;
|
|
101
|
-
/**
|
|
102
|
-
* Song duration.
|
|
103
|
-
* @type {number}
|
|
104
|
-
*/
|
|
105
|
-
this.duration = this.isLive ? 0 : (0, __1.toSecond)(details.lengthSeconds || details.length_seconds || details.duration);
|
|
106
|
-
/**
|
|
107
|
-
* Formatted duration string (`hh:mm:ss`, `mm:ss` or `Live`).
|
|
108
|
-
* @type {string?}
|
|
109
|
-
*/
|
|
110
|
-
this.formattedDuration = this.isLive ? "Live" : (0, __1.formatDuration)(this.duration);
|
|
111
|
-
/**
|
|
112
|
-
* Song URL.
|
|
113
|
-
* @type {string}
|
|
114
|
-
*/
|
|
115
|
-
this.url = `https://www.youtube.com/watch?v=${this.id}`;
|
|
116
|
-
/**
|
|
117
|
-
* Stream / Download URL (Available if the song is playing)
|
|
118
|
-
* @type {string?}
|
|
119
|
-
*/
|
|
120
|
-
this.streamURL = undefined;
|
|
121
|
-
/**
|
|
122
|
-
* Song thumbnail.
|
|
123
|
-
* @type {string?}
|
|
124
|
-
*/
|
|
125
|
-
this.thumbnail =
|
|
126
|
-
details.thumbnails?.sort((a, b) => b.width - a.width)?.[0]?.url ||
|
|
127
|
-
details.thumbnail?.url ||
|
|
128
|
-
details.thumbnail;
|
|
129
|
-
/**
|
|
130
|
-
* Related songs (without {@link Song#related} properties)
|
|
131
|
-
* @type {Song[]}
|
|
132
|
-
*/
|
|
133
|
-
this.related = info?.related_videos || details.related || [];
|
|
134
|
-
if (!Array.isArray(this.related))
|
|
135
|
-
throw new __1.DisTubeError("INVALID_TYPE", "Array", this.related, "Song#related");
|
|
136
|
-
this.related = this.related.map((v) => new Song(v, { source: this.source, metadata: this.metadata }));
|
|
137
|
-
/**
|
|
138
|
-
* Song views count
|
|
139
|
-
* @type {number}
|
|
140
|
-
*/
|
|
141
|
-
this.views = (0, __1.parseNumber)(details.viewCount || details.view_count || details.views);
|
|
142
|
-
/**
|
|
143
|
-
* Song like count
|
|
144
|
-
* @type {number}
|
|
145
|
-
*/
|
|
146
|
-
this.likes = (0, __1.parseNumber)(details.likes);
|
|
147
|
-
/**
|
|
148
|
-
* Song dislike count
|
|
149
|
-
* @type {number}
|
|
150
|
-
*/
|
|
151
|
-
this.dislikes = (0, __1.parseNumber)(details.dislikes);
|
|
152
|
-
/**
|
|
153
|
-
* Song uploader
|
|
154
|
-
* @type {Object}
|
|
155
|
-
* @prop {string?} name Uploader name
|
|
156
|
-
* @prop {string?} url Uploader url
|
|
157
|
-
*/
|
|
158
|
-
this.uploader = {
|
|
159
|
-
name: info.uploader?.name || details.author?.name,
|
|
160
|
-
url: info.uploader?.url || details.author?.channel_url || details.author?.url,
|
|
161
|
-
};
|
|
162
|
-
/**
|
|
163
|
-
* Whether or not an age-restricted content
|
|
164
|
-
* @type {boolean}
|
|
165
|
-
*/
|
|
166
|
-
this.age_restricted = !!details.age_restricted;
|
|
167
|
-
/**
|
|
168
|
-
* @typedef {Object} Chapter
|
|
169
|
-
* @prop {string} title Chapter title
|
|
170
|
-
* @prop {number} start_time Chapter start time in seconds
|
|
171
|
-
*/
|
|
172
|
-
/**
|
|
173
|
-
* Chapters information (YouTube only)
|
|
174
|
-
* @type {Chapter[]}
|
|
175
|
-
*/
|
|
176
|
-
this.chapters = details.chapters || [];
|
|
177
|
-
/**
|
|
178
|
-
* Song repost count
|
|
179
|
-
* @type {number}
|
|
180
|
-
*/
|
|
181
|
-
this.reposts = 0;
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Patch data from other source
|
|
185
|
-
* @param {OtherSongInfo} info Video info
|
|
186
|
-
* @private
|
|
187
|
-
*/
|
|
188
|
-
_patchOther(info) {
|
|
189
|
-
this.id = info.id;
|
|
190
|
-
this.name = info.title || info.name;
|
|
191
|
-
this.isLive = Boolean(info.is_live || info.isLive);
|
|
192
|
-
this.duration = this.isLive ? 0 : (0, __1.toSecond)(info._duration_raw || info.duration);
|
|
193
|
-
this.formattedDuration = this.isLive ? "Live" : (0, __1.formatDuration)(this.duration);
|
|
194
|
-
this.url = info.webpage_url || info.url;
|
|
195
|
-
this.thumbnail = info.thumbnail;
|
|
196
|
-
this.related = info.related || [];
|
|
197
|
-
if (!Array.isArray(this.related))
|
|
198
|
-
throw new __1.DisTubeError("INVALID_TYPE", "Array", this.related, "Song#related");
|
|
199
|
-
this.related = this.related.map(i => new Song(i, { source: this.source, metadata: this.metadata }));
|
|
200
|
-
this.views = (0, __1.parseNumber)(info.view_count || info.views);
|
|
201
|
-
this.likes = (0, __1.parseNumber)(info.like_count || info.likes);
|
|
202
|
-
this.dislikes = (0, __1.parseNumber)(info.dislike_count || info.dislikes);
|
|
203
|
-
this.reposts = (0, __1.parseNumber)(info.repost_count || info.reposts);
|
|
204
|
-
if (typeof info.uploader === "string") {
|
|
205
|
-
this.uploader = {
|
|
206
|
-
name: info.uploader,
|
|
207
|
-
url: info.uploader_url,
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
this.uploader = {
|
|
212
|
-
name: info.uploader?.name,
|
|
213
|
-
url: info.uploader?.url,
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
this.age_restricted = info.age_restricted || (!!info.age_limit && (0, __1.parseNumber)(info.age_limit) >= 18);
|
|
217
|
-
this.chapters = info.chapters || [];
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* The playlist added this song
|
|
221
|
-
* @type {Playlist?}
|
|
222
|
-
*/
|
|
223
|
-
get playlist() {
|
|
224
|
-
return __classPrivateFieldGet(this, _Song_playlist, "f");
|
|
225
|
-
}
|
|
226
|
-
set playlist(playlist) {
|
|
227
|
-
if (!(playlist instanceof Playlist_1.Playlist))
|
|
228
|
-
throw new __1.DisTubeError("INVALID_TYPE", "Playlist", playlist, "Song#playlist");
|
|
229
|
-
__classPrivateFieldSet(this, _Song_playlist, playlist, "f");
|
|
230
|
-
this.member = playlist.member;
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* User requested.
|
|
234
|
-
* @type {Discord.GuildMember?}
|
|
235
|
-
*/
|
|
236
|
-
get member() {
|
|
237
|
-
return __classPrivateFieldGet(this, _Song_member, "f");
|
|
238
|
-
}
|
|
239
|
-
set member(member) {
|
|
240
|
-
if ((0, __1.isMemberInstance)(member))
|
|
241
|
-
__classPrivateFieldSet(this, _Song_member, member, "f");
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* User requested.
|
|
245
|
-
* @type {Discord.User?}
|
|
246
|
-
*/
|
|
247
|
-
get user() {
|
|
248
|
-
return this.member?.user;
|
|
249
|
-
}
|
|
250
|
-
get metadata() {
|
|
251
|
-
return __classPrivateFieldGet(this, _Song_metadata, "f");
|
|
252
|
-
}
|
|
253
|
-
set metadata(metadata) {
|
|
254
|
-
__classPrivateFieldSet(this, _Song_metadata, metadata, "f");
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
exports.Song = Song;
|
|
258
|
-
_Song_metadata = new WeakMap(), _Song_member = new WeakMap(), _Song_playlist = new WeakMap();
|
|
259
|
-
//# sourceMappingURL=Song.js.map
|
package/dist/struct/Song.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Song.js","sourceRoot":"","sources":["../../src/struct/Song.ts"],"names":[],"mappings":"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","sourcesContent":["import { Playlist } from \"./Playlist\";\nimport { DisTubeError, formatDuration, isMemberInstance, parseNumber, toSecond } from \"..\";\nimport type ytdl from \"@distube/ytdl-core\";\nimport type { GuildMember } from \"discord.js\";\nimport type { Chapter, OtherSongInfo, RelatedSong, SearchResult } from \"..\";\n\n/**\n * Class representing a song.\n *\n * <info>If {@link Song} is added from a YouTube {@link SearchResult} or {@link Playlist},\n * some info will be missing to save your resources. It will be filled when emitting {@link DisTube#playSong} event.\n *\n * Missing info: {@link Song#likes}, {@link Song#dislikes}, {@link Song#streamURL},\n * {@link Song#related}, {@link Song#chapters}, {@link Song#age_restricted}</info>\n * @template T - The type for the metadata (if any) of the song\n */\nexport class Song<T = unknown> {\n source!: string;\n #metadata!: T;\n formats?: ytdl.videoFormat[];\n #member?: GuildMember;\n id?: string;\n name?: string;\n isLive!: boolean;\n duration!: number;\n formattedDuration?: string;\n url!: string;\n streamURL?: string;\n thumbnail?: string;\n related!: RelatedSong[];\n views!: number;\n likes!: number;\n dislikes!: number;\n uploader!: {\n name?: string;\n url?: string;\n };\n age_restricted!: boolean;\n chapters!: Chapter[];\n reposts!: number;\n #playlist?: Playlist;\n /**\n * Create a Song\n * @param {ytdl.videoInfo|SearchResult|OtherSongInfo} info Raw info\n * @param {Object} [options] Optional options\n * @param {Discord.GuildMember} [options.member] Requested user\n * @param {string} [options.source=\"youtube\"] Song source\n * @param {T} [options.metadata] Song metadata\n */\n constructor(\n info: ytdl.videoInfo | SearchResult | OtherSongInfo | ytdl.relatedVideo | RelatedSong,\n options: {\n member?: GuildMember;\n source?: string;\n metadata?: T;\n } = {},\n ) {\n const { member, source, metadata } = { source: \"youtube\", ...options };\n\n if (\n typeof source !== \"string\" ||\n ((info as OtherSongInfo).src && typeof (info as OtherSongInfo).src !== \"string\")\n ) {\n throw new DisTubeError(\"INVALID_TYPE\", \"string\", source, \"source\");\n }\n /**\n * The source of the song\n * @type {string}\n */\n this.source = ((info as OtherSongInfo)?.src || source).toLowerCase();\n /**\n * Optional metadata that can be used to identify the song.\n * @type {T}\n */\n this.metadata = metadata as T;\n this.member = member;\n if (this.source === \"youtube\") {\n this._patchYouTube(info as ytdl.videoInfo);\n } else {\n this._patchOther(info as OtherSongInfo);\n }\n }\n\n _patchYouTube(i: ytdl.videoInfo | SearchResult) {\n // FIXME\n const info = i as any;\n if (info.full === true) {\n /**\n * Stream formats (Available if the song is from YouTube and playing)\n * @type {ytdl.videoFormat[]?}\n * @private\n */\n this.formats = info.formats;\n // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports\n const err = require(\"@distube/ytdl-core/lib/utils\").playError(info.player_response, [\n \"UNPLAYABLE\",\n \"LIVE_STREAM_OFFLINE\",\n \"LOGIN_REQUIRED\",\n ]);\n if (err) throw err;\n\n if (!info.formats?.length) throw new DisTubeError(\"UNAVAILABLE_VIDEO\");\n }\n const details = info.videoDetails || info;\n /**\n * YouTube video id\n * @type {string?}\n */\n this.id = details.videoId || details.id;\n /**\n * Song name.\n * @type {string?}\n */\n this.name = details.title || details.name;\n /**\n * Indicates if the video is an active live.\n * @type {boolean}\n */\n this.isLive = !!details.isLive;\n /**\n * Song duration.\n * @type {number}\n */\n this.duration = this.isLive ? 0 : toSecond(details.lengthSeconds || details.length_seconds || details.duration);\n /**\n * Formatted duration string (`hh:mm:ss`, `mm:ss` or `Live`).\n * @type {string?}\n */\n this.formattedDuration = this.isLive ? \"Live\" : formatDuration(this.duration);\n /**\n * Song URL.\n * @type {string}\n */\n this.url = `https://www.youtube.com/watch?v=${this.id}`;\n /**\n * Stream / Download URL (Available if the song is playing)\n * @type {string?}\n */\n this.streamURL = undefined;\n /**\n * Song thumbnail.\n * @type {string?}\n */\n this.thumbnail =\n details.thumbnails?.sort((a: any, b: any) => b.width - a.width)?.[0]?.url ||\n details.thumbnail?.url ||\n details.thumbnail;\n /**\n * Related songs (without {@link Song#related} properties)\n * @type {Song[]}\n */\n this.related = info?.related_videos || details.related || [];\n if (!Array.isArray(this.related)) throw new DisTubeError(\"INVALID_TYPE\", \"Array\", this.related, \"Song#related\");\n this.related = this.related.map((v: any) => new Song(v, { source: this.source, metadata: this.metadata }));\n /**\n * Song views count\n * @type {number}\n */\n this.views = parseNumber(details.viewCount || details.view_count || details.views);\n /**\n * Song like count\n * @type {number}\n */\n this.likes = parseNumber(details.likes);\n /**\n * Song dislike count\n * @type {number}\n */\n this.dislikes = parseNumber(details.dislikes);\n /**\n * Song uploader\n * @type {Object}\n * @prop {string?} name Uploader name\n * @prop {string?} url Uploader url\n */\n this.uploader = {\n name: info.uploader?.name || details.author?.name,\n url: info.uploader?.url || details.author?.channel_url || details.author?.url,\n };\n /**\n * Whether or not an age-restricted content\n * @type {boolean}\n */\n this.age_restricted = !!details.age_restricted;\n /**\n * @typedef {Object} Chapter\n * @prop {string} title Chapter title\n * @prop {number} start_time Chapter start time in seconds\n */\n /**\n * Chapters information (YouTube only)\n * @type {Chapter[]}\n */\n this.chapters = details.chapters || [];\n /**\n * Song repost count\n * @type {number}\n */\n this.reposts = 0;\n }\n\n /**\n * Patch data from other source\n * @param {OtherSongInfo} info Video info\n * @private\n */\n _patchOther(info: OtherSongInfo) {\n this.id = info.id;\n this.name = info.title || info.name;\n this.isLive = Boolean(info.is_live || info.isLive);\n this.duration = this.isLive ? 0 : toSecond(info._duration_raw || info.duration);\n this.formattedDuration = this.isLive ? \"Live\" : formatDuration(this.duration);\n this.url = info.webpage_url || info.url;\n this.thumbnail = info.thumbnail;\n this.related = info.related || [];\n if (!Array.isArray(this.related)) throw new DisTubeError(\"INVALID_TYPE\", \"Array\", this.related, \"Song#related\");\n this.related = this.related.map(i => new Song(i, { source: this.source, metadata: this.metadata }));\n this.views = parseNumber(info.view_count || info.views);\n this.likes = parseNumber(info.like_count || info.likes);\n this.dislikes = parseNumber(info.dislike_count || info.dislikes);\n this.reposts = parseNumber(info.repost_count || info.reposts);\n if (typeof info.uploader === \"string\") {\n this.uploader = {\n name: info.uploader,\n url: info.uploader_url,\n };\n } else {\n this.uploader = {\n name: info.uploader?.name,\n url: info.uploader?.url,\n };\n }\n this.age_restricted = info.age_restricted || (!!info.age_limit && parseNumber(info.age_limit) >= 18);\n this.chapters = info.chapters || [];\n }\n\n /**\n * The playlist added this song\n * @type {Playlist?}\n */\n get playlist() {\n return this.#playlist;\n }\n\n set playlist(playlist: Playlist | undefined) {\n if (!(playlist instanceof Playlist)) throw new DisTubeError(\"INVALID_TYPE\", \"Playlist\", playlist, \"Song#playlist\");\n this.#playlist = playlist;\n this.member = playlist.member;\n }\n\n /**\n * User requested.\n * @type {Discord.GuildMember?}\n */\n get member() {\n return this.#member;\n }\n\n set member(member: GuildMember | undefined) {\n if (isMemberInstance(member)) this.#member = member;\n }\n\n /**\n * User requested.\n * @type {Discord.User?}\n */\n get user() {\n return this.member?.user;\n }\n\n get metadata() {\n return this.#metadata;\n }\n\n set metadata(metadata: T) {\n this.#metadata = metadata;\n }\n}\n"]}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Task queuing system
|
|
3
|
-
* @private
|
|
4
|
-
*/
|
|
5
|
-
export declare class TaskQueue {
|
|
6
|
-
#private;
|
|
7
|
-
/**
|
|
8
|
-
* Waits for last task finished and queues a new task
|
|
9
|
-
* @param {boolean} [resolveInfo=false] Whether the task is a resolving info task
|
|
10
|
-
* @returns {Promise<void>}
|
|
11
|
-
*/
|
|
12
|
-
queuing(resolveInfo?: boolean): Promise<void>;
|
|
13
|
-
/**
|
|
14
|
-
* Removes the finished task and processes the next task
|
|
15
|
-
*/
|
|
16
|
-
resolve(): void;
|
|
17
|
-
/**
|
|
18
|
-
* The remaining number of tasks
|
|
19
|
-
* @type {number}
|
|
20
|
-
*/
|
|
21
|
-
get remaining(): number;
|
|
22
|
-
/**
|
|
23
|
-
* Whether or not having a resolving info task
|
|
24
|
-
* @type {boolean}
|
|
25
|
-
*/
|
|
26
|
-
get hasResolveTask(): boolean;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=TaskQueue.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TaskQueue.d.ts","sourceRoot":"","sources":["../../src/struct/TaskQueue.ts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,qBAAa,SAAS;;IAQpB;;;;OAIG;IACI,OAAO,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlD;;OAEG;IACI,OAAO,IAAI,IAAI;IAItB;;;OAGG;IACH,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED;;;OAGG;IACH,IAAW,cAAc,IAAI,OAAO,CAEnC;CACF"}
|
package/dist/struct/TaskQueue.js
DELETED
|
@@ -1,64 +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 _TaskQueue_tasks;
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.TaskQueue = void 0;
|
|
10
|
-
class Task {
|
|
11
|
-
constructor(resolveInfo) {
|
|
12
|
-
this.resolveInfo = resolveInfo;
|
|
13
|
-
this.promise = new Promise(res => {
|
|
14
|
-
this.resolve = res;
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Task queuing system
|
|
20
|
-
* @private
|
|
21
|
-
*/
|
|
22
|
-
class TaskQueue {
|
|
23
|
-
constructor() {
|
|
24
|
-
/**
|
|
25
|
-
* The task array
|
|
26
|
-
* @type {Task[]}
|
|
27
|
-
* @private
|
|
28
|
-
*/
|
|
29
|
-
_TaskQueue_tasks.set(this, []);
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Waits for last task finished and queues a new task
|
|
33
|
-
* @param {boolean} [resolveInfo=false] Whether the task is a resolving info task
|
|
34
|
-
* @returns {Promise<void>}
|
|
35
|
-
*/
|
|
36
|
-
queuing(resolveInfo = false) {
|
|
37
|
-
const next = this.remaining ? __classPrivateFieldGet(this, _TaskQueue_tasks, "f")[__classPrivateFieldGet(this, _TaskQueue_tasks, "f").length - 1].promise : Promise.resolve();
|
|
38
|
-
__classPrivateFieldGet(this, _TaskQueue_tasks, "f").push(new Task(resolveInfo));
|
|
39
|
-
return next;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Removes the finished task and processes the next task
|
|
43
|
-
*/
|
|
44
|
-
resolve() {
|
|
45
|
-
__classPrivateFieldGet(this, _TaskQueue_tasks, "f").shift()?.resolve();
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* The remaining number of tasks
|
|
49
|
-
* @type {number}
|
|
50
|
-
*/
|
|
51
|
-
get remaining() {
|
|
52
|
-
return __classPrivateFieldGet(this, _TaskQueue_tasks, "f").length;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Whether or not having a resolving info task
|
|
56
|
-
* @type {boolean}
|
|
57
|
-
*/
|
|
58
|
-
get hasResolveTask() {
|
|
59
|
-
return !!__classPrivateFieldGet(this, _TaskQueue_tasks, "f").find(t => t.resolveInfo);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
exports.TaskQueue = TaskQueue;
|
|
63
|
-
_TaskQueue_tasks = new WeakMap();
|
|
64
|
-
//# sourceMappingURL=TaskQueue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TaskQueue.js","sourceRoot":"","sources":["../../src/struct/TaskQueue.ts"],"names":[],"mappings":";;;;;;;;;AAAA,MAAM,IAAI;IAIR,YAAY,WAAoB;QAC9B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAO,GAAG,CAAC,EAAE;YACrC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;GAGG;AACH,MAAa,SAAS;IAAtB;QACE;;;;WAIG;QACH,2BAAiB,EAAE,EAAC;IAmCtB,CAAC;IAjCC;;;;OAIG;IACI,OAAO,CAAC,WAAW,GAAG,KAAK;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,uBAAA,IAAI,wBAAO,CAAC,uBAAA,IAAI,wBAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC9F,uBAAA,IAAI,wBAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,uBAAA,IAAI,wBAAO,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS;QAClB,OAAO,uBAAA,IAAI,wBAAO,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc;QACvB,OAAO,CAAC,CAAC,uBAAA,IAAI,wBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;CACF;AAzCD,8BAyCC","sourcesContent":["class Task {\n resolve!: () => void;\n promise: Promise<void>;\n resolveInfo: boolean;\n constructor(resolveInfo: boolean) {\n this.resolveInfo = resolveInfo;\n this.promise = new Promise<void>(res => {\n this.resolve = res;\n });\n }\n}\n\n/**\n * Task queuing system\n * @private\n */\nexport class TaskQueue {\n /**\n * The task array\n * @type {Task[]}\n * @private\n */\n #tasks: Task[] = [];\n\n /**\n * Waits for last task finished and queues a new task\n * @param {boolean} [resolveInfo=false] Whether the task is a resolving info task\n * @returns {Promise<void>}\n */\n public queuing(resolveInfo = false): Promise<void> {\n const next = this.remaining ? this.#tasks[this.#tasks.length - 1].promise : Promise.resolve();\n this.#tasks.push(new Task(resolveInfo));\n return next;\n }\n\n /**\n * Removes the finished task and processes the next task\n */\n public resolve(): void {\n this.#tasks.shift()?.resolve();\n }\n\n /**\n * The remaining number of tasks\n * @type {number}\n */\n public get remaining(): number {\n return this.#tasks.length;\n }\n\n /**\n * Whether or not having a resolving info task\n * @type {boolean}\n */\n public get hasResolveTask(): boolean {\n return !!this.#tasks.find(t => t.resolveInfo);\n }\n}\n"]}
|
package/dist/struct/index.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export * from "./DisTubeError";
|
|
2
|
-
export * from "./TaskQueue";
|
|
3
|
-
export * from "./Playlist";
|
|
4
|
-
export * from "./SearchResult";
|
|
5
|
-
export * from "./Song";
|
|
6
|
-
export * from "./Queue";
|
|
7
|
-
export * from "./Plugin";
|
|
8
|
-
export * from "./CustomPlugin";
|
|
9
|
-
export * from "./ExtractorPlugin";
|
|
10
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/struct/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC"}
|
package/dist/struct/index.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
-
};
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
__exportStar(require("./DisTubeError"), exports);
|
|
14
|
-
__exportStar(require("./TaskQueue"), exports);
|
|
15
|
-
__exportStar(require("./Playlist"), exports);
|
|
16
|
-
__exportStar(require("./SearchResult"), exports);
|
|
17
|
-
__exportStar(require("./Song"), exports);
|
|
18
|
-
__exportStar(require("./Queue"), exports);
|
|
19
|
-
__exportStar(require("./Plugin"), exports);
|
|
20
|
-
__exportStar(require("./CustomPlugin"), exports);
|
|
21
|
-
__exportStar(require("./ExtractorPlugin"), exports);
|
|
22
|
-
//# sourceMappingURL=index.js.map
|
package/dist/struct/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/struct/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAA+B;AAC/B,8CAA4B;AAC5B,6CAA2B;AAC3B,iDAA+B;AAC/B,yCAAuB;AACvB,0CAAwB;AACxB,2CAAyB;AACzB,iDAA+B;AAC/B,oDAAkC","sourcesContent":["export * from \"./DisTubeError\";\nexport * from \"./TaskQueue\";\nexport * from \"./Playlist\";\nexport * from \"./SearchResult\";\nexport * from \"./Song\";\nexport * from \"./Queue\";\nexport * from \"./Plugin\";\nexport * from \"./CustomPlugin\";\nexport * from \"./ExtractorPlugin\";\n"]}
|