UNPKG

@yuna0x0/anilist-node

Version:

A lightweight Node.js wrapper for the AniList API

133 lines (121 loc) 5.17 kB
/** * Access AniList's media data. * @since 1.0.0 * @memberof AniList */ class Media { /** * @description This constructor is meant for internal use and is apart of initializing. You cannot access this * through the AniList class and are not expect to. * @param { Utilities } utilities - The AniList Utilities class. * @hideconstructor */ constructor(utilities) { this.util = utilities; } /** * Fetch an anime entry by its AniList ID. * @param { Number } id - Required. The ID tied to the AniList entry. * @returns { AnimeEntry } * @since 1.0.0 */ anime(id) { if (!id) { throw new Error("Anime id is not provided!"); } if (typeof id !== "number") { throw new Error("Term provided is not a number!"); } return this.util.send( `query ($id: Int) { Media (id: $id, type: ANIME) { id idMal title { romaji english native userPreferred } format status episodes description startDate { year month day } endDate { year month day } season seasonYear duration countryOfOrigin isLicensed source hashtag trailer { id site } updatedAt coverImage { large:extraLarge medium:large small:medium color } bannerImage genres synonyms averageScore meanScore favourites popularity trending tags { id name isMediaSpoiler } relations { nodes { id title { english native romaji userPreferred } type } } characters { nodes { id name { english: full } } } staff { nodes { id name { english: full } } } studios { nodes { id name isAnimationStudio } } isFavourite isAdult isLocked nextAiringEpisode { timeUntilAiring airingAt episode } airingSchedule { nodes { airingAt timeUntilAiring episode } } trends { nodes { date trending popularity inProgress } } externalLinks { url } streamingEpisodes { title thumbnail url site } rankings { rank type context year season } mediaListEntry { id status } reviews { nodes { id score summary body } } siteUrl autoCreateForumThread modNotes stats { scoreDistribution { score amount } statusDistribution { status amount } } isRecommendationBlocked recommendations { nodes { mediaRecommendation { id title { romaji english native userPreferred } type } } } } }`, { id: id } ); } /** * [Requires Login] Favourite/Unfavourite an anime * @param {Number} id - Required. The ID tied to the AniList entry. * @returns {Boolean} Returns true if added, false otherwise. * @since 1.12.0 */ async favouriteAnime(id) { if (!id || typeof id !== "number") { throw new Error("AniList ID is not provided!"); } const data = await this.util.send( `mutation ($mediaID: Int) { ToggleFavourite(animeId: $mediaID) { anime (page: 1, perPage: 25) { nodes { id } } } }`, { mediaID: id } ); return data.ToggleFavourite.anime.nodes.some((e) => { if (e.id === id) { return true; } }); } /** * Fetch a manga entry by its AniList ID. * @param { Number } id - Required. The ID tied to the AniList entry. * @returns { MangaEntry } * @since 1.0.0 */ manga(id) { if (!id) { throw new Error("Manga id is not provided!"); } if (typeof id !== "number") { throw new Error("Term provided is not a number!"); } return this.util.send( `query ($id: Int) { Media (id: $id, type: MANGA) { id idMal title { romaji english native userPreferred } description format status startDate { year month day } endDate { year month day } chapters volumes countryOfOrigin isLicensed updatedAt coverImage { large:extraLarge medium:large small:medium color } bannerImage genres synonyms averageScore meanScore siteUrl autoCreateForumThread modNotes popularity trending tags { id name isMediaSpoiler } relations { nodes { id title { english native romaji userPreferred } type } } characters { nodes { id name { english: full } } } staff { nodes { id name { english: full } } } isFavourite isAdult isLocked trends { nodes { date trending popularity inProgress } } externalLinks { url } rankings { rank type context year season } mediaListEntry { id status } reviews { nodes { id score summary body } } stats { scoreDistribution { score amount } statusDistribution { status amount } } favourites isRecommendationBlocked recommendations { nodes { mediaRecommendation { id title { romaji english native userPreferred } type } } } } }`, { id: id } ); } /** * [Requires Login] Favourite/Unfavourite a manga * @param {Number} id - Required. The ID tied to the AniList entry. * @returns {Boolean} Returns true if added, false otherwise. * @since 1.12.0 */ async favouriteManga(id) { if (!id || typeof id !== "number") { throw new Error("AniList ID is not provided!"); } const data = await this.util.send( `mutation ($mediaID: Int) { ToggleFavourite(mangaId: $mediaID) { manga (page: 1, perPage: 25) { nodes { id } } } }`, { mediaID: id } ); return data.ToggleFavourite.manga.nodes.some((e) => { if (e.id === id) { return true; } }); } } module.exports = Media;