OpenByteDev/MasterAnime-API

View on GitHub
lib/MasterAnimeAPI.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { Filter, Type } from './Filter';
import { Id, Uri, UriHelper } from './UriHelper';

import axios from 'axios';

export interface AnimeBasic {
    title: string;
    slug: string;
}
export interface Anime extends AnimeBasic {
    id: number;
    status: number;
    type: Type;
    score: number;
    episode_count: number | null;
    started_airing_date: string;
    finished_airing_date: string | null;
}
export interface AnimeDetailed {
    info: AnimeInfo;
    synonyms: Synonym[];
    genres: Genre[];
    poster: string;
    franchise_count: number;
    wallpapers: Wallpaper[];
    episodes: Episode[];
}
export interface AnimeInfo extends AnimeBasic {
    id: number;
    synopsis: string;
    status: number;
    type: Type;
    score: number;
    users_watching: number;
    users_completed: number;
    users_on_hold: number;
    users_planned: number;
    users_dropped: number;
    episode_count: number | null;
    started_airing_date: string;
    finished_airing_date: string | null;
    youtube_trailer_id: string | null;
    age_rating: string;
    episode_length: number;
    tvdb_id: number | null;
    tvdb_season_id: number | null;
    tvdb_episode: null;
    wallpaper_id: string | null;
    wallpaper_offset: number;
    franchise_count: number;
}
export interface Synonym {
    title: string;
    type: number;
}
export interface Genre {
    id: number;
    name: string;
}
export interface Wallpaper {
    id: string;
    file: string;
}
export interface Episode {
    info: EpisodeInfo;
    thumbnail: string;
}
export interface EpisodeInfo {
    id: number;
    anime_id: number;
    episode: string;
    title: string | null;
    tvdb_id: number | null;
    aired: string | null;
    type: number;
    duration: number | null;
    description: string | null;
}
export interface Trending {
    being_watched: TrendingAnime[];
    popular_today: TrendingAnime[];
}
export interface TrendingAnime extends AnimeBasic {
    total: number;
    poster: string;
}
export interface Release {
    anime: AnimeRelease;
    episode: string;
    created_at: string;
}
export interface AnimeRelease extends AnimeBasic {
    id: number;
    duration: number | null;
    age: string;
    poster: string;
    wallpaper: string | null;
}
export interface FilterListing {
    total: number;
    per_page: number;
    current_page: number;
    last_page: number;
    next_page_url: string | null;
    prev_page_url: string | null;
    from: number;
    to: number;
    data: FilterResult[];
}
export interface FilterResult extends AnimeBasic {
    id: number;
    status: number;
    score: number;
    episode_count: number | null;
    started_airing_date: string;
    finished_airing_date: string | null;
    genres: Genre[];
    poster: PosterInfo;
}
export interface PosterInfo {
    id: string;
    path: string;
    extension: string;
    file: string;
}

export class MasterAnimeAPI {

    public static async getAnime(id: Id): Promise<Anime> {
        return (await axios.get(UriHelper.getAnime(id, false))).data;
    }
    public static async getAnimeDetailed(id: Id): Promise<AnimeDetailed> {
        return (await axios.get(UriHelper.getAnime(id, true))).data;
    }
    public static async getEpisode(anime_id: Id, episode: number): Promise<Episode> {
        return (await MasterAnimeAPI.getAnimeDetailed(anime_id)).episodes[episode];
    }
    public static async getEpisodeUrl(anime_id: Id, episode: number): Promise<Uri> {
        const { slug } = await MasterAnimeAPI.getAnime(anime_id);
        return UriHelper.getEpisode(slug, episode);
    }
    public static async getTrending(): Promise<Trending> {
        return (await axios.get(UriHelper.getTrending())).data;
    }
    public static async getReleases(): Promise<Release[]> {
        return (await axios.get(UriHelper.getReleases())).data;
    }
    public static async getFiltering(filter: Filter): Promise<FilterListing> {
        return (await axios.get(UriHelper.getFilter(filter))).data;
    }

}