ziplayer 0.1.4 → 0.2.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.
- package/README.md +16 -0
- package/dist/extensions/index.d.ts +18 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +146 -3
- package/dist/extensions/index.js.map +1 -1
- package/dist/plugins/index.d.ts +12 -0
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +55 -1
- package/dist/plugins/index.js.map +1 -1
- package/dist/structures/FilterManager.d.ts +126 -0
- package/dist/structures/FilterManager.d.ts.map +1 -0
- package/dist/structures/FilterManager.js +247 -0
- package/dist/structures/FilterManager.js.map +1 -0
- package/dist/structures/Player.d.ts +145 -135
- package/dist/structures/Player.d.ts.map +1 -1
- package/dist/structures/Player.js +662 -820
- package/dist/structures/Player.js.map +1 -1
- package/dist/structures/PlayerManager.d.ts +5 -1
- package/dist/structures/PlayerManager.d.ts.map +1 -1
- package/dist/structures/PlayerManager.js.map +1 -1
- package/dist/types/index.d.ts +129 -16
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +223 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +3 -2
- package/src/extensions/index.ts +165 -3
- package/src/plugins/index.ts +70 -0
- package/src/structures/FilterManager.ts +262 -0
- package/src/structures/Player.ts +729 -908
- package/src/structures/PlayerManager.ts +16 -11
- package/src/types/index.ts +347 -16
package/README.md
CHANGED
|
@@ -18,6 +18,7 @@ A modular Discord voice player with plugin system for @discordjs/voice.
|
|
|
18
18
|
- 🎭 **Multi-guild support** - Manage players across multiple Discord servers
|
|
19
19
|
- 🗃️ **User data** - Attach custom data to each player for later use
|
|
20
20
|
- 🔌 **Lavalink** - Support manage an external Lavalink JVM node
|
|
21
|
+
- 🎛️ **Audio Filters** - Apply real-time audio effects using FFmpeg (bassboost, nightcore, etc.)
|
|
21
22
|
|
|
22
23
|
## Installation
|
|
23
24
|
|
|
@@ -50,6 +51,8 @@ const player = await manager.create(guildId, {
|
|
|
50
51
|
userdata: { channel: textChannel }, // store channel for events
|
|
51
52
|
// Choose extensions for this player (by name or instances)
|
|
52
53
|
extensions: ["voiceExt"],
|
|
54
|
+
// Apply audio filters
|
|
55
|
+
filters: ["bassboost", "normalize"],
|
|
53
56
|
});
|
|
54
57
|
|
|
55
58
|
// Connect and play
|
|
@@ -74,6 +77,19 @@ player.on("trackStart", (player, track) => {
|
|
|
74
77
|
player.userdata?.channel?.send(`Now playing: ${track.title}`);
|
|
75
78
|
});
|
|
76
79
|
|
|
80
|
+
// Audio Filters
|
|
81
|
+
player.filter.applyFilter("bassboost"); // Apply bass boost
|
|
82
|
+
player.filter.applyFilter("nightcore"); // Apply nightcore effect
|
|
83
|
+
player.filter.removeFilter("bassboost"); // Remove specific filter
|
|
84
|
+
player.filter.clearFilters(); // Clear all filters
|
|
85
|
+
|
|
86
|
+
// Apply custom filter
|
|
87
|
+
player.filter.applyFilter({
|
|
88
|
+
name: "custom",
|
|
89
|
+
ffmpegFilter: "volume=1.5,treble=g=5",
|
|
90
|
+
description: "Volume boost + treble boost",
|
|
91
|
+
});
|
|
92
|
+
|
|
77
93
|
// Receive transcripts
|
|
78
94
|
manager.on("voiceCreate", (player, evt) => {
|
|
79
95
|
console.log(`User ${evt.userId} said: ${evt.content}`);
|
|
@@ -1,12 +1,29 @@
|
|
|
1
|
+
import type { Player } from "../structures/Player";
|
|
2
|
+
import type { PlayerManager } from "../structures/PlayerManager";
|
|
3
|
+
import type { SearchResult, StreamInfo, Track, ExtensionPlayRequest, ExtensionPlayResponse, ExtensionAfterPlayPayload } from "../types";
|
|
1
4
|
import { BaseExtension } from "./BaseExtension";
|
|
2
5
|
export { BaseExtension } from "./BaseExtension";
|
|
3
6
|
export declare class ExtensionManager {
|
|
7
|
+
private debug;
|
|
4
8
|
private extensions;
|
|
9
|
+
private player;
|
|
10
|
+
private manager;
|
|
11
|
+
private extensionContext;
|
|
12
|
+
constructor(player: Player, manager: PlayerManager);
|
|
5
13
|
register(extension: BaseExtension): void;
|
|
6
|
-
unregister(
|
|
14
|
+
unregister(extension: BaseExtension): boolean;
|
|
15
|
+
destroy(): void;
|
|
7
16
|
get(name: string): BaseExtension | undefined;
|
|
8
17
|
getAll(): BaseExtension[];
|
|
9
18
|
findExtension(alas: any): BaseExtension | undefined;
|
|
10
19
|
clear(): void;
|
|
20
|
+
private invokeExtensionLifecycle;
|
|
21
|
+
provideSearch(query: string, requestedBy: string): Promise<SearchResult | null>;
|
|
22
|
+
provideStream(track: Track): Promise<StreamInfo | null>;
|
|
23
|
+
BeforePlayHooks(initial: ExtensionPlayRequest): Promise<{
|
|
24
|
+
request: ExtensionPlayRequest;
|
|
25
|
+
response: ExtensionPlayResponse;
|
|
26
|
+
}>;
|
|
27
|
+
AfterPlayHooks(payload: ExtensionAfterPlayPayload): Promise<void>;
|
|
11
28
|
}
|
|
12
29
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAEX,YAAY,EACZ,UAAU,EACV,KAAK,EAEL,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EAEzB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKhD,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;IAalD,QAAQ,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IAUxC,UAAU,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO;IAS7C,OAAO,IAAI,IAAI;IAQf,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI5C,MAAM,IAAI,aAAa,EAAE;IAIzB,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,aAAa,GAAG,SAAS;IAInD,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,wBAAwB;IAc1B,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAkB/E,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAkBvD,eAAe,CACpB,OAAO,EAAE,oBAAoB,GAC3B,OAAO,CAAC;QAAE,OAAO,EAAE,oBAAoB,CAAC;QAAC,QAAQ,EAAE,qBAAqB,CAAA;KAAE,CAAC;IAwCxE,cAAc,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBvE"}
|
package/dist/extensions/index.js
CHANGED
|
@@ -5,14 +5,40 @@ var BaseExtension_1 = require("./BaseExtension");
|
|
|
5
5
|
Object.defineProperty(exports, "BaseExtension", { enumerable: true, get: function () { return BaseExtension_1.BaseExtension; } });
|
|
6
6
|
// Extension factory
|
|
7
7
|
class ExtensionManager {
|
|
8
|
-
constructor() {
|
|
8
|
+
constructor(player, manager) {
|
|
9
|
+
this.player = player;
|
|
10
|
+
this.manager = manager;
|
|
9
11
|
this.extensions = new Map();
|
|
12
|
+
this.extensionContext = Object.freeze({ player, manager });
|
|
13
|
+
this.debug = (message, ...optionalParams) => {
|
|
14
|
+
if (manager.debugEnabled) {
|
|
15
|
+
manager.emit("debug", `[ExtensionManager] ${message}`, ...optionalParams);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
10
18
|
}
|
|
11
19
|
register(extension) {
|
|
20
|
+
if (this.extensions.has(extension.name)) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (!extension.player) {
|
|
24
|
+
extension.player = this.player;
|
|
25
|
+
}
|
|
12
26
|
this.extensions.set(extension.name, extension);
|
|
13
27
|
}
|
|
14
|
-
unregister(
|
|
15
|
-
|
|
28
|
+
unregister(extension) {
|
|
29
|
+
const name = extension.name;
|
|
30
|
+
const result = this.extensions.delete(name);
|
|
31
|
+
if (result) {
|
|
32
|
+
this.invokeExtensionLifecycle(extension, "onDestroy");
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
destroy() {
|
|
37
|
+
this.debug(`[ExtensionManager] destroying all extensions`);
|
|
38
|
+
for (const extension of this.extensions.values()) {
|
|
39
|
+
this.unregister(extension);
|
|
40
|
+
}
|
|
41
|
+
this.extensions.clear();
|
|
16
42
|
}
|
|
17
43
|
get(name) {
|
|
18
44
|
return this.extensions.get(name);
|
|
@@ -26,6 +52,123 @@ class ExtensionManager {
|
|
|
26
52
|
clear() {
|
|
27
53
|
this.extensions.clear();
|
|
28
54
|
}
|
|
55
|
+
invokeExtensionLifecycle(extension, hook) {
|
|
56
|
+
if (!extension)
|
|
57
|
+
return;
|
|
58
|
+
const fn = extension[hook];
|
|
59
|
+
if (typeof fn !== "function")
|
|
60
|
+
return;
|
|
61
|
+
try {
|
|
62
|
+
const result = fn.call(extension, this.extensionContext);
|
|
63
|
+
if (result && typeof result.then === "function") {
|
|
64
|
+
result.catch((err) => this.debug(`[Player] Extension ${extension.name} ${hook} error:`, err));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
this.debug(`[Player] Extension ${extension.name} ${hook} error:`, err);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async provideSearch(query, requestedBy) {
|
|
72
|
+
const request = { query, requestedBy };
|
|
73
|
+
for (const extension of this.getAll()) {
|
|
74
|
+
const hook = extension.provideSearch;
|
|
75
|
+
if (typeof hook !== "function")
|
|
76
|
+
continue;
|
|
77
|
+
try {
|
|
78
|
+
const result = await Promise.resolve(hook.call(extension, this.extensionContext, request));
|
|
79
|
+
if (result && Array.isArray(result.tracks) && result.tracks.length > 0) {
|
|
80
|
+
this.debug(`[Player] Extension ${extension.name} handled search for query: ${query}`);
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
this.debug(`[Player] Extension ${extension.name} provideSearch error:`, err);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
async provideStream(track) {
|
|
91
|
+
const request = { track };
|
|
92
|
+
for (const extension of this.getAll()) {
|
|
93
|
+
const hook = extension.provideStream;
|
|
94
|
+
if (typeof hook !== "function")
|
|
95
|
+
continue;
|
|
96
|
+
try {
|
|
97
|
+
const result = await Promise.resolve(hook.call(extension, this.extensionContext, request));
|
|
98
|
+
if (result && result.stream) {
|
|
99
|
+
this.debug(`[Player] Extension ${extension.name} provided stream for track: ${track.title}`);
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
this.debug(`[Player] Extension ${extension.name} provideStream error:`, err);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
async BeforePlayHooks(initial) {
|
|
110
|
+
const request = { ...initial };
|
|
111
|
+
const response = {};
|
|
112
|
+
for (const extension of this.getAll()) {
|
|
113
|
+
const hook = extension.beforePlay;
|
|
114
|
+
if (typeof hook !== "function")
|
|
115
|
+
continue;
|
|
116
|
+
try {
|
|
117
|
+
const result = await Promise.resolve(hook.call(extension, this.extensionContext, request));
|
|
118
|
+
if (!result)
|
|
119
|
+
continue;
|
|
120
|
+
if (result.query !== undefined) {
|
|
121
|
+
request.query = result.query;
|
|
122
|
+
response.query = result.query;
|
|
123
|
+
}
|
|
124
|
+
if (result.requestedBy !== undefined) {
|
|
125
|
+
request.requestedBy = result.requestedBy;
|
|
126
|
+
response.requestedBy = result.requestedBy;
|
|
127
|
+
}
|
|
128
|
+
if (Array.isArray(result.tracks)) {
|
|
129
|
+
response.tracks = result.tracks;
|
|
130
|
+
}
|
|
131
|
+
if (typeof result.isPlaylist === "boolean") {
|
|
132
|
+
response.isPlaylist = result.isPlaylist;
|
|
133
|
+
}
|
|
134
|
+
if (typeof result.success === "boolean") {
|
|
135
|
+
response.success = result.success;
|
|
136
|
+
}
|
|
137
|
+
if (result.error instanceof Error) {
|
|
138
|
+
response.error = result.error;
|
|
139
|
+
}
|
|
140
|
+
if (typeof result.handled === "boolean") {
|
|
141
|
+
response.handled = result.handled;
|
|
142
|
+
if (result.handled)
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
this.debug(`[Player] Extension ${extension.name} beforePlay error:`, err);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return { request, response };
|
|
151
|
+
}
|
|
152
|
+
async AfterPlayHooks(payload) {
|
|
153
|
+
if (this.getAll().length === 0)
|
|
154
|
+
return;
|
|
155
|
+
const safeTracks = payload.tracks ? [...payload.tracks] : undefined;
|
|
156
|
+
if (safeTracks) {
|
|
157
|
+
Object.freeze(safeTracks);
|
|
158
|
+
}
|
|
159
|
+
const immutablePayload = Object.freeze({ ...payload, tracks: safeTracks });
|
|
160
|
+
for (const extension of this.getAll()) {
|
|
161
|
+
const hook = extension.afterPlay;
|
|
162
|
+
if (typeof hook !== "function")
|
|
163
|
+
continue;
|
|
164
|
+
try {
|
|
165
|
+
await Promise.resolve(hook.call(extension, this.extensionContext, immutablePayload));
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
this.debug(`[Player] Extension ${extension.name} afterPlay error:`, err);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
29
172
|
}
|
|
30
173
|
exports.ExtensionManager = ExtensionManager;
|
|
31
174
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"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"}
|
package/dist/plugins/index.d.ts
CHANGED
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
import { BasePlugin } from "./BasePlugin";
|
|
2
|
+
import type { Track, StreamInfo } from "../types";
|
|
3
|
+
import type { PlayerManager } from "../structures/PlayerManager";
|
|
4
|
+
import type { Player } from "../structures/Player";
|
|
5
|
+
type PluginManagerOptions = {
|
|
6
|
+
extractorTimeout: number | undefined;
|
|
7
|
+
};
|
|
2
8
|
export { BasePlugin } from "./BasePlugin";
|
|
3
9
|
export declare class PluginManager {
|
|
10
|
+
private debug;
|
|
11
|
+
private options;
|
|
12
|
+
private player;
|
|
13
|
+
private manager;
|
|
4
14
|
private plugins;
|
|
15
|
+
constructor(player: Player, manager: PlayerManager, options: PluginManagerOptions);
|
|
5
16
|
register(plugin: BasePlugin): void;
|
|
6
17
|
unregister(name: string): boolean;
|
|
7
18
|
get(name: string): BasePlugin | undefined;
|
|
8
19
|
getAll(): BasePlugin[];
|
|
9
20
|
findPlugin(query: string): BasePlugin | undefined;
|
|
10
21
|
clear(): void;
|
|
22
|
+
getStream(track: Track): Promise<StreamInfo | null>;
|
|
11
23
|
}
|
|
12
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,qBAAa,aAAa;IACzB,OAAO,CAAC,OAAO,CAAsC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD,KAAK,oBAAoB,GAAG;IAC3B,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,qBAAa,aAAa;IACzB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,OAAO,CAAsC;gBAEzC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,oBAAoB;IAWjF,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAIlC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIzC,MAAM,IAAI,UAAU,EAAE;IAItB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIjD,KAAK,IAAI,IAAI;IAIP,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CA6CzD"}
|
package/dist/plugins/index.js
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PluginManager = exports.BasePlugin = void 0;
|
|
4
|
+
const timeout_1 = require("../utils/timeout");
|
|
4
5
|
var BasePlugin_1 = require("./BasePlugin");
|
|
5
6
|
Object.defineProperty(exports, "BasePlugin", { enumerable: true, get: function () { return BasePlugin_1.BasePlugin; } });
|
|
6
7
|
// Plugin factory
|
|
7
8
|
class PluginManager {
|
|
8
|
-
constructor() {
|
|
9
|
+
constructor(player, manager, options) {
|
|
9
10
|
this.plugins = new Map();
|
|
11
|
+
this.player = player;
|
|
12
|
+
this.manager = manager;
|
|
13
|
+
this.options = options;
|
|
14
|
+
this.debug = (message, ...optionalParams) => {
|
|
15
|
+
if (manager.debugEnabled) {
|
|
16
|
+
manager.emit("debug", `[ExtensionManager] ${message}`, ...optionalParams);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
10
19
|
}
|
|
11
20
|
register(plugin) {
|
|
12
21
|
this.plugins.set(plugin.name, plugin);
|
|
@@ -26,6 +35,51 @@ class PluginManager {
|
|
|
26
35
|
clear() {
|
|
27
36
|
this.plugins.clear();
|
|
28
37
|
}
|
|
38
|
+
async getStream(track) {
|
|
39
|
+
let streamInfo = null;
|
|
40
|
+
const plugin = this.get(track.source) || this.findPlugin(track.url);
|
|
41
|
+
if (!plugin) {
|
|
42
|
+
this.debug(`[Player] No plugin found for track: ${track.title}`);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
this.debug(`[Player] Getting stream for track: ${track.title}`);
|
|
46
|
+
this.debug(`[Player] Using plugin: ${plugin.name}`);
|
|
47
|
+
this.debug(`[Track] Track Info:`, track);
|
|
48
|
+
const timeoutMs = this.options.extractorTimeout ?? 50000;
|
|
49
|
+
try {
|
|
50
|
+
streamInfo = await (0, timeout_1.withTimeout)(plugin.getStream(track), timeoutMs, "getStream timed out");
|
|
51
|
+
if (!streamInfo?.stream) {
|
|
52
|
+
throw new Error(`No stream returned from ${plugin.name}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (streamError) {
|
|
56
|
+
this.debug(`[Player] getStream failed, trying getFallback:`, streamError);
|
|
57
|
+
const allplugs = this.getAll();
|
|
58
|
+
for (const p of allplugs) {
|
|
59
|
+
if (typeof p.getFallback !== "function" && typeof p.getStream !== "function") {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
streamInfo = await (0, timeout_1.withTimeout)(p.getStream(track), timeoutMs, `getStream timed out for plugin ${p.name}`);
|
|
64
|
+
if (streamInfo?.stream) {
|
|
65
|
+
this.debug(`[Player] getStream succeeded with plugin ${p.name} for track: ${track.title}`);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
streamInfo = await (0, timeout_1.withTimeout)(p.getFallback(track), timeoutMs, `getFallback timed out for plugin ${p.name}`);
|
|
69
|
+
if (!streamInfo?.stream)
|
|
70
|
+
continue;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
catch (fallbackError) {
|
|
74
|
+
this.debug(`[Player] getFallback failed with plugin ${p.name}:`, fallbackError);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (!streamInfo?.stream) {
|
|
78
|
+
throw new Error(`All getFallback attempts failed for track: ${track.title}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return streamInfo;
|
|
82
|
+
}
|
|
29
83
|
}
|
|
30
84
|
exports.PluginManager = PluginManager;
|
|
31
85
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type { AudioFilter } from "../types";
|
|
2
|
+
import type { Player } from "./Player";
|
|
3
|
+
import type { PlayerManager } from "./PlayerManager";
|
|
4
|
+
import type { Readable } from "stream";
|
|
5
|
+
export declare class FilterManager {
|
|
6
|
+
private activeFilters;
|
|
7
|
+
private debug;
|
|
8
|
+
private player;
|
|
9
|
+
private ffmpeg;
|
|
10
|
+
StreamType: "webm/opus" | "ogg/opus" | "mp3" | "arbitrary";
|
|
11
|
+
constructor(player: Player, manager: PlayerManager);
|
|
12
|
+
/**
|
|
13
|
+
* Destroy the filter manager
|
|
14
|
+
*
|
|
15
|
+
* @returns {void}
|
|
16
|
+
* @example
|
|
17
|
+
* player.filter.destroy();
|
|
18
|
+
*/
|
|
19
|
+
destroy(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Get the combined FFmpeg filter string for all active filters
|
|
22
|
+
*
|
|
23
|
+
* @returns {string} Combined FFmpeg filter string
|
|
24
|
+
* @example
|
|
25
|
+
* const filterString = player.getFilterString();
|
|
26
|
+
* console.log(`Filter string: ${filterString}`);
|
|
27
|
+
*/
|
|
28
|
+
getFilterString(): string;
|
|
29
|
+
/**
|
|
30
|
+
* Get all currently applied filters
|
|
31
|
+
*
|
|
32
|
+
* @returns {AudioFilter[]} Array of active filters
|
|
33
|
+
* @example
|
|
34
|
+
* const filters = player.getActiveFilters();
|
|
35
|
+
* console.log(`Active filters: ${filters.map(f => f.name).join(', ')}`);
|
|
36
|
+
*/
|
|
37
|
+
getActiveFilters(): AudioFilter[];
|
|
38
|
+
/**
|
|
39
|
+
* Check if a specific filter is currently applied
|
|
40
|
+
*
|
|
41
|
+
* @param {string} filterName - Name of the filter to check
|
|
42
|
+
* @returns {boolean} True if filter is applied
|
|
43
|
+
* @example
|
|
44
|
+
* const hasBassBoost = player.hasFilter("bassboost");
|
|
45
|
+
* console.log(`Has bass boost: ${hasBassBoost}`);
|
|
46
|
+
*/
|
|
47
|
+
hasFilter(filterName: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Get available predefined filters
|
|
50
|
+
*
|
|
51
|
+
* @returns {AudioFilter[]} Array of all predefined filters
|
|
52
|
+
* @example
|
|
53
|
+
* const availableFilters = player.getAvailableFilters();
|
|
54
|
+
* console.log(`Available filters: ${availableFilters.length}`);
|
|
55
|
+
*/
|
|
56
|
+
getAvailableFilters(): AudioFilter[];
|
|
57
|
+
/**
|
|
58
|
+
* Get filters by category
|
|
59
|
+
*
|
|
60
|
+
* @param {string} category - Category to filter by
|
|
61
|
+
* @returns {AudioFilter[]} Array of filters in the category
|
|
62
|
+
* @example
|
|
63
|
+
* const eqFilters = player.getFiltersByCategory("eq");
|
|
64
|
+
* console.log(`EQ filters: ${eqFilters.map(f => f.name).join(', ')}`);
|
|
65
|
+
*/
|
|
66
|
+
getFiltersByCategory(category: string): AudioFilter[];
|
|
67
|
+
/**
|
|
68
|
+
* Apply an audio filter to the player
|
|
69
|
+
*
|
|
70
|
+
* @param {string | AudioFilter} filter - Filter name or AudioFilter object
|
|
71
|
+
* @returns {Promise<boolean>} True if filter was applied successfully
|
|
72
|
+
* @example
|
|
73
|
+
* // Apply predefined filter to current track
|
|
74
|
+
* await player.applyFilter("bassboost");
|
|
75
|
+
*
|
|
76
|
+
* // Apply custom filter to current track
|
|
77
|
+
* await player.applyFilter({
|
|
78
|
+
* name: "custom",
|
|
79
|
+
* ffmpegFilter: "volume=1.5,treble=g=5",
|
|
80
|
+
* description: "Tăng âm lượng và âm cao"
|
|
81
|
+
* });
|
|
82
|
+
*
|
|
83
|
+
* // Apply filter without affecting current track
|
|
84
|
+
* await player.applyFilter("bassboost", false);
|
|
85
|
+
*/
|
|
86
|
+
applyFilter(filter?: string | AudioFilter): Promise<boolean>;
|
|
87
|
+
/**
|
|
88
|
+
* Apply multiple filters at once
|
|
89
|
+
*
|
|
90
|
+
* @param {(string | AudioFilter)[]} filters - Array of filter names or AudioFilter objects
|
|
91
|
+
* @returns {Promise<boolean>} True if all filters were applied successfully
|
|
92
|
+
* @example
|
|
93
|
+
* // Apply multiple filters to current track
|
|
94
|
+
* await player.applyFilters(["bassboost", "trebleboost"]);
|
|
95
|
+
*
|
|
96
|
+
* // Apply filters without affecting current track
|
|
97
|
+
* await player.applyFilters(["bassboost", "trebleboost"], false);
|
|
98
|
+
*/
|
|
99
|
+
applyFilters(filters: (string | AudioFilter)[]): Promise<boolean>;
|
|
100
|
+
/**
|
|
101
|
+
* Remove an audio filter from the player
|
|
102
|
+
*
|
|
103
|
+
* @param {string} filterName - Name of the filter to remove
|
|
104
|
+
* @returns {boolean} True if filter was removed successfully
|
|
105
|
+
* @example
|
|
106
|
+
* player.removeFilter("bassboost");
|
|
107
|
+
*/
|
|
108
|
+
removeFilter(filterName: string): Promise<boolean>;
|
|
109
|
+
/**
|
|
110
|
+
* Clear all audio filters from the player
|
|
111
|
+
*
|
|
112
|
+
* @returns {boolean} True if filters were cleared successfully
|
|
113
|
+
* @example
|
|
114
|
+
* player.clearFilters();
|
|
115
|
+
*/
|
|
116
|
+
clearAll(): Promise<boolean>;
|
|
117
|
+
/**
|
|
118
|
+
* Apply filters and seek to a stream
|
|
119
|
+
*
|
|
120
|
+
* @param {Readable} stream - The stream to apply filters and seek to
|
|
121
|
+
* @param {number} position - The position to seek to in milliseconds (default: 0)
|
|
122
|
+
* @returns {Promise<Readable>} The stream with filters and seek applied
|
|
123
|
+
*/
|
|
124
|
+
applyFiltersAndSeek(stream: Readable, position?: number): Promise<Readable>;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=FilterManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterManager.d.ts","sourceRoot":"","sources":["../../src/structures/FilterManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIvC,qBAAa,aAAa;IACzB,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAuB;IAC9B,UAAU,EAAE,WAAW,GAAG,UAAU,GAAG,KAAK,GAAG,WAAW,CAAS;gBAE9D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;IAUlD;;;;;;OAMG;IACH,OAAO,IAAI,IAAI;IAUf;;;;;;;OAOG;IACI,eAAe,IAAI,MAAM;IAKhC;;;;;;;OAOG;IACI,gBAAgB,IAAI,WAAW,EAAE;IAIxC;;;;;;;;OAQG;IACI,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI7C;;;;;;;OAOG;IACI,mBAAmB,IAAI,WAAW,EAAE;IAI3C;;;;;;;;OAQG;IACI,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE;IAI5D;;;;;;;;;;;;;;;;;;OAkBG;IACU,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBzE;;;;;;;;;;;OAWG;IACU,YAAY,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,WAAW,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ9E;;;;;;;OAOG;IACU,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW/D;;;;;;OAMG;IACU,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAOzC;;;;;;OAMG;IACU,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAE,MAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;CAmD5F"}
|