aniki
Version:
Node.js APIs wrapper for anime/manga related content.
827 lines (737 loc) • 16.5 kB
text/typescript
/**
* Basic `MyAnimeList`/`MyMangaList` error response.
* @since 1.4.0
*/
interface IMALError {
/**
* Error type.
*/
error: string;
/**
* Error message.
*/
message: string;
}
/**
* Anime or manga fields depending on the T choosen.
* @since 1.4.0
*/
type TMALFields<T extends IMALAnime | IMALManga> = Exclude<
keyof T,
"id" | "title" | "main_picture"
>;
/**
* Anime ranking types.
*
* - `all` : *Top Anime Series*
* - `airing` : *Top Airing Anime*
* - `upcoming` : *Top Upcoming Anime*
* - `tv` : *Top Anime TV Series*
* - `ova` : *Top Anime OVA Series*
* - `movie` : *Top Anime Movies*
* - `special` : *Top Anime Specials*
* - `bypopularity` : *Top Anime by Popularity*
* - `favorite` : *Top Favorited Anime*
* @since 1.4.3
*/
type TMALRankingType =
| "all"
| "airing"
| "upcoming"
| "tv"
| "ova"
| "movie"
| "special"
| "bypopularity"
| "favorite";
/**
* Manga ranking types.
*
* - `all`: *All*
* - `manga` : *Top Manga*
* - `novels` : *Top Novels*
* - `oneshots`: *Top One-shots*
* - `doujin` : *Top Doujinshi*
* - `manhwa` : *Top Manhwa*
* - `manhua` : *Top Manhua*
* - `bypopularity` : *Most Popular*
* - `favorite` : *Most Favorited*
* @since 1.4.3
*/
type TMMLRankingType =
| "all"
| "manga"
| "novels"
| "oneshots"
| "doujin"
| "manhwa"
| "manhua"
| "bypopularity"
| "favorite";
/**
* All seasons in the year.
*
* - `spring` : *April*, *May*, *June*
* - `summer` : *July*, *August*, *September*
* - `fall` : *October*, *November*, *December*
* - `winter` : *January*, *February*, *March*
* @since 1.4.3
*/
type TMALSeason = "spring" | "summer" | "fall" | "winter";
/**
* Anime age rating categories.
*
* - `g` : *All Ages*
* - `pg` : *Children*
* - `pg_13` : *Teens 13 and Older*
* - `r` : *17+ (violence & profanity)*
* - `r+` : *Profanity & Mild Nudity*
* - `rx` : *Hentai*
* @since 1.4.3
*/
type TMALRating = "g" | "pg" | "pg_13" | "r" | "r+" | "rx";
/**
* Anime / Manga NSFW categories.
*
* - `white` : *This work is safe for work*
* - `gray` : *This work may be not safe for work*
* - `black` : *This work is not safe for work*
* @since 1.4.3
*/
type TMALNsfwCategories = "white" | "grey" | "black";
/**
* Anime media types.
* @since 1.4.3
*/
type TMALMediaTypes =
| "unknown"
| "tv"
| "ova"
| "movie"
| "special"
| "ona"
| "music";
/**
* Manga media types.
* @since 1.4.3
*/
type TMMLMediaTypes =
| "manga"
| "novel"
| "one_shot"
| "doujinshi"
| "manhwa"
| "manhua"
| "oel";
/**
* Anime status.
* @since 1.4.3
*/
type TMALStatus = "finished_airing" | "currently_airing" | "not_yet_aired";
/**
* Manga status.
* @since 1.4.3
*/
type TMMStatus = "finished" | "currently_plublishing" | "not_yet_published";
/**
* User anime status.
* @since 1.4.3
*/
type TMALUserStatus =
| "watching"
| "completed"
| "on_hold"
| "dropped"
| "plan_to_watch";
/**
* User manga status.
* @since 1.4.3
*/
type TMMLUserStatus =
| "reading"
| "completed"
| "on_hold"
| "dropped"
| "plan_to_read";
/**
* Content related to the anime or manga.
* @since 1.4.3
*/
type TMALRelationNode =
| "sequel"
| "prequel"
| "alternative_setting"
| "alternative_version"
| "side_story"
| "parent_story"
| "summary"
| "full_story";
/**
* Anime / Manga sources.
* @since 1.4.3
*/
type TMALSources =
| "other"
| "original"
| "manga"
| "4_koma_manga"
| "web_manga"
| "digital_manga"
| "novel"
| "light_novel"
| "visual_novel"
| "game"
| "card_game"
| "book"
| "picture_book"
| "radio"
| "music";
// Interfaces
/**
* Basic parameters of the API.
* @since 1.4.3
*/
interface IMALBasicParams {
/**
* Pagination system.
* - `0` : First page
* - `1` : Second page
* - `2` : Third page
* - . . .
*/
offset?: number | `${number}`;
/**
* Limiting the results.
* - `MyAnimeList#find`
* - Default: `100`
* - Maximum: `100`
* - `MyAnimeList#ranking`
* - Default: `100`
* - Maximum: `500`
* - `MyAnimeList#seasonal`
* - Default: `100`
* - Maximum: `500`
*
* These limits also apply on the `MyMangaList` methods.
*/
limit?: number | `${number}`;
}
/**
* Interface parameter for `find` methods.
* @since 1.4.0
*/
interface IMALFind extends IMALBasicParams {
/**
* Finding anime or manga based on a query.
*/
q: string;
}
/**
* Interface parameter for `MyAnimeList#details` method.
* @since 1.4.0
*/
interface IMALDetails {
/**
* Unique ID of the anime.
*/
anime_id: number;
}
/**
* Interface parameter for `MyMangaList#details` method.
* @since 1.4.3
*/
interface IMMLDetails {
/**
* Unique ID of the manga.
*/
manga_id: number;
}
/**
* Interface parameter for `MyAnimeList#ranking` method.
* @since 1.4.3
*/
interface IMALRanking extends IMALBasicParams {
/**
* Listing animes based on any ranking category.
*
* - `all` : *Top Anime Series*
* - `airing` : *Top Airing Anime*
* - `upcoming` : *Top Upcoming Anime*
* - `tv` : *Top Anime TV Series*
* - `ova` : *Top Anime OVA Series*
* - `movie` : *Top Anime Movies*
* - `special` : *Top Anime Specials*
* - `bypopularity` : *Top Anime by Popularity*
* - `favorite` : *Top Favorited Anime*
*/
ranking_type: TMALRankingType;
}
/**
* Interface parameter for `MyAnimeList#seasonal` method.
* @since 1.4.3
*/
interface IMALSeason extends IMALBasicParams {
/**
* Listing animes based on the year of publication.
*/
year: number;
/**
* Listing animes based on the season of publication.
*
* - `spring` : *April*, *May*, *June*
* - `summer` : *July*, *August*, *September*
* - `fall` : *October*, *November*, *December*
* - `winter` : *January*, *February*, *March*
*/
season: TMALSeason;
/**
* Sort animes.
*/
sort?: "anime_score" | "anime_num_list_users";
}
/**
* Interface parameter for `MyMangaList#ranking` method.
* @since 1.4.3
*/
interface IMMLRanking extends IMALBasicParams {
/**
* Listing animes based on a ranking type.
*
* - `all`: *All*
* - `manga` : *Top Manga*
* - `novels` : *Top Novels*
* - `oneshots`: *Top One-shots*
* - `doujin` : *Top Doujinshi*
* - `manhwa` : *Top Manhwa*
* - `manhua` : *Top Manhua*
* - `bypopularity` : *Most Popular*
* - `favorite` : *Most Favorited*
*/
ranking_type: TMMLRankingType;
}
/**
* Anime statistics status.
* @since 1.4.3
*/
interface IMALStatisticsStatus {
/**
* How much users are currently watching this anime.
*/
watching: number;
/**
* How much users have completed this anime.
*/
completed: number;
/**
* How much users are still on progress.
*/
on_hold: number;
/**
* How much users have lost the want to watch this anime.
*/
dropped: number;
/**
* How much users are planning to watch this anime in the future.
*/
plan_to_watch: number;
}
/**
* Anime statistics
* @since 1.4.3
*/
interface IMALStatistics {
status: IMALStatisticsStatus;
num_list_users: number;
}
/**
* @since 1.4.3
*/
interface IMALMyListStatus {
status: TMALUserStatus;
score: number;
num_episodes_watched: number;
/**
* If the user is rewatching this anime.
*/
is_rewatching: boolean;
/**
* When the user did begin watching this anime.
*/
start_date: Date | null;
/**
* When the user did finish watching this anime.
*/
finish_date: Date | null;
priority: number;
/**
* How much the user did rewatch this anime.
*/
num_times_rewatched: number;
/**
* How much the user did rewatch this anime.
*/
rewatch_value: number;
tags: string[];
comments: string;
/**
* Last update of this anime in this user list.
*/
updated_at: Date;
}
/**
* @since 1.4.3
*/
interface IMMLMyListStatus {
status: TMMLUserStatus | null;
score: number;
/**
* How much volumes the user did read this manga.
*/
num_volumes_read: number;
/**
* How much chapters the user did read this manga.
*/
num_chapters_read: number;
/**
* If the user is rereading this manga.
*/
is_rereading: boolean;
/**
* When the user did begin reading this manga.
*/
start_date: Date | null;
/**
* When the user did finish reading this manga.
*/
finish_date: Date | null;
priority: number;
/**
* How much the user did reread this manga.
*/
num_times_reread: number;
reread_value: number;
tags: string[];
/**
* Comments that made the user on this manga.
*/
comments: string;
/**
* Last update of this manga in the user list.
*/
updated_at: Date;
}
/**
* @since 1.4.3
*/
interface IMALBroadCast {
day_of_the_week: string;
start_time: string | null;
}
/**
* @since 1.4.3
*/
interface IMALMainPicture {
medium: string;
large: string | null;
}
/**
* The available alternative titles.
* - `synonyms` : *One Punch Man 3rd Season*, *OPM 3*
* - `ja` : *ワンパンマン 3*
* - `en` : *One-Punch Man Season 3*
* @since 1.4.3
*/
interface IMALAlternativeTitles {
/**
* Different synonyms of the main title.
* - *One Punch Man 3rd Season*, *OPM 3*
*/
synonyms: string[] | null;
/**
* The japanese version of the main title.
* - *ワンパンマン 3*
*/
ja: string | null;
/**
* The english version of the main title.
* - *One-Punch Man Season 3*
*/
en: string | null;
}
/**
* The MyAnimeList "node".
* @since 1.4.0
*/
interface IMALNode {
node: {
id: number;
title: string;
main_picture: IMALMainPicture;
};
relation_type: TMALRelationNode;
relation_type_formatted: string;
role: string | null;
num_recommendations: number | null;
}
/**
* The additional interface of the `MyAnimeList`/`MyMangaList#ranking` method.
* @since 1.4.3
*/
interface IMALRankingRes {
ranking: {
rank: number;
previous_rank: number | null;
};
}
/**
* The additional interface of the `MyAnimeList#seasonal` method.
* @since 1.4.3
*/
interface IMALSeasonRes {
season: {
year: number;
season: TMALSeason;
};
}
/**
* @since 1.4.3
*/
interface IMALNameAndId {
id?: number;
name?: string;
}
/**
* Basic JSON response of an anime.
* @since 1.4.0
*/
interface IMALAnime {
/**
* The ID of this anime. (MyAnimeList related)
*/
id: number;
/**
* The main title.
*/
title: string;
/**
* The main picture.
*/
main_picture: IMALMainPicture;
/**
* Alternative titles. (**synonyms**, **ja**, **en**)
*/
alternative_titles: IMALAlternativeTitles;
/**
* The start date of the anime airing.
*/
start_date: string | null;
/**
* The end date of the anime airing.
*/
end_date: string | null;
/**
* The synopsis (description) of the anime.
*/
synopsis: string | null;
mean: number | null;
rank: number | null;
popularity: number | null;
num_list_users: number;
num_scoring_users: number;
/**
* The different NSFW categories of MyAnimeList.
*
* - `white` : *This work is safe for work*
* - `gray` : *This work may be not safe for work*
* - `black` : *This work is not safe for work*
*/
nsfw: TMALNsfwCategories | null;
/**
* Creation date of the document. (in myanimelist)
*/
created_at: Date;
/**
* Last update of the document. (in myanimelist)
*/
updated_at: Date;
media_type: TMALMediaTypes;
status: TMALStatus;
genres: IMALNameAndId[];
my_list_status: IMALMyListStatus | null;
num_episodes: number;
/**
* Starting season information.
*/
start_season: {
/**
* Beginning year of the anime production.
*/
year: number;
/**
* Beginning season of the anime production.
*/
season: TMALSeason;
} | null;
broadcast: IMALBroadCast | null;
source: TMALSources | null;
average_episode_duration: number | null;
/**
* The different rating categories of MyAnimeList.
*
* - `g` : *All Ages*
* - `pg` : *Children*
* - `pg_13` : *Teens 13 and Older*
* - `r` : *17+ (violence & profanity)*
* - `r+` : *Profanity & Mild Nudity*
* - `rx` : *Hentai*
* */
rating: TMALRating;
pictures: IMALMainPicture[];
background: string | null;
/**
* Related anime content based on this anime.
*/
related_anime: IMALNode[];
/**
* Related manga content based on this anime.
*/
related_manga: IMALNode[];
/**
* Recommended content based on this anime.
*/
recommendations: IMALNode[];
/**
* Studio(s) that made the anime.
*/
studios: IMALNameAndId[];
statistics: IMALStatistics | null;
}
/**
* @since 1.4.3
*/
interface IMALManga {
/**
* The ID of this manga. (MyAnimeList related)
*/
id: number;
/**
* The main title.
*/
title: string;
/**
* The main picture.
*/
main_picture: IMALMainPicture;
alternative_titles: IMALAlternativeTitles;
start_date: string | null;
end_date: string | null;
synopsis: string | null;
mean: number | null;
rank: number | null;
popularity: number | null;
num_list_users: number;
num_scoring_users: number;
/**
* The different NSFW categories of MyAnimeList.
*
* - `white` : *This work is safe for work*
* - `gray` : *This work may be not safe for work*
* - `black` : *This work is not safe for work*
*/
nsfw: TMALNsfwCategories | null;
created_at: Date;
updated_at: Date;
media_type: TMMLMediaTypes;
status: TMMStatus;
genres: IMALNameAndId[];
my_list_status: IMMLMyListStatus | null;
num_volumes: number;
num_chapters: number;
authors: {
node: {
id: number;
first_name: string;
last_name: string;
};
}[];
broadcast: IMALBroadCast;
source: string;
average_episode_duration: number;
pictures: IMALMainPicture;
background: string | null;
related_anime: IMALNode[];
related_manga: IMALNode[];
recommendations: IMALNode[];
serialization: IMALNode[];
}
/**
* @template M A readonly model type extending either `IMALAnime` or `IMALManga`.
* Determines the shape of each media node.
*
* @template F A readonly array of keys from `M` (filtered through `TMALFields`),
* specifying which additional fields should be included for each node.
* These fields are picked dynamically and merged into the node.
*
* @template A An optional readonly metadata object extending ranking, seasonal,
* or any custom response properties. Used to enrich the response
* with extra contextual information.
*
* @since 1.4.3
*/
type TMALList<
M extends Readonly<IMALAnime | IMALManga>,
F extends readonly TMALFields<M>[],
A extends Readonly<IMALRankingRes | IMALSeasonRes | {}>,
> = {
data: {
node: Pick<M, F[number]> & {
id: number;
title: string;
main_picture: IMALMainPicture;
};
}[];
paging: {
next: string | null;
previous: string | null;
};
} & A;
export type {
// Interfaces
IMALAlternativeTitles,
IMALAnime,
IMALBasicParams,
IMALBroadCast,
IMALDetails,
IMALError,
IMALFind,
IMALMainPicture,
IMALManga,
IMALMyListStatus,
IMALNameAndId,
IMALNode,
IMALRanking,
IMALRankingRes,
IMALSeason,
IMALSeasonRes,
IMALStatistics,
IMALStatisticsStatus,
IMMLDetails,
IMMLMyListStatus,
IMMLRanking,
// Types
TMALFields,
TMALList,
TMALMediaTypes,
TMALNsfwCategories,
TMALRankingType,
TMALRating,
TMALRelationNode,
TMALSeason,
TMALSources,
TMALStatus,
TMALUserStatus,
TMMLMediaTypes,
TMMLRankingType,
TMMLUserStatus,
TMMStatus,
};