animob 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +245 -0
  3. package/animb.png +0 -0
  4. package/dist/extractors/index.d.ts +11 -0
  5. package/dist/extractors/index.js +27 -0
  6. package/dist/extractors/index.js.map +1 -0
  7. package/dist/extractors/kwik.d.ts +18 -0
  8. package/dist/extractors/kwik.js +117 -0
  9. package/dist/extractors/kwik.js.map +1 -0
  10. package/dist/extractors/lplayer.d.ts +11 -0
  11. package/dist/extractors/lplayer.js +131 -0
  12. package/dist/extractors/lplayer.js.map +1 -0
  13. package/dist/extractors/megacloud.d.ts +10 -0
  14. package/dist/extractors/megacloud.js +44 -0
  15. package/dist/extractors/megacloud.js.map +1 -0
  16. package/dist/extractors/megaup.d.ts +31 -0
  17. package/dist/extractors/megaup.js +79 -0
  18. package/dist/extractors/megaup.js.map +1 -0
  19. package/dist/extractors/mixdrop.d.ts +7 -0
  20. package/dist/extractors/mixdrop.js +32 -0
  21. package/dist/extractors/mixdrop.js.map +1 -0
  22. package/dist/extractors/movearnpre.d.ts +9 -0
  23. package/dist/extractors/movearnpre.js +154 -0
  24. package/dist/extractors/movearnpre.js.map +1 -0
  25. package/dist/extractors/sendvid.d.ts +8 -0
  26. package/dist/extractors/sendvid.js +76 -0
  27. package/dist/extractors/sendvid.js.map +1 -0
  28. package/dist/extractors/sibnet.d.ts +8 -0
  29. package/dist/extractors/sibnet.js +44 -0
  30. package/dist/extractors/sibnet.js.map +1 -0
  31. package/dist/extractors/streamsb.d.ts +11 -0
  32. package/dist/extractors/streamsb.js +65 -0
  33. package/dist/extractors/streamsb.js.map +1 -0
  34. package/dist/extractors/streamtape.d.ts +7 -0
  35. package/dist/extractors/streamtape.js +32 -0
  36. package/dist/extractors/streamtape.js.map +1 -0
  37. package/dist/extractors/streamwish.d.ts +11 -0
  38. package/dist/extractors/streamwish.js +46 -0
  39. package/dist/extractors/streamwish.js.map +1 -0
  40. package/dist/extractors/vidcloud.d.ts +11 -0
  41. package/dist/extractors/vidcloud.js +109 -0
  42. package/dist/extractors/vidcloud.js.map +1 -0
  43. package/dist/extractors/videostr.d.ts +10 -0
  44. package/dist/extractors/videostr.js +44 -0
  45. package/dist/extractors/videostr.js.map +1 -0
  46. package/dist/extractors/vidmoly.d.ts +7 -0
  47. package/dist/extractors/vidmoly.js +75 -0
  48. package/dist/extractors/vidmoly.js.map +1 -0
  49. package/dist/extractors/voe.d.ts +10 -0
  50. package/dist/extractors/voe.js +44 -0
  51. package/dist/extractors/voe.js.map +1 -0
  52. package/dist/index.d.ts +6 -0
  53. package/dist/index.js +23 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/models/anime-parser.d.ts +26 -0
  56. package/dist/models/anime-parser.js +14 -0
  57. package/dist/models/anime-parser.js.map +1 -0
  58. package/dist/models/base-parser.d.ts +10 -0
  59. package/dist/models/base-parser.js +7 -0
  60. package/dist/models/base-parser.js.map +1 -0
  61. package/dist/models/base-provider.d.ts +40 -0
  62. package/dist/models/base-provider.js +45 -0
  63. package/dist/models/base-provider.js.map +1 -0
  64. package/dist/models/base-types.d.ts +22 -0
  65. package/dist/models/base-types.js +3 -0
  66. package/dist/models/base-types.js.map +1 -0
  67. package/dist/models/book-parser.d.ts +4 -0
  68. package/dist/models/book-parser.js +7 -0
  69. package/dist/models/book-parser.js.map +1 -0
  70. package/dist/models/comic-parser.d.ts +4 -0
  71. package/dist/models/comic-parser.js +7 -0
  72. package/dist/models/comic-parser.js.map +1 -0
  73. package/dist/models/index.d.ts +13 -0
  74. package/dist/models/index.js +39 -0
  75. package/dist/models/index.js.map +1 -0
  76. package/dist/models/lightnovel-parser.d.ts +16 -0
  77. package/dist/models/lightnovel-parser.js +7 -0
  78. package/dist/models/lightnovel-parser.js.map +1 -0
  79. package/dist/models/manga-parser.d.ts +17 -0
  80. package/dist/models/manga-parser.js +10 -0
  81. package/dist/models/manga-parser.js.map +1 -0
  82. package/dist/models/movie-parser.d.ts +26 -0
  83. package/dist/models/movie-parser.js +7 -0
  84. package/dist/models/movie-parser.js.map +1 -0
  85. package/dist/models/news-parser.d.ts +4 -0
  86. package/dist/models/news-parser.js +7 -0
  87. package/dist/models/news-parser.js.map +1 -0
  88. package/dist/models/proxy.d.ts +25 -0
  89. package/dist/models/proxy.js +83 -0
  90. package/dist/models/proxy.js.map +1 -0
  91. package/dist/models/type-objects.d.ts +48 -0
  92. package/dist/models/type-objects.js +57 -0
  93. package/dist/models/type-objects.js.map +1 -0
  94. package/dist/models/types.d.ts +515 -0
  95. package/dist/models/types.js +118 -0
  96. package/dist/models/types.js.map +1 -0
  97. package/dist/models/video-extractor.d.ts +19 -0
  98. package/dist/models/video-extractor.js +10 -0
  99. package/dist/models/video-extractor.js.map +1 -0
  100. package/dist/providers/anime/animekai.d.ts +94 -0
  101. package/dist/providers/anime/animekai.js +661 -0
  102. package/dist/providers/anime/animekai.js.map +1 -0
  103. package/dist/providers/anime/animepahe.d.ts +41 -0
  104. package/dist/providers/anime/animepahe.js +270 -0
  105. package/dist/providers/anime/animepahe.js.map +1 -0
  106. package/dist/providers/anime/animesama.d.ts +25 -0
  107. package/dist/providers/anime/animesama.js +504 -0
  108. package/dist/providers/anime/animesama.js.map +1 -0
  109. package/dist/providers/anime/animesaturn.d.ts +32 -0
  110. package/dist/providers/anime/animesaturn.js +298 -0
  111. package/dist/providers/anime/animesaturn.js.map +1 -0
  112. package/dist/providers/anime/animeunity.d.ts +27 -0
  113. package/dist/providers/anime/animeunity.js +157 -0
  114. package/dist/providers/anime/animeunity.js.map +1 -0
  115. package/dist/providers/anime/hianime.d.ts +150 -0
  116. package/dist/providers/anime/hianime.js +825 -0
  117. package/dist/providers/anime/hianime.js.map +1 -0
  118. package/dist/providers/anime/index.d.ts +17 -0
  119. package/dist/providers/anime/index.js +22 -0
  120. package/dist/providers/anime/index.js.map +1 -0
  121. package/dist/providers/anime/kickassanime.d.ts +65 -0
  122. package/dist/providers/anime/kickassanime.js +582 -0
  123. package/dist/providers/anime/kickassanime.js.map +1 -0
  124. package/dist/providers/books/index.d.ts +2 -0
  125. package/dist/providers/books/index.js +4 -0
  126. package/dist/providers/books/index.js.map +1 -0
  127. package/dist/providers/comics/getComics.d.ts +9 -0
  128. package/dist/providers/comics/getComics.js +54 -0
  129. package/dist/providers/comics/getComics.js.map +1 -0
  130. package/dist/providers/comics/index.d.ts +5 -0
  131. package/dist/providers/comics/index.js +8 -0
  132. package/dist/providers/comics/index.js.map +1 -0
  133. package/dist/providers/index.d.ts +9 -0
  134. package/dist/providers/index.js +23 -0
  135. package/dist/providers/index.js.map +1 -0
  136. package/dist/providers/light-novels/index.d.ts +5 -0
  137. package/dist/providers/light-novels/index.js +8 -0
  138. package/dist/providers/light-novels/index.js.map +1 -0
  139. package/dist/providers/light-novels/novelupdates.d.ts +26 -0
  140. package/dist/providers/light-novels/novelupdates.js +155 -0
  141. package/dist/providers/light-novels/novelupdates.js.map +1 -0
  142. package/dist/providers/manga/asurascans.d.ts +16 -0
  143. package/dist/providers/manga/asurascans.js +143 -0
  144. package/dist/providers/manga/asurascans.js.map +1 -0
  145. package/dist/providers/manga/comick.d.ts +36 -0
  146. package/dist/providers/manga/comick.js +141 -0
  147. package/dist/providers/manga/comick.js.map +1 -0
  148. package/dist/providers/manga/comix.d.ts +36 -0
  149. package/dist/providers/manga/comix.js +265 -0
  150. package/dist/providers/manga/comix.js.map +1 -0
  151. package/dist/providers/manga/index.d.ts +21 -0
  152. package/dist/providers/manga/index.js +26 -0
  153. package/dist/providers/manga/index.js.map +1 -0
  154. package/dist/providers/manga/mangadex.d.ts +26 -0
  155. package/dist/providers/manga/mangadex.js +301 -0
  156. package/dist/providers/manga/mangadex.js.map +1 -0
  157. package/dist/providers/manga/mangahere.d.ts +29 -0
  158. package/dist/providers/manga/mangahere.js +376 -0
  159. package/dist/providers/manga/mangahere.js.map +1 -0
  160. package/dist/providers/manga/mangakakalot.d.ts +56 -0
  161. package/dist/providers/manga/mangakakalot.js +461 -0
  162. package/dist/providers/manga/mangakakalot.js.map +1 -0
  163. package/dist/providers/manga/mangapill.d.ts +15 -0
  164. package/dist/providers/manga/mangapill.js +104 -0
  165. package/dist/providers/manga/mangapill.js.map +1 -0
  166. package/dist/providers/manga/mangareader.d.ts +15 -0
  167. package/dist/providers/manga/mangareader.js +110 -0
  168. package/dist/providers/manga/mangareader.js.map +1 -0
  169. package/dist/providers/manga/weebcentral.d.ts +12 -0
  170. package/dist/providers/manga/weebcentral.js +169 -0
  171. package/dist/providers/manga/weebcentral.js.map +1 -0
  172. package/dist/providers/meta/anilist.d.ts +206 -0
  173. package/dist/providers/meta/anilist.js +2025 -0
  174. package/dist/providers/meta/anilist.js.map +1 -0
  175. package/dist/providers/meta/index.d.ts +9 -0
  176. package/dist/providers/meta/index.js +10 -0
  177. package/dist/providers/meta/index.js.map +1 -0
  178. package/dist/providers/meta/mal.d.ts +39 -0
  179. package/dist/providers/meta/mal.js +529 -0
  180. package/dist/providers/meta/mal.js.map +1 -0
  181. package/dist/providers/meta/tmdb.d.ts +48 -0
  182. package/dist/providers/meta/tmdb.js +364 -0
  183. package/dist/providers/meta/tmdb.js.map +1 -0
  184. package/dist/providers/movies/dramacool.d.ts +98 -0
  185. package/dist/providers/movies/dramacool.js +367 -0
  186. package/dist/providers/movies/dramacool.js.map +1 -0
  187. package/dist/providers/movies/flixhq.d.ts +90 -0
  188. package/dist/providers/movies/flixhq.js +438 -0
  189. package/dist/providers/movies/flixhq.js.map +1 -0
  190. package/dist/providers/movies/goku.d.ts +80 -0
  191. package/dist/providers/movies/goku.js +369 -0
  192. package/dist/providers/movies/goku.js.map +1 -0
  193. package/dist/providers/movies/himovies.d.ts +102 -0
  194. package/dist/providers/movies/himovies.js +445 -0
  195. package/dist/providers/movies/himovies.js.map +1 -0
  196. package/dist/providers/movies/index.d.ts +17 -0
  197. package/dist/providers/movies/index.js +22 -0
  198. package/dist/providers/movies/index.js.map +1 -0
  199. package/dist/providers/movies/netmirror.d.ts +27 -0
  200. package/dist/providers/movies/netmirror.js +259 -0
  201. package/dist/providers/movies/netmirror.js.map +1 -0
  202. package/dist/providers/movies/sflix.d.ts +106 -0
  203. package/dist/providers/movies/sflix.js +490 -0
  204. package/dist/providers/movies/sflix.js.map +1 -0
  205. package/dist/providers/movies/turkish123.d.ts +32 -0
  206. package/dist/providers/movies/turkish123.js +141 -0
  207. package/dist/providers/movies/turkish123.js.map +1 -0
  208. package/dist/providers/news/animenewsnetwork.d.ts +30 -0
  209. package/dist/providers/news/animenewsnetwork.js +105 -0
  210. package/dist/providers/news/animenewsnetwork.js.map +1 -0
  211. package/dist/providers/news/index.d.ts +5 -0
  212. package/dist/providers/news/index.js +8 -0
  213. package/dist/providers/news/index.js.map +1 -0
  214. package/dist/providers/others/index.d.ts +0 -0
  215. package/dist/providers/others/index.js +2 -0
  216. package/dist/providers/others/index.js.map +1 -0
  217. package/dist/utils/index.d.ts +3 -0
  218. package/dist/utils/index.js +33 -0
  219. package/dist/utils/index.js.map +1 -0
  220. package/dist/utils/providers-list.d.ts +11 -0
  221. package/dist/utils/providers-list.js +40 -0
  222. package/dist/utils/providers-list.js.map +1 -0
  223. package/dist/utils/queries.d.ts +13 -0
  224. package/dist/utils/queries.js +31 -0
  225. package/dist/utils/queries.js.map +1 -0
  226. package/dist/utils/utils.d.ts +32 -0
  227. package/dist/utils/utils.js +324 -0
  228. package/dist/utils/utils.js.map +1 -0
  229. package/package.json +107 -0
