lavalink-client 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -216,7 +216,7 @@ class Player {
216
216
  source: LavalinkManagerStatics_1.DefaultSources[(typeof query === "string" ? undefined : query.source?.trim?.()?.toLowerCase?.()) ?? this.LavalinkManager.options.playerOptions.defaultSearchPlatform.toLowerCase()] ?? (typeof query === "string" ? undefined : query.source?.trim?.()?.toLowerCase?.()) ?? this.LavalinkManager.options.playerOptions.defaultSearchPlatform
217
217
  };
218
218
  // if user does player.search("ytsearch:Hello")
219
- const foundSource = [...Object.keys(LavalinkManagerStatics_1.DefaultSources)].find(source => Query.query.toLowerCase().startsWith(`${source}:`.toLowerCase()))?.trim?.()?.toLowerCase?.();
219
+ const foundSource = Object.keys(LavalinkManagerStatics_1.DefaultSources).find(source => Query.query.toLowerCase().startsWith(`${source}:`.toLowerCase()))?.trim?.()?.toLowerCase?.();
220
220
  if (foundSource && LavalinkManagerStatics_1.DefaultSources[foundSource]) {
221
221
  Query.source = LavalinkManagerStatics_1.DefaultSources[foundSource]; // set the source to ytsearch:
222
222
  Query.query = Query.query.slice(`${foundSource}:`.length, Query.query.length); // remove ytsearch: from the query
@@ -251,13 +251,13 @@ class Player {
251
251
  source: LavalinkManagerStatics_1.DefaultSources[(typeof query === "string" ? undefined : query.source?.trim?.()?.toLowerCase?.()) ?? this.LavalinkManager.options.playerOptions.defaultSearchPlatform.toLowerCase()] ?? (typeof query === "string" ? undefined : query.source?.trim?.()?.toLowerCase?.()) ?? this.LavalinkManager.options.playerOptions.defaultSearchPlatform
252
252
  };
253
253
  // if user does player.search("ytsearch:Hello")
254
- const foundSource = [...Object.keys(LavalinkManagerStatics_1.DefaultSources)].find(source => Query.query?.toLowerCase?.()?.startsWith(`${source}:`.toLowerCase()))?.trim?.()?.toLowerCase?.();
254
+ const foundSource = Object.keys(LavalinkManagerStatics_1.DefaultSources).find(source => Query.query?.toLowerCase?.()?.startsWith(`${source}:`.toLowerCase()))?.trim?.()?.toLowerCase?.();
255
255
  if (foundSource && LavalinkManagerStatics_1.DefaultSources[foundSource]) {
256
256
  Query.source = LavalinkManagerStatics_1.DefaultSources[foundSource]; // set the source to ytsearch:
257
257
  Query.query = Query.query.slice(`${foundSource}:`.length, Query.query.length); // remove ytsearch: from the query
258
258
  }
259
259
  if (/^https?:\/\//.test(Query.query))
260
- this.LavalinkManager.utils.validatedQueryString(this.node, Query.source);
260
+ this.LavalinkManager.utils.validateQueryString(this.node, Query.source);
261
261
  else if (Query.source)
262
262
  this.LavalinkManager.utils.validateSourceString(this.node, Query.source);
263
263
  // ftts query parameters: ?voice=Olivia&audio_format=ogg_opus&translate=False&silence=1000&speed=1.0 | example raw get query: https://api.flowery.pw/v1/tts?voice=Olivia&audio_format=ogg_opus&translate=False&silence=0&speed=1.0&text=Hello%20World
@@ -3,6 +3,18 @@ import { Base64 } from "./Utils";
3
3
  type LavalinkSourceNames = "youtube" | "youtubemusic" | "soundcloud" | "bandcamp" | "twitch";
4
4
  type LavalinkPlugin_LavaSrc_SourceNames = "deezer" | "spotify" | "applemusic" | "yandexmusic" | "flowery-tts";
5
5
  type SourceNames = LavalinkSourceNames | LavalinkPlugin_LavaSrc_SourceNames;
6
+ export interface LavalinkTrackInfo {
7
+ identifier: string;
8
+ title: string;
9
+ author: string;
10
+ length: number;
11
+ artworkUrl: string | null;
12
+ uri: string;
13
+ sourceName: SourceNames;
14
+ isSeekable: boolean;
15
+ isStream: boolean;
16
+ isrc: string | null;
17
+ }
6
18
  export interface TrackInfo {
7
19
  identifier: string;
8
20
  title: string;
@@ -51,11 +63,17 @@ export interface LavalinkTrack {
51
63
  /** The Base 64 encoded String */
52
64
  encoded?: Base64;
53
65
  /** Track Information */
54
- info: TrackInfo;
66
+ info: LavalinkTrackInfo;
55
67
  /** Plugin Information from Lavalink */
56
68
  pluginInfo: Partial<PluginInfo>;
57
69
  }
58
- export interface Track extends LavalinkTrack {
70
+ export interface Track {
71
+ /** The Base 64 encoded String */
72
+ encoded?: Base64;
73
+ /** Track Information */
74
+ info: TrackInfo;
75
+ /** Plugin Information from Lavalink */
76
+ pluginInfo: Partial<PluginInfo>;
59
77
  /** The Track's Requester */
60
78
  requester?: unknown;
61
79
  }
@@ -2,7 +2,7 @@ import { LavalinkFilterData } from "./Filters";
2
2
  import { LavalinkManager } from "./LavalinkManager";
3
3
  import { LavalinkNode, LavalinkNodeOptions, NodeStats } from "./Node";
4
4
  import { PlayOptions, Player } from "./Player";
5
- import { PluginInfo, Track, UnresolvedTrack, UnresolvedQuery } from "./Track";
5
+ import { PluginInfo, Track, UnresolvedTrack, UnresolvedQuery, LavalinkTrack } from "./Track";
6
6
  export declare const TrackSymbol: unique symbol;
7
7
  export declare const UnresolvedTrackSymbol: unique symbol;
8
8
  export declare const QueueSymbol: unique symbol;
@@ -37,13 +37,16 @@ export interface SearchResult {
37
37
  playlist: PlaylistInfo | null;
38
38
  tracks: Track[];
39
39
  }
40
- export interface ManagerUitls {
41
- /** @private */
42
- manager: LavalinkManager;
43
- }
44
40
  export declare class ManagerUitls {
41
+ LavalinkManager: LavalinkManager | null;
45
42
  constructor(LavalinkManager?: LavalinkManager);
46
- buildTrack(data: any, requester: any): Track;
43
+ buildTrack(data: LavalinkTrack | Track, requester: unknown): Track;
44
+ /**
45
+ * Builds a UnresolvedTrack to be resolved before being played .
46
+ * @param query
47
+ * @param requester
48
+ */
49
+ buildUnresolvedTrack(query: UnresolvedQuery | UnresolvedTrack, requester: unknown): UnresolvedTrack;
47
50
  /**
48
51
  * Validate if a data is equal to a node
49
52
  * @param data
@@ -69,15 +72,9 @@ export declare class ManagerUitls {
69
72
  * Checks if the provided argument is a valid UnresolvedTrack.
70
73
  * @param track
71
74
  */
72
- isUnresolvedTrackQuery(data: UnresolvedTrack | any): boolean;
73
- getClosestTrack(data: UnresolvedTrack, player: Player): Promise<Track>;
74
- /**
75
- * Builds a UnresolvedTrack to be resolved before being played .
76
- * @param query
77
- * @param requester
78
- */
79
- buildUnresolvedTrack(query: UnresolvedQuery | UnresolvedTrack, requester: unknown): UnresolvedTrack;
80
- validatedQueryString(node: LavalinkNode, queryString: string): void;
75
+ isUnresolvedTrackQuery(data: UnresolvedQuery | any): boolean;
76
+ getClosestTrack(data: UnresolvedTrack, player: Player): Promise<Track | undefined>;
77
+ validateQueryString(node: LavalinkNode, queryString: string): void;
81
78
  validateSourceString(node: LavalinkNode, sourceString: SearchPlatform): void;
82
79
  }
83
80
  /**
@@ -9,32 +9,32 @@ exports.NodeSymbol = Symbol("LC-Node");
9
9
  /** @hidden */
10
10
  const escapeRegExp = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
11
11
  class ManagerUitls {
12
+ LavalinkManager = null;
12
13
  constructor(LavalinkManager) {
13
- this.manager = LavalinkManager;
14
+ this.LavalinkManager = LavalinkManager;
14
15
  }
15
16
  buildTrack(data, requester) {
16
- const encoded = data.encoded || data.encoded;
17
- if (!encoded)
18
- throw new RangeError("Argument 'data.encoded' / 'data.encoded' / 'data.track' must be present.");
17
+ if (!data?.encoded || typeof data.encoded !== "string")
18
+ throw new RangeError("Argument 'data.encoded' must be present.");
19
19
  if (!data.info)
20
- data.info = {};
20
+ throw new RangeError("Argument 'data.info' must be present.");
21
21
  try {
22
22
  const r = {
23
- encoded,
23
+ encoded: data.encoded,
24
24
  info: {
25
- identifier: data.info?.identifier,
26
- title: data.info?.title,
27
- author: data.info?.author,
28
- duration: data.info?.length || data.info?.duration,
29
- artworkUrl: data.info?.artworkUrl || data.pluginInfo?.artworkUrl || data.plugin?.artworkUrl,
30
- uri: data.info?.uri,
31
- sourceName: data.info?.sourceName,
32
- isSeekable: data.info?.isSeekable,
33
- isStream: data.info?.isStream,
34
- isrc: data.info?.isrc,
25
+ identifier: data.info.identifier,
26
+ title: data.info.title,
27
+ author: data.info.author,
28
+ duration: data.info.length || data.info.duration,
29
+ artworkUrl: data.info.artworkUrl || data.pluginInfo?.artworkUrl || data.plugin?.artworkUrl,
30
+ uri: data.info.uri,
31
+ sourceName: data.info.sourceName,
32
+ isSeekable: data.info.isSeekable,
33
+ isStream: data.info.isStream,
34
+ isrc: data.info.isrc,
35
35
  },
36
36
  pluginInfo: data.pluginInfo || data.plugin || {},
37
- requester: typeof this.manager.options?.playerOptions?.requesterTransformer === "function" ? this.manager.options?.playerOptions?.requesterTransformer(data?.requester || requester) : requester,
37
+ requester: typeof this.LavalinkManager?.options?.playerOptions?.requesterTransformer === "function" ? this.LavalinkManager?.options?.playerOptions?.requesterTransformer(data?.requester || requester) : requester,
38
38
  };
39
39
  Object.defineProperty(r, exports.TrackSymbol, { configurable: true, value: true });
40
40
  return r;
@@ -43,6 +43,32 @@ class ManagerUitls {
43
43
  throw new RangeError(`Argument "data" is not a valid track: ${error.message}`);
44
44
  }
45
45
  }
46
+ /**
47
+ * Builds a UnresolvedTrack to be resolved before being played .
48
+ * @param query
49
+ * @param requester
50
+ */
51
+ buildUnresolvedTrack(query, requester) {
52
+ if (typeof query === "undefined")
53
+ throw new RangeError('Argument "query" must be present.');
54
+ const unresolvedTrack = {
55
+ encoded: query.encoded || undefined,
56
+ info: query.info ? query.info : query.title ? query : undefined,
57
+ requester: typeof this.LavalinkManager?.options?.playerOptions?.requesterTransformer === "function" ? this.LavalinkManager?.options?.playerOptions?.requesterTransformer((query?.requester || requester)) : requester,
58
+ async resolve(player) {
59
+ const closest = await getClosestTrack(this, player, player.LavalinkManager.utils);
60
+ if (!closest)
61
+ throw new SyntaxError("No closest Track found");
62
+ Object.getOwnPropertyNames(this).forEach(prop => delete this[prop]);
63
+ Object.assign(this, closest);
64
+ return;
65
+ }
66
+ };
67
+ if (!this.isUnresolvedTrack(unresolvedTrack))
68
+ throw SyntaxError("Could not build Unresolved Track");
69
+ Object.defineProperty(unresolvedTrack, exports.UnresolvedTrackSymbol, { configurable: true, value: true });
70
+ return unresolvedTrack;
71
+ }
46
72
  /**
47
73
  * Validate if a data is equal to a node
48
74
  * @param data
@@ -112,7 +138,7 @@ class ManagerUitls {
112
138
  return false;
113
139
  if (data[exports.UnresolvedTrackSymbol] === true)
114
140
  return true;
115
- return typeof data === "object" && "info" in data && typeof data.info.title === "string" && typeof data.resolve === "function";
141
+ return typeof data === "object" && (("info" in data && typeof data.info.title === "string") || typeof data.encoded === "string") && typeof data.resolve === "function";
116
142
  }
117
143
  /**
118
144
  * Checks if the provided argument is a valid UnresolvedTrack.
@@ -124,31 +150,7 @@ class ManagerUitls {
124
150
  async getClosestTrack(data, player) {
125
151
  return getClosestTrack(data, player, this);
126
152
  }
127
- /**
128
- * Builds a UnresolvedTrack to be resolved before being played .
129
- * @param query
130
- * @param requester
131
- */
132
- buildUnresolvedTrack(query, requester) {
133
- if (typeof query === "undefined")
134
- throw new RangeError('Argument "query" must be present.');
135
- const unresolvedTrack = {
136
- encoded: query.encoded || undefined,
137
- info: query.info ?? query,
138
- requester: typeof this.manager.options?.playerOptions?.requesterTransformer === "function" ? this.manager.options?.playerOptions?.requesterTransformer((query?.requester || requester)) : requester,
139
- async resolve(player) {
140
- const closest = await getClosestTrack(this, player, player.LavalinkManager.utils);
141
- if (!closest)
142
- throw new SyntaxError("No closest Track found");
143
- Object.getOwnPropertyNames(this).forEach(prop => delete this[prop]);
144
- Object.assign(this, closest);
145
- return;
146
- }
147
- };
148
- Object.defineProperty(unresolvedTrack, exports.UnresolvedTrackSymbol, { configurable: true, value: true });
149
- return unresolvedTrack;
150
- }
151
- validatedQueryString(node, queryString) {
153
+ validateQueryString(node, queryString) {
152
154
  if (!node.info)
153
155
  throw new Error("No Lavalink Node was provided");
154
156
  if (!node.info.sourceManagers?.length)
@@ -195,7 +197,7 @@ class ManagerUitls {
195
197
  validateSourceString(node, sourceString) {
196
198
  if (!sourceString)
197
199
  throw new Error(`No SourceString was provided`);
198
- const source = LavalinkManagerStatics_1.DefaultSources[sourceString.toLowerCase()] || Object.values(LavalinkManagerStatics_1.DefaultSources).find(v => v.toLowerCase() === sourceString?.toLowerCase());
200
+ const source = LavalinkManagerStatics_1.DefaultSources[sourceString.toLowerCase()] || Object.keys(LavalinkManagerStatics_1.DefaultSources).find(v => v.toLowerCase() === sourceString?.toLowerCase());
199
201
  if (!source)
200
202
  throw new Error(`Lavalink Node SearchQuerySource: '${sourceString}' is not available`);
201
203
  if (source === "amsearch" && !node.info.sourceManagers.includes("applemusic")) {
@@ -292,7 +294,7 @@ exports.queueTrackEnd = queueTrackEnd;
292
294
  async function applyUnresolvedData(resTrack, data, utils) {
293
295
  if (!resTrack?.info || !data?.info)
294
296
  return;
295
- if (utils.manager.options.playerOptions?.useUnresolvedData === true) { // overwrite values
297
+ if (utils?.LavalinkManager?.options?.playerOptions?.useUnresolvedData === true) { // overwrite values
296
298
  if (data.info.uri)
297
299
  resTrack.info.uri = data.info.uri;
298
300
  if (data.info.artworkUrl?.length)
@@ -322,8 +324,8 @@ async function getClosestTrack(data, player, utils) {
322
324
  return utils.buildTrack(data, data.requester);
323
325
  if (!utils.isUnresolvedTrack(data))
324
326
  throw new RangeError("Track is not an unresolved Track");
325
- if (!data?.info?.title)
326
- throw new SyntaxError("the track title is required for unresolved tracks");
327
+ if (!data?.info?.title && typeof data.encoded !== "string" && !data.info.uri)
328
+ throw new SyntaxError("the track uri / title / encoded Base64 string is required for unresolved tracks");
327
329
  if (!data.requester)
328
330
  throw new SyntaxError("The requester is required");
329
331
  // try to decode the track, if possible
@@ -213,7 +213,7 @@ export class Player {
213
213
  source: DefaultSources[(typeof query === "string" ? undefined : query.source?.trim?.()?.toLowerCase?.()) ?? this.LavalinkManager.options.playerOptions.defaultSearchPlatform.toLowerCase()] ?? (typeof query === "string" ? undefined : query.source?.trim?.()?.toLowerCase?.()) ?? this.LavalinkManager.options.playerOptions.defaultSearchPlatform
214
214
  };
215
215
  // if user does player.search("ytsearch:Hello")
216
- const foundSource = [...Object.keys(DefaultSources)].find(source => Query.query.toLowerCase().startsWith(`${source}:`.toLowerCase()))?.trim?.()?.toLowerCase?.();
216
+ const foundSource = Object.keys(DefaultSources).find(source => Query.query.toLowerCase().startsWith(`${source}:`.toLowerCase()))?.trim?.()?.toLowerCase?.();
217
217
  if (foundSource && DefaultSources[foundSource]) {
218
218
  Query.source = DefaultSources[foundSource]; // set the source to ytsearch:
219
219
  Query.query = Query.query.slice(`${foundSource}:`.length, Query.query.length); // remove ytsearch: from the query
@@ -248,13 +248,13 @@ export class Player {
248
248
  source: DefaultSources[(typeof query === "string" ? undefined : query.source?.trim?.()?.toLowerCase?.()) ?? this.LavalinkManager.options.playerOptions.defaultSearchPlatform.toLowerCase()] ?? (typeof query === "string" ? undefined : query.source?.trim?.()?.toLowerCase?.()) ?? this.LavalinkManager.options.playerOptions.defaultSearchPlatform
249
249
  };
250
250
  // if user does player.search("ytsearch:Hello")
251
- const foundSource = [...Object.keys(DefaultSources)].find(source => Query.query?.toLowerCase?.()?.startsWith(`${source}:`.toLowerCase()))?.trim?.()?.toLowerCase?.();
251
+ const foundSource = Object.keys(DefaultSources).find(source => Query.query?.toLowerCase?.()?.startsWith(`${source}:`.toLowerCase()))?.trim?.()?.toLowerCase?.();
252
252
  if (foundSource && DefaultSources[foundSource]) {
253
253
  Query.source = DefaultSources[foundSource]; // set the source to ytsearch:
254
254
  Query.query = Query.query.slice(`${foundSource}:`.length, Query.query.length); // remove ytsearch: from the query
255
255
  }
256
256
  if (/^https?:\/\//.test(Query.query))
257
- this.LavalinkManager.utils.validatedQueryString(this.node, Query.source);
257
+ this.LavalinkManager.utils.validateQueryString(this.node, Query.source);
258
258
  else if (Query.source)
259
259
  this.LavalinkManager.utils.validateSourceString(this.node, Query.source);
260
260
  // ftts query parameters: ?voice=Olivia&audio_format=ogg_opus&translate=False&silence=1000&speed=1.0 | example raw get query: https://api.flowery.pw/v1/tts?voice=Olivia&audio_format=ogg_opus&translate=False&silence=0&speed=1.0&text=Hello%20World
@@ -3,6 +3,18 @@ import { Base64 } from "./Utils";
3
3
  type LavalinkSourceNames = "youtube" | "youtubemusic" | "soundcloud" | "bandcamp" | "twitch";
4
4
  type LavalinkPlugin_LavaSrc_SourceNames = "deezer" | "spotify" | "applemusic" | "yandexmusic" | "flowery-tts";
5
5
  type SourceNames = LavalinkSourceNames | LavalinkPlugin_LavaSrc_SourceNames;
6
+ export interface LavalinkTrackInfo {
7
+ identifier: string;
8
+ title: string;
9
+ author: string;
10
+ length: number;
11
+ artworkUrl: string | null;
12
+ uri: string;
13
+ sourceName: SourceNames;
14
+ isSeekable: boolean;
15
+ isStream: boolean;
16
+ isrc: string | null;
17
+ }
6
18
  export interface TrackInfo {
7
19
  identifier: string;
8
20
  title: string;
@@ -51,11 +63,17 @@ export interface LavalinkTrack {
51
63
  /** The Base 64 encoded String */
52
64
  encoded?: Base64;
53
65
  /** Track Information */
54
- info: TrackInfo;
66
+ info: LavalinkTrackInfo;
55
67
  /** Plugin Information from Lavalink */
56
68
  pluginInfo: Partial<PluginInfo>;
57
69
  }
58
- export interface Track extends LavalinkTrack {
70
+ export interface Track {
71
+ /** The Base 64 encoded String */
72
+ encoded?: Base64;
73
+ /** Track Information */
74
+ info: TrackInfo;
75
+ /** Plugin Information from Lavalink */
76
+ pluginInfo: Partial<PluginInfo>;
59
77
  /** The Track's Requester */
60
78
  requester?: unknown;
61
79
  }
@@ -2,7 +2,7 @@ import { LavalinkFilterData } from "./Filters";
2
2
  import { LavalinkManager } from "./LavalinkManager";
3
3
  import { LavalinkNode, LavalinkNodeOptions, NodeStats } from "./Node";
4
4
  import { PlayOptions, Player } from "./Player";
5
- import { PluginInfo, Track, UnresolvedTrack, UnresolvedQuery } from "./Track";
5
+ import { PluginInfo, Track, UnresolvedTrack, UnresolvedQuery, LavalinkTrack } from "./Track";
6
6
  export declare const TrackSymbol: unique symbol;
7
7
  export declare const UnresolvedTrackSymbol: unique symbol;
8
8
  export declare const QueueSymbol: unique symbol;
@@ -37,13 +37,16 @@ export interface SearchResult {
37
37
  playlist: PlaylistInfo | null;
38
38
  tracks: Track[];
39
39
  }
40
- export interface ManagerUitls {
41
- /** @private */
42
- manager: LavalinkManager;
43
- }
44
40
  export declare class ManagerUitls {
41
+ LavalinkManager: LavalinkManager | null;
45
42
  constructor(LavalinkManager?: LavalinkManager);
46
- buildTrack(data: any, requester: any): Track;
43
+ buildTrack(data: LavalinkTrack | Track, requester: unknown): Track;
44
+ /**
45
+ * Builds a UnresolvedTrack to be resolved before being played .
46
+ * @param query
47
+ * @param requester
48
+ */
49
+ buildUnresolvedTrack(query: UnresolvedQuery | UnresolvedTrack, requester: unknown): UnresolvedTrack;
47
50
  /**
48
51
  * Validate if a data is equal to a node
49
52
  * @param data
@@ -69,15 +72,9 @@ export declare class ManagerUitls {
69
72
  * Checks if the provided argument is a valid UnresolvedTrack.
70
73
  * @param track
71
74
  */
72
- isUnresolvedTrackQuery(data: UnresolvedTrack | any): boolean;
73
- getClosestTrack(data: UnresolvedTrack, player: Player): Promise<Track>;
74
- /**
75
- * Builds a UnresolvedTrack to be resolved before being played .
76
- * @param query
77
- * @param requester
78
- */
79
- buildUnresolvedTrack(query: UnresolvedQuery | UnresolvedTrack, requester: unknown): UnresolvedTrack;
80
- validatedQueryString(node: LavalinkNode, queryString: string): void;
75
+ isUnresolvedTrackQuery(data: UnresolvedQuery | any): boolean;
76
+ getClosestTrack(data: UnresolvedTrack, player: Player): Promise<Track | undefined>;
77
+ validateQueryString(node: LavalinkNode, queryString: string): void;
81
78
  validateSourceString(node: LavalinkNode, sourceString: SearchPlatform): void;
82
79
  }
83
80
  /**
@@ -6,32 +6,32 @@ export const NodeSymbol = Symbol("LC-Node");
6
6
  /** @hidden */
7
7
  const escapeRegExp = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
8
8
  export class ManagerUitls {
9
+ LavalinkManager = null;
9
10
  constructor(LavalinkManager) {
10
- this.manager = LavalinkManager;
11
+ this.LavalinkManager = LavalinkManager;
11
12
  }
12
13
  buildTrack(data, requester) {
13
- const encoded = data.encoded || data.encoded;
14
- if (!encoded)
15
- throw new RangeError("Argument 'data.encoded' / 'data.encoded' / 'data.track' must be present.");
14
+ if (!data?.encoded || typeof data.encoded !== "string")
15
+ throw new RangeError("Argument 'data.encoded' must be present.");
16
16
  if (!data.info)
17
- data.info = {};
17
+ throw new RangeError("Argument 'data.info' must be present.");
18
18
  try {
19
19
  const r = {
20
- encoded,
20
+ encoded: data.encoded,
21
21
  info: {
22
- identifier: data.info?.identifier,
23
- title: data.info?.title,
24
- author: data.info?.author,
25
- duration: data.info?.length || data.info?.duration,
26
- artworkUrl: data.info?.artworkUrl || data.pluginInfo?.artworkUrl || data.plugin?.artworkUrl,
27
- uri: data.info?.uri,
28
- sourceName: data.info?.sourceName,
29
- isSeekable: data.info?.isSeekable,
30
- isStream: data.info?.isStream,
31
- isrc: data.info?.isrc,
22
+ identifier: data.info.identifier,
23
+ title: data.info.title,
24
+ author: data.info.author,
25
+ duration: data.info.length || data.info.duration,
26
+ artworkUrl: data.info.artworkUrl || data.pluginInfo?.artworkUrl || data.plugin?.artworkUrl,
27
+ uri: data.info.uri,
28
+ sourceName: data.info.sourceName,
29
+ isSeekable: data.info.isSeekable,
30
+ isStream: data.info.isStream,
31
+ isrc: data.info.isrc,
32
32
  },
33
33
  pluginInfo: data.pluginInfo || data.plugin || {},
34
- requester: typeof this.manager.options?.playerOptions?.requesterTransformer === "function" ? this.manager.options?.playerOptions?.requesterTransformer(data?.requester || requester) : requester,
34
+ requester: typeof this.LavalinkManager?.options?.playerOptions?.requesterTransformer === "function" ? this.LavalinkManager?.options?.playerOptions?.requesterTransformer(data?.requester || requester) : requester,
35
35
  };
36
36
  Object.defineProperty(r, TrackSymbol, { configurable: true, value: true });
37
37
  return r;
@@ -40,6 +40,32 @@ export class ManagerUitls {
40
40
  throw new RangeError(`Argument "data" is not a valid track: ${error.message}`);
41
41
  }
42
42
  }
43
+ /**
44
+ * Builds a UnresolvedTrack to be resolved before being played .
45
+ * @param query
46
+ * @param requester
47
+ */
48
+ buildUnresolvedTrack(query, requester) {
49
+ if (typeof query === "undefined")
50
+ throw new RangeError('Argument "query" must be present.');
51
+ const unresolvedTrack = {
52
+ encoded: query.encoded || undefined,
53
+ info: query.info ? query.info : query.title ? query : undefined,
54
+ requester: typeof this.LavalinkManager?.options?.playerOptions?.requesterTransformer === "function" ? this.LavalinkManager?.options?.playerOptions?.requesterTransformer((query?.requester || requester)) : requester,
55
+ async resolve(player) {
56
+ const closest = await getClosestTrack(this, player, player.LavalinkManager.utils);
57
+ if (!closest)
58
+ throw new SyntaxError("No closest Track found");
59
+ Object.getOwnPropertyNames(this).forEach(prop => delete this[prop]);
60
+ Object.assign(this, closest);
61
+ return;
62
+ }
63
+ };
64
+ if (!this.isUnresolvedTrack(unresolvedTrack))
65
+ throw SyntaxError("Could not build Unresolved Track");
66
+ Object.defineProperty(unresolvedTrack, UnresolvedTrackSymbol, { configurable: true, value: true });
67
+ return unresolvedTrack;
68
+ }
43
69
  /**
44
70
  * Validate if a data is equal to a node
45
71
  * @param data
@@ -109,7 +135,7 @@ export class ManagerUitls {
109
135
  return false;
110
136
  if (data[UnresolvedTrackSymbol] === true)
111
137
  return true;
112
- return typeof data === "object" && "info" in data && typeof data.info.title === "string" && typeof data.resolve === "function";
138
+ return typeof data === "object" && (("info" in data && typeof data.info.title === "string") || typeof data.encoded === "string") && typeof data.resolve === "function";
113
139
  }
114
140
  /**
115
141
  * Checks if the provided argument is a valid UnresolvedTrack.
@@ -121,31 +147,7 @@ export class ManagerUitls {
121
147
  async getClosestTrack(data, player) {
122
148
  return getClosestTrack(data, player, this);
123
149
  }
124
- /**
125
- * Builds a UnresolvedTrack to be resolved before being played .
126
- * @param query
127
- * @param requester
128
- */
129
- buildUnresolvedTrack(query, requester) {
130
- if (typeof query === "undefined")
131
- throw new RangeError('Argument "query" must be present.');
132
- const unresolvedTrack = {
133
- encoded: query.encoded || undefined,
134
- info: query.info ?? query,
135
- requester: typeof this.manager.options?.playerOptions?.requesterTransformer === "function" ? this.manager.options?.playerOptions?.requesterTransformer((query?.requester || requester)) : requester,
136
- async resolve(player) {
137
- const closest = await getClosestTrack(this, player, player.LavalinkManager.utils);
138
- if (!closest)
139
- throw new SyntaxError("No closest Track found");
140
- Object.getOwnPropertyNames(this).forEach(prop => delete this[prop]);
141
- Object.assign(this, closest);
142
- return;
143
- }
144
- };
145
- Object.defineProperty(unresolvedTrack, UnresolvedTrackSymbol, { configurable: true, value: true });
146
- return unresolvedTrack;
147
- }
148
- validatedQueryString(node, queryString) {
150
+ validateQueryString(node, queryString) {
149
151
  if (!node.info)
150
152
  throw new Error("No Lavalink Node was provided");
151
153
  if (!node.info.sourceManagers?.length)
@@ -192,7 +194,7 @@ export class ManagerUitls {
192
194
  validateSourceString(node, sourceString) {
193
195
  if (!sourceString)
194
196
  throw new Error(`No SourceString was provided`);
195
- const source = DefaultSources[sourceString.toLowerCase()] || Object.values(DefaultSources).find(v => v.toLowerCase() === sourceString?.toLowerCase());
197
+ const source = DefaultSources[sourceString.toLowerCase()] || Object.keys(DefaultSources).find(v => v.toLowerCase() === sourceString?.toLowerCase());
196
198
  if (!source)
197
199
  throw new Error(`Lavalink Node SearchQuerySource: '${sourceString}' is not available`);
198
200
  if (source === "amsearch" && !node.info.sourceManagers.includes("applemusic")) {
@@ -286,7 +288,7 @@ export async function queueTrackEnd(player) {
286
288
  async function applyUnresolvedData(resTrack, data, utils) {
287
289
  if (!resTrack?.info || !data?.info)
288
290
  return;
289
- if (utils.manager.options.playerOptions?.useUnresolvedData === true) { // overwrite values
291
+ if (utils?.LavalinkManager?.options?.playerOptions?.useUnresolvedData === true) { // overwrite values
290
292
  if (data.info.uri)
291
293
  resTrack.info.uri = data.info.uri;
292
294
  if (data.info.artworkUrl?.length)
@@ -316,8 +318,8 @@ async function getClosestTrack(data, player, utils) {
316
318
  return utils.buildTrack(data, data.requester);
317
319
  if (!utils.isUnresolvedTrack(data))
318
320
  throw new RangeError("Track is not an unresolved Track");
319
- if (!data?.info?.title)
320
- throw new SyntaxError("the track title is required for unresolved tracks");
321
+ if (!data?.info?.title && typeof data.encoded !== "string" && !data.info.uri)
322
+ throw new SyntaxError("the track uri / title / encoded Base64 string is required for unresolved tracks");
321
323
  if (!data.requester)
322
324
  throw new SyntaxError("The requester is required");
323
325
  // try to decode the track, if possible
@@ -3,6 +3,18 @@ import { Base64 } from "./Utils";
3
3
  type LavalinkSourceNames = "youtube" | "youtubemusic" | "soundcloud" | "bandcamp" | "twitch";
4
4
  type LavalinkPlugin_LavaSrc_SourceNames = "deezer" | "spotify" | "applemusic" | "yandexmusic" | "flowery-tts";
5
5
  type SourceNames = LavalinkSourceNames | LavalinkPlugin_LavaSrc_SourceNames;
6
+ export interface LavalinkTrackInfo {
7
+ identifier: string;
8
+ title: string;
9
+ author: string;
10
+ length: number;
11
+ artworkUrl: string | null;
12
+ uri: string;
13
+ sourceName: SourceNames;
14
+ isSeekable: boolean;
15
+ isStream: boolean;
16
+ isrc: string | null;
17
+ }
6
18
  export interface TrackInfo {
7
19
  identifier: string;
8
20
  title: string;
@@ -51,11 +63,17 @@ export interface LavalinkTrack {
51
63
  /** The Base 64 encoded String */
52
64
  encoded?: Base64;
53
65
  /** Track Information */
54
- info: TrackInfo;
66
+ info: LavalinkTrackInfo;
55
67
  /** Plugin Information from Lavalink */
56
68
  pluginInfo: Partial<PluginInfo>;
57
69
  }
58
- export interface Track extends LavalinkTrack {
70
+ export interface Track {
71
+ /** The Base 64 encoded String */
72
+ encoded?: Base64;
73
+ /** Track Information */
74
+ info: TrackInfo;
75
+ /** Plugin Information from Lavalink */
76
+ pluginInfo: Partial<PluginInfo>;
59
77
  /** The Track's Requester */
60
78
  requester?: unknown;
61
79
  }
@@ -2,7 +2,7 @@ import { LavalinkFilterData } from "./Filters";
2
2
  import { LavalinkManager } from "./LavalinkManager";
3
3
  import { LavalinkNode, LavalinkNodeOptions, NodeStats } from "./Node";
4
4
  import { PlayOptions, Player } from "./Player";
5
- import { PluginInfo, Track, UnresolvedTrack, UnresolvedQuery } from "./Track";
5
+ import { PluginInfo, Track, UnresolvedTrack, UnresolvedQuery, LavalinkTrack } from "./Track";
6
6
  export declare const TrackSymbol: unique symbol;
7
7
  export declare const UnresolvedTrackSymbol: unique symbol;
8
8
  export declare const QueueSymbol: unique symbol;
@@ -37,13 +37,16 @@ export interface SearchResult {
37
37
  playlist: PlaylistInfo | null;
38
38
  tracks: Track[];
39
39
  }
40
- export interface ManagerUitls {
41
- /** @private */
42
- manager: LavalinkManager;
43
- }
44
40
  export declare class ManagerUitls {
41
+ LavalinkManager: LavalinkManager | null;
45
42
  constructor(LavalinkManager?: LavalinkManager);
46
- buildTrack(data: any, requester: any): Track;
43
+ buildTrack(data: LavalinkTrack | Track, requester: unknown): Track;
44
+ /**
45
+ * Builds a UnresolvedTrack to be resolved before being played .
46
+ * @param query
47
+ * @param requester
48
+ */
49
+ buildUnresolvedTrack(query: UnresolvedQuery | UnresolvedTrack, requester: unknown): UnresolvedTrack;
47
50
  /**
48
51
  * Validate if a data is equal to a node
49
52
  * @param data
@@ -69,15 +72,9 @@ export declare class ManagerUitls {
69
72
  * Checks if the provided argument is a valid UnresolvedTrack.
70
73
  * @param track
71
74
  */
72
- isUnresolvedTrackQuery(data: UnresolvedTrack | any): boolean;
73
- getClosestTrack(data: UnresolvedTrack, player: Player): Promise<Track>;
74
- /**
75
- * Builds a UnresolvedTrack to be resolved before being played .
76
- * @param query
77
- * @param requester
78
- */
79
- buildUnresolvedTrack(query: UnresolvedQuery | UnresolvedTrack, requester: unknown): UnresolvedTrack;
80
- validatedQueryString(node: LavalinkNode, queryString: string): void;
75
+ isUnresolvedTrackQuery(data: UnresolvedQuery | any): boolean;
76
+ getClosestTrack(data: UnresolvedTrack, player: Player): Promise<Track | undefined>;
77
+ validateQueryString(node: LavalinkNode, queryString: string): void;
81
78
  validateSourceString(node: LavalinkNode, sourceString: SearchPlatform): void;
82
79
  }
83
80
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lavalink-client",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "Easy and advanced lavalink client. Use it with lavalink plugins as well as latest lavalink versions",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",