@irfanshadikrishad/anilist 1.3.3-forbidden.1 → 1.4.0-forbidden.6
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 +373 -0
- package/LICENSE.md +382 -382
- package/README.md +266 -243
- package/bin/helpers/auth.d.ts +15 -4
- package/bin/helpers/auth.js +466 -248
- package/bin/helpers/lists.d.ts +1 -0
- package/bin/helpers/lists.js +175 -127
- package/bin/helpers/mutations.js +35 -35
- package/bin/helpers/queries.d.ts +8 -6
- package/bin/helpers/queries.js +179 -166
- package/bin/helpers/truncate.d.ts +6 -0
- package/bin/helpers/truncate.js +10 -0
- package/bin/helpers/types.d.ts +171 -68
- package/bin/helpers/validation.d.ts +29 -0
- package/bin/helpers/validation.js +117 -0
- package/bin/helpers/workers.d.ts +16 -7
- package/bin/helpers/workers.js +152 -99
- package/bin/index.js +32 -1
- package/package.json +86 -81
package/bin/helpers/workers.js
CHANGED
|
@@ -7,13 +7,24 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
11
|
+
var t = {};
|
|
12
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
13
|
+
t[p] = s[p];
|
|
14
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
15
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
16
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
17
|
+
t[p[i]] = s[p[i]];
|
|
18
|
+
}
|
|
19
|
+
return t;
|
|
20
|
+
};
|
|
10
21
|
import fs from "fs";
|
|
11
22
|
import { readdir, writeFile } from "fs/promises";
|
|
12
23
|
import inquirer from "inquirer";
|
|
13
|
-
import { parse } from "json2csv";
|
|
14
24
|
import { createRequire } from "module";
|
|
15
25
|
import open from "open";
|
|
16
26
|
import { homedir } from "os";
|
|
27
|
+
import Papa from "papaparse";
|
|
17
28
|
import { join } from "path";
|
|
18
29
|
import process from "process";
|
|
19
30
|
import { Auth } from "./auth.js";
|
|
@@ -97,13 +108,13 @@ function getFormattedDate() {
|
|
|
97
108
|
/**
|
|
98
109
|
* Export JSON as JSON
|
|
99
110
|
* @param js0n
|
|
100
|
-
* @param dataType (eg: anime
|
|
111
|
+
* @param dataType (eg: anime|manga)
|
|
101
112
|
*/
|
|
102
113
|
function saveJSONasJSON(js0n, dataType) {
|
|
103
114
|
return __awaiter(this, void 0, void 0, function* () {
|
|
104
115
|
try {
|
|
105
116
|
const jsonData = JSON.stringify(js0n, null, 2);
|
|
106
|
-
const path =
|
|
117
|
+
const path = yield saveToPath(dataType, ".json");
|
|
107
118
|
yield writeFile(path, jsonData, "utf8");
|
|
108
119
|
console.log(`\nSaved as JSON successfully.`);
|
|
109
120
|
open(getDownloadFolderPath());
|
|
@@ -116,13 +127,17 @@ function saveJSONasJSON(js0n, dataType) {
|
|
|
116
127
|
/**
|
|
117
128
|
* Export JSON as CSV
|
|
118
129
|
* @param js0n
|
|
119
|
-
* @param dataType (eg: anime
|
|
130
|
+
* @param dataType (eg: anime|manga)
|
|
120
131
|
*/
|
|
121
132
|
function saveJSONasCSV(js0n, dataType) {
|
|
122
133
|
return __awaiter(this, void 0, void 0, function* () {
|
|
123
134
|
try {
|
|
124
|
-
const
|
|
125
|
-
|
|
135
|
+
const js0n_WTAS = js0n.map((_a) => {
|
|
136
|
+
var { title } = _a, rest = __rest(_a, ["title"]);
|
|
137
|
+
return (Object.assign(Object.assign({}, rest), { title: getTitle(title) }));
|
|
138
|
+
});
|
|
139
|
+
const csvData = Papa.unparse(js0n_WTAS);
|
|
140
|
+
const path = yield saveToPath(dataType, ".csv");
|
|
126
141
|
yield writeFile(path, csvData, "utf8");
|
|
127
142
|
console.log(`\nSaved as CSV successfully.`);
|
|
128
143
|
open(getDownloadFolderPath());
|
|
@@ -132,6 +147,20 @@ function saveJSONasCSV(js0n, dataType) {
|
|
|
132
147
|
}
|
|
133
148
|
});
|
|
134
149
|
}
|
|
150
|
+
function saveJSONasXML(js0n, data_type) {
|
|
151
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
152
|
+
try {
|
|
153
|
+
const xmlContent = data_type === 0 ? createAnimeListXML(js0n) : createMangaListXML(js0n);
|
|
154
|
+
const path = yield saveToPath(data_type === 0 ? "anime" : "manga", ".xml");
|
|
155
|
+
yield writeFile(path, yield xmlContent, "utf8");
|
|
156
|
+
console.log(`\nGenerated XML for MyAnimeList.`);
|
|
157
|
+
open(getDownloadFolderPath());
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
console.error(`Error saving XML data:`, error);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
135
164
|
function listFilesInDownloadFolder() {
|
|
136
165
|
return __awaiter(this, void 0, void 0, function* () {
|
|
137
166
|
const downloadFolderPath = getDownloadFolderPath();
|
|
@@ -162,59 +191,60 @@ function selectFile(fileType) {
|
|
|
162
191
|
return answers.fileName;
|
|
163
192
|
}
|
|
164
193
|
else {
|
|
165
|
-
|
|
194
|
+
console.error(`\nNo importable ${fileType} file(s) found in download folder.`);
|
|
195
|
+
return null;
|
|
166
196
|
}
|
|
167
197
|
}
|
|
168
198
|
catch (error) {
|
|
169
199
|
console.error("\nError selecting file:", error);
|
|
170
|
-
|
|
200
|
+
return null;
|
|
171
201
|
}
|
|
172
202
|
});
|
|
173
203
|
}
|
|
174
|
-
function createAnimeXML(malId, progress, status, episodes, title) {
|
|
175
|
-
return `
|
|
176
|
-
<anime>
|
|
177
|
-
<series_animedb_id>${malId}</series_animedb_id>
|
|
178
|
-
<series_title><![CDATA[${title}]]></series_title>
|
|
179
|
-
<series_type
|
|
180
|
-
<series_episodes>${episodes}</series_episodes>
|
|
181
|
-
<my_id>0</my_id>
|
|
182
|
-
<my_watched_episodes>${progress}</my_watched_episodes>
|
|
183
|
-
<my_start_date>0000-00-00</my_start_date>
|
|
184
|
-
<my_finish_date>0000-00-00</my_finish_date>
|
|
185
|
-
<my_score>0</my_score>
|
|
186
|
-
<my_storage_value>0.00</my_storage_value>
|
|
187
|
-
<my_status>${status}</my_status>
|
|
188
|
-
<my_comments><![CDATA[]]></my_comments>
|
|
189
|
-
<my_times_watched>0</my_times_watched>
|
|
190
|
-
<my_rewatch_value></my_rewatch_value>
|
|
191
|
-
<my_priority>LOW</my_priority>
|
|
192
|
-
<my_tags><![CDATA[]]></my_tags>
|
|
193
|
-
<my_rewatching>0</my_rewatching>
|
|
194
|
-
<my_rewatching_ep>0</my_rewatching_ep>
|
|
195
|
-
<my_discuss>0</my_discuss>
|
|
196
|
-
<my_sns>default</my_sns>
|
|
197
|
-
<update_on_import>1</update_on_import>
|
|
204
|
+
function createAnimeXML(malId, progress, status, episodes, title, format) {
|
|
205
|
+
return `
|
|
206
|
+
<anime>
|
|
207
|
+
<series_animedb_id>${malId}</series_animedb_id>
|
|
208
|
+
<series_title><![CDATA[${title}]]></series_title>
|
|
209
|
+
<series_type>${format}</series_type>
|
|
210
|
+
<series_episodes>${episodes}</series_episodes>
|
|
211
|
+
<my_id>0</my_id>
|
|
212
|
+
<my_watched_episodes>${progress}</my_watched_episodes>
|
|
213
|
+
<my_start_date>0000-00-00</my_start_date>
|
|
214
|
+
<my_finish_date>0000-00-00</my_finish_date>
|
|
215
|
+
<my_score>0</my_score>
|
|
216
|
+
<my_storage_value>0.00</my_storage_value>
|
|
217
|
+
<my_status>${status}</my_status>
|
|
218
|
+
<my_comments><![CDATA[]]></my_comments>
|
|
219
|
+
<my_times_watched>0</my_times_watched>
|
|
220
|
+
<my_rewatch_value></my_rewatch_value>
|
|
221
|
+
<my_priority>LOW</my_priority>
|
|
222
|
+
<my_tags><![CDATA[]]></my_tags>
|
|
223
|
+
<my_rewatching>0</my_rewatching>
|
|
224
|
+
<my_rewatching_ep>0</my_rewatching_ep>
|
|
225
|
+
<my_discuss>0</my_discuss>
|
|
226
|
+
<my_sns>default</my_sns>
|
|
227
|
+
<update_on_import>1</update_on_import>
|
|
198
228
|
</anime>`;
|
|
199
229
|
}
|
|
200
230
|
function createMangaXML(malId, progress, status, chapters, title) {
|
|
201
|
-
return `
|
|
202
|
-
<manga>
|
|
203
|
-
<manga_mangadb_id>${malId}</manga_mangadb_id>
|
|
204
|
-
<manga_title><![CDATA[${title ? title : "unknown"}]]></manga_title>
|
|
205
|
-
<manga_volumes>0</manga_volumes>
|
|
206
|
-
<manga_chapters>${chapters ? chapters : 0}</manga_chapters>
|
|
207
|
-
<my_id>0</my_id>
|
|
208
|
-
<my_read_chapters>${progress}</my_read_chapters>
|
|
209
|
-
<my_start_date>0000-00-00</my_start_date>
|
|
210
|
-
<my_finish_date>0000-00-00</my_finish_date>
|
|
211
|
-
<my_score>0</my_score>
|
|
212
|
-
<my_status>${status}</my_status>
|
|
213
|
-
<my_reread_value></my_reread_value>
|
|
214
|
-
<my_priority>LOW</my_priority>
|
|
215
|
-
<my_rereading>0</my_rereading>
|
|
216
|
-
<my_discuss>0</my_discuss>
|
|
217
|
-
<update_on_import>1</update_on_import>
|
|
231
|
+
return `
|
|
232
|
+
<manga>
|
|
233
|
+
<manga_mangadb_id>${malId}</manga_mangadb_id>
|
|
234
|
+
<manga_title><![CDATA[${title ? title : "unknown"}]]></manga_title>
|
|
235
|
+
<manga_volumes>0</manga_volumes>
|
|
236
|
+
<manga_chapters>${chapters ? chapters : 0}</manga_chapters>
|
|
237
|
+
<my_id>0</my_id>
|
|
238
|
+
<my_read_chapters>${progress}</my_read_chapters>
|
|
239
|
+
<my_start_date>0000-00-00</my_start_date>
|
|
240
|
+
<my_finish_date>0000-00-00</my_finish_date>
|
|
241
|
+
<my_score>0</my_score>
|
|
242
|
+
<my_status>${status}</my_status>
|
|
243
|
+
<my_reread_value></my_reread_value>
|
|
244
|
+
<my_priority>LOW</my_priority>
|
|
245
|
+
<my_rereading>0</my_rereading>
|
|
246
|
+
<my_discuss>0</my_discuss>
|
|
247
|
+
<update_on_import>1</update_on_import>
|
|
218
248
|
</manga>`;
|
|
219
249
|
}
|
|
220
250
|
function createAnimeListXML(mediaWithProgress) {
|
|
@@ -226,27 +256,30 @@ function createAnimeListXML(mediaWithProgress) {
|
|
|
226
256
|
PAUSED: MALAnimeStatus.ON_HOLD,
|
|
227
257
|
DROPPED: MALAnimeStatus.DROPPED,
|
|
228
258
|
};
|
|
229
|
-
|
|
259
|
+
// Filter out anime without malId
|
|
260
|
+
const filteredMedia = mediaWithProgress.filter((anime) => anime.malId);
|
|
261
|
+
const xmlEntries = filteredMedia.map((anime) => {
|
|
230
262
|
const malId = anime.malId;
|
|
231
263
|
const progress = anime.progress;
|
|
232
264
|
const episodes = anime.episodes;
|
|
233
265
|
const title = getTitle(anime.title);
|
|
234
266
|
const status = statusMap[anime.status];
|
|
235
|
-
|
|
267
|
+
const format = anime.format ? anime.format : "";
|
|
268
|
+
return createAnimeXML(malId, progress, status, episodes, title, format);
|
|
236
269
|
});
|
|
237
|
-
return `<myanimelist>
|
|
238
|
-
<myinfo>
|
|
239
|
-
<user_id/>
|
|
240
|
-
<user_name>${yield Auth.MyUserName()}</user_name>
|
|
241
|
-
<user_export_type>1</user_export_type>
|
|
242
|
-
<user_total_anime>0</user_total_anime>
|
|
243
|
-
<user_total_watching>0</user_total_watching>
|
|
244
|
-
<user_total_completed>0</user_total_completed>
|
|
245
|
-
<user_total_onhold>0</user_total_onhold>
|
|
246
|
-
<user_total_dropped>0</user_total_dropped>
|
|
247
|
-
<user_total_plantowatch>0</user_total_plantowatch>
|
|
248
|
-
</myinfo>
|
|
249
|
-
\n${xmlEntries.join("\n")}\n
|
|
270
|
+
return `<myanimelist>
|
|
271
|
+
<myinfo>
|
|
272
|
+
<user_id/>
|
|
273
|
+
<user_name>${yield Auth.MyUserName()}</user_name>
|
|
274
|
+
<user_export_type>1</user_export_type>
|
|
275
|
+
<user_total_anime>0</user_total_anime>
|
|
276
|
+
<user_total_watching>0</user_total_watching>
|
|
277
|
+
<user_total_completed>0</user_total_completed>
|
|
278
|
+
<user_total_onhold>0</user_total_onhold>
|
|
279
|
+
<user_total_dropped>0</user_total_dropped>
|
|
280
|
+
<user_total_plantowatch>0</user_total_plantowatch>
|
|
281
|
+
</myinfo>
|
|
282
|
+
\n${xmlEntries.join("\n")}\n
|
|
250
283
|
</myanimelist>`;
|
|
251
284
|
});
|
|
252
285
|
}
|
|
@@ -259,7 +292,9 @@ function createMangaListXML(mediaWithProgress) {
|
|
|
259
292
|
PAUSED: MALMangaStatus.ON_HOLD,
|
|
260
293
|
DROPPED: MALMangaStatus.DROPPED,
|
|
261
294
|
};
|
|
262
|
-
|
|
295
|
+
// Filter out manga without malId
|
|
296
|
+
const filteredMedia = mediaWithProgress.filter((manga) => manga.malId);
|
|
297
|
+
const xmlEntries = filteredMedia.map((manga) => {
|
|
263
298
|
const malId = manga.malId;
|
|
264
299
|
const progress = manga.progress;
|
|
265
300
|
const chapters = manga.chapters;
|
|
@@ -267,19 +302,19 @@ function createMangaListXML(mediaWithProgress) {
|
|
|
267
302
|
const status = statusMap[manga.status];
|
|
268
303
|
return createMangaXML(malId, progress, status, chapters, title);
|
|
269
304
|
});
|
|
270
|
-
return `<myanimelist>
|
|
271
|
-
<myinfo>
|
|
272
|
-
<user_id/>
|
|
273
|
-
<user_name>${yield Auth.MyUserName()}</user_name>
|
|
274
|
-
<user_export_type>2</user_export_type>
|
|
275
|
-
<user_total_manga>5</user_total_manga>
|
|
276
|
-
<user_total_reading>1</user_total_reading>
|
|
277
|
-
<user_total_completed>1</user_total_completed>
|
|
278
|
-
<user_total_onhold>1</user_total_onhold>
|
|
279
|
-
<user_total_dropped>1</user_total_dropped>
|
|
280
|
-
<user_total_plantoread>1</user_total_plantoread>
|
|
281
|
-
</myinfo>
|
|
282
|
-
\n${xmlEntries.join("\n")}\n
|
|
305
|
+
return `<myanimelist>
|
|
306
|
+
<myinfo>
|
|
307
|
+
<user_id/>
|
|
308
|
+
<user_name>${yield Auth.MyUserName()}</user_name>
|
|
309
|
+
<user_export_type>2</user_export_type>
|
|
310
|
+
<user_total_manga>5</user_total_manga>
|
|
311
|
+
<user_total_reading>1</user_total_reading>
|
|
312
|
+
<user_total_completed>1</user_total_completed>
|
|
313
|
+
<user_total_onhold>1</user_total_onhold>
|
|
314
|
+
<user_total_dropped>1</user_total_dropped>
|
|
315
|
+
<user_total_plantoread>1</user_total_plantoread>
|
|
316
|
+
</myinfo>
|
|
317
|
+
\n${xmlEntries.join("\n")}\n
|
|
283
318
|
</myanimelist>`;
|
|
284
319
|
});
|
|
285
320
|
}
|
|
@@ -316,26 +351,6 @@ function timestampToTimeAgo(timestamp) {
|
|
|
316
351
|
return `${years} year${years === 1 ? "" : "s"} ago`;
|
|
317
352
|
}
|
|
318
353
|
}
|
|
319
|
-
function activityBy(activity) {
|
|
320
|
-
var _a, _b, _c, _d;
|
|
321
|
-
if ((_a = activity === null || activity === void 0 ? void 0 : activity.messenger) === null || _a === void 0 ? void 0 : _a.name) {
|
|
322
|
-
return `[${activity.id}]\t${activity.messenger.name} messaged ${activity.recipient.name}`;
|
|
323
|
-
}
|
|
324
|
-
else if ((_c = (_b = activity === null || activity === void 0 ? void 0 : activity.media) === null || _b === void 0 ? void 0 : _b.title) === null || _c === void 0 ? void 0 : _c.userPreferred) {
|
|
325
|
-
if (activity.progress) {
|
|
326
|
-
return `[${activity.id}]\t${activity.user.name} ${activity.status} ${activity.progress} of ${activity.media.title.userPreferred}`;
|
|
327
|
-
}
|
|
328
|
-
else {
|
|
329
|
-
return `[${activity.id}]\t${activity.user.name} ${activity.status} ${activity.media.title.userPreferred}`;
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
else if ((_d = activity === null || activity === void 0 ? void 0 : activity.user) === null || _d === void 0 ? void 0 : _d.name) {
|
|
333
|
-
return `[${activity.id}]\t${activity.user.name}`;
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
return `[${activity === null || activity === void 0 ? void 0 : activity.id}] ???`;
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
354
|
const anidbToanilistMapper = (romanjiName, year, englishName) => __awaiter(void 0, void 0, void 0, function* () {
|
|
340
355
|
const fetchAnime = (search) => __awaiter(void 0, void 0, void 0, function* () {
|
|
341
356
|
var _a;
|
|
@@ -365,4 +380,42 @@ const anidbToanilistMapper = (romanjiName, year, englishName) => __awaiter(void
|
|
|
365
380
|
}
|
|
366
381
|
return null;
|
|
367
382
|
});
|
|
368
|
-
|
|
383
|
+
function activityBy(activity, count) {
|
|
384
|
+
var _a, _b, _c, _d;
|
|
385
|
+
const countStr = `[${count ? count : "?"}]`.padEnd(6);
|
|
386
|
+
if ((_a = activity === null || activity === void 0 ? void 0 : activity.messenger) === null || _a === void 0 ? void 0 : _a.name) {
|
|
387
|
+
return `${countStr}${activity.messenger.name} >> messaged ${activity.recipient.name}`;
|
|
388
|
+
}
|
|
389
|
+
else if ((_c = (_b = activity === null || activity === void 0 ? void 0 : activity.media) === null || _b === void 0 ? void 0 : _b.title) === null || _c === void 0 ? void 0 : _c.userPreferred) {
|
|
390
|
+
if (activity.progress) {
|
|
391
|
+
return `${countStr}${activity.user.name} >> ${activity.status} ${activity.progress} of ${activity.media.title.userPreferred}`;
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
return `${countStr}${activity.user.name} >> ${activity.status} ${activity.media.title.userPreferred}`;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
else if ((_d = activity === null || activity === void 0 ? void 0 : activity.user) === null || _d === void 0 ? void 0 : _d.name) {
|
|
398
|
+
return `${countStr}${activity.user.name}`;
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
return `${countStr}???`;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Extract the save file path
|
|
406
|
+
* @param data_type - anime|manga
|
|
407
|
+
* @param file_format - save format (eg: .json|.csv)
|
|
408
|
+
* @returns string of file path
|
|
409
|
+
*/
|
|
410
|
+
function saveToPath(data_type, file_format) {
|
|
411
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
412
|
+
return join(getDownloadFolderPath(), `${yield Auth.MyUserName()}@irfanshadikrishad-anilist-${data_type}-${getFormattedDate()}.${file_format}`);
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
function simpleDateFormat(date) {
|
|
416
|
+
if (!date.day && !date.month && !date.year) {
|
|
417
|
+
return `null`;
|
|
418
|
+
}
|
|
419
|
+
return `${date === null || date === void 0 ? void 0 : date.day}/${date === null || date === void 0 ? void 0 : date.month}/${date === null || date === void 0 ? void 0 : date.year}`;
|
|
420
|
+
}
|
|
421
|
+
export { activityBy, anidbToanilistMapper, aniListEndpoint, createAnimeListXML, createAnimeXML, createMangaListXML, createMangaXML, formatDateObject, getCurrentPackageVersion, getDownloadFolderPath, getFormattedDate, getNextSeasonAndYear, getTitle, redirectUri, removeHtmlAndMarkdown, saveJSONasCSV, saveJSONasJSON, saveJSONasXML, saveToPath, selectFile, simpleDateFormat, timestampToTimeAgo, };
|
package/bin/index.js
CHANGED
|
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
import { Command } from "commander";
|
|
12
12
|
import process from "process";
|
|
13
|
-
import { Auth } from "./helpers/auth.js";
|
|
13
|
+
import { Auth, Social } from "./helpers/auth.js";
|
|
14
14
|
import { AniList } from "./helpers/lists.js";
|
|
15
15
|
import { getCurrentPackageVersion } from "./helpers/workers.js";
|
|
16
16
|
const cli = new Command();
|
|
@@ -128,6 +128,13 @@ cli
|
|
|
128
128
|
console.error(`\nInvalid or missing ID (${id}). Please provide a valid numeric ID.`);
|
|
129
129
|
}
|
|
130
130
|
}));
|
|
131
|
+
cli
|
|
132
|
+
.command("manga <id>")
|
|
133
|
+
.description("Get manga details by their ID")
|
|
134
|
+
.option("-c, --count <number>", "Number of items to get", "10")
|
|
135
|
+
.action((id) => __awaiter(void 0, void 0, void 0, function* () {
|
|
136
|
+
yield AniList.getMangaDetailsByID(id);
|
|
137
|
+
}));
|
|
131
138
|
cli
|
|
132
139
|
.command("search <query>")
|
|
133
140
|
.alias("srch")
|
|
@@ -210,4 +217,28 @@ cli
|
|
|
210
217
|
.action(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
211
218
|
yield Auth.AutoLike();
|
|
212
219
|
}));
|
|
220
|
+
cli
|
|
221
|
+
.command("social")
|
|
222
|
+
.alias("sol")
|
|
223
|
+
.description("Automate your process")
|
|
224
|
+
.option("-f, --follow", "Follow the user whos following you.", false)
|
|
225
|
+
.option("-u, --unfollow", "Unfollow the user whos not following you.", false)
|
|
226
|
+
.action((_a) => __awaiter(void 0, [_a], void 0, function* ({ follow, unfollow }) {
|
|
227
|
+
if (!follow && !unfollow) {
|
|
228
|
+
console.error(`\nMust select an option, either --follow or --unfollow`);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
if (yield Auth.isLoggedIn()) {
|
|
232
|
+
if (follow) {
|
|
233
|
+
yield Social.follow();
|
|
234
|
+
}
|
|
235
|
+
else if (unfollow) {
|
|
236
|
+
yield Social.unfollow();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
console.error(`\nPlease login to use this feature.`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}));
|
|
213
244
|
cli.parse(process.argv);
|
package/package.json
CHANGED
|
@@ -1,81 +1,86 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@irfanshadikrishad/anilist",
|
|
3
|
-
"description": "Minimalist unofficial AniList CLI for Anime and Manga Enthusiasts",
|
|
4
|
-
"author": "Irfan Shadik Rishad",
|
|
5
|
-
"version": "1.
|
|
6
|
-
"main": "./bin/index.js",
|
|
7
|
-
"type": "module",
|
|
8
|
-
"types": "./bin/index.d.ts",
|
|
9
|
-
"bin": {
|
|
10
|
-
"anilist": "./bin/index.js"
|
|
11
|
-
},
|
|
12
|
-
"publishConfig": {
|
|
13
|
-
"access": "public"
|
|
14
|
-
},
|
|
15
|
-
"scripts": {
|
|
16
|
-
"build": "rm -rf ./bin && tsc",
|
|
17
|
-
"
|
|
18
|
-
"format": "prettier . --write",
|
|
19
|
-
"format:check": "prettier . --check",
|
|
20
|
-
"lint": "eslint ./dist",
|
|
21
|
-
"lint:fix": "eslint ./dist --fix",
|
|
22
|
-
"all": "npm run build && npm run lint && npm run lint:fix && npm run format && npm test",
|
|
23
|
-
"test": "jest ./tests"
|
|
24
|
-
},
|
|
25
|
-
"keywords": [
|
|
26
|
-
"anilist",
|
|
27
|
-
"CLI",
|
|
28
|
-
"anime",
|
|
29
|
-
"manga",
|
|
30
|
-
"anime list",
|
|
31
|
-
"manga list",
|
|
32
|
-
"anime tracker",
|
|
33
|
-
"manga tracker",
|
|
34
|
-
"anilist API",
|
|
35
|
-
"anime progress",
|
|
36
|
-
"manga progress",
|
|
37
|
-
"media list",
|
|
38
|
-
"export anime",
|
|
39
|
-
"import anime",
|
|
40
|
-
"export manga",
|
|
41
|
-
"import manga",
|
|
42
|
-
"status tracker",
|
|
43
|
-
"watchlist",
|
|
44
|
-
"reading list",
|
|
45
|
-
"graphql"
|
|
46
|
-
],
|
|
47
|
-
"repository": {
|
|
48
|
-
"type": "git",
|
|
49
|
-
"url": "https://github.com/irfanshadikrishad/anilist"
|
|
50
|
-
},
|
|
51
|
-
"homepage": "https://github.com/irfanshadikrishad/anilist",
|
|
52
|
-
"bugs": {
|
|
53
|
-
"url": "https://github.com/irfanshadikrishad/anilist/issues"
|
|
54
|
-
},
|
|
55
|
-
"license": "MPL-2.0",
|
|
56
|
-
"devDependencies": {
|
|
57
|
-
"@babel/preset-env": "^7.26.
|
|
58
|
-
"@eslint/js": "^9.
|
|
59
|
-
"@types/jest": "^29.5.14",
|
|
60
|
-
"@types/
|
|
61
|
-
"@types/
|
|
62
|
-
"@
|
|
63
|
-
"eslint": "^
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"prettier
|
|
68
|
-
"
|
|
69
|
-
"ts-
|
|
70
|
-
"
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
|
|
81
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@irfanshadikrishad/anilist",
|
|
3
|
+
"description": "Minimalist unofficial AniList CLI for Anime and Manga Enthusiasts",
|
|
4
|
+
"author": "Irfan Shadik Rishad",
|
|
5
|
+
"version": "1.4.0-forbidden.6",
|
|
6
|
+
"main": "./bin/index.js",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"types": "./bin/index.d.ts",
|
|
9
|
+
"bin": {
|
|
10
|
+
"anilist": "./bin/index.js"
|
|
11
|
+
},
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public"
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "rm -rf ./bin && tsc",
|
|
17
|
+
"build:watch": "rm -rf ./bin && tsc -w",
|
|
18
|
+
"format": "prettier . --write",
|
|
19
|
+
"format:check": "prettier . --check",
|
|
20
|
+
"lint": "eslint ./dist",
|
|
21
|
+
"lint:fix": "eslint ./dist --fix",
|
|
22
|
+
"all": "npm run build && npm run lint && npm run lint:fix && npm run format && npm test",
|
|
23
|
+
"test": "jest ./tests"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"anilist",
|
|
27
|
+
"CLI",
|
|
28
|
+
"anime",
|
|
29
|
+
"manga",
|
|
30
|
+
"anime list",
|
|
31
|
+
"manga list",
|
|
32
|
+
"anime tracker",
|
|
33
|
+
"manga tracker",
|
|
34
|
+
"anilist API",
|
|
35
|
+
"anime progress",
|
|
36
|
+
"manga progress",
|
|
37
|
+
"media list",
|
|
38
|
+
"export anime",
|
|
39
|
+
"import anime",
|
|
40
|
+
"export manga",
|
|
41
|
+
"import manga",
|
|
42
|
+
"status tracker",
|
|
43
|
+
"watchlist",
|
|
44
|
+
"reading list",
|
|
45
|
+
"graphql"
|
|
46
|
+
],
|
|
47
|
+
"repository": {
|
|
48
|
+
"type": "git",
|
|
49
|
+
"url": "https://github.com/irfanshadikrishad/anilist"
|
|
50
|
+
},
|
|
51
|
+
"homepage": "https://github.com/irfanshadikrishad/anilist",
|
|
52
|
+
"bugs": {
|
|
53
|
+
"url": "https://github.com/irfanshadikrishad/anilist/issues"
|
|
54
|
+
},
|
|
55
|
+
"license": "MPL-2.0",
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@babel/preset-env": "^7.26.9",
|
|
58
|
+
"@eslint/js": "^9.23.0",
|
|
59
|
+
"@types/jest": "^29.5.14",
|
|
60
|
+
"@types/node": "^22.13.11",
|
|
61
|
+
"@types/papaparse": "^5.3.15",
|
|
62
|
+
"@types/xml2js": "^0.4.14",
|
|
63
|
+
"@typescript-eslint/eslint-plugin": "^8.27.0",
|
|
64
|
+
"eslint": "^9.23.0",
|
|
65
|
+
"globals": "^16.0.0",
|
|
66
|
+
"jest": "^29.7.0",
|
|
67
|
+
"prettier": "^3.5.3",
|
|
68
|
+
"prettier-plugin-organize-imports": "^4.1.0",
|
|
69
|
+
"ts-jest": "^29.2.6",
|
|
70
|
+
"ts-node": "^10.9.2",
|
|
71
|
+
"typescript": "^5.8.2"
|
|
72
|
+
},
|
|
73
|
+
"dependencies": {
|
|
74
|
+
"@irfanshadikrishad/cipher": "^1.0.6",
|
|
75
|
+
"cli-truncate": "^4.0.0",
|
|
76
|
+
"commander": "^13.1.0",
|
|
77
|
+
"fast-xml-parser": "^5.0.9",
|
|
78
|
+
"inquirer": "^12.5.0",
|
|
79
|
+
"jsonrepair": "^3.12.0",
|
|
80
|
+
"node-fetch": "^3.3.2",
|
|
81
|
+
"open": "^10.1.0",
|
|
82
|
+
"papaparse": "^5.5.2",
|
|
83
|
+
"tiny-spinner": "^2.0.5",
|
|
84
|
+
"xml2js": "^0.6.2"
|
|
85
|
+
}
|
|
86
|
+
}
|