@discord-player/plugin-host 8.0.0-dev.0 → 8.0.0-dev.2
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 +199 -29
- package/dist/compat/base-extractor.d.ts +6 -0
- package/dist/compat/base-extractor.js.map +1 -1
- package/dist/compat/extractor-execution-context.js.map +1 -1
- package/dist/compat/extractor-plugin.js +109 -68
- package/dist/compat/extractor-plugin.js.map +1 -1
- package/dist/compat/utils.js.map +1 -1
- package/dist/errors.d.ts +0 -2
- package/dist/errors.js +0 -2
- package/dist/errors.js.map +1 -1
- package/dist/host.d.ts +24 -3
- package/dist/host.js +198 -50
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/legacy-player.d.ts +1 -1
- package/dist/lyrics.d.ts +56 -0
- package/dist/lyrics.js +110 -0
- package/dist/lyrics.js.map +1 -0
- package/dist/media.d.ts +15 -0
- package/dist/media.js +193 -0
- package/dist/media.js.map +1 -0
- package/dist/plugins/execution-options.d.ts +2 -0
- package/dist/plugins/operation-dispatch.js +30 -11
- package/dist/plugins/operation-dispatch.js.map +1 -1
- package/dist/plugins/plugin-error.js.map +1 -1
- package/dist/plugins/registry-internals.d.ts +2 -2
- package/dist/plugins/registry.d.ts +48 -6
- package/dist/plugins/registry.js +180 -18
- package/dist/plugins/registry.js.map +1 -1
- package/dist/plugins/stream-resolver.js +24 -4
- package/dist/plugins/stream-resolver.js.map +1 -1
- package/dist/plugins/types.d.ts +28 -23
- package/dist/plugins/types.js.map +1 -1
- package/dist/protocol.d.ts +43 -3
- package/dist/protocol.js +11 -1
- package/dist/protocol.js.map +1 -1
- package/dist/providers/lrclib.d.ts +120 -0
- package/dist/providers/lrclib.js +183 -0
- package/dist/providers/lrclib.js.map +1 -0
- package/dist/remote.d.ts +29 -0
- package/dist/remote.js +142 -0
- package/dist/remote.js.map +1 -0
- package/dist/runtime.d.ts +2 -8
- package/dist/runtime.js +42 -44
- package/dist/runtime.js.map +1 -1
- package/dist/structures/search-result.js.map +1 -1
- package/dist/structures/track-types.d.ts +7 -3
- package/dist/structures/track.d.ts +6 -11
- package/dist/structures/track.js +10 -10
- package/dist/structures/track.js.map +1 -1
- package/dist/types.d.ts +4 -4
- package/dist/utils/legacy-serialization-schemas.d.ts +12 -0
- package/dist/utils/serialization-schemas.d.ts +18 -0
- package/dist/utils/serialization-schemas.js +6 -1
- package/dist/utils/serialization-schemas.js.map +1 -1
- package/dist/utils/serialization.js.map +1 -1
- package/docs/remedia-contract.md +55 -0
- package/package.json +5 -4
package/dist/runtime.js
CHANGED
|
@@ -21,30 +21,14 @@ export class SourcePluginRuntime extends SafeEventEmitter {
|
|
|
21
21
|
super();
|
|
22
22
|
this.player = options.player ?? this;
|
|
23
23
|
this.options = options.player?.options ?? options;
|
|
24
|
-
this.plugins = new PluginRegistry(this.player, () => this.options.blockExtractors ?? []);
|
|
24
|
+
this.plugins = new PluginRegistry(this.player, () => this.options.blockExtractors ?? [], options.hostId);
|
|
25
25
|
this.extractors = new ExtractorExecutionContext(this.player);
|
|
26
26
|
}
|
|
27
|
-
/** Queue orchestration requires an actual DiscordPlayer. */
|
|
28
|
-
get queues() {
|
|
29
|
-
throw new Error('SourcePluginRuntime does not provide queues; use DiscordPlayer for playback');
|
|
30
|
-
}
|
|
31
|
-
/** Voice nodes require an actual DiscordPlayer. */
|
|
32
|
-
get nodes() {
|
|
33
|
-
throw new Error('SourcePluginRuntime does not provide voice nodes; use DiscordPlayer for playback');
|
|
34
|
-
}
|
|
35
|
-
/** Audio clients are unavailable in standalone source execution. */
|
|
36
|
-
get remedia() {
|
|
37
|
-
throw new Error('SourcePluginRuntime does not initialize a Remedia audio client');
|
|
38
|
-
}
|
|
39
27
|
getRemedia(throwOnMissing = true) {
|
|
40
28
|
if (throwOnMissing)
|
|
41
29
|
throw new Error('SourcePluginRuntime does not initialize an audio client; use DiscordPlayer');
|
|
42
30
|
return null;
|
|
43
31
|
}
|
|
44
|
-
/** Playback is outside the source compatibility API. */
|
|
45
|
-
play() {
|
|
46
|
-
throw new Error('SourcePluginRuntime cannot play audio; use DiscordPlayer');
|
|
47
|
-
}
|
|
48
32
|
/** Emit a source diagnostic.
|
|
49
33
|
* @param message Diagnostic text.
|
|
50
34
|
*/
|
|
@@ -74,45 +58,59 @@ export class SourcePluginRuntime extends SafeEventEmitter {
|
|
|
74
58
|
return new SearchResult({ tracks: query.tracks, playlist: query });
|
|
75
59
|
}
|
|
76
60
|
const blocked = [...(this.options.blockExtractors ?? []), ...(options.blockExtractors ?? [])];
|
|
77
|
-
const target = options.pluginId ?? (options.searchEngine?.startsWith('ext:') ? options.searchEngine.slice(4) : undefined);
|
|
78
61
|
await this.plugins.ready();
|
|
79
|
-
const
|
|
62
|
+
const engine = options.searchEngine;
|
|
63
|
+
const legacy = engine?.startsWith('ext:') ? engine.slice(4) : undefined;
|
|
64
|
+
if (legacy !== undefined && !this.extractors.get(legacy))
|
|
65
|
+
throw new Error(`Legacy extractor ${legacy} is not registered`);
|
|
66
|
+
const target = legacy ?? (engine && this.plugins.has(engine) ? engine : undefined);
|
|
67
|
+
const prefix = options.resolveCustomProtocols !== false && !/^(?:https?|file):/i.test(query) && !/^[a-z]:/i.test(query)
|
|
68
|
+
? /^([a-z][a-z0-9+.-]*):(?:\/\/)?(.*)$/is.exec(query)
|
|
69
|
+
: null;
|
|
80
70
|
const protocol = prefix && this.plugins.supportsProtocol(prefix[1], { pluginId: target, blocked }) ? prefix[1] : undefined;
|
|
71
|
+
const providerHint = target ? undefined : engine;
|
|
81
72
|
const input = {
|
|
82
73
|
query: protocol ? prefix[2] : query,
|
|
83
74
|
protocol,
|
|
75
|
+
providerHint,
|
|
84
76
|
options: {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
77
|
+
requestedBy: options.requestedBy,
|
|
78
|
+
requestOptions: options.requestOptions,
|
|
79
|
+
limit: options.limit,
|
|
80
|
+
blockExtractors: options.blockExtractors,
|
|
89
81
|
},
|
|
90
82
|
};
|
|
91
|
-
const execution = { signal: options.signal, blocked, pluginId: target };
|
|
83
|
+
const execution = { signal: options.signal, blocked, pluginId: target, hostId: options.hostId };
|
|
92
84
|
const matches = target
|
|
93
|
-
? [{ pluginId: target, score: 0 }]
|
|
94
|
-
:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
});
|
|
103
|
-
if (!result) {
|
|
104
|
-
return SearchResult.empty();
|
|
105
|
-
}
|
|
106
|
-
for (const track of result.tracks) {
|
|
107
|
-
track.sourceReference ??= {
|
|
85
|
+
? [{ pluginId: target, score: 0, hostId: options.hostId }]
|
|
86
|
+
: protocol
|
|
87
|
+
? this.plugins.protocolMatches(protocol, execution)
|
|
88
|
+
: await this.plugins.execute('search.query.match', input, execution);
|
|
89
|
+
for (const match of matches) {
|
|
90
|
+
if (!match?.pluginId || match.score < 0)
|
|
91
|
+
continue;
|
|
92
|
+
const result = await this.plugins.execute('search.query.resolve', input, {
|
|
93
|
+
...execution,
|
|
108
94
|
pluginId: match.pluginId,
|
|
109
|
-
|
|
110
|
-
};
|
|
111
|
-
if (
|
|
112
|
-
|
|
95
|
+
hostId: match.hostId ?? (target ? options.hostId : null),
|
|
96
|
+
});
|
|
97
|
+
if (!result?.tracks.length) {
|
|
98
|
+
if (target)
|
|
99
|
+
break;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
for (const track of result.tracks) {
|
|
103
|
+
track.sourceReference ??= {
|
|
104
|
+
pluginId: match.pluginId,
|
|
105
|
+
...(match.hostId ? { hostId: match.hostId } : {}),
|
|
106
|
+
data: { url: track.url },
|
|
107
|
+
};
|
|
108
|
+
if (options.requestedBy !== undefined)
|
|
109
|
+
track.requestedBy = options.requestedBy;
|
|
113
110
|
}
|
|
111
|
+
return new SearchResult(result);
|
|
114
112
|
}
|
|
115
|
-
return
|
|
113
|
+
return SearchResult.empty();
|
|
116
114
|
}
|
|
117
115
|
}
|
|
118
116
|
//# sourceMappingURL=runtime.js.map
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-result.js","sourceRoot":"","sources":["../../src/structures/search-result.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"search-result.js","sourceRoot":"","sources":["../../src/structures/search-result.ts"],"names":[],"mappings":"AAYA,oEAAoE;AACpE,MAAM,OAAO,YAAY;IAWa,IAAI;IAVxC,+CAA+C;IAC/B,MAAM,CAAU;IAEhC,kEAAkE;IAClD,QAAQ,CAAkB;IAE1C;;;OAGG;IACH,YAAoC,IAAsB;oBAAtB,IAAI;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,6EAA6E;IACtE,MAAM,CAAC,KAAK;QACjB,OAAO,IAAI,YAAY,CAAC;YACtB,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;IACL,CAAC;IAED,8CAA8C;IACvC,OAAO;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAClC,CAAC;IAQM,KAAK,CAAC,KAAc;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAChC,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SearchQueryType } from '../compat/query-types.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ProviderReference } from '../plugins/types.js';
|
|
3
3
|
import type { JSONValue, SerializedEntity, SERIALIZATION_SCHEMA_VERSION } from '../utils/serialization.js';
|
|
4
4
|
import type { Playlist, PlaylistData, PlaylistJSON } from './playlist.js';
|
|
5
5
|
/** Name or identifier for a Track's source integration. */
|
|
@@ -13,7 +13,9 @@ export type TrackRequester = string | {
|
|
|
13
13
|
/** Public metadata and optional portable source identity. */
|
|
14
14
|
export interface TrackData<Metadata = unknown> {
|
|
15
15
|
/** Portable provider payload; exclude secrets and live resources. */
|
|
16
|
-
sourceReference?:
|
|
16
|
+
sourceReference?: ProviderReference;
|
|
17
|
+
/** Optional portable lyrics provider affinity. */
|
|
18
|
+
lyricsReference?: ProviderReference;
|
|
17
19
|
/** Process-local legacy data, never persisted. */
|
|
18
20
|
raw?: Record<string, any>;
|
|
19
21
|
/** Legacy source location or engine object, never persisted. */
|
|
@@ -92,7 +94,9 @@ export interface TrackJSON<Metadata = unknown> extends TrackData<Metadata> {
|
|
|
92
94
|
/** Public Track fields stored by the versioned persistence format. */
|
|
93
95
|
export type SerializedTrackData = {
|
|
94
96
|
/** Optional provider identity, absent in older version 1 payloads. */
|
|
95
|
-
sourceReference?:
|
|
97
|
+
sourceReference?: ProviderReference;
|
|
98
|
+
/** Optional portable lyrics provider affinity. */
|
|
99
|
+
lyricsReference?: ProviderReference;
|
|
96
100
|
/** Stable Track identifier. */
|
|
97
101
|
id: string;
|
|
98
102
|
/** Display title. */
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { TrackData, TrackJSON, TrackRequester, TrackSource, SerializedTrack } from './track-types.js';
|
|
2
2
|
import type { LegacyPlayerContext } from '../legacy-player.js';
|
|
3
3
|
import type { BaseExtractor, SearchQueryType } from '../compat/extractors.js';
|
|
4
|
-
import type {
|
|
5
|
-
import type { MediaSource } from '@remedia/client';
|
|
4
|
+
import type { ProviderReference } from '../plugins/types.js';
|
|
6
5
|
import { type Serializable } from '../utils/serialization.js';
|
|
7
6
|
import { Playlist } from './playlist.js';
|
|
8
7
|
export type * from './track-types.js';
|
|
@@ -33,7 +32,11 @@ export declare class Track<Metadata = unknown> implements Serializable<Serialize
|
|
|
33
32
|
/** Playlist containing this track, when present. */
|
|
34
33
|
playlist: Playlist | null;
|
|
35
34
|
/** Portable source identity used by the plugin host. */
|
|
36
|
-
sourceReference?:
|
|
35
|
+
sourceReference?: ProviderReference;
|
|
36
|
+
/** Optional portable lyrics provider affinity. */
|
|
37
|
+
lyricsReference?: ProviderReference;
|
|
38
|
+
/** Opaque, expiring host state hint. Excluded from toJSON() and serialize(); retain only in memory. */
|
|
39
|
+
sourceState?: string;
|
|
37
40
|
/** Process-local v7 raw payload. Never serialized. */
|
|
38
41
|
readonly raw: Record<string, any>;
|
|
39
42
|
/** Legacy query hint. */
|
|
@@ -98,14 +101,6 @@ export declare class Track<Metadata = unknown> implements Serializable<Serialize
|
|
|
98
101
|
* @returns The same Track reference with a different metadata type.
|
|
99
102
|
*/
|
|
100
103
|
asMetadata<NewMetadata>(): Track<NewMetadata>;
|
|
101
|
-
/** Deprecated compatibility stub. Playback resolves sources through player.plugins.
|
|
102
|
-
* @param options Unused cancellation options.
|
|
103
|
-
* @returns Always rejects; register a source plugin instead.
|
|
104
|
-
* @deprecated Use player.plugins.resolveStream(track).
|
|
105
|
-
*/
|
|
106
|
-
getStreamableSource(options?: {
|
|
107
|
-
signal?: AbortSignal;
|
|
108
|
-
}): Promise<MediaSource>;
|
|
109
104
|
/** Format the Track as `title by author`, omitting the author when empty. */
|
|
110
105
|
toString(): string;
|
|
111
106
|
/** Format the Track title as a Markdown hyperlink to its source URL. */
|
package/dist/structures/track.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { SerializationError
|
|
2
|
+
import { SerializationError } from '../errors.js';
|
|
3
3
|
import { cloneJSONValue, SERIALIZATION_SCHEMA_VERSION } from '../utils/serialization.js';
|
|
4
4
|
import { Playlist } from './playlist.js';
|
|
5
5
|
function parseDuration(value) {
|
|
@@ -67,6 +67,10 @@ export class Track {
|
|
|
67
67
|
playlist;
|
|
68
68
|
/** Portable source identity used by the plugin host. */
|
|
69
69
|
sourceReference;
|
|
70
|
+
/** Optional portable lyrics provider affinity. */
|
|
71
|
+
lyricsReference;
|
|
72
|
+
/** Opaque, expiring host state hint. Excluded from toJSON() and serialize(); retain only in memory. */
|
|
73
|
+
sourceState;
|
|
70
74
|
/** Process-local v7 raw payload. Never serialized. */
|
|
71
75
|
raw;
|
|
72
76
|
/** Legacy query hint. */
|
|
@@ -113,6 +117,7 @@ export class Track {
|
|
|
113
117
|
const data = legacyData ?? input;
|
|
114
118
|
this.player = legacyData ? input : undefined;
|
|
115
119
|
this.sourceReference = data.sourceReference;
|
|
120
|
+
this.lyricsReference = data.lyricsReference;
|
|
116
121
|
this.raw = { ...data, ...data.raw };
|
|
117
122
|
this.queryType = data.queryType;
|
|
118
123
|
this.cleanTitle = data.cleanTitle ?? data.title ?? '';
|
|
@@ -170,15 +175,6 @@ export class Track {
|
|
|
170
175
|
asMetadata() {
|
|
171
176
|
return this;
|
|
172
177
|
}
|
|
173
|
-
/** Deprecated compatibility stub. Playback resolves sources through player.plugins.
|
|
174
|
-
* @param options Unused cancellation options.
|
|
175
|
-
* @returns Always rejects; register a source plugin instead.
|
|
176
|
-
* @deprecated Use player.plugins.resolveStream(track).
|
|
177
|
-
*/
|
|
178
|
-
async getStreamableSource(options) {
|
|
179
|
-
void options;
|
|
180
|
-
throw new SourceUnavailableError(this.title || this.id);
|
|
181
|
-
}
|
|
182
178
|
/** Format the Track as `title by author`, omitting the author when empty. */
|
|
183
179
|
toString() {
|
|
184
180
|
return this.author ? `${this.title} by ${this.author}` : this.title;
|
|
@@ -207,6 +203,7 @@ export class Track {
|
|
|
207
203
|
live: this.live,
|
|
208
204
|
metadata: this.player ? null : this.trackMetadata,
|
|
209
205
|
sourceReference: this.sourceReference,
|
|
206
|
+
lyricsReference: this.lyricsReference,
|
|
210
207
|
playlist: hidePlaylist ? null : (this.playlist?.toJSON(false) ?? null),
|
|
211
208
|
};
|
|
212
209
|
}
|
|
@@ -233,6 +230,9 @@ export class Track {
|
|
|
233
230
|
source: this.source,
|
|
234
231
|
live,
|
|
235
232
|
metadata: this.player || this.trackMetadata === null ? null : cloneJSONValue(this.trackMetadata, '$.data.metadata'),
|
|
233
|
+
...(this.lyricsReference
|
|
234
|
+
? { lyricsReference: { ...this.lyricsReference, data: cloneJSONValue(this.lyricsReference.data) } }
|
|
235
|
+
: {}),
|
|
236
236
|
...(this.sourceReference
|
|
237
237
|
? {
|
|
238
238
|
sourceReference: cloneJSONValue(this.sourceReference, '$.data.sourceReference'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track.js","sourceRoot":"","sources":["../../src/structures/track.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"track.js","sourceRoot":"","sources":["../../src/structures/track.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -6,10 +6,12 @@ import type { RequestOptions } from 'node:http';
|
|
|
6
6
|
export type MediaResource = string | Track | Track[] | Playlist | SearchResult;
|
|
7
7
|
/** Source search and compatibility options. */
|
|
8
8
|
export interface SearchOptions {
|
|
9
|
-
/**
|
|
10
|
-
|
|
9
|
+
/** Explicit standalone deployment ID; interpreted by DiscordPlayer, never a local provider ID. */
|
|
10
|
+
hostId?: string;
|
|
11
11
|
/** Legacy type hint or ext:identifier targeting. */
|
|
12
12
|
searchEngine?: string;
|
|
13
|
+
/** Resolve registered custom prefixes before dispatch; defaults to true. */
|
|
14
|
+
resolveCustomProtocols?: boolean;
|
|
13
15
|
/** Structural requester. */
|
|
14
16
|
requestedBy?: TrackRequester | null;
|
|
15
17
|
/** Legacy local request options. */
|
|
@@ -18,8 +20,6 @@ export interface SearchOptions {
|
|
|
18
20
|
signal?: AbortSignal;
|
|
19
21
|
/** Additional disabled provider IDs. */
|
|
20
22
|
blockExtractors?: readonly string[];
|
|
21
|
-
/** Source query type hint. */
|
|
22
|
-
source?: string;
|
|
23
23
|
/** Maximum number of results requested from a source plugin. */
|
|
24
24
|
limit?: number;
|
|
25
25
|
}
|
|
@@ -80,6 +80,12 @@ export declare const legacyPlaylistSchema: z.ZodPipe<z.ZodObject<{
|
|
|
80
80
|
metadata: z.ZodJSONSchema;
|
|
81
81
|
sourceReference: z.ZodOptional<z.ZodObject<{
|
|
82
82
|
pluginId: z.ZodString;
|
|
83
|
+
hostId: z.ZodOptional<z.ZodString>;
|
|
84
|
+
data: z.ZodJSONSchema;
|
|
85
|
+
}, z.core.$strict>>;
|
|
86
|
+
lyricsReference: z.ZodOptional<z.ZodObject<{
|
|
87
|
+
pluginId: z.ZodString;
|
|
88
|
+
hostId: z.ZodOptional<z.ZodString>;
|
|
83
89
|
data: z.ZodJSONSchema;
|
|
84
90
|
}, z.core.$strict>>;
|
|
85
91
|
}, z.core.$strict>;
|
|
@@ -157,6 +163,12 @@ export declare const legacyPlaylistSchema: z.ZodPipe<z.ZodObject<{
|
|
|
157
163
|
metadata: z.JSONType;
|
|
158
164
|
sourceReference?: {
|
|
159
165
|
pluginId: string;
|
|
166
|
+
hostId?: string | undefined;
|
|
167
|
+
data: z.JSONType;
|
|
168
|
+
} | undefined;
|
|
169
|
+
lyricsReference?: {
|
|
170
|
+
pluginId: string;
|
|
171
|
+
hostId?: string | undefined;
|
|
160
172
|
data: z.JSONType;
|
|
161
173
|
} | undefined;
|
|
162
174
|
};
|
|
@@ -20,6 +20,12 @@ export declare const trackSchema: z.ZodObject<{
|
|
|
20
20
|
metadata: z.ZodJSONSchema;
|
|
21
21
|
sourceReference: z.ZodOptional<z.ZodObject<{
|
|
22
22
|
pluginId: z.ZodString;
|
|
23
|
+
hostId: z.ZodOptional<z.ZodString>;
|
|
24
|
+
data: z.ZodJSONSchema;
|
|
25
|
+
}, z.core.$strict>>;
|
|
26
|
+
lyricsReference: z.ZodOptional<z.ZodObject<{
|
|
27
|
+
pluginId: z.ZodString;
|
|
28
|
+
hostId: z.ZodOptional<z.ZodString>;
|
|
23
29
|
data: z.ZodJSONSchema;
|
|
24
30
|
}, z.core.$strict>>;
|
|
25
31
|
}, z.core.$strict>;
|
|
@@ -43,6 +49,12 @@ export declare const versionedSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
43
49
|
metadata: z.ZodJSONSchema;
|
|
44
50
|
sourceReference: z.ZodOptional<z.ZodObject<{
|
|
45
51
|
pluginId: z.ZodString;
|
|
52
|
+
hostId: z.ZodOptional<z.ZodString>;
|
|
53
|
+
data: z.ZodJSONSchema;
|
|
54
|
+
}, z.core.$strict>>;
|
|
55
|
+
lyricsReference: z.ZodOptional<z.ZodObject<{
|
|
56
|
+
pluginId: z.ZodString;
|
|
57
|
+
hostId: z.ZodOptional<z.ZodString>;
|
|
46
58
|
data: z.ZodJSONSchema;
|
|
47
59
|
}, z.core.$strict>>;
|
|
48
60
|
}, z.core.$strict>;
|
|
@@ -82,6 +94,12 @@ export declare const versionedSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
82
94
|
metadata: z.ZodJSONSchema;
|
|
83
95
|
sourceReference: z.ZodOptional<z.ZodObject<{
|
|
84
96
|
pluginId: z.ZodString;
|
|
97
|
+
hostId: z.ZodOptional<z.ZodString>;
|
|
98
|
+
data: z.ZodJSONSchema;
|
|
99
|
+
}, z.core.$strict>>;
|
|
100
|
+
lyricsReference: z.ZodOptional<z.ZodObject<{
|
|
101
|
+
pluginId: z.ZodString;
|
|
102
|
+
hostId: z.ZodOptional<z.ZodString>;
|
|
85
103
|
data: z.ZodJSONSchema;
|
|
86
104
|
}, z.core.$strict>>;
|
|
87
105
|
}, z.core.$strict>;
|
|
@@ -2,7 +2,11 @@ import { z } from 'zod';
|
|
|
2
2
|
import { SERIALIZATION_SCHEMA_VERSION } from './serialization.js';
|
|
3
3
|
/** Shared finite non-negative numeric constraint. */
|
|
4
4
|
export const nonNegative = z.number().nonnegative();
|
|
5
|
-
const sourceReferenceSchema = z.strictObject({
|
|
5
|
+
const sourceReferenceSchema = z.strictObject({
|
|
6
|
+
pluginId: z.string(),
|
|
7
|
+
hostId: z.string().min(1).max(128).optional(),
|
|
8
|
+
data: z.json(),
|
|
9
|
+
});
|
|
6
10
|
const authorSchema = z.strictObject({ name: z.string(), url: z.string() });
|
|
7
11
|
const trackDataSchema = z.strictObject({
|
|
8
12
|
id: z.string(),
|
|
@@ -18,6 +22,7 @@ const trackDataSchema = z.strictObject({
|
|
|
18
22
|
live: z.boolean(),
|
|
19
23
|
metadata: z.json(),
|
|
20
24
|
sourceReference: sourceReferenceSchema.optional(),
|
|
25
|
+
lyricsReference: sourceReferenceSchema.optional(),
|
|
21
26
|
});
|
|
22
27
|
/** Strict versioned Track persistence schema. */
|
|
23
28
|
export const trackSchema = z.strictObject({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization-schemas.js","sourceRoot":"","sources":["../../src/utils/serialization-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAElE,qDAAqD;AACrD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;AAEpD,MAAM,qBAAqB,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"serialization-schemas.js","sourceRoot":"","sources":["../../src/utils/serialization-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAElE,qDAAqD;AACrD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;AAEpD,MAAM,qBAAqB,GAAG,CAAC,CAAC,YAAY,CAAC;IAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC7C,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;CACf,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAE3E,MAAM,eAAe,GAAG,CAAC,CAAC,YAAY,CAAC;IACrC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,WAAW;IAClB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE;IAClB,eAAe,EAAE,qBAAqB,CAAC,QAAQ,EAAE;IACjD,eAAe,EAAE,qBAAqB,CAAC,QAAQ,EAAE;CAClD,CAAC,CAAC;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,YAAY,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACxB,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,iDAAiD,EAAE,CAAC;IAC9G,IAAI,EAAE,eAAe;CACtB,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,CAAC,YAAY,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC;IACjH,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC;QACnB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;KAC7B,CAAC;CACH,CAAC,CAAC;AAEH,gDAAgD;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../../src/utils/serialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAQlD,4FAA4F;AAC5F,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../../src/utils/serialization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Remedia source-host integration
|
|
2
|
+
|
|
3
|
+
Supported with published `@remedia/client@0.1.0-dev.7`, `@remedia/plugin-host@0.1.0-dev.7`,
|
|
4
|
+
and the matching Remedia server.
|
|
5
|
+
|
|
6
|
+
The standalone adapter exposes `GET /.well-known/remedia` and
|
|
7
|
+
`POST /remedia/v1/execute`. Its aggregate plugin ID is `discord-player.source`;
|
|
8
|
+
operations are `source.search`, `metadata.execute`, `source.related`, and `source.stream`.
|
|
9
|
+
Discovery names are display labels. Stable deployment `hostId` values belong in
|
|
10
|
+
operator configuration and in each Track's portable source reference.
|
|
11
|
+
|
|
12
|
+
Configure a client plugin with `definePlugin({ id, remoteHost: { hostId, url, token?, timeoutMs? } })`, then pass its factory registration in `Player({ plugins: [remotePlugin()], ... })`.
|
|
13
|
+
The bot performs metadata operations, reconstructing canonical Tracks with
|
|
14
|
+
`deserializeSourceResult()`. It sends remote playback and staged-next sources as:
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
const source: OperationMediaSource = {
|
|
18
|
+
hostId: track.sourceReference!.hostId!,
|
|
19
|
+
pluginId: SOURCE_PLUGIN_ID,
|
|
20
|
+
operation: 'source.stream',
|
|
21
|
+
input: { track: serializeSourceTrack(track) },
|
|
22
|
+
};
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`OperationMediaSource` is exported by `@remedia/client`. Configure the same host ID,
|
|
26
|
+
endpoint, authentication and allowed operation on the server's `pluginHosts` list.
|
|
27
|
+
The server advertises `capabilities.pluginOperations`; session creation accepts
|
|
28
|
+
`pluginHosts` requirements. Both play and stage reject incompatible assignments.
|
|
29
|
+
No local provider fallback or automatic guild movement is performed.
|
|
30
|
+
|
|
31
|
+
Remedia executes source operations during native preparation, fetches and decodes
|
|
32
|
+
single-use encoded media grants once, and owns playback/stage cancellation. It never
|
|
33
|
+
reopens a grant: replaying a queue entry runs the operation again. Credentials are origin-bound configuration, never Track data.
|
|
34
|
+
`serializeSourceTrack()` carries transient state for operations; persistent
|
|
35
|
+
`Track.serialize()` omits it and preserves durable provider/deployment identity.
|
|
36
|
+
Expired state is reconstructed on the standalone host when possible.
|
|
37
|
+
|
|
38
|
+
See the [complete deployment example](https://discord-player.js.org/docs/plugins/remote-hosts).
|
|
39
|
+
|
|
40
|
+
## Media probing, Range and reopening
|
|
41
|
+
|
|
42
|
+
Real HTTP tests in this repository generate MP3, Ogg/Opus and faststart M4A and run
|
|
43
|
+
FFmpeg against the published middleware. Default FFmpeg probing fails with HTTP
|
|
44
|
+
416 because FFmpeg requests `Range: bytes=0-` and v1 rejects any Range request.
|
|
45
|
+
Explicit `-seekable 0` decodes all three formats sequentially. This is not proof of
|
|
46
|
+
Discord voice playback, Rust playback, seeking, reconnects or recovery. Small
|
|
47
|
+
MP4/M4A files with a trailing moov atom may happen to fit FFmpeg's internal buffers;
|
|
48
|
+
large or interleaved files can require seeking and must not be advertised as safe.
|
|
49
|
+
|
|
50
|
+
Remedia dev.7's generic operation path treats host grants as single-use encoded
|
|
51
|
+
inputs, redeems each with one plain GET (no Range, reopen or reconnect), supports
|
|
52
|
+
forward-only seeking, and owns native decoding. Replay re-executes the operation. A grant is not a
|
|
53
|
+
seekable durable URL. Source providers must support reconstruction/reopening for
|
|
54
|
+
recovery; do not advertise arbitrary random-access or tail-moov M4A support from
|
|
55
|
+
the sequential fixture test alone.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@discord-player/plugin-host",
|
|
3
|
-
"version": "8.0.0-dev.
|
|
3
|
+
"version": "8.0.0-dev.2",
|
|
4
4
|
"description": "Standalone Discord Player source runtime and Remedia plugin protocol adapter",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"api",
|
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
"url": "git+https://github.com/Androz2091/discord-player.git"
|
|
30
30
|
},
|
|
31
31
|
"files": [
|
|
32
|
-
"dist"
|
|
32
|
+
"dist",
|
|
33
|
+
"docs/remedia-contract.md"
|
|
33
34
|
],
|
|
34
35
|
"type": "module",
|
|
35
36
|
"main": "dist/index.js",
|
|
@@ -42,8 +43,8 @@
|
|
|
42
43
|
},
|
|
43
44
|
"dependencies": {
|
|
44
45
|
"@discordjs/collection": "^2.1.1",
|
|
45
|
-
"@remedia/client": "0.1.0-dev.
|
|
46
|
-
"@remedia/plugin-host": "0.1.0-dev.
|
|
46
|
+
"@remedia/client": "0.1.0-dev.7",
|
|
47
|
+
"@remedia/plugin-host": "0.1.0-dev.7",
|
|
47
48
|
"zod": "^4.6.7"
|
|
48
49
|
},
|
|
49
50
|
"devDependencies": {
|