@checkleaked/spotify-api 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,1630 @@
1
+ 'use strict';
2
+
3
+ // src/errors.ts
4
+ var SpotifyApiError = class extends Error {
5
+ constructor(init) {
6
+ super(init.message);
7
+ this.name = "SpotifyApiError";
8
+ this.status = init.status;
9
+ this.code = init.code;
10
+ this.url = init.url;
11
+ this.body = init.body;
12
+ if (init.cause !== void 0) {
13
+ this.cause = init.cause;
14
+ }
15
+ Object.setPrototypeOf(this, new.target.prototype);
16
+ }
17
+ /** True when the server returned HTTP 429. */
18
+ get isRateLimit() {
19
+ return this.status === 429;
20
+ }
21
+ /** True for HTTP 5xx responses. */
22
+ get isServerError() {
23
+ return typeof this.status === "number" && this.status >= 500;
24
+ }
25
+ /** True when the request timed out client-side. */
26
+ get isTimeout() {
27
+ return this.code === "TIMEOUT";
28
+ }
29
+ };
30
+
31
+ // src/config.ts
32
+ var PROVIDERS = {
33
+ rapidapi: { baseUrl: "https://spotify81.p.rapidapi.com", host: "spotify81.p.rapidapi.com" },
34
+ proxy: { baseUrl: "https://spotify-proxy.checkleaked.cc/spotify-data", host: void 0 }
35
+ };
36
+ var DEFAULT_USER_AGENT = "@checkleaked/spotify-api";
37
+ var DEFAULT_TIMEOUT_MS = 3e4;
38
+ var DEFAULT_RETRIES = 2;
39
+ var DEFAULT_RETRY_DELAY_MS = 500;
40
+ function readEnvKey() {
41
+ if (typeof process === "undefined" || !process.env) return void 0;
42
+ return process.env.SPOTIFY_API_KEY || process.env.RAPIDAPI_KEY || process.env.SPOTIFY_RAPIDAPI_KEY || void 0;
43
+ }
44
+ function resolveConfig(config = {}) {
45
+ const apiKey = config.apiKey || readEnvKey();
46
+ if (typeof apiKey !== "string" || apiKey.length === 0) {
47
+ throw new SpotifyApiError({
48
+ message: "A non-empty `apiKey` is required (or set SPOTIFY_API_KEY / RAPIDAPI_KEY).",
49
+ code: "CONFIG"
50
+ });
51
+ }
52
+ const provider = config.provider ?? "rapidapi";
53
+ const preset = PROVIDERS[provider];
54
+ if (!preset) {
55
+ throw new SpotifyApiError({
56
+ message: `Unknown provider "${provider}". Use "rapidapi" or "proxy".`,
57
+ code: "CONFIG"
58
+ });
59
+ }
60
+ const baseUrl = (config.baseUrl ?? preset.baseUrl).replace(/\/+$/, "");
61
+ const host = config.host ?? preset.host;
62
+ const fetchImpl = config.fetch ?? globalThis.fetch;
63
+ if (typeof fetchImpl !== "function") {
64
+ throw new SpotifyApiError({
65
+ message: "No global `fetch` found. Provide `config.fetch` or run on Node >= 18.",
66
+ code: "CONFIG"
67
+ });
68
+ }
69
+ const debug = config.debug === true ? (msg, detail) => console.error(`[spotify-api] ${msg}`, detail ?? "") : typeof config.debug === "function" ? config.debug : void 0;
70
+ return {
71
+ apiKey,
72
+ baseUrl,
73
+ host,
74
+ timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,
75
+ retries: config.retries ?? DEFAULT_RETRIES,
76
+ retryDelayMs: config.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS,
77
+ headers: config.headers ?? {},
78
+ fetch: fetchImpl,
79
+ userAgent: config.userAgent ?? DEFAULT_USER_AGENT,
80
+ debug,
81
+ onRequest: config.onRequest,
82
+ onResponse: config.onResponse,
83
+ onRetry: config.onRetry
84
+ };
85
+ }
86
+
87
+ // src/ids.ts
88
+ var URI_RE = /^spotify:[a-z0-9]+:([A-Za-z0-9]+)$/i;
89
+ var URL_RE = /open\.spotify\.com\/(?:intl-[a-z-]+\/)?[a-z-]+\/([A-Za-z0-9]+)/i;
90
+ function normalizeId(input) {
91
+ const s = String(input).trim();
92
+ const uri = URI_RE.exec(s);
93
+ if (uri) return uri[1];
94
+ const url = URL_RE.exec(s);
95
+ if (url) return url[1];
96
+ return s;
97
+ }
98
+ function normalizeIds(input) {
99
+ const arr = Array.isArray(input) ? input : String(input).split(",");
100
+ return arr.map((x) => normalizeId(x)).filter((x) => x.length > 0).join(",");
101
+ }
102
+
103
+ // src/core.ts
104
+ var SpotifyHttpClient = class {
105
+ constructor(config) {
106
+ this.config = resolveConfig(config);
107
+ }
108
+ /** Perform a request and return the full {@link SuccessEnvelope}. */
109
+ async request(options) {
110
+ const method = options.method ?? "GET";
111
+ const url = this.buildUrl(options.path, options.query);
112
+ const cfg = this.config;
113
+ const headers = {
114
+ "x-rapidapi-key": cfg.apiKey,
115
+ accept: "application/json",
116
+ "user-agent": cfg.userAgent,
117
+ ...cfg.headers,
118
+ ...options.headers
119
+ };
120
+ if (cfg.host) headers["x-rapidapi-host"] = cfg.host;
121
+ let bodyInit;
122
+ if (options.body !== void 0 && options.body !== null) {
123
+ bodyInit = typeof options.body === "string" ? options.body : JSON.stringify(options.body);
124
+ if (!("content-type" in headers)) headers["content-type"] = "application/json";
125
+ }
126
+ cfg.onRequest?.({ method, url, headers });
127
+ cfg.debug?.(`\u2192 ${method} ${url}`);
128
+ const maxAttempts = Math.max(1, cfg.retries + 1);
129
+ let lastError;
130
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
131
+ const attemptStart = Date.now();
132
+ const controller = new AbortController();
133
+ const external = options.signal;
134
+ const onExternalAbort = () => controller.abort();
135
+ if (external) {
136
+ if (external.aborted) controller.abort();
137
+ else external.addEventListener("abort", onExternalAbort, { once: true });
138
+ }
139
+ let timedOut = false;
140
+ const timer = setTimeout(() => {
141
+ timedOut = true;
142
+ controller.abort();
143
+ }, cfg.timeoutMs);
144
+ let response;
145
+ try {
146
+ response = await cfg.fetch(url, { method, headers, body: bodyInit, signal: controller.signal });
147
+ } catch (err) {
148
+ clearTimeout(timer);
149
+ external?.removeEventListener("abort", onExternalAbort);
150
+ if (external?.aborted) {
151
+ throw new SpotifyApiError({ message: "Request aborted by caller.", code: "ABORTED", url, cause: err });
152
+ }
153
+ lastError = timedOut ? new SpotifyApiError({
154
+ message: `Request timed out after ${cfg.timeoutMs}ms.`,
155
+ code: "TIMEOUT",
156
+ url,
157
+ cause: err
158
+ }) : new SpotifyApiError({ message: `Network error: ${errMessage(err)}`, code: "NETWORK", url, cause: err });
159
+ if (attempt < maxAttempts - 1) {
160
+ const delayMs = this.backoff(attempt);
161
+ cfg.onRetry?.({ attempt: attempt + 1, method, url, error: lastError, delayMs });
162
+ cfg.debug?.(`retry ${attempt + 1} after ${delayMs}ms (${lastError.code})`);
163
+ await sleep(delayMs);
164
+ continue;
165
+ }
166
+ throw lastError;
167
+ }
168
+ clearTimeout(timer);
169
+ external?.removeEventListener("abort", onExternalAbort);
170
+ cfg.onResponse?.({ method, url, status: response.status, durationMs: Date.now() - attemptStart });
171
+ cfg.debug?.(`\u2190 ${response.status} ${method} ${url} (${Date.now() - attemptStart}ms)`);
172
+ if ((response.status === 429 || response.status >= 500) && attempt < maxAttempts - 1) {
173
+ const retryAfter = parseRetryAfter(response.headers.get("retry-after"));
174
+ const delayMs = retryAfter ?? this.backoff(attempt);
175
+ cfg.onRetry?.({ attempt: attempt + 1, method, url, status: response.status, delayMs });
176
+ cfg.debug?.(`retry ${attempt + 1} after ${delayMs}ms (status ${response.status})`);
177
+ await sleep(delayMs);
178
+ continue;
179
+ }
180
+ const raw = await response.text();
181
+ let json;
182
+ if (raw.length > 0) {
183
+ try {
184
+ json = JSON.parse(raw);
185
+ } catch {
186
+ json = raw;
187
+ }
188
+ }
189
+ if (!response.ok) {
190
+ throw new SpotifyApiError({
191
+ message: extractMessage(json) ?? `HTTP ${response.status} ${response.statusText}`.trim(),
192
+ status: response.status,
193
+ code: extractCode(json),
194
+ url,
195
+ body: json
196
+ });
197
+ }
198
+ if (typeof json === "object" && json !== null) {
199
+ const rec = json;
200
+ if (rec.success === false) {
201
+ throw new SpotifyApiError({
202
+ message: extractMessage(json) ?? "Upstream reported failure.",
203
+ status: response.status,
204
+ code: extractCode(json),
205
+ url,
206
+ body: json
207
+ });
208
+ }
209
+ if ("success" in rec && "data" in rec) {
210
+ return json;
211
+ }
212
+ }
213
+ return { success: true, data: json };
214
+ }
215
+ throw lastError ?? new SpotifyApiError({ message: "Request failed.", url });
216
+ }
217
+ /** GET a path and return the unwrapped `data` payload. */
218
+ async get(path, query, options) {
219
+ const env = await this.request({ method: "GET", path, query, ...options });
220
+ return env.data;
221
+ }
222
+ /** POST a JSON body and return the unwrapped `data` payload. */
223
+ async post(path, body, query, options) {
224
+ const env = await this.request({ method: "POST", path, body, query, ...options });
225
+ return env.data;
226
+ }
227
+ /** DELETE a path and return the unwrapped `data` payload. */
228
+ async delete(path, query, options) {
229
+ const env = await this.request({ method: "DELETE", path, query, ...options });
230
+ return env.data;
231
+ }
232
+ buildUrl(path, query) {
233
+ const suffix = path.startsWith("/") ? path : `/${path}`;
234
+ const qs = serializeQuery(query);
235
+ return `${this.config.baseUrl}${suffix}${qs ? `?${qs}` : ""}`;
236
+ }
237
+ backoff(attempt) {
238
+ const base = this.config.retryDelayMs * 2 ** attempt;
239
+ return base + Math.floor(Math.random() * this.config.retryDelayMs);
240
+ }
241
+ };
242
+ var ID_SINGLE_KEYS = /* @__PURE__ */ new Set(["id", "spotify_track_id"]);
243
+ var ID_MULTI_KEYS = /* @__PURE__ */ new Set(["ids", "seed_tracks", "seed_artists"]);
244
+ function serializeQuery(query) {
245
+ if (!query) return "";
246
+ const params = new URLSearchParams();
247
+ for (const [key, value] of Object.entries(query)) {
248
+ if (value === void 0 || value === null) continue;
249
+ if (ID_MULTI_KEYS.has(key)) {
250
+ const normalized = normalizeIds(value);
251
+ if (normalized.length > 0) params.append(key, normalized);
252
+ } else if (ID_SINGLE_KEYS.has(key) && !Array.isArray(value)) {
253
+ params.append(key, normalizeId(value));
254
+ } else if (Array.isArray(value)) {
255
+ if (value.length > 0) params.append(key, value.join(","));
256
+ } else {
257
+ params.append(key, String(value));
258
+ }
259
+ }
260
+ return params.toString();
261
+ }
262
+ function extractMessage(json) {
263
+ if (typeof json === "object" && json !== null) {
264
+ const rec = json;
265
+ if (typeof rec.message === "string") return rec.message;
266
+ if (typeof rec.error === "string") return rec.error;
267
+ }
268
+ return void 0;
269
+ }
270
+ function extractCode(json) {
271
+ if (typeof json === "object" && json !== null) {
272
+ const rec = json;
273
+ if (typeof rec.error === "string") return rec.error;
274
+ if (typeof rec.code === "string") return rec.code;
275
+ }
276
+ return void 0;
277
+ }
278
+ function parseRetryAfter(value) {
279
+ if (!value) return void 0;
280
+ const seconds = Number(value);
281
+ if (Number.isFinite(seconds)) return Math.max(0, seconds * 1e3);
282
+ const date = Date.parse(value);
283
+ if (Number.isFinite(date)) return Math.max(0, date - Date.now());
284
+ return void 0;
285
+ }
286
+ function errMessage(err) {
287
+ return err instanceof Error ? err.message : String(err);
288
+ }
289
+ function sleep(ms) {
290
+ return new Promise((resolve) => setTimeout(resolve, ms));
291
+ }
292
+
293
+ // src/resources/base.ts
294
+ var Resource = class {
295
+ constructor(client) {
296
+ this.client = client;
297
+ }
298
+ };
299
+ function buildPath(template, params) {
300
+ return template.replace(/\{([^}]+)\}/g, (_, key) => {
301
+ const value = params[key];
302
+ if (value === void 0 || value === null) {
303
+ throw new Error(`Missing path parameter "${key}" for "${template}".`);
304
+ }
305
+ const normalized = /id$/i.test(key) ? normalizeId(value) : String(value);
306
+ return encodeURIComponent(normalized);
307
+ });
308
+ }
309
+
310
+ // src/resources/ai.ts
311
+ var AiResource = class extends Resource {
312
+ /** AI module health. */
313
+ health(query, options) {
314
+ return this.client.get("/ai/health", query, options);
315
+ }
316
+ /** List the supported AI analysis types. */
317
+ types(query, options) {
318
+ return this.client.get("/ai/types", query, options);
319
+ }
320
+ /** Run a generic AI analysis. */
321
+ analyze(body, query, options) {
322
+ return this.client.post("/ai/analyze", body, query, options);
323
+ }
324
+ /** Analyze chart trends. */
325
+ chartTrends(body, query, options) {
326
+ return this.client.post("/ai/chart-trends", body, query, options);
327
+ }
328
+ /** Generate an AI artist summary. */
329
+ artistSummary(body, query, options) {
330
+ return this.client.post("/ai/artist-summary", body, query, options);
331
+ }
332
+ /** Generate an AI album review. */
333
+ albumReview(body, query, options) {
334
+ return this.client.post("/ai/album-review", body, query, options);
335
+ }
336
+ /** Generate an AI track deep dive. */
337
+ trackDeepDive(body, query, options) {
338
+ return this.client.post("/ai/track-deep-dive", body, query, options);
339
+ }
340
+ /** Curate a playlist with AI. */
341
+ playlistCurator(body, query, options) {
342
+ return this.client.post("/ai/playlist-curator", body, query, options);
343
+ }
344
+ /** Generate an AI market comparison. */
345
+ marketComparison(body, query, options) {
346
+ return this.client.post("/ai/market-comparison", body, query, options);
347
+ }
348
+ /** Generate an AI genre landscape. */
349
+ genreLandscape(body, query, options) {
350
+ return this.client.post("/ai/genre-landscape", body, query, options);
351
+ }
352
+ /** Generate an AI mood profile. */
353
+ moodProfile(body, query, options) {
354
+ return this.client.post("/ai/mood-profile", body, query, options);
355
+ }
356
+ /** Assess viral potential with AI. */
357
+ viralPotential(body, query, options) {
358
+ return this.client.post("/ai/viral-potential", body, query, options);
359
+ }
360
+ /** Run a custom AI prompt. */
361
+ custom(body, query, options) {
362
+ return this.client.post("/ai/custom", body, query, options);
363
+ }
364
+ };
365
+
366
+ // src/resources/albums.ts
367
+ var AlbumsResource = class extends Resource {
368
+ /** Get one or more albums by ID. */
369
+ get(params, options) {
370
+ return this.client.get("/albums", { ids: params.ids, contrast: params.contrast }, options);
371
+ }
372
+ /** Get an album's tracks (paginated). */
373
+ tracks(params, options) {
374
+ return this.client.get(
375
+ "/album_tracks",
376
+ { id: params.id, offset: params.offset, limit: params.limit },
377
+ options
378
+ );
379
+ }
380
+ /** Get extended album metadata. */
381
+ metadata(params, options) {
382
+ return this.client.get(
383
+ "/album_metadata",
384
+ { id: params.id, contrast: params.contrast },
385
+ options
386
+ );
387
+ }
388
+ };
389
+
390
+ // src/resources/analysis.ts
391
+ var AnalysisResource = class extends Resource {
392
+ /** Compare artists side by side. */
393
+ artistCompare(params, options) {
394
+ return this.client.get("/artist_compare", { ids: params.ids }, options);
395
+ }
396
+ /** Get audio features for a track. */
397
+ audioFeatures(params, options) {
398
+ return this.client.get("/audio_features", { id: params.id }, options);
399
+ }
400
+ /** Get analysis for a playlist. */
401
+ playlistAnalysis(params, options) {
402
+ return this.client.get("/playlist_analysis", { id: params.id }, options);
403
+ }
404
+ };
405
+
406
+ // src/resources/artists.ts
407
+ var ArtistsResource = class extends Resource {
408
+ /** Get one or more artists by ID. */
409
+ get(params, options) {
410
+ return this.client.get("/artists", { ids: params.ids, contrast: params.contrast }, options);
411
+ }
412
+ /** Get an artist overview. */
413
+ overview(params, options) {
414
+ return this.client.get(
415
+ "/artist_overview",
416
+ { id: params.id, contrast: params.contrast },
417
+ options
418
+ );
419
+ }
420
+ /** Get an artist's discography overview. */
421
+ discographyOverview(params, options) {
422
+ return this.client.get(
423
+ "/artist_discography_overview",
424
+ { id: params.id },
425
+ options
426
+ );
427
+ }
428
+ /** Get an artist's albums (paginated). */
429
+ albums(params, options) {
430
+ return this.client.get(
431
+ "/artist_albums",
432
+ { id: params.id, offset: params.offset, limit: params.limit },
433
+ options
434
+ );
435
+ }
436
+ /** Get an artist's singles (paginated). */
437
+ singles(params, options) {
438
+ return this.client.get(
439
+ "/artist_singles",
440
+ { id: params.id, offset: params.offset, limit: params.limit },
441
+ options
442
+ );
443
+ }
444
+ /** Get releases an artist appears on. */
445
+ appearsOn(params, options) {
446
+ return this.client.get("/artist_appears_on", { id: params.id }, options);
447
+ }
448
+ /** Get playlists an artist was discovered on. */
449
+ discoveredOn(params, options) {
450
+ return this.client.get("/artist_discovered_on", { id: params.id }, options);
451
+ }
452
+ /** Get tracks featuring an artist. */
453
+ featuring(params, options) {
454
+ return this.client.get("/artist_featuring", { id: params.id }, options);
455
+ }
456
+ /** Get artists related to an artist. */
457
+ related(params, options) {
458
+ return this.client.get("/artist_related", { id: params.id }, options);
459
+ }
460
+ /** Get an artist's top tracks. */
461
+ topTracks(params, options) {
462
+ return this.client.get(
463
+ "/artist_top_tracks",
464
+ { id: params.id, market: params.market },
465
+ options
466
+ );
467
+ }
468
+ };
469
+
470
+ // src/resources/audiobooks.ts
471
+ var AudiobooksResource = class extends Resource {
472
+ /** Get one or more audiobooks by ID. */
473
+ get(params, options) {
474
+ return this.client.get("/audiobooks", { ids: params.ids, market: params.market }, options);
475
+ }
476
+ /** Get a single audiobook by ID. */
477
+ getById(params, options) {
478
+ const path = buildPath("/audiobooks/{id}", { id: params.id });
479
+ return this.client.get(path, { market: params.market }, options);
480
+ }
481
+ /** Get an audiobook's chapters (paginated). */
482
+ chapters(params, options) {
483
+ const path = buildPath("/audiobooks/{id}/chapters", { id: params.id });
484
+ return this.client.get(path, { offset: params.offset, limit: params.limit }, options);
485
+ }
486
+ };
487
+
488
+ // src/resources/batch.ts
489
+ var BatchResource = class extends Resource {
490
+ /** Get extended album metadata for many albums at once. */
491
+ albumMetadata(params, options) {
492
+ return this.client.get("/album_metadata_batch", { ids: params.ids }, options);
493
+ }
494
+ /** Get artist overviews for many artists at once. */
495
+ artistOverview(params, options) {
496
+ return this.client.get("/artist_overview_batch", { ids: params.ids }, options);
497
+ }
498
+ /** Get credits for many tracks at once. */
499
+ trackCredits(params, options) {
500
+ return this.client.get("/track_credits_batch", { ids: params.ids }, options);
501
+ }
502
+ /** Get synced lyrics for many tracks at once. */
503
+ trackLyrics(params, options) {
504
+ return this.client.get(
505
+ "/track_lyrics_batch",
506
+ { ids: params.ids, format: params.format },
507
+ options
508
+ );
509
+ }
510
+ /** Get popularity scores for many tracks at once. */
511
+ trackPopularity(params, options) {
512
+ return this.client.get("/track_popularity_batch", { ids: params.ids }, options);
513
+ }
514
+ };
515
+
516
+ // src/resources/browse.ts
517
+ var BrowseResource = class extends Resource {
518
+ /** List browse categories. */
519
+ categories(params, options) {
520
+ return this.client.get(
521
+ "/browse/categories",
522
+ {
523
+ country: params?.country,
524
+ locale: params?.locale,
525
+ limit: params?.limit,
526
+ offset: params?.offset
527
+ },
528
+ options
529
+ );
530
+ }
531
+ /** Get a single browse category by ID. */
532
+ category(params, options) {
533
+ const path = buildPath("/browse/categories/{id}", { id: params.id });
534
+ return this.client.get(
535
+ path,
536
+ { country: params.country, locale: params.locale },
537
+ options
538
+ );
539
+ }
540
+ /** Get featured playlists. */
541
+ featuredPlaylists(params, options) {
542
+ return this.client.get(
543
+ "/browse/featured-playlists",
544
+ {
545
+ country: params?.country,
546
+ locale: params?.locale,
547
+ limit: params?.limit,
548
+ offset: params?.offset
549
+ },
550
+ options
551
+ );
552
+ }
553
+ /** Get new album releases. */
554
+ newReleases(params, options) {
555
+ return this.client.get(
556
+ "/browse/new-releases",
557
+ { country: params?.country, limit: params?.limit, offset: params?.offset },
558
+ options
559
+ );
560
+ }
561
+ /** Get track recommendations from seed tracks, artists, and/or genres. */
562
+ recommendations(params, options) {
563
+ return this.client.get(
564
+ "/browse/recommendations",
565
+ {
566
+ seed_tracks: params?.seed_tracks,
567
+ seed_artists: params?.seed_artists,
568
+ seed_genres: params?.seed_genres,
569
+ limit: params?.limit
570
+ },
571
+ options
572
+ );
573
+ }
574
+ };
575
+
576
+ // src/resources/cache.ts
577
+ var CacheResource = class extends Resource {
578
+ /** Get cache statistics (hits, misses, size, etc.). */
579
+ stats(query, options) {
580
+ return this.client.get("/cache/stats", query, options);
581
+ }
582
+ /** Invalidate cached entries by exact key or by matching pattern. */
583
+ invalidate(params, options) {
584
+ return this.client.post(
585
+ "/cache/invalidate",
586
+ { key: params.key, pattern: params.pattern },
587
+ void 0,
588
+ options
589
+ );
590
+ }
591
+ };
592
+
593
+ // src/resources/charts.ts
594
+ var ChartsResource = class extends Resource {
595
+ /** Top 20 artists by monthly listeners. */
596
+ topByMonthlyListeners(query, options) {
597
+ return this.client.get("/top_20_by_monthly_listeners", query, options);
598
+ }
599
+ /** Top 200 tracks chart. */
600
+ top200Tracks(params, options) {
601
+ return this.client.get(
602
+ "/top_200_tracks",
603
+ { period: params.period, country: params.country, date: params.date },
604
+ options
605
+ );
606
+ }
607
+ /** Top artists chart. */
608
+ topArtists(params, options) {
609
+ return this.client.get(
610
+ "/top_artists",
611
+ { period: params.period, country: params.country },
612
+ options
613
+ );
614
+ }
615
+ /** Top albums chart. */
616
+ topAlbums(params, options) {
617
+ return this.client.get(
618
+ "/top_albums",
619
+ { period: params.period, country: params.country },
620
+ options
621
+ );
622
+ }
623
+ /** Viral tracks chart. */
624
+ viralTracks(params, options) {
625
+ return this.client.get("/viral_tracks", { country: params.country }, options);
626
+ }
627
+ /** Top 20 artists by followers. */
628
+ topByFollowers(query, options) {
629
+ return this.client.get("/top_20_by_followers", query, options);
630
+ }
631
+ };
632
+
633
+ // src/resources/concerts.ts
634
+ var ConcertsResource = class extends Resource {
635
+ /** Search concert locations by city, venue, or place name. */
636
+ locations(params, options) {
637
+ return this.client.get(
638
+ "/partner/concert-locations",
639
+ { query: params.query },
640
+ options
641
+ );
642
+ }
643
+ /** Get the concert feed for a location. */
644
+ feed(params, options) {
645
+ return this.client.get(
646
+ "/partner/concert-feed",
647
+ {
648
+ geoHash: params.geoHash,
649
+ geonameId: params.geonameId,
650
+ from: params.from,
651
+ to: params.to,
652
+ radiusInKm: params.radiusInKm,
653
+ conceptUris: params.conceptUris,
654
+ paginationKey: params.paginationKey,
655
+ details: params.details,
656
+ detailsLimit: params.detailsLimit,
657
+ parsed: params.parsed
658
+ },
659
+ options
660
+ );
661
+ }
662
+ /** Get details for a single concert. */
663
+ get(params, options) {
664
+ return this.client.get(
665
+ "/partner/concert",
666
+ { id: params.id, parsed: params.parsed, authenticated: params.authenticated },
667
+ options
668
+ );
669
+ }
670
+ /** Get an artist's upcoming concerts. */
671
+ byArtist(params, options) {
672
+ return this.client.get(
673
+ "/partner/artist-concerts",
674
+ {
675
+ id: params.id,
676
+ geoHash: params.geoHash,
677
+ includeNearby: params.includeNearby,
678
+ details: params.details,
679
+ detailsLimit: params.detailsLimit,
680
+ parsed: params.parsed
681
+ },
682
+ options
683
+ );
684
+ }
685
+ /** Search concerts by artist name. */
686
+ searchArtists(params, options) {
687
+ return this.client.get(
688
+ "/partner/search-concert-artists",
689
+ {
690
+ query: params.query,
691
+ geoHash: params.geoHash,
692
+ includeNearby: params.includeNearby,
693
+ limit: params.limit,
694
+ details: params.details,
695
+ detailsLimit: params.detailsLimit,
696
+ parsed: params.parsed
697
+ },
698
+ options
699
+ );
700
+ }
701
+ };
702
+
703
+ // src/resources/credentials.ts
704
+ var CredentialsResource = class extends Resource {
705
+ /** Get the current credentials status. */
706
+ status(query, options) {
707
+ return this.client.get("/credentials/status", query, options);
708
+ }
709
+ /** Get the Redis-backed cookie pool status. */
710
+ redisCookies(query, options) {
711
+ return this.client.get("/cookies/redis", query, options);
712
+ }
713
+ };
714
+
715
+ // src/resources/downloads.ts
716
+ var DownloadsResource = class extends Resource {
717
+ /** Download a track. */
718
+ track(params, options) {
719
+ return this.client.get("/download_track", { q: params.q }, options);
720
+ }
721
+ /** Download a track from SoundCloud. */
722
+ soundcloud(params, options) {
723
+ return this.client.get("/download_track_sc", { q: params.q }, options);
724
+ }
725
+ };
726
+
727
+ // src/resources/episodes.ts
728
+ var EpisodesResource = class extends Resource {
729
+ /** Get one or more episodes by ID. */
730
+ get(params, options) {
731
+ return this.client.get("/episodes", { ids: params.ids, market: params.market }, options);
732
+ }
733
+ /** Get a single episode by ID. */
734
+ byId(params, options) {
735
+ const path = buildPath("/episodes/{id}", { id: params.id });
736
+ return this.client.get(path, { market: params.market }, options);
737
+ }
738
+ };
739
+
740
+ // src/resources/health.ts
741
+ var HealthResource = class extends Resource {
742
+ /** Lightweight liveness probe. */
743
+ ping(query, options) {
744
+ return this.client.get("/ping", query, options);
745
+ }
746
+ /** Overall cluster health summary. */
747
+ get(query, options) {
748
+ return this.client.get("/health", query, options);
749
+ }
750
+ /** Health of the individual instance serving the request. */
751
+ instance(query, options) {
752
+ return this.client.get("/health/instance", query, options);
753
+ }
754
+ /** Cluster-wide health overview. */
755
+ cluster(query, options) {
756
+ return this.client.get("/health/cluster", query, options);
757
+ }
758
+ /** Strict cluster health check (fails unless every instance is healthy). */
759
+ clusterStrict(query, options) {
760
+ return this.client.get("/health/cluster/strict", query, options);
761
+ }
762
+ /** Health and statistics for the proxy pool. */
763
+ proxies(query, options) {
764
+ return this.client.get("/health/proxies", query, options);
765
+ }
766
+ /** Clear accumulated proxy statistics. */
767
+ clearProxies(body, query, options) {
768
+ return this.client.post("/health/proxies/clear", body, query, options);
769
+ }
770
+ /** Clear accumulated error counters. */
771
+ clearErrors(body, query, options) {
772
+ return this.client.post("/health/clear-errors", body, query, options);
773
+ }
774
+ };
775
+
776
+ // src/resources/lookups.ts
777
+ var LookupsResource = class extends Resource {
778
+ /** Lookup a track by its ISRC. */
779
+ isrc(params, options) {
780
+ return this.client.get("/isrc_lookup", { isrc: params.isrc }, options);
781
+ }
782
+ /** Lookup an album by its UPC. */
783
+ upc(params, options) {
784
+ return this.client.get("/upc_lookup", { upc: params.upc }, options);
785
+ }
786
+ };
787
+
788
+ // src/resources/markets.ts
789
+ var MarketsResource = class extends Resource {
790
+ /** List the markets (countries) where Spotify is available. */
791
+ get(query, options) {
792
+ return this.client.get("/markets", query, options);
793
+ }
794
+ };
795
+
796
+ // src/resources/partner.ts
797
+ var PartnerResource = class extends Resource {
798
+ /** Get partner playlist data (paginated). */
799
+ playlist(params, options) {
800
+ return this.client.get(
801
+ "/partner/playlist",
802
+ { id: params.id, offset: params.offset, limit: params.limit },
803
+ options
804
+ );
805
+ }
806
+ /** Get partner track data. */
807
+ track(params, options) {
808
+ return this.client.get("/partner/track", { id: params.id }, options);
809
+ }
810
+ /** Get a track's play count by Spotify ID or ISRC. */
811
+ trackCount(params, options) {
812
+ return this.client.get(
813
+ "/partner/track/count",
814
+ { spotify_track_id: params.spotify_track_id, isrc: params.isrc },
815
+ options
816
+ );
817
+ }
818
+ /** Get partner album data (paginated). */
819
+ album(params, options) {
820
+ return this.client.get(
821
+ "/partner/album",
822
+ { id: params.id, locale: params.locale, offset: params.offset, limit: params.limit },
823
+ options
824
+ );
825
+ }
826
+ /** Get partner artist overview. */
827
+ artistOverview(params, options) {
828
+ return this.client.get(
829
+ "/partner/artist-overview",
830
+ { id: params.id, locale: params.locale, includePrerelease: params.includePrerelease },
831
+ options
832
+ );
833
+ }
834
+ /** Get partner artist discography (paginated). */
835
+ artistDiscography(params, options) {
836
+ return this.client.get(
837
+ "/partner/artist-discography",
838
+ { id: params.id, offset: params.offset, limit: params.limit },
839
+ options
840
+ );
841
+ }
842
+ };
843
+
844
+ // src/resources/playlists.ts
845
+ var PlaylistsResource = class extends Resource {
846
+ /** Get a playlist by ID. */
847
+ get(params, options) {
848
+ return this.client.get("/playlist", { id: params.id }, options);
849
+ }
850
+ /** Get a playlist's tracks (paginated). */
851
+ tracks(params, options) {
852
+ return this.client.get(
853
+ "/playlist_tracks",
854
+ { id: params.id, offset: params.offset, limit: params.limit },
855
+ options
856
+ );
857
+ }
858
+ /** Generate a playlist from a seed URI. */
859
+ fromSeed(params, options) {
860
+ return this.client.get("/seed_to_playlist", { uri: params.uri }, options);
861
+ }
862
+ };
863
+
864
+ // src/resources/search.ts
865
+ var SearchResource = class extends Resource {
866
+ /** Search Spotify across one or more types. */
867
+ search(params, options) {
868
+ return this.client.get(
869
+ "/search",
870
+ {
871
+ q: params.q,
872
+ type: params.type,
873
+ offset: params.offset,
874
+ limit: params.limit,
875
+ numberOfTopResults: params.numberOfTopResults,
876
+ contrast: params.contrast
877
+ },
878
+ options
879
+ );
880
+ }
881
+ /** Search returning only the top results. */
882
+ topResults(params, options) {
883
+ return this.client.get(
884
+ "/search_top_results",
885
+ { q: params.q, numberOfTopResults: params.numberOfTopResults, contrast: params.contrast },
886
+ options
887
+ );
888
+ }
889
+ /** Search and return synced lyrics for the best match. */
890
+ lyrics(params, options) {
891
+ return this.client.get("/search_lyrics", { q: params.q, format: params.format }, options);
892
+ }
893
+ /** Search suggestions / autocomplete. */
894
+ suggestions(params, options) {
895
+ return this.client.get(
896
+ "/search_suggestions",
897
+ {
898
+ q: params.q,
899
+ offset: params.offset,
900
+ limit: params.limit,
901
+ numberOfTopResults: params.numberOfTopResults,
902
+ includeAuthors: params.includeAuthors,
903
+ debug: params.debug,
904
+ timeout: params.timeout,
905
+ contrast: params.contrast
906
+ },
907
+ options
908
+ );
909
+ }
910
+ /** Search across multiple markets at once. */
911
+ multiMarket(params, options) {
912
+ return this.client.get(
913
+ "/search_multi_market",
914
+ { q: params.q, type: params.type, markets: params.markets, limit: params.limit },
915
+ options
916
+ );
917
+ }
918
+ };
919
+
920
+ // src/resources/shows.ts
921
+ var ShowsResource = class extends Resource {
922
+ /** Get one or more shows by ID. */
923
+ get(params, options) {
924
+ return this.client.get("/shows", { ids: params.ids, market: params.market }, options);
925
+ }
926
+ /** Get a single show by ID. */
927
+ getById(params, options) {
928
+ const path = buildPath("/shows/{id}", { id: params.id });
929
+ return this.client.get(path, { market: params.market }, options);
930
+ }
931
+ /** Get a show's episodes (paginated). */
932
+ episodes(params, options) {
933
+ const path = buildPath("/shows/{id}/episodes", { id: params.id });
934
+ return this.client.get(path, { offset: params.offset, limit: params.limit }, options);
935
+ }
936
+ };
937
+
938
+ // src/resources/snapshots.ts
939
+ var SnapshotsResource = class extends Resource {
940
+ /** List the snapshots taken for a playlist. */
941
+ list(params, options) {
942
+ return this.client.get("/playlist_snapshot", { id: params.id }, options);
943
+ }
944
+ /** Create a new snapshot of a playlist. */
945
+ create(params, options) {
946
+ return this.client.post(
947
+ "/playlist_snapshot",
948
+ { id: params.id, webhook: params.webhook },
949
+ void 0,
950
+ options
951
+ );
952
+ }
953
+ };
954
+
955
+ // src/resources/tracking.ts
956
+ var TrackingResource = class extends Resource {
957
+ /** Start tracking a Spotify item. */
958
+ track(params, options) {
959
+ return this.client.post("/tracking/track", { type: params.type, id: params.id }, void 0, options);
960
+ }
961
+ /** Stop tracking a Spotify item. */
962
+ untrack(params, options) {
963
+ return this.client.delete("/tracking/untrack", { type: params.type, id: params.id }, options);
964
+ }
965
+ /** List tracked items (paginated). */
966
+ items(params, options) {
967
+ return this.client.get(
968
+ "/tracking/items",
969
+ { offset: params.offset, limit: params.limit },
970
+ options
971
+ );
972
+ }
973
+ /** Get the detail of a single tracked item. */
974
+ item(params, options) {
975
+ const path = buildPath("/tracking/items/{spotifyType}/{spotifyId}", {
976
+ spotifyType: params.spotifyType,
977
+ spotifyId: params.spotifyId
978
+ });
979
+ return this.client.get(path, void 0, options);
980
+ }
981
+ /** Get the tracking change log (paginated). */
982
+ logs(params, options) {
983
+ return this.client.get(
984
+ "/tracking/logs",
985
+ { offset: params.offset, limit: params.limit },
986
+ options
987
+ );
988
+ }
989
+ /** Get tracking statistics. */
990
+ stats(query, options) {
991
+ return this.client.get("/tracking/stats", query, options);
992
+ }
993
+ /** Get tracking subsystem health. */
994
+ health(query, options) {
995
+ return this.client.get("/tracking/health", query, options);
996
+ }
997
+ };
998
+
999
+ // src/resources/tracks.ts
1000
+ var TracksResource = class extends Resource {
1001
+ /** Get one or more tracks by ID. */
1002
+ get(params, options) {
1003
+ return this.client.get("/tracks", { ids: params.ids, contrast: params.contrast }, options);
1004
+ }
1005
+ /** Get a track's credits (writers, producers, performers). */
1006
+ credits(params, options) {
1007
+ return this.client.get("/track_credits", { id: params.id }, options);
1008
+ }
1009
+ /** Get a track's lyrics. */
1010
+ lyrics(params, options) {
1011
+ return this.client.get(
1012
+ "/track_lyrics",
1013
+ { id: params.id, format: params.format, vocalRemoval: params.vocalRemoval },
1014
+ options
1015
+ );
1016
+ }
1017
+ /** Get track recommendations from seed tracks, artists and/or genres. */
1018
+ recommendations(params, options) {
1019
+ return this.client.get(
1020
+ "/recommendations",
1021
+ {
1022
+ limit: params.limit,
1023
+ seed_tracks: params.seed_tracks,
1024
+ seed_artists: params.seed_artists,
1025
+ seed_genres: params.seed_genres
1026
+ },
1027
+ options
1028
+ );
1029
+ }
1030
+ };
1031
+
1032
+ // src/resources/users.ts
1033
+ var UsersResource = class extends Resource {
1034
+ /** Get a public user profile, including their playlists, artists and episodes. */
1035
+ profile(params, options) {
1036
+ return this.client.get(
1037
+ "/user_profile",
1038
+ {
1039
+ id: params.id,
1040
+ playlistLimit: params.playlistLimit,
1041
+ artistLimit: params.artistLimit,
1042
+ episodeLimit: params.episodeLimit
1043
+ },
1044
+ options
1045
+ );
1046
+ }
1047
+ /** Get a user's followers. */
1048
+ followers(params, options) {
1049
+ return this.client.get("/user_followers", { id: params.id }, options);
1050
+ }
1051
+ };
1052
+
1053
+ // src/resources/webhooks.ts
1054
+ var WebhooksResource = class extends Resource {
1055
+ /** List registered webhooks. */
1056
+ get(query, options) {
1057
+ return this.client.get("/webhooks", query, options);
1058
+ }
1059
+ /** Register a new webhook. */
1060
+ register(params, options) {
1061
+ return this.client.post(
1062
+ "/webhooks/register",
1063
+ { url: params.url, events: params.events },
1064
+ void 0,
1065
+ options
1066
+ );
1067
+ }
1068
+ /** Get aggregate webhook delivery statistics. */
1069
+ stats(query, options) {
1070
+ return this.client.get("/webhooks/stats", query, options);
1071
+ }
1072
+ /** Delete a webhook by ID. */
1073
+ delete(params, options) {
1074
+ return this.client.delete(buildPath("/webhooks/{id}", { id: params.id }), void 0, options);
1075
+ }
1076
+ /** Trigger a test delivery for a webhook. */
1077
+ test(params, options) {
1078
+ return this.client.post(
1079
+ buildPath("/webhooks/{id}/test", { id: params.id }),
1080
+ void 0,
1081
+ void 0,
1082
+ options
1083
+ );
1084
+ }
1085
+ /** Get the delivery log for a webhook. */
1086
+ deliveries(params, options) {
1087
+ return this.client.get(buildPath("/webhooks/{id}/deliveries", { id: params.id }), void 0, options);
1088
+ }
1089
+ };
1090
+
1091
+ // src/client.ts
1092
+ var SpotifyApiClient = class extends SpotifyHttpClient {
1093
+ constructor(config) {
1094
+ super(config);
1095
+ this.ai = new AiResource(this);
1096
+ this.albums = new AlbumsResource(this);
1097
+ this.analysis = new AnalysisResource(this);
1098
+ this.artists = new ArtistsResource(this);
1099
+ this.audiobooks = new AudiobooksResource(this);
1100
+ this.batch = new BatchResource(this);
1101
+ this.browse = new BrowseResource(this);
1102
+ this.cache = new CacheResource(this);
1103
+ this.charts = new ChartsResource(this);
1104
+ this.concerts = new ConcertsResource(this);
1105
+ this.credentials = new CredentialsResource(this);
1106
+ this.downloads = new DownloadsResource(this);
1107
+ this.episodes = new EpisodesResource(this);
1108
+ this.health = new HealthResource(this);
1109
+ this.lookups = new LookupsResource(this);
1110
+ this.markets = new MarketsResource(this);
1111
+ this.partner = new PartnerResource(this);
1112
+ this.playlists = new PlaylistsResource(this);
1113
+ this.search = new SearchResource(this);
1114
+ this.shows = new ShowsResource(this);
1115
+ this.snapshots = new SnapshotsResource(this);
1116
+ this.tracking = new TrackingResource(this);
1117
+ this.tracks = new TracksResource(this);
1118
+ this.users = new UsersResource(this);
1119
+ this.webhooks = new WebhooksResource(this);
1120
+ }
1121
+ };
1122
+ function createClient(config) {
1123
+ return new SpotifyApiClient(config);
1124
+ }
1125
+
1126
+ // src/pagination.ts
1127
+ function defaultGetItems(page) {
1128
+ return Array.isArray(page) ? page : [];
1129
+ }
1130
+ async function* paginate(fetcher, options = {}) {
1131
+ const getItems = options.getItems ?? defaultGetItems;
1132
+ const limit = options.limit ?? 50;
1133
+ let offset = options.offset ?? 0;
1134
+ const maxPages = options.maxPages ?? 100;
1135
+ let seen = 0;
1136
+ for (let page = 0; page < maxPages; page++) {
1137
+ const result = await fetcher({ offset, limit });
1138
+ const items = getItems(result);
1139
+ yield result;
1140
+ seen += items.length;
1141
+ if (items.length < limit) return;
1142
+ if (options.maxItems !== void 0 && seen >= options.maxItems) return;
1143
+ offset += limit;
1144
+ }
1145
+ }
1146
+ async function collect(fetcher, options = {}) {
1147
+ const getItems = options.getItems ?? defaultGetItems;
1148
+ const out = [];
1149
+ for await (const page of paginate(fetcher, options)) {
1150
+ for (const item of getItems(page)) {
1151
+ out.push(item);
1152
+ if (options.maxItems !== void 0 && out.length >= options.maxItems) return out;
1153
+ }
1154
+ }
1155
+ return out;
1156
+ }
1157
+
1158
+ // src/generated/responses.ts
1159
+ var BiographyType = /* @__PURE__ */ ((BiographyType2) => {
1160
+ BiographyType2["Autobiography"] = "AUTOBIOGRAPHY";
1161
+ BiographyType2["C"] = "C";
1162
+ BiographyType2["P"] = "P";
1163
+ return BiographyType2;
1164
+ })(BiographyType || {});
1165
+ var Precision = /* @__PURE__ */ ((Precision2) => {
1166
+ Precision2["Day"] = "DAY";
1167
+ Precision2["Minute"] = "MINUTE";
1168
+ return Precision2;
1169
+ })(Precision || {});
1170
+ var PurpleReason = /* @__PURE__ */ ((PurpleReason2) => {
1171
+ PurpleReason2["CountryRestricted"] = "COUNTRY_RESTRICTED";
1172
+ PurpleReason2["Playable"] = "PLAYABLE";
1173
+ return PurpleReason2;
1174
+ })(PurpleReason || {});
1175
+ var LatestType = /* @__PURE__ */ ((LatestType2) => {
1176
+ LatestType2["Album"] = "ALBUM";
1177
+ LatestType2["Compilation"] = "COMPILATION";
1178
+ LatestType2["Ep"] = "EP";
1179
+ LatestType2["Single"] = "SINGLE";
1180
+ return LatestType2;
1181
+ })(LatestType || {});
1182
+ var Label = /* @__PURE__ */ ((Label2) => {
1183
+ Label2["Explicit"] = "EXPLICIT";
1184
+ Label2["None"] = "NONE";
1185
+ return Label2;
1186
+ })(Label || {});
1187
+ var AlbumAlbumType = /* @__PURE__ */ ((AlbumAlbumType2) => {
1188
+ AlbumAlbumType2["Album"] = "album";
1189
+ AlbumAlbumType2["Compilation"] = "compilation";
1190
+ AlbumAlbumType2["Ep"] = "ep";
1191
+ AlbumAlbumType2["Single"] = "single";
1192
+ return AlbumAlbumType2;
1193
+ })(AlbumAlbumType || {});
1194
+ var OwnerEnum = /* @__PURE__ */ ((OwnerEnum2) => {
1195
+ OwnerEnum2["Spotify"] = "Spotify";
1196
+ return OwnerEnum2;
1197
+ })(OwnerEnum || {});
1198
+ var OwnerType = /* @__PURE__ */ ((OwnerType2) => {
1199
+ OwnerType2["Artist"] = "artist";
1200
+ OwnerType2["User"] = "user";
1201
+ return OwnerType2;
1202
+ })(OwnerType || {});
1203
+ var ReleaseDatePrecision = /* @__PURE__ */ ((ReleaseDatePrecision2) => {
1204
+ ReleaseDatePrecision2["Day"] = "day";
1205
+ ReleaseDatePrecision2["Empty"] = "";
1206
+ return ReleaseDatePrecision2;
1207
+ })(ReleaseDatePrecision || {});
1208
+ var Market = /* @__PURE__ */ ((Market2) => {
1209
+ Market2["AE"] = "AE";
1210
+ Market2["Ad"] = "AD";
1211
+ Market2["Ag"] = "AG";
1212
+ Market2["Al"] = "AL";
1213
+ Market2["Am"] = "AM";
1214
+ Market2["Ao"] = "AO";
1215
+ Market2["Ar"] = "AR";
1216
+ Market2["At"] = "AT";
1217
+ Market2["Au"] = "AU";
1218
+ Market2["Az"] = "AZ";
1219
+ Market2["BI"] = "BI";
1220
+ Market2["BT"] = "BT";
1221
+ Market2["BW"] = "BW";
1222
+ Market2["Ba"] = "BA";
1223
+ Market2["Bb"] = "BB";
1224
+ Market2["Bd"] = "BD";
1225
+ Market2["Be"] = "BE";
1226
+ Market2["Bf"] = "BF";
1227
+ Market2["Bg"] = "BG";
1228
+ Market2["Bh"] = "BH";
1229
+ Market2["Bj"] = "BJ";
1230
+ Market2["Bn"] = "BN";
1231
+ Market2["Bo"] = "BO";
1232
+ Market2["Br"] = "BR";
1233
+ Market2["Bs"] = "BS";
1234
+ Market2["By"] = "BY";
1235
+ Market2["Bz"] = "BZ";
1236
+ Market2["CA"] = "CA";
1237
+ Market2["CD"] = "CD";
1238
+ Market2["CG"] = "CG";
1239
+ Market2["CM"] = "CM";
1240
+ Market2["CR"] = "CR";
1241
+ Market2["Ch"] = "CH";
1242
+ Market2["Ci"] = "CI";
1243
+ Market2["Cl"] = "CL";
1244
+ Market2["Co"] = "CO";
1245
+ Market2["Cv"] = "CV";
1246
+ Market2["Cw"] = "CW";
1247
+ Market2["Cy"] = "CY";
1248
+ Market2["Cz"] = "CZ";
1249
+ Market2["De"] = "DE";
1250
+ Market2["Dj"] = "DJ";
1251
+ Market2["Dk"] = "DK";
1252
+ Market2["Dm"] = "DM";
1253
+ Market2["Do"] = "DO";
1254
+ Market2["Dz"] = "DZ";
1255
+ Market2["Ec"] = "EC";
1256
+ Market2["Ee"] = "EE";
1257
+ Market2["Eg"] = "EG";
1258
+ Market2["Es"] = "ES";
1259
+ Market2["Et"] = "ET";
1260
+ Market2["Fi"] = "FI";
1261
+ Market2["Fj"] = "FJ";
1262
+ Market2["Fm"] = "FM";
1263
+ Market2["Fr"] = "FR";
1264
+ Market2["GB"] = "GB";
1265
+ Market2["Ga"] = "GA";
1266
+ Market2["Gd"] = "GD";
1267
+ Market2["Ge"] = "GE";
1268
+ Market2["Gh"] = "GH";
1269
+ Market2["Gm"] = "GM";
1270
+ Market2["Gn"] = "GN";
1271
+ Market2["Gq"] = "GQ";
1272
+ Market2["Gr"] = "GR";
1273
+ Market2["Gt"] = "GT";
1274
+ Market2["Gw"] = "GW";
1275
+ Market2["Gy"] = "GY";
1276
+ Market2["HT"] = "HT";
1277
+ Market2["Hk"] = "HK";
1278
+ Market2["Hn"] = "HN";
1279
+ Market2["Hr"] = "HR";
1280
+ Market2["Hu"] = "HU";
1281
+ Market2["ID"] = "ID";
1282
+ Market2["IL"] = "IL";
1283
+ Market2["Ie"] = "IE";
1284
+ Market2["In"] = "IN";
1285
+ Market2["Iq"] = "IQ";
1286
+ Market2["Is"] = "IS";
1287
+ Market2["It"] = "IT";
1288
+ Market2["Jm"] = "JM";
1289
+ Market2["Jo"] = "JO";
1290
+ Market2["Jp"] = "JP";
1291
+ Market2["KM"] = "KM";
1292
+ Market2["Ke"] = "KE";
1293
+ Market2["Kg"] = "KG";
1294
+ Market2["Kh"] = "KH";
1295
+ Market2["Ki"] = "KI";
1296
+ Market2["Kn"] = "KN";
1297
+ Market2["Kr"] = "KR";
1298
+ Market2["Kw"] = "KW";
1299
+ Market2["Kz"] = "KZ";
1300
+ Market2["LB"] = "LB";
1301
+ Market2["LV"] = "LV";
1302
+ Market2["La"] = "LA";
1303
+ Market2["Lc"] = "LC";
1304
+ Market2["Li"] = "LI";
1305
+ Market2["Lk"] = "LK";
1306
+ Market2["Lr"] = "LR";
1307
+ Market2["Ls"] = "LS";
1308
+ Market2["Lt"] = "LT";
1309
+ Market2["Lu"] = "LU";
1310
+ Market2["Ly"] = "LY";
1311
+ Market2["MT"] = "MT";
1312
+ Market2["MX"] = "MX";
1313
+ Market2["Ma"] = "MA";
1314
+ Market2["Mc"] = "MC";
1315
+ Market2["Md"] = "MD";
1316
+ Market2["Me"] = "ME";
1317
+ Market2["Mg"] = "MG";
1318
+ Market2["Mh"] = "MH";
1319
+ Market2["Mk"] = "MK";
1320
+ Market2["Ml"] = "ML";
1321
+ Market2["Mn"] = "MN";
1322
+ Market2["Mo"] = "MO";
1323
+ Market2["Mr"] = "MR";
1324
+ Market2["Mu"] = "MU";
1325
+ Market2["Mv"] = "MV";
1326
+ Market2["Mw"] = "MW";
1327
+ Market2["My"] = "MY";
1328
+ Market2["Mz"] = "MZ";
1329
+ Market2["NI"] = "NI";
1330
+ Market2["NP"] = "NP";
1331
+ Market2["Na"] = "NA";
1332
+ Market2["Ne"] = "NE";
1333
+ Market2["Ng"] = "NG";
1334
+ Market2["Nl"] = "NL";
1335
+ Market2["No"] = "NO";
1336
+ Market2["Nr"] = "NR";
1337
+ Market2["Nz"] = "NZ";
1338
+ Market2["Om"] = "OM";
1339
+ Market2["PE"] = "PE";
1340
+ Market2["PG"] = "PG";
1341
+ Market2["PR"] = "PR";
1342
+ Market2["PS"] = "PS";
1343
+ Market2["Pa"] = "PA";
1344
+ Market2["Ph"] = "PH";
1345
+ Market2["Pk"] = "PK";
1346
+ Market2["Pl"] = "PL";
1347
+ Market2["Pt"] = "PT";
1348
+ Market2["Pw"] = "PW";
1349
+ Market2["Py"] = "PY";
1350
+ Market2["QA"] = "QA";
1351
+ Market2["Ro"] = "RO";
1352
+ Market2["Rs"] = "RS";
1353
+ Market2["Rw"] = "RW";
1354
+ Market2["SE"] = "SE";
1355
+ Market2["Sa"] = "SA";
1356
+ Market2["Sb"] = "SB";
1357
+ Market2["Sc"] = "SC";
1358
+ Market2["Sg"] = "SG";
1359
+ Market2["Si"] = "SI";
1360
+ Market2["Sk"] = "SK";
1361
+ Market2["Sl"] = "SL";
1362
+ Market2["Sm"] = "SM";
1363
+ Market2["Sn"] = "SN";
1364
+ Market2["Sr"] = "SR";
1365
+ Market2["St"] = "ST";
1366
+ Market2["Sv"] = "SV";
1367
+ Market2["Sz"] = "SZ";
1368
+ Market2["Td"] = "TD";
1369
+ Market2["Tg"] = "TG";
1370
+ Market2["Th"] = "TH";
1371
+ Market2["Tj"] = "TJ";
1372
+ Market2["Tl"] = "TL";
1373
+ Market2["Tn"] = "TN";
1374
+ Market2["To"] = "TO";
1375
+ Market2["Tr"] = "TR";
1376
+ Market2["Tt"] = "TT";
1377
+ Market2["Tv"] = "TV";
1378
+ Market2["Tw"] = "TW";
1379
+ Market2["Tz"] = "TZ";
1380
+ Market2["Ua"] = "UA";
1381
+ Market2["Ug"] = "UG";
1382
+ Market2["Us"] = "US";
1383
+ Market2["Uy"] = "UY";
1384
+ Market2["Uz"] = "UZ";
1385
+ Market2["Vc"] = "VC";
1386
+ Market2["Ve"] = "VE";
1387
+ Market2["Vn"] = "VN";
1388
+ Market2["Vu"] = "VU";
1389
+ Market2["Ws"] = "WS";
1390
+ Market2["Xk"] = "XK";
1391
+ Market2["Za"] = "ZA";
1392
+ Market2["Zm"] = "ZM";
1393
+ Market2["Zw"] = "ZW";
1394
+ return Market2;
1395
+ })(Market || {});
1396
+ var RestrictionsReason = /* @__PURE__ */ ((RestrictionsReason2) => {
1397
+ RestrictionsReason2["Empty"] = "";
1398
+ RestrictionsReason2["Playable"] = "PLAYABLE";
1399
+ return RestrictionsReason2;
1400
+ })(RestrictionsReason || {});
1401
+ var TrackType = /* @__PURE__ */ ((TrackType2) => {
1402
+ TrackType2["Track"] = "track";
1403
+ return TrackType2;
1404
+ })(TrackType || {});
1405
+ var LabelEnum = /* @__PURE__ */ ((LabelEnum2) => {
1406
+ LabelEnum2["CashMoneyDrakeLP6"] = "Cash Money/Drake LP6";
1407
+ LabelEnum2["CashMoneyRecordsYoungMoneyEntUniversalRec"] = "Cash Money Records/Young Money Ent./Universal Rec.";
1408
+ LabelEnum2["OVORepublic"] = "OVO/Republic";
1409
+ LabelEnum2["OVORepublicRecords"] = "OVO / Republic Records";
1410
+ LabelEnum2["OVOSound"] = "OVO Sound";
1411
+ LabelEnum2["Ovo"] = "OVO";
1412
+ LabelEnum2["TaylorSwift"] = "Taylor Swift";
1413
+ LabelEnum2["The4BatzOVOSound"] = "4batz / OVO Sound";
1414
+ LabelEnum2["UltraRecordsLLC"] = "Ultra Records, LLC";
1415
+ LabelEnum2["WaltDisneyRecordsPixar"] = "Walt Disney Records / Pixar";
1416
+ return LabelEnum2;
1417
+ })(LabelEnum || {});
1418
+ var PurpleType = /* @__PURE__ */ ((PurpleType2) => {
1419
+ PurpleType2["Artist"] = "artist";
1420
+ PurpleType2["Single"] = "SINGLE";
1421
+ return PurpleType2;
1422
+ })(PurpleType || {});
1423
+ var ArtistUnionTypename = /* @__PURE__ */ ((ArtistUnionTypename2) => {
1424
+ ArtistUnionTypename2["Album"] = "Album";
1425
+ ArtistUnionTypename2["Artist"] = "Artist";
1426
+ ArtistUnionTypename2["Playlist"] = "Playlist";
1427
+ ArtistUnionTypename2["Track"] = "Track";
1428
+ ArtistUnionTypename2["User"] = "User";
1429
+ return ArtistUnionTypename2;
1430
+ })(ArtistUnionTypename || {});
1431
+ var PurpleTypename = /* @__PURE__ */ ((PurpleTypename2) => {
1432
+ PurpleTypename2["GenericError"] = "GenericError";
1433
+ PurpleTypename2["Playlist"] = "Playlist";
1434
+ return PurpleTypename2;
1435
+ })(PurpleTypename || {});
1436
+ var PrimaryColor = /* @__PURE__ */ ((PrimaryColor2) => {
1437
+ PrimaryColor2["Eb1E32"] = "#eb1e32";
1438
+ PrimaryColor2["Ffffff"] = "#ffffff";
1439
+ PrimaryColor2["PrimaryColorFFFFFF"] = "#FFFFFF";
1440
+ PrimaryColor2["The509Bf5"] = "#509BF5";
1441
+ return PrimaryColor2;
1442
+ })(PrimaryColor || {});
1443
+ var GetPlaylistDataType = /* @__PURE__ */ ((GetPlaylistDataType2) => {
1444
+ GetPlaylistDataType2["Playlist"] = "playlist";
1445
+ return GetPlaylistDataType2;
1446
+ })(GetPlaylistDataType || {});
1447
+ var Status = /* @__PURE__ */ ((Status2) => {
1448
+ Status2["Healthy"] = "healthy";
1449
+ return Status2;
1450
+ })(Status || {});
1451
+ var InstanceName = /* @__PURE__ */ ((InstanceName2) => {
1452
+ InstanceName2["Trustpilot"] = "trustpilot";
1453
+ InstanceName2["Trustpilotiso"] = "trustpilot_iso";
1454
+ return InstanceName2;
1455
+ })(InstanceName || {});
1456
+ var SquareCoverImageTypename = /* @__PURE__ */ ((SquareCoverImageTypename2) => {
1457
+ SquareCoverImageTypename2["VisualIdentityImage"] = "VisualIdentityImage";
1458
+ return SquareCoverImageTypename2;
1459
+ })(SquareCoverImageTypename || {});
1460
+ var FluffyTypename = /* @__PURE__ */ ((FluffyTypename2) => {
1461
+ FluffyTypename2["ImageV2"] = "ImageV2";
1462
+ return FluffyTypename2;
1463
+ })(FluffyTypename || {});
1464
+ var ItemV2Typename = /* @__PURE__ */ ((ItemV2Typename2) => {
1465
+ ItemV2Typename2["AlbumResponseWrapper"] = "AlbumResponseWrapper";
1466
+ ItemV2Typename2["ArtistResponseWrapper"] = "ArtistResponseWrapper";
1467
+ ItemV2Typename2["PlaylistResponseWrapper"] = "PlaylistResponseWrapper";
1468
+ ItemV2Typename2["SearchAutoCompleteEntity"] = "SearchAutoCompleteEntity";
1469
+ ItemV2Typename2["TrackResponseWrapper"] = "TrackResponseWrapper";
1470
+ ItemV2Typename2["UserResponseWrapper"] = "UserResponseWrapper";
1471
+ return ItemV2Typename2;
1472
+ })(ItemV2Typename || {});
1473
+ var AudioAssociationsTypename = /* @__PURE__ */ ((AudioAssociationsTypename2) => {
1474
+ AudioAssociationsTypename2["TrackAudioAssociationPage"] = "TrackAudioAssociationPage";
1475
+ return AudioAssociationsTypename2;
1476
+ })(AudioAssociationsTypename || {});
1477
+ var MediaType = /* @__PURE__ */ ((MediaType2) => {
1478
+ MediaType2["Audio"] = "AUDIO";
1479
+ MediaType2["Video"] = "VIDEO";
1480
+ return MediaType2;
1481
+ })(MediaType || {});
1482
+ var Format = /* @__PURE__ */ ((Format2) => {
1483
+ Format2["ArtistMixReader"] = "artist-mix-reader";
1484
+ Format2["Editorial"] = "editorial";
1485
+ Format2["Empty"] = "";
1486
+ Format2["FormatShowsShuffle"] = "format-shows-shuffle";
1487
+ Format2["InspiredbyMix"] = "inspiredby-mix";
1488
+ return Format2;
1489
+ })(Format || {});
1490
+ var RelatedEntityTypename = /* @__PURE__ */ ((RelatedEntityTypename2) => {
1491
+ RelatedEntityTypename2["EpisodeResponseWrapper"] = "EpisodeResponseWrapper";
1492
+ return RelatedEntityTypename2;
1493
+ })(RelatedEntityTypename || {});
1494
+ var TentacledTypename = /* @__PURE__ */ ((TentacledTypename2) => {
1495
+ TentacledTypename2["Podcast"] = "Podcast";
1496
+ return TentacledTypename2;
1497
+ })(TentacledTypename || {});
1498
+ var StateEnum = /* @__PURE__ */ ((StateEnum2) => {
1499
+ StateEnum2["NotStarted"] = "NOT_STARTED";
1500
+ return StateEnum2;
1501
+ })(StateEnum || {});
1502
+ var PodcastV2Typename = /* @__PURE__ */ ((PodcastV2Typename2) => {
1503
+ PodcastV2Typename2["PodcastResponseWrapper"] = "PodcastResponseWrapper";
1504
+ return PodcastV2Typename2;
1505
+ })(PodcastV2Typename || {});
1506
+ var PurpleMediaType = /* @__PURE__ */ ((PurpleMediaType2) => {
1507
+ PurpleMediaType2["Audio"] = "AUDIO";
1508
+ PurpleMediaType2["Mixed"] = "MIXED";
1509
+ return PurpleMediaType2;
1510
+ })(PurpleMediaType || {});
1511
+ var StickyTypename = /* @__PURE__ */ ((StickyTypename2) => {
1512
+ StickyTypename2["GenreResponseWrapper"] = "GenreResponseWrapper";
1513
+ return StickyTypename2;
1514
+ })(StickyTypename || {});
1515
+ var ItemsV2Typename = /* @__PURE__ */ ((ItemsV2Typename2) => {
1516
+ ItemsV2Typename2["TopResultHit"] = "TopResultHit";
1517
+ return ItemsV2Typename2;
1518
+ })(ItemsV2Typename || {});
1519
+ var Language = /* @__PURE__ */ ((Language2) => {
1520
+ Language2["En"] = "en";
1521
+ return Language2;
1522
+ })(Language || {});
1523
+ var FluffyType = /* @__PURE__ */ ((FluffyType2) => {
1524
+ FluffyType2["Episode"] = "episode";
1525
+ return FluffyType2;
1526
+ })(FluffyType || {});
1527
+ var EntryStatus = /* @__PURE__ */ ((EntryStatus2) => {
1528
+ EntryStatus2["MovedDown"] = "MOVED_DOWN";
1529
+ EntryStatus2["MovedUp"] = "MOVED_UP";
1530
+ EntryStatus2["NewEntry"] = "NEW_ENTRY";
1531
+ EntryStatus2["NoChange"] = "NO_CHANGE";
1532
+ EntryStatus2["ReEntry"] = "RE_ENTRY";
1533
+ return EntryStatus2;
1534
+ })(EntryStatus || {});
1535
+ var RankingMetricType = /* @__PURE__ */ ((RankingMetricType2) => {
1536
+ RankingMetricType2["Streams"] = "STREAMS";
1537
+ return RankingMetricType2;
1538
+ })(RankingMetricType || {});
1539
+ var Subrole = /* @__PURE__ */ ((Subrole2) => {
1540
+ Subrole2["MainArtist"] = "main artist";
1541
+ Subrole2["Producer"] = "producer";
1542
+ Subrole2["Writer"] = "writer";
1543
+ return Subrole2;
1544
+ })(Subrole || {});
1545
+ var Uri = /* @__PURE__ */ ((Uri2) => {
1546
+ Uri2["SpotifyUserSpotify"] = "spotify:user:spotify";
1547
+ return Uri2;
1548
+ })(Uri || {});
1549
+
1550
+ exports.AiResource = AiResource;
1551
+ exports.AlbumAlbumType = AlbumAlbumType;
1552
+ exports.AlbumsResource = AlbumsResource;
1553
+ exports.AnalysisResource = AnalysisResource;
1554
+ exports.ArtistUnionTypename = ArtistUnionTypename;
1555
+ exports.ArtistsResource = ArtistsResource;
1556
+ exports.AudioAssociationsTypename = AudioAssociationsTypename;
1557
+ exports.AudiobooksResource = AudiobooksResource;
1558
+ exports.BatchResource = BatchResource;
1559
+ exports.BiographyType = BiographyType;
1560
+ exports.BrowseResource = BrowseResource;
1561
+ exports.CacheResource = CacheResource;
1562
+ exports.ChartsResource = ChartsResource;
1563
+ exports.ConcertsResource = ConcertsResource;
1564
+ exports.CredentialsResource = CredentialsResource;
1565
+ exports.DEFAULT_RETRIES = DEFAULT_RETRIES;
1566
+ exports.DEFAULT_RETRY_DELAY_MS = DEFAULT_RETRY_DELAY_MS;
1567
+ exports.DEFAULT_TIMEOUT_MS = DEFAULT_TIMEOUT_MS;
1568
+ exports.DEFAULT_USER_AGENT = DEFAULT_USER_AGENT;
1569
+ exports.DownloadsResource = DownloadsResource;
1570
+ exports.EntryStatus = EntryStatus;
1571
+ exports.EpisodesResource = EpisodesResource;
1572
+ exports.FluffyType = FluffyType;
1573
+ exports.FluffyTypename = FluffyTypename;
1574
+ exports.Format = Format;
1575
+ exports.GetPlaylistDataType = GetPlaylistDataType;
1576
+ exports.HealthResource = HealthResource;
1577
+ exports.InstanceName = InstanceName;
1578
+ exports.ItemV2Typename = ItemV2Typename;
1579
+ exports.ItemsV2Typename = ItemsV2Typename;
1580
+ exports.Label = Label;
1581
+ exports.LabelEnum = LabelEnum;
1582
+ exports.Language = Language;
1583
+ exports.LatestType = LatestType;
1584
+ exports.LookupsResource = LookupsResource;
1585
+ exports.Market = Market;
1586
+ exports.MarketsResource = MarketsResource;
1587
+ exports.MediaType = MediaType;
1588
+ exports.OwnerEnum = OwnerEnum;
1589
+ exports.OwnerType = OwnerType;
1590
+ exports.PROVIDERS = PROVIDERS;
1591
+ exports.PartnerResource = PartnerResource;
1592
+ exports.PlaylistsResource = PlaylistsResource;
1593
+ exports.PodcastV2Typename = PodcastV2Typename;
1594
+ exports.Precision = Precision;
1595
+ exports.PrimaryColor = PrimaryColor;
1596
+ exports.PurpleMediaType = PurpleMediaType;
1597
+ exports.PurpleReason = PurpleReason;
1598
+ exports.PurpleType = PurpleType;
1599
+ exports.PurpleTypename = PurpleTypename;
1600
+ exports.RankingMetricType = RankingMetricType;
1601
+ exports.RelatedEntityTypename = RelatedEntityTypename;
1602
+ exports.ReleaseDatePrecision = ReleaseDatePrecision;
1603
+ exports.RestrictionsReason = RestrictionsReason;
1604
+ exports.SearchResource = SearchResource;
1605
+ exports.ShowsResource = ShowsResource;
1606
+ exports.SnapshotsResource = SnapshotsResource;
1607
+ exports.SpotifyApiClient = SpotifyApiClient;
1608
+ exports.SpotifyApiError = SpotifyApiError;
1609
+ exports.SpotifyHttpClient = SpotifyHttpClient;
1610
+ exports.SquareCoverImageTypename = SquareCoverImageTypename;
1611
+ exports.StateEnum = StateEnum;
1612
+ exports.Status = Status;
1613
+ exports.StickyTypename = StickyTypename;
1614
+ exports.Subrole = Subrole;
1615
+ exports.TentacledTypename = TentacledTypename;
1616
+ exports.TrackType = TrackType;
1617
+ exports.TrackingResource = TrackingResource;
1618
+ exports.TracksResource = TracksResource;
1619
+ exports.Uri = Uri;
1620
+ exports.UsersResource = UsersResource;
1621
+ exports.WebhooksResource = WebhooksResource;
1622
+ exports.buildPath = buildPath;
1623
+ exports.collect = collect;
1624
+ exports.createClient = createClient;
1625
+ exports.normalizeId = normalizeId;
1626
+ exports.normalizeIds = normalizeIds;
1627
+ exports.paginate = paginate;
1628
+ exports.resolveConfig = resolveConfig;
1629
+ //# sourceMappingURL=index.cjs.map
1630
+ //# sourceMappingURL=index.cjs.map