From 32b36e047d0986d444df9efc19dab360286d9c23 Mon Sep 17 00:00:00 2001 From: Jelle van Snik Date: Sun, 20 Feb 2022 15:49:55 +0100 Subject: [PATCH] Added stream scraping Co-authored-by: James Hawkins --- src/providers/list/temp/index.ts | 12 ++++++++++-- src/providers/list/theflix/index.ts | 27 +++++++++++++++++++++++++++ src/providers/types.ts | 21 ++++++++++++++------- src/providers/wrapper.ts | 3 ++- 4 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/providers/list/temp/index.ts b/src/providers/list/temp/index.ts index 9530b7a1..99d26c86 100644 --- a/src/providers/list/temp/index.ts +++ b/src/providers/list/temp/index.ts @@ -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 { - return []; + return [ + ]; + }, + + async getStream(media: MWPortableMedia): Promise { + return { + url: "hi", + type: "mp4", + }; }, }; diff --git a/src/providers/list/theflix/index.ts b/src/providers/list/theflix/index.ts index de226788..2f9f1049 100644 --- a/src/providers/list/theflix/index.ts +++ b/src/providers/list/theflix/index.ts @@ -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 { + 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" }; + }, }; diff --git a/src/providers/types.ts b/src/providers/types.ts index 39338bab..3b568b41 100644 --- a/src/providers/types.ts +++ b/src/providers/types.ts @@ -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; searchForMedia(query: MWQuery): Promise; + getStream(media: MWPortableMedia): Promise; } 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; + }; } diff --git a/src/providers/wrapper.ts b/src/providers/wrapper.ts index 60b8bf08..d6ad1dc0 100644 --- a/src/providers/wrapper.ts +++ b/src/providers/wrapper.ts @@ -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; searchForMedia(query: MWQuery): Promise; + getStream(media: MWPortableMedia): Promise; } export function WrapProvider(