@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.
Files changed (60) hide show
  1. package/README.md +199 -29
  2. package/dist/compat/base-extractor.d.ts +6 -0
  3. package/dist/compat/base-extractor.js.map +1 -1
  4. package/dist/compat/extractor-execution-context.js.map +1 -1
  5. package/dist/compat/extractor-plugin.js +109 -68
  6. package/dist/compat/extractor-plugin.js.map +1 -1
  7. package/dist/compat/utils.js.map +1 -1
  8. package/dist/errors.d.ts +0 -2
  9. package/dist/errors.js +0 -2
  10. package/dist/errors.js.map +1 -1
  11. package/dist/host.d.ts +24 -3
  12. package/dist/host.js +198 -50
  13. package/dist/host.js.map +1 -1
  14. package/dist/index.d.ts +5 -0
  15. package/dist/index.js +2 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/legacy-player.d.ts +1 -1
  18. package/dist/lyrics.d.ts +56 -0
  19. package/dist/lyrics.js +110 -0
  20. package/dist/lyrics.js.map +1 -0
  21. package/dist/media.d.ts +15 -0
  22. package/dist/media.js +193 -0
  23. package/dist/media.js.map +1 -0
  24. package/dist/plugins/execution-options.d.ts +2 -0
  25. package/dist/plugins/operation-dispatch.js +30 -11
  26. package/dist/plugins/operation-dispatch.js.map +1 -1
  27. package/dist/plugins/plugin-error.js.map +1 -1
  28. package/dist/plugins/registry-internals.d.ts +2 -2
  29. package/dist/plugins/registry.d.ts +48 -6
  30. package/dist/plugins/registry.js +180 -18
  31. package/dist/plugins/registry.js.map +1 -1
  32. package/dist/plugins/stream-resolver.js +24 -4
  33. package/dist/plugins/stream-resolver.js.map +1 -1
  34. package/dist/plugins/types.d.ts +28 -23
  35. package/dist/plugins/types.js.map +1 -1
  36. package/dist/protocol.d.ts +43 -3
  37. package/dist/protocol.js +11 -1
  38. package/dist/protocol.js.map +1 -1
  39. package/dist/providers/lrclib.d.ts +120 -0
  40. package/dist/providers/lrclib.js +183 -0
  41. package/dist/providers/lrclib.js.map +1 -0
  42. package/dist/remote.d.ts +29 -0
  43. package/dist/remote.js +142 -0
  44. package/dist/remote.js.map +1 -0
  45. package/dist/runtime.d.ts +2 -8
  46. package/dist/runtime.js +42 -44
  47. package/dist/runtime.js.map +1 -1
  48. package/dist/structures/search-result.js.map +1 -1
  49. package/dist/structures/track-types.d.ts +7 -3
  50. package/dist/structures/track.d.ts +6 -11
  51. package/dist/structures/track.js +10 -10
  52. package/dist/structures/track.js.map +1 -1
  53. package/dist/types.d.ts +4 -4
  54. package/dist/utils/legacy-serialization-schemas.d.ts +12 -0
  55. package/dist/utils/serialization-schemas.d.ts +18 -0
  56. package/dist/utils/serialization-schemas.js +6 -1
  57. package/dist/utils/serialization-schemas.js.map +1 -1
  58. package/dist/utils/serialization.js.map +1 -1
  59. package/docs/remedia-contract.md +55 -0
  60. package/package.json +5 -4
