From 97fe076afa8d914b63ce4723908cbc204247f7a1 Mon Sep 17 00:00:00 2001 From: mrjvs Date: Sat, 6 Jan 2024 17:34:40 +0100 Subject: [PATCH] Add overrides for proxying specific domains --- src/index.ts | 19 +++++-------------- src/providers.ts | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 src/providers.ts diff --git a/src/index.ts b/src/index.ts index 8b4a32c..8704ffc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,24 +3,15 @@ import { streamSSE } from 'hono/streaming'; import { cors } from 'hono/cors'; import { ScrapeMedia, - makeProviders, - makeStandardFetcher, - targets, } from '@movie-web/providers'; import { ZodError, z } from 'zod'; import { embedSchema, scrapeAllSchema, sourceSchema } from '@/schema'; import { validateTurnstile } from '@/turnstile'; +import { getProviders } from '@/providers'; // hono doesn't export this type, so we retrieve it from a function type SSEStreamingApi = Parameters['1']>['0']; -const fetcher = makeStandardFetcher(fetch); - -const providers = makeProviders({ - fetcher, - target: targets.BROWSER, -}); - const app = new Hono(); function isTurnstileEnabled(context: Context) { @@ -103,7 +94,7 @@ app.get('/scrape', async (context) => { } try { - const output = await providers.runAll({ + const output = await getProviders(context).runAll({ media, events: { discoverEmbeds(evt) { @@ -176,7 +167,7 @@ app.get('/scrape/embed', async (context) => { await writeSSEEvent(stream, 'token', jwtResponse); } try { - const output = await providers.runEmbedScraper({ + const output = await getProviders(context).runEmbedScraper({ id: embedInput.id, url: embedInput.url, events: { @@ -240,7 +231,7 @@ app.get('/scrape/source', async (context) => { await writeSSEEvent(stream, 'token', jwtResponse); } try { - const output = await providers.runSourceScraper({ + const output = await getProviders(context).runSourceScraper({ id: sourceInput.id, media: sourceInput, events: { @@ -268,7 +259,7 @@ app.get('/scrape/source', async (context) => { }); app.get('/metadata', async (context) => { - return context.json([providers.listEmbeds(), providers.listSources()]); + return context.json([getProviders(context).listEmbeds(), getProviders(context).listSources()]); }); export default app; diff --git a/src/providers.ts b/src/providers.ts new file mode 100644 index 0000000..8d502db --- /dev/null +++ b/src/providers.ts @@ -0,0 +1,21 @@ +import { makeProviders, makeSimpleProxyFetcher, makeStandardFetcher, targets, Fetcher as RealFetcher } from "@movie-web/providers"; +import { Context, Env } from "hono"; + +const specialDomains = ["showbox.shegu.net", "mbpapi.shegu.net"] +const standardFetcher = makeStandardFetcher(fetch); + +export function getProviders(context: Context) { + const proxyUrl = (context.env?.PROXY_URL as string | undefined) ?? ''; + + const fetcher: RealFetcher = (u,ops) => { + const url = new URL(u); + if (specialDomains.includes(url.hostname) && !!proxyUrl) + return makeSimpleProxyFetcher(proxyUrl, fetch)(u, ops); + return standardFetcher(u, ops); + }; + + return makeProviders({ + fetcher, + target: targets.BROWSER, + }); +}