@@ -0,0 +1,2025 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ var _a;
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const models_1 = require("../../models");
9
+ const utils_1 = require("../../utils");
10
+ const hianime_1 = __importDefault(require("../anime/hianime"));
11
+ const utils_2 = require("../../utils/utils");
12
+ const queries_1 = require("../../utils/queries");
13
+ const mangadex_1 = __importDefault(require("../manga/mangadex"));
14
+ class Anilist extends models_1.AnimeParser {
15
+ /**
16
+ * This class maps anilist to kitsu with any other anime provider.
17
+ * kitsu is used for episode images, titles and description.
18
+ * @param provider anime provider (optional) default: Gogoanime
19
+ * @param proxyConfig proxy config (optional)
20
+ * @param adapter axios adapter (optional)
21
+ */
22
+ constructor(provider, proxyConfig, adapter) {
23
+ super(proxyConfig, adapter);
24
+ this.proxyConfig = proxyConfig;
25
+ this.name = 'Anilist';
26
+ this.baseUrl = 'https://anilist.co';
27
+ this.logo = 'https://upload.wikimedia.org/wikipedia/commons/6/61/AniList_logo.svg';
28
+ this.classPath = 'META.Anilist';
29
+ this.anilistGraphqlUrl = 'https://graphql.anilist.co';
30
+ this.kitsuGraphqlUrl = 'https://kitsu.io/api/graphql';
31
+ this.malSyncUrl = 'https://api.malsync.moe';
32
+ this.anifyUrl = 'https://anify.eltik.cc';
33
+ /**
34
+ * @param authToken Anilist auth token
35
+ * @param type Type of favorites to fetch: 'ANIME', 'MANGA', or 'BOTH' (default: 'BOTH')
36
+ * @returns favorite lists
37
+ */
38
+ this.fetchFavoriteList = async (authToken, type = 'BOTH') => {
39
+ const options = {
40
+ query: (0, queries_1.anilistFavouritesQuery)(),
41
+ };
42
+ try {
43
+ let { data, status } = await this.client.post(this.anilistGraphqlUrl, options, {
44
+ validateStatus: () => true,
45
+ headers: {
46
+ Authorization: authToken,
47
+ 'User-Agent': utils_2.USER_AGENT,
48
+ },
49
+ });
50
+ const result = {};
51
+ if (type === 'ANIME' || type === 'BOTH') {
52
+ result.anime = data.data.Viewer.favourites.anime.nodes.map((item) => {
53
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
54
+ return ({
55
+ id: item.id.toString(),
56
+ malId: item.idMal,
57
+ title: item.title
58
+ ? {
59
+ romaji: item.title.romaji,
60
+ english: item.title.english,
61
+ native: item.title.native,
62
+ userPreferred: item.title.userPreferred,
63
+ }
64
+ : item.title.romaji,
65
+ status: item.status == 'RELEASING'
66
+ ? models_1.MediaStatus.ONGOING
67
+ : item.status == 'FINISHED'
68
+ ? models_1.MediaStatus.COMPLETED
69
+ : item.status == 'NOT_YET_RELEASED'
70
+ ? models_1.MediaStatus.NOT_YET_AIRED
71
+ : item.status == 'CANCELLED'
72
+ ? models_1.MediaStatus.CANCELLED
73
+ : item.status == 'HIATUS'
74
+ ? models_1.MediaStatus.HIATUS
75
+ : models_1.MediaStatus.UNKNOWN,
76
+ image: (_e = (_c = (_b = item.coverImage) === null || _b === void 0 ? void 0 : _b.extraLarge) !== null && _c !== void 0 ? _c : (_d = item.coverImage) === null || _d === void 0 ? void 0 : _d.large) !== null && _e !== void 0 ? _e : (_f = item.coverImage) === null || _f === void 0 ? void 0 : _f.medium,
77
+ imageHash: (0, utils_2.getHashFromImage)((_k = (_h = (_g = item.coverImage) === null || _g === void 0 ? void 0 : _g.extraLarge) !== null && _h !== void 0 ? _h : (_j = item.coverImage) === null || _j === void 0 ? void 0 : _j.large) !== null && _k !== void 0 ? _k : (_l = item.coverImage) === null || _l === void 0 ? void 0 : _l.medium),
78
+ cover: item.bannerImage,
79
+ coverHash: (0, utils_2.getHashFromImage)(item.bannerImage),
80
+ popularity: item.popularity,
81
+ description: item.description,
82
+ rating: item.averageScore,
83
+ genres: item.genres,
84
+ color: (_m = item.coverImage) === null || _m === void 0 ? void 0 : _m.color,
85
+ totalEpisodes: (_o = item.episodes) !== null && _o !== void 0 ? _o : undefined,
86
+ totalChapters: (_p = item.chapters) !== null && _p !== void 0 ? _p : undefined,
87
+ totalVolumes: (_q = item.volumes) !== null && _q !== void 0 ? _q : undefined,
88
+ type: item.format,
89
+ mediaType: item.type,
90
+ releaseDate: item.seasonYear,
91
+ });
92
+ });
93
+ }
94
+ if (type === 'MANGA' || type === 'BOTH') {
95
+ result.manga = data.data.Viewer.favourites.manga.nodes.map((item) => {
96
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
97
+ return ({
98
+ id: item.id.toString(),
99
+ malId: item.idMal,
100
+ title: item.title
101
+ ? {
102
+ romaji: item.title.romaji,
103
+ english: item.title.english,
104
+ native: item.title.native,
105
+ userPreferred: item.title.userPreferred,
106
+ }
107
+ : item.title.romaji,
108
+ status: item.status == 'RELEASING'
109
+ ? models_1.MediaStatus.ONGOING
110
+ : item.status == 'FINISHED'
111
+ ? models_1.MediaStatus.COMPLETED
112
+ : item.status == 'NOT_YET_RELEASED'
113
+ ? models_1.MediaStatus.NOT_YET_AIRED
114
+ : item.status == 'CANCELLED'
115
+ ? models_1.MediaStatus.CANCELLED
116
+ : item.status == 'HIATUS'
117
+ ? models_1.MediaStatus.HIATUS
118
+ : models_1.MediaStatus.UNKNOWN,
119
+ image: (_e = (_c = (_b = item.coverImage) === null || _b === void 0 ? void 0 : _b.extraLarge) !== null && _c !== void 0 ? _c : (_d = item.coverImage) === null || _d === void 0 ? void 0 : _d.large) !== null && _e !== void 0 ? _e : (_f = item.coverImage) === null || _f === void 0 ? void 0 : _f.medium,
120
+ imageHash: (0, utils_2.getHashFromImage)((_k = (_h = (_g = item.coverImage) === null || _g === void 0 ? void 0 : _g.extraLarge) !== null && _h !== void 0 ? _h : (_j = item.coverImage) === null || _j === void 0 ? void 0 : _j.large) !== null && _k !== void 0 ? _k : (_l = item.coverImage) === null || _l === void 0 ? void 0 : _l.medium),
121
+ cover: item.bannerImage,
122
+ coverHash: (0, utils_2.getHashFromImage)(item.bannerImage),
123
+ popularity: item.popularity,
124
+ description: item.description,
125
+ rating: item.averageScore,
126
+ genres: item.genres,
127
+ color: (_m = item.coverImage) === null || _m === void 0 ? void 0 : _m.color,
128
+ totalEpisodes: (_o = item.episodes) !== null && _o !== void 0 ? _o : undefined,
129
+ totalChapters: (_p = item.chapters) !== null && _p !== void 0 ? _p : undefined,
130
+ totalVolumes: (_q = item.volumes) !== null && _q !== void 0 ? _q : undefined,
131
+ type: item.format,
132
+ mediaType: item.type,
133
+ releaseDate: item.seasonYear,
134
+ });
135
+ });
136
+ }
137
+ return result;
138
+ }
139
+ catch (err) {
140
+ throw new Error(err.message);
141
+ }
142
+ };
143
+ /**
144
+ * @param query Search query
145
+ * @param page Page number (optional)
146
+ * @param perPage Number of results per page (optional) (default: 15) (max: 50)
147
+ */
148
+ this.search = async (query, page = 1, perPage = 15) => {
149
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
150
+ const options = {
151
+ headers: {
152
+ 'Content-Type': 'application/json',
153
+ Accept: 'application/json',
154
+ },
155
+ query: (0, utils_1.anilistSearchQuery)(query, page, perPage),
156
+ };
157
+ try {
158
+ let { data, status } = await this.client.post(this.anilistGraphqlUrl, options, {
159
+ validateStatus: () => true,
160
+ });
161
+ const res = {
162
+ currentPage: (_d = (_c = (_b = data.data.Page) === null || _b === void 0 ? void 0 : _b.pageInfo) === null || _c === void 0 ? void 0 : _c.currentPage) !== null && _d !== void 0 ? _d : (_e = data.meta) === null || _e === void 0 ? void 0 : _e.currentPage,
163
+ hasNextPage: (_h = (_g = (_f = data.data.Page) === null || _f === void 0 ? void 0 : _f.pageInfo) === null || _g === void 0 ? void 0 : _g.hasNextPage) !== null && _h !== void 0 ? _h : ((_j = data.meta) === null || _j === void 0 ? void 0 : _j.currentPage) != ((_k = data.meta) === null || _k === void 0 ? void 0 : _k.lastPage),
164
+ results: (_p = (_o = (_m = (_l = data.data) === null || _l === void 0 ? void 0 : _l.Page) === null || _m === void 0 ? void 0 : _m.media) === null || _o === void 0 ? void 0 : _o.map((item) => {
165
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
166
+ return ({
167
+ id: item.id.toString(),
168
+ malId: item.idMal,
169
+ title: item.title
170
+ ? {
171
+ romaji: item.title.romaji,
172
+ english: item.title.english,
173
+ native: item.title.native,
174
+ userPreferred: item.title.userPreferred,
175
+ }
176
+ : item.title.romaji,
177
+ status: item.status == 'RELEASING'
178
+ ? models_1.MediaStatus.ONGOING
179
+ : item.status == 'FINISHED'
180
+ ? models_1.MediaStatus.COMPLETED
181
+ : item.status == 'NOT_YET_RELEASED'
182
+ ? models_1.MediaStatus.NOT_YET_AIRED
183
+ : item.status == 'CANCELLED'
184
+ ? models_1.MediaStatus.CANCELLED
185
+ : item.status == 'HIATUS'
186
+ ? models_1.MediaStatus.HIATUS
187
+ : models_1.MediaStatus.UNKNOWN,
188
+ image: (_e = (_c = (_b = item.coverImage) === null || _b === void 0 ? void 0 : _b.extraLarge) !== null && _c !== void 0 ? _c : (_d = item.coverImage) === null || _d === void 0 ? void 0 : _d.large) !== null && _e !== void 0 ? _e : (_f = item.coverImage) === null || _f === void 0 ? void 0 : _f.medium,
189
+ imageHash: (0, utils_2.getHashFromImage)((_k = (_h = (_g = item.coverImage) === null || _g === void 0 ? void 0 : _g.extraLarge) !== null && _h !== void 0 ? _h : (_j = item.coverImage) === null || _j === void 0 ? void 0 : _j.large) !== null && _k !== void 0 ? _k : (_l = item.coverImage) === null || _l === void 0 ? void 0 : _l.medium),
190
+ cover: item.bannerImage,
191
+ coverHash: (0, utils_2.getHashFromImage)(item.bannerImage),
192
+ popularity: item.popularity,
193
+ description: item.description,
194
+ rating: item.averageScore,
195
+ genres: item.genres,
196
+ color: (_m = item.coverImage) === null || _m === void 0 ? void 0 : _m.color,
197
+ totalEpisodes: item.episodes ||
198
+ (((_o = item.nextAiringEpisode) === null || _o === void 0 ? void 0 : _o.episode) ? item.nextAiringEpisode.episode - 1 : undefined),
199
+ currentEpisodeCount: (item === null || item === void 0 ? void 0 : item.nextAiringEpisode)
200
+ ? ((_p = item === null || item === void 0 ? void 0 : item.nextAiringEpisode) === null || _p === void 0 ? void 0 : _p.episode) - 1
201
+ : item.episodes,
202
+ type: item.format,
203
+ releaseDate: item.seasonYear,
204
+ });
205
+ })) !== null && _p !== void 0 ? _p : data.data.map((item) => {
206
+ var _b, _c, _d;
207
+ return ({
208
+ id: item.anilistId.toString(),
209
+ malId: item.mappings['mal'],
210
+ title: item.title,
211
+ status: item.status == 'RELEASING'
212
+ ? models_1.MediaStatus.ONGOING
213
+ : item.status == 'FINISHED'
214
+ ? models_1.MediaStatus.COMPLETED
215
+ : item.status == 'NOT_YET_RELEASED'
216
+ ? models_1.MediaStatus.NOT_YET_AIRED
217
+ : item.status == 'CANCELLED'
218
+ ? models_1.MediaStatus.CANCELLED
219
+ : item.status == 'HIATUS'
220
+ ? models_1.MediaStatus.HIATUS
221
+ : models_1.MediaStatus.UNKNOWN,
222
+ image: (_b = item.coverImage) !== null && _b !== void 0 ? _b : item.bannerImage,
223
+ imageHash: (0, utils_2.getHashFromImage)((_c = item.coverImage) !== null && _c !== void 0 ? _c : item.bannerImage),
224
+ cover: item.bannerImage,
225
+ coverHash: (0, utils_2.getHashFromImage)(item.bannerImage),
226
+ popularity: item.popularity,
227
+ description: item.description,
228
+ rating: item.averageScore,
229
+ genres: item.genre,
230
+ color: item.color,
231
+ totalEpisodes: item.currentEpisode,
232
+ currentEpisodeCount: (item === null || item === void 0 ? void 0 : item.nextAiringEpisode)
233
+ ? ((_d = item === null || item === void 0 ? void 0 : item.nextAiringEpisode) === null || _d === void 0 ? void 0 : _d.episode) - 1
234
+ : item.currentEpisode,
235
+ type: item.format,
236
+ releaseDate: item.year,
237
+ });
238
+ }),
239
+ };
240
+ return res;
241
+ }
242
+ catch (err) {
243
+ throw new Error(err.message);
244
+ }
245
+ };
246
+ /**
247
+ *
248
+ * @param query Search query (optional)
249
+ * @param type Media type (optional) (default: `ANIME`) (options: `ANIME`, `MANGA`)
250
+ * @param page Page number (optional)
251
+ * @param perPage Number of results per page (optional) (default: `20`) (max: `50`)
252
+ * @param format Format (optional) (options: `TV`, `TV_SHORT`, `MOVIE`, `SPECIAL`, `OVA`, `ONA`, `MUSIC`)
253
+ * @param sort Sort (optional) (Default: `[POPULARITY_DESC, SCORE_DESC]`) (options: `POPULARITY_DESC`, `POPULARITY`, `TRENDING_DESC`, `TRENDING`, `UPDATED_AT_DESC`, `UPDATED_AT`, `START_DATE_DESC`, `START_DATE`, `END_DATE_DESC`, `END_DATE`, `FAVOURITES_DESC`, `FAVOURITES`, `SCORE_DESC`, `SCORE`, `TITLE_ROMAJI_DESC`, `TITLE_ROMAJI`, `TITLE_ENGLISH_DESC`, `TITLE_ENGLISH`, `TITLE_NATIVE_DESC`, `TITLE_NATIVE`, `EPISODES_DESC`, `EPISODES`, `ID`, `ID_DESC`)
254
+ * @param genres Genres (optional) (options: `Action`, `Adventure`, `Cars`, `Comedy`, `Drama`, `Fantasy`, `Horror`, `Mahou Shoujo`, `Mecha`, `Music`, `Mystery`, `Psychological`, `Romance`, `Sci-Fi`, `Slice of Life`, `Sports`, `Supernatural`, `Thriller`)
255
+ * @param id anilist Id (optional)
256
+ * @param year Year (optional) e.g. `2022`
257
+ * @param status Status (optional) (options: `RELEASING`, `FINISHED`, `NOT_YET_RELEASED`, `CANCELLED`, `HIATUS`)
258
+ * @param season Season (optional) (options: `WINTER`, `SPRING`, `SUMMER`, `FALL`)
259
+ * @param countryOfOrigin Country of origin (optional)
260
+ */
261
+ this.advancedSearch = async (query, type = 'ANIME', page = 1, perPage = 20, format, sort, genres, id, year, status, season, countryOfOrigin) => {
262
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z;
263
+ const options = {
264
+ headers: {
265
+ 'Content-Type': 'application/json',
266
+ Accept: 'application/json',
267
+ },
268
+ query: (0, utils_1.anilistAdvancedQuery)(),
269
+ variables: {
270
+ search: query,
271
+ type,
272
+ page,
273
+ size: perPage,
274
+ format,
275
+ sort,
276
+ genres,
277
+ id,
278
+ year: year ? `${year}%` : undefined,
279
+ status,
280
+ season,
281
+ countryOfOrigin,
282
+ },
283
+ };
284
+ if (genres) {
285
+ genres.forEach(genre => {
286
+ if (!Object.values(models_1.Genres).includes(genre)) {
287
+ throw new Error(`genre ${genre} is not valid`);
288
+ }
289
+ });
290
+ }
291
+ try {
292
+ let { data, status } = await this.client.post(this.anilistGraphqlUrl, options, {
293
+ validateStatus: () => true,
294
+ });
295
+ if (status >= 500 && !query)
296
+ throw new Error('No results found');
297
+ const res = {
298
+ currentPage: (_e = (_d = (_c = (_b = data.data) === null || _b === void 0 ? void 0 : _b.Page) === null || _c === void 0 ? void 0 : _c.pageInfo) === null || _d === void 0 ? void 0 : _d.currentPage) !== null && _e !== void 0 ? _e : (_f = data.meta) === null || _f === void 0 ? void 0 : _f.currentPage,
299
+ hasNextPage: (_k = (_j = (_h = (_g = data.data) === null || _g === void 0 ? void 0 : _g.Page) === null || _h === void 0 ? void 0 : _h.pageInfo) === null || _j === void 0 ? void 0 : _j.hasNextPage) !== null && _k !== void 0 ? _k : ((_l = data.meta) === null || _l === void 0 ? void 0 : _l.currentPage) != ((_m = data.meta) === null || _m === void 0 ? void 0 : _m.lastPage),
300
+ totalPages: (_q = (_p = (_o = data.data) === null || _o === void 0 ? void 0 : _o.Page) === null || _p === void 0 ? void 0 : _p.pageInfo) === null || _q === void 0 ? void 0 : _q.lastPage,
301
+ totalResults: (_t = (_s = (_r = data.data) === null || _r === void 0 ? void 0 : _r.Page) === null || _s === void 0 ? void 0 : _s.pageInfo) === null || _t === void 0 ? void 0 : _t.total,
302
+ results: [],
303
+ };
304
+ res.results.push(...((_z = (_x = (_w = (_v = (_u = data.data) === null || _u === void 0 ? void 0 : _u.Page) === null || _v === void 0 ? void 0 : _v.media) === null || _w === void 0 ? void 0 : _w.map((item) => {
305
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
306
+ return ({
307
+ id: item.id.toString(),
308
+ malId: item.idMal,
309
+ title: item.title
310
+ ? {
311
+ romaji: item.title.romaji,
312
+ english: item.title.english,
313
+ native: item.title.native,
314
+ userPreferred: item.title.userPreferred,
315
+ }
316
+ : item.title.romaji,
317
+ status: item.status == 'RELEASING'
318
+ ? models_1.MediaStatus.ONGOING
319
+ : item.status == 'FINISHED'
320
+ ? models_1.MediaStatus.COMPLETED
321
+ : item.status == 'NOT_YET_RELEASED'
322
+ ? models_1.MediaStatus.NOT_YET_AIRED
323
+ : item.status == 'CANCELLED'
324
+ ? models_1.MediaStatus.CANCELLED
325
+ : item.status == 'HIATUS'
326
+ ? models_1.MediaStatus.HIATUS
327
+ : models_1.MediaStatus.UNKNOWN,
328
+ image: (_c = (_b = item.coverImage.extraLarge) !== null && _b !== void 0 ? _b : item.coverImage.large) !== null && _c !== void 0 ? _c : item.coverImage.medium,
329
+ imageHash: (0, utils_2.getHashFromImage)((_e = (_d = item.coverImage.extraLarge) !== null && _d !== void 0 ? _d : item.coverImage.large) !== null && _e !== void 0 ? _e : item.coverImage.medium),
330
+ cover: item.bannerImage,
331
+ coverHash: (0, utils_2.getHashFromImage)(item.bannerImage),
332
+ popularity: item.popularity,
333
+ totalEpisodes: item.episodes ||
334
+ (((_f = item.nextAiringEpisode) === null || _f === void 0 ? void 0 : _f.episode) ? item.nextAiringEpisode.episode - 1 : undefined),
335
+ currentEpisode: ((_g = item.nextAiringEpisode) === null || _g === void 0 ? void 0 : _g.episode) - 1 || item.episodes,
336
+ countryOfOrigin: item.countryOfOrigin,
337
+ chapters: (_h = item.chapters) !== null && _h !== void 0 ? _h : undefined,
338
+ description: item.description,
339
+ genres: item.genres,
340
+ rating: item.averageScore,
341
+ color: (_j = item.coverImage) === null || _j === void 0 ? void 0 : _j.color,
342
+ type: item.format,
343
+ releaseDate: (_k = item === null || item === void 0 ? void 0 : item.seasonYear) !== null && _k !== void 0 ? _k : (_l = item.startDate) === null || _l === void 0 ? void 0 : _l.year,
344
+ });
345
+ })) !== null && _x !== void 0 ? _x : (_y = data.data) === null || _y === void 0 ? void 0 : _y.map((item) => {
346
+ var _b, _c, _d, _e, _f;
347
+ return ({
348
+ id: item.anilistId.toString(),
349
+ malId: item.mappings['mal'],
350
+ title: item.title,
351
+ status: item.status == 'RELEASING'
352
+ ? models_1.MediaStatus.ONGOING
353
+ : item.status == 'FINISHED'
354
+ ? models_1.MediaStatus.COMPLETED
355
+ : item.status == 'NOT_YET_RELEASED'
356
+ ? models_1.MediaStatus.NOT_YET_AIRED
357
+ : item.status == 'CANCELLED'
358
+ ? models_1.MediaStatus.CANCELLED
359
+ : item.status == 'HIATUS'
360
+ ? models_1.MediaStatus.HIATUS
361
+ : models_1.MediaStatus.UNKNOWN,
362
+ image: (_b = item.coverImage) !== null && _b !== void 0 ? _b : item.bannerImage,
363
+ imageHash: (0, utils_2.getHashFromImage)((_c = item.coverImage) !== null && _c !== void 0 ? _c : item.bannerImage),
364
+ cover: item.bannerImage,
365
+ coverHash: (0, utils_2.getHashFromImage)(item.bannerImage),
366
+ popularity: item.popularity,
367
+ description: item.description,
368
+ rating: item.averageScore,
369
+ genres: item.genre,
370
+ color: item.color,
371
+ totalEpisodes: item.currentEpisode,
372
+ chapters: (_d = item.totalChapters) !== null && _d !== void 0 ? _d : undefined,
373
+ type: item.format,
374
+ releaseDate: (_e = item.year) !== null && _e !== void 0 ? _e : (_f = item.startDate) === null || _f === void 0 ? void 0 : _f.year,
375
+ });
376
+ })) !== null && _z !== void 0 ? _z : []));
377
+ return res;
378
+ }
379
+ catch (err) {
380
+ throw new Error(err.message);
381
+ }
382
+ };
383
+ /**
384
+ *
385
+ * @param id Anime id
386
+ * @param dub to get dubbed episodes (optional) set to `true` to get dubbed episodes. **ONLY WORKS FOR GOGOANIME**
387
+ * @param fetchFiller to get filler boolean on the episode object (optional) set to `true` to get filler boolean on the episode object.
388
+ */
389
+ this.fetchAnimeInfo = async (id, dub = false, fetchFiller = false) => {
390
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65, _66, _67, _68, _69, _70, _71, _72, _73, _74, _75, _76, _77, _78, _79, _80, _81;
391
+ const animeInfo = {
392
+ id: id,
393
+ title: '',
394
+ };
395
+ const options = {
396
+ headers: {
397
+ 'Content-Type': 'application/json',
398
+ Accept: 'application/json',
399
+ },
400
+ query: (0, utils_1.anilistMediaDetailQuery)(id),
401
+ };
402
+ let fillerEpisodes;
403
+ try {
404
+ let { data, status } = await this.client.post(this.anilistGraphqlUrl, options, {
405
+ validateStatus: () => true,
406
+ });
407
+ if (status == 404)
408
+ throw new Error('Media not found. Perhaps the id is invalid or the anime is not in anilist');
409
+ if (status == 429)
410
+ throw new Error('You have been ratelimited by anilist. Please try again later');
411
+ // if (status >= 500) throw new Error('Anilist seems to be down. Please try again later');
412
+ if (status != 200 && status < 429)
413
+ throw Error('Media not found. If the problem persists, please contact the developer');
414
+ animeInfo.malId = (_d = (_c = (_b = data.data) === null || _b === void 0 ? void 0 : _b.Media) === null || _c === void 0 ? void 0 : _c.idMal) !== null && _d !== void 0 ? _d : (_e = data === null || data === void 0 ? void 0 : data.mappings) === null || _e === void 0 ? void 0 : _e.mal;
415
+ animeInfo.title = data.data.Media
416
+ ? {
417
+ romaji: data.data.Media.title.romaji,
418
+ english: data.data.Media.title.english,
419
+ native: data.data.Media.title.native,
420
+ userPreferred: data.data.Media.title.userPreferred,
421
+ }
422
+ : data.data.title;
423
+ animeInfo.synonyms = (_h = (_g = (_f = data.data) === null || _f === void 0 ? void 0 : _f.Media) === null || _g === void 0 ? void 0 : _g.synonyms) !== null && _h !== void 0 ? _h : data === null || data === void 0 ? void 0 : data.synonyms;
424
+ animeInfo.isLicensed = (_l = (_k = (_j = data.data) === null || _j === void 0 ? void 0 : _j.Media) === null || _k === void 0 ? void 0 : _k.isLicensed) !== null && _l !== void 0 ? _l : undefined;
425
+ animeInfo.isAdult = (_p = (_o = (_m = data.data) === null || _m === void 0 ? void 0 : _m.Media) === null || _o === void 0 ? void 0 : _o.isAdult) !== null && _p !== void 0 ? _p : undefined;
426
+ animeInfo.countryOfOrigin = (_s = (_r = (_q = data.data) === null || _q === void 0 ? void 0 : _q.Media) === null || _r === void 0 ? void 0 : _r.countryOfOrigin) !== null && _s !== void 0 ? _s : undefined;
427
+ if ((_v = (_u = (_t = data.data) === null || _t === void 0 ? void 0 : _t.Media) === null || _u === void 0 ? void 0 : _u.trailer) === null || _v === void 0 ? void 0 : _v.id) {
428
+ animeInfo.trailer = {
429
+ id: data.data.Media.trailer.id,
430
+ site: (_w = data.data.Media.trailer) === null || _w === void 0 ? void 0 : _w.site,
431
+ thumbnail: (_x = data.data.Media.trailer) === null || _x === void 0 ? void 0 : _x.thumbnail,
432
+ thumbnailHash: (0, utils_2.getHashFromImage)((_y = data.data.Media.trailer) === null || _y === void 0 ? void 0 : _y.thumbnail),
433
+ };
434
+ }
435
+ animeInfo.image =
436
+ (_11 = (_10 = (_6 = (_2 = (_1 = (_0 = (_z = data.data) === null || _z === void 0 ? void 0 : _z.Media) === null || _0 === void 0 ? void 0 : _0.coverImage) === null || _1 === void 0 ? void 0 : _1.extraLarge) !== null && _2 !== void 0 ? _2 : (_5 = (_4 = (_3 = data.data) === null || _3 === void 0 ? void 0 : _3.Media) === null || _4 === void 0 ? void 0 : _4.coverImage) === null || _5 === void 0 ? void 0 : _5.large) !== null && _6 !== void 0 ? _6 : (_9 = (_8 = (_7 = data.data) === null || _7 === void 0 ? void 0 : _7.Media) === null || _8 === void 0 ? void 0 : _8.coverImage) === null || _9 === void 0 ? void 0 : _9.medium) !== null && _10 !== void 0 ? _10 : data.coverImage) !== null && _11 !== void 0 ? _11 : data.bannerImage;
437
+ animeInfo.imageHash = (0, utils_2.getHashFromImage)((_24 = (_23 = (_19 = (_15 = (_14 = (_13 = (_12 = data.data) === null || _12 === void 0 ? void 0 : _12.Media) === null || _13 === void 0 ? void 0 : _13.coverImage) === null || _14 === void 0 ? void 0 : _14.extraLarge) !== null && _15 !== void 0 ? _15 : (_18 = (_17 = (_16 = data.data) === null || _16 === void 0 ? void 0 : _16.Media) === null || _17 === void 0 ? void 0 : _17.coverImage) === null || _18 === void 0 ? void 0 : _18.large) !== null && _19 !== void 0 ? _19 : (_22 = (_21 = (_20 = data.data) === null || _20 === void 0 ? void 0 : _20.Media) === null || _21 === void 0 ? void 0 : _21.coverImage) === null || _22 === void 0 ? void 0 : _22.medium) !== null && _23 !== void 0 ? _23 : data.coverImage) !== null && _24 !== void 0 ? _24 : data.bannerImage);
438
+ animeInfo.popularity = (_27 = (_26 = (_25 = data.data) === null || _25 === void 0 ? void 0 : _25.Media) === null || _26 === void 0 ? void 0 : _26.popularity) !== null && _27 !== void 0 ? _27 : data === null || data === void 0 ? void 0 : data.popularity;
439
+ animeInfo.color = (_31 = (_30 = (_29 = (_28 = data.data) === null || _28 === void 0 ? void 0 : _28.Media) === null || _29 === void 0 ? void 0 : _29.coverImage) === null || _30 === void 0 ? void 0 : _30.color) !== null && _31 !== void 0 ? _31 : data === null || data === void 0 ? void 0 : data.color;
440
+ animeInfo.cover = (_35 = (_34 = (_33 = (_32 = data.data) === null || _32 === void 0 ? void 0 : _32.Media) === null || _33 === void 0 ? void 0 : _33.bannerImage) !== null && _34 !== void 0 ? _34 : data === null || data === void 0 ? void 0 : data.bannerImage) !== null && _35 !== void 0 ? _35 : animeInfo.image;
441
+ animeInfo.coverHash = (0, utils_2.getHashFromImage)((_39 = (_38 = (_37 = (_36 = data.data) === null || _36 === void 0 ? void 0 : _36.Media) === null || _37 === void 0 ? void 0 : _37.bannerImage) !== null && _38 !== void 0 ? _38 : data === null || data === void 0 ? void 0 : data.bannerImage) !== null && _39 !== void 0 ? _39 : animeInfo.image);
442
+ animeInfo.description = (_42 = (_41 = (_40 = data.data) === null || _40 === void 0 ? void 0 : _40.Media) === null || _41 === void 0 ? void 0 : _41.description) !== null && _42 !== void 0 ? _42 : data === null || data === void 0 ? void 0 : data.description;
443
+ switch ((_45 = (_44 = (_43 = data.data) === null || _43 === void 0 ? void 0 : _43.Media) === null || _44 === void 0 ? void 0 : _44.status) !== null && _45 !== void 0 ? _45 : data === null || data === void 0 ? void 0 : data.status) {
444
+ case 'RELEASING':
445
+ animeInfo.status = models_1.MediaStatus.ONGOING;
446
+ break;
447
+ case 'FINISHED':
448
+ animeInfo.status = models_1.MediaStatus.COMPLETED;
449
+ break;
450
+ case 'NOT_YET_RELEASED':
451
+ animeInfo.status = models_1.MediaStatus.NOT_YET_AIRED;
452
+ break;
453
+ case 'CANCELLED':
454
+ animeInfo.status = models_1.MediaStatus.CANCELLED;
455
+ break;
456
+ case 'HIATUS':
457
+ animeInfo.status = models_1.MediaStatus.HIATUS;
458
+ default:
459
+ animeInfo.status = models_1.MediaStatus.UNKNOWN;
460
+ }
461
+ animeInfo.releaseDate = (_49 = (_48 = (_47 = (_46 = data.data) === null || _46 === void 0 ? void 0 : _46.Media) === null || _47 === void 0 ? void 0 : _47.startDate) === null || _48 === void 0 ? void 0 : _48.year) !== null && _49 !== void 0 ? _49 : data.year;
462
+ animeInfo.startDate = {
463
+ year: data.data.Media.startDate.year,
464
+ month: data.data.Media.startDate.month,
465
+ day: data.data.Media.startDate.day,
466
+ };
467
+ animeInfo.endDate = {
468
+ year: data.data.Media.endDate.year,
469
+ month: data.data.Media.endDate.month,
470
+ day: data.data.Media.endDate.day,
471
+ };
472
+ if ((_50 = data.data.Media.nextAiringEpisode) === null || _50 === void 0 ? void 0 : _50.airingAt)
473
+ animeInfo.nextAiringEpisode = {
474
+ airingTime: (_51 = data.data.Media.nextAiringEpisode) === null || _51 === void 0 ? void 0 : _51.airingAt,
475
+ timeUntilAiring: (_52 = data.data.Media.nextAiringEpisode) === null || _52 === void 0 ? void 0 : _52.timeUntilAiring,
476
+ episode: (_53 = data.data.Media.nextAiringEpisode) === null || _53 === void 0 ? void 0 : _53.episode,
477
+ };
478
+ animeInfo.totalEpisodes = (_55 = (_54 = data.data.Media) === null || _54 === void 0 ? void 0 : _54.episodes) !== null && _55 !== void 0 ? _55 : ((_56 = data.data.Media.nextAiringEpisode) === null || _56 === void 0 ? void 0 : _56.episode) - 1;
479
+ animeInfo.currentEpisode = ((_58 = (_57 = data.data.Media) === null || _57 === void 0 ? void 0 : _57.nextAiringEpisode) === null || _58 === void 0 ? void 0 : _58.episode)
480
+ ? ((_59 = data.data.Media.nextAiringEpisode) === null || _59 === void 0 ? void 0 : _59.episode) - 1
481
+ : (_60 = data.data.Media) === null || _60 === void 0 ? void 0 : _60.episodes;
482
+ animeInfo.rating = data.data.Media.averageScore;
483
+ animeInfo.duration = data.data.Media.duration;
484
+ animeInfo.genres = data.data.Media.genres;
485
+ animeInfo.season = data.data.Media.season;
486
+ animeInfo.studios = data.data.Media.studios.edges.map((item) => item.node.name);
487
+ animeInfo.subOrDub = dub ? models_1.SubOrSub.DUB : models_1.SubOrSub.SUB;
488
+ animeInfo.type = data.data.Media.format;
489
+ animeInfo.recommendations = (_63 = (_62 = (_61 = data.data.Media) === null || _61 === void 0 ? void 0 : _61.recommendations) === null || _62 === void 0 ? void 0 : _62.edges) === null || _63 === void 0 ? void 0 : _63.map((item) => {
490
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30;
491
+ return ({
492
+ id: (_b = item.node.mediaRecommendation) === null || _b === void 0 ? void 0 : _b.id,
493
+ malId: (_c = item.node.mediaRecommendation) === null || _c === void 0 ? void 0 : _c.idMal,
494
+ title: {
495
+ romaji: (_e = (_d = item.node.mediaRecommendation) === null || _d === void 0 ? void 0 : _d.title) === null || _e === void 0 ? void 0 : _e.romaji,
496
+ english: (_g = (_f = item.node.mediaRecommendation) === null || _f === void 0 ? void 0 : _f.title) === null || _g === void 0 ? void 0 : _g.english,
497
+ native: (_j = (_h = item.node.mediaRecommendation) === null || _h === void 0 ? void 0 : _h.title) === null || _j === void 0 ? void 0 : _j.native,
498
+ userPreferred: (_l = (_k = item.node.mediaRecommendation) === null || _k === void 0 ? void 0 : _k.title) === null || _l === void 0 ? void 0 : _l.userPreferred,
499
+ },
500
+ status: ((_m = item.node.mediaRecommendation) === null || _m === void 0 ? void 0 : _m.status) == 'RELEASING'
501
+ ? models_1.MediaStatus.ONGOING
502
+ : ((_o = item.node.mediaRecommendation) === null || _o === void 0 ? void 0 : _o.status) == 'FINISHED'
503
+ ? models_1.MediaStatus.COMPLETED
504
+ : ((_p = item.node.mediaRecommendation) === null || _p === void 0 ? void 0 : _p.status) == 'NOT_YET_RELEASED'
505
+ ? models_1.MediaStatus.NOT_YET_AIRED
506
+ : ((_q = item.node.mediaRecommendation) === null || _q === void 0 ? void 0 : _q.status) == 'CANCELLED'
507
+ ? models_1.MediaStatus.CANCELLED
508
+ : ((_r = item.node.mediaRecommendation) === null || _r === void 0 ? void 0 : _r.status) == 'HIATUS'
509
+ ? models_1.MediaStatus.HIATUS
510
+ : models_1.MediaStatus.UNKNOWN,
511
+ episodes: (_s = item.node.mediaRecommendation) === null || _s === void 0 ? void 0 : _s.episodes,
512
+ image: (_y = (_v = (_u = (_t = item.node.mediaRecommendation) === null || _t === void 0 ? void 0 : _t.coverImage) === null || _u === void 0 ? void 0 : _u.extraLarge) !== null && _v !== void 0 ? _v : (_x = (_w = item.node.mediaRecommendation) === null || _w === void 0 ? void 0 : _w.coverImage) === null || _x === void 0 ? void 0 : _x.large) !== null && _y !== void 0 ? _y : (_0 = (_z = item.node.mediaRecommendation) === null || _z === void 0 ? void 0 : _z.coverImage) === null || _0 === void 0 ? void 0 : _0.medium,
513
+ imageHash: (0, utils_2.getHashFromImage)((_6 = (_3 = (_2 = (_1 = item.node.mediaRecommendation) === null || _1 === void 0 ? void 0 : _1.coverImage) === null || _2 === void 0 ? void 0 : _2.extraLarge) !== null && _3 !== void 0 ? _3 : (_5 = (_4 = item.node.mediaRecommendation) === null || _4 === void 0 ? void 0 : _4.coverImage) === null || _5 === void 0 ? void 0 : _5.large) !== null && _6 !== void 0 ? _6 : (_8 = (_7 = item.node.mediaRecommendation) === null || _7 === void 0 ? void 0 : _7.coverImage) === null || _8 === void 0 ? void 0 : _8.medium),
514
+ cover: (_16 = (_13 = (_10 = (_9 = item.node.mediaRecommendation) === null || _9 === void 0 ? void 0 : _9.bannerImage) !== null && _10 !== void 0 ? _10 : (_12 = (_11 = item.node.mediaRecommendation) === null || _11 === void 0 ? void 0 : _11.coverImage) === null || _12 === void 0 ? void 0 : _12.extraLarge) !== null && _13 !== void 0 ? _13 : (_15 = (_14 = item.node.mediaRecommendation) === null || _14 === void 0 ? void 0 : _14.coverImage) === null || _15 === void 0 ? void 0 : _15.large) !== null && _16 !== void 0 ? _16 : (_18 = (_17 = item.node.mediaRecommendation) === null || _17 === void 0 ? void 0 : _17.coverImage) === null || _18 === void 0 ? void 0 : _18.medium,
515
+ coverHash: (0, utils_2.getHashFromImage)((_26 = (_23 = (_20 = (_19 = item.node.mediaRecommendation) === null || _19 === void 0 ? void 0 : _19.bannerImage) !== null && _20 !== void 0 ? _20 : (_22 = (_21 = item.node.mediaRecommendation) === null || _21 === void 0 ? void 0 : _21.coverImage) === null || _22 === void 0 ? void 0 : _22.extraLarge) !== null && _23 !== void 0 ? _23 : (_25 = (_24 = item.node.mediaRecommendation) === null || _24 === void 0 ? void 0 : _24.coverImage) === null || _25 === void 0 ? void 0 : _25.large) !== null && _26 !== void 0 ? _26 : (_28 = (_27 = item.node.mediaRecommendation) === null || _27 === void 0 ? void 0 : _27.coverImage) === null || _28 === void 0 ? void 0 : _28.medium),
516
+ rating: (_29 = item.node.mediaRecommendation) === null || _29 === void 0 ? void 0 : _29.meanScore,
517
+ type: (_30 = item.node.mediaRecommendation) === null || _30 === void 0 ? void 0 : _30.format,
518
+ });
519
+ });
520
+ animeInfo.characters = (_67 = (_66 = (_65 = (_64 = data.data) === null || _64 === void 0 ? void 0 : _64.Media) === null || _65 === void 0 ? void 0 : _65.characters) === null || _66 === void 0 ? void 0 : _66.edges) === null || _67 === void 0 ? void 0 : _67.map((item) => {
521
+ var _b, _c, _d;
522
+ return ({
523
+ id: (_b = item.node) === null || _b === void 0 ? void 0 : _b.id,
524
+ role: item.role,
525
+ name: {
526
+ first: item.node.name.first,
527
+ last: item.node.name.last,
528
+ full: item.node.name.full,
529
+ native: item.node.name.native,
530
+ userPreferred: item.node.name.userPreferred,
531
+ },
532
+ image: (_c = item.node.image.large) !== null && _c !== void 0 ? _c : item.node.image.medium,
533
+ imageHash: (0, utils_2.getHashFromImage)((_d = item.node.image.large) !== null && _d !== void 0 ? _d : item.node.image.medium),
534
+ voiceActors: item.voiceActors.map((voiceActor) => {
535
+ var _b, _c;
536
+ return ({
537
+ id: voiceActor.id,
538
+ language: voiceActor.languageV2,
539
+ name: {
540
+ first: voiceActor.name.first,
541
+ last: voiceActor.name.last,
542
+ full: voiceActor.name.full,
543
+ native: voiceActor.name.native,
544
+ userPreferred: voiceActor.name.userPreferred,
545
+ },
546
+ image: (_b = voiceActor.image.large) !== null && _b !== void 0 ? _b : voiceActor.image.medium,
547
+ imageHash: (0, utils_2.getHashFromImage)((_c = voiceActor.image.large) !== null && _c !== void 0 ? _c : voiceActor.image.medium),
548
+ });
549
+ }),
550
+ });
551
+ });
552
+ animeInfo.relations = (_71 = (_70 = (_69 = (_68 = data.data) === null || _68 === void 0 ? void 0 : _68.Media) === null || _69 === void 0 ? void 0 : _69.relations) === null || _70 === void 0 ? void 0 : _70.edges) === null || _71 === void 0 ? void 0 : _71.map((item) => {
553
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
554
+ return ({
555
+ id: item.node.id,
556
+ relationType: item.relationType,
557
+ malId: item.node.idMal,
558
+ title: {
559
+ romaji: item.node.title.romaji,
560
+ english: item.node.title.english,
561
+ native: item.node.title.native,
562
+ userPreferred: item.node.title.userPreferred,
563
+ },
564
+ status: item.node.status == 'RELEASING'
565
+ ? models_1.MediaStatus.ONGOING
566
+ : item.node.status == 'FINISHED'
567
+ ? models_1.MediaStatus.COMPLETED
568
+ : item.node.status == 'NOT_YET_RELEASED'
569
+ ? models_1.MediaStatus.NOT_YET_AIRED
570
+ : item.node.status == 'CANCELLED'
571
+ ? models_1.MediaStatus.CANCELLED
572
+ : item.node.status == 'HIATUS'
573
+ ? models_1.MediaStatus.HIATUS
574
+ : models_1.MediaStatus.UNKNOWN,
575
+ episodes: item.node.episodes,
576
+ image: (_c = (_b = item.node.coverImage.extraLarge) !== null && _b !== void 0 ? _b : item.node.coverImage.large) !== null && _c !== void 0 ? _c : item.node.coverImage.medium,
577
+ imageHash: (0, utils_2.getHashFromImage)((_e = (_d = item.node.coverImage.extraLarge) !== null && _d !== void 0 ? _d : item.node.coverImage.large) !== null && _e !== void 0 ? _e : item.node.coverImage.medium),
578
+ color: (_f = item.node.coverImage) === null || _f === void 0 ? void 0 : _f.color,
579
+ type: item.node.format,
580
+ cover: (_j = (_h = (_g = item.node.bannerImage) !== null && _g !== void 0 ? _g : item.node.coverImage.extraLarge) !== null && _h !== void 0 ? _h : item.node.coverImage.large) !== null && _j !== void 0 ? _j : item.node.coverImage.medium,
581
+ coverHash: (0, utils_2.getHashFromImage)((_m = (_l = (_k = item.node.bannerImage) !== null && _k !== void 0 ? _k : item.node.coverImage.extraLarge) !== null && _l !== void 0 ? _l : item.node.coverImage.large) !== null && _m !== void 0 ? _m : item.node.coverImage.medium),
582
+ rating: item.node.meanScore,
583
+ });
584
+ });
585
+ if (this.provider instanceof hianime_1.default &&
586
+ !dub &&
587
+ (animeInfo.status === models_1.MediaStatus.ONGOING ||
588
+ (0, utils_1.range)({ from: 1940, to: new Date().getFullYear() + 1 }).includes(parseInt(animeInfo.releaseDate)))) {
589
+ try {
590
+ // Note: commenting out for now, will fix it properly in future
591
+ // const anifyInfo = await new Anify(
592
+ // this.proxyConfig,
593
+ // this.adapter,
594
+ // this.provider.name.toLowerCase() as 'gogoanime' | 'Hianime' | 'animepahe' | '9anime'
595
+ // ).fetchAnimeInfo(id);
596
+ // animeInfo.mappings = anifyInfo.mappings;
597
+ // animeInfo.artwork = anifyInfo.artwork;
598
+ // animeInfo.episodes = anifyInfo.episodes?.map((item: any) => ({
599
+ // id: item.id,
600
+ // title: item.title,
601
+ // description: item.description,
602
+ // number: item.number,
603
+ // image: item.image,
604
+ // imageHash: getHashFromImage(item.image),
605
+ // airDate: item.airDate ?? null,
606
+ // }));
607
+ if (!((_72 = animeInfo.episodes) === null || _72 === void 0 ? void 0 : _72.length)) {
608
+ animeInfo.episodes = await this.fetchDefaultEpisodeList({
609
+ idMal: animeInfo.malId,
610
+ season: data.data.Media.season,
611
+ startDate: { year: parseInt(animeInfo.releaseDate) },
612
+ title: {
613
+ english: (_73 = animeInfo.title) === null || _73 === void 0 ? void 0 : _73.english,
614
+ romaji: (_74 = animeInfo.title) === null || _74 === void 0 ? void 0 : _74.romaji,
615
+ },
616
+ }, dub, id);
617
+ animeInfo.episodes = (_75 = animeInfo.episodes) === null || _75 === void 0 ? void 0 : _75.map((episode) => {
618
+ if (!episode.image) {
619
+ episode.image = animeInfo.image;
620
+ episode.imageHash = animeInfo.imageHash;
621
+ }
622
+ return episode;
623
+ });
624
+ }
625
+ }
626
+ catch (err) {
627
+ animeInfo.episodes = await this.fetchDefaultEpisodeList({
628
+ idMal: animeInfo.malId,
629
+ season: data.data.Media.season,
630
+ startDate: { year: parseInt(animeInfo.releaseDate) },
631
+ title: {
632
+ english: (_76 = animeInfo.title) === null || _76 === void 0 ? void 0 : _76.english,
633
+ romaji: (_77 = animeInfo.title) === null || _77 === void 0 ? void 0 : _77.romaji,
634
+ },
635
+ }, dub, id);
636
+ animeInfo.episodes = (_78 = animeInfo.episodes) === null || _78 === void 0 ? void 0 : _78.map((episode) => {
637
+ if (!episode.image) {
638
+ episode.image = animeInfo.image;
639
+ episode.imageHash = animeInfo.imageHash;
640
+ }
641
+ return episode;
642
+ });
643
+ return animeInfo;
644
+ }
645
+ }
646
+ else
647
+ animeInfo.episodes = await this.fetchDefaultEpisodeList({
648
+ idMal: animeInfo.malId,
649
+ season: data.data.Media.season,
650
+ startDate: { year: parseInt(animeInfo.releaseDate) },
651
+ title: {
652
+ english: (_79 = animeInfo.title) === null || _79 === void 0 ? void 0 : _79.english,
653
+ romaji: (_80 = animeInfo.title) === null || _80 === void 0 ? void 0 : _80.romaji,
654
+ },
655
+ externalLinks: data.data.Media.externalLinks.filter((link) => link.type === 'STREAMING'),
656
+ }, dub, id);
657
+ if (fetchFiller) {
658
+ const { data: fillerData } = await this.client.get(`https://raw.githubusercontent.com/saikou-app/mal-id-filler-list/main/fillers/${animeInfo.malId}.json`, { validateStatus: () => true });
659
+ if (!fillerData.toString().startsWith('404')) {
660
+ fillerEpisodes = [];
661
+ fillerEpisodes === null || fillerEpisodes === void 0 ? void 0 : fillerEpisodes.push(...fillerData.episodes);
662
+ }
663
+ }
664
+ animeInfo.episodes = (_81 = animeInfo.episodes) === null || _81 === void 0 ? void 0 : _81.map((episode) => {
665
+ if (!episode.image) {
666
+ episode.image = animeInfo.image;
667
+ episode.imageHash = animeInfo.imageHash;
668
+ }
669
+ if (fetchFiller &&
670
+ (fillerEpisodes === null || fillerEpisodes === void 0 ? void 0 : fillerEpisodes.length) > 0 &&
671
+ (fillerEpisodes === null || fillerEpisodes === void 0 ? void 0 : fillerEpisodes.length) >= animeInfo.episodes.length) {
672
+ if (fillerEpisodes[episode.number - 1])
673
+ episode.isFiller = new Boolean(fillerEpisodes[episode.number - 1]['filler-bool']).valueOf();
674
+ }
675
+ return episode;
676
+ });
677
+ return animeInfo;
678
+ }
679
+ catch (err) {
680
+ throw new Error(err.message);
681
+ }
682
+ };
683
+ /**
684
+ *
685
+ * @param episodeId Episode id
686
+ */
687
+ this.fetchEpisodeSources = async (episodeId, ...args) => {
688
+ try {
689
+ return this.provider.fetchEpisodeSources(episodeId, ...args);
690
+ }
691
+ catch (err) {
692
+ throw new Error(`Failed to fetch episode sources from ${this.provider.name}: ${err}`);
693
+ }
694
+ };
695
+ /**
696
+ *
697
+ * @param episodeId Episode id
698
+ */
699
+ this.fetchEpisodeServers = async (episodeId) => {
700
+ try {
701
+ return this.provider.fetchEpisodeServers(episodeId);
702
+ }
703
+ catch (err) {
704
+ throw new Error(`Failed to fetch episode servers from ${this.provider.name}: ${err}`);
705
+ }
706
+ };
707
+ this.findAnime = async (title, season, startDate, malId, dub, anilistId, externalLinks) => {
708
+ var _b, _c, _d;
709
+ title.english = (_b = title.english) !== null && _b !== void 0 ? _b : title.romaji;
710
+ title.romaji = (_c = title.romaji) !== null && _c !== void 0 ? _c : title.english;
711
+ title.english = title.english.toLowerCase();
712
+ title.romaji = title.romaji.toLowerCase();
713
+ if (title.english === title.romaji) {
714
+ return ((_d = (await this.findAnimeSlug(title.english, season, startDate, malId, dub, anilistId, externalLinks))) !== null && _d !== void 0 ? _d : []);
715
+ }
716
+ const romajiPossibleEpisodes = await this.findAnimeSlug(title.romaji, season, startDate, malId, dub, anilistId, externalLinks);
717
+ if (romajiPossibleEpisodes) {
718
+ return romajiPossibleEpisodes;
719
+ }
720
+ const englishPossibleEpisodes = await this.findAnimeSlug(title.english, season, startDate, malId, dub, anilistId, externalLinks);
721
+ return englishPossibleEpisodes !== null && englishPossibleEpisodes !== void 0 ? englishPossibleEpisodes : [];
722
+ };
723
+ this.findAnimeSlug = async (title, season, startDate, malId, dub, anilistId, externalLinks) => {
724
+ var _b, _c, _d;
725
+ const slug = title.replace(/[^0-9a-zA-Z]+/g, ' ');
726
+ let possibleAnime;
727
+ if (!possibleAnime)
728
+ return undefined;
729
+ // To avoid a new request, lets match and see if the anime show found is in sub/dub
730
+ const expectedType = dub ? models_1.SubOrSub.DUB : models_1.SubOrSub.SUB;
731
+ // Have this as a fallback in the meantime for compatibility
732
+ if (possibleAnime.subOrDub) {
733
+ if (possibleAnime.subOrDub != models_1.SubOrSub.BOTH && possibleAnime.subOrDub != expectedType) {
734
+ return undefined;
735
+ }
736
+ }
737
+ else if ((!possibleAnime.hasDub && dub) || (!possibleAnime.hasSub && !dub)) {
738
+ return undefined;
739
+ }
740
+ if (this.provider instanceof hianime_1.default) {
741
+ // Set the correct episode sub/dub request type
742
+ possibleAnime.episodes.forEach((_, index) => {
743
+ if (possibleAnime.subOrDub === models_1.SubOrSub.BOTH) {
744
+ possibleAnime.episodes[index].id = possibleAnime.episodes[index].id.replace(`$both`, dub ? '$dub' : '$sub');
745
+ }
746
+ });
747
+ }
748
+ const possibleProviderEpisodes = possibleAnime.episodes;
749
+ if (typeof ((_b = possibleProviderEpisodes[0]) === null || _b === void 0 ? void 0 : _b.image) !== 'undefined' &&
750
+ typeof ((_c = possibleProviderEpisodes[0]) === null || _c === void 0 ? void 0 : _c.title) !== 'undefined' &&
751
+ typeof ((_d = possibleProviderEpisodes[0]) === null || _d === void 0 ? void 0 : _d.description) !== 'undefined')
752
+ return possibleProviderEpisodes;
753
+ const options = {
754
+ headers: { 'Content-Type': 'application/json' },
755
+ query: (0, utils_1.kitsuSearchQuery)(slug),
756
+ };
757
+ const newEpisodeList = await this.findKitsuAnime(possibleProviderEpisodes, options, season, startDate);
758
+ return newEpisodeList;
759
+ };
760
+ this.findKitsuAnime = async (possibleProviderEpisodes, options, season, startDate) => {
761
+ try {
762
+ const kitsuEpisodes = await this.client.post(this.kitsuGraphqlUrl, options);
763
+ const episodesList = new Map();
764
+ if (kitsuEpisodes === null || kitsuEpisodes === void 0 ? void 0 : kitsuEpisodes.data.data) {
765
+ const { nodes } = kitsuEpisodes.data.data.searchAnimeByTitle;
766
+ if (nodes) {
767
+ nodes.forEach((node) => {
768
+ var _b, _c;
769
+ if (node.season === season && node.startDate.trim().split('-')[0] === (startDate === null || startDate === void 0 ? void 0 : startDate.toString())) {
770
+ const episodes = node.episodes.nodes;
771
+ for (const episode of episodes) {
772
+ const i = episode === null || episode === void 0 ? void 0 : episode.number.toString().replace(/"/g, '');
773
+ let name = undefined;
774
+ let description = undefined;
775
+ let thumbnail = undefined;
776
+ let thumbnailHash = undefined;
777
+ if ((_b = episode === null || episode === void 0 ? void 0 : episode.description) === null || _b === void 0 ? void 0 : _b.en)
778
+ description = episode === null || episode === void 0 ? void 0 : episode.description.en.toString().replace(/"/g, '').replace('\\n', '\n');
779
+ if (episode === null || episode === void 0 ? void 0 : episode.thumbnail) {
780
+ thumbnail = episode === null || episode === void 0 ? void 0 : episode.thumbnail.original.url.toString().replace(/"/g, '');
781
+ thumbnailHash = (0, utils_2.getHashFromImage)(episode === null || episode === void 0 ? void 0 : episode.thumbnail.original.url.toString().replace(/"/g, ''));
782
+ }
783
+ if (episode) {
784
+ if ((_c = episode.titles) === null || _c === void 0 ? void 0 : _c.canonical)
785
+ name = episode.titles.canonical.toString().replace(/"/g, '');
786
+ episodesList.set(i, {
787
+ episodeNum: episode === null || episode === void 0 ? void 0 : episode.number.toString().replace(/"/g, ''),
788
+ title: name,
789
+ description,
790
+ createdAt: episode === null || episode === void 0 ? void 0 : episode.createdAt,
791
+ thumbnail,
792
+ });
793
+ continue;
794
+ }
795
+ episodesList.set(i, {
796
+ episodeNum: undefined,
797
+ title: undefined,
798
+ description: undefined,
799
+ createdAt: undefined,
800
+ thumbnail,
801
+ thumbnailHash,
802
+ });
803
+ }
804
+ }
805
+ });
806
+ }
807
+ }
808
+ const newEpisodeList = [];
809
+ if ((possibleProviderEpisodes === null || possibleProviderEpisodes === void 0 ? void 0 : possibleProviderEpisodes.length) !== 0) {
810
+ possibleProviderEpisodes === null || possibleProviderEpisodes === void 0 ? void 0 : possibleProviderEpisodes.forEach((ep, i) => {
811
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
812
+ const j = (i + 1).toString();
813
+ newEpisodeList.push({
814
+ id: ep.id,
815
+ title: (_d = (_b = ep.title) !== null && _b !== void 0 ? _b : (_c = episodesList.get(j)) === null || _c === void 0 ? void 0 : _c.title) !== null && _d !== void 0 ? _d : null,
816
+ image: (_g = (_e = ep.image) !== null && _e !== void 0 ? _e : (_f = episodesList.get(j)) === null || _f === void 0 ? void 0 : _f.thumbnail) !== null && _g !== void 0 ? _g : null,
817
+ imageHash: (0, utils_2.getHashFromImage)((_k = (_h = ep.image) !== null && _h !== void 0 ? _h : (_j = episodesList.get(j)) === null || _j === void 0 ? void 0 : _j.thumbnail) !== null && _k !== void 0 ? _k : null),
818
+ number: ep.number,
819
+ createdAt: (_o = (_l = ep.createdAt) !== null && _l !== void 0 ? _l : (_m = episodesList.get(j)) === null || _m === void 0 ? void 0 : _m.createdAt) !== null && _o !== void 0 ? _o : null,
820
+ description: (_r = (_p = ep.description) !== null && _p !== void 0 ? _p : (_q = episodesList.get(j)) === null || _q === void 0 ? void 0 : _q.description) !== null && _r !== void 0 ? _r : null,
821
+ url: (_s = ep.url) !== null && _s !== void 0 ? _s : null,
822
+ });
823
+ });
824
+ }
825
+ return newEpisodeList;
826
+ }
827
+ catch (error) {
828
+ return possibleProviderEpisodes;
829
+ }
830
+ };
831
+ /**
832
+ * @param page page number to search for (optional)
833
+ * @param perPage number of results per page (optional)
834
+ */
835
+ this.fetchTrendingAnime = async (page = 1, perPage = 10) => {
836
+ const options = {
837
+ headers: {
838
+ 'Content-Type': 'application/json',
839
+ Accept: 'application/json',
840
+ },
841
+ query: (0, utils_1.anilistTrendingQuery)(page, perPage),
842
+ };
843
+ try {
844
+ const { data } = await this.client.post(this.anilistGraphqlUrl, options);
845
+ const res = {
846
+ currentPage: data.data.Page.pageInfo.currentPage,
847
+ hasNextPage: data.data.Page.pageInfo.hasNextPage,
848
+ results: data.data.Page.media.map((item) => {
849
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
850
+ return ({
851
+ id: item.id.toString(),
852
+ malId: item.idMal,
853
+ title: item.title
854
+ ? {
855
+ romaji: item.title.romaji,
856
+ english: item.title.english,
857
+ native: item.title.native,
858
+ userPreferred: item.title.userPreferred,
859
+ }
860
+ : item.title.romaji,
861
+ image: (_c = (_b = item.coverImage.extraLarge) !== null && _b !== void 0 ? _b : item.coverImage.large) !== null && _c !== void 0 ? _c : item.coverImage.medium,
862
+ imageHash: (0, utils_2.getHashFromImage)((_e = (_d = item.coverImage.extraLarge) !== null && _d !== void 0 ? _d : item.coverImage.large) !== null && _e !== void 0 ? _e : item.coverImage.medium),
863
+ trailer: {
864
+ id: (_f = item.trailer) === null || _f === void 0 ? void 0 : _f.id,
865
+ site: (_g = item.trailer) === null || _g === void 0 ? void 0 : _g.site,
866
+ thumbnail: (_h = item.trailer) === null || _h === void 0 ? void 0 : _h.thumbnail,
867
+ thumbnailHash: (0, utils_2.getHashFromImage)((_j = item.trailer) === null || _j === void 0 ? void 0 : _j.thumbnail),
868
+ },
869
+ description: item.description,
870
+ status: item.status == 'RELEASING'
871
+ ? models_1.MediaStatus.ONGOING
872
+ : item.status == 'FINISHED'
873
+ ? models_1.MediaStatus.COMPLETED
874
+ : item.status == 'NOT_YET_RELEASED'
875
+ ? models_1.MediaStatus.NOT_YET_AIRED
876
+ : item.status == 'CANCELLED'
877
+ ? models_1.MediaStatus.CANCELLED
878
+ : item.status == 'HIATUS'
879
+ ? models_1.MediaStatus.HIATUS
880
+ : models_1.MediaStatus.UNKNOWN,
881
+ cover: (_m = (_l = (_k = item.bannerImage) !== null && _k !== void 0 ? _k : item.coverImage.extraLarge) !== null && _l !== void 0 ? _l : item.coverImage.large) !== null && _m !== void 0 ? _m : item.coverImage.medium,
882
+ coverHash: (0, utils_2.getHashFromImage)((_q = (_p = (_o = item.bannerImage) !== null && _o !== void 0 ? _o : item.coverImage.extraLarge) !== null && _p !== void 0 ? _p : item.coverImage.large) !== null && _q !== void 0 ? _q : item.coverImage.medium),
883
+ rating: item.averageScore,
884
+ releaseDate: item.seasonYear,
885
+ color: (_r = item.coverImage) === null || _r === void 0 ? void 0 : _r.color,
886
+ genres: item.genres,
887
+ totalEpisodes: isNaN(item.episodes) ? 0 : item.episodes,
888
+ duration: item.duration,
889
+ type: item.format,
890
+ });
891
+ }),
892
+ };
893
+ return res;
894
+ }
895
+ catch (err) {
896
+ throw new Error(err.message);
897
+ }
898
+ };
899
+ /**
900
+ *
901
+ * @param page page number to search for (optional)
902
+ * @param perPage number of results per page (optional)
903
+ */
904
+ this.fetchPopularAnime = async (page = 1, perPage = 10) => {
905
+ const options = {
906
+ headers: {
907
+ 'Content-Type': 'application/json',
908
+ Accept: 'application/json',
909
+ },
910
+ query: (0, utils_1.anilistPopularQuery)(page, perPage),
911
+ };
912
+ try {
913
+ const { data } = await this.client.post(this.anilistGraphqlUrl, options);
914
+ const res = {
915
+ currentPage: data.data.Page.pageInfo.currentPage,
916
+ hasNextPage: data.data.Page.pageInfo.hasNextPage,
917
+ results: data.data.Page.media.map((item) => {
918
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
919
+ return ({
920
+ id: item.id.toString(),
921
+ malId: item.idMal,
922
+ title: item.title
923
+ ? {
924
+ romaji: item.title.romaji,
925
+ english: item.title.english,
926
+ native: item.title.native,
927
+ userPreferred: item.title.userPreferred,
928
+ }
929
+ : item.title.romaji,
930
+ image: (_c = (_b = item.coverImage.extraLarge) !== null && _b !== void 0 ? _b : item.coverImage.large) !== null && _c !== void 0 ? _c : item.coverImage.medium,
931
+ imageHash: (0, utils_2.getHashFromImage)((_e = (_d = item.coverImage.extraLarge) !== null && _d !== void 0 ? _d : item.coverImage.large) !== null && _e !== void 0 ? _e : item.coverImage.medium),
932
+ trailer: {
933
+ id: (_f = item.trailer) === null || _f === void 0 ? void 0 : _f.id,
934
+ site: (_g = item.trailer) === null || _g === void 0 ? void 0 : _g.site,
935
+ thumbnail: (_h = item.trailer) === null || _h === void 0 ? void 0 : _h.thumbnail,
936
+ thumbnailHash: (0, utils_2.getHashFromImage)((_j = item.trailer) === null || _j === void 0 ? void 0 : _j.thumbnail),
937
+ },
938
+ description: item.description,
939
+ status: item.status == 'RELEASING'
940
+ ? models_1.MediaStatus.ONGOING
941
+ : item.status == 'FINISHED'
942
+ ? models_1.MediaStatus.COMPLETED
943
+ : item.status == 'NOT_YET_RELEASED'
944
+ ? models_1.MediaStatus.NOT_YET_AIRED
945
+ : item.status == 'CANCELLED'
946
+ ? models_1.MediaStatus.CANCELLED
947
+ : item.status == 'HIATUS'
948
+ ? models_1.MediaStatus.HIATUS
949
+ : models_1.MediaStatus.UNKNOWN,
950
+ cover: (_m = (_l = (_k = item.bannerImage) !== null && _k !== void 0 ? _k : item.coverImage.extraLarge) !== null && _l !== void 0 ? _l : item.coverImage.large) !== null && _m !== void 0 ? _m : item.coverImage.medium,
951
+ coverHash: (0, utils_2.getHashFromImage)((_q = (_p = (_o = item.bannerImage) !== null && _o !== void 0 ? _o : item.coverImage.extraLarge) !== null && _p !== void 0 ? _p : item.coverImage.large) !== null && _q !== void 0 ? _q : item.coverImage.medium),
952
+ rating: item.averageScore,
953
+ releaseDate: item.seasonYear,
954
+ color: (_r = item.coverImage) === null || _r === void 0 ? void 0 : _r.color,
955
+ genres: item.genres,
956
+ totalEpisodes: isNaN(item.episodes) ? 0 : item.episodes,
957
+ duration: item.duration,
958
+ type: item.format,
959
+ });
960
+ }),
961
+ };
962
+ return res;
963
+ }
964
+ catch (err) {
965
+ throw new Error(err.message);
966
+ }
967
+ };
968
+ /**
969
+ *
970
+ * @param page page number (optional)
971
+ * @param perPage number of results per page (optional)
972
+ * @param weekStart Filter by the start of the week (optional) (default: todays date) (options: 2 = Monday, 3 = Tuesday, 4 = Wednesday, 5 = Thursday, 6 = Friday, 0 = Saturday, 1 = Sunday) you can use either the number or the string
973
+ * @param weekEnd Filter by the end of the week (optional) similar to weekStart
974
+ * @param notYetAired if true will return anime that have not yet aired (optional)
975
+ * @returns the next airing episodes
976
+ */
977
+ this.fetchAiringSchedule = async (page = 1, perPage = 20, weekStart = (new Date().getDay() + 1) % 7, weekEnd = (new Date().getDay() + 7) % 7, notYetAired = false) => {
978
+ let day1, day2 = undefined;
979
+ if (typeof weekStart === 'string' && typeof weekEnd === 'string')
980
+ [day1, day2] = (0, utils_1.getDays)((0, utils_1.capitalizeFirstLetter)(weekStart.toLowerCase()), (0, utils_1.capitalizeFirstLetter)(weekEnd.toLowerCase()));
981
+ else if (typeof weekStart === 'number' && typeof weekEnd === 'number')
982
+ [day1, day2] = [weekStart, weekEnd];
983
+ else
984
+ throw new Error('Invalid weekStart or weekEnd');
985
+ const options = {
986
+ headers: {
987
+ 'Content-Type': 'application/json',
988
+ Accept: 'application/json',
989
+ },
990
+ query: (0, utils_1.anilistAiringScheduleQuery)(page, perPage, day1, day2, notYetAired),
991
+ };
992
+ try {
993
+ const { data } = await this.client.post(this.anilistGraphqlUrl, options);
994
+ const res = {
995
+ currentPage: data.data.Page.pageInfo.currentPage,
996
+ hasNextPage: data.data.Page.pageInfo.hasNextPage,
997
+ results: data.data.Page.airingSchedules.map((item) => {
998
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
999
+ return ({
1000
+ id: item.media.id.toString(),
1001
+ malId: item.media.idMal,
1002
+ episode: item.episode,
1003
+ airingAt: item.airingAt,
1004
+ title: item.media.title
1005
+ ? {
1006
+ romaji: item.media.title.romaji,
1007
+ english: item.media.title.english,
1008
+ native: item.media.title.native,
1009
+ userPreferred: item.media.title.userPreferred,
1010
+ }
1011
+ : item.media.title.romaji,
1012
+ country: item.media.countryOfOrigin,
1013
+ image: (_c = (_b = item.media.coverImage.extraLarge) !== null && _b !== void 0 ? _b : item.media.coverImage.large) !== null && _c !== void 0 ? _c : item.media.coverImage.medium,
1014
+ imageHash: (0, utils_2.getHashFromImage)((_e = (_d = item.media.coverImage.extraLarge) !== null && _d !== void 0 ? _d : item.media.coverImage.large) !== null && _e !== void 0 ? _e : item.media.coverImage.medium),
1015
+ description: item.media.description,
1016
+ cover: (_h = (_g = (_f = item.media.bannerImage) !== null && _f !== void 0 ? _f : item.media.coverImage.extraLarge) !== null && _g !== void 0 ? _g : item.media.coverImage.large) !== null && _h !== void 0 ? _h : item.media.coverImage.medium,
1017
+ coverHash: (0, utils_2.getHashFromImage)((_l = (_k = (_j = item.media.bannerImage) !== null && _j !== void 0 ? _j : item.media.coverImage.extraLarge) !== null && _k !== void 0 ? _k : item.media.coverImage.large) !== null && _l !== void 0 ? _l : item.media.coverImage.medium),
1018
+ genres: item.media.genres,
1019
+ color: (_m = item.media.coverImage) === null || _m === void 0 ? void 0 : _m.color,
1020
+ rating: item.media.averageScore,
1021
+ releaseDate: item.media.seasonYear,
1022
+ type: item.media.format,
1023
+ });
1024
+ }),
1025
+ };
1026
+ return res;
1027
+ }
1028
+ catch (err) {
1029
+ throw new Error(err.message);
1030
+ }
1031
+ };
1032
+ /**
1033
+ *
1034
+ * @param genres An array of genres to filter by (optional) genres: [`Action`, `Adventure`, `Cars`, `Comedy`, `Drama`, `Fantasy`, `Horror`, `Mahou Shoujo`, `Mecha`, `Music`, `Mystery`, `Psychological`, `Romance`, `Sci-Fi`, `Slice of Life`, `Sports`, `Supernatural`, `Thriller`]
1035
+ * @param page page number (optional)
1036
+ * @param perPage number of results per page (optional)
1037
+ */
1038
+ this.fetchAnimeGenres = async (genres, page = 1, perPage = 20) => {
1039
+ if (genres.length === 0)
1040
+ throw new Error('No genres specified');
1041
+ for (const genre of genres)
1042
+ if (!Object.values(models_1.Genres).includes(genre))
1043
+ throw new Error('Invalid genre');
1044
+ const options = {
1045
+ headers: {
1046
+ 'Content-Type': 'application/json',
1047
+ Accept: 'application/json',
1048
+ },
1049
+ query: (0, utils_1.anilistGenresQuery)(genres, page, perPage),
1050
+ };
1051
+ try {
1052
+ const { data } = await this.client.post(this.anilistGraphqlUrl, options);
1053
+ const res = {
1054
+ currentPage: data.data.Page.pageInfo.currentPage,
1055
+ hasNextPage: data.data.Page.pageInfo.hasNextPage,
1056
+ results: data.data.Page.media.map((item) => {
1057
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
1058
+ return ({
1059
+ id: item.id.toString(),
1060
+ malId: item.idMal,
1061
+ title: item.title
1062
+ ? {
1063
+ romaji: item.title.romaji,
1064
+ english: item.title.english,
1065
+ native: item.title.native,
1066
+ userPreferred: item.title.userPreferred,
1067
+ }
1068
+ : item.title.romaji,
1069
+ image: (_c = (_b = item.coverImage.extraLarge) !== null && _b !== void 0 ? _b : item.coverImage.large) !== null && _c !== void 0 ? _c : item.coverImage.medium,
1070
+ imageHash: (0, utils_2.getHashFromImage)((_e = (_d = item.coverImage.extraLarge) !== null && _d !== void 0 ? _d : item.coverImage.large) !== null && _e !== void 0 ? _e : item.coverImage.medium),
1071
+ trailer: {
1072
+ id: (_f = item.trailer) === null || _f === void 0 ? void 0 : _f.id,
1073
+ site: (_g = item.trailer) === null || _g === void 0 ? void 0 : _g.site,
1074
+ thumbnail: (_h = item.trailer) === null || _h === void 0 ? void 0 : _h.thumbnail,
1075
+ thumbnailHash: (0, utils_2.getHashFromImage)((_j = item.trailer) === null || _j === void 0 ? void 0 : _j.thumbnail),
1076
+ },
1077
+ description: item.description,
1078
+ cover: (_m = (_l = (_k = item.bannerImage) !== null && _k !== void 0 ? _k : item.coverImage.extraLarge) !== null && _l !== void 0 ? _l : item.coverImage.large) !== null && _m !== void 0 ? _m : item.coverImage.medium,
1079
+ coverHash: (0, utils_2.getHashFromImage)((_q = (_p = (_o = item.bannerImage) !== null && _o !== void 0 ? _o : item.coverImage.extraLarge) !== null && _p !== void 0 ? _p : item.coverImage.large) !== null && _q !== void 0 ? _q : item.coverImage.medium),
1080
+ rating: item.averageScore,
1081
+ releaseDate: item.seasonYear,
1082
+ color: (_r = item.coverImage) === null || _r === void 0 ? void 0 : _r.color,
1083
+ genres: item.genres,
1084
+ totalEpisodes: isNaN(item.episodes) ? 0 : item.episodes,
1085
+ duration: item.duration,
1086
+ type: item.format,
1087
+ });
1088
+ }),
1089
+ };
1090
+ return res;
1091
+ }
1092
+ catch (err) {
1093
+ throw new Error(err.message);
1094
+ }
1095
+ };
1096
+ this.findAnimeRaw = async (title) => {
1097
+ const searchTerm = (title === null || title === void 0 ? void 0 : title.romaji) || (title === null || title === void 0 ? void 0 : title.english) || (title === null || title === void 0 ? void 0 : title.userPreferred) || '';
1098
+ const findAnime = (await this.provider.search(searchTerm));
1099
+ if (!(findAnime === null || findAnime === void 0 ? void 0 : findAnime.results)) {
1100
+ return {};
1101
+ }
1102
+ // Run similar title searches in parallel
1103
+ const [mappedEng, mappedRom] = await Promise.all([
1104
+ Promise.resolve((0, utils_2.findSimilarTitles)((title === null || title === void 0 ? void 0 : title.english) || '', findAnime.results)),
1105
+ Promise.resolve((0, utils_2.findSimilarTitles)((title === null || title === void 0 ? void 0 : title.romaji) || '', findAnime.results)),
1106
+ ]);
1107
+ // Use Set for efficient deduplication
1108
+ const uniqueResults = Array.from(new Set([...mappedEng, ...mappedRom].map(item => JSON.stringify(item)))).map(str => JSON.parse(str));
1109
+ // Sort by similarity score
1110
+ uniqueResults.sort((a, b) => (b.similarity || 0) - (a.similarity || 0));
1111
+ const mappings = {};
1112
+ for (const obj of uniqueResults) {
1113
+ const match = obj.title.replace(/\(TV\)/g, '').match(/\(([^)0-9]+)\)/);
1114
+ const key = match ? match[1].replace(/\s+/g, '-').toLowerCase() : 'sub';
1115
+ if (!mappings[key]) {
1116
+ mappings[key] = obj.id;
1117
+ }
1118
+ // Early return if we have both sub and dub
1119
+ if (mappings.sub && mappings.dub)
1120
+ break;
1121
+ }
1122
+ // console.log('mappings', mappings);
1123
+ // console.time('animeinfo');
1124
+ const animeInfo = await this.provider.fetchAnimeInfo(mappings.sub || mappings.dub);
1125
+ // console.timeEnd('animeinfo');
1126
+ return animeInfo.episodes;
1127
+ };
1128
+ /**
1129
+ * @returns a random anime
1130
+ */
1131
+ this.fetchRandomAnime = async () => {
1132
+ const options = {
1133
+ headers: {
1134
+ 'Content-Type': 'application/json',
1135
+ Accept: 'application/json',
1136
+ },
1137
+ query: (0, utils_1.anilistSiteStatisticsQuery)(),
1138
+ };
1139
+ try {
1140
+ // const {
1141
+ // data: { data },
1142
+ // } = await this.client.post(this.anilistGraphqlUrl, options);
1143
+ // const selectedAnime = Math.floor(
1144
+ // Math.random() * data.SiteStatistics.anime.nodes[data.SiteStatistics.anime.nodes.length - 1].count
1145
+ // );
1146
+ // const { results } = await this.advancedSearch(undefined, 'ANIME', Math.ceil(selectedAnime / 50), 50);
1147
+ const { data: data } = await this.client.get('https://raw.githubusercontent.com/5H4D0WILA/IDFetch/main/ids.txt');
1148
+ const ids = data === null || data === void 0 ? void 0 : data.trim().split('\n');
1149
+ const selectedAnime = Math.floor(Math.random() * ids.length);
1150
+ return await this.fetchAnimeInfo(ids[selectedAnime]);
1151
+ }
1152
+ catch (err) {
1153
+ throw new Error(err.message);
1154
+ }
1155
+ };
1156
+ /**
1157
+ * @param provider The provider to get the episode Ids from (optional) default: `gogoanime` (options: `gogoanime`, `Hianime`)
1158
+ * @param page page number (optional)
1159
+ * @param perPage number of results per page (optional)
1160
+ */
1161
+ this.fetchRecentEpisodes = async (provider = 'gogoanime', page = 1, perPage = 25) => {
1162
+ try {
1163
+ const { data } = await this.client.get(`${this.anifyUrl}/recent?page=${page}&perPage=${perPage}&type=anime`);
1164
+ const results = data === null || data === void 0 ? void 0 : data.map((item) => {
1165
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
1166
+ return {
1167
+ id: item.id.toString(),
1168
+ malId: (_b = item.mappings.find((item) => item.providerType === 'META' && item.providerId === 'mal')) === null || _b === void 0 ? void 0 : _b.id,
1169
+ title: {
1170
+ romaji: (_c = item.title) === null || _c === void 0 ? void 0 : _c.romaji,
1171
+ english: (_d = item.title) === null || _d === void 0 ? void 0 : _d.english,
1172
+ native: (_e = item.title) === null || _e === void 0 ? void 0 : _e.native,
1173
+ // userPreferred: (_f = item.title) === null || _f === void 0 ? void 0 : _f.userPreferred,
1174
+ },
1175
+ image: (_f = item.coverImage) !== null && _f !== void 0 ? _f : item.bannerImage,
1176
+ imageHash: (0, utils_2.getHashFromImage)((_g = item.coverImage) !== null && _g !== void 0 ? _g : item.bannerImage),
1177
+ rating: item.averageScore,
1178
+ color: (_h = item.anime) === null || _h === void 0 ? void 0 : _h.color,
1179
+ episodeId: `${provider === 'gogoanime'
1180
+ ? (_k = (_j = item.episodes.data
1181
+ .find((source) => source.providerId.toLowerCase() === 'gogoanime')) === null || _j === void 0 ? void 0 : _j.episodes.pop()) === null || _k === void 0 ? void 0 : _k.id
1182
+ : (_m = (_l = item.episodes.data
1183
+ .find((source) => source.providerId.toLowerCase() === 'hianime')) === null || _l === void 0 ? void 0 : _l.episodes.pop()) === null || _m === void 0 ? void 0 : _m.id}`,
1184
+ episodeTitle: (_o = item.episodes.latest.latestTitle) !== null && _o !== void 0 ? _o : `Episode ${item.currentEpisode}`,
1185
+ episodeNumber: item.currentEpisode,
1186
+ genres: item.genre,
1187
+ type: item.format,
1188
+ };
1189
+ });
1190
+ // results = results.filter((item) => item.episodeNumber !== 0 &&
1191
+ // item.episodeId.replace('-enime', '').length > 0 &&
1192
+ // item.episodeId.replace('-enime', '') !== 'undefined');
1193
+ return {
1194
+ currentPage: page,
1195
+ // hasNextPage: meta.lastPage !== page,
1196
+ // totalPages: meta.lastPage,
1197
+ totalResults: results === null || results === void 0 ? void 0 : results.length,
1198
+ results: results,
1199
+ };
1200
+ }
1201
+ catch (err) {
1202
+ throw new Error(err.message);
1203
+ }
1204
+ };
1205
+ this.fetchDefaultEpisodeList = async (Media, dub, id) => {
1206
+ var _b, _c;
1207
+ let episodes = [];
1208
+ episodes = await this.findAnimeRaw({ english: (_b = Media.title) === null || _b === void 0 ? void 0 : _b.english, romaji: (_c = Media.title) === null || _c === void 0 ? void 0 : _c.romaji });
1209
+ // console.log('fetchDefaultEpisodeList', episodes);
1210
+ return episodes;
1211
+ };
1212
+ /**
1213
+ * @param id anilist id
1214
+ * @param dub language of the dubbed version (optional) currently only works for gogoanime
1215
+ * @param fetchFiller to get filler boolean on the episode object (optional) set to `true` to get filler boolean on the episode object.
1216
+ * @returns episode list **(without anime info)**
1217
+ */
1218
+ this.fetchEpisodesListById = async (id, dub = false, fetchFiller = false) => {
1219
+ var _b;
1220
+ const options = {
1221
+ headers: {
1222
+ 'Content-Type': 'application/json',
1223
+ Accept: 'application/json',
1224
+ },
1225
+ query: `query($id: Int = ${id}){ Media(id: $id){ idMal externalLinks { site url } title { romaji english } status season episodes startDate { year month day } endDate { year month day } coverImage {extraLarge large medium} } }`,
1226
+ };
1227
+ const { data: { data: { Media }, }, } = await this.client.post(this.anilistGraphqlUrl, options);
1228
+ let possibleAnimeEpisodes = [];
1229
+ let fillerEpisodes = [];
1230
+ if (this.provider instanceof hianime_1.default &&
1231
+ !dub &&
1232
+ (Media.status === 'RELEASING' ||
1233
+ (0, utils_1.range)({ from: 2000, to: new Date().getFullYear() + 1 }).includes(parseInt((_b = Media.startDate) === null || _b === void 0 ? void 0 : _b.year)))) {
1234
+ try {
1235
+ // NOTE: gotta fix in future
1236
+ // possibleAnimeEpisodes = (
1237
+ // await new Anify().fetchAnimeInfoByAnilistId(
1238
+ // id,
1239
+ // this.provider.name.toLowerCase() as 'gogoanime' | 'Hianime'
1240
+ // )
1241
+ // ).episodes?.map((item: any) => ({
1242
+ // id: item.slug,
1243
+ // title: item.title,
1244
+ // description: item.description,
1245
+ // number: item.number,
1246
+ // image: item.image,
1247
+ // imageHash: getHashFromImage(item.image),
1248
+ // }))!;
1249
+ if (!possibleAnimeEpisodes.length) {
1250
+ possibleAnimeEpisodes = await this.fetchDefaultEpisodeList(Media, dub, id);
1251
+ possibleAnimeEpisodes = possibleAnimeEpisodes === null || possibleAnimeEpisodes === void 0 ? void 0 : possibleAnimeEpisodes.map((episode) => {
1252
+ var _b, _c, _d, _e;
1253
+ if (!episode.image) {
1254
+ episode.image =
1255
+ (_c = (_b = Media.coverImage.extraLarge) !== null && _b !== void 0 ? _b : Media.coverImage.large) !== null && _c !== void 0 ? _c : Media.coverImage.medium;
1256
+ episode.imageHash = (0, utils_2.getHashFromImage)((_e = (_d = Media.coverImage.extraLarge) !== null && _d !== void 0 ? _d : Media.coverImage.large) !== null && _e !== void 0 ? _e : Media.coverImage.medium);
1257
+ }
1258
+ return episode;
1259
+ });
1260
+ }
1261
+ }
1262
+ catch (err) {
1263
+ possibleAnimeEpisodes = await this.fetchDefaultEpisodeList(Media, dub, id);
1264
+ possibleAnimeEpisodes = possibleAnimeEpisodes === null || possibleAnimeEpisodes === void 0 ? void 0 : possibleAnimeEpisodes.map((episode) => {
1265
+ var _b, _c, _d, _e;
1266
+ if (!episode.image) {
1267
+ episode.image = (_c = (_b = Media.coverImage.extraLarge) !== null && _b !== void 0 ? _b : Media.coverImage.large) !== null && _c !== void 0 ? _c : Media.coverImage.medium;
1268
+ episode.imageHash = (0, utils_2.getHashFromImage)((_e = (_d = Media.coverImage.extraLarge) !== null && _d !== void 0 ? _d : Media.coverImage.large) !== null && _e !== void 0 ? _e : Media.coverImage.medium);
1269
+ }
1270
+ return episode;
1271
+ });
1272
+ return possibleAnimeEpisodes;
1273
+ }
1274
+ }
1275
+ else
1276
+ possibleAnimeEpisodes = await this.fetchDefaultEpisodeList(Media, dub, id);
1277
+ if (fetchFiller) {
1278
+ const { data: fillerData } = await this.client.get(`https://raw.githubusercontent.com/saikou-app/mal-id-filler-list/main/fillers/${Media.idMal}.json`, {
1279
+ validateStatus: () => true,
1280
+ });
1281
+ if (!fillerData.toString().startsWith('404')) {
1282
+ fillerEpisodes = [];
1283
+ fillerEpisodes === null || fillerEpisodes === void 0 ? void 0 : fillerEpisodes.push(...fillerData.episodes);
1284
+ }
1285
+ }
1286
+ possibleAnimeEpisodes = possibleAnimeEpisodes === null || possibleAnimeEpisodes === void 0 ? void 0 : possibleAnimeEpisodes.map((episode) => {
1287
+ var _b, _c, _d, _e;
1288
+ if (!episode.image) {
1289
+ episode.image = (_c = (_b = Media.coverImage.extraLarge) !== null && _b !== void 0 ? _b : Media.coverImage.large) !== null && _c !== void 0 ? _c : Media.coverImage.medium;
1290
+ episode.imageHash = (0, utils_2.getHashFromImage)((_e = (_d = Media.coverImage.extraLarge) !== null && _d !== void 0 ? _d : Media.coverImage.large) !== null && _e !== void 0 ? _e : Media.coverImage.medium);
1291
+ }
1292
+ if (fetchFiller && (fillerEpisodes === null || fillerEpisodes === void 0 ? void 0 : fillerEpisodes.length) > 0 && (fillerEpisodes === null || fillerEpisodes === void 0 ? void 0 : fillerEpisodes.length) >= Media.episodes) {
1293
+ if (fillerEpisodes[episode.number - 1])
1294
+ episode.isFiller = new Boolean(fillerEpisodes[episode.number - 1]['filler-bool']).valueOf();
1295
+ }
1296
+ return episode;
1297
+ });
1298
+ return possibleAnimeEpisodes;
1299
+ };
1300
+ /**
1301
+ * @param id anilist id
1302
+ * @returns anilist data for the anime **(without episodes)** (use `fetchEpisodesListById` to get the episodes) (use `fetchAnimeInfo` to get both)
1303
+ */
1304
+ this.fetchAnilistInfoById = async (id) => {
1305
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5;
1306
+ const animeInfo = {
1307
+ id: id,
1308
+ title: '',
1309
+ };
1310
+ const options = {
1311
+ headers: {
1312
+ 'Content-Type': 'application/json',
1313
+ Accept: 'application/json',
1314
+ },
1315
+ query: (0, utils_1.anilistMediaDetailQuery)(id),
1316
+ };
1317
+ try {
1318
+ const { data } = await this.client.post(this.anilistGraphqlUrl, options).catch(() => {
1319
+ throw new Error('Media not found');
1320
+ });
1321
+ animeInfo.malId = data.data.Media.idMal;
1322
+ animeInfo.title = {
1323
+ romaji: data.data.Media.title.romaji,
1324
+ english: data.data.Media.title.english,
1325
+ native: data.data.Media.title.native,
1326
+ userPreferred: data.data.Media.title.userPreferred,
1327
+ };
1328
+ if ((_b = data.data.Media.trailer) === null || _b === void 0 ? void 0 : _b.id) {
1329
+ animeInfo.trailer = {
1330
+ id: (_c = data.data.Media.trailer) === null || _c === void 0 ? void 0 : _c.id,
1331
+ site: (_d = data.data.Media.trailer) === null || _d === void 0 ? void 0 : _d.site,
1332
+ thumbnail: (_e = data.data.Media.trailer) === null || _e === void 0 ? void 0 : _e.thumbnail,
1333
+ thumbnailHash: (0, utils_2.getHashFromImage)((_f = data.data.Media.trailer) === null || _f === void 0 ? void 0 : _f.thumbnail),
1334
+ };
1335
+ }
1336
+ animeInfo.synonyms = data.data.Media.synonyms;
1337
+ animeInfo.isLicensed = data.data.Media.isLicensed;
1338
+ animeInfo.isAdult = data.data.Media.isAdult;
1339
+ animeInfo.countryOfOrigin = data.data.Media.countryOfOrigin;
1340
+ animeInfo.image =
1341
+ (_h = (_g = data.data.Media.coverImage.extraLarge) !== null && _g !== void 0 ? _g : data.data.Media.coverImage.large) !== null && _h !== void 0 ? _h : data.data.Media.coverImage.medium;
1342
+ animeInfo.imageHash = (0, utils_2.getHashFromImage)((_k = (_j = data.data.Media.coverImage.extraLarge) !== null && _j !== void 0 ? _j : data.data.Media.coverImage.large) !== null && _k !== void 0 ? _k : data.data.Media.coverImage.medium);
1343
+ animeInfo.cover = (_l = data.data.Media.bannerImage) !== null && _l !== void 0 ? _l : animeInfo.image;
1344
+ animeInfo.coverHash = (0, utils_2.getHashFromImage)((_m = data.data.Media.bannerImage) !== null && _m !== void 0 ? _m : animeInfo.image);
1345
+ animeInfo.description = data.data.Media.description;
1346
+ switch (data.data.Media.status) {
1347
+ case 'RELEASING':
1348
+ animeInfo.status = models_1.MediaStatus.ONGOING;
1349
+ break;
1350
+ case 'FINISHED':
1351
+ animeInfo.status = models_1.MediaStatus.COMPLETED;
1352
+ break;
1353
+ case 'NOT_YET_RELEASED':
1354
+ animeInfo.status = models_1.MediaStatus.NOT_YET_AIRED;
1355
+ break;
1356
+ case 'CANCELLED':
1357
+ animeInfo.status = models_1.MediaStatus.CANCELLED;
1358
+ break;
1359
+ case 'HIATUS':
1360
+ animeInfo.status = models_1.MediaStatus.HIATUS;
1361
+ default:
1362
+ animeInfo.status = models_1.MediaStatus.UNKNOWN;
1363
+ }
1364
+ animeInfo.releaseDate = data.data.Media.startDate.year;
1365
+ if ((_o = data.data.Media.nextAiringEpisode) === null || _o === void 0 ? void 0 : _o.airingAt)
1366
+ animeInfo.nextAiringEpisode = {
1367
+ airingTime: (_p = data.data.Media.nextAiringEpisode) === null || _p === void 0 ? void 0 : _p.airingAt,
1368
+ timeUntilAiring: (_q = data.data.Media.nextAiringEpisode) === null || _q === void 0 ? void 0 : _q.timeUntilAiring,
1369
+ episode: (_r = data.data.Media.nextAiringEpisode) === null || _r === void 0 ? void 0 : _r.episode,
1370
+ };
1371
+ animeInfo.totalEpisodes = (_t = (_s = data.data.Media) === null || _s === void 0 ? void 0 : _s.episodes) !== null && _t !== void 0 ? _t : ((_u = data.data.Media.nextAiringEpisode) === null || _u === void 0 ? void 0 : _u.episode) - 1;
1372
+ animeInfo.totalChapters = data.data.Media.chapters;
1373
+ animeInfo.currentEpisode = ((_w = (_v = data.data.Media) === null || _v === void 0 ? void 0 : _v.nextAiringEpisode) === null || _w === void 0 ? void 0 : _w.episode)
1374
+ ? ((_x = data.data.Media.nextAiringEpisode) === null || _x === void 0 ? void 0 : _x.episode) - 1
1375
+ : ((_y = data.data.Media) === null || _y === void 0 ? void 0 : _y.episodes) || undefined;
1376
+ animeInfo.rating = data.data.Media.averageScore;
1377
+ animeInfo.duration = data.data.Media.duration;
1378
+ animeInfo.genres = data.data.Media.genres;
1379
+ animeInfo.studios = data.data.Media.studios.edges.map((item) => item.node.name);
1380
+ animeInfo.season = data.data.Media.season;
1381
+ animeInfo.popularity = data.data.Media.popularity;
1382
+ animeInfo.type = data.data.Media.format;
1383
+ animeInfo.startDate = {
1384
+ year: (_z = data.data.Media.startDate) === null || _z === void 0 ? void 0 : _z.year,
1385
+ month: (_0 = data.data.Media.startDate) === null || _0 === void 0 ? void 0 : _0.month,
1386
+ day: (_1 = data.data.Media.startDate) === null || _1 === void 0 ? void 0 : _1.day,
1387
+ };
1388
+ animeInfo.endDate = {
1389
+ year: (_2 = data.data.Media.endDate) === null || _2 === void 0 ? void 0 : _2.year,
1390
+ month: (_3 = data.data.Media.endDate) === null || _3 === void 0 ? void 0 : _3.month,
1391
+ day: (_4 = data.data.Media.endDate) === null || _4 === void 0 ? void 0 : _4.day,
1392
+ };
1393
+ animeInfo.recommendations = data.data.Media.recommendations.edges.map((item) => {
1394
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
1395
+ return ({
1396
+ id: item.node.mediaRecommendation.id,
1397
+ malId: item.node.mediaRecommendation.idMal,
1398
+ title: {
1399
+ romaji: item.node.mediaRecommendation.title.romaji,
1400
+ english: item.node.mediaRecommendation.title.english,
1401
+ native: item.node.mediaRecommendation.title.native,
1402
+ userPreferred: item.node.mediaRecommendation.title.userPreferred,
1403
+ },
1404
+ status: item.node.mediaRecommendation.status == 'RELEASING'
1405
+ ? models_1.MediaStatus.ONGOING
1406
+ : item.node.mediaRecommendation.status == 'FINISHED'
1407
+ ? models_1.MediaStatus.COMPLETED
1408
+ : item.node.mediaRecommendation.status == 'NOT_YET_RELEASED'
1409
+ ? models_1.MediaStatus.NOT_YET_AIRED
1410
+ : item.node.mediaRecommendation.status == 'CANCELLED'
1411
+ ? models_1.MediaStatus.CANCELLED
1412
+ : item.node.mediaRecommendation.status == 'HIATUS'
1413
+ ? models_1.MediaStatus.HIATUS
1414
+ : models_1.MediaStatus.UNKNOWN,
1415
+ episodes: item.node.mediaRecommendation.episodes,
1416
+ chapters: item.node.mediaRecommendation.chapters,
1417
+ image: (_c = (_b = item.node.mediaRecommendation.coverImage.extraLarge) !== null && _b !== void 0 ? _b : item.node.mediaRecommendation.coverImage.large) !== null && _c !== void 0 ? _c : item.node.mediaRecommendation.coverImage.medium,
1418
+ imageHash: (0, utils_2.getHashFromImage)((_e = (_d = item.node.mediaRecommendation.coverImage.extraLarge) !== null && _d !== void 0 ? _d : item.node.mediaRecommendation.coverImage.large) !== null && _e !== void 0 ? _e : item.node.mediaRecommendation.coverImage.medium),
1419
+ cover: (_h = (_g = (_f = item.node.mediaRecommendation.bannerImage) !== null && _f !== void 0 ? _f : item.node.mediaRecommendation.coverImage.extraLarge) !== null && _g !== void 0 ? _g : item.node.mediaRecommendation.coverImage.large) !== null && _h !== void 0 ? _h : item.node.mediaRecommendation.coverImage.medium,
1420
+ coverHash: (_l = (_k = (_j = item.node.mediaRecommendation.bannerImage) !== null && _j !== void 0 ? _j : item.node.mediaRecommendation.coverImage.extraLarge) !== null && _k !== void 0 ? _k : item.node.mediaRecommendation.coverImage.large) !== null && _l !== void 0 ? _l : item.node.mediaRecommendation.coverImage.medium,
1421
+ rating: item.node.mediaRecommendation.meanScore,
1422
+ type: item.node.mediaRecommendation.format,
1423
+ });
1424
+ });
1425
+ animeInfo.characters = data.data.Media.characters.edges.map((item) => {
1426
+ var _b, _c;
1427
+ return ({
1428
+ id: item.node.id,
1429
+ role: item.role,
1430
+ name: {
1431
+ first: item.node.name.first,
1432
+ last: item.node.name.last,
1433
+ full: item.node.name.full,
1434
+ native: item.node.name.native,
1435
+ userPreferred: item.node.name.userPreferred,
1436
+ },
1437
+ image: (_b = item.node.image.large) !== null && _b !== void 0 ? _b : item.node.image.medium,
1438
+ imageHash: (0, utils_2.getHashFromImage)((_c = item.node.image.large) !== null && _c !== void 0 ? _c : item.node.image.medium),
1439
+ voiceActors: item.voiceActors.map((voiceActor) => {
1440
+ var _b, _c;
1441
+ return ({
1442
+ id: voiceActor.id,
1443
+ language: voiceActor.languageV2,
1444
+ name: {
1445
+ first: voiceActor.name.first,
1446
+ last: voiceActor.name.last,
1447
+ full: voiceActor.name.full,
1448
+ native: voiceActor.name.native,
1449
+ userPreferred: voiceActor.name.userPreferred,
1450
+ },
1451
+ image: (_b = voiceActor.image.large) !== null && _b !== void 0 ? _b : voiceActor.image.medium,
1452
+ imageHash: (0, utils_2.getHashFromImage)((_c = voiceActor.image.large) !== null && _c !== void 0 ? _c : voiceActor.image.medium),
1453
+ });
1454
+ }),
1455
+ });
1456
+ });
1457
+ animeInfo.color = (_5 = data.data.Media.coverImage) === null || _5 === void 0 ? void 0 : _5.color;
1458
+ animeInfo.relations = data.data.Media.relations.edges.map((item) => {
1459
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
1460
+ return ({
1461
+ id: item.node.id,
1462
+ malId: item.node.idMal,
1463
+ relationType: item.relationType,
1464
+ title: {
1465
+ romaji: item.node.title.romaji,
1466
+ english: item.node.title.english,
1467
+ native: item.node.title.native,
1468
+ userPreferred: item.node.title.userPreferred,
1469
+ },
1470
+ status: item.node.status == 'RELEASING'
1471
+ ? models_1.MediaStatus.ONGOING
1472
+ : item.node.status == 'FINISHED'
1473
+ ? models_1.MediaStatus.COMPLETED
1474
+ : item.node.status == 'NOT_YET_RELEASED'
1475
+ ? models_1.MediaStatus.NOT_YET_AIRED
1476
+ : item.node.status == 'CANCELLED'
1477
+ ? models_1.MediaStatus.CANCELLED
1478
+ : item.node.status == 'HIATUS'
1479
+ ? models_1.MediaStatus.HIATUS
1480
+ : models_1.MediaStatus.UNKNOWN,
1481
+ episodes: item.node.episodes,
1482
+ chapters: item.node.chapters,
1483
+ image: (_c = (_b = item.node.coverImage.extraLarge) !== null && _b !== void 0 ? _b : item.node.coverImage.large) !== null && _c !== void 0 ? _c : item.node.coverImage.medium,
1484
+ imageHash: (0, utils_2.getHashFromImage)((_e = (_d = item.node.coverImage.extraLarge) !== null && _d !== void 0 ? _d : item.node.coverImage.large) !== null && _e !== void 0 ? _e : item.node.coverImage.medium),
1485
+ cover: (_h = (_g = (_f = item.node.bannerImage) !== null && _f !== void 0 ? _f : item.node.coverImage.extraLarge) !== null && _g !== void 0 ? _g : item.node.coverImage.large) !== null && _h !== void 0 ? _h : item.node.coverImage.medium,
1486
+ coverHash: (0, utils_2.getHashFromImage)((_l = (_k = (_j = item.node.bannerImage) !== null && _j !== void 0 ? _j : item.node.coverImage.extraLarge) !== null && _k !== void 0 ? _k : item.node.coverImage.large) !== null && _l !== void 0 ? _l : item.node.coverImage.medium),
1487
+ rating: item.node.meanScore,
1488
+ type: item.node.format,
1489
+ });
1490
+ });
1491
+ return animeInfo;
1492
+ }
1493
+ catch (err) {
1494
+ throw new Error(err.message);
1495
+ }
1496
+ };
1497
+ /**
1498
+ * To get Staff details by anilistId
1499
+ * @param id staff id from anilist
1500
+ *
1501
+ */
1502
+ this.fetchStaffById = async (id) => {
1503
+ const staffInfo = {
1504
+ id: String(id),
1505
+ name: { first: '', last: '', native: '', full: '' },
1506
+ };
1507
+ const options = {
1508
+ headers: {
1509
+ 'Content-Type': 'application/json',
1510
+ Accept: 'application/json',
1511
+ },
1512
+ query: (0, utils_1.anilistStaffInfoQuery)(id),
1513
+ };
1514
+ try {
1515
+ const { data } = await this.client.post(this.anilistGraphqlUrl, options).catch(err => {
1516
+ throw new Error(err.message);
1517
+ });
1518
+ const staff = data.data.Staff;
1519
+ staffInfo.id = staff === null || staff === void 0 ? void 0 : staff.id;
1520
+ staffInfo.name = staff === null || staff === void 0 ? void 0 : staff.name;
1521
+ staffInfo.image = staff === null || staff === void 0 ? void 0 : staff.image;
1522
+ staffInfo.description = staff === null || staff === void 0 ? void 0 : staff.description;
1523
+ staffInfo.siteUrl = staff === null || staff === void 0 ? void 0 : staff.siteUrl;
1524
+ staffInfo.roles = staff === null || staff === void 0 ? void 0 : staff.staffMedia.edges.map((media) => {
1525
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
1526
+ return ({
1527
+ id: (_b = media === null || media === void 0 ? void 0 : media.node) === null || _b === void 0 ? void 0 : _b.id,
1528
+ title: (_c = media === null || media === void 0 ? void 0 : media.node) === null || _c === void 0 ? void 0 : _c.title,
1529
+ type: (_d = media === null || media === void 0 ? void 0 : media.node) === null || _d === void 0 ? void 0 : _d.type,
1530
+ image: {
1531
+ extraLarge: (_f = (_e = media === null || media === void 0 ? void 0 : media.node) === null || _e === void 0 ? void 0 : _e.coverImage) === null || _f === void 0 ? void 0 : _f.extraLarge,
1532
+ large: (_h = (_g = media === null || media === void 0 ? void 0 : media.node) === null || _g === void 0 ? void 0 : _g.coverImage) === null || _h === void 0 ? void 0 : _h.large,
1533
+ medium: (_k = (_j = media === null || media === void 0 ? void 0 : media.node) === null || _j === void 0 ? void 0 : _j.coverImage) === null || _k === void 0 ? void 0 : _k.medium,
1534
+ },
1535
+ color: (_m = (_l = media === null || media === void 0 ? void 0 : media.node) === null || _l === void 0 ? void 0 : _l.coverImage) === null || _m === void 0 ? void 0 : _m.color,
1536
+ });
1537
+ });
1538
+ return staffInfo;
1539
+ }
1540
+ catch (err) {
1541
+ throw new Error(err.message);
1542
+ }
1543
+ };
1544
+ /**
1545
+ *
1546
+ * @param id character id from anilist
1547
+ */
1548
+ this.fetchCharacterInfoById = async (id) => {
1549
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12;
1550
+ const options = {
1551
+ headers: {
1552
+ 'Content-Type': 'application/json',
1553
+ Accept: 'application/json',
1554
+ },
1555
+ query: (0, utils_1.anilistCharacterQuery)(),
1556
+ variables: {
1557
+ id: id,
1558
+ },
1559
+ };
1560
+ try {
1561
+ const { data: { data: { Character }, }, } = await this.client.post(this.anilistGraphqlUrl, options);
1562
+ const height = (_b = Character.description.match(/__Height:__(.*)/)) === null || _b === void 0 ? void 0 : _b[1].trim();
1563
+ const weight = (_c = Character.description.match(/__Weight:__(.*)/)) === null || _c === void 0 ? void 0 : _c[1].trim();
1564
+ const hairColor = (_d = Character.description.match(/__Hair Color:__(.*)/)) === null || _d === void 0 ? void 0 : _d[1].trim();
1565
+ const eyeColor = (_e = Character.description.match(/__Eye Color:__(.*)/)) === null || _e === void 0 ? void 0 : _e[1].trim();
1566
+ const relatives = (_f = Character.description
1567
+ .match(/__Relatives:__(.*)/)) === null || _f === void 0 ? void 0 : _f[1].trim().split(/(, \[)/g).filter((g) => !g.includes(', [')).map((r) => {
1568
+ var _b, _c, _d;
1569
+ return ({
1570
+ id: (_b = r.match(/\/(\d+)/)) === null || _b === void 0 ? void 0 : _b[1],
1571
+ name: (_c = r.match(/([^)]+)\]/)) === null || _c === void 0 ? void 0 : _c[1].replace(/\[/g, ''),
1572
+ relationship: (_d = r.match(/\(([^)]+)\).*?(\(([^)]+)\))/)) === null || _d === void 0 ? void 0 : _d[3],
1573
+ });
1574
+ });
1575
+ const race = (_g = Character.description
1576
+ .match(/__Race:__(.*)/)) === null || _g === void 0 ? void 0 : _g[1].split(', ').map((r) => r.trim());
1577
+ const rank = (_h = Character.description.match(/__Rank:__(.*)/)) === null || _h === void 0 ? void 0 : _h[1];
1578
+ const occupation = (_j = Character.description.match(/__Occupation:__(.*)/)) === null || _j === void 0 ? void 0 : _j[1];
1579
+ const previousPosition = (_l = (_k = Character.description.match(/__Previous Position:__(.*)/)) === null || _k === void 0 ? void 0 : _k[1]) === null || _l === void 0 ? void 0 : _l.trim();
1580
+ const partner = (_m = Character.description
1581
+ .match(/__Partner:__(.*)/)) === null || _m === void 0 ? void 0 : _m[1].split(/(, \[)/g).filter((g) => !g.includes(', [')).map((r) => {
1582
+ var _b, _c;
1583
+ return ({
1584
+ id: (_b = r.match(/\/(\d+)/)) === null || _b === void 0 ? void 0 : _b[1],
1585
+ name: (_c = r.match(/([^)]+)\]/)) === null || _c === void 0 ? void 0 : _c[1].replace(/\[/g, ''),
1586
+ });
1587
+ });
1588
+ const dislikes = (_o = Character.description.match(/__Dislikes:__(.*)/)) === null || _o === void 0 ? void 0 : _o[1];
1589
+ const sign = (_p = Character.description.match(/__Sign:__(.*)/)) === null || _p === void 0 ? void 0 : _p[1];
1590
+ const zodicSign = (_r = (_q = Character.description.match(/__Zodiac sign:__(.*)/)) === null || _q === void 0 ? void 0 : _q[1]) === null || _r === void 0 ? void 0 : _r.trim();
1591
+ const zodicAnimal = (_t = (_s = Character.description.match(/__Zodiac Animal:__(.*)/)) === null || _s === void 0 ? void 0 : _s[1]) === null || _t === void 0 ? void 0 : _t.trim();
1592
+ const themeSong = (_v = (_u = Character.description.match(/__Theme Song:__(.*)/)) === null || _u === void 0 ? void 0 : _u[1]) === null || _v === void 0 ? void 0 : _v.trim();
1593
+ Character.description = Character.description.replace(/__Theme Song:__(.*)\n|__Race:__(.*)\n|__Height:__(.*)\n|__Relatives:__(.*)\n|__Rank:__(.*)\n|__Zodiac sign:__(.*)\n|__Zodiac Animal:__(.*)\n|__Weight:__(.*)\n|__Eye Color:__(.*)\n|__Hair Color:__(.*)\n|__Dislikes:__(.*)\n|__Sign:__(.*)\n|__Partner:__(.*)\n|__Previous Position:__(.*)\n|__Occupation:__(.*)\n/gm, '');
1594
+ const characterInfo = {
1595
+ id: Character.id,
1596
+ name: {
1597
+ first: (_w = Character.name) === null || _w === void 0 ? void 0 : _w.first,
1598
+ last: (_x = Character.name) === null || _x === void 0 ? void 0 : _x.last,
1599
+ full: (_y = Character.name) === null || _y === void 0 ? void 0 : _y.full,
1600
+ native: (_z = Character.name) === null || _z === void 0 ? void 0 : _z.native,
1601
+ userPreferred: (_0 = Character.name) === null || _0 === void 0 ? void 0 : _0.userPreferred,
1602
+ alternative: (_1 = Character.name) === null || _1 === void 0 ? void 0 : _1.alternative,
1603
+ alternativeSpoiler: (_2 = Character.name) === null || _2 === void 0 ? void 0 : _2.alternativeSpoiler,
1604
+ },
1605
+ image: (_4 = (_3 = Character.image) === null || _3 === void 0 ? void 0 : _3.large) !== null && _4 !== void 0 ? _4 : (_5 = Character.image) === null || _5 === void 0 ? void 0 : _5.medium,
1606
+ imageHash: (0, utils_2.getHashFromImage)((_7 = (_6 = Character.image) === null || _6 === void 0 ? void 0 : _6.large) !== null && _7 !== void 0 ? _7 : (_8 = Character.image) === null || _8 === void 0 ? void 0 : _8.medium),
1607
+ description: Character.description,
1608
+ gender: Character.gender,
1609
+ dateOfBirth: {
1610
+ year: (_9 = Character.dateOfBirth) === null || _9 === void 0 ? void 0 : _9.year,
1611
+ month: (_10 = Character.dateOfBirth) === null || _10 === void 0 ? void 0 : _10.month,
1612
+ day: (_11 = Character.dateOfBirth) === null || _11 === void 0 ? void 0 : _11.day,
1613
+ },
1614
+ bloodType: Character.bloodType,
1615
+ age: Character.age,
1616
+ hairColor: hairColor,
1617
+ eyeColor: eyeColor,
1618
+ height: height,
1619
+ weight: weight,
1620
+ occupation: occupation,
1621
+ partner: partner,
1622
+ relatives: relatives,
1623
+ race: race,
1624
+ rank: rank,
1625
+ previousPosition: previousPosition,
1626
+ dislikes: dislikes,
1627
+ sign: sign,
1628
+ zodicSign: zodicSign,
1629
+ zodicAnimal: zodicAnimal,
1630
+ themeSong: themeSong,
1631
+ relations: (_12 = Character.media.edges) === null || _12 === void 0 ? void 0 : _12.map((v) => {
1632
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
1633
+ return ({
1634
+ id: v.node.id,
1635
+ malId: v.node.idMal,
1636
+ role: v.characterRole,
1637
+ title: {
1638
+ romaji: (_b = v.node.title) === null || _b === void 0 ? void 0 : _b.romaji,
1639
+ english: (_c = v.node.title) === null || _c === void 0 ? void 0 : _c.english,
1640
+ native: (_d = v.node.title) === null || _d === void 0 ? void 0 : _d.native,
1641
+ userPreferred: (_e = v.node.title) === null || _e === void 0 ? void 0 : _e.userPreferred,
1642
+ },
1643
+ status: v.node.status == 'RELEASING'
1644
+ ? models_1.MediaStatus.ONGOING
1645
+ : v.node.status == 'FINISHED'
1646
+ ? models_1.MediaStatus.COMPLETED
1647
+ : v.node.status == 'NOT_YET_RELEASED'
1648
+ ? models_1.MediaStatus.NOT_YET_AIRED
1649
+ : v.node.status == 'CANCELLED'
1650
+ ? models_1.MediaStatus.CANCELLED
1651
+ : v.node.status == 'HIATUS'
1652
+ ? models_1.MediaStatus.HIATUS
1653
+ : models_1.MediaStatus.UNKNOWN,
1654
+ episodes: v.node.episodes,
1655
+ image: (_j = (_g = (_f = v.node.coverImage) === null || _f === void 0 ? void 0 : _f.extraLarge) !== null && _g !== void 0 ? _g : (_h = v.node.coverImage) === null || _h === void 0 ? void 0 : _h.large) !== null && _j !== void 0 ? _j : (_k = v.node.coverImage) === null || _k === void 0 ? void 0 : _k.medium,
1656
+ imageHash: (0, utils_2.getHashFromImage)((_p = (_m = (_l = v.node.coverImage) === null || _l === void 0 ? void 0 : _l.extraLarge) !== null && _m !== void 0 ? _m : (_o = v.node.coverImage) === null || _o === void 0 ? void 0 : _o.large) !== null && _p !== void 0 ? _p : (_q = v.node.coverImage) === null || _q === void 0 ? void 0 : _q.medium),
1657
+ rating: v.node.averageScore,
1658
+ releaseDate: (_r = v.node.startDate) === null || _r === void 0 ? void 0 : _r.year,
1659
+ type: v.node.format,
1660
+ color: (_s = v.node.coverImage) === null || _s === void 0 ? void 0 : _s.color,
1661
+ });
1662
+ }),
1663
+ };
1664
+ return characterInfo;
1665
+ }
1666
+ catch (err) {
1667
+ throw new Error(err.message);
1668
+ }
1669
+ };
1670
+ this.findMangaSlug = async (provider, title, malId) => {
1671
+ const slug = title.replace(/[^0-9a-zA-Z]+/g, ' ');
1672
+ let possibleManga;
1673
+ if (malId) {
1674
+ const malAsyncReq = await this.client.get(`${this.malSyncUrl}/mal/manga/${malId}`, {
1675
+ validateStatus: () => true,
1676
+ });
1677
+ if (malAsyncReq.status === 200) {
1678
+ const sitesT = malAsyncReq.data.Sites;
1679
+ let sites = Object.values(sitesT).map((v, i) => {
1680
+ const obj = [...Object.values(Object.values(sitesT)[i])];
1681
+ const pages = obj.map((v) => ({
1682
+ page: v.page,
1683
+ url: v.url,
1684
+ title: v.title,
1685
+ }));
1686
+ return pages;
1687
+ });
1688
+ sites = sites.flat();
1689
+ const possibleSource = sites.find(s => s.page.toLowerCase() === provider.name.toLowerCase());
1690
+ if (possibleSource)
1691
+ possibleManga = await provider.fetchMangaInfo(possibleSource.url.split('/').pop());
1692
+ else
1693
+ possibleManga = await this.findMangaRaw(provider, slug, title);
1694
+ }
1695
+ else
1696
+ possibleManga = await this.findMangaRaw(provider, slug, title);
1697
+ }
1698
+ else
1699
+ possibleManga = await this.findMangaRaw(provider, slug, title);
1700
+ const possibleProviderChapters = possibleManga.chapters;
1701
+ return possibleProviderChapters;
1702
+ };
1703
+ this.findMangaRaw = async (provider, slug, title) => {
1704
+ const findAnime = (await provider.search(slug));
1705
+ if (findAnime.results.length === 0)
1706
+ return [];
1707
+ // TODO: use much better way than this
1708
+ const possibleManga = findAnime.results.find((manga) => title.toLowerCase() == (typeof manga.title === 'string' ? manga.title.toLowerCase() : ''));
1709
+ if (!possibleManga)
1710
+ return (await provider.fetchMangaInfo(findAnime.results[0].id));
1711
+ return (await provider.fetchMangaInfo(possibleManga.id));
1712
+ };
1713
+ this.findManga = async (provider, title, malId) => {
1714
+ var _b, _c;
1715
+ title.english = (_b = title.english) !== null && _b !== void 0 ? _b : title.romaji;
1716
+ title.romaji = (_c = title.romaji) !== null && _c !== void 0 ? _c : title.english;
1717
+ title.english = title.english.toLowerCase();
1718
+ title.romaji = title.romaji.toLowerCase();
1719
+ if (title.english === title.romaji)
1720
+ return await this.findMangaSlug(provider, title.english, malId);
1721
+ const romajiPossibleEpisodes = this.findMangaSlug(provider, title.romaji, malId);
1722
+ if (romajiPossibleEpisodes) {
1723
+ return romajiPossibleEpisodes;
1724
+ }
1725
+ const englishPossibleEpisodes = this.findMangaSlug(provider, title.english, malId);
1726
+ return englishPossibleEpisodes;
1727
+ };
1728
+ this.provider = provider || new hianime_1.default();
1729
+ }
1730
+ }
1731
+ _a = Anilist;
1732
+ /**
1733
+ * Anilist Anime class
1734
+ */
1735
+ Anilist.Anime = _a;
1736
+ /**
1737
+ * Anilist Manga Class
1738
+ */
1739
+ Anilist.Manga = class Manga {
1740
+ /**
1741
+ * Maps anilist manga to any manga provider (mangadex, mangasee, etc)
1742
+ * @param provider MangaParser
1743
+ */
1744
+ constructor(provider) {
1745
+ /**
1746
+ *
1747
+ * @param query query to search for
1748
+ * @param page (optional) page number (default: `1`)
1749
+ * @param perPage (optional) number of results per page (default: `20`)
1750
+ */
1751
+ this.search = async (query, page = 1, perPage = 20) => {
1752
+ const options = {
1753
+ headers: {
1754
+ 'Content-Type': 'application/json',
1755
+ Accept: 'application/json',
1756
+ },
1757
+ query: (0, utils_1.anilistSearchQuery)(query, page, perPage, 'MANGA'),
1758
+ };
1759
+ try {
1760
+ const { data } = await axios_1.default.post(new _a().anilistGraphqlUrl, options);
1761
+ const res = {
1762
+ currentPage: data.data.Page.pageInfo.currentPage,
1763
+ hasNextPage: data.data.Page.pageInfo.hasNextPage,
1764
+ results: data.data.Page.media.map((item) => {
1765
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
1766
+ return ({
1767
+ id: item.id.toString(),
1768
+ malId: item.idMal,
1769
+ title: item.title
1770
+ ? {
1771
+ romaji: item.title.romaji,
1772
+ english: item.title.english,
1773
+ native: item.title.native,
1774
+ userPreferred: item.title.userPreferred,
1775
+ }
1776
+ : item.title.romaji,
1777
+ status: item.status == 'RELEASING'
1778
+ ? models_1.MediaStatus.ONGOING
1779
+ : item.status == 'FINISHED'
1780
+ ? models_1.MediaStatus.COMPLETED
1781
+ : item.status == 'NOT_YET_RELEASED'
1782
+ ? models_1.MediaStatus.NOT_YET_AIRED
1783
+ : item.status == 'CANCELLED'
1784
+ ? models_1.MediaStatus.CANCELLED
1785
+ : item.status == 'HIATUS'
1786
+ ? models_1.MediaStatus.HIATUS
1787
+ : models_1.MediaStatus.UNKNOWN,
1788
+ image: (_e = (_c = (_b = item.coverImage) === null || _b === void 0 ? void 0 : _b.extraLarge) !== null && _c !== void 0 ? _c : (_d = item.coverImage) === null || _d === void 0 ? void 0 : _d.large) !== null && _e !== void 0 ? _e : (_f = item.coverImage) === null || _f === void 0 ? void 0 : _f.medium,
1789
+ imageHash: (0, utils_2.getHashFromImage)((_k = (_h = (_g = item.coverImage) === null || _g === void 0 ? void 0 : _g.extraLarge) !== null && _h !== void 0 ? _h : (_j = item.coverImage) === null || _j === void 0 ? void 0 : _j.large) !== null && _k !== void 0 ? _k : (_l = item.coverImage) === null || _l === void 0 ? void 0 : _l.medium),
1790
+ cover: item.bannerImage,
1791
+ coverHash: (0, utils_2.getHashFromImage)(item.bannerImage),
1792
+ popularity: item.popularity,
1793
+ description: item.description,
1794
+ rating: item.averageScore,
1795
+ genres: item.genres,
1796
+ color: (_m = item.coverImage) === null || _m === void 0 ? void 0 : _m.color,
1797
+ totalChapters: item.chapters,
1798
+ volumes: item.volumes,
1799
+ type: item.format,
1800
+ releaseDate: item.seasonYear,
1801
+ });
1802
+ }),
1803
+ };
1804
+ return res;
1805
+ }
1806
+ catch (err) {
1807
+ throw new Error(err.message);
1808
+ }
1809
+ };
1810
+ /**
1811
+ *
1812
+ * @param chapterId chapter id
1813
+ * @param args args to pass to the provider (if any)
1814
+ * @returns
1815
+ */
1816
+ this.fetchChapterPages = (chapterId, ...args) => {
1817
+ return this.provider.fetchChapterPages(chapterId, ...args);
1818
+ };
1819
+ this.fetchChaptersList = async (mangaId, ...args) => {
1820
+ try {
1821
+ const options = {
1822
+ headers: {
1823
+ 'Content-Type': 'application/json',
1824
+ Accept: 'application/json',
1825
+ },
1826
+ query: (0, utils_1.anilistMediaDetailQuery)(mangaId),
1827
+ };
1828
+ const { data } = await axios_1.default.post(new _a().anilistGraphqlUrl, options).catch(err => {
1829
+ throw new Error('Media not found');
1830
+ });
1831
+ const title = {
1832
+ english: data.data.Media.title.english,
1833
+ romaji: data.data.Media.title.romaji,
1834
+ };
1835
+ const malId = data.data.Media.idMal;
1836
+ const chapters = await new _a().findManga(this.provider, title, malId);
1837
+ return chapters.reverse();
1838
+ }
1839
+ catch (error) {
1840
+ throw new Error(error.message);
1841
+ }
1842
+ };
1843
+ this.fetchMangaInfo = async (id, ...args) => {
1844
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
1845
+ const mangaInfo = {
1846
+ id: id,
1847
+ title: '',
1848
+ };
1849
+ const options = {
1850
+ headers: {
1851
+ 'Content-Type': 'application/json',
1852
+ Accept: 'application/json',
1853
+ },
1854
+ query: (0, utils_1.anilistMediaDetailQuery)(id),
1855
+ };
1856
+ try {
1857
+ const { data } = await axios_1.default.post(new _a().anilistGraphqlUrl, options).catch(err => {
1858
+ throw new Error('Media not found');
1859
+ });
1860
+ mangaInfo.malId = data.data.Media.idMal;
1861
+ mangaInfo.title = {
1862
+ romaji: data.data.Media.title.romaji,
1863
+ english: data.data.Media.title.english,
1864
+ native: data.data.Media.title.native,
1865
+ userPreferred: data.data.Media.title.userPreferred,
1866
+ };
1867
+ if ((_b = data.data.Media.trailer) === null || _b === void 0 ? void 0 : _b.id) {
1868
+ mangaInfo.trailer = {
1869
+ id: data.data.Media.trailer.id,
1870
+ site: (_c = data.data.Media.trailer) === null || _c === void 0 ? void 0 : _c.site,
1871
+ thumbnail: (_d = data.data.Media.trailer) === null || _d === void 0 ? void 0 : _d.thumbnail,
1872
+ thumbnailHash: (0, utils_2.getHashFromImage)((_e = data.data.Media.trailer) === null || _e === void 0 ? void 0 : _e.thumbnail),
1873
+ };
1874
+ }
1875
+ mangaInfo.image =
1876
+ (_g = (_f = data.data.Media.coverImage.extraLarge) !== null && _f !== void 0 ? _f : data.data.Media.coverImage.large) !== null && _g !== void 0 ? _g : data.data.Media.coverImage.medium;
1877
+ mangaInfo.imageHash = (0, utils_2.getHashFromImage)((_j = (_h = data.data.Media.coverImage.extraLarge) !== null && _h !== void 0 ? _h : data.data.Media.coverImage.large) !== null && _j !== void 0 ? _j : data.data.Media.coverImage.medium);
1878
+ mangaInfo.popularity = data.data.Media.popularity;
1879
+ mangaInfo.color = (_k = data.data.Media.coverImage) === null || _k === void 0 ? void 0 : _k.color;
1880
+ mangaInfo.cover = (_l = data.data.Media.bannerImage) !== null && _l !== void 0 ? _l : mangaInfo.image;
1881
+ mangaInfo.coverHash = (0, utils_2.getHashFromImage)((_m = data.data.Media.bannerImage) !== null && _m !== void 0 ? _m : mangaInfo.image);
1882
+ mangaInfo.description = data.data.Media.description;
1883
+ switch (data.data.Media.status) {
1884
+ case 'RELEASING':
1885
+ mangaInfo.status = models_1.MediaStatus.ONGOING;
1886
+ break;
1887
+ case 'FINISHED':
1888
+ mangaInfo.status = models_1.MediaStatus.COMPLETED;
1889
+ break;
1890
+ case 'NOT_YET_RELEASED':
1891
+ mangaInfo.status = models_1.MediaStatus.NOT_YET_AIRED;
1892
+ break;
1893
+ case 'CANCELLED':
1894
+ mangaInfo.status = models_1.MediaStatus.CANCELLED;
1895
+ break;
1896
+ case 'HIATUS':
1897
+ mangaInfo.status = models_1.MediaStatus.HIATUS;
1898
+ default:
1899
+ mangaInfo.status = models_1.MediaStatus.UNKNOWN;
1900
+ }
1901
+ mangaInfo.releaseDate = data.data.Media.startDate.year;
1902
+ mangaInfo.startDate = {
1903
+ year: data.data.Media.startDate.year,
1904
+ month: data.data.Media.startDate.month,
1905
+ day: data.data.Media.startDate.day,
1906
+ };
1907
+ mangaInfo.endDate = {
1908
+ year: data.data.Media.endDate.year,
1909
+ month: data.data.Media.endDate.month,
1910
+ day: data.data.Media.endDate.day,
1911
+ };
1912
+ mangaInfo.rating = data.data.Media.averageScore;
1913
+ mangaInfo.genres = data.data.Media.genres;
1914
+ mangaInfo.season = data.data.Media.season;
1915
+ mangaInfo.studios = data.data.Media.studios.edges.map((item) => item.node.name);
1916
+ mangaInfo.type = data.data.Media.format;
1917
+ mangaInfo.recommendations = data.data.Media.recommendations.edges.map((item) => {
1918
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30;
1919
+ return ({
1920
+ id: (_b = item.node.mediaRecommendation) === null || _b === void 0 ? void 0 : _b.id,
1921
+ malId: (_c = item.node.mediaRecommendation) === null || _c === void 0 ? void 0 : _c.idMal,
1922
+ title: {
1923
+ romaji: (_e = (_d = item.node.mediaRecommendation) === null || _d === void 0 ? void 0 : _d.title) === null || _e === void 0 ? void 0 : _e.romaji,
1924
+ english: (_g = (_f = item.node.mediaRecommendation) === null || _f === void 0 ? void 0 : _f.title) === null || _g === void 0 ? void 0 : _g.english,
1925
+ native: (_j = (_h = item.node.mediaRecommendation) === null || _h === void 0 ? void 0 : _h.title) === null || _j === void 0 ? void 0 : _j.native,
1926
+ userPreferred: (_l = (_k = item.node.mediaRecommendation) === null || _k === void 0 ? void 0 : _k.title) === null || _l === void 0 ? void 0 : _l.userPreferred,
1927
+ },
1928
+ status: ((_m = item.node.mediaRecommendation) === null || _m === void 0 ? void 0 : _m.status) == 'RELEASING'
1929
+ ? models_1.MediaStatus.ONGOING
1930
+ : ((_o = item.node.mediaRecommendation) === null || _o === void 0 ? void 0 : _o.status) == 'FINISHED'
1931
+ ? models_1.MediaStatus.COMPLETED
1932
+ : ((_p = item.node.mediaRecommendation) === null || _p === void 0 ? void 0 : _p.status) == 'NOT_YET_RELEASED'
1933
+ ? models_1.MediaStatus.NOT_YET_AIRED
1934
+ : ((_q = item.node.mediaRecommendation) === null || _q === void 0 ? void 0 : _q.status) == 'CANCELLED'
1935
+ ? models_1.MediaStatus.CANCELLED
1936
+ : ((_r = item.node.mediaRecommendation) === null || _r === void 0 ? void 0 : _r.status) == 'HIATUS'
1937
+ ? models_1.MediaStatus.HIATUS
1938
+ : models_1.MediaStatus.UNKNOWN,
1939
+ chapters: (_s = item.node.mediaRecommendation) === null || _s === void 0 ? void 0 : _s.chapters,
1940
+ image: (_y = (_v = (_u = (_t = item.node.mediaRecommendation) === null || _t === void 0 ? void 0 : _t.coverImage) === null || _u === void 0 ? void 0 : _u.extraLarge) !== null && _v !== void 0 ? _v : (_x = (_w = item.node.mediaRecommendation) === null || _w === void 0 ? void 0 : _w.coverImage) === null || _x === void 0 ? void 0 : _x.large) !== null && _y !== void 0 ? _y : (_0 = (_z = item.node.mediaRecommendation) === null || _z === void 0 ? void 0 : _z.coverImage) === null || _0 === void 0 ? void 0 : _0.medium,
1941
+ imageHash: (0, utils_2.getHashFromImage)((_6 = (_3 = (_2 = (_1 = item.node.mediaRecommendation) === null || _1 === void 0 ? void 0 : _1.coverImage) === null || _2 === void 0 ? void 0 : _2.extraLarge) !== null && _3 !== void 0 ? _3 : (_5 = (_4 = item.node.mediaRecommendation) === null || _4 === void 0 ? void 0 : _4.coverImage) === null || _5 === void 0 ? void 0 : _5.large) !== null && _6 !== void 0 ? _6 : (_8 = (_7 = item.node.mediaRecommendation) === null || _7 === void 0 ? void 0 : _7.coverImage) === null || _8 === void 0 ? void 0 : _8.medium),
1942
+ cover: (_16 = (_13 = (_10 = (_9 = item.node.mediaRecommendation) === null || _9 === void 0 ? void 0 : _9.bannerImage) !== null && _10 !== void 0 ? _10 : (_12 = (_11 = item.node.mediaRecommendation) === null || _11 === void 0 ? void 0 : _11.coverImage) === null || _12 === void 0 ? void 0 : _12.extraLarge) !== null && _13 !== void 0 ? _13 : (_15 = (_14 = item.node.mediaRecommendation) === null || _14 === void 0 ? void 0 : _14.coverImage) === null || _15 === void 0 ? void 0 : _15.large) !== null && _16 !== void 0 ? _16 : (_18 = (_17 = item.node.mediaRecommendation) === null || _17 === void 0 ? void 0 : _17.coverImage) === null || _18 === void 0 ? void 0 : _18.medium,
1943
+ coverHash: (0, utils_2.getHashFromImage)((_26 = (_23 = (_20 = (_19 = item.node.mediaRecommendation) === null || _19 === void 0 ? void 0 : _19.bannerImage) !== null && _20 !== void 0 ? _20 : (_22 = (_21 = item.node.mediaRecommendation) === null || _21 === void 0 ? void 0 : _21.coverImage) === null || _22 === void 0 ? void 0 : _22.extraLarge) !== null && _23 !== void 0 ? _23 : (_25 = (_24 = item.node.mediaRecommendation) === null || _24 === void 0 ? void 0 : _24.coverImage) === null || _25 === void 0 ? void 0 : _25.large) !== null && _26 !== void 0 ? _26 : (_28 = (_27 = item.node.mediaRecommendation) === null || _27 === void 0 ? void 0 : _27.coverImage) === null || _28 === void 0 ? void 0 : _28.medium),
1944
+ rating: (_29 = item.node.mediaRecommendation) === null || _29 === void 0 ? void 0 : _29.meanScore,
1945
+ type: (_30 = item.node.mediaRecommendation) === null || _30 === void 0 ? void 0 : _30.format,
1946
+ });
1947
+ });
1948
+ mangaInfo.characters = data.data.Media.characters.edges.map((item) => {
1949
+ var _b, _c, _d;
1950
+ return ({
1951
+ id: (_b = item.node) === null || _b === void 0 ? void 0 : _b.id,
1952
+ role: item.role,
1953
+ name: {
1954
+ first: item.node.name.first,
1955
+ last: item.node.name.last,
1956
+ full: item.node.name.full,
1957
+ native: item.node.name.native,
1958
+ userPreferred: item.node.name.userPreferred,
1959
+ },
1960
+ image: (_c = item.node.image.large) !== null && _c !== void 0 ? _c : item.node.image.medium,
1961
+ imageHash: (0, utils_2.getHashFromImage)((_d = item.node.image.large) !== null && _d !== void 0 ? _d : item.node.image.medium),
1962
+ });
1963
+ });
1964
+ mangaInfo.relations = data.data.Media.relations.edges.map((item) => {
1965
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
1966
+ return ({
1967
+ id: item.node.id,
1968
+ relationType: item.relationType,
1969
+ malId: item.node.idMal,
1970
+ title: {
1971
+ romaji: item.node.title.romaji,
1972
+ english: item.node.title.english,
1973
+ native: item.node.title.native,
1974
+ userPreferred: item.node.title.userPreferred,
1975
+ },
1976
+ status: item.node.status == 'RELEASING'
1977
+ ? models_1.MediaStatus.ONGOING
1978
+ : item.node.status == 'FINISHED'
1979
+ ? models_1.MediaStatus.COMPLETED
1980
+ : item.node.status == 'NOT_YET_RELEASED'
1981
+ ? models_1.MediaStatus.NOT_YET_AIRED
1982
+ : item.node.status == 'CANCELLED'
1983
+ ? models_1.MediaStatus.CANCELLED
1984
+ : item.node.status == 'HIATUS'
1985
+ ? models_1.MediaStatus.HIATUS
1986
+ : models_1.MediaStatus.UNKNOWN,
1987
+ chapters: item.node.chapters,
1988
+ image: (_c = (_b = item.node.coverImage.extraLarge) !== null && _b !== void 0 ? _b : item.node.coverImage.large) !== null && _c !== void 0 ? _c : item.node.coverImage.medium,
1989
+ imageHash: (0, utils_2.getHashFromImage)((_e = (_d = item.node.coverImage.extraLarge) !== null && _d !== void 0 ? _d : item.node.coverImage.large) !== null && _e !== void 0 ? _e : item.node.coverImage.medium),
1990
+ color: (_f = item.node.coverImage) === null || _f === void 0 ? void 0 : _f.color,
1991
+ type: item.node.format,
1992
+ cover: (_j = (_h = (_g = item.node.bannerImage) !== null && _g !== void 0 ? _g : item.node.coverImage.extraLarge) !== null && _h !== void 0 ? _h : item.node.coverImage.large) !== null && _j !== void 0 ? _j : item.node.coverImage.medium,
1993
+ coverHash: (0, utils_2.getHashFromImage)((_m = (_l = (_k = item.node.bannerImage) !== null && _k !== void 0 ? _k : item.node.coverImage.extraLarge) !== null && _l !== void 0 ? _l : item.node.coverImage.large) !== null && _m !== void 0 ? _m : item.node.coverImage.medium),
1994
+ rating: item.node.meanScore,
1995
+ });
1996
+ });
1997
+ mangaInfo.chapters = await new _a().findManga(this.provider, {
1998
+ english: mangaInfo.title.english,
1999
+ romaji: mangaInfo.title.romaji,
2000
+ }, mangaInfo.malId);
2001
+ mangaInfo.chapters = mangaInfo.chapters.reverse();
2002
+ return mangaInfo;
2003
+ }
2004
+ catch (error) {
2005
+ throw Error(error.message);
2006
+ }
2007
+ };
2008
+ this.provider = provider || new mangadex_1.default();
2009
+ }
2010
+ };
2011
+ // (async () => {
2012
+ // const ani = new Anilist(new Hianime());
2013
+ // const anime = await ani.advancedSearch(undefined, "MANGA", undefined, undefined, undefined, ["POPULARITY_DESC"], undefined, undefined, undefined, undefined, undefined, "KR");
2014
+ // console.log(anime.results[0].title);
2015
+ // const details = await ani.fetchAnimeInfo(anime.results[0].id);
2016
+ // console.log(details.startDate);
2017
+ // console.log(details.totalChapters);
2018
+ // console.log(details.episodes);
2019
+ // // const chapters = await new Anilist.Manga(new MangaReader()).fetchChaptersList(anime.results[0].id);
2020
+ // // console.log(chapters);
2021
+ // // const pages = await new Anilist.Manga(new MangaReader()).fetchChapterPages(chapters[0].id);
2022
+ // // console.log(pages);
2023
+ // })();
2024
+ exports.default = Anilist;
2025
+ //# sourceMappingURL=anilist.js.map