package/dist/errors.js CHANGED
@@ -4,8 +4,6 @@ export const DiscordPlayerErrorCode = {
4
4
  QueueCapacity: 'ERR_QUEUE_CAPACITY',
5
5
  /** A required queue, session, or track could not be resolved. */
6
6
  NoResult: 'ERR_NO_RESULT',
7
- /** The installed Remedia client does not provide a requested capability. */
8
- UnsupportedRemediaCapability: 'ERR_UNSUPPORTED_REMEDIA_CAPABILITY',
9
7
  /** A track has no source plugin to resolve a Remedia source. */
10
8
  SourceUnavailable: 'ERR_SOURCE_UNAVAILABLE',
11
9
  /** Data could not be serialized or reconstructed. */
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,wDAAwD;IACxD,aAAa,EAAE,oBAAoB;IACnC,iEAAiE;IACjE,QAAQ,EAAE,eAAe;IACzB,4EAA4E;IAC5E,4BAA4B,EAAE,oCAAoC;IAClE,gEAAgE;IAChE,iBAAiB,EAAE,wBAAwB;IAC3C,qDAAqD;IACrD,aAAa,EAAE,mBAAmB;CAC1B,CAAC;AAKX,8DAA8D;AAC9D,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,0CAA0C;IAC1B,IAAI,CAAyB;IAE7C;;;;;OAKG;IACH;IACE,kCAAkC;IAClC,OAAe;IACf,oCAAoC;IACpC,IAA4B;IAC5B,uCAAuC;IACvC,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,uFAAuF;AACvF,MAAM,OAAO,sBAAuB,SAAQ,kBAAkB;IAC5D;;;OAGG;IACH;IACE,4DAA4D;IAC5D,KAAa;QAEb,KAAK,CAAC,mDAAmD,KAAK,IAAI,EAAE,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;IAChH,CAAC;CACF;AAED,4EAA4E;AAC5E,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IACxD;;;;OAIG;IACH;IACE,4CAA4C;IAC5C,OAAO,GAAG,uDAAuD;IACjE,uCAAuC;IACvC,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,sBAAsB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,wDAAwD;IACxD,aAAa,EAAE,oBAAoB;IACnC,iEAAiE;IACjE,QAAQ,EAAE,eAAe;IACzB,gEAAgE;IAChE,iBAAiB,EAAE,wBAAwB;IAC3C,qDAAqD;IACrD,aAAa,EAAE,mBAAmB;CAC1B,CAAC;AAKX,8DAA8D;AAC9D,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,0CAA0C;IAC1B,IAAI,CAAyB;IAE7C;;;;;OAKG;IACH;IACE,kCAAkC;IAClC,OAAe;IACf,oCAAoC;IACpC,IAA4B;IAC5B,uCAAuC;IACvC,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,uFAAuF;AACvF,MAAM,OAAO,sBAAuB,SAAQ,kBAAkB;IAC5D;;;OAGG;IACH;IACE,4DAA4D;IAC5D,KAAa;QAEb,KAAK,CAAC,mDAAmD,KAAK,IAAI,EAAE,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;IAChH,CAAC;CACF;AAED,4EAA4E;AAC5E,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IACxD;;;;OAIG;IACH;IACE,4CAA4C;IAC5C,OAAO,GAAG,uDAAuD;IACjE,uCAAuC;IACvC,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,sBAAsB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;CACF"}
package/dist/host.d.ts CHANGED
@@ -1,12 +1,27 @@
1
+ import { type MediaAccessPolicy } from './media.js';
1
2
  import { type PluginHostOptions, type PluginRequest, type ExecuteResult } from '@remedia/plugin-host';
2
3
  import { SourcePluginRuntime, type SourcePluginRuntimeOptions } from './runtime.js';
3
4
  /** Stable aggregate protocol registration identifier. */
4
5
  export declare const SOURCE_PLUGIN_ID = "discord-player.source";
5
6
  /** Standalone source host configuration. */
6
7
  export interface SourcePluginHostOptions extends PluginHostOptions, Omit<SourcePluginRuntimeOptions, 'player'> {
7
- /** Maximum retained process-local Track references; default 10000. */
8
+ /** Stable non-secret deployment ID. Required for HTTP; generated only for local handle() usage. */
9
+ hostId?: string;
10
+ /** Return provider URLs directly when no byte transforms are needed. Default proxy.
11
+ * Opt in only when the consuming node can enforce its own DNS/redirect policy and access these URLs.
12
+ * Declared URL-only providers resolve at source.stream invocation; all byte sources remain deferred.
13
+ */
14
+ mediaDelivery?: 'proxy' | 'direct-url';
15
+ /** Providers guaranteed to return only URLs without opening byte resources during track.stream.
16
+ * Required for direct URL optimization; other providers stay lazy. Applicable transforms always force proxying.
17
+ * A provider that violates this promise fails explicitly; legacy and mixed-source providers should be omitted.
18
+ */
19
+ directUrlProviders?: readonly string[];
20
+ /** Remote materialization policy; files and private networks are denied by default. */
21
+ mediaPolicy?: MediaAccessPolicy;
22
+ /** Maximum retained process-local Track references; default 1000. */
8
23
  maxTrackStates?: number;
9
- /** State lifetime in milliseconds; default one hour. Expired tracks are reconstructed by URL. */
24
+ /** State lifetime in milliseconds; default ten minutes. Expired tracks are reconstructed by URL. */
10
25
  trackStateTtlMs?: number;
11
26
  }
12
27
  /** Source runtime and the published Remedia transport sharing one set of handlers. */
@@ -19,6 +34,11 @@ export declare class SourcePluginHost {
19
34
  readonly extractors: import("./index.js").ExtractorExecutionContext;
20
35
  /** Underlying generic host; exposes discovery, middleware matching and transport. */
21
36
  readonly remedia: import("@remedia/plugin-host").PluginHost<import("@remedia/plugin-host").PluginOperations>;
37
+ /** Stable deployment identity, independent of provider identifiers and network addresses. */
38
+ readonly hostId: string;
39
+ private readonly mediaPolicy;
40
+ private readonly sweep;
41
+ private readonly explicitHostId;
22
42
  private boundary;
23
43
  private states;
24
44
  private ttl;
@@ -33,12 +53,13 @@ export declare class SourcePluginHost {
33
53
  private prune;
34
54
  private portable;
35
55
  private restore;
56
+ private assertHost;
36
57
  /** Execute directly without serialization; caller owns returned media.
37
58
  * @param request Generic Remedia request targeting discord-player.source.
38
59
  */
39
60
  handle(request: PluginRequest): Promise<ExecuteResult>;
40
61
  /** Execute HTTP through Remedia's transport and the same operation handlers.
41
- * @param request Fetch request.
62
+ * @param request Fetch request. An explicitly configured hostId is required even without publicUrl.
42
63
  */
43
64
  fetch(request: Request): Promise<Response>;
44
65
  /** Identify Remedia routes for Node middleware.
package/dist/host.js CHANGED
@@ -1,11 +1,13 @@
1
+ import { normalizeLyrics } from './lyrics.js';
2
+ import { authorizeMediaURL, openMedia } from './media.js';
1
3
  import { AsyncLocalStorage } from 'node:async_hooks';
2
4
  import { randomUUID } from 'node:crypto';
3
- import { createReadStream } from 'node:fs';
4
- import { Readable } from 'node:stream';
5
5
  import { createMediaSource, createPluginHost, } from '@remedia/plugin-host';
6
6
  import { SourcePluginRuntime } from './runtime.js';
7
7
  import { Track } from './structures/track.js';
8
8
  import { deserialize } from './utils/serde.js';
9
+ import { DeferredSourceRequired } from './plugins/stream-resolver.js';
10
+ import { serializeSourceTrack } from './protocol.js';
9
11
  import { cloneJSONValue } from './utils/serialization.js';
10
12
  /** Stable aggregate protocol registration identifier. */
11
13
  export const SOURCE_PLUGIN_ID = 'discord-player.source';
@@ -19,6 +21,11 @@ export class SourcePluginHost {
19
21
  extractors;
20
22
  /** Underlying generic host; exposes discovery, middleware matching and transport. */
21
23
  remedia;
24
+ /** Stable deployment identity, independent of provider identifiers and network addresses. */
25
+ hostId;
26
+ mediaPolicy;
27
+ sweep;
28
+ explicitHostId;
22
29
  boundary = new AsyncLocalStorage();
23
30
  states = new Map();
24
31
  ttl;
@@ -27,18 +34,72 @@ export class SourcePluginHost {
27
34
  * @param options Transport and source settings.
28
35
  */
29
36
  constructor(options) {
30
- this.ttl = options.trackStateTtlMs ?? 3600000;
31
- this.capacity = options.maxTrackStates ?? 10000;
37
+ this.ttl = options.trackStateTtlMs ?? 600000;
38
+ this.capacity = options.maxTrackStates ?? 1000;
32
39
  if (!Number.isSafeInteger(this.ttl) || this.ttl < 1 || !Number.isSafeInteger(this.capacity) || this.capacity < 1) {
33
40
  throw new RangeError('Track state limits must be positive safe integers.');
34
41
  }
35
- this.runtime = new SourcePluginRuntime(options);
42
+ this.explicitHostId = options.hostId !== undefined;
43
+ if (options.publicUrl !== undefined && !this.explicitHostId)
44
+ throw new TypeError('HTTP source hosts require an explicit hostId');
45
+ this.hostId = options.hostId ?? randomUUID();
46
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$/.test(this.hostId))
47
+ throw new TypeError('Invalid hostId');
48
+ this.mediaPolicy = { ...options.mediaPolicy };
49
+ this.remedia = createPluginHost(options);
50
+ this.runtime = new SourcePluginRuntime({ ...options, hostId: this.hostId });
51
+ this.sweep = setInterval(() => this.prune(), Math.max(1000, Math.min(this.ttl, 30000)));
52
+ this.sweep.unref();
36
53
  this.plugins = this.runtime.plugins;
37
54
  this.extractors = this.runtime.extractors;
38
- this.remedia = createPluginHost(options);
39
55
  this.remedia.register({
40
56
  id: SOURCE_PLUGIN_ID,
41
57
  operations: {
58
+ 'metadata.execute': async (input, { signal }) => {
59
+ const request = this.record(input);
60
+ if (typeof request.providerId !== 'string')
61
+ throw new TypeError('providerId is required');
62
+ if (request.operation === 'search.query.resolve' || request.operation === 'search.query.match') {
63
+ const query = this.record(request.input);
64
+ if (typeof query.query !== 'string')
65
+ throw new TypeError('query must be a string');
66
+ const normalized = {
67
+ query: query.query,
68
+ options: this.searchOptions(query.options),
69
+ ...(typeof query.protocol === 'string' ? { protocol: query.protocol } : {}),
70
+ ...(typeof query.providerHint === 'string' ? { providerHint: query.providerHint } : {}),
71
+ };
72
+ if (request.operation === 'search.query.match')
73
+ return this.plugins.execute('search.query.match', normalized, { pluginId: request.providerId, signal });
74
+ const result = await this.plugins.execute('search.query.resolve', normalized, {
75
+ pluginId: request.providerId,
76
+ signal,
77
+ });
78
+ return result
79
+ ? this.boundary.getStore()
80
+ ? this.portable(result)
81
+ : result
82
+ : { tracks: [], playlist: null };
83
+ }
84
+ if (request.operation === 'track.related') {
85
+ const track = await this.restore(this.record(request.input).track, signal);
86
+ const result = await this.plugins.execute('track.related', { track }, { pluginId: request.providerId, signal });
87
+ return result
88
+ ? this.boundary.getStore()
89
+ ? this.portable(result)
90
+ : result
91
+ : { tracks: [], playlist: null };
92
+ }
93
+ if (request.operation === 'lyrics.search') {
94
+ const value = this.record(request.input).input;
95
+ const restored = typeof value === 'string' || value instanceof Track ? value : deserialize(value);
96
+ if (!(typeof restored === 'string' || restored instanceof Track))
97
+ throw new TypeError('Lyrics input must be a string or serialized Track');
98
+ const groups = await this.plugins.execute('lyrics.search', { input: restored }, { pluginId: request.providerId, signal });
99
+ return groups.map((group) => group?.map(normalizeLyrics) ?? null);
100
+ }
101
+ throw new Error('Unsupported metadata operation');
102
+ },
42
103
  'source.search': async (input, { signal }) => {
43
104
  const request = this.record(input);
44
105
  if (typeof request.query !== 'string')
@@ -47,17 +108,6 @@ export class SourcePluginHost {
47
108
  const result = await this.runtime.search(request.query, { ...hints, signal });
48
109
  return this.boundary.getStore() ? this.portable(result) : result;
49
110
  },
50
- 'source.resolve': async (input, { signal }) => {
51
- const request = this.record(input);
52
- if (typeof request.query !== 'string' || typeof request.pluginId !== 'string')
53
- throw new TypeError('query and pluginId are required');
54
- const result = await this.runtime.search(request.query, {
55
- ...this.searchOptions(request.options),
56
- pluginId: request.pluginId,
57
- signal,
58
- });
59
- return this.boundary.getStore() ? this.portable(result) : result;
60
- },
61
111
  'source.related': async (input, { signal }) => {
62
112
  const track = await this.restore(this.record(input).track, signal);
63
113
  const result = await this.plugins.execute('track.related', { track }, { pluginId: track.sourceReference?.pluginId, signal });
@@ -67,14 +117,50 @@ export class SourcePluginHost {
67
117
  if (!this.boundary.getStore()) {
68
118
  return this.plugins.resolveStream(await this.restore(this.record(input).track, signal), { signal });
69
119
  }
70
- // Resolve only when the media grant is redeemed: queued tracks do not hold live streams.
71
- const payload = cloneJSONValue(this.record(input).track);
120
+ const value = this.record(input).track;
121
+ const payload = cloneJSONValue(value instanceof Track ? serializeSourceTrack(value) : value);
122
+ const { sourceState: _state, ...entity } = this.record(payload);
123
+ const metadata = deserialize(entity);
124
+ if (!(metadata instanceof Track))
125
+ throw new TypeError('Expected a serialized Track');
126
+ this.assertHost(metadata);
127
+ const providerId = metadata.sourceReference?.pluginId;
128
+ await this.plugins.ready();
129
+ const registration = this.plugins.registrationSignal(providerId ?? '');
130
+ if (options.mediaDelivery === 'direct-url' &&
131
+ providerId &&
132
+ options.directUrlProviders?.includes(providerId) &&
133
+ !this.plugins.hasStreamTransforms(providerId)) {
134
+ try {
135
+ const track = await this.restore(payload, signal);
136
+ return await this.plugins.resolveStream(track, {
137
+ signal,
138
+ directUrlOnly: true,
139
+ prepareSource: async (media, lifetime) => {
140
+ if (!('url' in media))
141
+ throw new Error('Expected a direct media URL');
142
+ await authorizeMediaURL(new URL(media.url), this.mediaPolicy, lifetime ?? signal);
143
+ if ('expiresAtMs' in media &&
144
+ (!Number.isFinite(Number(media.expiresAtMs)) || Number(media.expiresAtMs) <= Date.now()))
145
+ throw new Error('Media source credentials have expired');
146
+ return media;
147
+ },
148
+ });
149
+ }
150
+ catch (error) {
151
+ if (!(error instanceof DeferredSourceRequired))
152
+ throw error;
153
+ }
154
+ }
155
+ // Unknown source types and transformed URLs resolve only on grant redemption.
72
156
  return createMediaSource({
73
157
  open: async ({ signal: mediaSignal }) => {
74
- const track = await this.restore(payload, mediaSignal);
158
+ const lifetime = registration ? AbortSignal.any([mediaSignal, registration]) : mediaSignal;
159
+ lifetime.throwIfAborted();
160
+ const track = await this.restore(payload, lifetime);
75
161
  const source = await this.plugins.resolveStream(track, {
76
- signal: mediaSignal,
77
- prepareSource: (media, lifetime) => this.prepareMedia(media, lifetime),
162
+ signal: lifetime,
163
+ prepareSource: (media, sourceSignal) => this.prepareMedia(media, sourceSignal),
78
164
  });
79
165
  if ('stream' in source)
80
166
  return source.stream;
@@ -84,29 +170,14 @@ export class SourcePluginHost {
84
170
  },
85
171
  },
86
172
  dispose: async () => {
173
+ clearInterval(this.sweep);
87
174
  this.states.clear();
88
175
  await this.runtime.destroy();
89
176
  },
90
177
  });
91
178
  }
92
179
  async prepareMedia(source, signal) {
93
- if ('stream' in source)
94
- return source;
95
- if ('buffer' in source)
96
- return { stream: Readable.from([source.buffer]) };
97
- if ('file' in source)
98
- return {
99
- stream: createReadStream(source.file.startsWith('file:') ? new URL(source.file) : source.file, { signal }),
100
- };
101
- const url = new URL(source.url);
102
- if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password)
103
- throw new Error('Expected a public HTTP(S) media URL');
104
- const response = await fetch(url, { signal });
105
- if (!response.ok || !response.body) {
106
- await response.body?.cancel();
107
- throw new Error(`Media upstream returned ${response.status}`);
108
- }
109
- return { stream: Readable.fromWeb(response.body) };
180
+ return openMedia(source, this.mediaPolicy, signal);
110
181
  }
111
182
  record(input) {
112
183
  if (!input || typeof input !== 'object' || Array.isArray(input))
@@ -121,13 +192,18 @@ export class SourcePluginHost {
121
192
  const value = this.record(input);
122
193
  // Only portable hints cross the boundary. Request options and credentials never do.
123
194
  const result = {};
124
- for (const key of ['pluginId', 'searchEngine', 'source']) {
195
+ for (const key of ['searchEngine']) {
125
196
  if (value[key] !== undefined) {
126
197
  if (typeof value[key] !== 'string')
127
198
  throw new TypeError(`${key} must be a string`);
128
199
  result[key] = value[key];
129
200
  }
130
201
  }
202
+ if (value.resolveCustomProtocols !== undefined) {
203
+ if (typeof value.resolveCustomProtocols !== 'boolean')
204
+ throw new TypeError('resolveCustomProtocols must be a boolean');
205
+ result.resolveCustomProtocols = value.resolveCustomProtocols;
206
+ }
131
207
  if (value.limit !== undefined) {
132
208
  if (!Number.isSafeInteger(value.limit) || Number(value.limit) < 1)
133
209
  throw new TypeError('limit must be positive');
@@ -156,10 +232,16 @@ export class SourcePluginHost {
156
232
  this.prune();
157
233
  const tracks = result.tracks.map((track) => {
158
234
  // serialize first; never retain an invalid or unsafe response.
235
+ if (track.sourceReference)
236
+ track.sourceReference.hostId = this.hostId;
159
237
  const serialized = track.serialize();
160
238
  const stateId = randomUUID();
161
239
  this.states.set(stateId, {
162
- track,
240
+ track: Object.assign(Object.create(Object.getPrototypeOf(track)), track, {
241
+ playlist: null,
242
+ raw: { ...track.raw, playlist: undefined, requestMetadata: undefined },
243
+ metadataProvider: undefined,
244
+ }),
163
245
  expires: Date.now() + this.ttl,
164
246
  signal: this.plugins.registrationSignal(track.sourceReference?.pluginId ?? ''),
165
247
  });
@@ -170,44 +252,110 @@ export class SourcePluginHost {
170
252
  return { tracks, playlist: result.playlist?.serialize() ?? null };
171
253
  }
172
254
  async restore(input, signal) {
173
- if (input instanceof Track && !this.boundary.getStore())
255
+ signal.throwIfAborted();
256
+ if (input instanceof Track && !this.boundary.getStore()) {
257
+ this.assertHost(input);
258
+ // A consumer-side model has no host-local engine. Ordinary local models retain identity.
259
+ if (input.sourceState || (this.extractors.get(input.sourceReference?.pluginId ?? '') && !input.extractor)) {
260
+ return this.restore(serializeSourceTrack(input), signal);
261
+ }
174
262
  return input;
263
+ }
175
264
  const payload = this.record(input);
176
265
  const { sourceState: _state, ...entity } = payload;
177
266
  const track = deserialize(entity);
178
267
  if (!(track instanceof Track))
179
268
  throw new TypeError('Expected a serialized Track');
269
+ this.assertHost(track);
180
270
  this.prune();
181
271
  const cached = typeof payload.sourceState === 'string' ? this.states.get(payload.sourceState)?.track : undefined;
182
272
  if (cached &&
183
273
  cached.id === track.id &&
184
274
  cached.url === track.url &&
185
- cached.sourceReference?.pluginId === track.sourceReference?.pluginId)
186
- return cached;
275
+ cached.sourceReference?.pluginId === track.sourceReference?.pluginId) {
276
+ // Copy mutable extractor data per invocation. Opaque/non-cloneable engines are reconstructed below.
277
+ try {
278
+ const { requestMetadata: _callback, playlist: _playlist, ...rawData } = cached.raw;
279
+ const engine = rawData.engine;
280
+ if (engine &&
281
+ typeof engine === 'object' &&
282
+ !Array.isArray(engine) &&
283
+ Object.getPrototypeOf(engine) !== Object.prototype)
284
+ throw new Error('Opaque engine requires reconstruction');
285
+ const raw = structuredClone(rawData);
286
+ const copy = Object.assign(Object.create(Object.getPrototypeOf(cached)), cached, { raw });
287
+ copy.sourceReference = structuredClone(cached.sourceReference);
288
+ copy.trackMetadata = structuredClone(cached.metadata);
289
+ copy.metadataProvider = undefined;
290
+ copy.requestedBy = track.requestedBy;
291
+ copy.playlist = null;
292
+ copy.bridgedTrack = null;
293
+ copy.bridgedExtractor = null;
294
+ return copy;
295
+ }
296
+ catch {
297
+ // Legacy callbacks/classes cannot be safely copied; resolve their public location again.
298
+ }
299
+ }
187
300
  const pluginId = track.sourceReference?.pluginId;
188
301
  if (!pluginId || !this.plugins.has(pluginId))
189
302
  throw new Error('Track source is unavailable; register its provider and search again');
190
303
  if (!this.extractors.get(pluginId))
191
304
  return track;
192
305
  // Re-run legacy metadata resolution rather than guessing the meaning of raw.engine.
193
- const result = await this.runtime.search(track.url, { pluginId, signal });
194
- const restored = result.tracks.find((item) => item.url === track.url);
306
+ const data = track.sourceReference?.data;
307
+ const queryType = data && typeof data === 'object' && 'queryType' in data ? data.queryType : undefined;
308
+ const result = await this.plugins.execute('search.query.resolve', {
309
+ query: track.url,
310
+ providerHint: typeof queryType === 'string' ? queryType : undefined,
311
+ }, { pluginId, signal });
312
+ const restored = result?.tracks.find((item) => item.url === track.url);
195
313
  if (!restored)
196
314
  throw new Error(`Source ${pluginId} could not reconstruct expired Track state; search again`);
197
315
  restored.requestedBy = track.requestedBy;
316
+ restored.sourceReference = track.sourceReference;
198
317
  return restored;
199
318
  }
319
+ assertHost(track) {
320
+ if (track.sourceReference?.hostId !== this.hostId) {
321
+ throw new Error('Track belongs to another source host or has no host affinity; resolve it on this host first');
322
+ }
323
+ }
200
324
  /** Execute directly without serialization; caller owns returned media.
201
325
  * @param request Generic Remedia request targeting discord-player.source.
202
326
  */
203
327
  handle(request) {
204
- return this.remedia.handle(request);
328
+ return this.boundary.run(false, () => this.remedia.handle(request));
205
329
  }
206
330
  /** Execute HTTP through Remedia's transport and the same operation handlers.
207
- * @param request Fetch request.
331
+ * @param request Fetch request. An explicitly configured hostId is required even without publicUrl.
208
332
  */
209
- fetch(request) {
210
- return this.boundary.run(true, () => this.remedia.fetch(request));
333
+ async fetch(request) {
334
+ if (!this.explicitHostId)
335
+ return Promise.reject(new TypeError('HTTP source hosts require an explicit hostId'));
336
+ const response = await this.boundary.run(true, () => this.remedia.fetch(request));
337
+ if (new URL(request.url).pathname !== '/.well-known/remedia' || !response.ok)
338
+ return response;
339
+ await this.plugins.ready();
340
+ const manifest = await response.json();
341
+ const providers = this.plugins.describe();
342
+ const operations = new Set(providers.flatMap((provider) => provider.operations));
343
+ for (const plugin of manifest.plugins) {
344
+ if (plugin.id !== SOURCE_PLUGIN_ID)
345
+ continue;
346
+ plugin.operations = plugin.operations.filter((name) => {
347
+ if (name === 'metadata.execute')
348
+ return (operations.has('search.query.resolve') || operations.has('lyrics.search') || operations.has('track.related'));
349
+ if (name === 'source.search')
350
+ return operations.has('search.query.resolve');
351
+ if (name === 'source.related')
352
+ return operations.has('track.related');
353
+ if (name === 'source.stream')
354
+ return operations.has('track.stream') || operations.has('track.bridge');
355
+ return false;
356
+ });
357
+ }
358
+ return Response.json({ ...manifest, hostId: this.hostId, providers }, { status: response.status, headers: response.headers });
211
359
  }
212
360
  /** Identify Remedia routes for Node middleware.
213
361
  * @param path URL pathname.
package/dist/host.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAA0B,MAAM,YAAY,CAAC;AAElF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GAIjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAmC,MAAM,cAAc,CAAC;AACpF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,yDAAyD;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AA6BxD,sFAAsF;AACtF,MAAM,OAAO,gBAAgB;IAC3B,iDAAiD;IACxC,OAAO,CAAsB;IAEtC,wCAAwC;IAC/B,OAAO,CAAC;IAEjB,+CAA+C;IACtC,UAAU,CAAC;IAEpB,qFAAqF;IAC5E,OAAO,CAAC;IAEjB,6FAA6F;IACpF,MAAM,CAAS;IAEP,WAAW,CAAoB;IAE/B,KAAK,CAAiC;IAEtC,cAAc,CAAU;IAEjC,QAAQ,GAAG,IAAI,iBAAiB,EAAW,CAAC;IAE5C,MAAM,GAAG,IAAI,GAAG,EAAmE,CAAC;IAEpF,GAAG,CAAS;IAEZ,QAAQ,CAAS;IAEzB;;OAEG;IACH,YAAY,OAAgC;QAC1C,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,eAAe,IAAI,MAAM,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjH,MAAM,IAAI,UAAU,CAAC,oDAAoD,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC;QAEnD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,cAAc;YACzD,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;QAEtE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;QAE7C,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAEnG,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,IAAI,mBAAmB,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACxF,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAE1C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YACpB,EAAE,EAAE,gBAAgB;YACpB,UAAU,EAAE;gBACV,kBAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACnC,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;wBAAE,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;oBAC1F,IAAI,OAAO,CAAC,SAAS,KAAK,sBAAsB,IAAI,OAAO,CAAC,SAAS,KAAK,oBAAoB,EAAE,CAAC;wBAC/F,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;wBACzC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;4BAAE,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;wBACnF,MAAM,UAAU,GAAG;4BACjB,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC;4BAC1C,GAAG,CAAC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC3E,GAAG,CAAC,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;yBACxF,CAAC;wBACF,IAAI,OAAO,CAAC,SAAS,KAAK,oBAAoB;4BAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;wBAC1G,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,EAAE,UAAU,EAAE;4BAC5E,QAAQ,EAAE,OAAO,CAAC,UAAU;4BAC5B,MAAM;yBACP,CAAC,CAAC;wBACH,OAAO,MAAM;4BACX,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;gCACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gCACvB,CAAC,CAAC,MAAM;4BACV,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;oBACrC,CAAC;oBACD,IAAI,OAAO,CAAC,SAAS,KAAK,eAAe,EAAE,CAAC;wBAC1C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;wBAC3E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACvC,eAAe,EACf,EAAE,KAAK,EAAE,EACT,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CACzC,CAAC;wBACF,OAAO,MAAM;4BACX,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;gCACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gCACvB,CAAC,CAAC,MAAM;4BACV,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;oBACrC,CAAC;oBACD,IAAI,OAAO,CAAC,SAAS,KAAK,eAAe,EAAE,CAAC;wBAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;wBAC/C,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;wBAClG,IAAI,CAAC,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,YAAY,KAAK,CAAC;4BAC9D,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;wBAC3E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACvC,eAAe,EACf,EAAE,KAAK,EAAE,QAAQ,EAAE,EACnB,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CACzC,CAAC;wBACF,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC;oBACpE,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBACpD,CAAC;gBAED,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAEnC,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;wBAAE,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;oBAErF,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;oBAE9E,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACnE,CAAC;gBAED,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;oBACnE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACvC,eAAe,EACf,EAAE,KAAK,EAAE,EACT,EAAE,QAAQ,EAAE,KAAK,CAAC,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,CACtD,CAAC;oBAEF,OAAO,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC7E,CAAC;gBAED,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;wBAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;oBACtG,CAAC;oBAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;oBACvC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBAC7F,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAChE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;oBAErC,IAAI,CAAC,CAAC,QAAQ,YAAY,KAAK,CAAC;wBAAE,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;oBAErF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAE1B,MAAM,UAAU,GAAG,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;oBAEtD,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBAE3B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;oBAEvE,IACE,OAAO,CAAC,aAAa,KAAK,YAAY;wBACtC,UAAU;wBACV,OAAO,CAAC,kBAAkB,EAAE,QAAQ,CAAC,UAAU,CAAC;wBAChD,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAC7C,CAAC;wBACD,IAAI,CAAC;4BACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;4BAElD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE;gCAC7C,MAAM;gCACN,aAAa,EAAE,IAAI;gCAEnB,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;oCACvC,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC;wCAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;oCAEtE,MAAM,iBAAiB,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,IAAI,MAAM,CAAC,CAAC;oCAElF,IACE,aAAa,IAAI,KAAK;wCACtB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;wCAExF,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;oCAE3D,OAAO,KAAK,CAAC;gCACf,CAAC;6BACF,CAAC,CAAC;wBACL,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,IAAI,CAAC,CAAC,KAAK,YAAY,sBAAsB,CAAC;gCAAE,MAAM,KAAK,CAAC;wBAC9D,CAAC;oBACH,CAAC;oBAED,8EAA8E;oBAC9E,OAAO,iBAAiB,CAAC;wBACvB,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;4BACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;4BAE3F,QAAQ,CAAC,cAAc,EAAE,CAAC;4BAE1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;4BACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE;gCACrD,MAAM,EAAE,QAAQ;gCAEhB,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC;6BAC/E,CAAC,CAAC;4BAEH,IAAI,QAAQ,IAAI,MAAM;gCAAE,OAAO,MAAM,CAAC,MAAM,CAAC;4BAE7C,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;wBAClE,CAAC;qBACF,CAAC,CAAC;gBACL,CAAC;aACF;YAED,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAyB,EAAE,MAAoB;QACxE,OAAO,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAEO,MAAM,CAAC,KAAc;QAC3B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAC7D,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;QAE5D,OAAO,KAAgC,CAAC;IAC1C,CAAC;IAEO,aAAa,CAAC,KAAc;QAClC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QAEnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAkB,CAAC;QAE1E,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,oFAAoF;QACpF,MAAM,MAAM,GAAkB,EAAE,CAAC;QAEjC,KAAK,MAAM,GAAG,IAAI,CAAC,cAAc,CAAU,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,QAAQ;oBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,GAAG,mBAAmB,CAAC,CAAC;gBAEnF,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;YAC/C,IAAI,OAAO,KAAK,CAAC,sBAAsB,KAAK,SAAS;gBACnD,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;YAClE,MAAM,CAAC,sBAAsB,GAAG,KAAK,CAAC,sBAAsB,CAAC;QAC/D,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;YAEjH,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI;gBACrE,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;YAEhE,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACzC,CAAC;QAED,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC;gBACvG,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;YAE9D,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;QACjD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK;QACX,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM;YACpC,IACE,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE;gBAC3B,KAAK,CAAC,MAAM,EAAE,OAAO;gBACrB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,EAAE,QAAQ,IAAI,EAAE,CAAC;gBAE9D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAEO,QAAQ,CAAC,MAAwB;QACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACzC,+DAA+D;YAC/D,IAAI,KAAK,CAAC,eAAe;gBAAE,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAEtE,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAE7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE;gBACvB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE;oBACvE,QAAQ,EAAE,IAAI;oBACd,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE;oBACtE,gBAAgB,EAAE,SAAS;iBAC5B,CAAC;gBACF,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG;gBAC9B,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,eAAe,EAAE,QAAQ,IAAI,EAAE,CAAC;aAC/E,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC,CAAC;YAE9F,OAAO,EAAE,GAAG,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC;IACpE,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,KAAc,EAAE,MAAmB;QACvD,MAAM,CAAC,cAAc,EAAE,CAAC;QAExB,IAAI,KAAK,YAAY,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAEvB,yFAAyF;YACzF,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,QAAQ,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1G,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;YAC3D,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;QACnD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAElC,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;QAElF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAEjH,IACE,MAAM;YACN,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE;YACtB,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;YACxB,MAAM,CAAC,eAAe,EAAE,QAAQ,KAAK,KAAK,CAAC,eAAe,EAAE,QAAQ,EACpE,CAAC;YACD,oGAAoG;YACpG,IAAI,CAAC;gBACH,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;gBACnF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBAE9B,IACE,MAAM;oBACN,OAAO,MAAM,KAAK,QAAQ;oBAC1B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;oBACtB,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,SAAS;oBAElD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAE3D,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;gBACrC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;gBAE1F,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBAC/D,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACtD,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBAClC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;gBACrC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAE7B,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,yFAAyF;YAC3F,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,EAAE,QAAQ,CAAC;QAEjD,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QAEzF,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QAEjD,oFAAoF;QACpF,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACvG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACvC,sBAAsB,EACtB;YACE,KAAK,EAAE,KAAK,CAAC,GAAG;YAChB,YAAY,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SACpE,EACD,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC;QAEvE,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,QAAQ,0DAA0D,CAAC,CAAC;QAE7G,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACzC,QAAQ,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;QAEjD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,UAAU,CAAC,KAAY;QAC7B,IAAI,KAAK,CAAC,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,6FAA6F,CAAC,CAAC;QACjH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAsB;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,OAAgB;QAC1B,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAE/G,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAClF,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,sBAAsB,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,QAAQ,CAAC;QAC9F,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QACjF,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtC,IAAI,MAAM,CAAC,EAAE,KAAK,gBAAgB;gBAAE,SAAS;YAC7C,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;gBAC5D,IAAI,IAAI,KAAK,kBAAkB;oBAC7B,OAAO,CACL,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,CAC7G,CAAC;gBACJ,IAAI,IAAI,KAAK,eAAe;oBAAE,OAAO,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;gBAC5E,IAAI,IAAI,KAAK,gBAAgB;oBAAE,OAAO,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBACtE,IAAI,IAAI,KAAK,eAAe;oBAAE,OAAO,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACtG,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,CAClB,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAC/C,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CACvD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,uEAAuE;IACvE,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgC;IACrE,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -14,3 +14,8 @@ export * from './host.js';
14
14
  export * from './protocol.js';
15
15
  export { cloneJSONValue } from './utils/serialization.js';
16
16
  export { SafeEventEmitter, type EventMap } from './utils/safe-event-emitter.js';
17
+ export type { MediaAccessPolicy } from './media.js';
18
+ export { parseLyrics, normalizeLyrics, searchLyrics } from './lyrics.js';
19
+ export type { LyricsLine, LyricsResult, LyricsRequest } from './lyrics.js';
20
+ export * from './providers/lrclib.js';
21
+ export type { RemotePluginHostOptions } from './remote.js';
package/dist/index.js CHANGED
@@ -14,4 +14,6 @@ export * from './host.js';
14
14
  export * from './protocol.js';
15
15
  export { cloneJSONValue } from './utils/serialization.js';
16
16
  export { SafeEventEmitter } from './utils/safe-event-emitter.js';
17
+ export { parseLyrics, normalizeLyrics, searchLyrics } from './lyrics.js';
18
+ export * from './providers/lrclib.js';
17
19
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAiB,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAiB,MAAM,+BAA+B,CAAC;AAIhF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzE,cAAc,uBAAuB,CAAC"}
@@ -11,7 +11,7 @@ export interface SourceRuntimeEvents {
11
11
  /** Non-fatal source errors. */
12
12
  error: [error: Error];
13
13
  /** Compatibility event forwarded by a real Player. */
14
- voiceStateUpdate: [guildId: string, event: unknown];
14
+ voiceStateUpdate: [guildId: string, event: Record<string, unknown>];
15
15
  }
16
16
  /** Source-related Player surface shared by actual Players and standalone hosts. */
17
17
  export interface LegacyPlayerContext {
@@ -0,0 +1,56 @@
1
+ import type { Track } from './structures/track.js';
2
+ import type { ProviderReference } from './plugins/types.js';
3
+ import type { PluginRegistry } from './plugins/registry.js';
4
+ import type { JSONValue } from './utils/serialization.js';
5
+ /** One normalized synchronized lyric line. */
6
+ export interface LyricsLine {
7
+ /** Position in the source timeline, in milliseconds. */
8
+ timestampMs: number;
9
+ /** Text displayed from this timestamp until the next line. */
10
+ line: string;
11
+ }
12
+ /** Provider-neutral lyrics record; either representation may be absent. */
13
+ export interface LyricsResult {
14
+ /** Canonical Track ID when lookup used Track input, preventing stale queue loads. */
15
+ trackId?: string;
16
+ /** Stable provider identity, stamped by dispatch when absent. */
17
+ provider?: ProviderReference;
18
+ /** Plain text availability and contents. */
19
+ plain: {
20
+ available: false;
21
+ } | {
22
+ available: true;
23
+ text: string;
24
+ };
25
+ /** Synchronized representation, sorted by timestamp. */
26
+ synced: {
27
+ available: false;
28
+ } | {
29
+ available: true;
30
+ lines: readonly LyricsLine[];
31
+ };
32
+ /** Optional provider-owned, serializable metadata. */
33
+ metadata?: JSONValue;
34
+ }
35
+ /** Normalize and validate a lyrics record once, including sorted synchronized timestamps.
36
+ * @param result Provider record.
37
+ * @returns Validated record with duplicate timestamps resolved deterministically.
38
+ */
39
+ export declare function normalizeLyrics(result: LyricsResult): LyricsResult;
40
+ /** Lookup input shared by local plugins and HTTP metadata transport. */
41
+ export interface LyricsRequest {
42
+ /** Caller input. Remote transport serializes Tracks before delivery. */
43
+ input: Track | string;
44
+ }
45
+ /** Parse LRC once, including multiple timestamps and decimal-second fractions.
46
+ * @param text LRC text.
47
+ * @returns Sorted normalized lines, with the last line winning duplicate timestamps.
48
+ */
49
+ export declare function parseLyrics(text: string): LyricsLine[];
50
+ /** Resolve lyrics through the same operation registry as source metadata.
51
+ * @param plugins Shared registry.
52
+ * @param input Track or raw query.
53
+ * @param signal Caller lifetime.
54
+ * @returns Results in provider priority order, preferring explicit and source affinity.
55
+ */
56
+ export declare function searchLyrics(plugins: PluginRegistry, input: Track | string, signal?: AbortSignal): Promise<LyricsResult[]>;