|
|
@ -9,13 +9,13 @@ import { MWMediaType } from "../metadata/types"; |
|
|
|
|
|
|
|
|
|
|
|
const netfilmBase = "https://net-film.vercel.app"; |
|
|
|
const netfilmBase = "https://net-film.vercel.app"; |
|
|
|
|
|
|
|
|
|
|
|
const qualityMap = { |
|
|
|
const qualityMap: Record<number, MWStreamQuality> = { |
|
|
|
"360": MWStreamQuality.Q360P, |
|
|
|
360: MWStreamQuality.Q360P, |
|
|
|
"480": MWStreamQuality.Q480P, |
|
|
|
540: MWStreamQuality.Q540P, |
|
|
|
"720": MWStreamQuality.Q720P, |
|
|
|
480: MWStreamQuality.Q480P, |
|
|
|
"1080": MWStreamQuality.Q1080P, |
|
|
|
720: MWStreamQuality.Q720P, |
|
|
|
|
|
|
|
1080: MWStreamQuality.Q1080P, |
|
|
|
}; |
|
|
|
}; |
|
|
|
type QualityInMap = keyof typeof qualityMap; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
registerProvider({ |
|
|
|
registerProvider({ |
|
|
|
id: "netfilm", |
|
|
|
id: "netfilm", |
|
|
@ -24,6 +24,9 @@ registerProvider({ |
|
|
|
type: [MWMediaType.MOVIE, MWMediaType.SERIES], |
|
|
|
type: [MWMediaType.MOVIE, MWMediaType.SERIES], |
|
|
|
|
|
|
|
|
|
|
|
async scrape({ media, episode, progress }) { |
|
|
|
async scrape({ media, episode, progress }) { |
|
|
|
|
|
|
|
if (!this.type.includes(media.meta.type)) { |
|
|
|
|
|
|
|
throw new Error("Unsupported type"); |
|
|
|
|
|
|
|
} |
|
|
|
// search for relevant item
|
|
|
|
// search for relevant item
|
|
|
|
const searchResponse = await proxiedFetch<any>( |
|
|
|
const searchResponse = await proxiedFetch<any>( |
|
|
|
`/api/search?keyword=${encodeURIComponent(media.meta.title)}`, |
|
|
|
`/api/search?keyword=${encodeURIComponent(media.meta.title)}`, |
|
|
@ -54,8 +57,8 @@ registerProvider({ |
|
|
|
const data = watchInfo.data; |
|
|
|
const data = watchInfo.data; |
|
|
|
|
|
|
|
|
|
|
|
// get best quality source
|
|
|
|
// get best quality source
|
|
|
|
const source = data.qualities.reduce((p: any, c: any) => |
|
|
|
const source: { url: string; quality: number } = data.qualities.reduce( |
|
|
|
c.quality > p.quality ? c : p |
|
|
|
(p: any, c: any) => (c.quality > p.quality ? c : p) |
|
|
|
); |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
const mappedCaptions = data.subtitles.map((sub: Record<string, any>) => ({ |
|
|
|
const mappedCaptions = data.subtitles.map((sub: Record<string, any>) => ({ |
|
|
@ -71,7 +74,7 @@ registerProvider({ |
|
|
|
streamUrl: source.url |
|
|
|
streamUrl: source.url |
|
|
|
.replace("akm-cdn", "aws-cdn") |
|
|
|
.replace("akm-cdn", "aws-cdn") |
|
|
|
.replace("gg-cdn", "aws-cdn"), |
|
|
|
.replace("gg-cdn", "aws-cdn"), |
|
|
|
quality: qualityMap[source.quality as QualityInMap], |
|
|
|
quality: qualityMap[source.quality], |
|
|
|
type: MWStreamType.HLS, |
|
|
|
type: MWStreamType.HLS, |
|
|
|
captions: mappedCaptions, |
|
|
|
captions: mappedCaptions, |
|
|
|
}, |
|
|
|
}, |
|
|
@ -124,8 +127,8 @@ registerProvider({ |
|
|
|
const data = episodeStream.data; |
|
|
|
const data = episodeStream.data; |
|
|
|
|
|
|
|
|
|
|
|
// get best quality source
|
|
|
|
// get best quality source
|
|
|
|
const source = data.qualities.reduce((p: any, c: any) => |
|
|
|
const source: { url: string; quality: number } = data.qualities.reduce( |
|
|
|
c.quality > p.quality ? c : p |
|
|
|
(p: any, c: any) => (c.quality > p.quality ? c : p) |
|
|
|
); |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
const mappedCaptions = data.subtitles.map((sub: Record<string, any>) => ({ |
|
|
|
const mappedCaptions = data.subtitles.map((sub: Record<string, any>) => ({ |
|
|
@ -141,7 +144,7 @@ registerProvider({ |
|
|
|
streamUrl: source.url |
|
|
|
streamUrl: source.url |
|
|
|
.replace("akm-cdn", "aws-cdn") |
|
|
|
.replace("akm-cdn", "aws-cdn") |
|
|
|
.replace("gg-cdn", "aws-cdn"), |
|
|
|
.replace("gg-cdn", "aws-cdn"), |
|
|
|
quality: qualityMap[source.quality as QualityInMap], |
|
|
|
quality: qualityMap[source.quality], |
|
|
|
type: MWStreamType.HLS, |
|
|
|
type: MWStreamType.HLS, |
|
|
|
captions: mappedCaptions, |
|
|
|
captions: mappedCaptions, |
|
|
|
}, |
|
|
|
}, |
|
|
|