Merge pull request #9 from movie-web/redirect-where-neccesary

Add ability to proxy some domains
This commit is contained in:
William Oldham
2024-01-06 16:41:27 +00:00
committed by GitHub
3 changed files with 28 additions and 15 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "providers-api", "name": "providers-api",
"version": "1.0.4", "version": "1.1.0",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {

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;

22
src/providers.ts Normal file
View File

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