Add overrides for proxying specific domains

This commit is contained in:
mrjvs
2024-01-06 17:34:40 +01:00
parent cc0dc6af64
commit 97fe076afa
2 changed files with 26 additions and 14 deletions

View File

@@ -3,24 +3,15 @@ import { streamSSE } from 'hono/streaming';
import { cors } from 'hono/cors'; import { cors } from 'hono/cors';
import { import {
ScrapeMedia, ScrapeMedia,
makeProviders,
makeStandardFetcher,
targets,
} from '@movie-web/providers'; } from '@movie-web/providers';
import { ZodError, z } from 'zod'; import { ZodError, z } from 'zod';
import { embedSchema, scrapeAllSchema, sourceSchema } from '@/schema'; import { embedSchema, scrapeAllSchema, sourceSchema } from '@/schema';
import { validateTurnstile } from '@/turnstile'; import { validateTurnstile } from '@/turnstile';
import { getProviders } from '@/providers';
// hono doesn't export this type, so we retrieve it from a function // hono doesn't export this type, so we retrieve it from a function
type SSEStreamingApi = Parameters<Parameters<typeof streamSSE>['1']>['0']; type SSEStreamingApi = Parameters<Parameters<typeof streamSSE>['1']>['0'];
const fetcher = makeStandardFetcher(fetch);
const providers = makeProviders({
fetcher,
target: targets.BROWSER,
});
const app = new Hono(); const app = new Hono();
function isTurnstileEnabled(context: Context<Env>) { function isTurnstileEnabled(context: Context<Env>) {
@@ -103,7 +94,7 @@ app.get('/scrape', async (context) => {
} }
try { try {
const output = await providers.runAll({ const output = await getProviders(context).runAll({
media, media,
events: { events: {
discoverEmbeds(evt) { discoverEmbeds(evt) {
@@ -176,7 +167,7 @@ app.get('/scrape/embed', async (context) => {
await writeSSEEvent(stream, 'token', jwtResponse); await writeSSEEvent(stream, 'token', jwtResponse);
} }
try { try {
const output = await providers.runEmbedScraper({ const output = await getProviders(context).runEmbedScraper({
id: embedInput.id, id: embedInput.id,
url: embedInput.url, url: embedInput.url,
events: { events: {
@@ -240,7 +231,7 @@ app.get('/scrape/source', async (context) => {
await writeSSEEvent(stream, 'token', jwtResponse); await writeSSEEvent(stream, 'token', jwtResponse);
} }
try { try {
const output = await providers.runSourceScraper({ const output = await getProviders(context).runSourceScraper({
id: sourceInput.id, id: sourceInput.id,
media: sourceInput, media: sourceInput,
events: { events: {
@@ -268,7 +259,7 @@ app.get('/scrape/source', async (context) => {
}); });
app.get('/metadata', 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; export default app;

21
src/providers.ts Normal file
View File

@@ -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<Env>) {
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,
});
}