ziplayer 0.0.1
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 +150 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/BasePlugin.d.ts +17 -0
- package/dist/plugins/BasePlugin.d.ts.map +1 -0
- package/dist/plugins/BasePlugin.js +19 -0
- package/dist/plugins/BasePlugin.js.map +1 -0
- package/dist/plugins/SoundCloudPlugin.d.ts +22 -0
- package/dist/plugins/SoundCloudPlugin.d.ts.map +1 -0
- package/dist/plugins/SoundCloudPlugin.js +171 -0
- package/dist/plugins/SoundCloudPlugin.js.map +1 -0
- package/dist/plugins/SpotifyPlugin.d.ts +26 -0
- package/dist/plugins/SpotifyPlugin.d.ts.map +1 -0
- package/dist/plugins/SpotifyPlugin.js +183 -0
- package/dist/plugins/SpotifyPlugin.js.map +1 -0
- package/dist/plugins/YouTubePlugin.d.ts +25 -0
- package/dist/plugins/YouTubePlugin.d.ts.map +1 -0
- package/dist/plugins/YouTubePlugin.js +314 -0
- package/dist/plugins/YouTubePlugin.js.map +1 -0
- package/dist/plugins/index.d.ts +12 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +31 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/structures/Player.d.ts +54 -0
- package/dist/structures/Player.d.ts.map +1 -0
- package/dist/structures/Player.js +444 -0
- package/dist/structures/Player.js.map +1 -0
- package/dist/structures/PlayerManager.d.ts +16 -0
- package/dist/structures/PlayerManager.d.ts.map +1 -0
- package/dist/structures/PlayerManager.js +77 -0
- package/dist/structures/PlayerManager.js.map +1 -0
- package/dist/structures/Queue.d.ts +24 -0
- package/dist/structures/Queue.d.ts.map +1 -0
- package/dist/structures/Queue.js +78 -0
- package/dist/structures/Queue.js.map +1 -0
- package/dist/types/index.d.ts +75 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +29 -0
- package/src/index.ts +10 -0
- package/src/plugins/BasePlugin.ts +29 -0
- package/src/plugins/index.ts +32 -0
- package/src/structures/Player.ts +526 -0
- package/src/structures/PlayerManager.ts +86 -0
- package/src/structures/Queue.ts +87 -0
- package/src/types/index.ts +82 -0
- package/tsconfig.json +23 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Queue = void 0;
|
|
4
|
+
class Queue {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.tracks = [];
|
|
7
|
+
this.current = null;
|
|
8
|
+
this.history = [];
|
|
9
|
+
this._autoPlay = false;
|
|
10
|
+
this.willnext = null;
|
|
11
|
+
}
|
|
12
|
+
add(track) {
|
|
13
|
+
this.tracks.push(track);
|
|
14
|
+
}
|
|
15
|
+
addMultiple(tracks) {
|
|
16
|
+
this.tracks.push(...tracks);
|
|
17
|
+
}
|
|
18
|
+
remove(index) {
|
|
19
|
+
if (index < 0 || index >= this.tracks.length)
|
|
20
|
+
return null;
|
|
21
|
+
return this.tracks.splice(index, 1)[0];
|
|
22
|
+
}
|
|
23
|
+
next() {
|
|
24
|
+
if (this.current) {
|
|
25
|
+
this.history.push(this.current);
|
|
26
|
+
if (this.history.length > 200) {
|
|
27
|
+
this.history.shift();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
this.current = this.tracks.shift() || null;
|
|
31
|
+
return this.current;
|
|
32
|
+
}
|
|
33
|
+
clear() {
|
|
34
|
+
this.tracks = [];
|
|
35
|
+
}
|
|
36
|
+
autoPlay(value) {
|
|
37
|
+
if (typeof value !== "undefined") {
|
|
38
|
+
this._autoPlay = value;
|
|
39
|
+
}
|
|
40
|
+
return this._autoPlay;
|
|
41
|
+
}
|
|
42
|
+
shuffle() {
|
|
43
|
+
for (let i = this.tracks.length - 1; i > 0; i--) {
|
|
44
|
+
const j = Math.floor(Math.random() * (i + 1));
|
|
45
|
+
[this.tracks[i], this.tracks[j]] = [this.tracks[j], this.tracks[i]];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
get size() {
|
|
49
|
+
return this.tracks.length;
|
|
50
|
+
}
|
|
51
|
+
get isEmpty() {
|
|
52
|
+
return this.tracks.length === 0;
|
|
53
|
+
}
|
|
54
|
+
get currentTrack() {
|
|
55
|
+
return this.current;
|
|
56
|
+
}
|
|
57
|
+
get previousTracks() {
|
|
58
|
+
return [...this.history];
|
|
59
|
+
}
|
|
60
|
+
get nextTrack() {
|
|
61
|
+
return this.tracks[0] || null;
|
|
62
|
+
}
|
|
63
|
+
willNextTrack(track) {
|
|
64
|
+
if (track) {
|
|
65
|
+
this.willnext = track;
|
|
66
|
+
return this.willnext;
|
|
67
|
+
}
|
|
68
|
+
return this.willnext;
|
|
69
|
+
}
|
|
70
|
+
getTracks() {
|
|
71
|
+
return [...this.tracks];
|
|
72
|
+
}
|
|
73
|
+
getTrack(index) {
|
|
74
|
+
return this.tracks[index] || null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.Queue = Queue;
|
|
78
|
+
//# sourceMappingURL=Queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Queue.js","sourceRoot":"","sources":["../../src/structures/Queue.ts"],"names":[],"mappings":";;;AAEA,MAAa,KAAK;IAAlB;QACS,WAAM,GAAY,EAAE,CAAC;QACrB,YAAO,GAAiB,IAAI,CAAC;QAC7B,YAAO,GAAY,EAAE,CAAC;QACtB,cAAS,GAAG,KAAK,CAAC;QAClB,aAAQ,GAAiB,IAAI,CAAC;IA+EvC,CAAC;IA7EA,GAAG,CAAC,KAAY;QACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,WAAW,CAAC,MAAe;QAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAC1D,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,IAAI;QACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,CAAC;QACF,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,QAAQ,CAAC,KAAe;QACvB,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;YAClC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,OAAO;QACN,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;IACF,CAAC;IAED,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,YAAY;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,IAAI,cAAc;QACjB,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,SAAS;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC/B,CAAC;IAED,aAAa,CAAC,KAAa;QAC1B,IAAI,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,OAAO,IAAI,CAAC,QAAQ,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,SAAS;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,KAAa;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC;CACD;AApFD,sBAoFC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Readable } from "stream";
|
|
2
|
+
export interface Track {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
url: string;
|
|
6
|
+
duration: number;
|
|
7
|
+
thumbnail?: string;
|
|
8
|
+
requestedBy: string;
|
|
9
|
+
source: string;
|
|
10
|
+
metadata?: Record<string, any>;
|
|
11
|
+
}
|
|
12
|
+
export interface SearchResult {
|
|
13
|
+
tracks: Track[];
|
|
14
|
+
playlist?: {
|
|
15
|
+
name: string;
|
|
16
|
+
url: string;
|
|
17
|
+
thumbnail?: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface StreamInfo {
|
|
21
|
+
stream: Readable;
|
|
22
|
+
type: "webm/opus" | "ogg/opus" | "arbitrary";
|
|
23
|
+
metadata?: Record<string, any>;
|
|
24
|
+
}
|
|
25
|
+
export interface PlayerOptions {
|
|
26
|
+
leaveOnEnd?: boolean;
|
|
27
|
+
leaveOnEmpty?: boolean;
|
|
28
|
+
leaveTimeout?: number;
|
|
29
|
+
volume?: number;
|
|
30
|
+
quality?: "high" | "low";
|
|
31
|
+
/**
|
|
32
|
+
* Timeout in milliseconds for plugin operations (search, streaming, etc.)
|
|
33
|
+
* to prevent long-running tasks from blocking the player.
|
|
34
|
+
*/
|
|
35
|
+
extractorTimeout?: number;
|
|
36
|
+
userdata?: Record<string, any>;
|
|
37
|
+
}
|
|
38
|
+
export interface PlayerManagerOptions {
|
|
39
|
+
plugins?: SourcePlugin[];
|
|
40
|
+
}
|
|
41
|
+
export interface ProgressBarOptions {
|
|
42
|
+
size?: number;
|
|
43
|
+
barChar?: string;
|
|
44
|
+
progressChar?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface PlayerEvents {
|
|
47
|
+
debug: [message: string, ...args: any[]];
|
|
48
|
+
willPlay: [track: Track, upcomingTracks: Track[]];
|
|
49
|
+
trackStart: [track: Track];
|
|
50
|
+
trackEnd: [track: Track];
|
|
51
|
+
queueEnd: [];
|
|
52
|
+
playerError: [error: Error, track?: Track];
|
|
53
|
+
connectionError: [error: Error];
|
|
54
|
+
volumeChange: [oldVolume: number, newVolume: number];
|
|
55
|
+
queueAdd: [track: Track];
|
|
56
|
+
queueRemove: [track: Track, index: number];
|
|
57
|
+
playerPause: [track: Track];
|
|
58
|
+
playerResume: [track: Track];
|
|
59
|
+
playerStop: [];
|
|
60
|
+
playerDestroy: [];
|
|
61
|
+
}
|
|
62
|
+
export interface SourcePlugin {
|
|
63
|
+
name: string;
|
|
64
|
+
version: string;
|
|
65
|
+
canHandle(query: string): boolean;
|
|
66
|
+
search(query: string, requestedBy: string): Promise<SearchResult>;
|
|
67
|
+
getStream(track: Track): Promise<StreamInfo>;
|
|
68
|
+
getRelatedTracks?(track: string | number, opts?: {
|
|
69
|
+
limit?: number;
|
|
70
|
+
offset?: number;
|
|
71
|
+
}): Promise<Track[]>;
|
|
72
|
+
validate?(url: string): boolean;
|
|
73
|
+
extractPlaylist?(url: string, requestedBy: string): Promise<Track[]>;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ziplayer",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "A modular Discord voice player with plugin system",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"dev": "tsc --watch",
|
|
10
|
+
"prepare": "npm run build"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@discordjs/voice": "^0.19.0",
|
|
14
|
+
"@snazzah/davey": "^0.1.6",
|
|
15
|
+
"discord.js": "^14.0.0",
|
|
16
|
+
"ffmpeg-static": "^5.2.0",
|
|
17
|
+
"libsodium-wrappers": "^0.7.15",
|
|
18
|
+
"opusscript": "^0.1.1"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/node": "^20.0.0",
|
|
22
|
+
"typescript": "^5.0.0"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"@zibot/scdl": "^0.0.5",
|
|
26
|
+
"soundcloud-scraper": "^5.0.2",
|
|
27
|
+
"youtubei.js": "^15.0.1"
|
|
28
|
+
}
|
|
29
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PlayerManager } from "./structures/PlayerManager";
|
|
2
|
+
|
|
3
|
+
export { Player } from "./structures/Player";
|
|
4
|
+
export { Queue } from "./structures/Queue";
|
|
5
|
+
export { PlayerManager } from "./structures/PlayerManager";
|
|
6
|
+
export * from "./types";
|
|
7
|
+
export * from "./plugins";
|
|
8
|
+
|
|
9
|
+
// Default export
|
|
10
|
+
export default PlayerManager;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { SourcePlugin, Track, SearchResult, StreamInfo } from "../types";
|
|
2
|
+
|
|
3
|
+
export abstract class BasePlugin implements SourcePlugin {
|
|
4
|
+
abstract name: string;
|
|
5
|
+
abstract version: string;
|
|
6
|
+
|
|
7
|
+
abstract canHandle(query: string): boolean;
|
|
8
|
+
abstract search(query: string, requestedBy: string): Promise<SearchResult>;
|
|
9
|
+
abstract getStream(track: Track): Promise<StreamInfo>;
|
|
10
|
+
|
|
11
|
+
getFallback?(track: Track): Promise<StreamInfo> {
|
|
12
|
+
throw new Error("getFallback not implemented");
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
getRelatedTracks?(
|
|
16
|
+
trackURL: string,
|
|
17
|
+
opts?: { limit?: number; offset?: number; history?: Track[] }
|
|
18
|
+
): Promise<Track[]> {
|
|
19
|
+
return Promise.resolve([]);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
validate?(url: string): boolean {
|
|
23
|
+
return this.canHandle(url);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
extractPlaylist?(url: string, requestedBy: string): Promise<Track[]> {
|
|
27
|
+
return Promise.resolve([]);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { BasePlugin } from "./BasePlugin";
|
|
2
|
+
|
|
3
|
+
export { BasePlugin } from "./BasePlugin";
|
|
4
|
+
|
|
5
|
+
// Plugin factory
|
|
6
|
+
export class PluginManager {
|
|
7
|
+
private plugins: Map<string, BasePlugin> = new Map();
|
|
8
|
+
|
|
9
|
+
register(plugin: BasePlugin): void {
|
|
10
|
+
this.plugins.set(plugin.name, plugin);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
unregister(name: string): boolean {
|
|
14
|
+
return this.plugins.delete(name);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
get(name: string): BasePlugin | undefined {
|
|
18
|
+
return this.plugins.get(name);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
getAll(): BasePlugin[] {
|
|
22
|
+
return Array.from(this.plugins.values());
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
findPlugin(query: string): BasePlugin | undefined {
|
|
26
|
+
return this.getAll().find((plugin) => plugin.canHandle(query));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
clear(): void {
|
|
30
|
+
this.plugins.clear();
|
|
31
|
+
}
|
|
32
|
+
}
|