You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
增加一个自定义tmdbapi地址
可以使用clodflare反代tmdb api
下面这个代码可以反代api.themoviedb.org
// node_modules/reflare/dist/src/database/workers-kv.jsvarWorkersKV=class{namespace;constructor(namespace){this.namespace=namespace;}get=async(key)=>{constvalue=awaitthis.namespace.get(key,{type: "json",cacheTtl: 60});returnvalue;};put=async(key,value)=>{awaitthis.namespace.put(key,JSON.stringify(value));};delete=async(key)=>{awaitthis.namespace.delete(key);};};// node_modules/reflare/dist/src/middleware.jsvarusePipeline=(...initMiddlewares)=>{conststack=[...initMiddlewares];constpush=(...middlewares)=>{stack.push(...middlewares);};constexecute=async(context)=>{construnner=async(prevIndex,index)=>{if(index===prevIndex){thrownewError("next() called multiple times");}if(index>=stack.length){return;}constmiddleware=stack[index];constnext=async()=>runner(index,index+1);awaitmiddleware(context,next);};awaitrunner(-1,0);};return{
push,
execute
};};// node_modules/reflare/dist/src/middlewares/cors.jsvaruseCORS=async(context,next)=>{awaitnext();const{ request, response, route }=context;constcorsOptions=route.cors;if(corsOptions===void0){return;}const{ origin, methods, exposedHeaders, allowedHeaders, credentials, maxAge }=corsOptions;constrequestOrigin=request.headers.get("origin");if(requestOrigin===null||origin===false){return;}constcorsHeaders=newHeaders(response.headers);if(origin===true){corsHeaders.set("Access-Control-Allow-Origin",requestOrigin);}elseif(Array.isArray(origin)){if(origin.includes(requestOrigin)){corsHeaders.set("Access-Control-Allow-Origin",requestOrigin);}}elseif(origin==="*"){corsHeaders.set("Access-Control-Allow-Origin","*");}if(Array.isArray(methods)){corsHeaders.set("Access-Control-Allow-Methods",methods.join(","));}elseif(methods==="*"){corsHeaders.set("Access-Control-Allow-Methods","*");}else{constrequestMethod=request.headers.get("Access-Control-Request-Method");if(requestMethod!==null){corsHeaders.set("Access-Control-Allow-Methods",requestMethod);}}if(Array.isArray(exposedHeaders)){corsHeaders.set("Access-Control-Expose-Headers",exposedHeaders.join(","));}elseif(exposedHeaders==="*"){corsHeaders.set("Access-Control-Expose-Headers","*");}if(Array.isArray(allowedHeaders)){corsHeaders.set("Access-Control-Allow-Headers",allowedHeaders.join(","));}elseif(allowedHeaders==="*"){corsHeaders.set("Access-Control-Allow-Headers","*");}else{constrequestHeaders=request.headers.get("Access-Control-Request-Headers");if(requestHeaders!==null){corsHeaders.set("Access-Control-Allow-Headers",requestHeaders);}}if(credentials===true){corsHeaders.set("Access-Control-Allow-Credentials","true");}if(maxAge!==void0&&Number.isInteger(maxAge)){corsHeaders.set("Access-Control-Max-Age",maxAge.toString());}context.response=newResponse(response.body,{status: response.status,statusText: response.statusText,headers: corsHeaders});};// node_modules/reflare/dist/src/middlewares/firewall.jsvarfields=/* @__PURE__ */newSet(["country","continent","asn","ip","hostname","user-agent"]);varoperators=/* @__PURE__ */newSet(["equal","not equal","greater","less","in","not in","contain","not contain","match","not match"]);varvalidateFirewall=({ field, operator, value })=>{if(field===void0||operator===void0||value===void0){thrownewError("Invalid 'firewall' field in the option object");}if(fields.has(field)===false){thrownewError("Invalid 'firewall' field in the option object");}if(operators.has(operator)===false){thrownewError("Invalid 'firewall' field in the option object");}};vargetFieldParam=(request,field)=>{constcfProperties=request.cf;switch(field){case"asn":
returncfProperties?.asn;case"continent":
returncfProperties?.continent;case"country":
returncfProperties?.country;case"hostname":
returnrequest.headers.get("host")||"";case"ip":
returnrequest.headers.get("cf-connecting-ip")||"";case"user-agent":
returnrequest.headers.get("user-agent")||"";default:
returnvoid0;}};varmatchOperator=(fieldParam,value)=>{if(!(valueinstanceofRegExp)){thrownewError("You must use 'new RegExp('...')' for 'value' in firewall configuration to use 'match' or 'not match' operator");}returnvalue.test(fieldParam.toString());};varnotMatchOperator=(fieldParam,value)=>!matchOperator(fieldParam,value);varequalOperator=(fieldParam,value)=>fieldParam===value;varnotEqualOperator=(fieldParam,value)=>fieldParam!==value;vargreaterOperator=(fieldParam,value)=>{if(typeoffieldParam!=="number"||typeofvalue!=="number"){thrownewError("You must use number for 'value' in firewall configuration to use 'greater' or 'less' operator");}returnfieldParam>value;};varlessOperator=(fieldParam,value)=>{if(typeoffieldParam!=="number"||typeofvalue!=="number"){thrownewError("You must use number for 'value' in firewall configuration to use 'greater' or 'less' operator");}returnfieldParam<value;};varcontainOperator=(fieldParam,value)=>{if(typeoffieldParam!=="string"||typeofvalue!=="string"){thrownewError("You must use string for 'value' in firewall configuration to use 'contain' or 'not contain' operator");}returnfieldParam.includes(value);};varnotContainOperator=(fieldParam,value)=>!containOperator(fieldParam,value);varinOperator=(fieldParam,value)=>{if(!Array.isArray(value)){thrownewError("You must use an Array for 'value' in firewall configuration to use 'in' or 'not in' operator");}returnvalue.some((item)=>item===fieldParam);};varnotInOperator=(fieldParam,value)=>!inOperator(fieldParam,value);varoperatorsMap={match: matchOperator,contain: containOperator,equal: equalOperator,in: inOperator,greater: greaterOperator,less: lessOperator,"not match": notMatchOperator,"not contain": notContainOperator,"not equal": notEqualOperator,"not in": notInOperator};varuseFirewall=async(context,next)=>{const{ request, route }=context;if(route.firewall===void0){awaitnext();return;}route.firewall.forEach(validateFirewall);for(const{ field, operator, value }ofroute.firewall){constfieldParam=getFieldParam(request,field);if(fieldParam!==void0&&operatorsMap[operator](fieldParam,value)){thrownewError("You don't have permission to access this service.");}}awaitnext();};// node_modules/reflare/dist/src/middlewares/headers.jsvarsetForwardedHeaders=(headers)=>{headers.set("X-Forwarded-Proto","https");consthost=headers.get("Host");if(host!==null){headers.set("X-Forwarded-Host",host);}constip=headers.get("cf-connecting-ip");constforwardedForHeader=headers.get("X-Forwarded-For");if(ip!==null&&forwardedForHeader===null){headers.set("X-Forwarded-For",ip);}};varuseHeaders=async(context,next)=>{const{ request, route }=context;constrequestHeaders=newHeaders(request.headers);setForwardedHeaders(requestHeaders);if(route.headers===void0){context.request=newRequest(request.url,{body: request.body,method: request.method,headers: requestHeaders});awaitnext();return;}if(route.headers.request!==void0){for(const[key,value]ofObject.entries(route.headers.request)){if(value.length===0){requestHeaders.delete(key);}else{requestHeaders.set(key,value);}}}context.request=newRequest(request.url,{body: request.body,method: request.method,headers: requestHeaders});awaitnext();const{ response }=context;constresponseHeaders=newHeaders(response.headers);if(route.headers.response!==void0){for(const[key,value]ofObject.entries(route.headers.response)){if(value.length===0){responseHeaders.delete(key);}else{responseHeaders.set(key,value);}}}context.response=newResponse(response.body,{status: response.status,statusText: response.statusText,headers: responseHeaders});};// node_modules/reflare/dist/src/utils.jsvargetHostname=(request)=>{consturl=newURL(request.url);returnurl.host;};varcastToIterable=(value)=>Array.isArray(value) ? value : [value];// node_modules/reflare/dist/src/middlewares/load-balancing.jsvarvalidateUpstream=(upstream)=>{if(upstream.domain===void0){thrownewError("Invalid 'upstream' field in the option object");}};varipHashHandler=(upstream,request)=>{constipString=request.headers.get("cf-connecting-ip")||"0.0.0.0";constuserIP=ipString.split(".").map((octet,index,array)=>parseInt(octet,10)*256**(array.length-index-1)).reduce((accumulator,current)=>accumulator+current);returnupstream[userIP%upstream.length];};varrandomHandler=(upstream)=>{constweights=upstream.map((option)=>option.weight===void0 ? 1 : option.weight);consttotalWeight=weights.reduce((acc,num,index)=>{constsum=acc+num;weights[index]=sum;returnsum;});if(totalWeight===0){thrownewError("Total weights should be greater than 0.");}constrandom=Math.random()*totalWeight;for(constindexofweights.keys()){if(weights[index]>=random){returnupstream[index];}}returnupstream[Math.floor(Math.random()*upstream.length)];};varhandlersMap={random: randomHandler,"ip-hash": ipHashHandler};varuseLoadBalancing=async(context,next)=>{const{ request, route }=context;const{ upstream, loadBalancing }=route;if(upstream===void0){thrownewError("The required 'upstream' field in the option object is missing");}constupstreamIterable=castToIterable(upstream);upstreamIterable.forEach(validateUpstream);if(loadBalancing===void0){context.upstream=randomHandler(upstreamIterable,request);awaitnext();return;}constpolicy=loadBalancing.policy||"random";constpolicyHandler=handlersMap[policy];context.upstream=policyHandler(upstreamIterable,request);awaitnext();};// node_modules/reflare/dist/src/middlewares/upstream.jsvarrewriteURL=(url,upstream)=>{constcloneURL=newURL(url);const{ domain, port, protocol }=upstream;cloneURL.hostname=domain;if(protocol!==void0){cloneURL.protocol=`${protocol}:`;}if(port===void0){cloneURL.port="";}else{cloneURL.port=port.toString();}returncloneURL.href;};varuseUpstream=async(context,next)=>{const{ request, upstream }=context;if(upstream===null){awaitnext();return;}consturl=rewriteURL(request.url,upstream);context.request=newRequest(url,context.request);if(upstream.onRequest){constonRequest=castToIterable(upstream.onRequest);context.request=onRequest.reduce((reducedRequest,fn)=>fn(reducedRequest,url),request);}context.response=(awaitfetch(context.request)).clone();if(upstream.onResponse){constonResponse=castToIterable(upstream.onResponse);context.response=onResponse.reduce((reducedResponse,fn)=>fn(reducedResponse,url),context.response);}awaitnext();};// node_modules/reflare/dist/src/index.jsvarfilter=(request,routeList)=>{consturl=newURL(request.url);for(constrouteofrouteList){if(route.methods===void0||route.methods.includes(request.method)){constmatch=castToIterable(route.path).some((path)=>{constre=RegExp(`^${path.replace(/(\/?)\*/g,"($1.*)?").replace(/\/$/,"").replace(/:(\w+)(\?)?(\.)?/g,"$2(?<$1>[^/]+)$2$3").replace(/\.(?=[\w(])/,"\\.").replace(/\)\.\?\(([^[]+)\[\^/g,"?)\\.?($1(?<=\\.)[^\\.")}/*$`);returnurl.pathname.match(re);});if(match){returnroute;}}}returnvoid0;};vardefaultOptions={provider: "static",routeList: []};varuseReflare=async(options=defaultOptions)=>{constpipeline=usePipeline(useFirewall,useLoadBalancing,useHeaders,useCORS,useUpstream);constrouteList=[];if(options.provider==="static"){for(constrouteofoptions.routeList){routeList.push(route);}}if(options.provider==="kv"){constdatabase=newWorkersKV(options.namespace);constrouteListKV=awaitdatabase.get("route-list")||[];for(constrouteKVofrouteListKV){routeList.push(routeKV);}}consthandle=async(request)=>{constroute=filter(request,routeList);if(route===void0){returnnewResponse("Failed to find a route that matches the path and method of the current request",{status: 500});}constcontext={request: request.clone(),
route,hostname: getHostname(request),response: newResponse("Unhandled response"),upstream: null};try{awaitpipeline.execute(context);}catch(error){if(errorinstanceofError){context.response=newResponse(error.message,{status: 500});}}returncontext.response;};constunshift=(route)=>{routeList.unshift(route);};constpush=(route)=>{routeList.push(route);};return{
handle,
unshift,
push
};};varsrc_default=useReflare;// src/index.tsvarsrc_default2={asyncfetch(request){constreflare=awaitsrc_default();reflare.push({path: "/*",upstream: {domain: "api.themoviedb.org",protocol: "https"},cors: {origin: "*"}});returnreflare.handle(request);}};export{src_default2asdefault};//# sourceMappingURL=index.js.map
The text was updated successfully, but these errors were encountered:
增加一个自定义tmdbapi地址
可以使用clodflare反代tmdb api
下面这个代码可以反代
api.themoviedb.org
The text was updated successfully, but these errors were encountered: