@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.
@@ -45,10 +45,7 @@ interface MalIdToAnilistIdResponse {
45
45
  data?: {
46
46
  Media: {
47
47
  id: number;
48
- title: {
49
- english?: string;
50
- romaji?: string;
51
- };
48
+ title: MediaTitle;
52
49
  };
53
50
  };
54
51
  errors?: {
@@ -92,15 +89,13 @@ interface AnimeList {
92
89
  }[];
93
90
  }
94
91
  interface MediaWithProgress {
95
- malId: number;
92
+ malId?: number;
96
93
  progress: number;
97
94
  status: string;
98
95
  episodes?: number;
99
96
  chapters?: number;
100
- title: {
101
- english?: string;
102
- romaji?: string;
103
- };
97
+ format?: string;
98
+ title: MediaTitle;
104
99
  }
105
100
  interface MediaTitle {
106
101
  english?: string;
@@ -121,16 +116,36 @@ interface MediaEntry {
121
116
  status: string;
122
117
  hiddenFromStatusLists: boolean;
123
118
  }
119
+ interface SaveTextActivityResponse {
120
+ data?: {
121
+ SaveTextActivity: {
122
+ id: number;
123
+ userId: number;
124
+ text: string;
125
+ createdAt: number;
126
+ };
127
+ };
128
+ errors?: {
129
+ message: string;
130
+ }[];
131
+ }
132
+ interface MediaListCollectionResponse {
133
+ data?: {
134
+ MediaListCollection: {
135
+ lists: MediaList[];
136
+ };
137
+ };
138
+ errors?: {
139
+ message: string;
140
+ }[];
141
+ }
124
142
  interface List {
125
143
  name: string;
126
144
  entries: MediaEntry[];
127
145
  }
128
146
  interface MediaList {
129
147
  id(id: number | string): string;
130
- title: {
131
- english?: string;
132
- romaji?: string;
133
- };
148
+ title: MediaTitle;
134
149
  name: string;
135
150
  entries: MediaListEntry[];
136
151
  }
@@ -171,9 +186,9 @@ interface Myself {
171
186
  }[];
172
187
  }
173
188
  interface DateMonthYear {
174
- day?: number;
175
- month?: number;
176
- year?: number;
189
+ day?: number | null;
190
+ month?: number | null;
191
+ year?: number | null;
177
192
  }
178
193
  interface AnimeDetails {
179
194
  data?: {
@@ -197,6 +212,17 @@ interface AnimeDetails {
197
212
  message: string;
198
213
  }[];
199
214
  }
215
+ interface SaveMediaListEntryResponse {
216
+ data?: {
217
+ SaveMediaListEntry: {
218
+ id: number;
219
+ status: string;
220
+ };
221
+ };
222
+ errors?: {
223
+ message: string;
224
+ }[];
225
+ }
200
226
  interface MediaListEntry {
201
227
  id?: number;
202
228
  media: {
@@ -206,48 +232,17 @@ interface MediaListEntry {
206
232
  episodes?: number;
207
233
  siteUrl?: string;
208
234
  chapters?: number;
235
+ format?: string;
209
236
  };
210
237
  progress?: number;
211
238
  status?: string;
212
239
  hiddenFromStatusLists?: boolean;
213
240
  private?: boolean;
214
241
  }
215
- interface TheActivity {
216
- type: string;
217
- id: number;
218
- message?: string;
219
- createdAt: number;
220
- recipient?: {
221
- id: number;
222
- name: string;
223
- };
224
- isLiked?: boolean;
225
- user?: {
226
- id?: number;
227
- name?: string;
228
- };
229
- messenger?: {
230
- name: string;
231
- };
232
- media?: {
233
- title?: {
234
- userPreferred: string;
235
- };
236
- };
237
- progress?: string | null;
238
- status?: string;
239
- }
240
242
  type UserActivitiesResponse = {
241
243
  data?: {
242
244
  Page: {
243
- activities: {
244
- status: string;
245
- progress: number;
246
- createdAt: number;
247
- media: {
248
- title: MediaTitle;
249
- };
250
- }[];
245
+ activities: Activity[];
251
246
  };
252
247
  };
253
248
  errors?: {
@@ -289,6 +284,17 @@ type UserResponse = {
289
284
  message: string;
290
285
  }[];
291
286
  };
287
+ type User = {
288
+ id: number;
289
+ name: string;
290
+ avatar: {
291
+ large: string;
292
+ medium: string;
293
+ };
294
+ bannerImage: string;
295
+ isFollower: boolean;
296
+ isFollowing: boolean;
297
+ };
292
298
  type UserFollower = {
293
299
  data?: {
294
300
  Page: {
@@ -299,15 +305,7 @@ type UserFollower = {
299
305
  lastPage: number;
300
306
  hasNextPage: boolean;
301
307
  };
302
- followers: {
303
- id: number;
304
- name: string;
305
- avatar: {
306
- large: string;
307
- medium: string;
308
- };
309
- bannerImage: string;
310
- }[];
308
+ followers: User[];
311
309
  };
312
310
  };
313
311
  errors?: {
@@ -324,15 +322,7 @@ type UserFollowing = {
324
322
  lastPage: number;
325
323
  hasNextPage: boolean;
326
324
  };
327
- following: {
328
- id: number;
329
- name: string;
330
- avatar: {
331
- large: string;
332
- medium: string;
333
- };
334
- bannerImage: string;
335
- }[];
325
+ following: User[];
336
326
  };
337
327
  };
338
328
  errors?: {
@@ -356,4 +346,117 @@ type AnimeSearchResponse = {
356
346
  message: string;
357
347
  }[];
358
348
  };
359
- export { AniListMediaStatus, AnimeDetails, AnimeList, AnimeSearchResponse, DateMonthYear, DeleteMangaResponse, List, MALAnimeStatus, MALAnimeXML, MALMangaStatus, MalIdToAnilistIdResponse, MediaEntry, MediaList, MediaListEntry, MediaTitle, MediaWithProgress, Myself, TheActivity, UserActivitiesResponse, UserFollower, UserFollowing, UserResponse, saveAnimeWithProgressResponse, };
349
+ type ToggleFollowResponse = {
350
+ data?: {
351
+ ToggleFollow: {
352
+ id: number;
353
+ name: string;
354
+ isFollower: boolean;
355
+ isFollowing: boolean;
356
+ };
357
+ };
358
+ errors?: {
359
+ message: string;
360
+ }[];
361
+ };
362
+ type DeleteMediaListResponse = {
363
+ data?: {
364
+ DeleteMediaListEntry: {
365
+ deleted: boolean;
366
+ };
367
+ };
368
+ errors?: {
369
+ message: string;
370
+ }[];
371
+ };
372
+ type Activity = {
373
+ id: number;
374
+ type: string;
375
+ status: string;
376
+ progress: number | null;
377
+ media: {
378
+ id?: number;
379
+ title: MediaTitle;
380
+ };
381
+ createdAt: number;
382
+ };
383
+ interface TheActivity {
384
+ type: string;
385
+ id: number;
386
+ message?: string;
387
+ createdAt: number;
388
+ recipient?: {
389
+ id: number;
390
+ name: string;
391
+ };
392
+ isLiked?: boolean;
393
+ user?: {
394
+ id?: number;
395
+ name?: string;
396
+ };
397
+ messenger?: {
398
+ name: string;
399
+ };
400
+ media?: {
401
+ title?: {
402
+ userPreferred: string;
403
+ };
404
+ };
405
+ progress?: string | null;
406
+ status?: string;
407
+ }
408
+ type LikeActivityResponse = {
409
+ data?: {
410
+ ToggleLike: {
411
+ id: number;
412
+ };
413
+ };
414
+ errors?: {
415
+ message: string;
416
+ }[];
417
+ };
418
+ type SpecificUserActivitiesResponse = {
419
+ data?: {
420
+ Page: {
421
+ pageInfo: {
422
+ total: number;
423
+ perPage: number;
424
+ currentPage: number;
425
+ lastPage: number;
426
+ hasNextPage: boolean;
427
+ };
428
+ activities: TheActivity[];
429
+ };
430
+ };
431
+ errors?: {
432
+ message: string;
433
+ }[];
434
+ };
435
+ type Error = {
436
+ message: string;
437
+ }[];
438
+ type CoverImage = {
439
+ color: string;
440
+ medium: string;
441
+ large: string;
442
+ extraLarge: string;
443
+ };
444
+ type MangaDetails = {
445
+ data?: {
446
+ Media: {
447
+ id: number;
448
+ title: MediaTitle;
449
+ coverImage: CoverImage;
450
+ bannerImage: string;
451
+ description: string;
452
+ chapters: number | null;
453
+ volumes: number | null;
454
+ status: string;
455
+ genres: [string];
456
+ startDate: DateMonthYear;
457
+ endDate: DateMonthYear;
458
+ };
459
+ };
460
+ errors?: Error;
461
+ };
462
+ export { Activity, AniListMediaStatus, AnimeDetails, AnimeList, AnimeSearchResponse, DateMonthYear, DeleteMangaResponse, DeleteMediaListResponse, LikeActivityResponse, List, MALAnimeStatus, MALAnimeXML, MALMangaStatus, MalIdToAnilistIdResponse, MangaDetails, MediaEntry, MediaList, MediaListCollectionResponse, MediaListEntry, MediaTitle, MediaWithProgress, Myself, SaveMediaListEntryResponse, SaveTextActivityResponse, SpecificUserActivitiesResponse, TheActivity, ToggleFollowResponse, User, UserActivitiesResponse, UserFollower, UserFollowing, UserResponse, saveAnimeWithProgressResponse, };
@@ -0,0 +1,29 @@
1
+ declare class Validate {
2
+ /**
3
+ * Validate importable JSON file
4
+ * @param data string
5
+ * @returns boolean
6
+ */
7
+ static Import_JSON(data: {
8
+ id: number;
9
+ }[]): boolean;
10
+ /**
11
+ * Validate if MyAnimeList Anime XML file is valid or not
12
+ * @param xmlData string
13
+ * @returns boolean
14
+ */
15
+ static Import_AnimeXML(xmlData: string): Promise<boolean>;
16
+ /**
17
+ * Validate if MyAnimeList Anime XML file is valid or not
18
+ * @param xmlData string
19
+ * @returns boolean
20
+ */
21
+ static Import_MangaXML(xmlData: string): Promise<boolean>;
22
+ /**
23
+ * Validate AniDB json-large file
24
+ * @param file string of anidb json-large
25
+ * @returns boolean
26
+ */
27
+ static Import_AniDBJSONLarge(file: string): Promise<boolean>;
28
+ }
29
+ export { Validate };
@@ -0,0 +1,117 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { parseStringPromise } from "xml2js";
11
+ class Validate {
12
+ /**
13
+ * Validate importable JSON file
14
+ * @param data string
15
+ * @returns boolean
16
+ */
17
+ static Import_JSON(data) {
18
+ return (Array.isArray(data) &&
19
+ data.every((item) => typeof item === "object" && item !== null && "id" in item));
20
+ }
21
+ /**
22
+ * Validate if MyAnimeList Anime XML file is valid or not
23
+ * @param xmlData string
24
+ * @returns boolean
25
+ */
26
+ static Import_AnimeXML(xmlData) {
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ try {
29
+ const result = yield parseStringPromise(xmlData, { explicitArray: false });
30
+ if (!result || !result.myanimelist) {
31
+ console.error("Invalid XML structure: Missing 'myanimelist' root element.");
32
+ return false;
33
+ }
34
+ const animeList = result.myanimelist.anime;
35
+ if (!animeList) {
36
+ console.error("Invalid XML structure: Missing 'anime' elements.");
37
+ return false;
38
+ }
39
+ const animeArray = Array.isArray(animeList) ? animeList : [animeList];
40
+ const isValid = animeArray.every((anime) => {
41
+ const isValidId = anime.series_animedb_id && !isNaN(Number(anime.series_animedb_id));
42
+ const hasRequiredFields = anime.series_title && anime.my_status;
43
+ return isValidId && hasRequiredFields;
44
+ });
45
+ if (!isValid) {
46
+ console.error("Validation failed: Some anime entries are missing required fields or have invalid IDs.");
47
+ }
48
+ return isValid;
49
+ }
50
+ catch (error) {
51
+ console.error("Error parsing or validating XML:", error);
52
+ return false;
53
+ }
54
+ });
55
+ }
56
+ /**
57
+ * Validate if MyAnimeList Anime XML file is valid or not
58
+ * @param xmlData string
59
+ * @returns boolean
60
+ */
61
+ static Import_MangaXML(xmlData) {
62
+ return __awaiter(this, void 0, void 0, function* () {
63
+ try {
64
+ const result = yield parseStringPromise(xmlData, { explicitArray: false });
65
+ if (!result || !result.myanimelist) {
66
+ console.error("Invalid XML structure: Missing 'myanimelist' root element.");
67
+ return false;
68
+ }
69
+ const mangaList = result.myanimelist.manga;
70
+ if (!mangaList) {
71
+ console.error("Invalid XML structure: Missing 'manga' elements.");
72
+ return false;
73
+ }
74
+ const mangaArray = Array.isArray(mangaList) ? mangaList : [mangaList];
75
+ const isValid = mangaArray.every((manga) => {
76
+ const isValidId = manga.manga_mangadb_id && !isNaN(Number(manga.manga_mangadb_id));
77
+ const hasRequiredFields = manga.manga_title && manga.my_status;
78
+ return isValidId && hasRequiredFields;
79
+ });
80
+ if (!isValid) {
81
+ console.error("Validation failed: Some manga entries are missing required fields or have invalid IDs.");
82
+ }
83
+ return isValid;
84
+ }
85
+ catch (error) {
86
+ console.error("Error parsing or validating XML:", error);
87
+ return false;
88
+ }
89
+ });
90
+ }
91
+ /**
92
+ * Validate AniDB json-large file
93
+ * @param file string of anidb json-large
94
+ * @returns boolean
95
+ */
96
+ static Import_AniDBJSONLarge(file) {
97
+ return __awaiter(this, void 0, void 0, function* () {
98
+ try {
99
+ if (!(file === null || file === void 0 ? void 0 : file.trim())) {
100
+ console.error("File content is empty or invalid.");
101
+ return false;
102
+ }
103
+ const obj3ct = JSON.parse(file);
104
+ if (!obj3ct || !Array.isArray(obj3ct.anime)) {
105
+ console.error("Invalid JSON structure: Missing or malformed 'anime' array.");
106
+ return false;
107
+ }
108
+ return true;
109
+ }
110
+ catch (error) {
111
+ console.error("Failed to parse JSON file:", error);
112
+ return false;
113
+ }
114
+ });
115
+ }
116
+ }
117
+ export { Validate };
@@ -1,4 +1,4 @@
1
- import { MALAnimeStatus, MALMangaStatus, MediaWithProgress, TheActivity } from "./types.js";
1
+ import { DateMonthYear, MALAnimeStatus, MALMangaStatus, MediaWithProgress, TheActivity } from "./types.js";
2
2
  declare const aniListEndpoint = "https://graphql.anilist.co";
3
3
  declare const redirectUri = "https://anilist.co/api/v2/oauth/pin";
4
4
  declare function getTitle(title: {
@@ -20,22 +20,31 @@ declare function getFormattedDate(): string;
20
20
  /**
21
21
  * Export JSON as JSON
22
22
  * @param js0n
23
- * @param dataType (eg: anime/manga)
23
+ * @param dataType (eg: anime|manga)
24
24
  */
25
25
  declare function saveJSONasJSON(js0n: object, dataType: string): Promise<void>;
26
26
  /**
27
27
  * Export JSON as CSV
28
28
  * @param js0n
29
- * @param dataType (eg: anime/manga)
29
+ * @param dataType (eg: anime|manga)
30
30
  */
31
- declare function saveJSONasCSV(js0n: object, dataType: string): Promise<void>;
31
+ declare function saveJSONasCSV(js0n: MediaWithProgress[], dataType: string): Promise<void>;
32
+ declare function saveJSONasXML(js0n: MediaWithProgress[], data_type: 0 | 1): Promise<void>;
32
33
  declare function selectFile(fileType: string): Promise<string>;
33
- declare function createAnimeXML(malId: number, progress: number, status: MALAnimeStatus, episodes: number, title: string): string;
34
+ declare function createAnimeXML(malId: number, progress: number, status: MALAnimeStatus, episodes: number, title: string, format: string): string;
34
35
  declare function createMangaXML(malId: number, progress: number, status: MALMangaStatus, chapters: number, title: string): string;
35
36
  declare function createAnimeListXML(mediaWithProgress: MediaWithProgress[]): Promise<string>;
36
37
  declare function createMangaListXML(mediaWithProgress: MediaWithProgress[]): Promise<string>;
37
38
  declare function getCurrentPackageVersion(): string | null;
38
39
  declare function timestampToTimeAgo(timestamp: number): string;
39
- declare function activityBy(activity: TheActivity): string;
40
40
  declare const anidbToanilistMapper: (romanjiName: string, year: number, englishName?: string) => Promise<number | null>;
41
- export { activityBy, anidbToanilistMapper, aniListEndpoint, createAnimeListXML, createAnimeXML, createMangaListXML, createMangaXML, formatDateObject, getCurrentPackageVersion, getDownloadFolderPath, getFormattedDate, getNextSeasonAndYear, getTitle, redirectUri, removeHtmlAndMarkdown, saveJSONasCSV, saveJSONasJSON, selectFile, timestampToTimeAgo, };
41
+ declare function activityBy(activity: TheActivity, count?: number): string;
42
+ /**
43
+ * Extract the save file path
44
+ * @param data_type - anime|manga
45
+ * @param file_format - save format (eg: .json|.csv)
46
+ * @returns string of file path
47
+ */
48
+ declare function saveToPath(data_type: string, file_format: string): Promise<string>;
49
+ declare function simpleDateFormat(date: DateMonthYear): string;
50
+ export { activityBy, anidbToanilistMapper, aniListEndpoint, createAnimeListXML, createAnimeXML, createMangaListXML, createMangaXML, formatDateObject, getCurrentPackageVersion, getDownloadFolderPath, getFormattedDate, getNextSeasonAndYear, getTitle, redirectUri, removeHtmlAndMarkdown, saveJSONasCSV, saveJSONasJSON, saveJSONasXML, saveToPath, selectFile, simpleDateFormat, timestampToTimeAgo, };