From 86e74f911fa8cfda09d6d237d0580c96fbd14b30 Mon Sep 17 00:00:00 2001 From: Himanshu Date: Fri, 26 Dec 2025 16:04:59 +0530 Subject: [PATCH] feat: add getWebstreamerStream function and update getStream to utilize it; bump version to 1.5 in manifest --- dist/autoEmbed/stream.js | 2 +- manifest.json | 2 +- providers/autoEmbed/stream.ts | 230 ++++++++++++++++++---------------- 3 files changed, 126 insertions(+), 108 deletions(-) diff --git a/dist/autoEmbed/stream.js b/dist/autoEmbed/stream.js index 0977893..a2c5ea5 100644 --- a/dist/autoEmbed/stream.js +++ b/dist/autoEmbed/stream.js @@ -1 +1 @@ -"use strict";var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getStream=void 0,exports.getRiveStream=getRiveStream;const getStream=_a=>__awaiter(void 0,[_a],void 0,function*({link:id,type:type,providerContext:providerContext}){var _b,_c,_d,_e,_f,_g,_h;try{const streams=[],payload=(()=>{try{return JSON.parse(id)}catch(_a){return{tmdbId:id}}})(),tmdbId=null!==(_d=null!==(_c=null!==(_b=payload.tmdbId)&&void 0!==_b?_b:payload.id)&&void 0!==_c?_c:payload.tmdId)&&void 0!==_d?_d:"",season=null!==(_e=payload.season)&&void 0!==_e?_e:"",episode=null!==(_f=payload.episode)&&void 0!==_f?_f:"",effectiveType=null!==(_h=null!==(_g=payload.type)&&void 0!==_g?_g:type)&&void 0!==_h?_h:"movie";return yield getRiveStream(String(tmdbId),episode,season,effectiveType,streams,providerContext),streams}catch(err){return[]}});function getRiveStream(tmdId,episode,season,type,Streams,providerContext){return __awaiter(this,void 0,void 0,function*(){if(!tmdId||"undefined"===tmdId)return;const secret=generateSecretKey(tmdId),baseUrl=yield providerContext.getBaseUrl("rive"),cors=process.env.CORS_PRXY?process.env.CORS_PRXY+"?url=":"",route="series"===type?`/api/backendfetch?requestID=tvVideoProvider&id=${tmdId}&season=${season}&episode=${episode}&secretKey=${secret}&service=`:`/api/backendfetch?requestID=movieVideoProvider&id=${tmdId}&secretKey=${secret}&service=`,url=cors?cors+encodeURIComponent(baseUrl+route):baseUrl+route;yield Promise.all(["flowcast","primevids","humpy","loki","asiacloud","shadow","hindicast","animez","aqua","voyager","yggdrasil","putafilme","ophim"].map(server=>__awaiter(this,void 0,void 0,function*(){var _a,_b;try{const res=yield providerContext.axios.get(url+server,{timeout:4e3,headers:providerContext.commonHeaders});null===(_b=null===(_a=res.data)||void 0===_a?void 0:_a.data)||void 0===_b||_b.sources.forEach(source=>{Streams.push({server:(null==source?void 0:source.source)+"-"+(null==source?void 0:source.quality),link:null==source?void 0:source.url,type:"hls"===(null==source?void 0:source.format)?"m3u8":"mp4",quality:null==source?void 0:source.quality,headers:{referer:baseUrl}})})}catch(e){}})))})}function generateSecretKey(id){const c=["oYRu3JJ5g1C","TRlWJIJXT","RuoyGA0udvsFVXr","Y4s2LNM4y","wHzuSgl0fD","MGLTaSGs","rr0rSBIYfwutV7E","ABJXC9c","W2BuY0yDB9CcK","3yvZP1OJuTM","YDoqbu6zdN0zT","rnNQ2a5OBaMu","eSKa1Uy","QsIV8J472Xa","cPfTgu27","j4mzadQCou9","qHLZbLrZQfB","8U9YP6hrTz4cJNQ","xbAbu4pzFEXz","dhuA9zvdw","k3A1JGmb","eVC3z4COdUNvvzA","dwMmuXnrb","AqpWzY9I1ZmGPR","VGXWUm0JTetmXs","gD4sH3CISTanpTs","d6w8dntV","iL6dvSNqEab4kd","mIB8NFtmPjnX1kM","F4PXdP0Hx3","5Fijua4Z7C","wPGnHJrkYa1Tu4P","pjrfBfTf","vswQDEbM0y64io","LAnpQuk6hR2bEWs","kX8orxNnkK","mRsZ5fjHbC8YuT","JnBr1jr","2twFGU5PgvDmKdP","3wCg6zYtHFjy","gaQSJhixHiy1pa8","pE2cXTP0GPX","xr0ONW3sOnCRdt","QZu43flHFsebX","yrvtqRTOnHo","kvXEs16lgj","AGwT2zpQVHCMb09","M4BxOh3z2JgC","5hbV7briYC7","YfHMsm0","jC9PAPfz34Vgc","ExoJ1tgEXpK","eD8WPA4Lmsyf4W","h7WSlhT7iNOj","RRP61kk","QtY0f1aN","TlatGjcOQjup","MfpeEGbjouYSOa","Zz0Qh8B0pwUkdRT","Y4SkLSQNU","hOk01KFeEVbNRZx","fyf4H8MXazm3oY","Z116B9F2p","GdxNJOnvdz","kqVNNHfP","IO3hhNu","qDdC9Lcllce","Et7lLOg","6ZlQrvfgZu","YXHLeZBF","NH6nAd7y","ARsut59gfK6j0v","jPE2KXiJjnSsjn","qYcG5HOJc3TtxM","C2w06YGj5C","kHx1pT7","2enXfHXw","koFHBiR054aizN","Uj53XTQ92Ntbq7K","QjC5euFYi2AuxWb","njLwvdMejA","NWMzrwTAVZEb","s4sVqC0AyTM5h","pu01jeZ6AoH","SgiOfwx9qkR","grjsLtBNn9eTQg","XABTTaYgihZk2mq","2vlSCZQc3HT27F4","kQZ7VQfEL3TC7P","MEzqVne021W","BLYPZp2SIO","5zDMVoqw4nH","t14S9uLuGKX7Lb5","4McODHAYTyp","EAoxL5UKvMPqjH3","hJpAbqp","tcj63Wpz","hGqEu0LxKkMv46P","u2wNvb8ou19N3","wUKY6Opi1kH"];if(void 0===id)return"rive";try{let t,n;const r=String(id);if(isNaN(Number(id))){const sum=r.split("").reduce((e,ch)=>e+ch.charCodeAt(0),0);t=c[sum%c.length]||btoa(r),n=Math.floor(sum%r.length/2)}else{const num=Number(id);t=c[num%c.length]||btoa(r),n=Math.floor(num%r.length/2)}const i=r.slice(0,n)+t+r.slice(n),innerHash=e=>{e=String(e);let t=0;for(let n=0;n>>0)<>>32-n%5)>>>0;t=(t^i^(r<>>8-n%7)>>>0)>>>0,t=t+(t>>>11^t<<3)>>>0}return t^=t>>>15,t=49842*(65535&t)+((49842*(t>>>16)&65535)<<16)>>>0,t^=t>>>13,t=40503*(65535&t)+((40503*(t>>>16)&65535)<<16)>>>0,t^=t>>>16,t.toString(16).padStart(8,"0")},outerHash=e=>{const t=String(e);let n=(3735928559^t.length)>>>0;for(let idx=0;idx>>25)>>>0^r;n=(60205*(65535&n)>>>0)+(60205*(n>>>16)<<16>>>0)>>>0,n^=n>>>11}return n^=n>>>15,n=49842*(65535&n)+(49842*(n>>>16)<<16)>>>0>>>0,n^=n>>>13,n=40503*(65535&n)+(40503*(n>>>16)<<16)>>>0>>>0,n^=n>>>16,n=10196*(65535&n)+(10196*(n>>>16)<<16)>>>0>>>0,n^=n>>>15,n.toString(16).padStart(8,"0")},o=outerHash(innerHash(i));return btoa(o)}catch(e){return"topSecret"}}exports.getStream=getStream; \ No newline at end of file +"use strict";var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getStream=void 0,exports.getWebstreamerStream=getWebstreamerStream,exports.getRiveStream=getRiveStream;const getStream=_a=>__awaiter(void 0,[_a],void 0,function*({link:id,type:type,providerContext:providerContext}){var _b,_c,_d,_e,_f,_g,_h,_j;try{const streams=[],payload=(()=>{try{return JSON.parse(id)}catch(_a){return{tmdbId:id}}})(),tmdbId=null!==(_d=null!==(_c=null!==(_b=payload.tmdbId)&&void 0!==_b?_b:payload.id)&&void 0!==_c?_c:payload.tmdId)&&void 0!==_d?_d:"",imdbId=null!==(_e=payload.imdbId)&&void 0!==_e?_e:"",season=null!==(_f=payload.season)&&void 0!==_f?_f:"",episode=null!==(_g=payload.episode)&&void 0!==_g?_g:"",effectiveType=null!==(_j=null!==(_h=payload.type)&&void 0!==_h?_h:type)&&void 0!==_j?_j:"movie";return yield getWebstreamerStream(String(imdbId),episode,season,effectiveType,streams,providerContext),yield getRiveStream(String(tmdbId),episode,season,effectiveType,streams,providerContext),streams}catch(err){return[]}});function getWebstreamerStream(imdbId,episode,season,type,Streams,providerContext){return __awaiter(this,void 0,void 0,function*(){var _a;if(!imdbId||"undefined"===imdbId)return;const url=`https://webstreamr.hayd.uk/{"multi":"on","al":"on","de":"on","es":"on","fr":"on","hi":"on","it":"on","mx":"on","mediaFlowProxyUrl":"","mediaFlowProxyPassword":""}/stream/${type}/${imdbId}${"series"===type?`:${season}:${episode}`:""}.json`;try{null===(_a=(yield providerContext.axios.get(encodeURI(url),{timeout:5e3,headers:providerContext.commonHeaders})).data)||void 0===_a||_a.streams.forEach(source=>{const url=null==source?void 0:source.url,name=(null==source?void 0:source.name)||"WebStreamer",qualityMatch=null==name?void 0:name.match(/(\d{3,4})p/),quality=qualityMatch?qualityMatch[1]:void 0;Streams.push({server:name,link:url,type:type,quality:quality})})}catch(e){throw e}})}function getRiveStream(tmdId,episode,season,type,Streams,providerContext){return __awaiter(this,void 0,void 0,function*(){if(!tmdId||"undefined"===tmdId)return;const secret=generateSecretKey(tmdId),baseUrl=yield providerContext.getBaseUrl("rive"),cors=process.env.CORS_PRXY?process.env.CORS_PRXY+"?url=":"",route="series"===type?`/api/backendfetch?requestID=tvVideoProvider&id=${tmdId}&season=${season}&episode=${episode}&secretKey=${secret}&service=`:`/api/backendfetch?requestID=movieVideoProvider&id=${tmdId}&secretKey=${secret}&service=`,url=cors?cors+encodeURIComponent(baseUrl+route):baseUrl+route;yield Promise.all(["flowcast","asiacloud","humpy","primevids","shadow","hindicast","animez","aqua","yggdrasil","putafilme","ophim"].map(server=>__awaiter(this,void 0,void 0,function*(){var _a,_b;try{const res=yield providerContext.axios.get(url+server,{timeout:4e3});null===(_b=null===(_a=res.data)||void 0===_a?void 0:_a.data)||void 0===_b||_b.sources.forEach(source=>{Streams.push({server:(null==source?void 0:source.source)+"-"+(null==source?void 0:source.quality),link:null==source?void 0:source.url,type:"hls"===(null==source?void 0:source.format)?"m3u8":"mp4",quality:null==source?void 0:source.quality,headers:{referer:baseUrl}})})}catch(e){}})))})}function generateSecretKey(id){const c=["4Z7lUo","gwIVSMD","PLmz2elE2v","Z4OFV0","SZ6RZq6Zc","zhJEFYxrz8","FOm7b0","axHS3q4KDq","o9zuXQ","4Aebt","wgjjWwKKx","rY4VIxqSN","kfjbnSo","2DyrFA1M","YUixDM9B","JQvgEj0","mcuFx6JIek","eoTKe26gL","qaI9EVO1rB","0xl33btZL","1fszuAU","a7jnHzst6P","wQuJkX","cBNhTJlEOf","KNcFWhDvgT","XipDGjST","PCZJlbHoyt","2AYnMZkqd","HIpJh","KH0C3iztrG","W81hjts92","rJhAT","NON7LKoMQ","NMdY3nsKzI","t4En5v","Qq5cOQ9H","Y9nwrp","VX5FYVfsf","cE5SJG","x1vj1","HegbLe","zJ3nmt4OA","gt7rxW57dq","clIE9b","jyJ9g","B5jXjMCSx","cOzZBZTV","FTXGy","Dfh1q1","ny9jqZ2POI","X2NnMn","MBtoyD","qz4Ilys7wB","68lbOMye","3YUJnmxp","1fv5Imona","PlfvvXD7mA","ZarKfHCaPR","owORnX","dQP1YU","dVdkx","qgiK0E","cx9wQ","5F9bGa","7UjkKrp","Yvhrj","wYXez5Dg3","pG4GMU","MwMAu","rFRD5wlM"];if(void 0===id)return"rive";try{let t,n;const r=String(id);if(isNaN(Number(id))){const sum=r.split("").reduce((e,ch)=>e+ch.charCodeAt(0),0);t=c[sum%c.length]||btoa(r),n=Math.floor(sum%r.length/2)}else{const num=Number(id);t=c[num%c.length]||btoa(r),n=Math.floor(num%r.length/2)}const i=r.slice(0,n)+t+r.slice(n),innerHash=e=>{e=String(e);let t=0;for(let n=0;n>>0)<>>32-n%5)>>>0;t=(t^i^(r<>>8-n%7)>>>0)>>>0,t=t+(t>>>11^t<<3)>>>0}return t^=t>>>15,t=49842*(65535&t)+((49842*(t>>>16)&65535)<<16)>>>0,t^=t>>>13,t=40503*(65535&t)+((40503*(t>>>16)&65535)<<16)>>>0,t^=t>>>16,t.toString(16).padStart(8,"0")},outerHash=e=>{const t=String(e);let n=(3735928559^t.length)>>>0;for(let idx=0;idx>>25)>>>0^r;n=(60205*(65535&n)>>>0)+(60205*(n>>>16)<<16>>>0)>>>0,n^=n>>>11}return n^=n>>>15,n=49842*(65535&n)+(49842*(n>>>16)<<16)>>>0>>>0,n^=n>>>13,n=40503*(65535&n)+(40503*(n>>>16)<<16)>>>0>>>0,n^=n>>>16,n=10196*(65535&n)+(10196*(n>>>16)<<16)>>>0>>>0,n^=n>>>15,n.toString(16).padStart(8,"0")},o=outerHash(innerHash(i));return btoa(o)}catch(e){return"topSecret"}}exports.getStream=getStream; \ No newline at end of file diff --git a/manifest.json b/manifest.json index 76d6b83..218f4c8 100644 --- a/manifest.json +++ b/manifest.json @@ -10,7 +10,7 @@ { "display_name": "MultiStream", "value": "autoEmbed", - "version": "1.4", + "version": "1.5", "icon": "", "type": "global", "disabled": false diff --git a/providers/autoEmbed/stream.ts b/providers/autoEmbed/stream.ts index 7efec63..5f82f4f 100644 --- a/providers/autoEmbed/stream.ts +++ b/providers/autoEmbed/stream.ts @@ -21,10 +21,20 @@ export const getStream = async ({ const tmdbId: string | number = payload.tmdbId ?? payload.id ?? payload.tmdId ?? ""; + const imdbId: string = payload.imdbId ?? ""; const season: string = payload.season ?? ""; const episode: string = payload.episode ?? ""; const effectiveType: string = payload.type ?? type ?? "movie"; + await getWebstreamerStream( + String(imdbId), + episode, + season, + effectiveType, + streams, + providerContext + ); + await getRiveStream( String(tmdbId), episode, @@ -40,6 +50,47 @@ export const getStream = async ({ } }; +///////// Webstreamer +export async function getWebstreamerStream( + imdbId: string, + episode: string, + season: string, + type: string, + Streams: Stream[], + providerContext: ProviderContext +) { + if (!imdbId || imdbId === "undefined") return; + const url = `https://webstreamr.hayd.uk/{"multi":"on","al":"on","de":"on","es":"on","fr":"on","hi":"on","it":"on","mx":"on","mediaFlowProxyUrl":"","mediaFlowProxyPassword":""}/stream/${type}/${imdbId}${ + type === "series" ? `:${season}:${episode}` : "" + }.json`; + + console.log("Webstreamer URL: ", encodeURI(url)); + try { + const res = await providerContext.axios.get(encodeURI(url), { + timeout: 5000, + headers: providerContext.commonHeaders, + }); + res.data?.streams.forEach((source: any) => { + const url = source?.url; + const name = source?.name || "WebStreamer"; + // Infer type from URL + const qualityMatch = name?.match(/(\d{3,4})p/); + const quality = qualityMatch + ? (qualityMatch[1] as "360" | "480" | "720" | "1080" | "2160") + : undefined; + Streams.push({ + server: name, + link: url, + type, + quality, + }); + }); + } catch (e) { + throw e; + } +} + +// // Rive Stream Fetcher export async function getRiveStream( tmdId: string, episode: string, @@ -55,15 +106,13 @@ export async function getRiveStream( const secret = generateSecretKey(tmdId); const servers = [ "flowcast", - "primevids", - "humpy", - "loki", "asiacloud", + "humpy", + "primevids", "shadow", "hindicast", "animez", "aqua", - "voyager", "yggdrasil", "putafilme", "ophim", @@ -84,7 +133,6 @@ export async function getRiveStream( try { const res = await providerContext.axios.get(url + server, { timeout: 4000, - headers: providerContext.commonHeaders, }); const subtitles: TextTracks = []; // if (res.data?.data?.captions) { @@ -119,108 +167,78 @@ export async function getRiveStream( } function generateSecretKey(id: number | string) { - // Array of secret key fragments from the provided implementation + // Updated array from module 2873 in the provided source const c = [ - "oYRu3JJ5g1C", - "TRlWJIJXT", - "RuoyGA0udvsFVXr", - "Y4s2LNM4y", - "wHzuSgl0fD", - "MGLTaSGs", - "rr0rSBIYfwutV7E", - "ABJXC9c", - "W2BuY0yDB9CcK", - "3yvZP1OJuTM", - "YDoqbu6zdN0zT", - "rnNQ2a5OBaMu", - "eSKa1Uy", - "QsIV8J472Xa", - "cPfTgu27", - "j4mzadQCou9", - "qHLZbLrZQfB", - "8U9YP6hrTz4cJNQ", - "xbAbu4pzFEXz", - "dhuA9zvdw", - "k3A1JGmb", - "eVC3z4COdUNvvzA", - "dwMmuXnrb", - "AqpWzY9I1ZmGPR", - "VGXWUm0JTetmXs", - "gD4sH3CISTanpTs", - "d6w8dntV", - "iL6dvSNqEab4kd", - "mIB8NFtmPjnX1kM", - "F4PXdP0Hx3", - "5Fijua4Z7C", - "wPGnHJrkYa1Tu4P", - "pjrfBfTf", - "vswQDEbM0y64io", - "LAnpQuk6hR2bEWs", - "kX8orxNnkK", - "mRsZ5fjHbC8YuT", - "JnBr1jr", - "2twFGU5PgvDmKdP", - "3wCg6zYtHFjy", - "gaQSJhixHiy1pa8", - "pE2cXTP0GPX", - "xr0ONW3sOnCRdt", - "QZu43flHFsebX", - "yrvtqRTOnHo", - "kvXEs16lgj", - "AGwT2zpQVHCMb09", - "M4BxOh3z2JgC", - "5hbV7briYC7", - "YfHMsm0", - "jC9PAPfz34Vgc", - "ExoJ1tgEXpK", - "eD8WPA4Lmsyf4W", - "h7WSlhT7iNOj", - "RRP61kk", - "QtY0f1aN", - "TlatGjcOQjup", - "MfpeEGbjouYSOa", - "Zz0Qh8B0pwUkdRT", - "Y4SkLSQNU", - "hOk01KFeEVbNRZx", - "fyf4H8MXazm3oY", - "Z116B9F2p", - "GdxNJOnvdz", - "kqVNNHfP", - "IO3hhNu", - "qDdC9Lcllce", - "Et7lLOg", - "6ZlQrvfgZu", - "YXHLeZBF", - "NH6nAd7y", - "ARsut59gfK6j0v", - "jPE2KXiJjnSsjn", - "qYcG5HOJc3TtxM", - "C2w06YGj5C", - "kHx1pT7", - "2enXfHXw", - "koFHBiR054aizN", - "Uj53XTQ92Ntbq7K", - "QjC5euFYi2AuxWb", - "njLwvdMejA", - "NWMzrwTAVZEb", - "s4sVqC0AyTM5h", - "pu01jeZ6AoH", - "SgiOfwx9qkR", - "grjsLtBNn9eTQg", - "XABTTaYgihZk2mq", - "2vlSCZQc3HT27F4", - "kQZ7VQfEL3TC7P", - "MEzqVne021W", - "BLYPZp2SIO", - "5zDMVoqw4nH", - "t14S9uLuGKX7Lb5", - "4McODHAYTyp", - "EAoxL5UKvMPqjH3", - "hJpAbqp", - "tcj63Wpz", - "hGqEu0LxKkMv46P", - "u2wNvb8ou19N3", - "wUKY6Opi1kH", + "4Z7lUo", + "gwIVSMD", + "PLmz2elE2v", + "Z4OFV0", + "SZ6RZq6Zc", + "zhJEFYxrz8", + "FOm7b0", + "axHS3q4KDq", + "o9zuXQ", + "4Aebt", + "wgjjWwKKx", + "rY4VIxqSN", + "kfjbnSo", + "2DyrFA1M", + "YUixDM9B", + "JQvgEj0", + "mcuFx6JIek", + "eoTKe26gL", + "qaI9EVO1rB", + "0xl33btZL", + "1fszuAU", + "a7jnHzst6P", + "wQuJkX", + "cBNhTJlEOf", + "KNcFWhDvgT", + "XipDGjST", + "PCZJlbHoyt", + "2AYnMZkqd", + "HIpJh", + "KH0C3iztrG", + "W81hjts92", + "rJhAT", + "NON7LKoMQ", + "NMdY3nsKzI", + "t4En5v", + "Qq5cOQ9H", + "Y9nwrp", + "VX5FYVfsf", + "cE5SJG", + "x1vj1", + "HegbLe", + "zJ3nmt4OA", + "gt7rxW57dq", + "clIE9b", + "jyJ9g", + "B5jXjMCSx", + "cOzZBZTV", + "FTXGy", + "Dfh1q1", + "ny9jqZ2POI", + "X2NnMn", + "MBtoyD", + "qz4Ilys7wB", + "68lbOMye", + "3YUJnmxp", + "1fv5Imona", + "PlfvvXD7mA", + "ZarKfHCaPR", + "owORnX", + "dQP1YU", + "dVdkx", + "qgiK0E", + "cx9wQ", + "5F9bGa", + "7UjkKrp", + "Yvhrj", + "wYXez5Dg3", + "pG4GMU", + "MwMAu", + "rFRD5wlM", ]; if (id === undefined) {