Skip to content

Commit bbf3148

Browse files
committed
chore: add 9anime crawler
1 parent 2061127 commit bbf3148

2 files changed

Lines changed: 54 additions & 0 deletions

File tree

src/app/crawlers/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { GogoPlayCrawler } from './vosten/gogoplay.crawler';
1818
import { YugenAnimeCrawler } from './vosten/yugenanime.crawler';
1919
import { GogoAnimeTvCrawler } from './vosten/gogoanimetv.crawler';
2020
import { AnimensionCrawler } from './vosten/animension.crawler';
21+
import { NineAnimeCrawler } from './vosten/9anime.crawler';
2122
// vostfr
2223
import { AnimeKoCrawler } from './vostfr/animeko.crawler';
2324
import { AnimeResistanceCrawler } from './vostfr/animeresistance.crawler';
@@ -65,6 +66,7 @@ const crawlersList = {
6566
YugenAnimeCrawler,
6667
AnimixPlayCrawler,
6768
GogoAnimeCrawler,
69+
NineAnimeCrawler,
6870
],
6971
vostar: [
7072
WitAnimeCrawler,
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { LatestEpisodesCrawler } from '../abstract/latest-episodes.crawler';
2+
import { ScraperService } from '../../services/scraper.service';
3+
import { Episode } from '../../models/episode';
4+
import { Observable } from 'rxjs';
5+
import { toNumber } from 'src/app/helpers/number.helper';
6+
7+
export class NineAnimeCrawler extends LatestEpisodesCrawler {
8+
constructor(private scraper: ScraperService) {
9+
super('9Anime', 'https://9anime.id');
10+
this.filters = {
11+
...this.filters,
12+
number: (text: string) => {
13+
const num = text.match(/Ep (\d+)/i);
14+
return toNumber(num?.length ? num[1] : text);
15+
},
16+
url: (text: string, element: any) => {
17+
const number = this.scraper.htmlParser.find(
18+
element,
19+
'div.tag.ep | number',
20+
this.filters
21+
);
22+
return `${this.filters.concatUrl(text)}/ep-${number}`;
23+
},
24+
subtitles: (text: string) => {
25+
return 'vosten';
26+
},
27+
};
28+
}
29+
30+
_getLatestEpisodes(): Observable<Episode[]> {
31+
return this.scraper.scrape(
32+
encodeURI(
33+
`${this.baseUrl}/filter?status[]=airing&language[]=subbed&sort=release_date:desc`
34+
),
35+
'ul.anime-list > li',
36+
{
37+
anime: {
38+
title: 'a.name',
39+
cover: 'a.poster img@src',
40+
},
41+
number: 'div.tag.ep | number',
42+
streamLinks: [
43+
{
44+
url: 'a.name@href | url',
45+
lang: '| subtitles',
46+
},
47+
],
48+
},
49+
this.filters
50+
);
51+
}
52+
}

0 commit comments

Comments
 (0)