ziplayer 0.3.2 → 0.3.4

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/{AI-Guide.md → AGENTS.md} +717 -624
  2. package/README.md +658 -526
  3. package/dist/extensions/BaseExtension.d.ts +10 -1
  4. package/dist/extensions/BaseExtension.d.ts.map +1 -1
  5. package/dist/extensions/BaseExtension.js +27 -1
  6. package/dist/extensions/BaseExtension.js.map +1 -1
  7. package/dist/extensions/index.d.ts.map +1 -1
  8. package/dist/extensions/index.js +24 -6
  9. package/dist/extensions/index.js.map +1 -1
  10. package/dist/plugins/index.d.ts.map +1 -1
  11. package/dist/plugins/index.js +105 -51
  12. package/dist/plugins/index.js.map +1 -1
  13. package/dist/structures/Player.d.ts +90 -15
  14. package/dist/structures/Player.d.ts.map +1 -1
  15. package/dist/structures/Player.js +487 -81
  16. package/dist/structures/Player.js.map +1 -1
  17. package/dist/structures/PlayerManager.d.ts +70 -6
  18. package/dist/structures/PlayerManager.d.ts.map +1 -1
  19. package/dist/structures/PlayerManager.js +184 -19
  20. package/dist/structures/PlayerManager.js.map +1 -1
  21. package/dist/structures/Queue.d.ts +19 -0
  22. package/dist/structures/Queue.d.ts.map +1 -1
  23. package/dist/structures/Queue.js +21 -0
  24. package/dist/structures/Queue.js.map +1 -1
  25. package/dist/types/extension.d.ts +3 -0
  26. package/dist/types/extension.d.ts.map +1 -1
  27. package/dist/types/index.d.ts +69 -2
  28. package/dist/types/index.d.ts.map +1 -1
  29. package/dist/types/index.js +13 -0
  30. package/dist/types/index.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/extensions/BaseExtension.ts +31 -1
  33. package/src/extensions/index.ts +30 -7
  34. package/src/plugins/index.ts +137 -54
  35. package/src/structures/Player.ts +2937 -2457
  36. package/src/structures/PlayerManager.ts +916 -725
  37. package/src/structures/Queue.ts +621 -599
  38. package/src/types/extension.ts +3 -0
  39. package/src/types/index.ts +80 -2
@@ -47,6 +47,9 @@ export interface SourceExtension {
47
47
  export interface ExtensionContext {
48
48
  player: Player;
49
49
  manager: PlayerManager;
50
+ playNext?: () => Promise<void>;
51
+ skip?: () => void;
52
+ emit?: (event: string, ...args: any[]) => void;
50
53
  }
51
54
 
52
55
  /**
@@ -4,6 +4,12 @@ import type { PlayerManager } from "../structures/PlayerManager";
4
4
  import type { AudioFilter } from "./fillter";
5
5
  import type { SourcePluginLike } from "./plugin";
6
6
  import type { AudioResource } from "@discordjs/voice";
7
+
8
+ export enum PlaybackMode {
9
+ NATIVE = "native",
10
+ REMOTE = "remote",
11
+ FORWARD = "forward",
12
+ }
7
13
  /**
8
14
  * Represents a music track with metadata and streaming information.
9
15
  *
@@ -118,8 +124,50 @@ export interface SearchScore {
118
124
  */
119
125
  export interface StreamInfo {
120
126
  stream: Readable;
121
- type: "webm/opus" | "ogg/opus" | "arbitrary";
127
+ type: "webm/opus" | "ogg/opus" | "arbitrary" | string;
122
128
  metadata?: Record<string, any>;
129
+
130
+ remote?: boolean;
131
+
132
+ handle?: {
133
+ play(): Promise<void>;
134
+ stop(): Promise<void>;
135
+ pause(): Promise<void>;
136
+ resume(): Promise<void>;
137
+ seek(position: number): Promise<void>;
138
+ setVolume(volume: number): Promise<void>;
139
+ destroy(): Promise<void>;
140
+ };
141
+ }
142
+
143
+ /** Passed to each {@link TrackMiddleware} run (before stream resolution). */
144
+ export interface TrackMiddlewareContext {
145
+ player: Player;
146
+ manager: PlayerManager;
147
+ }
148
+
149
+ /**
150
+ * Runs immediately before stream extraction (`Player.getStream`): after enqueue, before extension `provideStream` and plugins.
151
+ * Prefer mutating `track` in place (especially `metadata`). If you return another object, its fields are merged into the original
152
+ * `track` reference so queue/current-track pointers stay valid.
153
+ */
154
+ export type TrackMiddleware = (track: Track, context: TrackMiddlewareContext) => void | Track | Promise<void | Track>;
155
+
156
+ /** Options for {@link PlayerManager.subscribeForwardMirror}. */
157
+ export interface PlaybackMirrorOptions {
158
+ leaderGuildId: string;
159
+ followerGuildIds: string[];
160
+ /**
161
+ * When enabled, follower connections subscribe directly
162
+ * to leader.audioPlayer
163
+ * Default: true
164
+ */
165
+ forwardMode?: boolean;
166
+ }
167
+
168
+ export function normalizeTrackMiddleware(input?: TrackMiddleware | TrackMiddleware[]): TrackMiddleware[] {
169
+ if (!input) return [];
170
+ return Array.isArray(input) ? input : [input];
123
171
  }
124
172
 
125
173
  /**
@@ -302,6 +350,11 @@ export interface PlayerOptions {
302
350
  */
303
351
  limiterCeiling?: number;
304
352
  };
