ani-client 1.3.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +101 -8
- package/dist/index.d.mts +289 -62
- package/dist/index.d.ts +289 -62
- package/dist/index.js +512 -194
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +512 -195
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -1
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
// src/queries/index.ts
|
|
4
|
-
var
|
|
4
|
+
var MEDIA_FIELDS_BASE = `
|
|
5
5
|
id
|
|
6
6
|
idMal
|
|
7
7
|
title { romaji english native userPreferred }
|
|
@@ -33,6 +33,10 @@ var MEDIA_FIELDS = `
|
|
|
33
33
|
trending
|
|
34
34
|
tags { id name description category rank isMediaSpoiler }
|
|
35
35
|
studios { nodes { id name isAnimationStudio siteUrl } }
|
|
36
|
+
isAdult
|
|
37
|
+
siteUrl
|
|
38
|
+
`;
|
|
39
|
+
var RELATIONS_FIELDS = `
|
|
36
40
|
relations {
|
|
37
41
|
edges {
|
|
38
42
|
relationType(version: 2)
|
|
@@ -47,10 +51,12 @@ var MEDIA_FIELDS = `
|
|
|
47
51
|
}
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
|
-
isAdult
|
|
51
|
-
siteUrl
|
|
52
54
|
`;
|
|
53
|
-
var
|
|
55
|
+
var MEDIA_FIELDS = `
|
|
56
|
+
${MEDIA_FIELDS_BASE}
|
|
57
|
+
${RELATIONS_FIELDS}
|
|
58
|
+
`;
|
|
59
|
+
var CHARACTER_FIELDS_COMPACT = `
|
|
54
60
|
id
|
|
55
61
|
name { first middle last full native alternative }
|
|
56
62
|
image { large medium }
|
|
@@ -61,6 +67,8 @@ var CHARACTER_FIELDS = `
|
|
|
61
67
|
bloodType
|
|
62
68
|
favourites
|
|
63
69
|
siteUrl
|
|
70
|
+
`;
|
|
71
|
+
var CHARACTER_MEDIA_NODES = `
|
|
64
72
|
media(perPage: 10) {
|
|
65
73
|
nodes {
|
|
66
74
|
id
|
|
@@ -71,6 +79,39 @@ var CHARACTER_FIELDS = `
|
|
|
71
79
|
}
|
|
72
80
|
}
|
|
73
81
|
`;
|
|
82
|
+
var VOICE_ACTOR_FIELDS_COMPACT = `
|
|
83
|
+
id
|
|
84
|
+
name { first middle last full native userPreferred }
|
|
85
|
+
languageV2
|
|
86
|
+
image { large medium }
|
|
87
|
+
gender
|
|
88
|
+
primaryOccupations
|
|
89
|
+
siteUrl
|
|
90
|
+
`;
|
|
91
|
+
var CHARACTER_MEDIA_EDGES_WITH_VA = `
|
|
92
|
+
media(perPage: 10) {
|
|
93
|
+
edges {
|
|
94
|
+
voiceActors {
|
|
95
|
+
${VOICE_ACTOR_FIELDS_COMPACT}
|
|
96
|
+
}
|
|
97
|
+
node {
|
|
98
|
+
id
|
|
99
|
+
title { romaji english native userPreferred }
|
|
100
|
+
type
|
|
101
|
+
coverImage { large medium }
|
|
102
|
+
siteUrl
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
`;
|
|
107
|
+
var CHARACTER_FIELDS = `
|
|
108
|
+
${CHARACTER_FIELDS_COMPACT}
|
|
109
|
+
${CHARACTER_MEDIA_NODES}
|
|
110
|
+
`;
|
|
111
|
+
var CHARACTER_FIELDS_WITH_VA = `
|
|
112
|
+
${CHARACTER_FIELDS_COMPACT}
|
|
113
|
+
${CHARACTER_MEDIA_EDGES_WITH_VA}
|
|
114
|
+
`;
|
|
74
115
|
var STAFF_FIELDS = `
|
|
75
116
|
id
|
|
76
117
|
name { first middle last full native }
|
|
@@ -140,7 +181,7 @@ query (
|
|
|
140
181
|
isAdult: $isAdult,
|
|
141
182
|
sort: $sort
|
|
142
183
|
) {
|
|
143
|
-
${
|
|
184
|
+
${MEDIA_FIELDS_BASE}
|
|
144
185
|
}
|
|
145
186
|
}
|
|
146
187
|
}`;
|
|
@@ -149,7 +190,7 @@ query ($type: MediaType, $page: Int, $perPage: Int) {
|
|
|
149
190
|
Page(page: $page, perPage: $perPage) {
|
|
150
191
|
pageInfo { total perPage currentPage lastPage hasNextPage }
|
|
151
192
|
media(type: $type, sort: TRENDING_DESC) {
|
|
152
|
-
${
|
|
193
|
+
${MEDIA_FIELDS_BASE}
|
|
153
194
|
}
|
|
154
195
|
}
|
|
155
196
|
}`;
|
|
@@ -159,6 +200,12 @@ query ($id: Int!) {
|
|
|
159
200
|
${CHARACTER_FIELDS}
|
|
160
201
|
}
|
|
161
202
|
}`;
|
|
203
|
+
var QUERY_CHARACTER_BY_ID_WITH_VA = `
|
|
204
|
+
query ($id: Int!) {
|
|
205
|
+
Character(id: $id) {
|
|
206
|
+
${CHARACTER_FIELDS_WITH_VA}
|
|
207
|
+
}
|
|
208
|
+
}`;
|
|
162
209
|
var QUERY_CHARACTER_SEARCH = `
|
|
163
210
|
query ($search: String, $sort: [CharacterSort], $page: Int, $perPage: Int) {
|
|
164
211
|
Page(page: $page, perPage: $perPage) {
|
|
@@ -168,6 +215,15 @@ query ($search: String, $sort: [CharacterSort], $page: Int, $perPage: Int) {
|
|
|
168
215
|
}
|
|
169
216
|
}
|
|
170
217
|
}`;
|
|
218
|
+
var QUERY_CHARACTER_SEARCH_WITH_VA = `
|
|
219
|
+
query ($search: String, $sort: [CharacterSort], $page: Int, $perPage: Int) {
|
|
220
|
+
Page(page: $page, perPage: $perPage) {
|
|
221
|
+
pageInfo { total perPage currentPage lastPage hasNextPage }
|
|
222
|
+
characters(search: $search, sort: $sort) {
|
|
223
|
+
${CHARACTER_FIELDS_WITH_VA}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}`;
|
|
171
227
|
var QUERY_STAFF_BY_ID = `
|
|
172
228
|
query ($id: Int!) {
|
|
173
229
|
Staff(id: $id) {
|
|
@@ -175,10 +231,10 @@ query ($id: Int!) {
|
|
|
175
231
|
}
|
|
176
232
|
}`;
|
|
177
233
|
var QUERY_STAFF_SEARCH = `
|
|
178
|
-
query ($search: String, $page: Int, $perPage: Int) {
|
|
234
|
+
query ($search: String, $sort: [StaffSort], $page: Int, $perPage: Int) {
|
|
179
235
|
Page(page: $page, perPage: $perPage) {
|
|
180
236
|
pageInfo { total perPage currentPage lastPage hasNextPage }
|
|
181
|
-
staff(search: $search) {
|
|
237
|
+
staff(search: $search, sort: $sort) {
|
|
182
238
|
${STAFF_FIELDS}
|
|
183
239
|
}
|
|
184
240
|
}
|
|
@@ -206,7 +262,7 @@ query ($airingAt_greater: Int, $airingAt_lesser: Int, $sort: [AiringSort], $page
|
|
|
206
262
|
episode
|
|
207
263
|
mediaId
|
|
208
264
|
media {
|
|
209
|
-
${
|
|
265
|
+
${MEDIA_FIELDS_BASE}
|
|
210
266
|
}
|
|
211
267
|
}
|
|
212
268
|
}
|
|
@@ -216,7 +272,7 @@ query ($page: Int, $perPage: Int) {
|
|
|
216
272
|
Page(page: $page, perPage: $perPage) {
|
|
217
273
|
pageInfo { total perPage currentPage lastPage hasNextPage }
|
|
218
274
|
media(type: MANGA, status: RELEASING, sort: UPDATED_AT_DESC) {
|
|
219
|
-
${
|
|
275
|
+
${MEDIA_FIELDS_BASE}
|
|
220
276
|
}
|
|
221
277
|
}
|
|
222
278
|
}`;
|
|
@@ -225,7 +281,7 @@ query ($type: MediaType, $sort: [MediaSort], $page: Int, $perPage: Int) {
|
|
|
225
281
|
Page(page: $page, perPage: $perPage) {
|
|
226
282
|
pageInfo { total perPage currentPage lastPage hasNextPage }
|
|
227
283
|
media(type: $type, status: NOT_YET_RELEASED, sort: $sort) {
|
|
228
|
-
${
|
|
284
|
+
${MEDIA_FIELDS_BASE}
|
|
229
285
|
}
|
|
230
286
|
}
|
|
231
287
|
}`;
|
|
@@ -234,7 +290,7 @@ query ($season: MediaSeason!, $seasonYear: Int!, $type: MediaType, $sort: [Media
|
|
|
234
290
|
Page(page: $page, perPage: $perPage) {
|
|
235
291
|
pageInfo { total perPage currentPage lastPage hasNextPage }
|
|
236
292
|
media(season: $season, seasonYear: $seasonYear, type: $type, sort: $sort) {
|
|
237
|
-
${
|
|
293
|
+
${MEDIA_FIELDS_BASE}
|
|
238
294
|
}
|
|
239
295
|
}
|
|
240
296
|
}`;
|
|
@@ -254,7 +310,7 @@ var MEDIA_LIST_FIELDS = `
|
|
|
254
310
|
updatedAt
|
|
255
311
|
createdAt
|
|
256
312
|
media {
|
|
257
|
-
${
|
|
313
|
+
${MEDIA_FIELDS_BASE}
|
|
258
314
|
}
|
|
259
315
|
`;
|
|
260
316
|
var QUERY_RECOMMENDATIONS = `
|
|
@@ -347,13 +403,105 @@ query {
|
|
|
347
403
|
isAdult
|
|
348
404
|
}
|
|
349
405
|
}`;
|
|
406
|
+
function buildMediaByIdQuery(include) {
|
|
407
|
+
if (!include) return QUERY_MEDIA_BY_ID;
|
|
408
|
+
const extra = [];
|
|
409
|
+
if (include.relations !== false) {
|
|
410
|
+
extra.push(RELATIONS_FIELDS);
|
|
411
|
+
}
|
|
412
|
+
if (include.characters) {
|
|
413
|
+
const opts = typeof include.characters === "object" ? include.characters : {};
|
|
414
|
+
const perPage = opts.perPage ?? 25;
|
|
415
|
+
const sortClause = opts.sort !== false ? ", sort: [ROLE, RELEVANCE, ID]" : "";
|
|
416
|
+
const voiceActorBlock = opts.voiceActors ? `
|
|
417
|
+
voiceActors {
|
|
418
|
+
${VOICE_ACTOR_FIELDS_COMPACT}
|
|
419
|
+
}` : "";
|
|
420
|
+
extra.push(`
|
|
421
|
+
characters(perPage: ${perPage}${sortClause}) {
|
|
422
|
+
edges {
|
|
423
|
+
role
|
|
424
|
+
node {
|
|
425
|
+
${CHARACTER_FIELDS_COMPACT}
|
|
426
|
+
}${voiceActorBlock}
|
|
427
|
+
}
|
|
428
|
+
}`);
|
|
429
|
+
}
|
|
430
|
+
if (include.staff) {
|
|
431
|
+
const opts = typeof include.staff === "object" ? include.staff : {};
|
|
432
|
+
const perPage = opts.perPage ?? 25;
|
|
433
|
+
const sortClause = opts.sort !== false ? ", sort: [RELEVANCE, ID]" : "";
|
|
434
|
+
extra.push(`
|
|
435
|
+
staff(perPage: ${perPage}${sortClause}) {
|
|
436
|
+
edges {
|
|
437
|
+
role
|
|
438
|
+
node {
|
|
439
|
+
${STAFF_FIELDS}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}`);
|
|
443
|
+
}
|
|
444
|
+
if (include.recommendations) {
|
|
445
|
+
const perPage = typeof include.recommendations === "object" ? include.recommendations.perPage ?? 10 : 10;
|
|
446
|
+
extra.push(`
|
|
447
|
+
recommendations(perPage: ${perPage}, sort: [RATING_DESC]) {
|
|
448
|
+
nodes {
|
|
449
|
+
id
|
|
450
|
+
rating
|
|
451
|
+
mediaRecommendation {
|
|
452
|
+
id
|
|
453
|
+
title { romaji english native userPreferred }
|
|
454
|
+
type
|
|
455
|
+
format
|
|
456
|
+
coverImage { large medium }
|
|
457
|
+
averageScore
|
|
458
|
+
siteUrl
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}`);
|
|
462
|
+
}
|
|
463
|
+
if (include.streamingEpisodes) {
|
|
464
|
+
extra.push(`
|
|
465
|
+
streamingEpisodes {
|
|
466
|
+
title
|
|
467
|
+
thumbnail
|
|
468
|
+
url
|
|
469
|
+
site
|
|
470
|
+
}`);
|
|
471
|
+
}
|
|
472
|
+
if (include.externalLinks) {
|
|
473
|
+
extra.push(`
|
|
474
|
+
externalLinks {
|
|
475
|
+
id
|
|
476
|
+
url
|
|
477
|
+
site
|
|
478
|
+
type
|
|
479
|
+
icon
|
|
480
|
+
color
|
|
481
|
+
}`);
|
|
482
|
+
}
|
|
483
|
+
if (include.stats) {
|
|
484
|
+
extra.push(`
|
|
485
|
+
stats {
|
|
486
|
+
scoreDistribution { score amount }
|
|
487
|
+
statusDistribution { status amount }
|
|
488
|
+
}`);
|
|
489
|
+
}
|
|
490
|
+
return `
|
|
491
|
+
query ($id: Int!) {
|
|
492
|
+
Media(id: $id) {
|
|
493
|
+
${MEDIA_FIELDS_BASE}
|
|
494
|
+
${extra.join("\n")}
|
|
495
|
+
}
|
|
496
|
+
}`;
|
|
497
|
+
}
|
|
350
498
|
function buildBatchQuery(ids, typeName, fields, prefix) {
|
|
351
499
|
const aliases = ids.map((id, i) => `${prefix}${i}: ${typeName}(id: ${id}) { ${fields} }`).join("\n ");
|
|
352
500
|
return `query {
|
|
353
501
|
${aliases}
|
|
354
502
|
}`;
|
|
355
503
|
}
|
|
356
|
-
var buildBatchMediaQuery = (ids) => buildBatchQuery(ids, "Media",
|
|
504
|
+
var buildBatchMediaQuery = (ids) => buildBatchQuery(ids, "Media", MEDIA_FIELDS_BASE, "m");
|
|
357
505
|
var buildBatchCharacterQuery = (ids) => buildBatchQuery(ids, "Character", CHARACTER_FIELDS, "c");
|
|
358
506
|
var buildBatchStaffQuery = (ids) => buildBatchQuery(ids, "Staff", STAFF_FIELDS, "s");
|
|
359
507
|
|
|
@@ -368,7 +516,8 @@ var MemoryCache = class {
|
|
|
368
516
|
}
|
|
369
517
|
/** Build a deterministic cache key from a query + variables pair. */
|
|
370
518
|
static key(query, variables) {
|
|
371
|
-
|
|
519
|
+
const normalized = query.replace(/\s+/g, " ").trim();
|
|
520
|
+
return `${normalized}|${JSON.stringify(variables, Object.keys(variables).sort())}`;
|
|
372
521
|
}
|
|
373
522
|
/** Retrieve a cached value, or `undefined` if missing / expired. */
|
|
374
523
|
get(key) {
|
|
@@ -405,9 +554,9 @@ var MemoryCache = class {
|
|
|
405
554
|
get size() {
|
|
406
555
|
return this.store.size;
|
|
407
556
|
}
|
|
408
|
-
/** Return
|
|
557
|
+
/** Return all cache keys. */
|
|
409
558
|
keys() {
|
|
410
|
-
return this.store.keys();
|
|
559
|
+
return [...this.store.keys()];
|
|
411
560
|
}
|
|
412
561
|
/**
|
|
413
562
|
* Remove all entries whose key matches the given pattern.
|
|
@@ -416,25 +565,26 @@ var MemoryCache = class {
|
|
|
416
565
|
* @returns Number of entries removed.
|
|
417
566
|
*/
|
|
418
567
|
invalidate(pattern) {
|
|
419
|
-
const regex = typeof pattern === "string" ? new RegExp(pattern) : pattern;
|
|
420
|
-
|
|
421
|
-
for (const key of
|
|
422
|
-
if (regex.test(key))
|
|
423
|
-
this.store.delete(key);
|
|
424
|
-
count++;
|
|
425
|
-
}
|
|
568
|
+
const regex = typeof pattern === "string" ? new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")) : pattern;
|
|
569
|
+
const toDelete = [];
|
|
570
|
+
for (const key of this.store.keys()) {
|
|
571
|
+
if (regex.test(key)) toDelete.push(key);
|
|
426
572
|
}
|
|
427
|
-
|
|
573
|
+
for (const key of toDelete) this.store.delete(key);
|
|
574
|
+
return toDelete.length;
|
|
428
575
|
}
|
|
429
576
|
};
|
|
430
577
|
|
|
431
578
|
// src/errors/index.ts
|
|
432
|
-
var AniListError = class extends Error {
|
|
579
|
+
var AniListError = class _AniListError extends Error {
|
|
433
580
|
constructor(message, status, errors = []) {
|
|
434
581
|
super(message);
|
|
435
582
|
this.name = "AniListError";
|
|
436
583
|
this.status = status;
|
|
437
584
|
this.errors = errors;
|
|
585
|
+
if (Error.captureStackTrace) {
|
|
586
|
+
Error.captureStackTrace(this, _AniListError);
|
|
587
|
+
}
|
|
438
588
|
}
|
|
439
589
|
};
|
|
440
590
|
|
|
@@ -533,6 +683,169 @@ function isNetworkError(err) {
|
|
|
533
683
|
return false;
|
|
534
684
|
}
|
|
535
685
|
|
|
686
|
+
// src/types/index.ts
|
|
687
|
+
var MediaType = /* @__PURE__ */ ((MediaType2) => {
|
|
688
|
+
MediaType2["ANIME"] = "ANIME";
|
|
689
|
+
MediaType2["MANGA"] = "MANGA";
|
|
690
|
+
return MediaType2;
|
|
691
|
+
})(MediaType || {});
|
|
692
|
+
var MediaFormat = /* @__PURE__ */ ((MediaFormat2) => {
|
|
693
|
+
MediaFormat2["TV"] = "TV";
|
|
694
|
+
MediaFormat2["TV_SHORT"] = "TV_SHORT";
|
|
695
|
+
MediaFormat2["MOVIE"] = "MOVIE";
|
|
696
|
+
MediaFormat2["SPECIAL"] = "SPECIAL";
|
|
697
|
+
MediaFormat2["OVA"] = "OVA";
|
|
698
|
+
MediaFormat2["ONA"] = "ONA";
|
|
699
|
+
MediaFormat2["MUSIC"] = "MUSIC";
|
|
700
|
+
MediaFormat2["MANGA"] = "MANGA";
|
|
701
|
+
MediaFormat2["NOVEL"] = "NOVEL";
|
|
702
|
+
MediaFormat2["ONE_SHOT"] = "ONE_SHOT";
|
|
703
|
+
return MediaFormat2;
|
|
704
|
+
})(MediaFormat || {});
|
|
705
|
+
var MediaStatus = /* @__PURE__ */ ((MediaStatus2) => {
|
|
706
|
+
MediaStatus2["FINISHED"] = "FINISHED";
|
|
707
|
+
MediaStatus2["RELEASING"] = "RELEASING";
|
|
708
|
+
MediaStatus2["NOT_YET_RELEASED"] = "NOT_YET_RELEASED";
|
|
709
|
+
MediaStatus2["CANCELLED"] = "CANCELLED";
|
|
710
|
+
MediaStatus2["HIATUS"] = "HIATUS";
|
|
711
|
+
return MediaStatus2;
|
|
712
|
+
})(MediaStatus || {});
|
|
713
|
+
var MediaSeason = /* @__PURE__ */ ((MediaSeason2) => {
|
|
714
|
+
MediaSeason2["WINTER"] = "WINTER";
|
|
715
|
+
MediaSeason2["SPRING"] = "SPRING";
|
|
716
|
+
MediaSeason2["SUMMER"] = "SUMMER";
|
|
717
|
+
MediaSeason2["FALL"] = "FALL";
|
|
718
|
+
return MediaSeason2;
|
|
719
|
+
})(MediaSeason || {});
|
|
720
|
+
var MediaSort = /* @__PURE__ */ ((MediaSort2) => {
|
|
721
|
+
MediaSort2["ID"] = "ID";
|
|
722
|
+
MediaSort2["ID_DESC"] = "ID_DESC";
|
|
723
|
+
MediaSort2["TITLE_ROMAJI"] = "TITLE_ROMAJI";
|
|
724
|
+
MediaSort2["TITLE_ROMAJI_DESC"] = "TITLE_ROMAJI_DESC";
|
|
725
|
+
MediaSort2["TITLE_ENGLISH"] = "TITLE_ENGLISH";
|
|
726
|
+
MediaSort2["TITLE_ENGLISH_DESC"] = "TITLE_ENGLISH_DESC";
|
|
727
|
+
MediaSort2["TITLE_NATIVE"] = "TITLE_NATIVE";
|
|
728
|
+
MediaSort2["TITLE_NATIVE_DESC"] = "TITLE_NATIVE_DESC";
|
|
729
|
+
MediaSort2["TYPE"] = "TYPE";
|
|
730
|
+
MediaSort2["TYPE_DESC"] = "TYPE_DESC";
|
|
731
|
+
MediaSort2["FORMAT"] = "FORMAT";
|
|
732
|
+
MediaSort2["FORMAT_DESC"] = "FORMAT_DESC";
|
|
733
|
+
MediaSort2["START_DATE"] = "START_DATE";
|
|
734
|
+
MediaSort2["START_DATE_DESC"] = "START_DATE_DESC";
|
|
735
|
+
MediaSort2["END_DATE"] = "END_DATE";
|
|
736
|
+
MediaSort2["END_DATE_DESC"] = "END_DATE_DESC";
|
|
737
|
+
MediaSort2["SCORE"] = "SCORE";
|
|
738
|
+
MediaSort2["SCORE_DESC"] = "SCORE_DESC";
|
|
739
|
+
MediaSort2["POPULARITY"] = "POPULARITY";
|
|
740
|
+
MediaSort2["POPULARITY_DESC"] = "POPULARITY_DESC";
|
|
741
|
+
MediaSort2["TRENDING"] = "TRENDING";
|
|
742
|
+
MediaSort2["TRENDING_DESC"] = "TRENDING_DESC";
|
|
743
|
+
MediaSort2["EPISODES"] = "EPISODES";
|
|
744
|
+
MediaSort2["EPISODES_DESC"] = "EPISODES_DESC";
|
|
745
|
+
MediaSort2["DURATION"] = "DURATION";
|
|
746
|
+
MediaSort2["DURATION_DESC"] = "DURATION_DESC";
|
|
747
|
+
MediaSort2["STATUS"] = "STATUS";
|
|
748
|
+
MediaSort2["STATUS_DESC"] = "STATUS_DESC";
|
|
749
|
+
MediaSort2["FAVOURITES"] = "FAVOURITES";
|
|
750
|
+
MediaSort2["FAVOURITES_DESC"] = "FAVOURITES_DESC";
|
|
751
|
+
MediaSort2["UPDATED_AT"] = "UPDATED_AT";
|
|
752
|
+
MediaSort2["UPDATED_AT_DESC"] = "UPDATED_AT_DESC";
|
|
753
|
+
MediaSort2["SEARCH_MATCH"] = "SEARCH_MATCH";
|
|
754
|
+
return MediaSort2;
|
|
755
|
+
})(MediaSort || {});
|
|
756
|
+
var AiringSort = /* @__PURE__ */ ((AiringSort2) => {
|
|
757
|
+
AiringSort2["ID"] = "ID";
|
|
758
|
+
AiringSort2["ID_DESC"] = "ID_DESC";
|
|
759
|
+
AiringSort2["MEDIA_ID"] = "MEDIA_ID";
|
|
760
|
+
AiringSort2["MEDIA_ID_DESC"] = "MEDIA_ID_DESC";
|
|
761
|
+
AiringSort2["TIME"] = "TIME";
|
|
762
|
+
AiringSort2["TIME_DESC"] = "TIME_DESC";
|
|
763
|
+
AiringSort2["EPISODE"] = "EPISODE";
|
|
764
|
+
AiringSort2["EPISODE_DESC"] = "EPISODE_DESC";
|
|
765
|
+
return AiringSort2;
|
|
766
|
+
})(AiringSort || {});
|
|
767
|
+
var CharacterSort = /* @__PURE__ */ ((CharacterSort2) => {
|
|
768
|
+
CharacterSort2["ID"] = "ID";
|
|
769
|
+
CharacterSort2["ID_DESC"] = "ID_DESC";
|
|
770
|
+
CharacterSort2["ROLE"] = "ROLE";
|
|
771
|
+
CharacterSort2["ROLE_DESC"] = "ROLE_DESC";
|
|
772
|
+
CharacterSort2["SEARCH_MATCH"] = "SEARCH_MATCH";
|
|
773
|
+
CharacterSort2["FAVOURITES"] = "FAVOURITES";
|
|
774
|
+
CharacterSort2["FAVOURITES_DESC"] = "FAVOURITES_DESC";
|
|
775
|
+
return CharacterSort2;
|
|
776
|
+
})(CharacterSort || {});
|
|
777
|
+
var CharacterRole = /* @__PURE__ */ ((CharacterRole2) => {
|
|
778
|
+
CharacterRole2["MAIN"] = "MAIN";
|
|
779
|
+
CharacterRole2["SUPPORTING"] = "SUPPORTING";
|
|
780
|
+
CharacterRole2["BACKGROUND"] = "BACKGROUND";
|
|
781
|
+
return CharacterRole2;
|
|
782
|
+
})(CharacterRole || {});
|
|
783
|
+
var MediaRelationType = /* @__PURE__ */ ((MediaRelationType2) => {
|
|
784
|
+
MediaRelationType2["ADAPTATION"] = "ADAPTATION";
|
|
785
|
+
MediaRelationType2["PREQUEL"] = "PREQUEL";
|
|
786
|
+
MediaRelationType2["SEQUEL"] = "SEQUEL";
|
|
787
|
+
MediaRelationType2["PARENT"] = "PARENT";
|
|
788
|
+
MediaRelationType2["SIDE_STORY"] = "SIDE_STORY";
|
|
789
|
+
MediaRelationType2["CHARACTER"] = "CHARACTER";
|
|
790
|
+
MediaRelationType2["SUMMARY"] = "SUMMARY";
|
|
791
|
+
MediaRelationType2["ALTERNATIVE"] = "ALTERNATIVE";
|
|
792
|
+
MediaRelationType2["SPIN_OFF"] = "SPIN_OFF";
|
|
793
|
+
MediaRelationType2["OTHER"] = "OTHER";
|
|
794
|
+
MediaRelationType2["SOURCE"] = "SOURCE";
|
|
795
|
+
MediaRelationType2["COMPILATION"] = "COMPILATION";
|
|
796
|
+
MediaRelationType2["CONTAINS"] = "CONTAINS";
|
|
797
|
+
return MediaRelationType2;
|
|
798
|
+
})(MediaRelationType || {});
|
|
799
|
+
var RecommendationSort = /* @__PURE__ */ ((RecommendationSort2) => {
|
|
800
|
+
RecommendationSort2["ID"] = "ID";
|
|
801
|
+
RecommendationSort2["ID_DESC"] = "ID_DESC";
|
|
802
|
+
RecommendationSort2["RATING"] = "RATING";
|
|
803
|
+
RecommendationSort2["RATING_DESC"] = "RATING_DESC";
|
|
804
|
+
return RecommendationSort2;
|
|
805
|
+
})(RecommendationSort || {});
|
|
806
|
+
var MediaListStatus = /* @__PURE__ */ ((MediaListStatus2) => {
|
|
807
|
+
MediaListStatus2["CURRENT"] = "CURRENT";
|
|
808
|
+
MediaListStatus2["PLANNING"] = "PLANNING";
|
|
809
|
+
MediaListStatus2["COMPLETED"] = "COMPLETED";
|
|
810
|
+
MediaListStatus2["DROPPED"] = "DROPPED";
|
|
811
|
+
MediaListStatus2["PAUSED"] = "PAUSED";
|
|
812
|
+
MediaListStatus2["REPEATING"] = "REPEATING";
|
|
813
|
+
return MediaListStatus2;
|
|
814
|
+
})(MediaListStatus || {});
|
|
815
|
+
var MediaListSort = /* @__PURE__ */ ((MediaListSort2) => {
|
|
816
|
+
MediaListSort2["MEDIA_ID"] = "MEDIA_ID";
|
|
817
|
+
MediaListSort2["MEDIA_ID_DESC"] = "MEDIA_ID_DESC";
|
|
818
|
+
MediaListSort2["SCORE"] = "SCORE";
|
|
819
|
+
MediaListSort2["SCORE_DESC"] = "SCORE_DESC";
|
|
820
|
+
MediaListSort2["STATUS"] = "STATUS";
|
|
821
|
+
MediaListSort2["STATUS_DESC"] = "STATUS_DESC";
|
|
822
|
+
MediaListSort2["PROGRESS"] = "PROGRESS";
|
|
823
|
+
MediaListSort2["PROGRESS_DESC"] = "PROGRESS_DESC";
|
|
824
|
+
MediaListSort2["PROGRESS_VOLUMES"] = "PROGRESS_VOLUMES";
|
|
825
|
+
MediaListSort2["PROGRESS_VOLUMES_DESC"] = "PROGRESS_VOLUMES_DESC";
|
|
826
|
+
MediaListSort2["REPEAT"] = "REPEAT";
|
|
827
|
+
MediaListSort2["REPEAT_DESC"] = "REPEAT_DESC";
|
|
828
|
+
MediaListSort2["PRIORITY"] = "PRIORITY";
|
|
829
|
+
MediaListSort2["PRIORITY_DESC"] = "PRIORITY_DESC";
|
|
830
|
+
MediaListSort2["STARTED_ON"] = "STARTED_ON";
|
|
831
|
+
MediaListSort2["STARTED_ON_DESC"] = "STARTED_ON_DESC";
|
|
832
|
+
MediaListSort2["FINISHED_ON"] = "FINISHED_ON";
|
|
833
|
+
MediaListSort2["FINISHED_ON_DESC"] = "FINISHED_ON_DESC";
|
|
834
|
+
MediaListSort2["ADDED_TIME"] = "ADDED_TIME";
|
|
835
|
+
MediaListSort2["ADDED_TIME_DESC"] = "ADDED_TIME_DESC";
|
|
836
|
+
MediaListSort2["UPDATED_TIME"] = "UPDATED_TIME";
|
|
837
|
+
MediaListSort2["UPDATED_TIME_DESC"] = "UPDATED_TIME_DESC";
|
|
838
|
+
MediaListSort2["MEDIA_TITLE_ROMAJI"] = "MEDIA_TITLE_ROMAJI";
|
|
839
|
+
MediaListSort2["MEDIA_TITLE_ROMAJI_DESC"] = "MEDIA_TITLE_ROMAJI_DESC";
|
|
840
|
+
MediaListSort2["MEDIA_TITLE_ENGLISH"] = "MEDIA_TITLE_ENGLISH";
|
|
841
|
+
MediaListSort2["MEDIA_TITLE_ENGLISH_DESC"] = "MEDIA_TITLE_ENGLISH_DESC";
|
|
842
|
+
MediaListSort2["MEDIA_TITLE_NATIVE"] = "MEDIA_TITLE_NATIVE";
|
|
843
|
+
MediaListSort2["MEDIA_TITLE_NATIVE_DESC"] = "MEDIA_TITLE_NATIVE_DESC";
|
|
844
|
+
MediaListSort2["MEDIA_POPULARITY"] = "MEDIA_POPULARITY";
|
|
845
|
+
MediaListSort2["MEDIA_POPULARITY_DESC"] = "MEDIA_POPULARITY_DESC";
|
|
846
|
+
return MediaListSort2;
|
|
847
|
+
})(MediaListSort || {});
|
|
848
|
+
|
|
536
849
|
// src/client/index.ts
|
|
537
850
|
var DEFAULT_API_URL = "https://graphql.anilist.co";
|
|
538
851
|
var AniListClient = class {
|
|
@@ -600,16 +913,57 @@ var AniListClient = class {
|
|
|
600
913
|
*/
|
|
601
914
|
async pagedRequest(query, variables, field) {
|
|
602
915
|
const data = await this.request(query, variables);
|
|
603
|
-
|
|
916
|
+
const results = data.Page[field];
|
|
917
|
+
if (!Array.isArray(results)) {
|
|
918
|
+
throw new AniListError(`Unexpected response: missing field "${field}" in Page`, 0, []);
|
|
919
|
+
}
|
|
920
|
+
return { pageInfo: data.Page.pageInfo, results };
|
|
921
|
+
}
|
|
922
|
+
/**
|
|
923
|
+
* @internal
|
|
924
|
+
* Clamp perPage to AniList's maximum of 50.
|
|
925
|
+
*/
|
|
926
|
+
clampPerPage(value) {
|
|
927
|
+
return Math.min(Math.max(value, 1), 50);
|
|
604
928
|
}
|
|
605
929
|
/**
|
|
606
930
|
* Fetch a single media entry by its AniList ID.
|
|
607
931
|
*
|
|
932
|
+
* Optionally include related data (characters, staff, relations, etc.) via the `include` parameter.
|
|
933
|
+
*
|
|
608
934
|
* @param id - The AniList media ID
|
|
935
|
+
* @param include - Optional related data to include
|
|
609
936
|
* @returns The media object
|
|
937
|
+
*
|
|
938
|
+
* @example
|
|
939
|
+
* ```ts
|
|
940
|
+
* // Basic usage — same as before (includes relations by default)
|
|
941
|
+
* const anime = await client.getMedia(1);
|
|
942
|
+
*
|
|
943
|
+
* // Include characters sorted by role, 25 results
|
|
944
|
+
* const anime = await client.getMedia(1, { characters: true });
|
|
945
|
+
*
|
|
946
|
+
* // Include characters with voice actors
|
|
947
|
+
* const anime = await client.getMedia(1, { characters: { voiceActors: true } });
|
|
948
|
+
*
|
|
949
|
+
* // Full control
|
|
950
|
+
* const anime = await client.getMedia(1, {
|
|
951
|
+
* characters: { perPage: 50, sort: true },
|
|
952
|
+
* staff: true,
|
|
953
|
+
* relations: true,
|
|
954
|
+
* streamingEpisodes: true,
|
|
955
|
+
* externalLinks: true,
|
|
956
|
+
* stats: true,
|
|
957
|
+
* recommendations: { perPage: 5 },
|
|
958
|
+
* });
|
|
959
|
+
*
|
|
960
|
+
* // Exclude relations for a lighter response
|
|
961
|
+
* const anime = await client.getMedia(1, { characters: true, relations: false });
|
|
962
|
+
* ```
|
|
610
963
|
*/
|
|
611
|
-
async getMedia(id) {
|
|
612
|
-
const
|
|
964
|
+
async getMedia(id, include) {
|
|
965
|
+
const query = include ? buildMediaByIdQuery(include) : QUERY_MEDIA_BY_ID;
|
|
966
|
+
const data = await this.request(query, { id });
|
|
613
967
|
return data.Media;
|
|
614
968
|
}
|
|
615
969
|
/**
|
|
@@ -629,7 +983,11 @@ var AniListClient = class {
|
|
|
629
983
|
*/
|
|
630
984
|
async searchMedia(options = {}) {
|
|
631
985
|
const { query: search, page = 1, perPage = 20, ...filters } = options;
|
|
632
|
-
return this.pagedRequest(
|
|
986
|
+
return this.pagedRequest(
|
|
987
|
+
QUERY_MEDIA_SEARCH,
|
|
988
|
+
{ search, ...filters, page, perPage: this.clampPerPage(perPage) },
|
|
989
|
+
"media"
|
|
990
|
+
);
|
|
633
991
|
}
|
|
634
992
|
/**
|
|
635
993
|
* Get currently trending anime or manga.
|
|
@@ -638,25 +996,68 @@ var AniListClient = class {
|
|
|
638
996
|
* @param page - Page number (default 1)
|
|
639
997
|
* @param perPage - Results per page (default 20, max 50)
|
|
640
998
|
*/
|
|
641
|
-
async getTrending(type = "ANIME"
|
|
642
|
-
return this.pagedRequest(QUERY_TRENDING, { type, page, perPage }, "media");
|
|
999
|
+
async getTrending(type = "ANIME" /* ANIME */, page = 1, perPage = 20) {
|
|
1000
|
+
return this.pagedRequest(QUERY_TRENDING, { type, page, perPage: this.clampPerPage(perPage) }, "media");
|
|
643
1001
|
}
|
|
644
1002
|
/**
|
|
645
1003
|
* Fetch a character by AniList ID.
|
|
1004
|
+
*
|
|
1005
|
+
* @param id - The AniList character ID
|
|
1006
|
+
* @param include - Optional include options (e.g. voice actors)
|
|
1007
|
+
* @returns The character object
|
|
1008
|
+
*
|
|
1009
|
+
* @example
|
|
1010
|
+
* ```ts
|
|
1011
|
+
* const spike = await client.getCharacter(1);
|
|
1012
|
+
* console.log(spike.name.full); // "Spike Spiegel"
|
|
1013
|
+
*
|
|
1014
|
+
* // With voice actors
|
|
1015
|
+
* const spike = await client.getCharacter(1, { voiceActors: true });
|
|
1016
|
+
* spike.media?.edges?.forEach((e) => {
|
|
1017
|
+
* console.log(e.node.title.romaji);
|
|
1018
|
+
* e.voiceActors?.forEach((va) => console.log(` VA: ${va.name.full}`));
|
|
1019
|
+
* });
|
|
1020
|
+
* ```
|
|
646
1021
|
*/
|
|
647
|
-
async getCharacter(id) {
|
|
648
|
-
const
|
|
1022
|
+
async getCharacter(id, include) {
|
|
1023
|
+
const query = include?.voiceActors ? QUERY_CHARACTER_BY_ID_WITH_VA : QUERY_CHARACTER_BY_ID;
|
|
1024
|
+
const data = await this.request(query, { id });
|
|
649
1025
|
return data.Character;
|
|
650
1026
|
}
|
|
651
1027
|
/**
|
|
652
1028
|
* Search for characters by name.
|
|
1029
|
+
*
|
|
1030
|
+
* @param options - Search / pagination parameters (includes optional `voiceActors`)
|
|
1031
|
+
* @returns Paginated results with matching characters
|
|
1032
|
+
*
|
|
1033
|
+
* @example
|
|
1034
|
+
* ```ts
|
|
1035
|
+
* const result = await client.searchCharacters({ query: "Luffy", perPage: 5 });
|
|
1036
|
+
*
|
|
1037
|
+
* // With voice actors
|
|
1038
|
+
* const result = await client.searchCharacters({ query: "Luffy", voiceActors: true });
|
|
1039
|
+
* ```
|
|
653
1040
|
*/
|
|
654
1041
|
async searchCharacters(options = {}) {
|
|
655
|
-
const { query: search, page = 1, perPage = 20, ...rest } = options;
|
|
656
|
-
|
|
1042
|
+
const { query: search, page = 1, perPage = 20, voiceActors, ...rest } = options;
|
|
1043
|
+
const gqlQuery = voiceActors ? QUERY_CHARACTER_SEARCH_WITH_VA : QUERY_CHARACTER_SEARCH;
|
|
1044
|
+
return this.pagedRequest(
|
|
1045
|
+
gqlQuery,
|
|
1046
|
+
{ search, ...rest, page, perPage: this.clampPerPage(perPage) },
|
|
1047
|
+
"characters"
|
|
1048
|
+
);
|
|
657
1049
|
}
|
|
658
1050
|
/**
|
|
659
1051
|
* Fetch a staff member by AniList ID.
|
|
1052
|
+
*
|
|
1053
|
+
* @param id - The AniList staff ID
|
|
1054
|
+
* @returns The staff object
|
|
1055
|
+
*
|
|
1056
|
+
* @example
|
|
1057
|
+
* ```ts
|
|
1058
|
+
* const staff = await client.getStaff(95001);
|
|
1059
|
+
* console.log(staff.name.full);
|
|
1060
|
+
* ```
|
|
660
1061
|
*/
|
|
661
1062
|
async getStaff(id) {
|
|
662
1063
|
const data = await this.request(QUERY_STAFF_BY_ID, { id });
|
|
@@ -664,13 +1065,34 @@ var AniListClient = class {
|
|
|
664
1065
|
}
|
|
665
1066
|
/**
|
|
666
1067
|
* Search for staff (voice actors, directors, etc.).
|
|
1068
|
+
*
|
|
1069
|
+
* @param options - Search / pagination parameters
|
|
1070
|
+
* @returns Paginated results with matching staff
|
|
1071
|
+
*
|
|
1072
|
+
* @example
|
|
1073
|
+
* ```ts
|
|
1074
|
+
* const result = await client.searchStaff({ query: "Miyazaki", perPage: 5 });
|
|
1075
|
+
* ```
|
|
667
1076
|
*/
|
|
668
1077
|
async searchStaff(options = {}) {
|
|
669
|
-
const { query: search, page = 1, perPage = 20 } = options;
|
|
670
|
-
return this.pagedRequest(
|
|
1078
|
+
const { query: search, page = 1, perPage = 20, sort } = options;
|
|
1079
|
+
return this.pagedRequest(
|
|
1080
|
+
QUERY_STAFF_SEARCH,
|
|
1081
|
+
{ search, sort, page, perPage: this.clampPerPage(perPage) },
|
|
1082
|
+
"staff"
|
|
1083
|
+
);
|
|
671
1084
|
}
|
|
672
1085
|
/**
|
|
673
1086
|
* Fetch a user by AniList ID.
|
|
1087
|
+
*
|
|
1088
|
+
* @param id - The AniList user ID
|
|
1089
|
+
* @returns The user object
|
|
1090
|
+
*
|
|
1091
|
+
* @example
|
|
1092
|
+
* ```ts
|
|
1093
|
+
* const user = await client.getUser(1);
|
|
1094
|
+
* console.log(user.name);
|
|
1095
|
+
* ```
|
|
674
1096
|
*/
|
|
675
1097
|
async getUser(id) {
|
|
676
1098
|
const data = await this.request(QUERY_USER_BY_ID, { id });
|
|
@@ -678,6 +1100,15 @@ var AniListClient = class {
|
|
|
678
1100
|
}
|
|
679
1101
|
/**
|
|
680
1102
|
* Fetch a user by username.
|
|
1103
|
+
*
|
|
1104
|
+
* @param name - The AniList username
|
|
1105
|
+
* @returns The user object
|
|
1106
|
+
*
|
|
1107
|
+
* @example
|
|
1108
|
+
* ```ts
|
|
1109
|
+
* const user = await client.getUserByName("AniList");
|
|
1110
|
+
* console.log(user.statistics);
|
|
1111
|
+
* ```
|
|
681
1112
|
*/
|
|
682
1113
|
async getUserByName(name) {
|
|
683
1114
|
const data = await this.request(QUERY_USER_BY_NAME, { name });
|
|
@@ -716,7 +1147,7 @@ var AniListClient = class {
|
|
|
716
1147
|
airingAt_lesser: options.airingAtLesser ?? now,
|
|
717
1148
|
sort: options.sort ?? ["TIME_DESC"],
|
|
718
1149
|
page: options.page ?? 1,
|
|
719
|
-
perPage: options.perPage ?? 20
|
|
1150
|
+
perPage: this.clampPerPage(options.perPage ?? 20)
|
|
720
1151
|
};
|
|
721
1152
|
return this.pagedRequest(QUERY_AIRING_SCHEDULE, variables, "airingSchedules");
|
|
722
1153
|
}
|
|
@@ -739,7 +1170,7 @@ var AniListClient = class {
|
|
|
739
1170
|
QUERY_RECENT_CHAPTERS,
|
|
740
1171
|
{
|
|
741
1172
|
page: options.page ?? 1,
|
|
742
|
-
perPage: options.perPage ?? 20
|
|
1173
|
+
perPage: this.clampPerPage(options.perPage ?? 20)
|
|
743
1174
|
},
|
|
744
1175
|
"media"
|
|
745
1176
|
);
|
|
@@ -765,7 +1196,7 @@ var AniListClient = class {
|
|
|
765
1196
|
type: options.type,
|
|
766
1197
|
sort: options.sort ?? ["POPULARITY_DESC"],
|
|
767
1198
|
page: options.page ?? 1,
|
|
768
|
-
perPage: options.perPage ?? 20
|
|
1199
|
+
perPage: this.clampPerPage(options.perPage ?? 20)
|
|
769
1200
|
},
|
|
770
1201
|
"media"
|
|
771
1202
|
);
|
|
@@ -827,7 +1258,7 @@ var AniListClient = class {
|
|
|
827
1258
|
type: options.type ?? "ANIME",
|
|
828
1259
|
sort: options.sort ?? ["POPULARITY_DESC"],
|
|
829
1260
|
page: options.page ?? 1,
|
|
830
|
-
perPage: options.perPage ?? 20
|
|
1261
|
+
perPage: this.clampPerPage(options.perPage ?? 20)
|
|
831
1262
|
},
|
|
832
1263
|
"media"
|
|
833
1264
|
);
|
|
@@ -869,7 +1300,7 @@ var AniListClient = class {
|
|
|
869
1300
|
status: options.status,
|
|
870
1301
|
sort: options.sort,
|
|
871
1302
|
page: options.page ?? 1,
|
|
872
|
-
perPage: options.perPage ?? 20
|
|
1303
|
+
perPage: this.clampPerPage(options.perPage ?? 20)
|
|
873
1304
|
},
|
|
874
1305
|
"mediaList"
|
|
875
1306
|
);
|
|
@@ -902,7 +1333,7 @@ var AniListClient = class {
|
|
|
902
1333
|
{
|
|
903
1334
|
search: options.query,
|
|
904
1335
|
page: options.page ?? 1,
|
|
905
|
-
perPage: options.perPage ?? 20
|
|
1336
|
+
perPage: this.clampPerPage(options.perPage ?? 20)
|
|
906
1337
|
},
|
|
907
1338
|
"studios"
|
|
908
1339
|
);
|
|
@@ -1003,13 +1434,14 @@ var AniListClient = class {
|
|
|
1003
1434
|
/** @internal */
|
|
1004
1435
|
async executeBatch(ids, buildQuery, prefix) {
|
|
1005
1436
|
const chunks = this.chunk(ids, 50);
|
|
1006
|
-
const
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1437
|
+
const chunkResults = await Promise.all(
|
|
1438
|
+
chunks.map(async (chunk) => {
|
|
1439
|
+
const query = buildQuery(chunk);
|
|
1440
|
+
const data = await this.request(query);
|
|
1441
|
+
return chunk.map((_, i) => data[`${prefix}${i}`]);
|
|
1442
|
+
})
|
|
1443
|
+
);
|
|
1444
|
+
return chunkResults.flat();
|
|
1013
1445
|
}
|
|
1014
1446
|
/** @internal */
|
|
1015
1447
|
chunk(arr, size) {
|
|
@@ -1082,8 +1514,25 @@ var RedisCache = class {
|
|
|
1082
1514
|
const count = await this.client.del(this.prefixedKey(key));
|
|
1083
1515
|
return count > 0;
|
|
1084
1516
|
}
|
|
1517
|
+
/**
|
|
1518
|
+
* Collect keys matching a pattern. Uses SCAN when available, falls back to KEYS.
|
|
1519
|
+
*
|
|
1520
|
+
* **Warning:** The `KEYS` fallback is O(N) and blocks the Redis server.
|
|
1521
|
+
* Provide a client with `scanIterator` support for production use.
|
|
1522
|
+
* @internal
|
|
1523
|
+
*/
|
|
1524
|
+
async collectKeys(pattern) {
|
|
1525
|
+
if (this.client.scanIterator) {
|
|
1526
|
+
const keys = [];
|
|
1527
|
+
for await (const key of this.client.scanIterator({ MATCH: pattern, COUNT: 100 })) {
|
|
1528
|
+
keys.push(key);
|
|
1529
|
+
}
|
|
1530
|
+
return keys;
|
|
1531
|
+
}
|
|
1532
|
+
return this.client.keys(pattern);
|
|
1533
|
+
}
|
|
1085
1534
|
async clear() {
|
|
1086
|
-
const keys = await this.
|
|
1535
|
+
const keys = await this.collectKeys(`${this.prefix}*`);
|
|
1087
1536
|
if (keys.length > 0) {
|
|
1088
1537
|
await this.client.del(...keys);
|
|
1089
1538
|
}
|
|
@@ -1101,7 +1550,7 @@ var RedisCache = class {
|
|
|
1101
1550
|
return keys.length;
|
|
1102
1551
|
}
|
|
1103
1552
|
async keys() {
|
|
1104
|
-
const raw = await this.
|
|
1553
|
+
const raw = await this.collectKeys(`${this.prefix}*`);
|
|
1105
1554
|
return raw.map((k) => k.slice(this.prefix.length));
|
|
1106
1555
|
}
|
|
1107
1556
|
/**
|
|
@@ -1111,153 +1560,22 @@ var RedisCache = class {
|
|
|
1111
1560
|
* @returns Number of entries removed.
|
|
1112
1561
|
*/
|
|
1113
1562
|
async invalidate(pattern) {
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1563
|
+
if (typeof pattern === "string") {
|
|
1564
|
+
const keys = await this.collectKeys(`${this.prefix}${pattern}`);
|
|
1565
|
+
if (keys.length === 0) return 0;
|
|
1566
|
+
return this.client.del(...keys);
|
|
1567
|
+
}
|
|
1568
|
+
const allKeys = await this.collectKeys(`${this.prefix}*`);
|
|
1569
|
+
const matching = allKeys.filter((k) => pattern.test(k.slice(this.prefix.length)));
|
|
1570
|
+
if (matching.length === 0) return 0;
|
|
1571
|
+
return this.client.del(...matching);
|
|
1117
1572
|
}
|
|
1118
1573
|
};
|
|
1119
1574
|
|
|
1120
|
-
// src/types/index.ts
|
|
1121
|
-
var MediaType = /* @__PURE__ */ ((MediaType2) => {
|
|
1122
|
-
MediaType2["ANIME"] = "ANIME";
|
|
1123
|
-
MediaType2["MANGA"] = "MANGA";
|
|
1124
|
-
return MediaType2;
|
|
1125
|
-
})(MediaType || {});
|
|
1126
|
-
var MediaFormat = /* @__PURE__ */ ((MediaFormat2) => {
|
|
1127
|
-
MediaFormat2["TV"] = "TV";
|
|
1128
|
-
MediaFormat2["TV_SHORT"] = "TV_SHORT";
|
|
1129
|
-
MediaFormat2["MOVIE"] = "MOVIE";
|
|
1130
|
-
MediaFormat2["SPECIAL"] = "SPECIAL";
|
|
1131
|
-
MediaFormat2["OVA"] = "OVA";
|
|
1132
|
-
MediaFormat2["ONA"] = "ONA";
|
|
1133
|
-
MediaFormat2["MUSIC"] = "MUSIC";
|
|
1134
|
-
MediaFormat2["MANGA"] = "MANGA";
|
|
1135
|
-
MediaFormat2["NOVEL"] = "NOVEL";
|
|
1136
|
-
MediaFormat2["ONE_SHOT"] = "ONE_SHOT";
|
|
1137
|
-
return MediaFormat2;
|
|
1138
|
-
})(MediaFormat || {});
|
|
1139
|
-
var MediaStatus = /* @__PURE__ */ ((MediaStatus2) => {
|
|
1140
|
-
MediaStatus2["FINISHED"] = "FINISHED";
|
|
1141
|
-
MediaStatus2["RELEASING"] = "RELEASING";
|
|
1142
|
-
MediaStatus2["NOT_YET_RELEASED"] = "NOT_YET_RELEASED";
|
|
1143
|
-
MediaStatus2["CANCELLED"] = "CANCELLED";
|
|
1144
|
-
MediaStatus2["HIATUS"] = "HIATUS";
|
|
1145
|
-
return MediaStatus2;
|
|
1146
|
-
})(MediaStatus || {});
|
|
1147
|
-
var MediaSeason = /* @__PURE__ */ ((MediaSeason2) => {
|
|
1148
|
-
MediaSeason2["WINTER"] = "WINTER";
|
|
1149
|
-
MediaSeason2["SPRING"] = "SPRING";
|
|
1150
|
-
MediaSeason2["SUMMER"] = "SUMMER";
|
|
1151
|
-
MediaSeason2["FALL"] = "FALL";
|
|
1152
|
-
return MediaSeason2;
|
|
1153
|
-
})(MediaSeason || {});
|
|
1154
|
-
var MediaSort = /* @__PURE__ */ ((MediaSort2) => {
|
|
1155
|
-
MediaSort2["ID"] = "ID";
|
|
1156
|
-
MediaSort2["TITLE_ROMAJI"] = "TITLE_ROMAJI";
|
|
1157
|
-
MediaSort2["TITLE_ENGLISH"] = "TITLE_ENGLISH";
|
|
1158
|
-
MediaSort2["TITLE_NATIVE"] = "TITLE_NATIVE";
|
|
1159
|
-
MediaSort2["TYPE"] = "TYPE";
|
|
1160
|
-
MediaSort2["FORMAT"] = "FORMAT";
|
|
1161
|
-
MediaSort2["START_DATE"] = "START_DATE";
|
|
1162
|
-
MediaSort2["END_DATE"] = "END_DATE";
|
|
1163
|
-
MediaSort2["SCORE"] = "SCORE";
|
|
1164
|
-
MediaSort2["POPULARITY"] = "POPULARITY";
|
|
1165
|
-
MediaSort2["TRENDING"] = "TRENDING";
|
|
1166
|
-
MediaSort2["EPISODES"] = "EPISODES";
|
|
1167
|
-
MediaSort2["DURATION"] = "DURATION";
|
|
1168
|
-
MediaSort2["STATUS"] = "STATUS";
|
|
1169
|
-
MediaSort2["FAVOURITES"] = "FAVOURITES";
|
|
1170
|
-
MediaSort2["UPDATED_AT"] = "UPDATED_AT";
|
|
1171
|
-
MediaSort2["SEARCH_MATCH"] = "SEARCH_MATCH";
|
|
1172
|
-
return MediaSort2;
|
|
1173
|
-
})(MediaSort || {});
|
|
1174
|
-
var AiringSort = /* @__PURE__ */ ((AiringSort2) => {
|
|
1175
|
-
AiringSort2["ID"] = "ID";
|
|
1176
|
-
AiringSort2["ID_DESC"] = "ID_DESC";
|
|
1177
|
-
AiringSort2["MEDIA_ID"] = "MEDIA_ID";
|
|
1178
|
-
AiringSort2["MEDIA_ID_DESC"] = "MEDIA_ID_DESC";
|
|
1179
|
-
AiringSort2["TIME"] = "TIME";
|
|
1180
|
-
AiringSort2["TIME_DESC"] = "TIME_DESC";
|
|
1181
|
-
AiringSort2["EPISODE"] = "EPISODE";
|
|
1182
|
-
AiringSort2["EPISODE_DESC"] = "EPISODE_DESC";
|
|
1183
|
-
return AiringSort2;
|
|
1184
|
-
})(AiringSort || {});
|
|
1185
|
-
var CharacterSort = /* @__PURE__ */ ((CharacterSort2) => {
|
|
1186
|
-
CharacterSort2["ID"] = "ID";
|
|
1187
|
-
CharacterSort2["ROLE"] = "ROLE";
|
|
1188
|
-
CharacterSort2["SEARCH_MATCH"] = "SEARCH_MATCH";
|
|
1189
|
-
CharacterSort2["FAVOURITES"] = "FAVOURITES";
|
|
1190
|
-
return CharacterSort2;
|
|
1191
|
-
})(CharacterSort || {});
|
|
1192
|
-
var MediaRelationType = /* @__PURE__ */ ((MediaRelationType2) => {
|
|
1193
|
-
MediaRelationType2["ADAPTATION"] = "ADAPTATION";
|
|
1194
|
-
MediaRelationType2["PREQUEL"] = "PREQUEL";
|
|
1195
|
-
MediaRelationType2["SEQUEL"] = "SEQUEL";
|
|
1196
|
-
MediaRelationType2["PARENT"] = "PARENT";
|
|
1197
|
-
MediaRelationType2["SIDE_STORY"] = "SIDE_STORY";
|
|
1198
|
-
MediaRelationType2["CHARACTER"] = "CHARACTER";
|
|
1199
|
-
MediaRelationType2["SUMMARY"] = "SUMMARY";
|
|
1200
|
-
MediaRelationType2["ALTERNATIVE"] = "ALTERNATIVE";
|
|
1201
|
-
MediaRelationType2["SPIN_OFF"] = "SPIN_OFF";
|
|
1202
|
-
MediaRelationType2["OTHER"] = "OTHER";
|
|
1203
|
-
MediaRelationType2["SOURCE"] = "SOURCE";
|
|
1204
|
-
MediaRelationType2["COMPILATION"] = "COMPILATION";
|
|
1205
|
-
MediaRelationType2["CONTAINS"] = "CONTAINS";
|
|
1206
|
-
return MediaRelationType2;
|
|
1207
|
-
})(MediaRelationType || {});
|
|
1208
|
-
var RecommendationSort = /* @__PURE__ */ ((RecommendationSort2) => {
|
|
1209
|
-
RecommendationSort2["ID"] = "ID";
|
|
1210
|
-
RecommendationSort2["ID_DESC"] = "ID_DESC";
|
|
1211
|
-
RecommendationSort2["RATING"] = "RATING";
|
|
1212
|
-
RecommendationSort2["RATING_DESC"] = "RATING_DESC";
|
|
1213
|
-
return RecommendationSort2;
|
|
1214
|
-
})(RecommendationSort || {});
|
|
1215
|
-
var MediaListStatus = /* @__PURE__ */ ((MediaListStatus2) => {
|
|
1216
|
-
MediaListStatus2["CURRENT"] = "CURRENT";
|
|
1217
|
-
MediaListStatus2["PLANNING"] = "PLANNING";
|
|
1218
|
-
MediaListStatus2["COMPLETED"] = "COMPLETED";
|
|
1219
|
-
MediaListStatus2["DROPPED"] = "DROPPED";
|
|
1220
|
-
MediaListStatus2["PAUSED"] = "PAUSED";
|
|
1221
|
-
MediaListStatus2["REPEATING"] = "REPEATING";
|
|
1222
|
-
return MediaListStatus2;
|
|
1223
|
-
})(MediaListStatus || {});
|
|
1224
|
-
var MediaListSort = /* @__PURE__ */ ((MediaListSort2) => {
|
|
1225
|
-
MediaListSort2["MEDIA_ID"] = "MEDIA_ID";
|
|
1226
|
-
MediaListSort2["MEDIA_ID_DESC"] = "MEDIA_ID_DESC";
|
|
1227
|
-
MediaListSort2["SCORE"] = "SCORE";
|
|
1228
|
-
MediaListSort2["SCORE_DESC"] = "SCORE_DESC";
|
|
1229
|
-
MediaListSort2["STATUS"] = "STATUS";
|
|
1230
|
-
MediaListSort2["STATUS_DESC"] = "STATUS_DESC";
|
|
1231
|
-
MediaListSort2["PROGRESS"] = "PROGRESS";
|
|
1232
|
-
MediaListSort2["PROGRESS_DESC"] = "PROGRESS_DESC";
|
|
1233
|
-
MediaListSort2["PROGRESS_VOLUMES"] = "PROGRESS_VOLUMES";
|
|
1234
|
-
MediaListSort2["PROGRESS_VOLUMES_DESC"] = "PROGRESS_VOLUMES_DESC";
|
|
1235
|
-
MediaListSort2["REPEAT"] = "REPEAT";
|
|
1236
|
-
MediaListSort2["REPEAT_DESC"] = "REPEAT_DESC";
|
|
1237
|
-
MediaListSort2["PRIORITY"] = "PRIORITY";
|
|
1238
|
-
MediaListSort2["PRIORITY_DESC"] = "PRIORITY_DESC";
|
|
1239
|
-
MediaListSort2["STARTED_ON"] = "STARTED_ON";
|
|
1240
|
-
MediaListSort2["STARTED_ON_DESC"] = "STARTED_ON_DESC";
|
|
1241
|
-
MediaListSort2["FINISHED_ON"] = "FINISHED_ON";
|
|
1242
|
-
MediaListSort2["FINISHED_ON_DESC"] = "FINISHED_ON_DESC";
|
|
1243
|
-
MediaListSort2["ADDED_TIME"] = "ADDED_TIME";
|
|
1244
|
-
MediaListSort2["ADDED_TIME_DESC"] = "ADDED_TIME_DESC";
|
|
1245
|
-
MediaListSort2["UPDATED_TIME"] = "UPDATED_TIME";
|
|
1246
|
-
MediaListSort2["UPDATED_TIME_DESC"] = "UPDATED_TIME_DESC";
|
|
1247
|
-
MediaListSort2["MEDIA_TITLE_ROMAJI"] = "MEDIA_TITLE_ROMAJI";
|
|
1248
|
-
MediaListSort2["MEDIA_TITLE_ROMAJI_DESC"] = "MEDIA_TITLE_ROMAJI_DESC";
|
|
1249
|
-
MediaListSort2["MEDIA_TITLE_ENGLISH"] = "MEDIA_TITLE_ENGLISH";
|
|
1250
|
-
MediaListSort2["MEDIA_TITLE_ENGLISH_DESC"] = "MEDIA_TITLE_ENGLISH_DESC";
|
|
1251
|
-
MediaListSort2["MEDIA_TITLE_NATIVE"] = "MEDIA_TITLE_NATIVE";
|
|
1252
|
-
MediaListSort2["MEDIA_TITLE_NATIVE_DESC"] = "MEDIA_TITLE_NATIVE_DESC";
|
|
1253
|
-
MediaListSort2["MEDIA_POPULARITY"] = "MEDIA_POPULARITY";
|
|
1254
|
-
MediaListSort2["MEDIA_POPULARITY_DESC"] = "MEDIA_POPULARITY_DESC";
|
|
1255
|
-
return MediaListSort2;
|
|
1256
|
-
})(MediaListSort || {});
|
|
1257
|
-
|
|
1258
1575
|
exports.AiringSort = AiringSort;
|
|
1259
1576
|
exports.AniListClient = AniListClient;
|
|
1260
1577
|
exports.AniListError = AniListError;
|
|
1578
|
+
exports.CharacterRole = CharacterRole;
|
|
1261
1579
|
exports.CharacterSort = CharacterSort;
|
|
1262
1580
|
exports.MediaFormat = MediaFormat;
|
|
1263
1581
|
exports.MediaListSort = MediaListSort;
|