@irfanshadikrishad/anilist 1.1.10 → 1.2.0-forbidden.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/{LICENSE → LICENSE.md} +382 -382
- package/README.md +245 -232
- package/assets/binance.jpg +0 -0
- package/bin/helpers/auth.d.ts +4 -0
- package/bin/helpers/auth.js +238 -50
- package/bin/helpers/fetcher.d.ts +3 -2
- package/bin/helpers/fetcher.js +9 -3
- package/bin/helpers/lists.d.ts +1 -1
- package/bin/helpers/lists.js +2 -2
- package/bin/helpers/mutations.d.ts +2 -1
- package/bin/helpers/mutations.js +37 -32
- package/bin/helpers/queries.d.ts +6 -3
- package/bin/helpers/queries.js +157 -128
- package/bin/helpers/workers.d.ts +2 -1
- package/bin/helpers/workers.js +76 -68
- package/bin/index.js +9 -5
- package/package.json +80 -75
package/bin/helpers/auth.js
CHANGED
|
@@ -15,8 +15,8 @@ import os from "os";
|
|
|
15
15
|
import path from "path";
|
|
16
16
|
import { fetcher } from "./fetcher.js";
|
|
17
17
|
import { AniList, MyAnimeList } from "./lists.js";
|
|
18
|
-
import { deleteActivityMutation, saveTextActivityMutation, } from "./mutations.js";
|
|
19
|
-
import { activityAllQuery, activityAnimeListQuery, activityMangaListQuery, activityMediaList, activityMessageQuery, activityTextQuery, currentUserAnimeList, currentUserMangaList, currentUserQuery, deleteMangaEntryMutation, deleteMediaEntryMutation, userActivityQuery, } from "./queries.js";
|
|
18
|
+
import { deleteActivityMutation, likeActivityMutation, saveTextActivityMutation, } from "./mutations.js";
|
|
19
|
+
import { activityAllQuery, activityAnimeListQuery, activityMangaListQuery, activityMediaList, activityMessageQuery, activityTextQuery, currentUserAnimeList, currentUserMangaList, currentUserQuery, deleteMangaEntryMutation, deleteMediaEntryMutation, followingActivitiesQuery, globalActivitiesQuery, specificUserActivitiesQuery, userActivityQuery, userQuery, } from "./queries.js";
|
|
20
20
|
import { aniListEndpoint, getTitle, redirectUri } from "./workers.js";
|
|
21
21
|
const home_dir = os.homedir();
|
|
22
22
|
const save_path = path.join(home_dir, ".anilist_token");
|
|
@@ -130,28 +130,28 @@ class Auth {
|
|
|
130
130
|
perPage: 10,
|
|
131
131
|
});
|
|
132
132
|
const activities = (_b = (_a = activiResponse === null || activiResponse === void 0 ? void 0 : activiResponse.data) === null || _a === void 0 ? void 0 : _a.Page) === null || _b === void 0 ? void 0 : _b.activities;
|
|
133
|
-
console.log(`
|
|
134
|
-
ID: ${user === null || user === void 0 ? void 0 : user.id}
|
|
135
|
-
Name: ${user === null || user === void 0 ? void 0 : user.name}
|
|
136
|
-
siteUrl: ${user === null || user === void 0 ? void 0 : user.siteUrl}
|
|
137
|
-
profileColor: ${(_c = user === null || user === void 0 ? void 0 : user.options) === null || _c === void 0 ? void 0 : _c.profileColor}
|
|
138
|
-
timeZone: ${(_d = user === null || user === void 0 ? void 0 : user.options) === null || _d === void 0 ? void 0 : _d.timezone}
|
|
139
|
-
activityMergeTime: ${(_e = user === null || user === void 0 ? void 0 : user.options) === null || _e === void 0 ? void 0 : _e.activityMergeTime}
|
|
140
|
-
donatorTier: ${user === null || user === void 0 ? void 0 : user.donatorTier}
|
|
141
|
-
donatorBadge: ${user === null || user === void 0 ? void 0 : user.donatorBadge}
|
|
142
|
-
unreadNotificationCount:${user === null || user === void 0 ? void 0 : user.unreadNotificationCount}
|
|
143
|
-
Account Created: ${new Date((user === null || user === void 0 ? void 0 : user.createdAt) * 1000).toUTCString()}
|
|
144
|
-
Account Updated: ${new Date((user === null || user === void 0 ? void 0 : user.updatedAt) * 1000).toUTCString()}
|
|
145
|
-
|
|
146
|
-
Statistics (Anime):
|
|
147
|
-
Count: ${(_g = (_f = user === null || user === void 0 ? void 0 : user.statistics) === null || _f === void 0 ? void 0 : _f.anime) === null || _g === void 0 ? void 0 : _g.count}
|
|
148
|
-
Mean Score: ${(_j = (_h = user === null || user === void 0 ? void 0 : user.statistics) === null || _h === void 0 ? void 0 : _h.anime) === null || _j === void 0 ? void 0 : _j.meanScore}
|
|
149
|
-
Minutes Watched: ${(_l = (_k = user === null || user === void 0 ? void 0 : user.statistics) === null || _k === void 0 ? void 0 : _k.anime) === null || _l === void 0 ? void 0 : _l.minutesWatched}
|
|
150
|
-
|
|
151
|
-
Statistics (Manga):
|
|
152
|
-
Count: ${(_o = (_m = user === null || user === void 0 ? void 0 : user.statistics) === null || _m === void 0 ? void 0 : _m.manga) === null || _o === void 0 ? void 0 : _o.count}
|
|
153
|
-
Chapters Read: ${(_q = (_p = user === null || user === void 0 ? void 0 : user.statistics) === null || _p === void 0 ? void 0 : _p.manga) === null || _q === void 0 ? void 0 : _q.chaptersRead}
|
|
154
|
-
Volumes Read: ${(_s = (_r = user === null || user === void 0 ? void 0 : user.statistics) === null || _r === void 0 ? void 0 : _r.manga) === null || _s === void 0 ? void 0 : _s.volumesRead}
|
|
133
|
+
console.log(`
|
|
134
|
+
ID: ${user === null || user === void 0 ? void 0 : user.id}
|
|
135
|
+
Name: ${user === null || user === void 0 ? void 0 : user.name}
|
|
136
|
+
siteUrl: ${user === null || user === void 0 ? void 0 : user.siteUrl}
|
|
137
|
+
profileColor: ${(_c = user === null || user === void 0 ? void 0 : user.options) === null || _c === void 0 ? void 0 : _c.profileColor}
|
|
138
|
+
timeZone: ${(_d = user === null || user === void 0 ? void 0 : user.options) === null || _d === void 0 ? void 0 : _d.timezone}
|
|
139
|
+
activityMergeTime: ${(_e = user === null || user === void 0 ? void 0 : user.options) === null || _e === void 0 ? void 0 : _e.activityMergeTime}
|
|
140
|
+
donatorTier: ${user === null || user === void 0 ? void 0 : user.donatorTier}
|
|
141
|
+
donatorBadge: ${user === null || user === void 0 ? void 0 : user.donatorBadge}
|
|
142
|
+
unreadNotificationCount:${user === null || user === void 0 ? void 0 : user.unreadNotificationCount}
|
|
143
|
+
Account Created: ${new Date((user === null || user === void 0 ? void 0 : user.createdAt) * 1000).toUTCString()}
|
|
144
|
+
Account Updated: ${new Date((user === null || user === void 0 ? void 0 : user.updatedAt) * 1000).toUTCString()}
|
|
145
|
+
|
|
146
|
+
Statistics (Anime):
|
|
147
|
+
Count: ${(_g = (_f = user === null || user === void 0 ? void 0 : user.statistics) === null || _f === void 0 ? void 0 : _f.anime) === null || _g === void 0 ? void 0 : _g.count}
|
|
148
|
+
Mean Score: ${(_j = (_h = user === null || user === void 0 ? void 0 : user.statistics) === null || _h === void 0 ? void 0 : _h.anime) === null || _j === void 0 ? void 0 : _j.meanScore}
|
|
149
|
+
Minutes Watched: ${(_l = (_k = user === null || user === void 0 ? void 0 : user.statistics) === null || _k === void 0 ? void 0 : _k.anime) === null || _l === void 0 ? void 0 : _l.minutesWatched}
|
|
150
|
+
|
|
151
|
+
Statistics (Manga):
|
|
152
|
+
Count: ${(_o = (_m = user === null || user === void 0 ? void 0 : user.statistics) === null || _m === void 0 ? void 0 : _m.manga) === null || _o === void 0 ? void 0 : _o.count}
|
|
153
|
+
Chapters Read: ${(_q = (_p = user === null || user === void 0 ? void 0 : user.statistics) === null || _p === void 0 ? void 0 : _p.manga) === null || _q === void 0 ? void 0 : _q.chaptersRead}
|
|
154
|
+
Volumes Read: ${(_s = (_r = user === null || user === void 0 ? void 0 : user.statistics) === null || _r === void 0 ? void 0 : _r.manga) === null || _s === void 0 ? void 0 : _s.volumesRead}
|
|
155
155
|
`);
|
|
156
156
|
console.log(`\nRecent Activities:`);
|
|
157
157
|
if (activities.length > 0) {
|
|
@@ -344,19 +344,8 @@ Statistics (Manga):
|
|
|
344
344
|
if (yield Auth.isLoggedIn()) {
|
|
345
345
|
const userID = yield Auth.MyUserId();
|
|
346
346
|
if (userID) {
|
|
347
|
-
const
|
|
348
|
-
|
|
349
|
-
headers: {
|
|
350
|
-
"content-type": "application/json",
|
|
351
|
-
"Authorization": `Bearer ${yield Auth.RetriveAccessToken()}`,
|
|
352
|
-
},
|
|
353
|
-
body: JSON.stringify({
|
|
354
|
-
query: currentUserAnimeList,
|
|
355
|
-
variables: { id: userID },
|
|
356
|
-
}),
|
|
357
|
-
});
|
|
358
|
-
const response = yield request.json();
|
|
359
|
-
if (request.status === 200) {
|
|
347
|
+
const response = yield fetcher(currentUserAnimeList, { id: userID });
|
|
348
|
+
if (response !== null) {
|
|
360
349
|
const lists = (_b = (_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.MediaListCollection) === null || _b === void 0 ? void 0 : _b.lists;
|
|
361
350
|
if (lists.length > 0) {
|
|
362
351
|
const { selectedList } = yield inquirer.prompt([
|
|
@@ -440,19 +429,8 @@ Statistics (Manga):
|
|
|
440
429
|
if (yield Auth.isLoggedIn()) {
|
|
441
430
|
const userID = yield Auth.MyUserId();
|
|
442
431
|
if (userID) {
|
|
443
|
-
const
|
|
444
|
-
|
|
445
|
-
headers: {
|
|
446
|
-
"content-type": "application/json",
|
|
447
|
-
"Authorization": `Bearer ${yield Auth.RetriveAccessToken()}`,
|
|
448
|
-
},
|
|
449
|
-
body: JSON.stringify({
|
|
450
|
-
query: currentUserMangaList,
|
|
451
|
-
variables: { id: userID },
|
|
452
|
-
}),
|
|
453
|
-
});
|
|
454
|
-
const response = yield request.json();
|
|
455
|
-
if (request.status === 200) {
|
|
432
|
+
const response = yield fetcher(currentUserMangaList, { id: userID });
|
|
433
|
+
if (response === null || response === void 0 ? void 0 : response.data) {
|
|
456
434
|
const lists = (_b = (_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.MediaListCollection) === null || _b === void 0 ? void 0 : _b.lists;
|
|
457
435
|
if (lists.length > 0) {
|
|
458
436
|
const { selectedList } = yield inquirer.prompt([
|
|
@@ -625,5 +603,215 @@ Statistics (Manga):
|
|
|
625
603
|
}
|
|
626
604
|
});
|
|
627
605
|
}
|
|
606
|
+
static LikeFollowing() {
|
|
607
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
608
|
+
var _a, _b, _c, _d;
|
|
609
|
+
try {
|
|
610
|
+
let page = 1;
|
|
611
|
+
let hasMoreActivities = true;
|
|
612
|
+
let retryCount = 0;
|
|
613
|
+
const maxRetries = 5;
|
|
614
|
+
while (hasMoreActivities) {
|
|
615
|
+
const activities = yield fetcher(followingActivitiesQuery, {
|
|
616
|
+
page,
|
|
617
|
+
perPage: 50,
|
|
618
|
+
});
|
|
619
|
+
if (activities && ((_b = (_a = activities === null || activities === void 0 ? void 0 : activities.data) === null || _a === void 0 ? void 0 : _a.Page) === null || _b === void 0 ? void 0 : _b.activities.length) > 0) {
|
|
620
|
+
retryCount = 0; // Reset retry count on successful fetch
|
|
621
|
+
const activiti = (_d = (_c = activities === null || activities === void 0 ? void 0 : activities.data) === null || _c === void 0 ? void 0 : _c.Page) === null || _d === void 0 ? void 0 : _d.activities;
|
|
622
|
+
for (let activ of activiti) {
|
|
623
|
+
if (!activ.isLiked && activ.id) {
|
|
624
|
+
try {
|
|
625
|
+
const like = yield fetcher(likeActivityMutation, {
|
|
626
|
+
activityId: activ.id,
|
|
627
|
+
});
|
|
628
|
+
console.info(`[${activ.id}] liked ${activ.user.name}`);
|
|
629
|
+
}
|
|
630
|
+
catch (error) {
|
|
631
|
+
console.error(`Activity possibly deleted.`);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
else {
|
|
635
|
+
console.log(`[${activ === null || activ === void 0 ? void 0 : activ.id}] ${activ.user.name} already-liked`);
|
|
636
|
+
}
|
|
637
|
+
// avoiding rate-limit
|
|
638
|
+
yield new Promise((resolve) => {
|
|
639
|
+
setTimeout(resolve, 2000);
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
page++;
|
|
643
|
+
}
|
|
644
|
+
else {
|
|
645
|
+
if (retryCount < maxRetries) {
|
|
646
|
+
retryCount++;
|
|
647
|
+
console.warn(`Empty activities returned. Retrying... (${retryCount}/${maxRetries})`);
|
|
648
|
+
yield new Promise((resolve) => setTimeout(resolve, 3000));
|
|
649
|
+
}
|
|
650
|
+
else {
|
|
651
|
+
console.log(`\nProbably the end of activities after ${maxRetries} retries.`);
|
|
652
|
+
console.info(activities);
|
|
653
|
+
hasMoreActivities = false;
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
catch (error) {
|
|
659
|
+
console.error(`\nError from likeFollowing. ${error.message}`);
|
|
660
|
+
}
|
|
661
|
+
});
|
|
662
|
+
}
|
|
663
|
+
static Like(type) {
|
|
664
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
665
|
+
var _a, _b, _c, _d;
|
|
666
|
+
try {
|
|
667
|
+
let page = 1;
|
|
668
|
+
let hasMoreActivities = true;
|
|
669
|
+
let activity = type === 0
|
|
670
|
+
? followingActivitiesQuery
|
|
671
|
+
: type === 1
|
|
672
|
+
? globalActivitiesQuery
|
|
673
|
+
: followingActivitiesQuery;
|
|
674
|
+
while (hasMoreActivities) {
|
|
675
|
+
const activities = yield fetcher(activity, {
|
|
676
|
+
page,
|
|
677
|
+
perPage: 50,
|
|
678
|
+
});
|
|
679
|
+
if (activities && ((_b = (_a = activities === null || activities === void 0 ? void 0 : activities.data) === null || _a === void 0 ? void 0 : _a.Page) === null || _b === void 0 ? void 0 : _b.activities.length) > 0) {
|
|
680
|
+
const activiti = (_d = (_c = activities === null || activities === void 0 ? void 0 : activities.data) === null || _c === void 0 ? void 0 : _c.Page) === null || _d === void 0 ? void 0 : _d.activities;
|
|
681
|
+
for (let activ of activiti) {
|
|
682
|
+
if (!activ.isLiked && activ.id) {
|
|
683
|
+
try {
|
|
684
|
+
const like = yield fetcher(likeActivityMutation, {
|
|
685
|
+
activityId: activ.id,
|
|
686
|
+
});
|
|
687
|
+
// const ToggleLike = like?.data?.ToggleLike
|
|
688
|
+
console.info(`[${activ.id}] liked ${activ.user.name}`);
|
|
689
|
+
}
|
|
690
|
+
catch (error) {
|
|
691
|
+
console.error(`Activity possibly deleted.`);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
else {
|
|
695
|
+
console.log(`[${activ === null || activ === void 0 ? void 0 : activ.id}] ${activ.user.name} already-liked`);
|
|
696
|
+
}
|
|
697
|
+
// avoiding rate-limit
|
|
698
|
+
yield new Promise((resolve) => {
|
|
699
|
+
setTimeout(resolve, 2000);
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
page++;
|
|
703
|
+
}
|
|
704
|
+
else {
|
|
705
|
+
// No more activities to like
|
|
706
|
+
console.log(`\nProbably the end of activities.`);
|
|
707
|
+
console.info(activities);
|
|
708
|
+
hasMoreActivities = false;
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
catch (error) {
|
|
713
|
+
console.error(`\nError from likeFollowing. ${error.message}`);
|
|
714
|
+
}
|
|
715
|
+
});
|
|
716
|
+
}
|
|
717
|
+
static LikeSpecificUser() {
|
|
718
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
719
|
+
var _a, _b, _c, _d, _e, _f;
|
|
720
|
+
try {
|
|
721
|
+
const { username } = yield inquirer.prompt([
|
|
722
|
+
{
|
|
723
|
+
type: "input",
|
|
724
|
+
name: "username",
|
|
725
|
+
message: "Username of the user:",
|
|
726
|
+
},
|
|
727
|
+
]);
|
|
728
|
+
const userDetails = yield fetcher(userQuery, { username: username });
|
|
729
|
+
if (userDetails) {
|
|
730
|
+
let page = 1;
|
|
731
|
+
const perPage = 50;
|
|
732
|
+
const userId = (_b = (_a = userDetails === null || userDetails === void 0 ? void 0 : userDetails.data) === null || _a === void 0 ? void 0 : _a.User) === null || _b === void 0 ? void 0 : _b.id;
|
|
733
|
+
if (userId) {
|
|
734
|
+
while (true) {
|
|
735
|
+
const activities = yield fetcher(specificUserActivitiesQuery, {
|
|
736
|
+
page,
|
|
737
|
+
perPage,
|
|
738
|
+
userId,
|
|
739
|
+
});
|
|
740
|
+
const activiti = (_d = (_c = activities === null || activities === void 0 ? void 0 : activities.data) === null || _c === void 0 ? void 0 : _c.Page) === null || _d === void 0 ? void 0 : _d.activities;
|
|
741
|
+
// Break the loop if no more activities are found
|
|
742
|
+
if (!activiti || activiti.length === 0) {
|
|
743
|
+
console.log("No more activities found.");
|
|
744
|
+
break;
|
|
745
|
+
}
|
|
746
|
+
for (let activ of activiti) {
|
|
747
|
+
if (!activ.isLiked && activ.id) {
|
|
748
|
+
try {
|
|
749
|
+
const like = yield fetcher(likeActivityMutation, {
|
|
750
|
+
activityId: activ.id,
|
|
751
|
+
});
|
|
752
|
+
console.info(`[${activ.id}] liked ${(_e = activ.user) === null || _e === void 0 ? void 0 : _e.name}`);
|
|
753
|
+
}
|
|
754
|
+
catch (error) {
|
|
755
|
+
console.error(`Activity possibly deleted.`);
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
else {
|
|
759
|
+
console.log(`[${activ === null || activ === void 0 ? void 0 : activ.id}] ${(_f = activ.user) === null || _f === void 0 ? void 0 : _f.name} already liked`);
|
|
760
|
+
}
|
|
761
|
+
// Avoiding rate limit
|
|
762
|
+
yield new Promise((resolve) => {
|
|
763
|
+
setTimeout(resolve, 2000);
|
|
764
|
+
});
|
|
765
|
+
}
|
|
766
|
+
// Go to the next page
|
|
767
|
+
page += 1;
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
catch (error) {
|
|
773
|
+
console.error(`\nError from LikeSpecificUser. ${error.message}`);
|
|
774
|
+
}
|
|
775
|
+
});
|
|
776
|
+
}
|
|
777
|
+
static AutoLike() {
|
|
778
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
779
|
+
try {
|
|
780
|
+
if (!(yield Auth.isLoggedIn())) {
|
|
781
|
+
console.error(`\nPlease login to use this feature.`);
|
|
782
|
+
return;
|
|
783
|
+
}
|
|
784
|
+
const { activityType } = yield inquirer.prompt([
|
|
785
|
+
{
|
|
786
|
+
type: "list",
|
|
787
|
+
name: "activityType",
|
|
788
|
+
message: "Select activity type:",
|
|
789
|
+
choices: [
|
|
790
|
+
{ name: "Following", value: 1 },
|
|
791
|
+
{ name: "Global", value: 2 },
|
|
792
|
+
{ name: "Specific User", value: 3 },
|
|
793
|
+
],
|
|
794
|
+
pageSize: 10,
|
|
795
|
+
},
|
|
796
|
+
]);
|
|
797
|
+
switch (activityType) {
|
|
798
|
+
case 1:
|
|
799
|
+
yield this.LikeFollowing();
|
|
800
|
+
break;
|
|
801
|
+
case 2:
|
|
802
|
+
yield this.Like(1);
|
|
803
|
+
break;
|
|
804
|
+
case 3:
|
|
805
|
+
yield this.LikeSpecificUser();
|
|
806
|
+
break;
|
|
807
|
+
default:
|
|
808
|
+
console.error(`\nInvalid choice. (${activityType})`);
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
catch (error) {
|
|
812
|
+
console.error(`\nError from autolike. ${error.message}`);
|
|
813
|
+
}
|
|
814
|
+
});
|
|
815
|
+
}
|
|
628
816
|
}
|
|
629
817
|
export { Auth };
|
package/bin/helpers/fetcher.d.ts
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
* Sends a GraphQL request to the AniList API.
|
|
3
3
|
*
|
|
4
4
|
* This function constructs a request with the provided query and variables,
|
|
5
|
-
* handles authorization, and processes the API response.
|
|
5
|
+
* handles authorization, and processes the API response. If a rate-limit error (429) is returned,
|
|
6
|
+
* it waits for 1 minute and retries the request.
|
|
6
7
|
*
|
|
7
8
|
* @param {string} query - The AniList GraphQL query to be executed.
|
|
8
9
|
* @param {object} variables - An object containing the variables for the query.
|
|
9
10
|
* @returns {Promise<object|null>} The response from the API as a JSON object if successful; otherwise, null.
|
|
10
11
|
*/
|
|
11
|
-
declare function fetcher(query: string, variables: object): Promise<
|
|
12
|
+
declare function fetcher(query: string, variables: object): Promise<any>;
|
|
12
13
|
export { fetcher };
|
package/bin/helpers/fetcher.js
CHANGED
|
@@ -14,7 +14,8 @@ import { aniListEndpoint } from "./workers.js";
|
|
|
14
14
|
* Sends a GraphQL request to the AniList API.
|
|
15
15
|
*
|
|
16
16
|
* This function constructs a request with the provided query and variables,
|
|
17
|
-
* handles authorization, and processes the API response.
|
|
17
|
+
* handles authorization, and processes the API response. If a rate-limit error (429) is returned,
|
|
18
|
+
* it waits for 1 minute and retries the request.
|
|
18
19
|
*
|
|
19
20
|
* @param {string} query - The AniList GraphQL query to be executed.
|
|
20
21
|
* @param {object} variables - An object containing the variables for the query.
|
|
@@ -22,7 +23,7 @@ import { aniListEndpoint } from "./workers.js";
|
|
|
22
23
|
*/
|
|
23
24
|
function fetcher(query, variables) {
|
|
24
25
|
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
-
var _a;
|
|
26
|
+
var _a, _b;
|
|
26
27
|
try {
|
|
27
28
|
const headers = {
|
|
28
29
|
"content-type": "application/json",
|
|
@@ -39,8 +40,13 @@ function fetcher(query, variables) {
|
|
|
39
40
|
if (request.status === 200) {
|
|
40
41
|
return response;
|
|
41
42
|
}
|
|
43
|
+
else if (request.status === 429) {
|
|
44
|
+
console.warn("Rate limit reached. Retrying in 1 minute...");
|
|
45
|
+
yield new Promise((resolve) => setTimeout(resolve, 60000)); // Wait for 1 minute
|
|
46
|
+
return yield fetcher(query, variables); // Retry the request
|
|
47
|
+
}
|
|
42
48
|
else {
|
|
43
|
-
console.error(`\n${request.status} ${(_a = response === null || response === void 0 ? void 0 : response.errors[0]) === null ||
|
|
49
|
+
console.error(`\n${request.status} ${((_b = (_a = response === null || response === void 0 ? void 0 : response.errors) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.message) || "Unknown error"}.`);
|
|
44
50
|
return null;
|
|
45
51
|
}
|
|
46
52
|
}
|
package/bin/helpers/lists.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ declare class AniList {
|
|
|
5
5
|
static exportManga(): Promise<void>;
|
|
6
6
|
static MyAnime(): Promise<void>;
|
|
7
7
|
static MyManga(): Promise<void>;
|
|
8
|
-
static getTrendingAnime(count: number): Promise<
|
|
8
|
+
static getTrendingAnime(count: number): Promise<any>;
|
|
9
9
|
static getPopularAnime(count: number): Promise<void>;
|
|
10
10
|
static getUpcomingAnime(count: number): Promise<void>;
|
|
11
11
|
static getUserByUsername(username: string): Promise<void>;
|
package/bin/helpers/lists.js
CHANGED
|
@@ -45,7 +45,7 @@ class AniList {
|
|
|
45
45
|
if (save) {
|
|
46
46
|
const id = (_b = (_a = save === null || save === void 0 ? void 0 : save.data) === null || _a === void 0 ? void 0 : _a.SaveMediaListEntry) === null || _b === void 0 ? void 0 : _b.id;
|
|
47
47
|
count++;
|
|
48
|
-
console.log(`[${count}]
|
|
48
|
+
console.log(`[${count}]\t${id}\t${anime === null || anime === void 0 ? void 0 : anime.id} ✅`);
|
|
49
49
|
}
|
|
50
50
|
else {
|
|
51
51
|
console.error(`\nError saving ${anime === null || anime === void 0 ? void 0 : anime.id}`);
|
|
@@ -93,7 +93,7 @@ class AniList {
|
|
|
93
93
|
if (save) {
|
|
94
94
|
const id = (_b = (_a = save === null || save === void 0 ? void 0 : save.data) === null || _a === void 0 ? void 0 : _a.SaveMediaListEntry) === null || _b === void 0 ? void 0 : _b.id;
|
|
95
95
|
count++;
|
|
96
|
-
console.log(`[${count}]
|
|
96
|
+
console.log(`[${count}]\t${id}\t${manga === null || manga === void 0 ? void 0 : manga.id} ✅`);
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
catch (err) {
|
|
@@ -4,4 +4,5 @@ declare const deleteActivityMutation = "\nmutation($id: Int!) {\n DeleteActivit
|
|
|
4
4
|
declare const saveTextActivityMutation = "\nmutation SaveTextActivity($status: String!) {\n SaveTextActivity(text: $status) { id text userId createdAt }\n}\n";
|
|
5
5
|
declare const saveAnimeWithProgressMutation = "\nmutation ($mediaId: Int, $progress: Int, $status: MediaListStatus, $hiddenFromStatusLists: Boolean) {\n SaveMediaListEntry(mediaId: $mediaId, progress: $progress, status: $status, hiddenFromStatusLists: $hiddenFromStatusLists) {\n id progress hiddenFromStatusLists\n }\n}\n";
|
|
6
6
|
declare const saveMangaWithProgressMutation = "\nmutation ($mediaId: Int, $progress: Int, $status: MediaListStatus, $hiddenFromStatusLists: Boolean, $private: Boolean) {\n SaveMediaListEntry( mediaId: $mediaId, progress: $progress, status: $status, hiddenFromStatusLists: $hiddenFromStatusLists, private: $private\n ) { id progress hiddenFromStatusLists private }\n}\n";
|
|
7
|
-
|
|
7
|
+
declare const likeActivityMutation = "\nmutation($activityId: Int!) {\n ToggleLike(id: $activityId, type: ACTIVITY) { id }\n}\n";
|
|
8
|
+
export { addAnimeToListMutation, addMangaToListMutation, deleteActivityMutation, likeActivityMutation, saveAnimeWithProgressMutation, saveMangaWithProgressMutation, saveTextActivityMutation, };
|
package/bin/helpers/mutations.js
CHANGED
|
@@ -1,38 +1,43 @@
|
|
|
1
|
-
const addAnimeToListMutation = `
|
|
2
|
-
mutation($mediaId: Int, $status: MediaListStatus) {
|
|
3
|
-
SaveMediaListEntry(mediaId: $mediaId, status: $status) { id status }
|
|
4
|
-
}
|
|
1
|
+
const addAnimeToListMutation = `
|
|
2
|
+
mutation($mediaId: Int, $status: MediaListStatus) {
|
|
3
|
+
SaveMediaListEntry(mediaId: $mediaId, status: $status) { id status }
|
|
4
|
+
}
|
|
5
5
|
`;
|
|
6
|
-
const addMangaToListMutation = `
|
|
7
|
-
mutation($mediaId: Int, $status: MediaListStatus) {
|
|
8
|
-
SaveMediaListEntry(mediaId: $mediaId, status: $status) {
|
|
9
|
-
id
|
|
10
|
-
status
|
|
11
|
-
media { id title { romaji english } }
|
|
12
|
-
}
|
|
13
|
-
}
|
|
6
|
+
const addMangaToListMutation = `
|
|
7
|
+
mutation($mediaId: Int, $status: MediaListStatus) {
|
|
8
|
+
SaveMediaListEntry(mediaId: $mediaId, status: $status) {
|
|
9
|
+
id
|
|
10
|
+
status
|
|
11
|
+
media { id title { romaji english } }
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
14
|
`;
|
|
15
|
-
const deleteActivityMutation = `
|
|
16
|
-
mutation($id: Int!) {
|
|
17
|
-
DeleteActivity(id: $id) { deleted }
|
|
18
|
-
}
|
|
15
|
+
const deleteActivityMutation = `
|
|
16
|
+
mutation($id: Int!) {
|
|
17
|
+
DeleteActivity(id: $id) { deleted }
|
|
18
|
+
}
|
|
19
19
|
`;
|
|
20
|
-
const saveTextActivityMutation = `
|
|
21
|
-
mutation SaveTextActivity($status: String!) {
|
|
22
|
-
SaveTextActivity(text: $status) { id text userId createdAt }
|
|
23
|
-
}
|
|
20
|
+
const saveTextActivityMutation = `
|
|
21
|
+
mutation SaveTextActivity($status: String!) {
|
|
22
|
+
SaveTextActivity(text: $status) { id text userId createdAt }
|
|
23
|
+
}
|
|
24
24
|
`;
|
|
25
|
-
const saveAnimeWithProgressMutation = `
|
|
26
|
-
mutation ($mediaId: Int, $progress: Int, $status: MediaListStatus, $hiddenFromStatusLists: Boolean) {
|
|
27
|
-
SaveMediaListEntry(mediaId: $mediaId, progress: $progress, status: $status, hiddenFromStatusLists: $hiddenFromStatusLists) {
|
|
28
|
-
id progress hiddenFromStatusLists
|
|
29
|
-
}
|
|
30
|
-
}
|
|
25
|
+
const saveAnimeWithProgressMutation = `
|
|
26
|
+
mutation ($mediaId: Int, $progress: Int, $status: MediaListStatus, $hiddenFromStatusLists: Boolean) {
|
|
27
|
+
SaveMediaListEntry(mediaId: $mediaId, progress: $progress, status: $status, hiddenFromStatusLists: $hiddenFromStatusLists) {
|
|
28
|
+
id progress hiddenFromStatusLists
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
31
|
`;
|
|
32
|
-
const saveMangaWithProgressMutation = `
|
|
33
|
-
mutation ($mediaId: Int, $progress: Int, $status: MediaListStatus, $hiddenFromStatusLists: Boolean, $private: Boolean) {
|
|
34
|
-
SaveMediaListEntry( mediaId: $mediaId, progress: $progress, status: $status, hiddenFromStatusLists: $hiddenFromStatusLists, private: $private
|
|
35
|
-
) { id progress hiddenFromStatusLists private }
|
|
36
|
-
}
|
|
32
|
+
const saveMangaWithProgressMutation = `
|
|
33
|
+
mutation ($mediaId: Int, $progress: Int, $status: MediaListStatus, $hiddenFromStatusLists: Boolean, $private: Boolean) {
|
|
34
|
+
SaveMediaListEntry( mediaId: $mediaId, progress: $progress, status: $status, hiddenFromStatusLists: $hiddenFromStatusLists, private: $private
|
|
35
|
+
) { id progress hiddenFromStatusLists private }
|
|
36
|
+
}
|
|
37
37
|
`;
|
|
38
|
-
|
|
38
|
+
const likeActivityMutation = `
|
|
39
|
+
mutation($activityId: Int!) {
|
|
40
|
+
ToggleLike(id: $activityId, type: ACTIVITY) { id }
|
|
41
|
+
}
|
|
42
|
+
`;
|
|
43
|
+
export { addAnimeToListMutation, addMangaToListMutation, deleteActivityMutation, likeActivityMutation, saveAnimeWithProgressMutation, saveMangaWithProgressMutation, saveTextActivityMutation, };
|
package/bin/helpers/queries.d.ts
CHANGED
|
@@ -17,6 +17,9 @@ declare const activityMangaListQuery = "query ($userId: Int, $page: Int, $perPag
|
|
|
17
17
|
declare const activityMessageQuery = "query ($userId: Int, $page: Int, $perPage: Int) {\n Page(page: $page, perPage: $perPage) {\n activities(userId: $userId, type: MESSAGE, sort: ID_DESC) {\n ... on MessageActivity { id type message recipient { id name } createdAt }\n }\n }\n}";
|
|
18
18
|
declare const activityAllQuery = "query ($userId: Int, $page: Int, $perPage: Int) {\n Page(page: $page, perPage: $perPage) {\n activities(userId: $userId, sort: ID_DESC) {\n ... on TextActivity { id type text createdAt user { id name } }\n ... on ListActivity { id type status progress createdAt media { id title { romaji english native } } }\n ... on MessageActivity { id type message recipient { id name } createdAt }\n }\n }\n}";
|
|
19
19
|
declare const activityMediaList = "query ($userId: Int, $page: Int, $perPage: Int, $type: ActivityType) {\n Page(page: $page, perPage: $perPage) {\n pageInfo { total currentPage lastPage hasNextPage perPage }\n activities(userId: $userId, type: $type, sort: ID_DESC) {\n ... on ListActivity { id type status progress media { id title { romaji english native } format } createdAt }\n }\n }\n}";
|
|
20
|
-
declare const malIdToAnilistAnimeId = "query ($malId: Int) {\n Media(idMal: $malId, type: ANIME) {
|
|
21
|
-
declare const malIdToAnilistMangaId = "query ($malId: Int) {\n Media(idMal: $malId, type: MANGA) {
|
|
22
|
-
|
|
20
|
+
declare const malIdToAnilistAnimeId = "query ($malId: Int) {\n Media(idMal: $malId, type: ANIME) { id title { romaji english } } }\n";
|
|
21
|
+
declare const malIdToAnilistMangaId = "query ($malId: Int) {\n Media(idMal: $malId, type: MANGA) { id title { romaji english } } }\n";
|
|
22
|
+
declare const followingActivitiesQuery = "\nquery ($page: Int, $perPage: Int) {\n Page(page: $page, perPage: $perPage) {\n activities(isFollowing: true, sort: ID_DESC) {\n ... on TextActivity { id type isLiked createdAt user { id name } }\n ... on ListActivity { id type isLiked status progress media { title { userPreferred } } createdAt user { id name } }\n ... on MessageActivity { id type isLiked message createdAt recipient { id name } }\n }\n }\n}\n";
|
|
23
|
+
declare const globalActivitiesQuery = "\nquery ($page: Int, $perPage: Int) {\n Page(page: $page, perPage: $perPage) {\n activities(sort: ID_DESC) {\n ... on TextActivity { id type isLiked createdAt user { id name } }\n ... on ListActivity { id type isLiked status progress media { title { userPreferred } } createdAt user { id name } }\n ... on MessageActivity { id type isLiked message createdAt recipient { id name } }\n }\n }\n}\n";
|
|
24
|
+
declare const specificUserActivitiesQuery = "\nquery ($page: Int, $perPage: Int, $userId: Int) {\n Page(page: $page, perPage: $perPage) {\n activities(userId: $userId, sort: ID_DESC) {\n ... on TextActivity { id type isLiked createdAt user { id name } }\n ... on ListActivity { id type isLiked status progress media { title { userPreferred } } createdAt user { id name } }\n ... on MessageActivity { id type isLiked message createdAt recipient { id name } }\n }\n }\n}\n";
|
|
25
|
+
export { activityAllQuery, activityAnimeListQuery, activityMangaListQuery, activityMediaList, activityMessageQuery, activityTextQuery, animeDetailsQuery, animeSearchQuery, currentUserAnimeList, currentUserMangaList, currentUserQuery, deleteMangaEntryMutation, deleteMediaEntryMutation, followingActivitiesQuery, globalActivitiesQuery, malIdToAnilistAnimeId, malIdToAnilistMangaId, mangaSearchQuery, popularQuery, specificUserActivitiesQuery, trendingQuery, upcomingAnimesQuery, userActivityQuery, userQuery, };
|