353
+ /**
354
+ * Chain of middleware applied to every track immediately before stream extraction (after queueing).
355
+ * Merged after {@link PlayerManagerOptions.trackMiddleware} from the manager.
356
+ */
357
+ trackMiddleware?: TrackMiddleware | TrackMiddleware[];
305
358
  }
306
359
 
307
360
  export interface PlayerManagerOptions {
@@ -312,6 +365,10 @@ export interface PlayerManagerOptions {
312
365
  cleanupInterval?: number; // Cleanup interval in ms
313
366
  enableSearchCache?: boolean; // Enable search result caching
314
367
  enableStatsCollection?: boolean; // Enable stats collection events
368
+ /**
369
+ * Global track middleware for every {@link Player} created from this manager (before per-player middleware).
370
+ */
371
+ trackMiddleware?: TrackMiddleware | TrackMiddleware[];
315
372
  }
316
373
 
317
374
  /**
@@ -381,12 +438,28 @@ export interface PreloadState {
381
438
  isBeingUsed: boolean;
382
439
  }
383
440
 
441
+ export interface ForwardHealthStatus {
442
+ guildId: string;
443
+ healthy: boolean;
444
+ role: "leader" | "follower" | "none";
445
+ issues: string[];
446
+ details: {
447
+ leaderId?: string;
448
+ followerCount?: number;
449
+ connectionState?: string;
450
+ audioPlayerState?: string;
451
+ };
452
+ }
453
+
384
454
  export interface PlayerStats {
385
455
  totalPlayers: number;
456
+ leader: number;
457
+ follower: number;
386
458
  activePlayers: number;
387
459
  pausedPlayers: number;
388
460
  connectedPlayers: number;
389
461
  totalTracksInQueue: number;
462
+ forwardHealthStatus: ForwardHealthStatus[];
390
463
  }
391
464
 
392
465
  export interface StreamSlot {
@@ -507,7 +580,10 @@ export interface ManagerEvents {
507
580
  lyricsChange: [player: Player, track: Track, lyrics: any];
508
581
  voiceCreate: [player: Player, evt: any];
509
582
  stats: [stats: PlayerStats];
510
- streamError: [error: Error, track: Track | null];
583
+ streamError: [player: Player, error: Error, track: Track | null];
584
+
585
+ forwardModeStart: [player: Player, leader: Player];
586
+ forwardModeEnd: [player: Player, leader: Player, reason: string | undefined];
511
587
  }
512
588
  export interface PlayerEvents {
513
589
  debug: [message: string, ...args: any[]];
@@ -541,6 +617,8 @@ export interface PlayerEvents {
541
617
  streamError: [error: Error, track: Track | null];
542
618
  /** Emitted when player stats are updated (if enabled) */
543
619
  stats: [stats: PlayerStats];
620
+ forwardModeStart: [leader: Player];
621
+ forwardModeEnd: [leader: Player, reason: string | undefined];
544
622
  }
545
623
 
546
624
  export * from "./fillter";