UNPKG

@yuna0x0/anilist-node

Version:

A lightweight Node.js wrapper for the AniList API

491 lines (452 loc) 18.1 kB
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <title>index.js - AniList-Node Documentation</title> <meta name="description" content="Documentation for the AniList-Node NPM package." /> <meta property="og:title" content="AniList-Node Documentation" /> <meta property="og:type" content="website" /> <meta property="og:image" content="" /> <meta property="og:site_name" content="AniList-Node Documentation" /> <meta property="og:url" content="https://katsurin.com/docs/anilist-node/" /> <script src="scripts/prettify/prettify.js"></script> <script src="scripts/prettify/lang-css.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify.css" /> <link type="text/css" rel="stylesheet" href="styles/jsdoc.css" /> <script src="scripts/nav.js" defer></script> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> </head> <body> <input type="checkbox" id="nav-trigger" class="nav-trigger" /> <label for="nav-trigger" class="navicon-button x"> <div class="navicon"></div> </label> <label for="nav-trigger" class="overlay"></label> <nav> <input type="text" id="nav-search" placeholder="Search" /> <h2><a href="index.html">Home</a></h2> <h2> <a href="https://github.com/AurelicButter/AniList-Node" target="_blank" class="menu-item" id="website_link" >GitHub Repository</a > </h2> <h2> <a href="https://www.npmjs.com/package/anilist-node" target="_blank" class="menu-item" id="website_link" >AniList-Node on NPM</a > </h2> <h2> <a href="https://discord.gg/qKfqsjW" target="_blank" class="menu-item" id="website_link" >Support Server</a > </h2> <h3>Classes</h3> <ul> <li> <a href="AniList.html">AniList</a> <ul class="methods"> <li data-type="method"><a href="AniList.html#favouriteStudio">favouriteStudio</a></li> <li data-type="method"><a href="AniList.html#genres">genres</a></li> <li data-type="method"><a href="AniList.html#mediaTags">mediaTags</a></li> <li data-type="method"><a href="AniList.html#search">search</a></li> <li data-type="method"><a href="AniList.html#siteStatistics">siteStatistics</a></li> <li data-type="method"><a href="AniList.html#studio">studio</a></li> </ul> </li> <li> <a href="AniList.Activity.html">Activity</a> <ul class="methods"> <li data-type="method"><a href="AniList.Activity.html#delete">delete</a></li> <li data-type="method"><a href="AniList.Activity.html#get">get</a></li> <li data-type="method"><a href="AniList.Activity.html#getUserActivity">getUserActivity</a></li> <li data-type="method"><a href="AniList.Activity.html#postMessage">postMessage</a></li> <li data-type="method"><a href="AniList.Activity.html#postText">postText</a></li> </ul> </li> <li> <a href="AniList.Lists.html">Lists</a> <ul class="methods"> <li data-type="method"><a href="AniList.Lists.html#addEntry">addEntry</a></li> <li data-type="method"><a href="AniList.Lists.html#anime">anime</a></li> <li data-type="method"><a href="AniList.Lists.html#manga">manga</a></li> <li data-type="method"><a href="AniList.Lists.html#removeEntry">removeEntry</a></li> <li data-type="method"><a href="AniList.Lists.html#updateEntry">updateEntry</a></li> </ul> </li> <li> <a href="AniList.Media.html">Media</a> <ul class="methods"> <li data-type="method"><a href="AniList.Media.html#anime">anime</a></li> <li data-type="method"><a href="AniList.Media.html#favouriteAnime">favouriteAnime</a></li> <li data-type="method"><a href="AniList.Media.html#favouriteManga">favouriteManga</a></li> <li data-type="method"><a href="AniList.Media.html#manga">manga</a></li> </ul> </li> <li> <a href="AniList.People.html">People</a> <ul class="methods"> <li data-type="method"><a href="AniList.People.html#character">character</a></li> <li data-type="method"><a href="AniList.People.html#favouriteChar">favouriteChar</a></li> <li data-type="method"><a href="AniList.People.html#favouriteStaff">favouriteStaff</a></li> <li data-type="method"> <a href="AniList.People.html#getBirthdayCharacters">getBirthdayCharacters</a> </li> <li data-type="method"><a href="AniList.People.html#getBirthdayStaff">getBirthdayStaff</a></li> <li data-type="method"><a href="AniList.People.html#staff">staff</a></li> </ul> </li> <li> <a href="AniList.Recommendation.html">Recommendation</a> <ul class="methods"> <li data-type="method"><a href="AniList.Recommendation.html#get">get</a></li> <li data-type="method"><a href="AniList.Recommendation.html#getList">getList</a></li> </ul> </li> <li> <a href="AniList.Search.html">Search</a> <ul class="methods"> <li data-type="method"><a href="AniList.Search.html#activity">activity</a></li> <li data-type="method"><a href="AniList.Search.html#anime">anime</a></li> <li data-type="method"><a href="AniList.Search.html#character">character</a></li> <li data-type="method"><a href="AniList.Search.html#manga">manga</a></li> <li data-type="method"><a href="AniList.Search.html#staff">staff</a></li> <li data-type="method"><a href="AniList.Search.html#studio">studio</a></li> <li data-type="method"><a href="AniList.Search.html#user">user</a></li> </ul> </li> <li> <a href="AniList.Thread.html">Thread</a> <ul class="methods"> <li data-type="method"><a href="AniList.Thread.html#delete">delete</a></li> <li data-type="method"><a href="AniList.Thread.html#get">get</a></li> <li data-type="method"><a href="AniList.Thread.html#getComments">getComments</a></li> </ul> </li> <li> <a href="AniList.User.html">User</a> <ul class="methods"> <li data-type="method"><a href="AniList.User.html#all">all</a></li> <li data-type="method"><a href="AniList.User.html#follow">follow</a></li> <li data-type="method"><a href="AniList.User.html#getAuthorized">getAuthorized</a></li> <li data-type="method"><a href="AniList.User.html#getRecentActivity">getRecentActivity</a></li> <li data-type="method"><a href="AniList.User.html#profile">profile</a></li> <li data-type="method"><a href="AniList.User.html#stats">stats</a></li> <li data-type="method"><a href="AniList.User.html#update">update</a></li> </ul> </li> </ul> <h3>Tutorials</h3> <ul> <li><a href="tutorial-Filtering.html">Filtering</a></li> <li><a href="tutorial-Getting Started.html">Getting Started</a></li> </ul> <h3>Global</h3> <ul> <li><a href="global.html#ActivityEntry">ActivityEntry</a></li> <li><a href="global.html#ActivityFilterTypes">ActivityFilterTypes</a></li> <li><a href="global.html#ActivitySort">ActivitySort</a></li> <li><a href="global.html#ActivityType">ActivityType</a></li> <li><a href="global.html#AiringEntry">AiringEntry</a></li> <li><a href="global.html#AniListStats">AniListStats</a></li> <li><a href="global.html#AnimeEntry">AnimeEntry</a></li> <li><a href="global.html#CharacterEntry">CharacterEntry</a></li> <li><a href="global.html#CharacterName">CharacterName</a></li> <li><a href="global.html#CountryCode">CountryCode</a></li> <li><a href="global.html#EntryStatus">EntryStatus</a></li> <li><a href="global.html#FuzzyDateInt">FuzzyDateInt</a></li> <li><a href="global.html#FuzzyDateObj">FuzzyDateObj</a></li> <li><a href="global.html#InitOptions">InitOptions</a></li> <li><a href="global.html#ListActivity">ListActivity</a></li> <li><a href="global.html#ListEntry">ListEntry</a></li> <li><a href="global.html#MangaEntry">MangaEntry</a></li> <li><a href="global.html#MediaFilterTypes">MediaFilterTypes</a></li> <li><a href="global.html#MediaFormat">MediaFormat</a></li> <li><a href="global.html#MediaListOptions">MediaListOptions</a></li> <li><a href="global.html#MediaListOptionsInput">MediaListOptionsInput</a></li> <li><a href="global.html#MediaRelation">MediaRelation</a></li> <li><a href="global.html#MediaSeason">MediaSeason</a></li> <li><a href="global.html#MediaSort">MediaSort</a></li> <li><a href="global.html#MediaSource">MediaSource</a></li> <li><a href="global.html#MediaStatus">MediaStatus</a></li> <li><a href="global.html#MediaTag">MediaTag</a></li> <li><a href="global.html#MediaTitle">MediaTitle</a></li> <li><a href="global.html#MediaType">MediaType</a></li> <li><a href="global.html#MessageActivity">MessageActivity</a></li> <li><a href="global.html#ModRole">ModRole</a></li> <li><a href="global.html#NotificationOption">NotificationOption</a></li> <li><a href="global.html#NotificationType">NotificationType</a></li> <li><a href="global.html#PersonName">PersonName</a></li> <li><a href="global.html#PersonRelation">PersonRelation</a></li> <li><a href="global.html#RecommendationEntry">RecommendationEntry</a></li> <li><a href="global.html#RecommendationList">RecommendationList</a></li> <li><a href="global.html#RecommendationRating">RecommendationRating</a></li> <li><a href="global.html#ScoreFormat">ScoreFormat</a></li> <li><a href="global.html#SearchEntry">SearchEntry</a></li> <li><a href="global.html#SingleRecommendation">SingleRecommendation</a></li> <li><a href="global.html#StaffEntry">StaffEntry</a></li> <li><a href="global.html#StaffName">StaffName</a></li> <li><a href="global.html#StudioEntry">StudioEntry</a></li> <li><a href="global.html#TextActivity">TextActivity</a></li> <li><a href="global.html#ThreadComment">ThreadComment</a></li> <li><a href="global.html#ThreadEntry">ThreadEntry</a></li> <li><a href="global.html#UpdateEntryOptions">UpdateEntryOptions</a></li> <li><a href="global.html#UpdatedEntry">UpdatedEntry</a></li> <li><a href="global.html#UserList">UserList</a></li> <li><a href="global.html#UserOptions">UserOptions</a></li> <li><a href="global.html#UserOptionsInput">UserOptionsInput</a></li> <li><a href="global.html#UserProfile">UserProfile</a></li> <li><a href="global.html#UserRelation">UserRelation</a></li> <li><a href="global.html#UserStaffNameLanguage">UserStaffNameLanguage</a></li> <li><a href="global.html#UserStats">UserStats</a></li> <li><a href="global.html#UserTitleLanguage">UserTitleLanguage</a></li> <li><a href="global.html#headerBuilder">headerBuilder</a></li> </ul> </nav> <div id="main"> <h1 class="page-title">index.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>const activity = require("./activity"), lists = require("./lists"), media = require("./media"), people = require("./people"), recommendation = require("./recommendation"), searchEntry = require("./search"), Thread = require("./thread"), User = require("./user"), util = require("./utilities"); /** * The main class for AniList-Node * @since 1.0.0 */ class AniList { /** * @constructor * @param {String} [accessKey] - The AniList API token. If no key is provided, * the user will not be able to access private information such as * the authorized user's profile (if set to private). * @param {InitOptions} [options] - Optional options to use when getting info from AniList */ constructor(accessKey, options = {}) { if (!accessKey) { accessKey = null; } if (options.timeout) { if (typeof options.timeout !== "number") throw new TypeError("ERROR: 'options.timeout' should be a number"); } else { options.timeout = 15000; } // Import utilities for the classes. this.__util = new util(accessKey, options); /** * @augments User * @see {@Link AniList.User} * @since 1.0.0 */ this.user = new User(this.__util); /** * @augments lists * @see {@Link AniList.Lists} * @since 1.1.0 */ this.lists = new lists(this.__util); /** * @augments media * @see {@Link AniList.Media} * @since 1.0.0 */ this.media = new media(this.__util); /** * @augments people * @see {@Link AniList.People} * @since 1.0.0 */ this.people = new people(this.__util); /** * @augments Activity * @see {@Link AniList.Activity} * @since 1.7.0 */ this.activity = new activity(this.__util); /** * @augments Search * @see {@Link AniList.Search} * @since 1.7.0 */ this.searchEntry = new searchEntry(this.__util); /** * @augments Recommendation * @see {@Link AniList.Recommendation} * @since 1.8.0 */ this.recommendation = new recommendation(this.__util); /** * @augments Thread * @see {@Link AniList.Thread} * @since 1.11.0 */ this.thread = new Thread(this.__util); } /** * Grabs data on a studio * @param {String | Number} studio - The studio ID or name on AniList. * @return { StudioEntry } * @since 1.0.0 */ studio(studio) { const queryVars = this.__util.generateQueryHeaders("Studio", studio); return this.__util.send( queryVars[1] + `id name isAnimationStudio siteUrl isFavourite favourites media { nodes { id title { romaji english native userPreferred } } } } }`, queryVars[0] ); } /** * [Requires Login] Favourite/Unfavourite a studio * @param {Number} id - Required. The ID tied to the AniList entry. * @returns {Boolean} Returns true if added, false otherwise. * @since 1.12.0 */ async favouriteStudio(id) { if (!id || typeof id !== "number") { throw new Error("AniList ID is not provided!"); } const data = await this.util.send( `mutation ($studioID: Int) { ToggleFavourite(studioId: $studioID) { studios (page: 1, perPage: 25) { nodes { id } } } }`, { studioID: id } ); return data.ToggleFavourite.studios.nodes.some((e) => { if (e.id === id) { return true; } }); } /** * Searches AniList based on a specific term. * @param {String} type - Required. Either anime, manga, character, staff, studio, or user. * @param {String} term - Required. The term to lookup. (ie: "Honzuki no Gekokujou" or "AurelicButter") * @param {Number} page - Which page of the results to look at. Will default to 1 if not provided. * @param {Number} amount - The amount of results per page. AniList will cap this at 25 and function will default to 5 if not provided. * @return { SearchEntry } * @since 1.0.0 * @deprecated Please use {@link AniList.Search} class via `AniList.searchEntry` for updated searching. {@link AniList.Search} will replace * this function in the next major update (v2.0.0). */ search(type, term, page = 1, amount = 5) { if (!type) { throw new Error("Type of search not defined!"); } else if (!term) { throw new Error("Search term was not provided!"); } //Validate all type conditions. if (typeof type !== "string") { throw new Error("Type is not a string."); } if (typeof term !== "string") { throw new Error("Term is not a string"); } if (typeof page !== "number") { throw new Error("Page number is not a number"); } if (typeof amount !== "number") { throw new Error("Amount is not a number"); } const search = { anime: "media (type: ANIME, search: $search) { id title { romaji english native userPreferred } }", manga: "media (type: MANGA, search: $search) { id title { romaji english native userPreferred } }", char: "characters (search: $search) { id name { english: full } }", staff: "staff (search: $search) { id name { english: full } }", studio: "studios (search: $search) { id name }", user: "users (search: $search) { id name }" }; let query = search[type.toLowerCase()]; if (!query) { throw new Error("Type not supported."); } return this.__util.send( `query ($page: Int, $perPage: Int, $search: String) { Page (page: $page, perPage: $perPage) { pageInfo { total currentPage lastPage hasNextPage perPage } ${query} } }`, { search: term, page: page, perPage: amount } ); } /** * Grabs all possible genres * @return { String[] } * @since 1.12.0 */ genres() { return this.__util.send("query { GenreCollection }", null).then((data) => { return data.GenreCollection; }); } /** * Grabs all possible media tags * @return { MediaTag[] } * @since 1.12.0 */ mediaTags() { return this.__util .send( `query { MediaTagCollection { id name description category isAdult } }`, null ) .then((data) => { return data.MediaTagCollection; }); } /** * Grabs the site's statistics over the last seven days * @return { AniListStats } * @since 1.14.0 */ siteStatistics() { return this.__util .send( `query { SiteStatistics { users (sort: DATE_DESC, perPage: 7) { nodes { date count change } } anime (sort: DATE_DESC, perPage: 7) { nodes { date count change } } manga (sort: DATE_DESC, perPage: 7) { nodes { date count change } } characters (sort: DATE_DESC, perPage: 7) { nodes { date count change } } staff (sort: DATE_DESC, perPage: 7) { nodes { date count change } } studios (sort: DATE_DESC, perPage: 7) { nodes { date count change } } reviews (sort: DATE_DESC, perPage: 7) { nodes { date count change } } } }`, null ) .then((data) => { return data.SiteStatistics; }); } } module.exports = AniList; </code></pre> </article> </section> </div> <br class="clear" /> <footer> Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> using the <a href="https://github.com/clenemt/docdash">docdash</a> theme. </footer> <script> prettyPrint(); </script> <script src="scripts/polyfill.js"></script> <script src="scripts/linenumber.js"></script> <script src="scripts/search.js" defer></script> </body> </html>