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.
Files changed (50) hide show
  1. package/README.md +150 -0
  2. package/dist/index.d.ts +8 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +29 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/plugins/BasePlugin.d.ts +17 -0
  7. package/dist/plugins/BasePlugin.d.ts.map +1 -0
  8. package/dist/plugins/BasePlugin.js +19 -0
  9. package/dist/plugins/BasePlugin.js.map +1 -0
  10. package/dist/plugins/SoundCloudPlugin.d.ts +22 -0
  11. package/dist/plugins/SoundCloudPlugin.d.ts.map +1 -0
  12. package/dist/plugins/SoundCloudPlugin.js +171 -0
  13. package/dist/plugins/SoundCloudPlugin.js.map +1 -0
  14. package/dist/plugins/SpotifyPlugin.d.ts +26 -0
  15. package/dist/plugins/SpotifyPlugin.d.ts.map +1 -0
  16. package/dist/plugins/SpotifyPlugin.js +183 -0
  17. package/dist/plugins/SpotifyPlugin.js.map +1 -0
  18. package/dist/plugins/YouTubePlugin.d.ts +25 -0
  19. package/dist/plugins/YouTubePlugin.d.ts.map +1 -0
  20. package/dist/plugins/YouTubePlugin.js +314 -0
  21. package/dist/plugins/YouTubePlugin.js.map +1 -0
  22. package/dist/plugins/index.d.ts +12 -0
  23. package/dist/plugins/index.d.ts.map +1 -0
  24. package/dist/plugins/index.js +31 -0
  25. package/dist/plugins/index.js.map +1 -0
  26. package/dist/structures/Player.d.ts +54 -0
  27. package/dist/structures/Player.d.ts.map +1 -0
  28. package/dist/structures/Player.js +444 -0
  29. package/dist/structures/Player.js.map +1 -0
  30. package/dist/structures/PlayerManager.d.ts +16 -0
  31. package/dist/structures/PlayerManager.d.ts.map +1 -0
  32. package/dist/structures/PlayerManager.js +77 -0
  33. package/dist/structures/PlayerManager.js.map +1 -0
  34. package/dist/structures/Queue.d.ts +24 -0
  35. package/dist/structures/Queue.d.ts.map +1 -0
  36. package/dist/structures/Queue.js +78 -0
  37. package/dist/structures/Queue.js.map +1 -0
  38. package/dist/types/index.d.ts +75 -0
  39. package/dist/types/index.d.ts.map +1 -0
  40. package/dist/types/index.js +3 -0
  41. package/dist/types/index.js.map +1 -0
  42. package/package.json +29 -0
  43. package/src/index.ts +10 -0
  44. package/src/plugins/BasePlugin.ts +29 -0
  45. package/src/plugins/index.ts +32 -0
  46. package/src/structures/Player.ts +526 -0
  47. package/src/structures/PlayerManager.ts +86 -0
  48. package/src/structures/Queue.ts +87 -0
  49. package/src/types/index.ts +82 -0
  50. 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":"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"}
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -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
+ }