Skip to content

Commit bd2aec8

Browse files
authored
Add support for zoro dubs (#93)
* Added support for zoro dubs * Can now fetch episodes based on the episode id * commiting yarn build
1 parent dc6fb27 commit bd2aec8

File tree

10 files changed

+86
-48
lines changed

10 files changed

+86
-48
lines changed

dist/providers/anime/enime.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/providers/anime/enime.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/providers/anime/zoro.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ declare class Zoro extends AnimeParser {
1818
* @param episodeId Episode id
1919
*/
2020
fetchEpisodeSources: (episodeId: string, server?: StreamingServers) => Promise<ISource>;
21+
private retrieveServerId;
2122
/**
2223
* @param page Page number
2324
*/

dist/providers/anime/zoro.js

Lines changed: 29 additions & 21 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/providers/anime/zoro.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/providers/meta/anilist.js

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/providers/meta/anilist.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/providers/anime/enime.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,8 @@ class Enime extends AnimeParser {
156156
)
157157
?.target.split('/')
158158
.pop()
159-
.replace('?ep=', '$episode$')!,
159+
.replace('?ep=', '$episode$')
160+
?.concat(useType === 'zoro' ? "$sub" : "")!,
160161
description: episode.description,
161162
number: episode.number,
162163
title: episode.title,

src/providers/anime/zoro.ts

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
IEpisodeServer,
1313
StreamingServers,
1414
MediaFormat,
15+
SubOrSub,
1516
} from '../../models';
1617

1718
import { StreamSB, USER_AGENT, RapidCloud, StreamTape } from '../../utils';
@@ -93,6 +94,15 @@ class Zoro extends AnimeParser {
9394
info.type = $('span.item').last().prev().prev().text().toUpperCase() as MediaFormat;
9495
info.url = `${this.baseUrl}/${id}`;
9596

97+
const subDub = $('div.film-stats span.item div.tick-dub').toArray().map((value) => $(value).text().toLowerCase())
98+
if (subDub.length > 1) {
99+
info.subOrDub = SubOrSub.BOTH
100+
} else if (subDub.length > 0) {
101+
info.subOrDub = subDub[0] as SubOrSub
102+
} else {
103+
info.subOrDub = SubOrSub.SUB
104+
}
105+
96106
const episodesAjax = await axios.get(`${this.baseUrl}/ajax/v2/episode/list/${id.split('-').pop()}`, {
97107
headers: {
98108
'X-Requested-With': 'XMLHttpRequest',
@@ -105,7 +115,7 @@ class Zoro extends AnimeParser {
105115
info.totalEpisodes = $$('div.detail-infor-content > div > a').length;
106116
info.episodes = [];
107117
$$('div.detail-infor-content > div > a').each((i, el) => {
108-
const episodeId = $$(el).attr('href')?.split('/')[2]?.replace('?ep=', '$episode$')!;
118+
const episodeId = $$(el).attr('href')?.split('/')[2]?.replace('?ep=', '$episode$')?.concat(`$${info.subOrDub}`)!;
109119
const number = parseInt($$(el).attr('data-number')!);
110120
const title = $$(el).attr('title');
111121
const url = this.baseUrl + $$(el).attr('href');
@@ -161,7 +171,13 @@ class Zoro extends AnimeParser {
161171
}
162172
}
163173
if (!episodeId.includes('$episode$')) throw new Error('Invalid episode id');
164-
episodeId = `${this.baseUrl}/watch/${episodeId.replace('$episode$', '?ep=')}`;
174+
175+
// Fallback to using sub if no info found in case of compatibility
176+
177+
// TODO: add both options later
178+
let subOrDub:'sub' | 'dub' = episodeId.split('$')?.pop() === 'dub' ? 'dub' : 'sub';
179+
180+
episodeId = `${this.baseUrl}/watch/${episodeId.replace('$episode$', '?ep=').replace(/\$auto|\$sub|\$dub/gi, '')}`;
165181

166182
try {
167183
const { data } = await axios.get(
@@ -180,36 +196,24 @@ class Zoro extends AnimeParser {
180196
try {
181197
switch (server) {
182198
case StreamingServers.VidCloud:
183-
serverId = $('div.ps_-block.ps_-block-sub.servers-sub > div.ps__-list > div')
184-
.map((i, el) => ($(el).attr('data-server-id') == '1' ? $(el) : null))
185-
.get()[0]
186-
.attr('data-id')!;
199+
serverId = this.retrieveServerId($, 1, subOrDub);
187200

188201
// zoro's vidcloud server is rapidcloud
189202
if (!serverId) throw new Error('RapidCloud not found');
190203
break;
191204
case StreamingServers.VidStreaming:
192-
serverId = $('div.ps_-block.ps_-block-sub.servers-sub > div.ps__-list > div')
193-
.map((i, el) => ($(el).attr('data-server-id') == '4' ? $(el) : null))
194-
.get()[0]
195-
.attr('data-id')!;
205+
serverId = this.retrieveServerId($, 4, subOrDub);
196206

197207
// zoro's vidcloud server is rapidcloud
198-
if (!serverId) throw new Error('RapidCloud not found');
208+
if (!serverId) throw new Error('vidtreaming not found');
199209
break;
200210
case StreamingServers.StreamSB:
201-
serverId = $('div.ps_-block.ps_-block-sub.servers-sub > div.ps__-list > div')
202-
.map((i, el) => ($(el).attr('data-server-id') == '5' ? $(el) : null))
203-
.get()[0]
204-
.attr('data-id')!;
211+
serverId = this.retrieveServerId($, 5, subOrDub);
205212

206213
if (!serverId) throw new Error('StreamSB not found');
207214
break;
208215
case StreamingServers.StreamTape:
209-
serverId = $('div.ps_-block.ps_-block-sub.servers-sub > div.ps__-list > div')
210-
.map((i, el) => ($(el).attr('data-server-id') == '3' ? $(el) : null))
211-
.get()[0]
212-
.attr('data-id')!;
216+
serverId = this.retrieveServerId($, 3, subOrDub);
213217

214218
if (!serverId) throw new Error('StreamTape not found');
215219
break;
@@ -227,6 +231,13 @@ class Zoro extends AnimeParser {
227231
}
228232
};
229233

234+
private retrieveServerId = ($: any, index: number, subOrDub: 'sub' | 'dub') => {
235+
return $(`div.ps_-block.ps_-block-sub.servers-${subOrDub} > div.ps__-list > div`)
236+
.map((i: any, el: any) => ($(el).attr('data-server-id') == `${index}` ? $(el) : null))
237+
.get()[0]
238+
.attr('data-id')!;
239+
}
240+
230241
/**
231242
* @param page Page number
232243
*/

src/providers/meta/anilist.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,15 @@ class Anilist extends AnimeParser {
639639
return [];
640640
}
641641

642+
if (this.provider instanceof Zoro) {
643+
// Set the correct episode sub/dub request type
644+
possibleAnime.episodes.forEach((_: any, index: number) => {
645+
if (possibleAnime.subOrDub === SubOrSub.BOTH) {
646+
possibleAnime.episodes[index].id = possibleAnime.episodes[index].id.replace(`$both`, dub ? '$dub' : '$sub');
647+
}
648+
});
649+
}
650+
642651
const possibleProviderEpisodes = possibleAnime.episodes;
643652

644653
const options = {

0 commit comments

Comments
 (0)