@yuna0x0/anilist-node
Version:
A lightweight Node.js wrapper for the AniList API
491 lines (452 loc) • 18.1 kB
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>