Added stream scraping

Co-authored-by: James Hawkins <jhawki2005@gmail.com>
This commit is contained in:
Jelle van Snik 2022-02-20 15:49:55 +01:00
parent c763cfe0f0
commit 32b36e047d
4 changed files with 53 additions and 10 deletions

View file

@ -5,7 +5,7 @@ import {
MWQuery,
} from "providers/types";
import { MWProviderMediaResult } from "providers";
import { MWMediaStream, MWProviderMediaResult } from "providers";
export const tempScraper: MWMediaProvider = {
id: "temp",
@ -24,6 +24,14 @@ export const tempScraper: MWMediaProvider = {
},
async searchForMedia(query: MWQuery): Promise<MWProviderMediaResult[]> {
return [];
return [
];
},
async getStream(media: MWPortableMedia): Promise<MWMediaStream> {
return {
url: "hi",
type: "mp4",
};
},
};

View file

@ -2,6 +2,7 @@ import {
MWMediaProvider,
MWMediaType,
MWPortableMedia,
MWMediaStream,
MWQuery,
} from "providers/types";
@ -13,6 +14,7 @@ import {
import { getDataFromPortableSearch } from "providers/list/theflix/portableToMedia";
import { MWProviderMediaResult } from "providers";
import { CORS_PROXY_URL } from "mw_constants";
export const theFlixScraper: MWMediaProvider = {
id: "theflix",
@ -43,4 +45,29 @@ export const theFlixScraper: MWMediaProvider = {
return results;
},
async getStream(media: MWPortableMedia): Promise<MWMediaStream> {
let url = "";
if (media.mediaType === MWMediaType.MOVIE) {
url = `${CORS_PROXY_URL}https://theflix.to/movie/${media.mediaId}?movieInfo=${media.mediaId}`;
} else if (media.mediaType === MWMediaType.SERIES) {
url = `${CORS_PROXY_URL}https://theflix.to/tv-show/${media.mediaId}/season-${media.season}/episode-${media.episode}`;
}
const res = await fetch(url).then((d) => d.text());
const prop: HTMLElement | undefined = Array.from(
new DOMParser()
.parseFromString(res, "text/html")
.querySelectorAll("script")
).find((e) => e.textContent?.includes("theflixvd.b-cdn"));
if (!prop || !prop.textContent) {
throw new Error("Could not find stream");
}
const data = JSON.parse(prop.textContent);
return { url: data.props.pageProps.videoUrl, type: "mp4" };
},
};

View file

@ -12,6 +12,12 @@ export interface MWPortableMedia {
episode?: number;
}
export type MWMediaStreamType = "m3u8" | "mp4";
export interface MWMediaStream {
url: string;
type: MWMediaStreamType;
}
export interface MWMedia extends MWPortableMedia {
title: string;
year: string;
@ -32,17 +38,18 @@ export interface MWMediaProvider {
getMediaFromPortable(media: MWPortableMedia): Promise<MWProviderMediaResult>;
searchForMedia(query: MWQuery): Promise<MWProviderMediaResult[]>;
getStream(media: MWPortableMedia): Promise<MWMediaStream>;
}
export interface MWMassProviderOutput {
providers: {
id: string,
success: boolean,
id: string;
success: boolean;
}[];
results: MWMedia[],
results: MWMedia[];
stats: {
total: number,
failed: number,
succeeded: number,
}
total: number;
failed: number;
succeeded: number;
};
}

View file

@ -1,8 +1,9 @@
import { MWMedia, MWMediaProvider, MWPortableMedia, MWQuery } from "./types";
import { MWMedia, MWMediaProvider, MWMediaStream, MWPortableMedia, MWQuery } from "./types";
export interface MWWrappedMediaProvider extends MWMediaProvider {
getMediaFromPortable(media: MWPortableMedia): Promise<MWMedia>;
searchForMedia(query: MWQuery): Promise<MWMedia[]>;
getStream(media: MWPortableMedia): Promise<MWMediaStream>;
}
export function WrapProvider(