diff --git a/package.json b/package.json index 9e05c3a..b19334f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "providers-api", - "version": "1.0.4", + "version": "1.1.0", "private": true, "type": "module", "scripts": { 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..b8b2725 --- /dev/null +++ b/src/providers.ts @@ -0,0 +1,22 @@ +import { makeProviders, makeSimpleProxyFetcher, makeStandardFetcher, targets, Fetcher as RealFetcher } from "@movie-web/providers"; +import { Context, Env } from "hono"; + +const standardFetcher = makeStandardFetcher(fetch); + +export function getProviders(context: Context) { + const proxyUrl = (context.env?.PROXY_URL as string | undefined) ?? ''; + const specialDomainsEnv = (context.env?.PROXIED_DOMAINS as string | undefined) ?? ''; + const specialDomains = specialDomainsEnv.split(",").map(v=>v.trim()).filter(v=>v.length>0); + + 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, + }); +}