
Research
/Security News
Mini Shai-Hulud Campaign Hits Red Hat Cloud Services npm Packages
A mini Shai-Hulud campaign compromised Red Hat Cloud Services npm packages to steal developer and CI/CD secrets during installation.
aniwatch-fork
Advanced tools
๐ฆ A fork of aniwatch, a scraper package serving anime information from hianimez.to
Aniwatch
[!IMPORTANT]
- This package is just an unofficial package for hianimez.to and is in no other way officially related to the same.
- The content that this package provides is not mine, nor is it hosted by me. These belong to their respective owners. This package just demonstrates how to build a package that scrapes websites and uses their content.
To use aniwatch package in your project, run:
pnpm add aniwatch
# or "yarn add aniwatch"
# or "npm install aniwatch"
Example - getting information about an anime by providing it's unique anime id, using anime Steins;Gate with steinsgate-3 unique anime id as an example.
import { HiAnime, HiAnimeError } from "aniwatch";
const hianime = new HiAnime.Scraper();
try {
const data: HiAnime.ScrapedAnimeAboutInfo = await hianime.getInfo(
"steinsgate-3"
);
console.log(data);
} catch (err) {
console.error(err instanceof HiAnimeError, err);
}
getHomePageimport { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
hianime
.getHomePage()
.then((data) => console.log(data))
.catch((err) => console.error(err));
{
genres: ["Action", "Cars", "Adventure", ...],
latestEpisodeAnimes: [
{
id: string,
name: string,
poster: string,
type: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
spotlightAnimes: [
{
id: string,
name: string,
jname: string,
poster: string,
description: string,
rank: number,
otherInfo: string[],
episodes: {
sub: number,
dub: number,
},
},
{...},
],
top10Animes: {
today: [
{
episodes: {
sub: number,
dub: number,
},
id: string,
name: string,
poster: string,
rank: number
},
{...},
],
month: [...],
week: [...]
},
topAiringAnimes: [
{
id: string,
name: string,
jname: string,
poster: string,
},
{...},
],
topUpcomingAnimes: [
{
id: string,
name: string,
poster: string,
duration: string,
type: string,
rating: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
trendingAnimes: [
{
id: string,
name: string,
poster: string,
rank: number,
},
{...},
],
mostPopularAnimes: [
{
id: string,
name: string,
poster: string,
type: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
mostFavoriteAnimes: [
{
id: string,
name: string,
poster: string,
type: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
latestCompletedAnimes: [
{
id: string,
name: string,
poster: string,
type: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
}
getAZList| Parameter | Type | Description | Required? | Default |
|---|---|---|---|---|
sortOption | string | The az-list sort option. Possible values include: "all", "other", "0-9" and all english alphabets . | Yes | -- |
page | number | The page number of the result. | No | 1 |
import { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
hianime
.getAZList("0-9", 1)
.then((data) => console.log(data))
.catch((err) => console.error(err));
{
sortOption: "0-9",
animes: [
{
id: string,
name: string,
jname: string,
poster: string,
duration: string,
type: string,
rating: string,
episodes: {
sub: number ,
dub: number
}
},
{...}
],
totalPages: 1,
currentPage: 1,
hasNextPage: false
}
getQtipInfo| Parameter | Type | Description | Required? | Default |
|---|---|---|---|---|
animeId | string | The unique anime id (in kebab case). | Yes | -- |
import { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
hianime
.getQtipInfo("one-piece-100")
.then((data) => console.log(data))
.catch((err) => console.error(err));
{
anime: {
id: "one-piece-100",
name: "One Piece",
malscore: string,
quality: string,
episodes: {
sub: number,
dub: number
},
type: string,
description: string,
jname: string,
synonyms: string,
aired: string,
status: string,
genres: ["Action", "Adventure", "Comedy", "Drama", "Fantasy", "Shounen", "Drama", "Fantasy", "Shounen", "Fantasy", "Shounen", "Shounen", "Super Power"]
}
}
getAnimeAboutInfo| Parameter | Type | Description | Required? | Default |
|---|---|---|---|---|
animeId | string | The unique anime id (in kebab case). | Yes | -- |
import { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
hianime
.getInfo("steinsgate-3")
.then((data) => console.log(data))
.catch((err) => console.error(err));
{
anime: [
info: {
id: string,
name: string,
poster: string,
description: string,
stats: {
rating: string,
quality: string,
episodes: {
sub: number,
dub: number
},
type: string,
duration: string
},
promotionalVideos: [
{
title: string | undefined,
source: string | undefined,
thumbnail: string | undefined
},
{...},
],
characterVoiceActor: [
{
character: {
id: string,
poster: string,
name: string,
cast: string
},
voiceActor: {
id: string,
poster: string,
name: string,
cast: string
}
},
{...},
]
}
moreInfo: {
aired: string,
genres: ["Action", "Mystery", ...],
status: string,
studios: string,
duration: string
...
}
],
mostPopularAnimes: [
{
episodes: {
sub: number,
dub: number,
},
id: string,
jname: string,
name: string,
poster: string,
type: string
},
{...},
],
recommendedAnimes: [
{
id: string,
name: string,
poster: string,
duration: string,
type: string,
rating: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
relatedAnimes: [
{
id: string,
name: string,
poster: string,
duration: string,
type: string,
rating: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
seasons: [
{
id: string,
name: string,
title: string,
poster: string,
isCurrent: boolean
},
{...}
]
}
getAnimeSearchResults| Parameter | Type | Description | Required? | Default |
|---|---|---|---|---|
q | string | The search query, i.e. the title of the item you are looking for. | Yes | -- |
page | number | The page number of the result. | No | 1 |
type | string | Type of the anime. eg: movie | No | -- |
status | string | Status of the anime. eg: finished-airing | No | -- |
rated | string | Rating of the anime. eg: r+ or pg-13 | No | -- |
score | string | Score of the anime. eg: good or very-good | No | -- |
season | string | Season of the aired anime. eg: spring | No | -- |
language | string | Language category of the anime. eg: sub or sub-&-dub | No | -- |
start_date | string | Start date of the anime(yyyy-mm-dd). eg: 2014-10-2 | No | -- |
end_date | string | End date of the anime(yyyy-mm-dd). eg: 2010-12-4 | No | -- |
sort | string | Order of sorting the anime result. eg: recently-added | No | -- |
genres | string | Genre of the anime, separated by commas. eg: isekai,shounen | No | -- |
[!TIP]
For both
start_dateandend_date, year must be mentioned. If you wanna omit date or month specify0instead. Eg: omitting date -> 2014-10-0, omitting month -> 2014-0-12, omitting both -> 2014-0-0
import { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
hianime
.search("monster", 1, {
genres: "seinen,psychological",
})
.then((data) => {
console.log(data);
})
.catch((err) => {
console.error(err);
});
{
animes: [
{
id: string,
name: string,
poster: string,
duration: string,
type: string,
rating: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
mostPopularAnimes: [
{
episodes: {
sub: number,
dub: number,
},
id: string,
jname: string,
name: string,
poster: string,
type: string
},
{...},
],
currentPage: 1,
totalPages: 1,
hasNextPage: false,
searchQuery: string,
searchFilters: {
[filter_name]: [filter_value]
...
}
}
getAnimeSearchSuggestion| Parameter | Type | Description | Required? | Default |
|---|---|---|---|---|
q | string | The search suggestion query. | Yes | -- |
import { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
hianime
.searchSuggestions("one piece")
.then((data) => console.log(data))
.catch((err) => console.error(err));
{
suggestions: [
{
id: string,
name: string,
poster: string,
jname: string,
moreInfo: ["Mar 4, 2000", "Movie", "50m"]
},
{...},
],
}
getProducerAnimes| Parameter | Type | Description | Required? | Default |
|---|---|---|---|---|
name | string | The name of anime producer (in kebab case). | Yes | |
page | number | The page number of the result. | No | 1 |
import { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
hianime
.getProducerAnimes("toei-animation", 2)
.then((data) => console.log(data))
.catch((err) => console.error(err));
{
producerName: "Toei Animation Anime",
animes: [
{
id: string,
name: string,
poster: string,
duration: string,
type: string,
rating: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
top10Animes: {
today: [
{
episodes: {
sub: number,
dub: number,
},
id: string,
name: string,
poster: string,
rank: number
},
{...},
],
month: [...],
week: [...]
},
topAiringAnimes: [
{
episodes: {
sub: number,
dub: number,
},
id: string,
jname: string,
name: string,
poster: string,
type: string
},
{...},
],
currentPage: 2,
totalPages: 11,
hasNextPage: true,
}
getGenreAnime| Parameter | Type | Description | Required? | Default |
|---|---|---|---|---|
name | string | The name of anime genre (in kebab case). | Yes | -- |
page | number | The page number of the result. | No | 1 |
import { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
hianime
.getGenreAnime("shounen", 2)
.then((data) => console.log(data))
.catch((err) => console.error(err));
{
genreName: "Shounen Anime",
animes: [
{
id: string,
name: string,
poster: string,
duration: string,
type: string,
rating: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
genres: ["Action", "Cars", "Adventure", ...],
topAiringAnimes: [
{
episodes: {
sub: number,
dub: number,
},
id: string,
jname: string,
name: string,
poster: string,
type: string
},
{...},
],
currentPage: 2,
totalPages: 38,
hasNextPage: true
}
getAnimeCategory| Parameter | Type | Description | Required? | Default |
|---|---|---|---|---|
category | string | The category of anime. | Yes | -- |
page | number | The page number of the result. | No | 1 |
import { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
hianime
.getCategoryAnime("subbed-anime")
.then((data) => console.log(data))
.catch((err) => console.error(err));
// categories ->
// "most-favorite", "most-popular", "subbed-anime", "dubbed-anime",
// "recently-updated", "recently-added", "top-upcoming", "top-airing",
// "movie", "special", "ova", "ona", "tv", "completed"
{
category: "TV Series Anime",
animes: [
{
id: string,
name: string,
poster: string,
duration: string,
type: string,
rating: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
genres: ["Action", "Cars", "Adventure", ...],
top10Animes: {
today: [
{
episodes: {
sub: number,
dub: number,
},
id: string,
name: string,
poster: string,
rank: number
},
{...},
],
month: [...],
week: [...]
},
currentPage: 2,
totalPages: 100,
hasNextPage: true
}
getEstimatedSchedule| Parameter | Type | Description | Required? | Default |
|---|---|---|---|---|
date (yyyy-mm-dd) | string | The date of the desired schedule. (months & days must have 2 digits) | Yes | -- |
tzOffset | number | The timezone offset in minutes (defaults to -330 i.e. IST) | No | -330 |
import { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
const timezoneOffset = -330; // IST offset in minutes
hianime
.getEstimatedSchedule("2025-06-09", timezoneOffset)
.then((data) => console.log(data))
.catch((err) => console.error(err));
{
scheduledAnimes: [
{
id: string,
time: string, // 24 hours format
name: string,
jname: string,
airingTimestamp: number,
secondsUntilAiring: number
},
{...}
]
}
getNextEpisodeSchedule| Parameter | Type | Description | Required? | Default |
|---|---|---|---|---|
animeId | string | The unique anime id (in kebab case). | Yes | -- |
import { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
hianime
.getNextEpisodeSchedule("one-piece-100")
.then((data) => console.log(data))
.catch((err) => console.error(err));
{
airingISOTimestamp: string | null,
airingTimestamp: number | null,
secondsUntilAiring: number | null
}
getAnimeEpisodes| Parameter | Type | Description | Required? | Default |
|---|---|---|---|---|
animeId | string | The unique anime id. | Yes | -- |
import { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
hianime
.getEpisodes("steinsgate-3")
.then((data) => console.log(data))
.catch((err) => console.error(err));
{
totalEpisodes: 24,
episodes: [
{
number: 1,
isFiller: false,
title: "Turning Point",
episodeId: "steinsgate-3?ep=213"
},
{...}
]
}
getEpisodeServers| Parameter | Type | Description | Required? | Default |
|---|---|---|---|---|
episodeId | string | The unique episode id. | Yes | -- |
import { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
hianime
.getEpisodeServers("steinsgate-0-92?ep=2055")
.then((data) => console.log(data))
.catch((err) => console.error(err));
{
episodeId: "steinsgate-0-92?ep=2055",
episodeNo: 5,
sub: [
{
serverId: 4,
serverName: "vidstreaming",
},
{...}
],
dub: [
{
serverId: 1,
serverName: "megacloud",
},
{...}
],
raw: [
{
serverId: 1,
serverName: "megacloud",
},
{...}
],
}
getAnimeEpisodeSources| Parameter | Type | Description | Required? | Default |
|---|---|---|---|---|
id | string | The id of the episode. | Yes | -- |
server | string | The name of the server. | No | "vidstreaming" |
category | string | The category of the episode ('sub', 'dub' or 'raw'). | No | "sub" |
import { HiAnime } from "aniwatch";
const hianime = new HiAnime.Scraper();
hianime
.getEpisodeSources("steinsgate-3?ep=230", "hd-1", "sub")
.then((data) => console.log(data))
.catch((err) => console.error(err));
{
headers: {
Referer: string,
"User-Agent": string,
...
},
sources: [
{
url: string, // .m3u8 hls streaming file
isM3U8: boolean,
quality?: string,
},
{...}
],
subtitles: [
{
lang: "English",
url: string, // .vtt subtitle file
},
{...}
],
anilistID: number | null,
malID: number | null,
}
Pull requests are always welcome. If you encounter any bug or want to add a new feature to this package, consider creating a new issue. If you wish to contribute to this project, read the CONTRIBUTING.md file.
Thanks to the following people for keeping this project alive and relevant.
Don't forget to leave a star ๐. You can also follow me on X (Twitter) @riteshgsh.
This project is licensed under the MIT License - see the LICENSE file for more details.
FAQs
๐ฆ A fork of aniwatch, a scraper package serving anime information from hianimez.to
We found that aniwatch-fork demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.ย It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
A mini Shai-Hulud campaign compromised Red Hat Cloud Services npm packages to steal developer and CI/CD secrets during installation.

Research
/Security News
The North Korean malware loader hides in a Packagist-listed package and its GitHub branch to fetch and execute remote code in a likely Contagious Interview-style lure.

Security News
The Rust project is moving toward formal rules on LLM use in contributions after months of internal debate over maintainer burden, code quality, and contributor experience.