pstream is dead; long live pstream taciturnaxolotl.github.io/pstream-ng/
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

firefox support (kinda with manual permission set)

Jorrin ccbf8889 6c7f1ace

+56 -11
+1 -1
src/backend/extension/streams.ts
··· 34 34 35 35 export async function prepareStream(stream: Stream) { 36 36 await setDomainRule({ 37 - ruleId: 1, 37 + ruleId: 2, 38 38 targetDomains: extractDomainsFromStream(stream), 39 39 requestHeaders: buildHeadersFromStream(stream), 40 40 });
+26 -10
src/backend/providers/fetchers.ts
··· 1 1 import { Fetcher, makeSimpleProxyFetcher } from "@movie-web/providers"; 2 2 3 - import { sendExtensionRequest } from "@/backend/extension/messaging"; 3 + import { setDomainRule } from "@/backend/extension/messaging"; 4 4 import { getApiToken, setApiToken } from "@/backend/helpers/providerApi"; 5 5 import { getProviderApiUrls, getProxyUrls } from "@/utils/proxyUrls"; 6 + 7 + import { makeFullUrl } from "./utils"; 6 8 7 9 function makeLoadbalancedList(getter: () => string[]) { 8 10 let listIndex = -1; ··· 67 69 68 70 export function makeExtensionFetcher() { 69 71 const fetcher: Fetcher = async (url, ops) => { 70 - const result = await sendExtensionRequest<any>({ 71 - url, 72 - ...ops, 72 + const fullUrl = makeFullUrl(url, ops); 73 + const res = await setDomainRule({ 74 + ruleId: 1, 75 + targetDomains: [fullUrl], 76 + requestHeaders: ops.headers, 73 77 }); 74 - if (!result?.success) throw new Error(`extension error: ${result?.error}`); 75 - const res = result.response; 78 + console.log(res, fullUrl); 79 + const response = await fetch(fullUrl, { 80 + method: ops.method, 81 + headers: ops.headers, 82 + body: ops.body as any, 83 + }); 84 + const contentType = response.headers.get("content-type"); 85 + const body = contentType?.includes("application/json") 86 + ? await response.json() 87 + : await response.text(); 88 + 76 89 return { 77 - body: res.body, 78 - finalUrl: res.finalUrl, 79 - statusCode: res.statusCode, 80 - headers: makeFinalHeaders(ops.readHeaders, res.headers), 90 + body, 91 + finalUrl: response.url, 92 + statusCode: response.status, 93 + headers: makeFinalHeaders( 94 + ops.readHeaders, 95 + Object.fromEntries(response.headers.entries()), 96 + ), 81 97 }; 82 98 }; 83 99 return fetcher;
+29
src/backend/providers/utils.ts
··· 1 + import { DefaultedFetcherOptions } from "@movie-web/providers"; 2 + 3 + export function makeFullUrl( 4 + url: string, 5 + ops?: DefaultedFetcherOptions, 6 + ): string { 7 + // glue baseUrl and rest of url together 8 + let leftSide = ops?.baseUrl ?? ""; 9 + let rightSide = url; 10 + 11 + // left side should always end with slash, if its set 12 + if (leftSide.length > 0 && !leftSide.endsWith("/")) leftSide += "/"; 13 + 14 + // right side should never start with slash 15 + if (rightSide.startsWith("/")) rightSide = rightSide.slice(1); 16 + 17 + const fullUrl = leftSide + rightSide; 18 + if (!fullUrl.startsWith("http://") && !fullUrl.startsWith("https://")) 19 + throw new Error( 20 + `Invald URL -- URL doesn't start with a http scheme: '${fullUrl}'`, 21 + ); 22 + 23 + const parsedUrl = new URL(fullUrl); 24 + Object.entries(ops?.query ?? {}).forEach(([k, v]) => { 25 + parsedUrl.searchParams.set(k, v as string); 26 + }); 27 + 28 + return parsedUrl.toString(); 29 + }