v1 / StreamHub.js
github-actions[bot]
chore: deploy bundle to hf-space (3c775742d8ddca3e24edc4b8396e1aec32441803)
aa037d2
Raw History Blame Contribute Delete
32.6 kB
// @bun
var Te=Object.defineProperty;var Ue=(e)=>e;function Ce(e,t){this[e]=Ue.bind(null,t)}var x=(e,t)=>{for(var o in t)Te(e,o,{get:t[o],enumerable:!0,configurable:!0,set:Ce.bind(t,o)})};var Ie=(e,t)=>()=>(e&&(t=e(e=0)),t);var T={};x(T,{runWithConcurrency:()=>Oe,getTmdbInfo:()=>G});async function Oe(e,t,o=1,r=0){if(!e.length)return[];let i=[],n=0,l=async()=>{while(n<e.length){let s=n++;if(s&&r)await new Promise((a)=>setTimeout(a,r));i[s]=await t(e[s])}};return await Promise.all(Array.from({length:Math.min(o,e.length)},()=>l().catch(()=>{}))),i}async function G(e,t,o){let r=`${e}-${t}-${o||""}`;if(D.has(r))return D.get(r);try{let n=`https://db.videasy.to/3/${t==="tv"?"tv":"movie"}/${e}?append_to_response=external_ids`,l=await fetch(n,{signal:AbortSignal.timeout(1e4)});if(!l.ok)return l.body?.cancel(),{titles:[],year:null,imdbId:null};let s=await l.json(),a=[];if(o&&s.seasons){let g=s.seasons.find((y)=>y.season_number===parseInt(o));if(g?.name)a.push(g.name)}let c=s.title||s.name||"",u=s.original_title||s.original_name||"";if(c)a.push(c);if(u&&u!==c)a.push(u);let d=null,h=s.release_date||s.first_air_date||"";if(h)d=h.slice(0,4);let p=s.imdb_id||s.external_ids?.imdb_id||null,m={titles:[...new Set(a.filter(Boolean))],year:d,imdbId:p};return D.set(r,m),setTimeout(()=>D.delete(r),600000),m}catch{return{titles:[],year:null,imdbId:null}}}var D;var R=Ie(()=>{D=new Map});var z={};x(z,{getStream:()=>_e});var O={Accept:"*/*",Origin:"https://player.videasy.to",Referer:"https://player.videasy.to/"},ue=[{name:"Neon",path:"mb-flix",extra:""},{name:"Yoru",path:"cdn",extra:"",note:"Movies only, may have 4K"},{name:"Cypher",path:"downloader2",extra:""},{name:"Sage",path:"1movies",extra:""},{name:"Breach",path:"m4uhd",extra:""},{name:"Vyse",path:"hdmovie",extra:"",qualityFilter:"English"},{name:"Killjoy",path:"meine",extra:"?language=german"},{name:"Fade",path:"hdmovie",extra:"",qualityFilter:"Hindi"},{name:"Omen",path:"lamovie",extra:""},{name:"Raze",path:"superflix",extra:""}];async function Pe(e,t,o,r,i,n,l,s){let a=o==="tv"?`https://api.videasy.to/${e.path}/sources-with-title?title=${t}&mediaType=tv&year=${s}&episodeId=${l}&seasonId=${n}&tmdbId=${r}&imdbId=${i}${e.extra}`:`https://api.videasy.to/${e.path}/sources-with-title?title=${t}&mediaType=movie&year=${s}&tmdbId=${r}&imdbId=${i}${e.extra}`;try{let c=await fetch(a,{headers:O,signal:AbortSignal.timeout(15000)});if(!c.ok)return{server:e.name,status:"error",error:`HTTP ${c.status}`};let u=await c.text(),h=await(await fetch("https://enc-dec.app/api/dec-videasy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:u,id:r}),signal:AbortSignal.timeout(15000)})).json();if(h.status!==200)return{server:e.name,status:"error",error:h.error||"decrypt failed"};let p={server:e.name,status:"ok",data:h.result};if(e.note)p.note=e.note;if(e.qualityFilter)p.qualityFilter=e.qualityFilter;return p}catch(c){return{server:e.name,status:"error",error:c.message}}}async function _e({id:e,s:t,e:o,config:r}){try{let{getTmdbInfo:i}=await Promise.resolve().then(() => (R(),T)),n=await i(e,t?"tv":"movie",t);if(!n?.titles?.length)return null;let l=n.titles[0],s=n.year||"",a=n.imdbId||"",c=t?"tv":"movie",u=encodeURIComponent(encodeURIComponent(l)),d=c==="tv"?ue.filter((y)=>y.name!=="Yoru"):ue,{runWithConcurrency:h}=await Promise.resolve().then(() => (R(),T)),m=(await h(d,(y)=>Pe(y,u,c,e,a,t,o,s),r?.parallelism,r?.requestGap)).filter((y)=>y.status==="ok");if(!m.length)return null;let g=[];for(let y of m){let f=y.data;if(typeof f==="string")g.push({url:f,headers:{Origin:O.Origin,Referer:O.Referer}});else if(typeof f==="object"&&f){let v=["url","playlist","stream"].find((w)=>typeof f[w]==="string");if(v)g.push({url:f[v],headers:{Origin:O.Origin,Referer:O.Referer}});else{let w=["url","playlist","stream"].find((A)=>Array.isArray(f[A])&&f[A].length);if(w){let A=f[w][0],b=A?.playlist||A?.url;if(b)g.push({url:b,headers:{Origin:O.Origin,Referer:O.Referer}})}}}}return g.length?{allUrls:g}:null}catch{return null}}var B={};x(B,{getStream:()=>je});async function je({id:e,s:t,e:o}){try{let n=(await(await fetch(`https://enc-dec.app/api/enc-vidlink?text=${e}`,{signal:AbortSignal.timeout(15000)})).json())?.result;if(!n)return null;let s=(t?"tv":"movie")==="tv"?`https://vidlink.pro/api/b/tv/${n}/${t}/${o}`:`https://vidlink.pro/api/b/movie/${n}`,a=await fetch(s,{headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36",Origin:"https://vidlink.pro",Referer:"https://vidlink.pro/"},signal:AbortSignal.timeout(15000)});if(!a.ok)return null;let u=(await a.json())?.stream?.playlist;if(!u)return null;let d=u.split("?")[0],h="https://vidlink.pro/",p="https://vidlink.pro",m=u.match(/[?&]headers=([^&]+)/);if(m)try{let g=JSON.parse(decodeURIComponent(m[1]));if(g.referer)h=g.referer;if(g.origin)p=g.origin}catch{}return{url:d,headers:{Origin:p,Referer:h}}}catch{return null}}var X={};x(X,{getStream:()=>He});import Me from"crypto";var de="https://enc-dec.app/api",Ee="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36";async function He({id:e,s:t,e:o}){try{let r=Me.randomBytes(32).toString("hex"),i={"User-Agent":Ee,Referer:"https://hexa.su/",Accept:"text/plain","X-Fingerprint-Lite":"e9136c41504646444","X-Api-Key":r},s=(await(await fetch(`${de}/enc-hexa`,{signal:AbortSignal.timeout(15000)})).json())?.result?.token;if(!s)return null;i["X-Cap-Token"]=s;let c=(t?"tv":"movie")==="tv"?`https://theemoviedb.hexa.su/api/tmdb/tv/${e}/season/${t}/episode/${o}/images`:`https://theemoviedb.hexa.su/api/tmdb/movie/${e}/images`,u=await fetch(c,{headers:i,signal:AbortSignal.timeout(15000)});if(!u.ok)return null;let d=await u.text(),m=(await(await fetch(`${de}/dec-hexa`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:d,key:r}),signal:AbortSignal.timeout(15000)})).json())?.result?.sources||[];if(!m.length)return null;return{allUrls:m.map((y)=>{let f=y.server?y.server.charAt(0).toUpperCase()+y.server.slice(1):"",v=f?`HexaSU ${f}`:"HexaSU";return{url:y.url,label:v,headers:{Referer:"https://hexa.su/","X-Api-Key":r,"X-Cap-Token":i["X-Cap-Token"],"X-Fingerprint-Lite":"e9136c41504646444",Accept:"text/plain"}}})}}catch{return null}}var Y={};x(Y,{getStream:()=>Le});var V={Accept:"*/*",Origin:"https://lordflix.org",Referer:"https://lordflix.org/"};async function We(e,t,o,r,i,n,l,s){let a=o==="tv"?"series":"movie",c=`https://snowhouse.lordflix.club/?title=${encodeURIComponent(t)}&type=${a}&year=${s}&imdb=${r}&tmdb=${i}&server=${e}`;if(o==="tv")c+=`&season=${n}&episode=${l}`;try{let d=await(await fetch(`https://enc-dec.app/api/enc-lordflix?url=${encodeURIComponent(c)}`,{signal:AbortSignal.timeout(15000)})).json();if(d.status!==200)return{server:e,status:"error",error:"encrypt failed"};let{url:h,sign:p}=d.result,m=await fetch(h,{headers:{...V,"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36"},signal:AbortSignal.timeout(15000)});if(!m.ok)return{server:e,status:"error",error:`HTTP ${m.status}`};let g=await m.text(),f=await(await fetch("https://enc-dec.app/api/dec-lordflix",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:g,sign:p}),signal:AbortSignal.timeout(15000)})).json();if(f.status!==200)return{server:e,status:"error",error:"decrypt failed"};return{server:e,status:"ok",data:f.result}}catch(u){return{server:e,status:"error",error:u.message}}}async function Le({id:e,s:t,e:o,config:r}){try{let{getTmdbInfo:i}=await Promise.resolve().then(() => (R(),T)),n=await i(e,t?"tv":"movie",t);if(!n?.titles?.length)return null;let l=await fetch("https://snowhouse.lordflix.club/servers",{headers:{...V,"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36"},signal:AbortSignal.timeout(15000)});if(!l.ok)return null;let a=(await l.json()).servers||[];if(!a.length)return null;let{runWithConcurrency:c}=await Promise.resolve().then(() => (R(),T)),d=(await c(a,(p)=>We(p.name,n.titles[0],t?"tv":"movie",n.imdbId||"",e,t,o,n.year||""),r?.parallelism,r?.requestGap)).filter((p)=>p.status==="ok");if(!d.length)return null;let h=[];for(let p of d)for(let m of p.data?.stream||[])if(m.playlist)h.push({url:m.playlist,headers:{Origin:V.Origin,Referer:V.Referer}});return h.length?{allUrls:h}:null}catch{return null}}var Z={};x(Z,{getStream:()=>Ne});async function Ne({id:e,s:t,e:o}){try{let i=(t?"tv":"movie")==="tv"?`https://streamdata.vaplayer.ru/api.php?tmdb=${e}&type=tv&season=${t}&episode=${o}`:`https://streamdata.vaplayer.ru/api.php?tmdb=${e}&type=movie`,n=await fetch(i,{headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36",Accept:"application/json, text/plain, */*",Referer:"https://nextgencloudfabric.com/"},signal:AbortSignal.timeout(15000)});if(!n.ok)return null;let l=await n.json();if(l.status_code===404)return null;let s=l?.data?.stream_urls;if(!s?.length)return null;return{allUrls:s.map((c)=>({url:c,headers:{Referer:"https://nextgencloudfabric.com/"}}))}}catch{return null}}var Q={};x(Q,{getStream:()=>Je});async function j(e,t,o=3){for(let r=0;r<o;r++)try{let i=await fetch(e,{...t,signal:AbortSignal.timeout(1e4)});if(i.ok)return i}catch{}return null}async function Je({id:e,s:t,e:o}){try{let r={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36"},i=await j("https://www.rivestream.app/api/backendfetch?requestID=VideoProviderServices&secretKey=rive",{headers:r});if(!i)return null;let n=(await i.json()).data||[];if(!n.length)return null;let l=await j("https://www.rivestream.app",{headers:r});if(!l)return null;let a=[...(await l.text()).matchAll(/<script[^>]+src="([^"]+)"/g)].find((f)=>f[1].includes("_app"))?.[1];if(!a)return null;let c=await j("https://www.rivestream.app"+a,{headers:r});if(!c)return null;let u=await c.text(),d=u.match(/c\s*=\s*(\[[^\]]+?\])\s*;?\s*$/m)||u.match(/c\s*=\s*(\[[^\]]+?\])/);if(!d)return null;let h=[...d[1].matchAll(/"([^"]+)"/g)].map((f)=>f[1]);if(!h.length)return null;let p=await j(`https://rivestream.supe2372.workers.dev/?input=${e}&cList=${h.join(",")}`,{headers:r});if(!p)return null;let m=(await p.text()).trim(),g=t?"tv":"movie",y=[];for(let f of n){let v=`RiveStream ${f}`,w=g==="tv"?`https://www.rivestream.app/api/backendfetch?requestID=tvVideoProvider&id=${e}&season=${t}&episode=${o}&service=${f}&secretKey=${m}`:`https://www.rivestream.app/api/backendfetch?requestID=movieVideoProvider&id=${e}&service=${f}&secretKey=${m}`,A=await j(w,{headers:r});if(!A)continue;let b;try{b=await A.json()}catch{continue}let H=b?.data?.sources||[];for(let C of H){let S=C.url;if(!S)continue;if(S.includes("proxy?url="))try{let W=decodeURIComponent(S).split("proxy?url=");if(W.length<2)continue;let I=W[1],L=I.includes("&headers=")?I.split("&headers=")[0]:I,N=decodeURIComponent(L),J=I.includes("&headers=")?I.split("&headers=")[1]:"",P={};try{P=JSON.parse(decodeURIComponent(J))}catch{}y.push({url:N,label:v,headers:{Referer:P.Referer||P.referer||"",Origin:P.Origin||P.origin||""}})}catch{}else y.push({url:S,label:v,headers:{Referer:"",Origin:""}})}}return y.length?{allUrls:y}:null}catch{return null}}var ee={};x(ee,{getStream:()=>Ke});import De from"crypto";var Ve="eDdrOW1QcVQycld2WTh6QTViQzNuRjZoSjJsSzRtTjk=",qe="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36";function Fe(e,t,o,r){let i=Buffer.from(Ve,"base64"),n=i.subarray(0,16),l=t==="tv"&&o?`${e}_${o}_${r}`:String(e),s=16-l.length%16,a=l+String.fromCharCode(s).repeat(s),c=De.createCipheriv("aes-256-cbc",i,n),u=c.update(a,"utf8","base64");return u+=c.final("base64"),u.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function Ke({id:e,s:t,e:o,config:r}){try{let i=t?"tv":"movie",n=Fe(e,i,t,o),l={Origin:"https://vidrock.ru","User-Agent":qe},s=await fetch(`https://vidrock.ru/api/${i}/${n}`,{headers:l,signal:AbortSignal.timeout(15000)});if(!s.ok)return null;let a=await s.json(),{runWithConcurrency:c}=await Promise.resolve().then(() => (R(),T)),u=Object.entries(a).filter(([,p])=>p.url&&p.url!=="null"),h=(await c(u,async([p,m])=>{let g=m.url.includes("%")?decodeURIComponent(m.url):m.url,y=`Vidrock [${p}]`;if(g.includes("/playlist/")){let f=await fetch(g,{headers:l,signal:AbortSignal.timeout(1e4)});if(f.ok)return(await f.json()).filter((w)=>w.url).map((w)=>({url:w.url,label:y,headers:l,resolution:w.resolution}))}return[{url:g,label:y,headers:l}]},r?.parallelism,r?.requestGap)).flat();return h.length?{allUrls:h}:null}catch{return null}}var re={};x(re,{getStream:()=>Qe});import E from"crypto";var $="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36",Ge="https://api-play-270325.ppzj-youtube.cfd/api/tp1rd/playiframe",M={fileId:"jcLycoRJT6OWjoWspgLMOZwS3aSS0lEn",userId:"PZZ3J3LDbLT0GY7qSA5wW5vchqgpO36O",payload:"vlVbUQhkOhoSfyteyzGeeDzU0BHoeTyZ",video:"oJwmvmVBajMaRCTklxbfjavpQO7SZpsL",signature:"KRWN3AdgmxEMcd2vLN1ju9qKe8Feco5h"},ze=["https://m4uhd.vip"],pe=["ppzj-youtube"];function Be(e){return E.createHash("md5").update(e).digest("hex")}function me(e,t){let o=Buffer.alloc(48),r=Buffer.alloc(0),i=0;while(i<48){let n=E.createHash("md5");n.update(r),n.update(e),n.update(t),r=n.digest(),r.copy(o,i),i+=r.length}return{key:o.subarray(0,32),iv:o.subarray(32,48)}}function te(e,t){let o=Buffer.from(e,"hex"),r=o.subarray(8,16),i=o.subarray(16),{key:n,iv:l}=me(t,r),s=E.createDecipheriv("aes-256-cbc",n,l),a=s.update(i,void 0,"utf8");return a+=s.final("utf8"),a}function Xe(e,t){let o=E.randomBytes(8),{key:r,iv:i}=me(t,o),n=E.createCipheriv("aes-256-cbc",r,i),l=n.update(e,"utf8"),s=n.final();return Buffer.concat([Buffer.from("Salted__"),o,l,s]).toString("hex")}function Ye(e,t,o){return JSON.stringify({idfile:e,iduser:t,domain_play:o,platform:"Linux armv81",hlsSupport:!0,jwplayer:{Browser:{androidNative:!1,chrome:!0,edge:!1,facebook:!1,firefox:!1,ie:!1,safari:!1,version:{version:"137.0.0.0",major:137,minor:0}},OS:{android:!0,iOS:!1,mobile:!0,mac:!1,iPad:!1,iPhone:!1,windows:!1,tizen:!1,tizenApp:!1,version:{version:"10",major:10,minor:null}},Features:{iframe:!1}}})}async function fe(e,t){let o=new URL(e).origin,r={"User-Agent":$,Referer:o,"X-Requested-With":"XMLHttpRequest","Content-Type":"application/x-www-form-urlencoded"},i=await fetch(e,{headers:r,signal:AbortSignal.timeout(15000)}).then((f)=>f.text()),n=i.match(/const\s*id(?:file|File)_enc\s*=\s*"([^"]+)"/)?.[1],l=i.match(/const\s*idUser_enc\s*=\s*"([^"]+)"/)?.[1];if(!n||!l)return null;let s=te(n,M.fileId),a=te(l,M.userId),c=Ye(s,a,t||o),u=Xe(c,M.payload),d=Be(u+M.signature),h=`data=${u}%7C${d}`,p=await fetch(Ge,{method:"POST",headers:r,body:h,signal:AbortSignal.timeout(30000)}).then((f)=>f.text()),m;try{m=JSON.parse(p)}catch{return null}let g=m?.data?.split("|")[0];if(!g)return null;return te(g,M.video)}async function Ze(e,t){let o=encodeURIComponent(e.toLowerCase().replace(/[^a-z0-9 ]/g,""));for(let r of ze)try{let i=`${r}/search/${o}`,n=await fetch(i,{headers:{"User-Agent":$,Referer:r,Accept:"text/html"},signal:AbortSignal.timeout(1e4)});if(!n.ok)continue;let l=await n.text();if(l.length<200)continue;let s=[],a=/<a\s+href=["']([^"']+)["'][^>]*>[\s\S]*?<img[^>]*alt=["']([^"']+)["'][^>]*>/gi,c;while((c=a.exec(l))!==null)if(c[1]&&c[2])s.push({href:c[1],alt:c[2]});if(!s.length)continue;let u=e.toLowerCase().replace(/[^a-z0-9]/g,""),d=t?String(t):"",h=t?s.find((y)=>y.alt.includes(d)):null,p=s.find((y)=>{let f=y.alt.toLowerCase().replace(/[^a-z0-9]/g,"");return f===u||f.startsWith(u)||f.replace(/\d+$/,"")===u})||s.find((y)=>y.alt.toLowerCase().replace(/[^a-z0-9]/g,"").includes(u)),m=h||p||s[0],g=m.href.startsWith("http")?m.href:`${r}/${m.href.replace(/^\//,"")}`;return{domain:r,detailUrl:g}}catch{continue}return null}async function ye(e,t,o,r){let i=t.map((s)=>`${s.name}=${s.value}`).join("; "),n=await fetch(e,{method:"POST",headers:{"User-Agent":$,"Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest",Referer:r,Cookie:i},body:new URLSearchParams(o),signal:AbortSignal.timeout(15000)}),l=n.headers.getSetCookie?.()||n.headers.get("set-cookie")?.split(",").filter(Boolean)||[];for(let s of l){let a=s.split(";")[0].split("=");if(a.length===2){let c=t.findIndex((u)=>u.name===a[0].trim());if(c>=0)t[c]={name:a[0].trim(),value:a[1]};else t.push({name:a[0].trim(),value:a[1]})}}return n}async function he(e,t,o,r,i){let n=await ye(`${e}/ajax`,t,{m4uhd:r,_token:o},i);if(!n.ok)return null;let s=(await n.text()).match(/<iframe[^>]*src=["']([^"']+)["']/)?.[1];if(!s)return null;return s.startsWith("http")?s:`${e}/${s.replace(/^\//,"")}`}async function Qe({id:e,s:t,e:o,config:r}){try{let{getTmdbInfo:i}=await Promise.resolve().then(() => (R(),T)),n=await i(e,t?"tv":"movie",t);if(!n?.titles?.length)return null;let l=n.titles.find((f)=>!/^(Season|Specials|Part)\s/i.test(f))||n.titles[n.titles.length-1],s=await Ze(l,n.year);if(!s)return null;let{domain:a,detailUrl:c}=s,u=[],d=await fetch(c,{headers:{"User-Agent":$,Referer:a,Accept:"text/html"},signal:AbortSignal.timeout(15000)}),h=d.headers.getSetCookie?.()||d.headers.get("set-cookie")?.split(",").filter(Boolean)||[];for(let f of h){let v=f.split(";")[0].split("=");if(v.length===2)u.push({name:v[0].trim(),value:v[1]})}let p=await d.text(),m=p.match(/<meta\s+name=["']csrf-token["']\s+content=["']([^"']+)["']/i)?.[1];if(!m)return null;if(t&&o){let f=[`S${String(t).padStart(2,"0")}-E${String(o).padStart(2,"0")}`,`S${t}-E${o}`,`${t}x${o}`,`Season ${t} Episode ${o}`],v=null;for(let b of f){let H=new RegExp(`idepisode=["']([^"']+)["'][^>]*>[^<]*${b.replace(/[-\s]/g,"[\\-\\s]")}`,"i"),C=p.match(H);if(!C)continue;if(v=await(async()=>{let S=await ye(`${a}/ajaxtv`,u,{idepisode:C[1],_token:m},c);if(!S.ok)return null;let _=await S.text();return _.match(/["']data["']\s*:\s*["']([^"']+)["']/)?.[1]||_.match(/<span[^>]*data=["']([^"']+)["']/)?.[1]})(),v)break}if(!v)return null;let w=await he(a,u,m,v,c);if(!w)return null;let A=new URL(c).origin;if(pe.some((b)=>w.includes(b))){let b=await fe(w,A);if(b)return{url:b,headers:{Referer:a,"User-Agent":$}}}return{url:w,headers:{Referer:a,"User-Agent":$}}}let g=p.match(/<span[^>]*class=["'][^"']*\bsinglemv\b[^"']*["'][^>]*data=["']([^"']+)["']/)?.[1];if(g){let f=await he(a,u,m,g,c);if(!f)return null;let v=new URL(c).origin;if(pe.some((w)=>f.includes(w))){let w=await fe(f,v);if(w)return{url:w,headers:{Referer:a,"User-Agent":$}}}return{url:f,headers:{Referer:a,"User-Agent":$}}}let y=p.match(/<iframe[^>]*src=["']([^"']+)["']/i)?.[1];if(y)return{url:y.startsWith("http")?y:`${a}/${y.replace(/^\//,"")}`,headers:{Referer:a,"User-Agent":$}};return null}catch(i){return null}}var ne={};x(ne,{getStream:()=>et});async function et({id:e,s:t,e:o,config:r}){try{let i=t?`https://vidfast.pro/tv/${e}/${t}/${o}`:`https://vidfast.pro/movie/${e}`,n={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36",Referer:"https://vidfast.pro/","X-Requested-With":"XMLHttpRequest"},l=await fetch(i,{headers:n,signal:AbortSignal.timeout(15000)});if(!l.ok)return null;let a=(await l.text()).match(/\\"en\\":\\"(.*?)\\"/);if(!a)return null;let c=a[1],u=await fetch(`https://enc-dec.app/api/enc-vidfast?text=${encodeURIComponent(c)}&version=1`,{signal:AbortSignal.timeout(15000)});if(!u.ok)return null;let d=await u.json(),{servers:h,stream:p,token:m}=d?.result||{};if(!h||!p||!m)return null;let g={...n,"X-CSRF-Token":m,"Content-Type":"application/x-www-form-urlencoded"},y=await fetch(h,{method:"POST",headers:g,signal:AbortSignal.timeout(15000)});if(!y.ok)return null;let f=await y.text();if(!f)return null;let v=await fetch("https://enc-dec.app/api/dec-vidfast",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:f,version:"1"}),signal:AbortSignal.timeout(15000)});if(!v.ok)return null;let A=(await v.json())?.result;if(!Array.isArray(A)||!A.length)return null;let{runWithConcurrency:b}=await Promise.resolve().then(() => (R(),T)),C=(await b(A,async(S,_)=>{let W=S.name||`Server ${_+1}`;if(!S.data)return null;let I=`${p}/${S.data}`,L=await fetch(I,{method:"POST",headers:g,signal:AbortSignal.timeout(15000)});if(!L.ok)return null;let N=await L.text();if(!N)return null;let J=await fetch("https://enc-dec.app/api/dec-vidfast",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:N,version:"1"}),signal:AbortSignal.timeout(15000)});if(!J.ok)return null;let le=(await J.json())?.result?.url;if(!le)return null;return{url:le,label:`VidFastPro [${W}]`,headers:{Referer:"https://vidfast.pro/","X-CSRF-Token":m}}},r?.parallelism,r?.requestGap)).filter(Boolean);return C.length?{allUrls:C}:null}catch{return null}}import rt from"http";import{Readable as nt}from"stream";import{createRequire as st}from"module";var k=[{key:"videasy",label:"Videasy",enabled:!0,sourceFile:"./src/sources/videasy.js",proxyParam:"vy",timeout:30000,jitter:500,retries:2,multiUrl:!0,parallelism:3,requestGap:250,cdnHeaders:[{pattern:/api\.videasy\.to/i,headers:{Accept:"*/*",Origin:"https://player.videasy.to",Referer:"https://player.videasy.to/"}}]},{key:"vidfast",label:"VidFast",enabled:!1,sourceFile:"./src/sources/vidfast.js",proxyParam:"vf",timeout:30000,jitter:500,retries:2,multiUrl:!0,parallelism:3,requestGap:350,cdnHeaders:[{pattern:/vidfast\.pro/i,headers:{Referer:"https://vidfast.pro/","X-Requested-With":"XMLHttpRequest"}}]},{key:"vidlink",label:"VidLink",enabled:!0,sourceFile:"./src/sources/vidlink.js",proxyParam:"vl",timeout:20000,jitter:400,retries:2,parallelism:1,requestGap:0},{key:"hexa",label:"Hexa",enabled:!0,sourceFile:"./src/sources/hexa.js",proxyParam:"hx",timeout:25000,jitter:400,retries:2,multiUrl:!0,parallelism:1,requestGap:0},{key:"lordflix",label:"LordFlix",enabled:!0,sourceFile:"./src/sources/lordflix.js",proxyParam:"lf",timeout:30000,jitter:500,retries:2,multiUrl:!0,parallelism:3,requestGap:250},{key:"vaplayer",label:"VA Player",enabled:!0,sourceFile:"./src/sources/vaplayer.js",proxyParam:"vp",timeout:20000,jitter:300,retries:2,multiUrl:!0,parallelism:1,requestGap:0},{key:"rivestream",label:"RiveStream",enabled:!0,sourceFile:"./src/sources/rivestream.js",proxyParam:"rs",timeout:30000,jitter:600,retries:2,multiUrl:!0,parallelism:1,requestGap:0},{key:"vidrock",label:"VidRock",enabled:!0,sourceFile:"./src/sources/vidrock.js",proxyParam:"vr",timeout:20000,jitter:400,retries:2,multiUrl:!0,parallelism:5,requestGap:150},{key:"m4uhd",label:"M4uHD",enabled:!0,sourceFile:"./src/sources/m4uhd.js",proxyParam:"m4u",timeout:25000,jitter:500,retries:2,parallelism:1,requestGap:0},{key:"vidfastpro",label:"VidFastPro",enabled:!0,sourceFile:"./src/sources/vidfastpro.js",proxyParam:"vfp",timeout:30000,jitter:500,retries:2,multiUrl:!0,parallelism:3,requestGap:350,cdnHeaders:[{pattern:/vidfast\.pro/i,headers:{Referer:"https://vidfast.pro/","X-Requested-With":"XMLHttpRequest"}}]}],se=Object.fromEntries(k.map((e)=>[e.key,e])),ge=new Map(k.map((e)=>[e.proxyParam,e])),ae=300000;R();var kt=globalThis.console;globalThis.console={log(){},error(){},warn(){},debug(){},info(){},trace(){}};var tt=[z,B,X,Y,Z,Q,ee,re,ne],at=st(import.meta.url),{Agent:ot,setGlobalDispatcher:it}=at("undici"),ct=new ot({keepAliveTimeout:30000,keepAliveMaxTimeout:60000,connections:100});it(ct);var ve=process.env.PORT||7860,we=["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15","Mozilla/5.0 (X11; Linux x86_64; rv:125.0) Gecko/20100101 Firefox/125.0"],ie=()=>we[Math.floor(Math.random()*we.length)],lt=/\.m3u8?(\?|$)|mpegurl|m3u8/i,ut=/URI="([^"]+)"/g,U={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, OPTIONS, PATCH, HEAD","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Requested-With, Origin, Accept","Access-Control-Allow-Credentials":"false","Access-Control-Max-Age":"86400"};class Re{#t;#r;#e;constructor(e,t){this.#t=e,this.#r=t,this.#e=new Map}get(e){let t=this.#e.get(e);if(!t)return;if(Date.now()-t.ts>this.#r){this.#e.delete(e);return}return this.#e.delete(e),this.#e.set(e,t),t.v}set(e,t){if(this.#e.has(e))this.#e.delete(e);else if(this.#e.size>=this.#t)this.#e.delete(this.#e.keys().next().value);this.#e.set(e,{v:t,ts:Date.now()})}}var Ae=new Re(1000,ae),oe=new Map;class ce{constructor(e){this.max=e,this._queue=[],this._active=0}acquire(){return new Promise((e)=>{if(this._active<this.max)this._active++,e();else this._queue.push(e)})}release(){if(this._active--,this._queue.length)this._queue.shift()(),this._active++}async run(e){await this.acquire();try{return await e()}finally{this.release()}}}var dt=new ce(5),pt=new ce(10);function ft(e,t,o){let r=Ae.get(e);if(r!==void 0)return Promise.resolve(r);let i=oe.get(e);if(i)return i;let n=(async()=>{let l=await t();if(l!=null)Ae.set(e,l);return l})().finally(()=>oe.delete(e));return oe.set(e,n),n}function $e(e){return e.startsWith("localhost")||e.startsWith("127.0.0.1")?`http://${e}`:`https://${e}`}function be(e,t,o){let r=e.startsWith("http")?e:e.startsWith("/")?o+e:t+e,i=r.startsWith("http://")?"https://"+r.slice(7):r;return i.startsWith("http")?i:"https://"+r}function ht(e,t,o,r){let i=t.indexOf("?")===-1?t:t.slice(0,t.indexOf("?")),n=i.slice(0,i.lastIndexOf("/")+1),l=t.indexOf("//")+2,s=t.slice(0,t.indexOf("/",l)),a=`${r}/api?url=`,c=e.split(`
`),u=Array(c.length);for(let d=0;d<c.length;d++){let h=c[d],p=h.trim();if(!p){u[d]=h;continue}if(p.charCodeAt(0)===35)u[d]=p.replace(ut,(m,g)=>{let y=be(g,n,s);return`URI="${a}${encodeURIComponent(y)}${o}"`});else{let m=be(p,n,s);u[d]=`${a}${encodeURIComponent(m)}${o}`}}return u.join(`
`)}async function mt(e,t={},o=30000){let r=e.startsWith("http://")?"https://"+e.slice(7):e,i={"User-Agent":ie(),...t},n=0;for(let l=0;l<=8;l++){let s={headers:i,redirect:"manual",signal:AbortSignal.timeout(o)},a=await fetch(r,s);if(a.status===429){let c=parseInt(a.headers.get("retry-after")||"0",10),u=n<3?c>0?c*1000:Math.min(1000*2**n+Math.random()*500,15000):0;if(a.body?.cancel(),n++,u>0){await new Promise((d)=>setTimeout(d,u));continue}return a}if(a.status>=300&&a.status<400&&a.headers.has("location")){a.body?.cancel();let c=a.headers.get("location");r=c.startsWith("http")?c.startsWith("http://")?"https://"+c.slice(7):c:new URL(c,r).href;continue}return a}return fetch(r,{headers:i,redirect:"follow",signal:AbortSignal.timeout(o+5000)})}function yt(e,t,o){let r=se[o];if(!r?.cdnHeaders)return;for(let i of r.cdnHeaders)if(i.pattern.test(e)){Object.assign(t,i.headers);return}}function gt(e,t,o){if(!e)return null;let r=typeof e==="object"?e.url:e,i=se[t],n=r.replace("http://","https://"),l=`${o}/api?url=${encodeURIComponent(n)}&${i.proxyParam}=1`;if(typeof e==="object"&&e.headers)l+=`&proxyHeaders=${encodeURIComponent(JSON.stringify(e.headers))}`;return l}function q(e,t,o){return{status:e,body:t,headers:{"Content-Type":o||"application/json",...U}}}function Se(e,t){return q(e,JSON.stringify(t),"application/json")}var ke={};for(let e=0,t=0;e<k.length;e++){if(!k[e].enabled)continue;ke[k[e].key]=tt[t++]}async function vt(e,t,o,r){let i=ke[e.key],n=`${e.key}-${t}-${o||""}-${r||""}`,l=()=>i.getStream({id:t,s:o,e:r,config:e});if(e.timeout)return await Promise.race([l(),new Promise((a)=>setTimeout(()=>a(null),e.timeout))])??null;return ft(n,l,ae)}function wt(e){if(e?.allUrls?.length)return e.allUrls.map((t)=>typeof t==="object"?t:{url:t});if(Array.isArray(e))return e.map((t)=>typeof t==="object"?t:{url:t});if(e)return[{url:typeof e==="object"?e.url:e,headers:e?.headers}];return[]}async function xe(e,t,o,r,i){let n=await G(e,t?"tv":"movie",t),l=(c)=>{try{r.write(c)}catch{}};r.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no",...U}),l(`data: ${JSON.stringify({type:"meta",meta:n})}
`);let s=$e(i),a=k.filter((c)=>c.enabled).map((c)=>(async()=>{try{let u=await pt.run(()=>vt(c,e,t,o)),d=wt(u);for(let h of d){let p=gt(h,c.key,s);if(p)l(`data: ${JSON.stringify({type:"source",source:{source:c.key,label:h.label||c.label,url:p}})}
`)}}catch{}})());await Promise.all(a),l(`data: ${JSON.stringify({type:"done",total:k.filter((c)=>c.enabled).length})}
`);try{r.end()}catch{}}async function At(e,t,o){try{new URL(e)}catch{return Se(400,{error:"invalid url"})}return dt.run(async()=>{let r={},i=t.get("proxyHeaders");if(i)try{Object.assign(r,JSON.parse(decodeURIComponent(i)))}catch{}if(!r["User-Agent"]&&!r["user-agent"])r["User-Agent"]=ie();let n=null;for(let[s,a]of ge)if(t.has(s)){n=a;break}let l=e;if(n){try{let s=e.indexOf("?");if(s!==-1){let a=new URLSearchParams(e.slice(s+1)),c=a.get("headers");if(c){try{Object.assign(r,JSON.parse(decodeURIComponent(c)))}catch{}a.delete("headers")}l=`${e.slice(0,s)}${a.toString()?"?"+a.toString():""}`}}catch{}yt(l,r,n.key)}try{let s=await mt(l,r,30000),a=(s.headers.get("content-type")||"").toLowerCase();if(lt.test(l)||a.includes("mpegurl")||a.includes("m3u8")){let d=await s.text();if(d.trim().startsWith("#EXT")){let h=$e(o.headers.host||"localhost"),p=n?`&${n.proxyParam}=1&proxyHeaders=${encodeURIComponent(JSON.stringify(r))}`:"&gn=1",m=ht(d,l,p,h);return q(200,m,"application/vnd.apple.mpegurl")}return q(502,`expected m3u8: ${d.slice(0,100)}`,"text/plain")}if(n){if(!s.ok)return{status:s.status,body:`upstream ${s.status}`,headers:{"Content-Type":"text/plain","Access-Control-Allow-Origin":"*"}};let d=o.headers.range,h=d?await fetch(l,{headers:{"User-Agent":ie(),...r,Range:d},redirect:"follow"}):s,p={"Content-Type":a||"video/mp4","Accept-Ranges":"bytes","Access-Control-Allow-Origin":"*","Cache-Control":"no-store"};if(h.headers.has("content-length"))p["Content-Length"]=h.headers.get("content-length");if(h.headers.has("content-range"))p["Content-Range"]=h.headers.get("content-range");return{status:d&&h.status===206?206:200,stream:h.body,headers:p}}let u=Buffer.from(await s.arrayBuffer());return q(200,u,a||"video/MP2T")}catch(s){return Se(502,{error:s.message})}})}var F=new Map;setInterval(()=>{let e=Date.now();for(let[t,o]of F)if(e-o.ts>60000)F.delete(t)},30000);var K=rt.createServer(async(e,t)=>{e.socket.setTimeout(90000),e.socket.setNoDelay(!0);try{let o=`http://${e.headers.host||"localhost"}`,r=new URL(e.url,o),{pathname:i,searchParams:n}=r,l=e.headers["x-forwarded-for"]?.split(",")[0]?.trim()||e.socket?.remoteAddress||null,s=Date.now(),a=F.get(l)||{count:0,ts:s};if(s-a.ts>1e4)a.count=0,a.ts=s;if(a.count++,F.set(l,a),a.count>10){t.writeHead(429,{"Content-Type":"application/json",...U}),t.end(JSON.stringify({error:"rate limited"}));return}if(e.method==="OPTIONS"){t.writeHead(204,U),t.end();return}if(i==="/movie"&&n.get("id")){await xe(n.get("id"),null,null,t,e.headers.host||"localhost");return}if(i==="/tv"&&n.get("id")){await xe(n.get("id"),n.get("season")||n.get("s"),n.get("episode")||n.get("e"),t,e.headers.host||"localhost");return}if(i==="/api"||i==="/api/"){let c=n.get("url");if(c){let u=await At(c,n,e);if(u.stream){t.writeHead(u.status,u.headers);let d=nt.fromWeb(u.stream);d.on("error",()=>{try{t.destroy()}catch{}}),t.on("error",()=>{try{d.destroy()}catch{}}),d.pipe(t);return}t.writeHead(u.status,u.headers),t.end(u.body??"");return}if(n.get("providers")){t.writeHead(200,{"Content-Type":"application/json",...U}),t.end(JSON.stringify({providers:k.filter((u)=>u.enabled).map((u)=>({key:u.key,label:u.label}))}));return}t.writeHead(400,{"Content-Type":"application/json",...U}),t.end(JSON.stringify({error:"missing parameters"}));return}if(i==="/"||i===""){t.writeHead(200,{"Content-Type":"application/json",...U}),t.end(JSON.stringify({name:"StreamHub API",endpoints:{"/movie?id={tmdb_id}":"SSE stream of provider results (movie)","/tv?id={tmdb_id}&season={s}&episode={e}":"SSE stream of provider results (tv)","/api?url={target}&{sourceParam}=1":"Embedded proxy with M3U8 rewriting & streaming","/api?providers=1":"List providers"}}));return}t.writeHead(404,{"Content-Type":"application/json",...U}),t.end(JSON.stringify({error:"not found"}))}catch{if(!t.headersSent)try{t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"internal error"}))}catch{}}});K.keepAliveTimeout=65000;K.headersTimeout=70000;K.timeout=90000;K.listen(ve,"0.0.0.0",()=>console.log(`http://localhost:${ve}`));