disvoice 1.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.
Files changed (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +410 -0
  3. package/dist/MusicPlayer.d.ts +81 -0
  4. package/dist/MusicPlayer.d.ts.map +1 -0
  5. package/dist/MusicPlayer.js +258 -0
  6. package/dist/MusicPlayer.js.map +1 -0
  7. package/dist/Queue.d.ts +69 -0
  8. package/dist/Queue.d.ts.map +1 -0
  9. package/dist/Queue.js +149 -0
  10. package/dist/Queue.js.map +1 -0
  11. package/dist/index.d.ts +9 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +34 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/sources/BaseSource.d.ts +22 -0
  16. package/dist/sources/BaseSource.d.ts.map +1 -0
  17. package/dist/sources/BaseSource.js +19 -0
  18. package/dist/sources/BaseSource.js.map +1 -0
  19. package/dist/sources/SoundCloudSource.d.ts +10 -0
  20. package/dist/sources/SoundCloudSource.d.ts.map +1 -0
  21. package/dist/sources/SoundCloudSource.js +124 -0
  22. package/dist/sources/SoundCloudSource.js.map +1 -0
  23. package/dist/sources/SpotifySource.d.ts +12 -0
  24. package/dist/sources/SpotifySource.d.ts.map +1 -0
  25. package/dist/sources/SpotifySource.js +129 -0
  26. package/dist/sources/SpotifySource.js.map +1 -0
  27. package/dist/sources/YouTubeSource.d.ts +14 -0
  28. package/dist/sources/YouTubeSource.d.ts.map +1 -0
  29. package/dist/sources/YouTubeSource.js +174 -0
  30. package/dist/sources/YouTubeSource.js.map +1 -0
  31. package/dist/types/index.d.ts +47 -0
  32. package/dist/types/index.d.ts.map +1 -0
  33. package/dist/types/index.js +11 -0
  34. package/dist/types/index.js.map +1 -0
  35. package/dist/utils/TimeFormat.d.ts +3 -0
  36. package/dist/utils/TimeFormat.d.ts.map +1 -0
  37. package/dist/utils/TimeFormat.js +29 -0
  38. package/dist/utils/TimeFormat.js.map +1 -0
  39. package/package.json +57 -0
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SoundCloudSource = void 0;
37
+ // @ts-nocheck
38
+ const BaseSource_1 = require("./BaseSource");
39
+ const types_1 = require("../types");
40
+ const playdl = __importStar(require("play-dl"));
41
+ class SoundCloudSource extends BaseSource_1.BaseSource {
42
+ constructor() {
43
+ super(...arguments);
44
+ this.name = 'SoundCloud';
45
+ }
46
+ validate(query) {
47
+ if (!this.isURL(query))
48
+ return false;
49
+ return /^(https?:\/\/)?(www\.)?(soundcloud\.com|snd\.sc)\/.+$/.test(query);
50
+ }
51
+ async search(query, requester) {
52
+ try {
53
+ if (!this.validate(query)) {
54
+ // Search by keyword
55
+ const searched = await playdl.search(query, { source: { soundcloud: 'tracks' }, limit: 5 });
56
+ const tracks = searched.map((result) => ({
57
+ title: result.name || result.title || 'Unknown',
58
+ url: result.url,
59
+ duration: result.durationInSec || 0,
60
+ thumbnail: result.thumbnail?.url,
61
+ requester,
62
+ source: types_1.SourceType.SoundCloud,
63
+ author: result.user?.name || result.artists?.[0]?.name
64
+ }));
65
+ return { tracks };
66
+ }
67
+ // Direct URL
68
+ const type = await playdl.validate(query);
69
+ if (type === 'so_track') {
70
+ const info = await playdl.soundcloud(query);
71
+ const track = {
72
+ title: info.name || 'Unknown',
73
+ url: info.url,
74
+ duration: info.durationInSec || 0,
75
+ thumbnail: info.thumbnail?.url,
76
+ requester,
77
+ source: types_1.SourceType.SoundCloud,
78
+ author: info.user?.name
79
+ };
80
+ return { tracks: [track] };
81
+ }
82
+ else if (type === 'so_playlist') {
83
+ const playlist = await playdl.soundcloud(query);
84
+ if (!playlist.tracks || playlist.tracks.length === 0) {
85
+ return { tracks: [] };
86
+ }
87
+ const tracks = playlist.tracks.map((track) => ({
88
+ title: track.name || 'Unknown',
89
+ url: track.url,
90
+ duration: track.durationInSec || 0,
91
+ thumbnail: track.thumbnail?.url,
92
+ requester,
93
+ source: types_1.SourceType.SoundCloud,
94
+ author: track.user?.name
95
+ }));
96
+ return {
97
+ tracks,
98
+ playlist: {
99
+ name: playlist.name || 'Unknown Playlist',
100
+ url: query,
101
+ tracks
102
+ }
103
+ };
104
+ }
105
+ return { tracks: [] };
106
+ }
107
+ catch (error) {
108
+ console.error('SoundCloud search error:', error);
109
+ return { tracks: [] };
110
+ }
111
+ }
112
+ async getStream(track) {
113
+ try {
114
+ const stream = await playdl.stream(track.url);
115
+ return stream.stream;
116
+ }
117
+ catch (error) {
118
+ console.error('SoundCloud stream error:', error);
119
+ throw new Error('Failed to get SoundCloud stream');
120
+ }
121
+ }
122
+ }
123
+ exports.SoundCloudSource = SoundCloudSource;
124
+ //# sourceMappingURL=SoundCloudSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SoundCloudSource.js","sourceRoot":"","sources":["../../src/sources/SoundCloudSource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { BaseSource } from './BaseSource';
2
+ import { Track, SearchResult } from '../types';
3
+ import { User } from 'discord.js';
4
+ export declare class SpotifySource extends BaseSource {
5
+ name: string;
6
+ validate(query: string): boolean;
7
+ search(query: string, requester: User): Promise<SearchResult>;
8
+ private spotifyToYouTube;
9
+ private searchYouTube;
10
+ getStream(track: Track): Promise<NodeJS.ReadableStream>;
11
+ }
12
+ //# sourceMappingURL=SpotifySource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpotifySource.d.ts","sourceRoot":"","sources":["../../src/sources/SpotifySource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,YAAY,EAAc,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAUlC,qBAAa,aAAc,SAAQ,UAAU;IAC3C,IAAI,SAAa;IAEjB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAK1B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;YA+CrD,gBAAgB;YAMhB,aAAa;IA+BrB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;CA+B9D"}
@@ -0,0 +1,129 @@
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.SpotifySource = void 0;
7
+ // @ts-nocheck
8
+ const BaseSource_1 = require("./BaseSource");
9
+ const types_1 = require("../types");
10
+ const spotify_url_info_1 = __importDefault(require("spotify-url-info"));
11
+ const child_process_1 = require("child_process");
12
+ const util_1 = require("util");
13
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
14
+ // Initialize spotify-url-info with global fetch
15
+ const { getData, getTracks } = (0, spotify_url_info_1.default)(fetch);
16
+ class SpotifySource extends BaseSource_1.BaseSource {
17
+ constructor() {
18
+ super(...arguments);
19
+ this.name = 'Spotify';
20
+ }
21
+ validate(query) {
22
+ if (!this.isURL(query))
23
+ return false;
24
+ return /^(https?:\/\/)?(open\.)?spotify\.com\/(track|album|playlist)\/.+$/.test(query);
25
+ }
26
+ async search(query, requester) {
27
+ try {
28
+ if (!this.validate(query)) {
29
+ return { tracks: [] };
30
+ }
31
+ // First try to get basic data
32
+ const data = await getData(query);
33
+ // Single track
34
+ if (data.type === 'track') {
35
+ const track = await this.spotifyToYouTube(data, requester);
36
+ return { tracks: track ? [track] : [] };
37
+ }
38
+ // Playlist or Album
39
+ if (data.type === 'playlist' || data.type === 'album') {
40
+ // Use getTracks for lists as it handles pagination better
41
+ const spotifyTracks = await getTracks(query);
42
+ const tracks = [];
43
+ // Limit to 50 tracks to ensure performance
44
+ const limitedTracks = spotifyTracks.slice(0, 50);
45
+ for (const item of limitedTracks) {
46
+ const searchQuery = `${item.name} ${item.artists?.[0]?.name || ''}`;
47
+ const track = await this.searchYouTube(searchQuery, requester, item);
48
+ if (track)
49
+ tracks.push(track);
50
+ }
51
+ return {
52
+ tracks,
53
+ playlist: {
54
+ name: data.name || 'Spotify Playlist',
55
+ url: query,
56
+ tracks
57
+ }
58
+ };
59
+ }
60
+ return { tracks: [] };
61
+ }
62
+ catch (error) {
63
+ console.error('Spotify search error:', error);
64
+ return { tracks: [] };
65
+ }
66
+ }
67
+ async spotifyToYouTube(spotifyData, requester) {
68
+ const artistName = spotifyData.artists?.[0]?.name || '';
69
+ const searchQuery = `${spotifyData.name} ${artistName}`;
70
+ return this.searchYouTube(searchQuery, requester, spotifyData);
71
+ }
72
+ async searchYouTube(query, requester, spotifyData) {
73
+ try {
74
+ // Use yt-dlp directly for search - much more reliable than play-dl
75
+ // ytsearch1: returns the first result
76
+ const safeQuery = query.replace(/"/g, ''); // Remove quotes to prevent command injection issues
77
+ const { stdout } = await execAsync(`yt-dlp --dump-json --flat-playlist --no-playlist --no-warnings "ytsearch1:${safeQuery}"`);
78
+ const lines = stdout.trim().split('\n').filter(Boolean);
79
+ if (lines.length === 0)
80
+ return null;
81
+ const video = JSON.parse(lines[0]);
82
+ const videoUrl = video.webpage_url || `https://www.youtube.com/watch?v=${video.id}`;
83
+ // Prefer Spotify metadata but fall back to YouTube metadata
84
+ return {
85
+ title: spotifyData.name || video.title,
86
+ url: videoUrl,
87
+ duration: spotifyData.duration_ms ? Math.floor(spotifyData.duration_ms / 1000) : (video.duration || 0),
88
+ thumbnail: spotifyData.coverArt?.sources?.[0]?.url || spotifyData.album?.images?.[0]?.url || video.thumbnail,
89
+ requester,
90
+ source: types_1.SourceType.Spotify,
91
+ author: spotifyData.artists?.map((a) => a.name).join(', ') || video.uploader
92
+ };
93
+ }
94
+ catch (error) {
95
+ console.error(`YouTube search error for query "${query}":`, error.message);
96
+ return null;
97
+ }
98
+ }
99
+ async getStream(track) {
100
+ return new Promise((resolve, reject) => {
101
+ // Use yt-dlp to stream directly
102
+ const ytdlp = (0, child_process_1.spawn)('yt-dlp', [
103
+ '-f', 'bestaudio',
104
+ '-o', '-',
105
+ '--no-playlist',
106
+ '--quiet',
107
+ '--no-warnings',
108
+ '--extractor-args', 'youtube:player_client=android_vr', // Use android_vr client to avoid PO Token issues
109
+ track.url
110
+ ]);
111
+ ytdlp.on('error', (error) => {
112
+ console.error('yt-dlp spawn error:', error);
113
+ reject(new Error('Failed to spawn yt-dlp'));
114
+ });
115
+ // Wait for the stream to be readable
116
+ ytdlp.stdout.once('readable', () => {
117
+ resolve(ytdlp.stdout);
118
+ });
119
+ ytdlp.on('close', (code) => {
120
+ if (code !== 0 && code !== null) {
121
+ // It might have closed after finishing stream, so only log if it was an error exit
122
+ // console.error(`yt-dlp exited with code ${code}`);
123
+ }
124
+ });
125
+ });
126
+ }
127
+ }
128
+ exports.SpotifySource = SpotifySource;
129
+ //# sourceMappingURL=SpotifySource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpotifySource.js","sourceRoot":"","sources":["../../src/sources/SpotifySource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { BaseSource } from "./BaseSource";
2
+ import { Track, SearchResult } from "../types";
3
+ import { User } from "discord.js";
4
+ export declare class YouTubeSource extends BaseSource {
5
+ name: string;
6
+ validate(query: string): boolean;
7
+ private extractVideoId;
8
+ search(query: string, requester: User): Promise<SearchResult>;
9
+ private getVideoInfo;
10
+ private searchVideos;
11
+ getStream(track: Track): Promise<NodeJS.ReadableStream>;
12
+ private parseDuration;
13
+ }
14
+ //# sourceMappingURL=YouTubeSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YouTubeSource.d.ts","sourceRoot":"","sources":["../../src/sources/YouTubeSource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,YAAY,EAAc,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOlC,qBAAa,aAAc,SAAQ,UAAU;IAC3C,IAAI,SAAa;IAEjB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAahC,OAAO,CAAC,cAAc;IAchB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;YAqDrD,YAAY;YAmBZ,YAAY;IAuBpB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;IA+C7D,OAAO,CAAC,aAAa;CAStB"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.YouTubeSource = void 0;
4
+ // @ts-nocheck
5
+ const BaseSource_1 = require("./BaseSource");
6
+ const types_1 = require("../types");
7
+ const child_process_1 = require("child_process");
8
+ const util_1 = require("util");
9
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
10
+ class YouTubeSource extends BaseSource_1.BaseSource {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.name = "YouTube";
14
+ }
15
+ validate(query) {
16
+ if (!this.isURL(query))
17
+ return false;
18
+ const urlPatterns = [
19
+ /^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.be)\/.+$/,
20
+ /^(https?:\/\/)?(www\.)?youtube\.com\/watch\?v=.+$/,
21
+ /^(https?:\/\/)?(www\.)?youtu\.be\/.+$/,
22
+ /^(https?:\/\/)?(www\.)?youtube\.com\/playlist\?list=.+$/,
23
+ ];
24
+ return urlPatterns.some((pattern) => pattern.test(query));
25
+ }
26
+ extractVideoId(url) {
27
+ const patterns = [
28
+ /(?:youtube\.com\/watch\?v=|youtu\.be\/)([a-zA-Z0-9_-]{11})/,
29
+ /youtube\.com\/embed\/([a-zA-Z0-9_-]{11})/,
30
+ /youtube\.com\/v\/([a-zA-Z0-9_-]{11})/,
31
+ ];
32
+ for (const pattern of patterns) {
33
+ const match = url.match(pattern);
34
+ if (match)
35
+ return match[1];
36
+ }
37
+ return null;
38
+ }
39
+ async search(query, requester) {
40
+ try {
41
+ // If it's a URL, get info directly
42
+ if (this.validate(query)) {
43
+ const videoId = this.extractVideoId(query);
44
+ if (videoId) {
45
+ try {
46
+ const info = await this.getVideoInfo(`https://www.youtube.com/watch?v=${videoId}`);
47
+ if (info) {
48
+ const track = {
49
+ title: info.title || "Unknown",
50
+ url: `https://www.youtube.com/watch?v=${videoId}`,
51
+ duration: info.duration || 0,
52
+ thumbnail: info.thumbnail,
53
+ requester,
54
+ source: types_1.SourceType.YouTube,
55
+ author: info.channel || "Unknown",
56
+ };
57
+ return { tracks: [track] };
58
+ }
59
+ }
60
+ catch (e) {
61
+ console.error("Error getting video info:", e);
62
+ }
63
+ }
64
+ }
65
+ // Search for the query using yt-dlp
66
+ const searchResults = await this.searchVideos(query);
67
+ if (searchResults.length === 0) {
68
+ return { tracks: [] };
69
+ }
70
+ const tracks = searchResults.map((video) => ({
71
+ title: video.title || "Unknown",
72
+ url: video.url,
73
+ duration: video.duration || 0,
74
+ thumbnail: video.thumbnail,
75
+ requester,
76
+ source: types_1.SourceType.YouTube,
77
+ author: video.channel || "Unknown",
78
+ }));
79
+ return { tracks };
80
+ }
81
+ catch (error) {
82
+ console.error("YouTube search error:", error);
83
+ return { tracks: [] };
84
+ }
85
+ }
86
+ async getVideoInfo(url) {
87
+ try {
88
+ const { stdout } = await execAsync(`yt-dlp --dump-json --no-playlist "${url}"`, { maxBuffer: 10 * 1024 * 1024 });
89
+ const info = JSON.parse(stdout);
90
+ return {
91
+ title: info.title,
92
+ duration: info.duration,
93
+ thumbnail: info.thumbnail,
94
+ channel: info.channel || info.uploader,
95
+ };
96
+ }
97
+ catch (error) {
98
+ console.error("yt-dlp info error:", error);
99
+ return null;
100
+ }
101
+ }
102
+ async searchVideos(query) {
103
+ try {
104
+ const { stdout } = await execAsync(`yt-dlp --dump-json --flat-playlist --no-playlist --extractor-args "youtube:player_client=android_vr" "ytsearch5:${query}"`, { maxBuffer: 10 * 1024 * 1024 });
105
+ const lines = stdout.trim().split("\n").filter(Boolean);
106
+ return lines.map((line) => {
107
+ const info = JSON.parse(line);
108
+ return {
109
+ title: info.title,
110
+ url: info.url || `https://www.youtube.com/watch?v=${info.id}`,
111
+ duration: info.duration,
112
+ thumbnail: info.thumbnail || info.thumbnails?.[0]?.url,
113
+ channel: info.channel || info.uploader,
114
+ };
115
+ });
116
+ }
117
+ catch (error) {
118
+ console.error("yt-dlp search error:", error);
119
+ return [];
120
+ }
121
+ }
122
+ async getStream(track) {
123
+ if (!track.url) {
124
+ throw new Error("Track URL is undefined");
125
+ }
126
+ return new Promise((resolve, reject) => {
127
+ // Use android_vr client which doesn't require PO Token
128
+ const ytdlp = (0, child_process_1.spawn)("yt-dlp", [
129
+ "-f",
130
+ "bestaudio",
131
+ "-o",
132
+ "-",
133
+ "--no-playlist",
134
+ "--quiet",
135
+ "--extractor-args",
136
+ "youtube:player_client=android_vr",
137
+ track.url,
138
+ ]);
139
+ ytdlp.on("error", (error) => {
140
+ console.error("yt-dlp spawn error:", error);
141
+ reject(new Error("Failed to spawn yt-dlp"));
142
+ });
143
+ ytdlp.stderr.on("data", (data) => {
144
+ console.error("yt-dlp stderr:", data.toString());
145
+ });
146
+ ytdlp.stdout.once("readable", () => {
147
+ resolve(ytdlp.stdout);
148
+ });
149
+ ytdlp.on("close", (code) => {
150
+ if (code !== 0 && code !== null) {
151
+ console.error(`yt-dlp exited with code ${code}`);
152
+ }
153
+ });
154
+ setTimeout(() => {
155
+ if (!ytdlp.stdout.readable) {
156
+ ytdlp.kill();
157
+ reject(new Error("yt-dlp timed out"));
158
+ }
159
+ }, 30000);
160
+ });
161
+ }
162
+ parseDuration(duration) {
163
+ const parts = duration.split(":").map(Number);
164
+ if (parts.length === 3) {
165
+ return parts[0] * 3600 + parts[1] * 60 + parts[2];
166
+ }
167
+ else if (parts.length === 2) {
168
+ return parts[0] * 60 + parts[1];
169
+ }
170
+ return parts[0] || 0;
171
+ }
172
+ }
173
+ exports.YouTubeSource = YouTubeSource;
174
+ //# sourceMappingURL=YouTubeSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YouTubeSource.js","sourceRoot":"","sources":["../../src/sources/YouTubeSource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { User } from 'discord.js';
2
+ export declare enum SourceType {
3
+ YouTube = "youtube",
4
+ Spotify = "spotify",
5
+ SoundCloud = "soundcloud",
6
+ Direct = "direct"
7
+ }
8
+ export interface Track {
9
+ title: string;
10
+ url: string;
11
+ duration: number;
12
+ thumbnail?: string;
13
+ requester: User;
14
+ source: SourceType;
15
+ author?: string;
16
+ }
17
+ export interface QueueOptions {
18
+ loop?: boolean;
19
+ loopQueue?: boolean;
20
+ shuffle?: boolean;
21
+ autoplay?: boolean;
22
+ }
23
+ export interface PlayerOptions {
24
+ leaveOnEmpty?: boolean;
25
+ leaveOnEmptyCooldown?: number;
26
+ leaveOnEnd?: boolean;
27
+ volume?: number;
28
+ }
29
+ export interface PlayerEvents {
30
+ trackStart: (track: Track) => void;
31
+ trackEnd: (track: Track) => void;
32
+ queueEnd: () => void;
33
+ error: (error: Error, track?: Track) => void;
34
+ volumeChange: (oldVolume: number, newVolume: number) => void;
35
+ }
36
+ export interface SearchResult {
37
+ tracks: Track[];
38
+ playlist?: {
39
+ name: string;
40
+ url: string;
41
+ tracks: Track[];
42
+ };
43
+ }
44
+ declare module 'play-dl';
45
+ declare module 'ytsr';
46
+ declare module 'spotify-url-info';
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,oBAAY,UAAU;IACpB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC7C,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,KAAK,EAAE,CAAC;KACjB,CAAC;CACH;AAGD,OAAO,QAAQ,SAAS,CAAC;AAEzB,OAAO,QAAQ,MAAM,CAAC;AAEtB,OAAO,QAAQ,kBAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SourceType = void 0;
4
+ var SourceType;
5
+ (function (SourceType) {
6
+ SourceType["YouTube"] = "youtube";
7
+ SourceType["Spotify"] = "spotify";
8
+ SourceType["SoundCloud"] = "soundcloud";
9
+ SourceType["Direct"] = "direct";
10
+ })(SourceType || (exports.SourceType = SourceType = {}));
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;AAGA,IAAY,UAKX;AALD,WAAY,UAAU;IACpB,iCAAmB,CAAA;IACnB,iCAAmB,CAAA;IACnB,uCAAyB,CAAA;IACzB,+BAAiB,CAAA;AACnB,CAAC,EALW,UAAU,0BAAV,UAAU,QAKrB"}
@@ -0,0 +1,3 @@
1
+ export declare function formatDuration(seconds: number): string;
2
+ export declare function parseDuration(duration: string): number;
3
+ //# sourceMappingURL=TimeFormat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeFormat.d.ts","sourceRoot":"","sources":["../../src/utils/TimeFormat.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAStD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAatD"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatDuration = formatDuration;
4
+ exports.parseDuration = parseDuration;
5
+ function formatDuration(seconds) {
6
+ const hours = Math.floor(seconds / 3600);
7
+ const minutes = Math.floor((seconds % 3600) / 60);
8
+ const secs = Math.floor(seconds % 60);
9
+ if (hours > 0) {
10
+ return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
11
+ }
12
+ return `${minutes}:${secs.toString().padStart(2, '0')}`;
13
+ }
14
+ function parseDuration(duration) {
15
+ const parts = duration.split(':').map(Number);
16
+ if (parts.length === 3) {
17
+ // HH:MM:SS
18
+ return parts[0] * 3600 + parts[1] * 60 + parts[2];
19
+ }
20
+ else if (parts.length === 2) {
21
+ // MM:SS
22
+ return parts[0] * 60 + parts[1];
23
+ }
24
+ else {
25
+ // SS
26
+ return parts[0];
27
+ }
28
+ }
29
+ //# sourceMappingURL=TimeFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeFormat.js","sourceRoot":"","sources":["../../src/utils/TimeFormat.ts"],"names":[],"mappings":";;AAAA,wCASC;AAED,sCAaC;AAxBD,SAAgB,cAAc,CAAC,OAAe;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IAEtC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAC/F,CAAC;IACD,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,SAAgB,aAAa,CAAC,QAAgB;IAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,WAAW;QACX,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,QAAQ;QACR,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,KAAK;QACL,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}