Compare commits

..

39 Commits

Author SHA1 Message Date
Himanshu c671054045 fix: update animetsu stream logic and bump version 2026-06-19 17:49:44 +05:30
Himanshu cb36604e9a fix: update animetsu provider API endpoints 2026-06-19 13:32:06 +05:30
Himanshu 695dd89f4e fix: update animetsu and movies4u providers 2026-06-19 13:10:37 +05:30
Himanshu 3fedeb8816 feat: add openWebView to ProviderContext 2026-06-19 13:10:25 +05:30
Himanshu d744db3359 fix: update Joya9tv stream extraction logic 2026-06-18 11:03:21 +05:30
Himanshu bf84ba9a6d fix: update hubcloud extractor logic and bump versions 2026-06-18 10:45:48 +05:30
Himanshu 040912facd chore: remove react-native-aes-crypto dependency 2026-06-18 10:45:26 +05:30
Himanshu 7722190674 fix: update hdhub4u search URL and bump version 2026-06-08 13:11:49 +05:30
Himanshu 4c4d0903c2 fix: update luxMovies search base URL and bump version 2026-05-29 11:20:34 +05:30
Himanshu 5459c15f96 fix: update movieBox endpoints and catalog filter 2026-05-27 20:08:07 +05:30
Himanshu 4be02caff7 fix: handle cases with no episode or direct links in provider testing 2026-05-26 21:16:54 +05:30
Himanshu 09d9152aba feat: update search functionality in getSearchPosts and bump version to 2.0 2026-05-26 20:23:03 +05:30
Himanshu 1b2bda58d5 fix: Improve drive search handling and bump manifest 2026-05-18 13:29:53 +05:30
Himanshu 8c161715f7 fix multiple providers 2026-05-11 21:50:15 +05:30
Himanshu 2ce3c737d1 feat: update Movies4U version to 1.4 and modify catalog titles
fix: handle anti-DDoS checks in meta and posts fetching
fix: improve episode extraction logic in episodes
fix: enhance stream link extraction in stream

Co-authored-by: Copilot <copilot@github.com>
2026-05-03 21:24:04 +05:30
Himanshu 80e687da6b chore: update versions in manifest.json for 4khdHub and HdHub4u
fix: 4khdHub and HdHub4u
2026-05-03 19:32:25 +05:30
Himanshu 4a17b4fc9e fix: update filter path for posts and increment version to 2.7 2026-04-30 20:11:34 +05:30
Himanshu 620af7f752 Merge branch 'main' of https://github.com/Zenda-Cross/vega-providers 2026-04-30 19:57:09 +05:30
Himanshu e1658cc924 fix: correct filter path for Apple TV+ in catalog 2026-04-30 19:56:57 +05:30
Himanshu b962d0c38b fix: update VegaMovies version to 2.6 and correct filter paths in catalog 2026-04-30 19:56:41 +05:30
8man 69b0237136 Update README with testing instructions and cleanup
Removed outdated references and added testing instructions.
2026-04-24 16:28:37 +05:30
Himanshu 9c55d5a4c5 fix: update ShowBox version to 1.2 2026-04-16 20:05:14 +05:30
Himanshu 4256b05d2b fix: update getPosts and getSearchPosts to include common headers and add retry logic
fix: change stream URL in getStream function
2026-04-16 20:04:58 +05:30
Himanshu 93d8acec5e fix: remove Aes 2026-04-16 20:04:22 +05:30
Himanshu db6be6320d fix: update base URL in getPosts function and disable specific providers in manifest.json 2026-04-12 09:18:49 +05:30
Himanshu d1ddafea1c fix: update version of VegaMovies to 2.5 and modify getPosts URL handling 2026-04-12 09:09:31 +05:30
Himanshu 83ac1341de fix: update version of VegaMovies to 2.4 in manifest.json 2026-04-09 10:50:40 +05:30
Himanshu e097f212b0 fix: update version of HdHub4u to 1.7 in manifest.json 2026-04-09 10:42:47 +05:30
Himanshu f32228961b fix: update hubdrive button selector in getStream function and bump version to 1.6 in manifest.json 2026-03-31 21:39:04 +05:30
Himanshu e5654b17bc chore: update versions in manifest.json and fix hubcloud extractor link handling 2026-03-27 21:40:33 +05:30
Himanshu 617670cbaf Merge branch 'main' of https://github.com/Zenda-Cross/vega-providers 2026-03-27 11:53:06 +05:30
Himanshu 5c7b986db8 feat: update version to 2.0 in manifest.json; refactor getMeta and getPosts functions for improved data extraction 2026-03-27 11:53:02 +05:30
8man bf74f32075 Update VegaMovies version to 2.2
Updated version number for VegaMovies from 2.1 to 2.2.
2026-03-22 13:58:23 +05:30
Himanshu 67167ec8d1 fix: update version to 1.3 in manifest.json and adjust image attribute selection in fetchPosts function 2026-02-24 21:14:15 +05:30
Himanshu 07d75bdf81 refactor: remove unused extractors and clean up code 2026-02-23 22:13:35 +05:30
Himanshu 913239459c fix: update filters in catalog and meta files; adjust post title extraction logic
feat: increment version in manifest.json to 2.1
2026-02-23 22:13:29 +05:30
Himanshu 1dc01890c8 feat: update searchPosts function to use new API endpoint and handle response data
fix: update version number to 2.0 in manifest.json
2026-02-23 21:32:57 +05:30
Himanshu 7eb53273c2 feat: add utility files for base URL and headers 2026-02-23 20:49:12 +05:30
Himanshu 099b4aba4f fix: update version to 1.17 in manifest.json and improve meta and posts data extraction logic 2026-02-23 20:49:06 +05:30
80 changed files with 59211 additions and 890 deletions
+9 -3
View File
@@ -81,8 +81,6 @@ providers/
- `cheerio`: For HTML parsing
- `getBaseUrl`: Helper to get the provider's base URL (base url are generall stored here https://github.com/himanshu8443/providers/blob/main/modflix.json)
- `commonHeaders`: Standard HTTP headers
- `extractors`: Shared extractor functions
- `Aes`: (if needed) for encryption/decryption
This ensures all providers use the same tools and patterns, making code easier to maintain and extend.
@@ -260,7 +258,15 @@ linkList: [
This gives you flexibility to support both providers that need extra requests for episodes and those that can return all links up front.
## How to Test Your Provider
# How to Test Your Provider
## Test with CLI
1. Run `npm run test -- provider_name` (example: `npm run test -- showbox`)
- This will do full testing by picking random posts and episodes and testing end-to-end.
2. Run `npm run test:provider provider_name function_name` (example: `npm run test:provider showbox getPosts`)
- This is for testing a single function, such as getPosts, getSearchPosts, getStream, etc. After entering manually, enter the input.
## Test in App
1. **Start the Dev Server**
+41
View File
@@ -150,6 +150,44 @@ async function buildProvider(providerName) {
return { providerName, modules: results };
}
async function buildUtilityFiles() {
const utilityFiles = ["getBaseUrl", "headers", "providerContext"];
for (const utilityName of utilityFiles) {
const utilityPath = path.join(providersDir, `${utilityName}.ts`);
if (!fs.existsSync(utilityPath)) {
continue;
}
try {
const result = await esbuild.build({
entryPoints: [utilityPath],
bundle: true,
platform: "node",
format: "cjs",
target: "es2015",
write: false,
external: [],
minify: false,
keepNames: true,
treeShaking: true,
outfile: `${utilityName}.js`,
});
let code = result.outputFiles[0].text;
code = code.replace(/require\(['"]node:.*?['"]\)/g, "{}");
const outputPath = path.join(__dirname, "dist", `${utilityName}.js`);
fs.writeFileSync(outputPath, code);
console.log(`${utilityName}.js (${(code.length / 1024).toFixed(1)}kb)`);
} catch (error) {
console.error(`✗ Error building ${utilityName}:`, error.message);
}
}
}
async function buildAll() {
const startTime = Date.now();
console.log(
@@ -163,6 +201,9 @@ async function buildAll() {
}
fs.mkdirSync(distDir, { recursive: true });
// Build utility files first
await buildUtilityFiles();
// Build all providers
const results = await Promise.all(providerDirs.map(buildProvider));
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),catalog_exports={};__export(catalog_exports,{catalog:()=>catalog,genres:()=>genres});var catalog=[{title:"Popular",filter:"/api/anime/search?query=&page=1&perPage=35&year=any&sort=favourites&season=any&format=any&status=any"},{title:"Trending",filter:"/api/anime/search?query=&page=1&perPage=35&year=any&sort=trending&season=any&format=any&status=any"},{title:"Top Rated",filter:"/api/anime/search?query=&page=1&perPage=35&year=any&sort=rating&season=any&format=any&status=any"},{title:"Favourites",filter:"/api/anime/search?query=&page=1&perPage=35&year=any&sort=updated&season=any&format=any&status=any"}],genres=[];exports.catalog=catalog,exports.genres=genres;
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),catalog_exports={};__export(catalog_exports,{catalog:()=>catalog,genres:()=>genres});var catalog=[{title:"Popular",filter:"popular"},{title:"Trending",filter:"trending"},{title:"Top Rated",filter:"top"},{title:"Seasonal",filter:"seasonal"}],genres=[];exports.catalog=catalog,exports.genres=genres;
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropSymbols=Object.getOwnPropertySymbols,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value:value}):obj[key]=value,__spreadValues=(a,b)=>{for(var prop in b||(b={}))__hasOwnProp.call(b,prop)&&__defNormalProp(a,prop,b[prop]);if(__getOwnPropSymbols)for(var prop of __getOwnPropSymbols(b))__propIsEnum.call(b,prop)&&__defNormalProp(a,prop,b[prop]);return a},__spreadProps=(a,b)=>__defProps(a,__getOwnPropDescs(b)),__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),meta_exports={};__export(meta_exports,{getMeta:()=>getMeta});var getMeta=__name(function(_0){return __async(this,arguments,function*({link:link,providerContext:providerContext}){var _a,_b,_c,_d,_e,_f;try{const{axios:axios}=providerContext,baseUrl="https://backend.animetsu.to",url=`${baseUrl}/api/anime/info/${link}`,data=(yield axios.get(url,{headers:{Referer:"https://animetsu.to/"}})).data,meta={title:(null==(_a=data.title)?void 0:_a.english)||(null==(_b=data.title)?void 0:_b.romaji)||(null==(_c=data.title)?void 0:_c.native)||"",synopsis:data.description||"",image:(null==(_d=data.coverImage)?void 0:_d.extraLarge)||(null==(_e=data.coverImage)?void 0:_e.large)||(null==(_f=data.coverImage)?void 0:_f.medium)||"",tags:[null==data?void 0:data.format,null==data?void 0:data.status,...(null==data?void 0:data.genres)||[]].filter(Boolean),imdbId:"",type:"MOVIE"===data.format?"movie":"series"},linkList=[];try{const episodes=(yield axios.get(`${baseUrl}/api/anime/eps/${link}`,{headers:{Referer:"https://animetsu.to/"}})).data;if(episodes&&episodes.length>0){const directLinks=[];episodes.forEach(episode=>{const title=`Episode ${episode.number}`,episodeLink=`${link}:${episode.number}`;episodeLink&&title&&directLinks.push({title:title,link:episodeLink})}),linkList.push({title:meta.title,directLinks:directLinks})}else linkList.push({title:meta.title,directLinks:[{title:"Movie",link:`${link}:1`}]})}catch(episodeErr){console.error("Error fetching episodes:",episodeErr),linkList.push({title:meta.title,directLinks:[{title:meta.title,link:`${link}:1`}]})}return __spreadProps(__spreadValues({},meta),{linkList:linkList})}catch(err){return console.error("animetsu meta error:",err),{title:"",synopsis:"",image:"",imdbId:"",type:"movie",linkList:[]}}})},"getMeta");exports.getMeta=getMeta;
"use strict";var __defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropSymbols=Object.getOwnPropertySymbols,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value:value}):obj[key]=value,__spreadValues=(a,b)=>{for(var prop in b||(b={}))__hasOwnProp.call(b,prop)&&__defNormalProp(a,prop,b[prop]);if(__getOwnPropSymbols)for(var prop of __getOwnPropSymbols(b))__propIsEnum.call(b,prop)&&__defNormalProp(a,prop,b[prop]);return a},__spreadProps=(a,b)=>__defProps(a,__getOwnPropDescs(b)),__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),meta_exports={};__export(meta_exports,{getMeta:()=>getMeta});var getMeta=__name(function(_0){return __async(this,arguments,function*({link:link,providerContext:providerContext}){var _a,_b,_c,_d,_e,_f,_g;try{const{axios:axios,openWebView:openWebView,commonHeaders:commonHeaders}=providerContext,baseUrl="https://animetsu.net",url=`${baseUrl}/v2/api/anime/info/${link}`;let cookies,res;try{res=yield axios.get(url,{headers:__spreadProps(__spreadValues({},commonHeaders),{Referer:baseUrl})})}catch(error){if(403!==(null==(_a=error.response)?void 0:_a.status))throw error;{const wafResult=yield openWebView(baseUrl,{title:"Solve the captcha below and click done",description:"Required to bypass Animetsu anti-bot protection.",headers:__spreadProps(__spreadValues({},commonHeaders),{Referer:baseUrl}),force:!0,waitForCookie:"cf_clearance"});cookies=wafResult.cookies,res=yield axios.get(url,{headers:__spreadProps(__spreadValues({},commonHeaders),{Referer:baseUrl,Cookie:cookies})})}}const data=res.data,meta={title:(null==(_b=data.title)?void 0:_b.english)||(null==(_c=data.title)?void 0:_c.romaji)||(null==(_d=data.title)?void 0:_d.native)||"",synopsis:data.description||"",image:(null==(_e=data.cover_image)?void 0:_e.large)||(null==(_f=data.cover_image)?void 0:_f.medium)||(null==(_g=data.cover_image)?void 0:_g.small)||"",tags:[null==data?void 0:data.format,null==data?void 0:data.status,...(null==data?void 0:data.genres)||[]].filter(Boolean),imdbId:"",type:"MOVIE"===data.format?"movie":"series"},linkList=[],seasons=data.seasons;if(seasons&&seasons.length>0)yield Promise.all(seasons.map(season=>__async(null,null,function*(){var _a2,_b2,_c2;const seasonTitle=(null==(_a2=season.title)?void 0:_a2.english)||(null==(_b2=season.title)?void 0:_b2.romaji)||(null==(_c2=season.title)?void 0:_c2.native),directLinks=[];try{const episodes=(yield axios.get(`${baseUrl}/v2/api/anime/eps/${season.id}`,{headers:__spreadValues(__spreadProps(__spreadValues({},commonHeaders),{Referer:baseUrl}),cookies?{Cookie:cookies}:{})})).data;episodes&&episodes.length>0&&episodes.forEach(ep=>{directLinks.push({title:`Episode ${ep.ep_num}`,link:`${season.id}:${ep.ep_num}`})})}catch(e){const total=season.total_eps||1;for(let i=1;i<=total;i++)directLinks.push({title:`Episode ${i}`,link:`${season.id}:${i}`})}directLinks.length>0&&linkList.push({title:seasonTitle||meta.title,directLinks:directLinks})})));else{const total=data.total_eps||1,directLinks=[];for(let i=1;i<=total;i++)directLinks.push({title:1===total?"Movie":`Episode ${i}`,link:`${link}:${i}`});linkList.push({title:meta.title,directLinks:directLinks})}return __spreadProps(__spreadValues({},meta),{linkList:linkList})}catch(err){return console.error("animetsu meta error:",err),{title:"",synopsis:"",image:"",imdbId:"",type:"movie",linkList:[]}}})},"getMeta");exports.getMeta=getMeta;
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var getPosts=__name(function(_0){return __async(this,arguments,function*({filter:filter,page:page,signal:signal,providerContext:providerContext}){const{axios:axios}=providerContext,url="https://backend.animetsu.to"+filter+"&page="+page.toString();return console.log("animetsuGetPosts url",url),posts({url:url.toString(),signal:signal,axios:axios})})},"getPosts"),getSearchPosts=__name(function(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page,signal:signal,providerContext:providerContext}){const{axios:axios}=providerContext;return posts({url:`https://backend.animetsu.to/api/anime/search?query=${encodeURIComponent(searchQuery)}&page=${page}&perPage=35&year=any&sort=favourites&season=any&format=any&status=any`,signal:signal,axios:axios})})},"getSearchPosts");function posts(_0){return __async(this,arguments,function*({url:url,signal:signal,axios:axios}){var _a;try{const data=null==(_a=(yield axios.get(url,{signal:signal,headers:{Referer:"https://animetsu.to/"}})).data)?void 0:_a.results,catalog=[];return null==data||data.map(element=>{var _a2,_b,_c,_d,_e,_f,_g;const title=(null==(_a2=element.title)?void 0:_a2.english)||(null==(_b=element.title)?void 0:_b.romaji)||(null==(_c=element.title)?void 0:_c.native),link=null==(_d=element.id)?void 0:_d.toString(),image=(null==(_e=element.coverImage)?void 0:_e.large)||(null==(_f=element.coverImage)?void 0:_f.extraLarge)||(null==(_g=element.coverImage)?void 0:_g.medium);title&&link&&image&&catalog.push({title:title,link:link,image:image})}),catalog}catch(err){return console.error("animetsu error ",err),[]}})}__name(posts,"posts"),exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
"use strict";var __defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropSymbols=Object.getOwnPropertySymbols,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value:value}):obj[key]=value,__spreadValues=(a,b)=>{for(var prop in b||(b={}))__hasOwnProp.call(b,prop)&&__defNormalProp(a,prop,b[prop]);if(__getOwnPropSymbols)for(var prop of __getOwnPropSymbols(b))__propIsEnum.call(b,prop)&&__defNormalProp(a,prop,b[prop]);return a},__spreadProps=(a,b)=>__defProps(a,__getOwnPropDescs(b)),__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var getPosts=__name(function(_0){return __async(this,arguments,function*({filter:filter,page:page,signal:signal,providerContext:providerContext}){if(page>1)return[];const{axios:axios,commonHeaders:commonHeaders}=providerContext;return posts({url:"https://animetsu.net/v2/api/anime/home",filter:filter,signal:signal,axios:axios,providerContext:providerContext,headers:commonHeaders})})},"getPosts"),getSearchPosts=__name(function(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page,signal:signal,providerContext:providerContext}){const{axios:axios,commonHeaders:commonHeaders}=providerContext;return posts({url:`https://animetsu.net/v2/api/anime/search/?query=${encodeURIComponent(searchQuery)}`,signal:signal,axios:axios,providerContext:providerContext,headers:commonHeaders})})},"getSearchPosts");function posts(_0){return __async(this,arguments,function*({url:url,filter:filter,signal:signal,axios:axios,providerContext:providerContext,headers:headers}){var _a,_b,_c;const baseUrl="https://animetsu.net",{openWebView:openWebView}=providerContext;try{let cookies,res;try{res=yield axios.get(url,{signal:signal,headers:__spreadProps(__spreadValues({},headers),{Referer:baseUrl})})}catch(error){if(403!==(null==(_a=error.response)?void 0:_a.status))throw error;cookies=(yield openWebView(baseUrl,{title:"Solve the captcha below and click done",description:"Required to bypass Animetsu anti-bot protection.",headers:__spreadProps(__spreadValues({},headers),{Referer:baseUrl}),force:!0,waitForCookie:"cf_clearance"})).cookies,res=yield axios.get(url,{signal:signal,headers:__spreadProps(__spreadValues({},headers),{Referer:baseUrl,Cookie:cookies})})}const data=filter?null==(_b=res.data)?void 0:_b[filter]:(null==(_c=res.data)?void 0:_c.results)||res.data,catalog=[];return null==data||data.map(element=>{var _a2,_b2,_c2,_d,_e,_f,_g,_h,_i,_j,_k;const title=(null==(_a2=element.title)?void 0:_a2.english)||(null==(_b2=element.title)?void 0:_b2.romaji)||(null==(_c2=element.title)?void 0:_c2.native),link=null==(_d=element.id)?void 0:_d.toString(),image=(null==(_e=element.cover_image)?void 0:_e.large)||(null==(_f=element.cover_image)?void 0:_f.extraLarge)||(null==(_g=element.cover_image)?void 0:_g.medium)||(null==(_h=element.cover_image)?void 0:_h.small)||(null==(_i=element.coverImage)?void 0:_i.large)||(null==(_j=element.coverImage)?void 0:_j.extraLarge)||(null==(_k=element.coverImage)?void 0:_k.medium);title&&link&&image&&catalog.push({title:title,link:link,image:image})}),catalog}catch(err){return console.error("animetsu error ",err),[]}})}__name(posts,"posts"),exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),episodes_exports={};__export(episodes_exports,{getEpisodes:()=>getEpisodes});var getEpisodes=__name(function(_0){return __async(this,arguments,function*({url:url,providerContext:providerContext}){try{const{axios:axios,cheerio:cheerio}=providerContext,html=(yield axios.get(url)).data;let $=cheerio.load(html);const episodeLinks=[];if($('a:contains("HubCloud")').map((i,element)=>{const title=$(element).parent().prev().text(),link=$(element).attr("href");link&&(title.includes("Ep")||title.includes("Download"))&&episodeLinks.push({title:title.includes("Download")?"Play":title,link:link})}),0===episodeLinks.length){const streamingServices=["hubcloud","gdflix"];let currentTitle="";$('h5 span[style*="color"], h5').each((i,element)=>{const text=$(element).text().trim();if(text&&(text.match(/\d{3,4}p/)||text.includes("Ep")||text.includes("Episode"))){currentTitle=text;let nextElement=$(element).parent();for(let j=0;j<10&&(nextElement=nextElement.next(),nextElement.length);j++)nextElement.find("a[href]").each((k,linkEl)=>{const href=$(linkEl).attr("href");if(href&&streamingServices.some(service=>href.includes(service))){let serverName="Play";href.includes("hubcloud")?serverName="HubCloud":href.includes("gdflix")?serverName="GDFlix":href.includes("pixeldrain")?serverName="Pixeldrain":href.includes("fastdl")&&(serverName="FastDL");const title=currentTitle?`${currentTitle} - ${serverName}`:serverName;episodeLinks.push({title:title,link:href})}})}})}return episodeLinks.length>0?episodeLinks:[{title:"Play",link:url}]}catch(err){return console.error(err),[{title:"Server 1",link:url}]}})},"getEpisodes");exports.getEpisodes=getEpisodes;
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),episodes_exports={};__export(episodes_exports,{getEpisodes:()=>getEpisodes});var getEpisodes=__name(function(_0){return __async(this,arguments,function*({url:url,providerContext:providerContext}){var _a;try{const{axios:axios,cheerio:cheerio}=providerContext,html=(yield axios.get(url)).data;let $=cheerio.load(html);const episodeLinks=[];if($('a:contains("HubCloud")').map((i,element)=>{const title=$(element).parent().prev().text(),link=$(element).attr("href");link&&(title.includes("Ep")||title.includes("Download"))&&episodeLinks.push({title:title.includes("Download")?"Play":title,link:link})}),0===episodeLinks.length){const streamingServices=["hubcloud","gdflix"];let currentTitle="";$('h5 span[style*="color"], h5').each((i,element)=>{const text=$(element).text().trim();if(text&&(text.match(/\d{3,4}p/)||text.includes("Ep")||text.includes("Episode"))){currentTitle=text;let nextElement=$(element).parent();for(let j=0;j<10&&(nextElement=nextElement.next(),nextElement.length);j++)nextElement.find("a[href]").each((k,linkEl)=>{const href=$(linkEl).attr("href");if(href&&streamingServices.some(service=>href.includes(service))){let serverName="Play";href.includes("hubcloud")?serverName="HubCloud":href.includes("gdflix")?serverName="GDFlix":href.includes("pixeldrain")?serverName="Pixeldrain":href.includes("fastdl")&&(serverName="FastDL");const title=currentTitle?`${currentTitle} - ${serverName}`:serverName;episodeLinks.push({title:title,link:href})}})}})}if(0===episodeLinks.length){const hubcloudLink=null==(_a=html.match(/https:\/\/hubcloud\.[^\/]+\/drive\/[^"'\s]+/i))?void 0:_a[0];hubcloudLink&&episodeLinks.push({title:"Play",link:hubcloudLink})}return console.log("episodeLinks:",episodeLinks),episodeLinks.length>0?episodeLinks:[{title:"Play",link:url}]}catch(err){return console.error(err),[{title:"Server 1",link:url}]}})},"getEpisodes");exports.getEpisodes=getEpisodes;
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var getPosts=__name(function(_0){return __async(this,arguments,function*({filter:filter,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl}=providerContext;return posts({url:`${(yield getBaseUrl("drive"))+filter}page/${page}/`,signal:signal,providerContext:providerContext})})},"getPosts"),getSearchPosts=__name(function(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl}=providerContext;return posts({url:`${yield getBaseUrl("drive")}page/${page}/?s=${searchQuery}`,signal:signal,providerContext:providerContext})})},"getSearchPosts");function posts(_0){return __async(this,arguments,function*({url:url,signal:signal,providerContext:providerContext}){try{console.log("Fetching URL:",url);const{cheerio:cheerio}=providerContext,res=yield fetch(url,{signal:signal}),data=yield res.text(),$=cheerio.load(data),catalog=[];return $(".poster-card").map((i,element)=>{const title=$(element).find(".poster-title").text(),link=$(element).parent().attr("href"),image=$(element).find(".poster-image img").attr("src");console.log({title:title,link:link,image:image}),title&&link&&image&&catalog.push({title:title.replace("Download","").trim(),link:link,image:image})}),catalog}catch(err){return console.error("drive error ",err),[]}})}__name(posts,"posts"),exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var getPosts=__name(function(_0){return __async(this,arguments,function*({filter:filter,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl}=providerContext;return posts({url:`${(yield getBaseUrl("drive"))+filter}page/${page}/`,signal:signal,providerContext:providerContext})})},"getPosts"),getSearchPosts=__name(function(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl}=providerContext,baseUrl=yield getBaseUrl("drive");return searchPosts({url:buildSearchUrl(baseUrl,searchQuery,page),baseUrl:baseUrl,signal:signal})})},"getSearchPosts");function posts(_0){return __async(this,arguments,function*({url:url,signal:signal,providerContext:providerContext}){try{console.log("Fetching URL:",url);const{cheerio:cheerio}=providerContext,res=yield fetch(url,{signal:signal}),data=yield res.text(),$=cheerio.load(data),catalog=[];return $(".poster-card").map((i,element)=>{const title=$(element).find(".poster-title").text(),link=$(element).parent().attr("href"),image=$(element).find(".poster-image img").attr("src");title&&link&&image&&catalog.push({title:title.replace("Download","").trim(),link:link,image:image})}),catalog}catch(err){return console.error("drive error ",err),[]}})}function searchPosts(_0){return __async(this,arguments,function*({url:url,baseUrl:baseUrl,signal:signal}){var _a,_b;try{console.log("Fetching drive search URL:",url);const res=yield fetch(url,{signal:signal});if(!res.ok)throw new Error(`drive search failed with status ${res.status}`);return null!=(_b=null==(_a=(yield res.json()).hits)?void 0:_a.map(hit=>{var _a2;const document=hit.document,title=null==(_a2=null==document?void 0:document.post_title)?void 0:_a2.trim(),link=(null==document?void 0:document.permalink)?normalizeUrl(baseUrl,document.permalink):"",image=(null==document?void 0:document.post_thumbnail)?normalizeUrl(baseUrl,document.post_thumbnail):"";return title&&link&&image?{title:title,link:link,image:image}:null}).filter(post=>null!==post))?_b:[]}catch(err){return console.error("drive search error ",err),[]}})}function buildSearchUrl(baseUrl,searchQuery,page){const separator=baseUrl.includes("?")?"&":"?";return`${trimTrailingSlash(baseUrl)}/search.php${separator}q=${encodeURIComponent(searchQuery)}&page=${page}`}function normalizeUrl(baseUrl,value){return value?/^https?:\/\//i.test(value)?value:value.startsWith("//")?`https:${value}`:value.startsWith("/")?`${trimTrailingSlash(baseUrl)}${value}`:`${trimTrailingSlash(baseUrl)}/${trimLeadingSlash(value)}`:""}function trimTrailingSlash(value){return value.replace(/\/+$/,"")}function trimLeadingSlash(value){return value.replace(/^\/+/,"")}__name(posts,"posts"),__name(searchPosts,"searchPosts"),__name(buildSearchUrl,"buildSearchUrl"),__name(normalizeUrl,"normalizeUrl"),__name(trimTrailingSlash,"trimTrailingSlash"),__name(trimLeadingSlash,"trimLeadingSlash"),exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
+1 -1
View File
File diff suppressed because one or more lines are too long
+67
View File
@@ -0,0 +1,67 @@
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// providers/getBaseUrl.ts
var getBaseUrl_exports = {};
__export(getBaseUrl_exports, {
getBaseUrl: () => getBaseUrl
});
module.exports = __toCommonJS(getBaseUrl_exports);
var expireTime = 60 * 60 * 1e3;
var getBaseUrl = /* @__PURE__ */ __name((providerValue) => __async(null, null, function* () {
try {
let baseUrl = "";
const cacheKey = "CacheBaseUrl" + providerValue;
const timeKey = "baseUrlTime" + providerValue;
const baseUrlRes = yield fetch(
"https://himanshu8443.github.io/providers/modflix.json"
);
const baseUrlData = yield baseUrlRes.json();
baseUrl = baseUrlData[providerValue].url;
return baseUrl;
} catch (error) {
console.error(`Error fetching baseUrl: ${providerValue}`, error);
return "";
}
}), "getBaseUrl");
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
getBaseUrl
});
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var hdbHeaders={Cookie:"xla=s4t",Referer:"https://google.com","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"},getPosts=__name(function(_0){return __async(this,arguments,function*({filter:filter,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl}=providerContext;return posts({url:`${(yield getBaseUrl("hdhub"))+filter}/page/${page}/`,signal:signal,providerContext:providerContext})})},"getPosts"),getSearchPosts=__name(function(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl}=providerContext;return posts({url:`${yield getBaseUrl("hdhub")}/page/${page}/?s=${searchQuery}`,signal:signal,providerContext:providerContext})})},"getSearchPosts");function posts(_0){return __async(this,arguments,function*({url:url,signal:signal,providerContext:providerContext}){const{cheerio:cheerio}=providerContext;try{const res=yield fetch(url,{headers:hdbHeaders,signal:signal}),data=yield res.text(),$=cheerio.load(data),catalog=[];return $(".recent-movies").children().map((i,element)=>{const title=$(element).find("figure").find("img").attr("alt"),link=$(element).find("a").attr("href"),image=$(element).find("figure").find("img").attr("src");title&&link&&image&&catalog.push({title:title.replace("Download","").trim(),link:link,image:image})}),catalog}catch(err){return console.error("hdhubGetPosts error ",err),[]}})}__name(posts,"posts"),exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
"use strict";var __defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropSymbols=Object.getOwnPropertySymbols,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value:value}):obj[key]=value,__spreadValues=(a,b)=>{for(var prop in b||(b={}))__hasOwnProp.call(b,prop)&&__defNormalProp(a,prop,b[prop]);if(__getOwnPropSymbols)for(var prop of __getOwnPropSymbols(b))__propIsEnum.call(b,prop)&&__defNormalProp(a,prop,b[prop]);return a},__spreadProps=(a,b)=>__defProps(a,__getOwnPropDescs(b)),__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var hdbHeaders={Cookie:"xla=s4t",Referer:"https://google.com","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"},getPosts=__name(function(_0){return __async(this,arguments,function*({filter:filter,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl}=providerContext;return posts({url:`${(yield getBaseUrl("hdhub"))+filter}/page/${page}/`,signal:signal,providerContext:providerContext})})},"getPosts"),getSearchPosts=__name(function(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl}=providerContext,baseUrl=yield getBaseUrl("hdhub");try{const today=(new Date).toISOString().slice(0,10),searchUrl=`https://search.pingora.fyi/collections/post/documents/search?${new URLSearchParams({q:searchQuery,query_by:"post_title,category,stars,director,imdb_id",query_by_weights:"4,2,2,2,4",sort_by:"sort_by_date:desc",limit:"15",highlight_fields:"none",use_cache:"true",page:String(page),analytics_tag:today}).toString()}`,res=yield fetch(searchUrl,{headers:__spreadProps(__spreadValues({},hdbHeaders),{Referer:baseUrl+"/",Accept:"application/json, text/plain, */*"}),signal:signal}),json=yield res.json(),hits=Array.isArray(null==json?void 0:json.hits)?json.hits:[],catalog=[];for(const hit of hits){const doc=(null==hit?void 0:hit.document)||{},title=String(doc.post_title||"").replace(/Download/gi,"").trim(),permalink=String(doc.permalink||""),image=String(doc.post_thumbnail||"");if(!title||!permalink)continue;const link=permalink.startsWith("http")?permalink:`${baseUrl}${permalink.startsWith("/")?"":"/"}${permalink}`;catalog.push({title:title,link:link,image:image})}return catalog}catch(err){return console.error("hdhubGetSearchPosts error ",err),[]}})},"getSearchPosts");function posts(_0){return __async(this,arguments,function*({url:url,signal:signal,providerContext:providerContext}){const{cheerio:cheerio}=providerContext;try{const res=yield fetch(url,{headers:hdbHeaders,signal:signal}),data=yield res.text(),$=cheerio.load(data),catalog=[];return $(".recent-movies").children().map((i,element)=>{const title=$(element).find("figure").find("img").attr("alt"),link=$(element).find("a").attr("href"),image=$(element).find("figure").find("img").attr("src");title&&link&&image&&catalog.push({title:title.replace("Download","").trim(),link:link,image:image})}),catalog}catch(err){return console.error("hdhubGetPosts error ",err),[]}})}__name(posts,"posts"),exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
+1 -1
View File
File diff suppressed because one or more lines are too long
+37
View File
@@ -0,0 +1,37 @@
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// providers/headers.ts
var headers_exports = {};
__export(headers_exports, {
headers: () => headers
});
module.exports = __toCommonJS(headers_exports);
var headers = {
"sec-ch-ua": '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
// 'Sec-Fetch-Site': 'none',
// 'Sec-Fetch-User': '?1',
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0"
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
headers
});
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),catalog_exports={};__export(catalog_exports,{catalog:()=>catalog,genres:()=>genres});var catalog=[{title:"Trending",filter:"2"},{title:"Cinema",filter:"5"}],genres=[];exports.catalog=catalog,exports.genres=genres;
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),catalog_exports={};__export(catalog_exports,{catalog:()=>catalog,genres:()=>genres});var catalog=[{title:"Trending",filter:"4"},{title:"Cinema",filter:"5"}],genres=[];exports.catalog=catalog,exports.genres=genres;
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),episodes_exports={};__export(episodes_exports,{getEpisodes:()=>getEpisodes});var getEpisodes=__name(function(_0){return __async(this,arguments,function*({url:url,providerContext:providerContext}){var _a;const{axios:axios,cheerio:cheerio}=providerContext;try{const episodeLinks=[],response=yield fetch("https://dob-worker.8man.workers.dev",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:url,method:"GET"})}),data=yield response.json();return((null==(_a=null==data?void 0:data.data)?void 0:_a.list)||[]).forEach(item=>{const seriesTitle=(null==item?void 0:item.ep)?`S-${null==item?void 0:item.se} E-${null==item?void 0:item.ep}`:(null==item?void 0:item.title)||"",episodesLink=(null==item?void 0:item.resourceLink)||"";episodesLink&&episodeLinks.push({title:seriesTitle.trim(),link:JSON.stringify({url:episodesLink,title:seriesTitle.trim()})})}),episodeLinks}catch(err){return console.error(err),[]}})},"getEpisodes");exports.getEpisodes=getEpisodes;
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),episodes_exports={};__export(episodes_exports,{getEpisodes:()=>getEpisodes});var getEpisodes=__name(function(_0){return __async(this,arguments,function*({url:url,providerContext:providerContext}){var _a;const{axios:axios,cheerio:cheerio}=providerContext;try{const episodeLinks=[],response=yield fetch("https://dob-worker.1proxy.workers.dev",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:url,method:"GET"})}),data=yield response.json();return((null==(_a=null==data?void 0:data.data)?void 0:_a.list)||[]).forEach(item=>{const seriesTitle=(null==item?void 0:item.ep)?`S-${null==item?void 0:item.se} E-${null==item?void 0:item.ep}`:(null==item?void 0:item.title)||"",episodesLink=(null==item?void 0:item.resourceLink)||"";episodesLink&&episodeLinks.push({title:seriesTitle.trim(),link:JSON.stringify({url:episodesLink,title:seriesTitle.trim()})})}),episodeLinks}catch(err){return console.error(err),[]}})},"getEpisodes");exports.getEpisodes=getEpisodes;
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),meta_exports={};__export(meta_exports,{getMeta:()=>getMeta});var getMeta=__name(function(_0){return __async(this,arguments,function*({link:link,providerContext:providerContext}){var _a,_b,_c;try{const{axios:axios,cheerio:cheerio,getBaseUrl:getBaseUrl}=providerContext,baseUrl=yield getBaseUrl("movieBox"),links=[],response=yield fetch("https://dob-worker.8man.workers.dev",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:link,method:"GET"})}),data=(yield response.json()).data;console.log("data",data);const title=((null==data?void 0:data.title)||"").replace(/\s*\[.*?\]\s*$/,""),synopsis=(null==data?void 0:data.description)||"",image=(null==(_a=null==data?void 0:data.cover)?void 0:_a.url)||"",rating=(null==data?void 0:data.imdbRatingValue)||"",tags=(null==(_c=null==(_b=null==data?void 0:data.genre)?void 0:_b.split(","))?void 0:_c.map(tag=>tag.trim()))||[],dubs=(null==data?void 0:data.dubs)||[];return null==dubs||dubs.forEach(dub=>{const link2={title:null==dub?void 0:dub.lanName,episodesLink:`${baseUrl}/wefeed-mobile-bff/subject-api/resource?subjectId=${null==dub?void 0:dub.subjectId}&page=1&perPage=20&all=0&startPosition=1&endPosition=1&pagerMode=0&resolution=1080&se=1&epFrom=1&epTo=1`};links.push(link2)}),console.log("meta",{title:title,synopsis:synopsis,image:image,rating:rating,tags:tags,links:links}),{title:title,synopsis:synopsis,image:image,rating:rating,tags:tags,imdbId:"",type:"movie",linkList:links}}catch(err){return console.error(err),{title:"",synopsis:"",image:"",imdbId:"",type:"movie",linkList:[]}}})},"getMeta");exports.getMeta=getMeta;
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),meta_exports={};__export(meta_exports,{getMeta:()=>getMeta});var getMeta=__name(function(_0){return __async(this,arguments,function*({link:link,providerContext:providerContext}){var _a,_b,_c;try{const{axios:axios,cheerio:cheerio,getBaseUrl:getBaseUrl}=providerContext,links=[],response=yield fetch("https://dob-worker.1proxy.workers.dev",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:link,method:"GET"})}),data=(yield response.json()).data;console.log("data",data);const title=((null==data?void 0:data.title)||"").replace(/\s*\[.*?\]\s*$/,""),synopsis=(null==data?void 0:data.description)||"",image=(null==(_a=null==data?void 0:data.cover)?void 0:_a.url)||"",rating=(null==data?void 0:data.imdbRatingValue)||"",tags=(null==(_c=null==(_b=null==data?void 0:data.genre)?void 0:_b.split(","))?void 0:_c.map(tag=>tag.trim()))||[],dubs=(null==data?void 0:data.dubs)||[];return null==dubs||dubs.forEach(dub=>{const link2={title:null==dub?void 0:dub.lanName,episodesLink:`/wefeed-mobile-bff/subject-api/resource?subjectId=${null==dub?void 0:dub.subjectId}&page=1&perPage=20&all=0&startPosition=1&endPosition=1&pagerMode=0&resolution=1080&se=1&epFrom=1&epTo=1`};links.push(link2)}),console.log("meta",{title:title,synopsis:synopsis,image:image,rating:rating,tags:tags,links:links}),{title:title,synopsis:synopsis,image:image,rating:rating,tags:tags,imdbId:"",type:"movie",linkList:links}}catch(err){return console.error(err),{title:"",synopsis:"",image:"",imdbId:"",type:"movie",linkList:[]}}})},"getMeta");exports.getMeta=getMeta;
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var getPosts=__name(function(_0){return __async(this,arguments,function*({filter:filter,page:page,signal:signal,providerContext:providerContext}){var _a,_b,_c,_d;const posts=[],{getBaseUrl:getBaseUrl}=providerContext;if(page>1)return posts;const baseUrl=yield getBaseUrl("movieBox");console.log("baseUrl",baseUrl);const url=`${baseUrl}/wefeed-mobile-bff/tab-operating?page=3&tabId=0&version=2fe0d7c224603ff7b0df294b46d3b84b`,response=yield fetch("https://dob-worker.8man.workers.dev",{signal:signal,method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:url,method:"GET"})}),data=yield response.json(),list=null==(_c=null==(_b=null==(_a=null==data?void 0:data.data)?void 0:_a.items)?void 0:_b[parseInt(filter)])?void 0:_c.subjects;console.log("list",list);for(const item of list){const post={image:null==item?void 0:item.cover.url,title:null==(_d=null==item?void 0:item.title)?void 0:_d.replace(/\s*\[.*?\]\s*$/,""),link:`${baseUrl}/wefeed-mobile-bff/subject-api/get?subjectId=${null==item?void 0:item.subjectId}`};posts.push(post)}return posts})},"getPosts"),getSearchPosts=__name(function(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page,signal:signal,providerContext:providerContext}){var _a,_b,_c;const{getBaseUrl:getBaseUrl,axios:axios,cheerio:cheerio}=providerContext,baseUrl=yield getBaseUrl("movieBox"),url=`${baseUrl}/wefeed-mobile-bff/subject-api/search/v2`;if(page>1)return[];const response=yield fetch("https://dob-worker.8man.workers.dev",{signal:signal,method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:url,method:"POST",body:{page:1,perPage:20,keyword:searchQuery,tabId:"Movie"}})}),data=yield response.json();return((null==(_c=null==(_b=null==(_a=null==data?void 0:data.data)?void 0:_a.results)?void 0:_b[0])?void 0:_c.subjects)||[]).map(item=>{var _a2;return{image:null==(_a2=null==item?void 0:item.cover)?void 0:_a2.url,title:null==item?void 0:item.title,link:`${baseUrl}/wefeed-mobile-bff/subject-api/get?subjectId=${null==item?void 0:item.subjectId}`}})})},"getSearchPosts");exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var getPosts=__name(function(_0){return __async(this,arguments,function*({filter:filter,page:page,signal:signal,providerContext:providerContext}){var _a,_b,_c,_d;const posts=[],{getBaseUrl:getBaseUrl}=providerContext;if(page>1)return posts;const response=yield fetch("https://dob-worker.1proxy.workers.dev",{signal:signal,method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:"/wefeed-mobile-bff/tab-operating?page=3&tabId=0&version=2fe0d7c224603ff7b0df294b46d3b84b",method:"GET"})}),data=yield response.json(),items=(null==(_a=null==data?void 0:data.data)?void 0:_a.items)||[],filterIndex=Number.parseInt(filter,10);let list=null==(_b=null==items?void 0:items[filterIndex])?void 0:_b.subjects;Array.isArray(list)&&0!==list.length||(list=(null==(_c=null==items?void 0:items.find(item=>Array.isArray(null==item?void 0:item.subjects)&&item.subjects.length>0))?void 0:_c.subjects)||[]);for(const item of list){const post={image:null==item?void 0:item.cover.url,title:null==(_d=null==item?void 0:item.title)?void 0:_d.replace(/\s*\[.*?\]\s*$/,""),link:`/wefeed-mobile-bff/subject-api/get?subjectId=${null==item?void 0:item.subjectId}`};posts.push(post)}return posts})},"getPosts"),getSearchPosts=__name(function(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page,signal:signal,providerContext:providerContext}){var _a,_b,_c;const{getBaseUrl:getBaseUrl,axios:axios,cheerio:cheerio}=providerContext,baseUrl=yield getBaseUrl("movieBox"),url=`${baseUrl}/wefeed-mobile-bff/subject-api/search/v2`;if(page>1)return[];const response=yield fetch("https://dob-worker.8man.workers.dev",{signal:signal,method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:url,method:"POST",body:{page:1,perPage:20,keyword:searchQuery,tabId:"Movie"}})}),data=yield response.json();return((null==(_c=null==(_b=null==(_a=null==data?void 0:data.data)?void 0:_a.results)?void 0:_b[0])?void 0:_c.subjects)||[]).map(item=>{var _a2;return{image:null==(_a2=null==item?void 0:item.cover)?void 0:_a2.url,title:null==item?void 0:item.title,link:`${baseUrl}/wefeed-mobile-bff/subject-api/get?subjectId=${null==item?void 0:item.subjectId}`}})})},"getSearchPosts");exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),catalog_exports={};__export(catalog_exports,{catalog:()=>catalog});var catalog=[{title:"Trending",filter:""},{title:"Anime",filter:"/category/anime/"}];exports.catalog=catalog;
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),catalog_exports={};__export(catalog_exports,{catalog:()=>catalog});var catalog=[{title:"Latest",filter:""},{title:"Web Series",filter:"/category/web-series/"}];exports.catalog=catalog;
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropSymbols=Object.getOwnPropertySymbols,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value:value}):obj[key]=value,__spreadValues=(a,b)=>{for(var prop in b||(b={}))__hasOwnProp.call(b,prop)&&__defNormalProp(a,prop,b[prop]);if(__getOwnPropSymbols)for(var prop of __getOwnPropSymbols(b))__propIsEnum.call(b,prop)&&__defNormalProp(a,prop,b[prop]);return a},__spreadProps=(a,b)=>__defProps(a,__getOwnPropDescs(b)),__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),episodes_exports={};__export(episodes_exports,{getEpisodes:()=>getEpisodes});var getEpisodes=__name(function(_0){return __async(this,arguments,function*({url:url,providerContext:providerContext}){const{axios:axios,cheerio:cheerio,commonHeaders:headers}=providerContext;console.log("getEpisodeLinks",url);try{const res=yield axios.get(url,{headers:__spreadProps(__spreadValues({},headers),{cookie:"ext_name=ojplmecpdpgccookcobabopnaifgidhf; cf_clearance=Zl2yiOCN3pzGUd0Bgs.VyBXniJooDbG2Tk1g7DEoRnw-1756381111-1.2.1.1-RVPZoWGCAygGNAHavrVR0YaqASWZlJyYff8A.oQfPB5qbcPrAVud42BzsSwcDgiKAP0gw5D92V3o8XWwLwDRNhyg3DuL1P8wh2K4BCVKxWvcy.iCCxczKtJ8QSUAsAQqsIzRWXk29N6X.kjxuOTYlfB2jrlq12TRDld_zTbsskNcTxaA.XQekUcpGLseYqELuvlNOQU568NZD6LiLn3ICyFThMFAx6mIcgXkxVAvnxU; xla=s4t"})}),$=cheerio.load(res.data),container=$(".entry-content,.entry-inner, .download-links-div");$(".unili-content,.code-block-1").remove();const episodes=[];return container.find("h5").each((index,element)=>{const el=$(element),title=el.text().trim(),hubCloudLink=el.next(".downloads-btns-div").find('a[style*="background: linear-gradient(135deg,#e629d0,#007bff);"]').attr("href");if(title&&hubCloudLink){const cleanedTitle=title.replace(/[-:]/g,"").trim();episodes.push({title:cleanedTitle,link:hubCloudLink})}}),episodes}catch(err){return console.log("getEpisodeLinks error: "),[]}})},"getEpisodes");exports.getEpisodes=getEpisodes;
"use strict";var __defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropSymbols=Object.getOwnPropertySymbols,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value:value}):obj[key]=value,__spreadValues=(a,b)=>{for(var prop in b||(b={}))__hasOwnProp.call(b,prop)&&__defNormalProp(a,prop,b[prop]);if(__getOwnPropSymbols)for(var prop of __getOwnPropSymbols(b))__propIsEnum.call(b,prop)&&__defNormalProp(a,prop,b[prop]);return a},__spreadProps=(a,b)=>__defProps(a,__getOwnPropDescs(b)),__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),episodes_exports={};__export(episodes_exports,{getEpisodes:()=>getEpisodes});var getEpisodes=__name(function(_0){return __async(this,arguments,function*({url:url,providerContext:providerContext}){const{axios:axios,cheerio:cheerio,commonHeaders:headers}=providerContext;console.log("getEpisodeLinks",url);try{let res=yield axios.get(url,{headers:__spreadProps(__spreadValues({},headers),{cookie:"ext_name=ojplmecpdpgccookcobabopnaifgidhf; cf_clearance=Zl2yiOCN3pzGUd0Bgs.VyBXniJooDbG2Tk1g7DEoRnw-1756381111-1.2.1.1-RVPZoWGCAygGNAHavrVR0YaqASWZlJyYff8A.oQfPB5qbcPrAVud42BzsSwcDgiKAP0gw5D92V3o8XWwLwDRNhyg3DuL1P8wh2K4BCVKxWvcy.iCCxczKtJ8QSUAsAQqsIzRWXk29N6X.kjxuOTYlfB2jrlq12TRDld_zTbsskNcTxaA.XQekUcpGLseYqELuvlNOQU568NZD6LiLn3ICyFThMFAx6mIcgXkxVAvnxU; xla=s4t"})});if(res.data&&res.data.includes("Please turn JavaScript on and reload the page.")){const b1Match=res.data.match(/var b1=atob\(['"]([^'"]+)['"]\)/),a2Match=res.data.match(/_0x2aa8=\[['"]([^'"]+)['"]\]/),c3Match=res.data.match(/c3=toNumbers\(['"]([^'"]+)['"]\)/);if(b1Match&&a2Match&&c3Match){const unescapeHexStr=__name(str=>str.replace(/\\x([0-9A-Fa-f]{2})/g,(_,hex)=>String.fromCharCode(parseInt(hex,16))),"unescapeHexStr"),baseUrl=url.split("/").slice(0,3).join("/"),minJsRes=yield axios.get(`${baseUrl}/min.js`,{headers:headers}),b1Hex=atob(unescapeHexStr(b1Match[1])),a2Hex=atob(unescapeHexStr(a2Match[1])),c3Hex=unescapeHexStr(c3Match[1]),newCookie=`Antiddos-systems-DH=${new Function("c3Hex","a1Hex","b2Hex",`\n ${minJsRes.data}\n function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}\n function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e='',f=0;f<d.length;f++)e+=(16>d[f]?'0':'')+d[f].toString(16);return e.toLowerCase()}\n return toHex(slowAES.decrypt(toNumbers(c3Hex), 2, toNumbers(a1Hex), toNumbers(b2Hex)));\n `)(c3Hex,a2Hex,b1Hex)}`;res=yield axios.get(url,{headers:__spreadProps(__spreadValues({},headers),{Cookie:newCookie})})}}const $=cheerio.load(res.data),container=$(".entry-content,.entry-inner, .download-links-div");$(".unili-content,.code-block-1").remove();const episodes=[];return container.find("h3, h4, h5, p").each((index,element)=>{const el=$(element),title=el.text().trim(),link=el.nextAll().find("a").first().attr("href");if(title&&link&&title.match(/Episode|Ep|E\d+/i)&&title.length<150){const cleanedTitle=title.replace(/[-:]/g,"").trim();episodes.some(e=>e.link===link)||episodes.push({title:cleanedTitle,link:link})}}),0===episodes.length&&$("a").each((i,el)=>{const href=$(el).attr("href");if(href&&(href.includes("mdrive")||href.includes("fastdl")||href.includes("filebee")||href.includes("gdflix"))){const title=$(el).parent().prev().text().trim()||$(el).text().trim()||`Episode ${i+1}`;episodes.some(e=>e.link===href)||episodes.push({title:title.replace(/[-:]/g,"").trim(),link:href})}}),episodes}catch(err){return console.log("getEpisodeLinks error: "),[]}})},"getEpisodes");exports.getEpisodes=getEpisodes;
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+57332
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var getPosts=__name(function(_0){return __async(this,arguments,function*({filter:filter,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl,axios:axios,cheerio:cheerio}=providerContext,baseUrl=yield getBaseUrl("showbox");return posts({url:`${baseUrl+filter}?page=${page}/`,signal:signal,baseUrl:baseUrl,axios:axios,cheerio:cheerio})})},"getPosts"),getSearchPosts=__name(function(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl,axios:axios,cheerio:cheerio}=providerContext,baseUrl=yield getBaseUrl("showbox");return posts({url:`${baseUrl}/search?keyword=${searchQuery}&page=${page}`,signal:signal,baseUrl:baseUrl,axios:axios,cheerio:cheerio})})},"getSearchPosts");function posts(_0){return __async(this,arguments,function*({url:url,signal:signal,axios:axios,cheerio:cheerio}){try{const data=(yield axios.get(url,{signal:signal})).data,$=cheerio.load(data),catalog=[];return $(".movie-item,.flw-item").map((i,element)=>{const title=$(element).find(".film-name").text().trim(),link=$(element).find("a").attr("href"),image=$(element).find("img").attr("src");title&&link&&image&&catalog.push({title:title,link:link,image:image})}),catalog}catch(err){return[]}})}__name(posts,"posts"),exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var getPosts=__name(function(_0){return __async(this,arguments,function*({filter:filter,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl,axios:axios,cheerio:cheerio}=providerContext,baseUrl=yield getBaseUrl("showbox");return posts({url:`${baseUrl+filter}?page=${page}/`,signal:signal,baseUrl:baseUrl,axios:axios,cheerio:cheerio})})},"getPosts"),getSearchPosts=__name(function(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl,axios:axios,cheerio:cheerio,commonHeaders:commonHeaders}=providerContext,baseUrl=yield getBaseUrl("showbox");return posts({url:`${baseUrl}/search?keyword=${searchQuery}&page=${page}`,signal:signal,baseUrl:baseUrl,axios:axios,cheerio:cheerio,headers:commonHeaders})})},"getSearchPosts");function posts(_0){return __async(this,arguments,function*({url:url,signal:signal,axios:axios,cheerio:cheerio,headers:headers}){let lastError;for(let attempt=1;attempt<=3;attempt++)try{const data=(yield axios.get(url,{signal:signal,headers:headers})).data;console.log(data);const $=cheerio.load(data),catalog=[];return $(".movie-item,.flw-item").map((i,element)=>{const title=$(element).find(".film-name").text().trim(),link=$(element).find("a").attr("href"),image=$(element).find("img").attr("src");console.log(title,link,image),title&&link&&image&&catalog.push({title:title,link:link,image:image})}),catalog}catch(err){if(lastError=err,signal.aborted||3===attempt)throw err}throw lastError})}__name(posts,"posts"),exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),stream_exports={};__export(stream_exports,{getStream:()=>getStream});var getStream=__name(function(_0){return __async(this,arguments,function*({link:id,signal:signal,providerContext:providerContext}){try{const{axios:axios,cheerio:cheerio}=providerContext,stream=[],[,epId]=id.split("&"),url=`https://febbox.vercel.app/api/video-quality?fid=${epId}`,data=(yield axios.get(url,{signal:signal})).data,$=cheerio.load(data.html);return $(".file_quality").each((i,el)=>{const server=$(el).find("p.name").text()+" - "+$(el).find("p.size").text()+" - "+$(el).find("p.speed").text(),link=$(el).attr("data-url");link&&stream.push({server:server,type:"mkv",link:link})}),stream}catch(err){return[]}})},"getStream");exports.getStream=getStream;
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),stream_exports={};__export(stream_exports,{getStream:()=>getStream});var getStream=__name(function(_0){return __async(this,arguments,function*({link:id,signal:signal,providerContext:providerContext}){try{const{axios:axios,cheerio:cheerio}=providerContext,stream=[],[,epId]=id.split("&"),url=`https://feb.8man.workers.dev/?fid=${epId}`,data=(yield axios.get(url,{signal:signal})).data,$=cheerio.load(data.html);return $(".file_quality").each((i,el)=>{const server=$(el).find("p.name").text()+" - "+$(el).find("p.size").text()+" - "+$(el).find("p.speed").text(),link=$(el).attr("data-url");link&&stream.push({server:server,type:"mkv",link:link})}),console.log(stream),stream}catch(err){return[]}})},"getStream");exports.getStream=getStream;
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var headers={Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Cache-Control":"no-store","Accept-Language":"en-US,en;q=0.9",DNT:"1","sec-ch-ua":'"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',"sec-ch-ua-mobile":"?0","sec-ch-ua-platform":'"Windows"',"Sec-Fetch-Dest":"document","Sec-Fetch-Mode":"navigate",Cookie:"popads_user_id=6ba8fe60a481387a3249f05aa058822d","Sec-Fetch-Site":"none","Sec-Fetch-User":"?1","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0"},getPosts=__name(function(_0){return __async(this,arguments,function*({filter:filter,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl}=providerContext;return posts(`${(yield getBaseUrl("Topmovies"))+filter}/page/${page}/`,signal,providerContext)})},"getPosts"),getSearchPosts=__name(function(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl}=providerContext;return posts(`${yield getBaseUrl("Topmovies")}/search/${searchQuery}/page/${page}/`,signal,providerContext)})},"getSearchPosts");function posts(url,signal,providerContext){return __async(this,null,function*(){try{const{axios:axios,cheerio:cheerio}=providerContext,data=(yield axios.get(url,{headers:headers,signal:signal})).data,$=cheerio.load(data),catalog=[];return $(".post-cards").find("article").map((i,element)=>{const title=$(element).find("a").attr("title"),link=$(element).find("a").attr("href"),image=$(element).find("img").attr("data-src")||$(element).find("img").attr("src")||"";title&&link&&catalog.push({title:title.replace("Download","").trim(),link:link,image:image})}),catalog}catch(err){return console.error("mod error ",err),[]}})}__name(posts,"posts"),exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var headers={Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Cache-Control":"no-store","Accept-Language":"en-US,en;q=0.9",DNT:"1","sec-ch-ua":'"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',"sec-ch-ua-mobile":"?0","sec-ch-ua-platform":'"Windows"',"Sec-Fetch-Dest":"document","Sec-Fetch-Mode":"navigate","Sec-Fetch-Site":"none","Sec-Fetch-User":"?1","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0"},getPosts=__name(function(_0){return __async(this,arguments,function*({filter:filter,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl}=providerContext;return posts(`${(yield getBaseUrl("Topmovies"))+filter}/page/${page}/`,signal,providerContext)})},"getPosts"),getSearchPosts=__name(function(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page,signal:signal,providerContext:providerContext}){const{getBaseUrl:getBaseUrl}=providerContext;return posts(`${yield getBaseUrl("Topmovies")}/search/${searchQuery}/page/${page}/`,signal,providerContext)})},"getSearchPosts");function posts(url,signal,providerContext){return __async(this,null,function*(){try{const{axios:axios,cheerio:cheerio}=providerContext,data=(yield axios.get(url,{headers:headers,signal:signal})).data,$=cheerio.load(data),catalog=[];return $(".post-cards").find("article").map((i,element)=>{const title=$(element).find("a").attr("title"),link=$(element).find("a").attr("href"),image=$(element).find("img").attr("data-src")||$(element).find("img").attr("src")||"";title&&link&&catalog.push({title:title.replace("Download","").trim(),link:link,image:image})}),catalog}catch(err){return console.error("mod error ",err),[]}})}__name(posts,"posts"),exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),catalog_exports={};__export(catalog_exports,{catalog:()=>catalog,genres:()=>genres});var catalog=[{title:"New",filter:""},{title:"Netflix",filter:"web-series/netflix"},{title:"Amazon Prime",filter:"web-series/amazon-prime-video"},{title:"4K Movies",filter:"movies-by-quality/2160p"}],genres=[{title:"Action",filter:"category/movies-by-genres/action"},{title:"Adventure",filter:"category/movies-by-genres/adventure"},{title:"Animation",filter:"category/movies-by-genres/animation"},{title:"Biography",filter:"category/movies-by-genres/biography"},{title:"Comedy",filter:"category/movies-by-genres/comedy"},{title:"Crime",filter:"category/movies-by-genres/crime"},{title:"Documentary",filter:"category/movies-by-genres/documentary"},{title:"Drama",filter:"category/movies-by-genres/drama"},{title:"Family",filter:"category/movies-by-genres/family"},{title:"Fantasy",filter:"category/movies-by-genres/fantasy"},{title:"History",filter:"category/movies-by-genres/history"},{title:"Horror",filter:"category/movies-by-genres/horror"},{title:"Music",filter:"category/movies-by-genres/music"},{title:"Mystery",filter:"category/movies-by-genres/mystery"},{title:"Romance",filter:"category/movies-by-genres/romance"},{title:"Sci-Fi",filter:"category/movies-by-genres/sci-fi"},{title:"Sport",filter:"category/movies-by-genres/sport"},{title:"Thriller",filter:"category/movies-by-genres/thriller"},{title:"War",filter:"category/movies-by-genres/war"},{title:"Western",filter:"category/movies-by-genres/western"}];exports.catalog=catalog,exports.genres=genres;
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),catalog_exports={};__export(catalog_exports,{catalog:()=>catalog,genres:()=>genres});var catalog=[{title:"New",filter:""},{title:"Netflix",filter:"web-series/netflix"},{title:"Amazon Prime",filter:"web-series/amazon-prime-video"},{title:"Apple TV+",filter:"web-series/apple-tv"}],genres=[{title:"Action",filter:"category/movies-by-genres/action"},{title:"Adventure",filter:"category/movies-by-genres/adventure"},{title:"Animation",filter:"category/movies-by-genres/animation"},{title:"Biography",filter:"category/movies-by-genres/biography"},{title:"Comedy",filter:"category/movies-by-genres/comedy"},{title:"Crime",filter:"category/movies-by-genres/crime"},{title:"Documentary",filter:"category/movies-by-genres/documentary"},{title:"Drama",filter:"category/movies-by-genres/drama"},{title:"Family",filter:"category/movies-by-genres/family"},{title:"Fantasy",filter:"category/movies-by-genres/fantasy"},{title:"History",filter:"category/movies-by-genres/history"},{title:"Horror",filter:"category/movies-by-genres/horror"},{title:"Music",filter:"category/movies-by-genres/music"},{title:"Mystery",filter:"category/movies-by-genres/mystery"},{title:"Romance",filter:"category/movies-by-genres/romance"},{title:"Sci-Fi",filter:"category/movies-by-genres/sci-fi"},{title:"Sport",filter:"category/movies-by-genres/sport"},{title:"Thriller",filter:"category/movies-by-genres/thriller"},{title:"War",filter:"category/movies-by-genres/war"},{title:"Western",filter:"category/movies-by-genres/western"}];exports.catalog=catalog,exports.genres=genres;
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var defaultHeaders={Referer:"https://www.google.com","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9",Pragma:"no-cache","Cache-Control":"no-cache"};function getPosts(_0){return __async(this,arguments,function*({filter:filter,page:page=1,signal:signal,providerContext:providerContext}){return fetchPosts({filter:filter,page:page,query:"",signal:signal,providerContext:providerContext})})}function getSearchPosts(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page=1,signal:signal,providerContext:providerContext}){return fetchPosts({filter:"",page:page,query:searchQuery,signal:signal,providerContext:providerContext})})}function fetchPosts(_0){return __async(this,arguments,function*({filter:filter,query:query,page:page=1,signal:signal,providerContext:providerContext}){try{const baseUrl=yield providerContext.getBaseUrl("zeefliz");let url;if(query&&query.trim()){const params=new URLSearchParams;params.append("s",query.trim()),page>1&&params.append("paged",page.toString()),url=`${baseUrl}/?${params.toString()}`}else url=filter?filter.startsWith("/")?`${baseUrl}${filter.replace(/\/$/,"")}${page>1?`/page/${page}`:""}`:`${baseUrl}/${filter}${page>1?`/page/${page}`:""}`:`${baseUrl}${page>1?`/page/${page}`:""}`;const{axios:axios,cheerio:cheerio}=providerContext,res=yield axios.get(url,{headers:defaultHeaders,signal:signal}),$=cheerio.load(res.data||""),resolveUrl=__name(href=>(null==href?void 0:href.startsWith("http"))?href:new URL(href,baseUrl).href,"resolveUrl"),seen=new Set,catalog=[];return $("section.site-main article.post").each((_,el)=>{var _a;const card=$(el);let link=card.find("a[href]").first().attr("href")||"";if(!link)return;if(link=resolveUrl(link),seen.has(link))return;let title=card.find("h3.entry-title a").text().trim()||card.find("a[rel='bookmark']").text().trim()||(null==(_a=card.find("a[title]").attr("title"))?void 0:_a.trim())||"";if(title=title.replace(/^Download\s*/i,"").trim(),!title)return;let img=card.find("img").attr("bv-data-src")||card.find("img").attr("src")||card.find("img").attr("data-src")||card.find("img").attr("data-original")||"";const image=img?resolveUrl(img):"";seen.add(link),catalog.push({title:title,link:link,image:image})}),catalog.slice(0,100)}catch(err){return console.error("fetchPosts error:",err instanceof Error?err.message:String(err)),[]}})}__name(getPosts,"getPosts"),__name(getSearchPosts,"getSearchPosts"),__name(fetchPosts,"fetchPosts"),exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
"use strict";var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0}),__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod),__async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())}),posts_exports={};__export(posts_exports,{getPosts:()=>getPosts,getSearchPosts:()=>getSearchPosts});var defaultHeaders={Referer:"https://www.google.com","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.9",Pragma:"no-cache","Cache-Control":"no-cache"};function getPosts(_0){return __async(this,arguments,function*({filter:filter,page:page=1,signal:signal,providerContext:providerContext}){return fetchPosts({filter:filter,page:page,query:"",signal:signal,providerContext:providerContext})})}function getSearchPosts(_0){return __async(this,arguments,function*({searchQuery:searchQuery,page:page=1,signal:signal,providerContext:providerContext}){return fetchPosts({filter:"",page:page,query:searchQuery,signal:signal,providerContext:providerContext})})}function fetchPosts(_0){return __async(this,arguments,function*({filter:filter,query:query,page:page=1,signal:signal,providerContext:providerContext}){try{const baseUrl=yield providerContext.getBaseUrl("zeefliz");let url;if(query&&query.trim()){const params=new URLSearchParams;params.append("s",query.trim()),page>1&&params.append("paged",page.toString()),url=`${baseUrl}/?${params.toString()}`}else url=filter?filter.startsWith("/")?`${baseUrl}${filter.replace(/\/$/,"")}${page>1?`/page/${page}`:""}`:`${baseUrl}/${filter}${page>1?`/page/${page}`:""}`:`${baseUrl}${page>1?`/page/${page}`:""}`;const{axios:axios,cheerio:cheerio}=providerContext,res=yield axios.get(url,{headers:defaultHeaders,signal:signal}),$=cheerio.load(res.data||""),resolveUrl=__name(href=>(null==href?void 0:href.startsWith("http"))?href:new URL(href,baseUrl).href,"resolveUrl"),seen=new Set,catalog=[];return $("section.site-main article.post").each((_,el)=>{var _a;const card=$(el);let link=card.find("a[href]").first().attr("href")||"";if(!link)return;if(link=resolveUrl(link),seen.has(link))return;let title=card.find("h3.entry-title a").text().trim()||card.find("a[rel='bookmark']").text().trim()||(null==(_a=card.find("a[title]").attr("title"))?void 0:_a.trim())||"";if(title=title.replace(/^Download\s*/i,"").trim(),!title)return;let img=card.find("img").attr("data-src")||card.find("img").attr("bv-data-src")||card.find("img").attr("src")||card.find("img").attr("data-original")||"";const image=img?resolveUrl(img):"";seen.add(link),catalog.push({title:title,link:link,image:image})}),catalog.slice(0,100)}catch(err){return console.error("fetchPosts error:",err instanceof Error?err.message:String(err)),[]}})}__name(getPosts,"getPosts"),__name(getSearchPosts,"getSearchPosts"),__name(fetchPosts,"fetchPosts"),exports.getPosts=getPosts,exports.getSearchPosts=getSearchPosts;
+1 -1
View File
File diff suppressed because one or more lines are too long
+330 -330
View File
@@ -1,330 +1,330 @@
[
{
"display_name": "VegaMovies",
"value": "vega",
"version": "1.16",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "MultiStream",
"value": "autoEmbed",
"version": "1.6",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "MoviesDrive",
"value": "drive",
"version": "1.7",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "MultiMovies",
"value": "multi",
"version": "1.3",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "4khdHub",
"value": "4khdhub",
"version": "1.9",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "Cinewood",
"value": "1cinevood",
"version": "1.2",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "World4uFree",
"value": "world4u",
"version": "1.4",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "KatMoviesHd",
"value": "katmovies",
"version": "1.4",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "MoviesMod",
"value": "mod",
"version": "1.3",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "UHDMovies",
"value": "uhd",
"version": "1.2",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "ProtonMovies",
"value": "protonMovies",
"version": "1.4",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "CinemaLuxe",
"value": "cinemaLuxe",
"version": "1.5",
"icon": "",
"type": "global",
"disabled": true
},
{
"display_name": "FilmyFly",
"value": "filmyfly",
"version": "1.4",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "MovieBox",
"value": "movieBox",
"version": "1.2",
"icon": "",
"type": "global",
"disabled": true
},
{
"display_name": "Movies4U",
"value": "movies4u",
"version": "1.2",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "KmMovies",
"value": "kmMovies",
"version": "1.3",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "Zeefliz",
"value": "zeefliz",
"version": "1.2",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "KatMovieFix",
"value": "katMovieFix",
"version": "1.4",
"icon": "",
"type": "global",
"disabled": true
},
{
"display_name": "Ringz",
"value": "ringz",
"version": "1.0",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "NetflixMirror",
"value": "netflixMirror",
"version": "1.7",
"icon": "",
"type": "global",
"disabled": true
},
{
"display_name": "PrimeMirror",
"value": "primeMirror",
"version": "1.6",
"icon": "",
"type": "global",
"disabled": true
},
{
"display_name": "HdHub4u",
"value": "hdhub4u",
"version": "1.4",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "Ogomovies",
"value": "ogomovies",
"version": "1.0",
"icon": "",
"type": "india",
"disabled": true
},
{
"display_name": "A.111477",
"value": "a111477",
"version": "1.2",
"icon": "",
"type": "english",
"disabled": true
},
{
"display_name": "VadaPav",
"value": "vadapav",
"version": "1.0",
"icon": "",
"type": "global",
"disabled": true
},
{
"display_name": "MoviesApi",
"value": "moviesApi",
"version": "1.0",
"icon": "",
"type": "english",
"disabled": true
},
{
"display_name": "MoviezWap",
"value": "moviezwap",
"version": "1.0",
"icon": "",
"type": "india",
"disabled": false
},
{
"display_name": "ShowBox",
"value": "showbox",
"version": "1.1",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "RidoMovies",
"value": "ridoMovies",
"version": "1.0",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "FlixHQ",
"value": "flixhq",
"version": "1.0",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "Primewire",
"value": "primewire",
"version": "1.0",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "HiAnime",
"value": "hiAnime",
"version": "1.1",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "Animetsu",
"value": "animetsu",
"version": "1.1",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "TokyoInsider",
"value": "tokyoInsider",
"version": "1.0",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "KissKh",
"value": "kissKh",
"version": "1.2",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "Dooflix",
"value": "dooflix",
"version": "1.4",
"icon": "",
"type": "india",
"disabled": true
},
{
"display_name": "RogMovies",
"value": "luxMovies",
"version": "1.9",
"icon": "",
"type": "india",
"disabled": false
},
{
"display_name": "TopMovies",
"value": "topmovies",
"version": "1.1",
"icon": "",
"type": "india",
"disabled": false
},
{
"display_name": "GuardaHD",
"value": "guardahd",
"version": "1.6",
"icon": "",
"type": "italy",
"disabled": false
},
{
"display_name": "SkyMovieHD",
"value": "skyMovieHD",
"version": "1.4",
"icon": "",
"type": "global",
"disabled": true
},
{
"display_name": "Joya9tv",
"value": "Joya9tv",
"version": "1.3",
"icon": "",
"type": "india",
"disabled": false
}
]
[
{
"display_name": "VegaMovies",
"value": "vega",
"version": "2.9",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "MultiStream",
"value": "autoEmbed",
"version": "1.6",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "MoviesDrive",
"value": "drive",
"version": "2.2",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "MultiMovies",
"value": "multi",
"version": "1.3",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "4khdHub",
"value": "4khdhub",
"version": "2.4",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "Cinewood",
"value": "1cinevood",
"version": "1.5",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "World4uFree",
"value": "world4u",
"version": "1.4",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "KatMoviesHd",
"value": "katmovies",
"version": "1.7",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "MoviesMod",
"value": "mod",
"version": "1.3",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "UHDMovies",
"value": "uhd",
"version": "1.2",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "ProtonMovies",
"value": "protonMovies",
"version": "1.4",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "CinemaLuxe",
"value": "cinemaLuxe",
"version": "1.8",
"icon": "",
"type": "global",
"disabled": true
},
{
"display_name": "FilmyFly",
"value": "filmyfly",
"version": "1.4",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "MovieBox",
"value": "movieBox",
"version": "2.0",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "Movies4U",
"value": "movies4u",
"version": "1.7",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "KmMovies",
"value": "kmMovies",
"version": "1.3",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "Zeefliz",
"value": "zeefliz",
"version": "1.6",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "KatMovieFix",
"value": "katMovieFix",
"version": "1.7",
"icon": "",
"type": "global",
"disabled": true
},
{
"display_name": "Ringz",
"value": "ringz",
"version": "1.0",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "NetflixMirror",
"value": "netflixMirror",
"version": "1.7",
"icon": "",
"type": "global",
"disabled": true
},
{
"display_name": "PrimeMirror",
"value": "primeMirror",
"version": "1.6",
"icon": "",
"type": "global",
"disabled": true
},
{
"display_name": "HdHub4u",
"value": "hdhub4u",
"version": "2.1",
"icon": "",
"type": "global",
"disabled": false
},
{
"display_name": "Ogomovies",
"value": "ogomovies",
"version": "1.0",
"icon": "",
"type": "india",
"disabled": true
},
{
"display_name": "A.111477",
"value": "a111477",
"version": "1.2",
"icon": "",
"type": "english",
"disabled": true
},
{
"display_name": "VadaPav",
"value": "vadapav",
"version": "1.0",
"icon": "",
"type": "global",
"disabled": true
},
{
"display_name": "MoviesApi",
"value": "moviesApi",
"version": "1.0",
"icon": "",
"type": "english",
"disabled": true
},
{
"display_name": "MoviezWap",
"value": "moviezwap",
"version": "1.0",
"icon": "",
"type": "india",
"disabled": false
},
{
"display_name": "ShowBox",
"value": "showbox",
"version": "1.2",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "RidoMovies",
"value": "ridoMovies",
"version": "1.0",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "FlixHQ",
"value": "flixhq",
"version": "1.0",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "Primewire",
"value": "primewire",
"version": "1.0",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "HiAnime",
"value": "hiAnime",
"version": "1.1",
"icon": "",
"type": "english",
"disabled": true
},
{
"display_name": "Animetsu",
"value": "animetsu",
"version": "1.4",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "TokyoInsider",
"value": "tokyoInsider",
"version": "1.0",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "KissKh",
"value": "kissKh",
"version": "1.2",
"icon": "",
"type": "english",
"disabled": false
},
{
"display_name": "Dooflix",
"value": "dooflix",
"version": "1.4",
"icon": "",
"type": "india",
"disabled": true
},
{
"display_name": "RogMovies",
"value": "luxMovies",
"version": "2.5",
"icon": "",
"type": "india",
"disabled": false
},
{
"display_name": "TopMovies",
"value": "topmovies",
"version": "1.2",
"icon": "",
"type": "india",
"disabled": false
},
{
"display_name": "GuardaHD",
"value": "guardahd",
"version": "1.6",
"icon": "",
"type": "italy",
"disabled": false
},
{
"display_name": "SkyMovieHD",
"value": "skyMovieHD",
"version": "1.7",
"icon": "",
"type": "global",
"disabled": true
},
{
"display_name": "Joya9tv",
"value": "Joya9tv",
"version": "1.7",
"icon": "",
"type": "india",
"disabled": false
}
]
-7
View File
@@ -11,7 +11,6 @@
"dependencies": {
"axios": "^1.10.0",
"cheerio": "^1.1.0",
"react-native-aes-crypto": "^3.2.1",
"rimraf": "^6.0.1",
"zod": "^4.0.2"
},
@@ -2462,12 +2461,6 @@
"node": ">=0.10.0"
}
},
"node_modules/react-native-aes-crypto": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/react-native-aes-crypto/-/react-native-aes-crypto-3.2.1.tgz",
"integrity": "sha512-v7KDt1I2UqYwRJRFeJrB8zABQuUsawCyWLK+h5AF2aZqsrsIaR/+DaZrqCetR9QvYRI+oEVsrwBUv9xYXhfCBQ==",
"license": "MIT"
},
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-1
View File
@@ -36,7 +36,6 @@
"dependencies": {
"axios": "^1.10.0",
"cheerio": "^1.1.0",
"react-native-aes-crypto": "^3.2.1",
"rimraf": "^6.0.1",
"zod": "^4.0.2"
}
+12 -2
View File
@@ -23,8 +23,10 @@ export async function getStream({
const res = await axios.get(link, { headers, signal });
const text = res.data;
const encryptedString = text.split("s('o','")?.[1]?.split("',180")?.[0];
const decodedString: any = decodeString(encryptedString);
link = atob(decodedString?.o);
const decodedString: any = decodeString(encryptedString) || link;
console.log("decodedString", decodedString);
link = safeAtob(decodedString?.o) || link;
console.log("Decoded link", link);
const redirectLink = await getRedirectLinks(link, signal, headers);
console.log("redirectLink", redirectLink);
if (redirectLink.includes("hubcloud") || redirectLink.includes("/drive/")) {
@@ -176,6 +178,14 @@ function rot13(str: string) {
});
}
const safeAtob = (str: string) => {
try {
return atob(str);
} catch (e) {
return null;
}
};
export function decodeString(encryptedString: string) {
try {
// First base64 decode
+1 -1
View File
@@ -34,7 +34,7 @@ export async function getStream({
try {
const streamLinks: Stream[] = [];
console.log("dotlink", link);
if (type === "movie") {
if (!link.includes("cloud")) {
// vlink
const dotlinkRes = await fetch(`${link}`, { headers });
const dotlinkText = await dotlinkRes.text();
+5 -9
View File
@@ -1,23 +1,19 @@
export const catalog = [
{
title: "Popular",
filter:
"/api/anime/search?query=&page=1&perPage=35&year=any&sort=favourites&season=any&format=any&status=any",
filter: "popular",
},
{
title: "Trending",
filter:
"/api/anime/search?query=&page=1&perPage=35&year=any&sort=trending&season=any&format=any&status=any",
filter: "trending",
},
{
title: "Top Rated",
filter:
"/api/anime/search?query=&page=1&perPage=35&year=any&sort=rating&season=any&format=any&status=any",
filter: "top",
},
{
title: "Favourites",
filter:
"/api/anime/search?query=&page=1&perPage=35&year=any&sort=updated&season=any&format=any&status=any",
title: "Seasonal",
filter: "seasonal",
},
];
+84 -58
View File
@@ -8,15 +8,33 @@ export const getMeta = async function ({
providerContext: ProviderContext;
}): Promise<Info> {
try {
const { axios } = providerContext;
const baseUrl = "https://backend.animetsu.to";
const url = `${baseUrl}/api/anime/info/${link}`;
const { axios, openWebView, commonHeaders } = providerContext;
const baseUrl = "https://animetsu.net";
const url = `${baseUrl}/v2/api/anime/info/${link}`;
const res = await axios.get(url, {
headers: {
Referer: "https://animetsu.to/",
},
});
let cookies: string | undefined;
let res: any;
try {
res = await axios.get(url, {
headers: { ...commonHeaders, Referer: baseUrl },
});
} catch (error: any) {
if (error.response?.status === 403) {
const wafResult = await openWebView(baseUrl, {
title: "Solve the captcha below and click done",
description: "Required to bypass Animetsu anti-bot protection.",
headers: { ...commonHeaders, Referer: baseUrl },
force: true,
waitForCookie: "cf_clearance",
});
cookies = wafResult.cookies;
res = await axios.get(url, {
headers: { ...commonHeaders, Referer: baseUrl, Cookie: cookies },
});
} else {
throw error;
}
}
const data = res.data;
const meta = {
@@ -24,12 +42,12 @@ export const getMeta = async function ({
data.title?.english || data.title?.romaji || data.title?.native || "",
synopsis: data.description || "",
image:
data.coverImage?.extraLarge ||
data.coverImage?.large ||
data.coverImage?.medium ||
data.cover_image?.large ||
data.cover_image?.medium ||
data.cover_image?.small ||
"",
tags: [data?.format, data?.status, ...(data?.genres || [])].filter(
Boolean
Boolean,
),
imdbId: "",
type: data.format === "MOVIE" ? "movie" : "series",
@@ -37,58 +55,66 @@ export const getMeta = async function ({
const linkList: Link[] = [];
// Get episodes data
try {
const episodesRes = await axios.get(`${baseUrl}/api/anime/eps/${link}`, {
headers: {
Referer: "https://animetsu.to/",
},
});
const episodes = episodesRes.data;
const seasons = data.seasons;
if (seasons && seasons.length > 0) {
await Promise.all(
seasons.map(async (season: any) => {
const seasonTitle =
season.title?.english ||
season.title?.romaji ||
season.title?.native;
const directLinks: Link["directLinks"] = [];
if (episodes && episodes.length > 0) {
const directLinks: Link["directLinks"] = [];
try {
const epsRes = await axios.get(
`${baseUrl}/v2/api/anime/eps/${season.id}`,
{
headers: {
...commonHeaders,
Referer: baseUrl,
...(cookies ? { Cookie: cookies } : {}),
},
},
);
const episodes = epsRes.data;
if (episodes && episodes.length > 0) {
episodes.forEach((ep: any) => {
directLinks.push({
title: `Episode ${ep.ep_num}`,
link: `${season.id}:${ep.ep_num}`,
});
});
}
} catch {
// fallback: use total_eps count
const total = season.total_eps || 1;
for (let i = 1; i <= total; i++) {
directLinks.push({
title: `Episode ${i}`,
link: `${season.id}:${i}`,
});
}
}
episodes.forEach((episode: any) => {
const title = `Episode ${episode.number}`;
const episodeLink = `${link}:${episode.number}`;
if (episodeLink && title) {
directLinks.push({
title,
link: episodeLink,
if (directLinks.length > 0) {
linkList.push({
title: seasonTitle || meta.title,
directLinks,
});
}
});
linkList.push({
title: meta.title,
directLinks: directLinks,
});
} else {
// Movie case - single episode
linkList.push({
title: meta.title,
directLinks: [
{
title: "Movie",
link: `${link}:1`,
},
],
}),
);
} else {
// Movie or single-season fallback
const total = data.total_eps || 1;
const directLinks: Link["directLinks"] = [];
for (let i = 1; i <= total; i++) {
directLinks.push({
title: total === 1 ? "Movie" : `Episode ${i}`,
link: `${link}:${i}`,
});
}
} catch (episodeErr) {
console.error("Error fetching episodes:", episodeErr);
// Fallback for movie or single episode
linkList.push({
title: meta.title,
directLinks: [
{
title: meta.title,
link: `${link}:1`,
},
],
});
linkList.push({ title: meta.title, directLinks });
}
return {
+61 -20
View File
@@ -12,14 +12,21 @@ export const getPosts = async function ({
signal: AbortSignal;
providerContext: ProviderContext;
}): Promise<Post[]> {
const { axios } = providerContext;
const baseUrl = "https://backend.animetsu.to";
if (page > 1) {
return [];
}
const { axios, commonHeaders } = providerContext;
const baseUrl = "https://animetsu.net";
const url = `${baseUrl}/v2/api/anime/home`;
// Parse filter to modify page parameter
const url = baseUrl + filter + "&page=" + page.toString();
console.log("animetsuGetPosts url", url);
return posts({ url: url.toString(), signal, axios });
return posts({
url,
filter,
signal,
axios,
providerContext,
headers: commonHeaders,
});
};
export const getSearchPosts = async function ({
@@ -34,32 +41,62 @@ export const getSearchPosts = async function ({
signal: AbortSignal;
providerContext: ProviderContext;
}): Promise<Post[]> {
const { axios } = providerContext;
const baseUrl = "https://backend.animetsu.to";
const url = `${baseUrl}/api/anime/search?query=${encodeURIComponent(
searchQuery
)}&page=${page}&perPage=35&year=any&sort=favourites&season=any&format=any&status=any`;
const { axios, commonHeaders } = providerContext;
const baseUrl = "https://animetsu.net";
const url = `${baseUrl}/v2/api/anime/search/?query=${encodeURIComponent(
searchQuery,
)}`;
return posts({ url, signal, axios });
return posts({ url, signal, axios, providerContext, headers: commonHeaders });
};
async function posts({
url,
filter,
signal,
axios,
providerContext,
headers,
}: {
url: string;
filter?: string;
signal: AbortSignal;
axios: ProviderContext["axios"];
providerContext: ProviderContext;
headers?: Record<string, string>;
}): Promise<Post[]> {
const baseUrl = "https://animetsu.net";
const { openWebView } = providerContext;
try {
const res = await axios.get(url, {
signal,
headers: {
Referer: "https://animetsu.to/",
},
});
const data = res.data?.results;
let cookies: string | undefined;
let res: any;
try {
res = await axios.get(url, {
signal,
headers: {
...headers,
Referer: baseUrl,
},
});
} catch (error: any) {
if (error.response?.status === 403) {
const wafResult = await openWebView(baseUrl, {
title: "Solve the captcha below and click done",
description: "Required to bypass Animetsu anti-bot protection.",
headers: { ...headers, Referer: baseUrl },
force: true,
waitForCookie: "cf_clearance",
});
cookies = wafResult.cookies;
res = await axios.get(url, {
signal,
headers: { ...headers, Referer: baseUrl, Cookie: cookies },
});
} else {
throw error;
}
}
const data = filter ? res.data?.[filter] : res.data?.results || res.data;
const catalog: Post[] = [];
data?.map((element: any) => {
@@ -69,6 +106,10 @@ async function posts({
element.title?.native;
const link = element.id?.toString();
const image =
element.cover_image?.large ||
element.cover_image?.extraLarge ||
element.cover_image?.medium ||
element.cover_image?.small ||
element.coverImage?.large ||
element.coverImage?.extraLarge ||
element.coverImage?.medium;
+103 -75
View File
@@ -8,8 +8,27 @@ export const getStream = async function ({
providerContext: ProviderContext;
}): Promise<Stream[]> {
try {
const { axios } = providerContext;
const baseUrl = "https://backend.animetsu.to";
const { axios, openWebView, commonHeaders } = providerContext;
const baseUrl = "https://animetsu.net";
const streamUrl = `https://swiftstream.top/proxy`;
let wafCookies: string | undefined;
try {
await axios.get(baseUrl, {
headers: { ...commonHeaders, Referer: baseUrl },
});
} catch (error: any) {
if (error.response?.status === 403) {
const wafResult = await openWebView(baseUrl, {
title: "Solve the captcha below and click done",
description: "Required to bypass Animetsu anti-bot protection.",
headers: { ...commonHeaders, Referer: baseUrl },
force: true,
waitForCookie: "cf_clearance",
});
wafCookies = wafResult.cookies;
}
}
// Parse link format: "animeId:episodeNumber"
const [animeId, episodeNumber] = id.split(":");
@@ -18,61 +37,65 @@ export const getStream = async function ({
throw new Error("Invalid link format");
}
const servers = ["pahe", "zoro"]; // Available servers based on API structure
const servers = ["sage", "meg", "dio", "kite"];
const streamLinks: Stream[] = [];
await Promise.all(
servers.map(async (server) => {
try {
const url = `${baseUrl}/api/anime/tiddies?server=${server}&id=${animeId}&num=${episodeNumber}&subType=sub`;
const url = `${baseUrl}/v2/api/anime/oppai/${animeId}/${episodeNumber}?server=${server}&source_type=sub`;
const res = await axios.get(url, {
headers: {
Referer: "https://animetsu.to/",
...commonHeaders,
Referer: baseUrl,
...(wafCookies ? { Cookie: wafCookies } : {}),
},
});
if (res.data && res.data.sources) {
const subtitles: TextTracks = [];
// if (res.data.subtitles && Array.isArray(res.data.subtitles)) {
// res.data.subtitles.forEach((sub: any) => {
// if (sub.url && sub.lang) {
// // Extract language code from lang string (e.g., "English" -> "en", "Arabic - CR" -> "ar")
// const langCode = sub.lang.toLowerCase().includes("english")
// ? "en"
// : sub.lang.toLowerCase().includes("arabic")
// ? "ar"
// : sub.lang.toLowerCase().includes("french")
// ? "fr"
// : sub.lang.toLowerCase().includes("german")
// ? "de"
// : sub.lang.toLowerCase().includes("italian")
// ? "it"
// : sub.lang.toLowerCase().includes("portuguese")
// ? "pt"
// : sub.lang.toLowerCase().includes("russian")
// ? "ru"
// : sub.lang.toLowerCase().includes("spanish")
// ? "es"
// : "und";
if (res.data.subs && Array.isArray(res.data.subs)) {
res.data.subs.forEach((sub: any) => {
if (sub.url && sub.lang) {
const langCode = sub.lang.toLowerCase().includes("english")
? "en"
: sub.lang.toLowerCase().includes("arabic")
? "ar"
: sub.lang.toLowerCase().includes("french")
? "fr"
: sub.lang.toLowerCase().includes("german")
? "de"
: sub.lang.toLowerCase().includes("italian")
? "it"
: sub.lang.toLowerCase().includes("portuguese")
? "pt"
: sub.lang.toLowerCase().includes("russian")
? "ru"
: sub.lang.toLowerCase().includes("spanish")
? "es"
: "und";
// subtitles.push({
// title: sub.lang,
// language: langCode,
// type: "text/vtt",
// uri: sub.url,
// });
// }
// });
// }
subtitles.push({
title: sub.lang,
language: langCode,
type: "text/vtt",
uri: sub.url,
});
}
});
}
res.data.sources.forEach((source: any) => {
const sourceUrl = source.url.startsWith("/")
? `${streamUrl}${source.url}`
: source.url;
streamLinks.push({
server: server + `: ${source.quality}`,
link: `https://m3u8.8man.workers.dev?url=${source.url}`,
server: `${server} (Sub): ${source.quality}`,
link: sourceUrl,
type: "m3u8",
quality: source.quality,
headers: {
referer: "https://animetsu.to/",
referer: baseUrl,
},
subtitles: subtitles.length > 0 ? subtitles : [],
});
@@ -81,62 +104,67 @@ export const getStream = async function ({
} catch (e) {
console.log(`Error with server ${server}:`, e);
}
})
}),
);
// Try dub version as well
await Promise.all(
servers.map(async (server) => {
try {
const url = `${baseUrl}/api/anime/tiddies?server=${server}&id=${animeId}&num=${episodeNumber}&subType=dub`;
const url = `${baseUrl}/v2/api/anime/oppai/${animeId}/${episodeNumber}?server=${server}&source_type=dub`;
const res = await axios.get(url, {
headers: {
referer: "https://animetsu.to/",
...commonHeaders,
Referer: baseUrl,
...(wafCookies ? { Cookie: wafCookies } : {}),
},
});
if (res.data && res.data.sources) {
const subtitles: TextTracks = [];
// if (res.data.subtitles && Array.isArray(res.data.subtitles)) {
// res.data.subtitles.forEach((sub: any) => {
// if (sub.url && sub.lang) {
// // Extract language code from lang string (e.g., "English" -> "en", "Arabic - CR" -> "ar")
// const langCode = sub.lang.toLowerCase().includes("english")
// ? "en"
// : sub.lang.toLowerCase().includes("arabic")
// ? "ar"
// : sub.lang.toLowerCase().includes("french")
// ? "fr"
// : sub.lang.toLowerCase().includes("german")
// ? "de"
// : sub.lang.toLowerCase().includes("italian")
// ? "it"
// : sub.lang.toLowerCase().includes("portuguese")
// ? "pt"
// : sub.lang.toLowerCase().includes("russian")
// ? "ru"
// : sub.lang.toLowerCase().includes("spanish")
// ? "es"
// : "und";
if (res.data.subs && Array.isArray(res.data.subs)) {
res.data.subs.forEach((sub: any) => {
if (sub.url && sub.lang) {
// Extract language code from lang string (e.g., "English" -> "en", "Arabic - CR" -> "ar")
const langCode = sub.lang.toLowerCase().includes("english")
? "en"
: sub.lang.toLowerCase().includes("arabic")
? "ar"
: sub.lang.toLowerCase().includes("french")
? "fr"
: sub.lang.toLowerCase().includes("german")
? "de"
: sub.lang.toLowerCase().includes("italian")
? "it"
: sub.lang.toLowerCase().includes("portuguese")
? "pt"
: sub.lang.toLowerCase().includes("russian")
? "ru"
: sub.lang.toLowerCase().includes("spanish")
? "es"
: "und";
// subtitles.push({
// title: sub.lang,
// language: langCode,
// type: "text/vtt",
// uri: sub.url,
// });
// }
// });
// }
subtitles.push({
title: sub.lang,
language: langCode,
type: "text/vtt",
uri: sub.url,
});
}
});
}
res.data.sources.forEach((source: any) => {
const sourceUrl = source.url.startsWith("/")
? `${streamUrl}${source.url}`
: source.url;
streamLinks.push({
server: `${server} (Dub) : ${source.quality}`,
link: `https://m3u8.8man.workers.dev?url=${source.url}`,
server: `${server} (Dub): ${source.quality}`,
link: sourceUrl,
type: "m3u8",
quality: source.quality,
headers: {
referer: "https://animetsu.to/",
referer: baseUrl,
},
subtitles: subtitles.length > 0 ? subtitles : [],
});
@@ -145,7 +173,7 @@ export const getStream = async function ({
} catch (e) {
console.log(`Error with server ${server} (dub):`, e);
}
})
}),
);
console.log("Stream links:", streamLinks);
+11 -1
View File
@@ -74,8 +74,18 @@ export const getEpisodes = async function ({
}
});
}
if (episodeLinks.length === 0) {
// https://hubcloud.foo/drive/gvdzmpioeeaf8mp
// find link contain hubcloud and have drive in url using regex
const hubcloudLink = html.match(
/https:\/\/hubcloud\.[^\/]+\/drive\/[^"'\s]+/i,
)?.[0];
if (hubcloudLink) {
episodeLinks.push({ title: "Play", link: hubcloudLink });
}
}
// console.log(episodeLinks);
console.log("episodeLinks:", episodeLinks);
return episodeLinks.length > 0
? episodeLinks
: [{ title: "Play", link: url }];
+172 -73
View File
@@ -1,73 +1,172 @@
import { Post, ProviderContext } from "../types";
export const getPosts = async function ({
filter,
page,
signal,
providerContext,
}: {
filter: string;
page: number;
providerValue: string;
signal: AbortSignal;
providerContext: ProviderContext;
}): Promise<Post[]> {
const { getBaseUrl } = providerContext;
const baseUrl = await getBaseUrl("drive");
const url = `${baseUrl + filter}page/${page}/`;
return posts({ url, signal, providerContext });
};
export const getSearchPosts = async function ({
searchQuery,
page,
signal,
providerContext,
}: {
searchQuery: string;
page: number;
providerValue: string;
providerContext: ProviderContext;
signal: AbortSignal;
}): Promise<Post[]> {
const { getBaseUrl } = providerContext;
const baseUrl = await getBaseUrl("drive");
const url = `${baseUrl}page/${page}/?s=${searchQuery}`;
return posts({ url, signal, providerContext });
};
async function posts({
url,
signal,
providerContext,
}: {
url: string;
signal: AbortSignal;
providerContext: ProviderContext;
}): Promise<Post[]> {
try {
console.log("Fetching URL:", url);
const { cheerio } = providerContext;
const res = await fetch(url, { signal });
const data = await res.text();
const $ = cheerio.load(data);
const catalog: Post[] = [];
$(".poster-card").map((i, element) => {
const title = $(element).find(".poster-title").text();
const link = $(element).parent().attr("href");
const image = $(element).find(".poster-image img").attr("src");
console.log({ title, link, image });
if (title && link && image) {
catalog.push({
title: title.replace("Download", "").trim(),
link: link,
image: image,
});
}
});
return catalog;
} catch (err) {
console.error("drive error ", err);
return [];
}
}
import { Post, ProviderContext } from "../types";
export const getPosts = async function ({
filter,
page,
signal,
providerContext,
}: {
filter: string;
page: number;
providerValue: string;
signal: AbortSignal;
providerContext: ProviderContext;
}): Promise<Post[]> {
const { getBaseUrl } = providerContext;
const baseUrl = await getBaseUrl("drive");
const url = `${baseUrl + filter}page/${page}/`;
return posts({ url, signal, providerContext });
};
export const getSearchPosts = async function ({
searchQuery,
page,
signal,
providerContext,
}: {
searchQuery: string;
page: number;
providerValue: string;
providerContext: ProviderContext;
signal: AbortSignal;
}): Promise<Post[]> {
const { getBaseUrl } = providerContext;
const baseUrl = await getBaseUrl("drive");
const url = buildSearchUrl(baseUrl, searchQuery, page);
return searchPosts({
url,
baseUrl,
signal,
});
};
async function posts({
url,
signal,
providerContext,
}: {
url: string;
signal: AbortSignal;
providerContext: ProviderContext;
}): Promise<Post[]> {
try {
console.log("Fetching URL:", url);
const { cheerio } = providerContext;
const res = await fetch(url, { signal });
const data = await res.text();
const $ = cheerio.load(data);
const catalog: Post[] = [];
$(".poster-card").map((i, element) => {
const title = $(element).find(".poster-title").text();
const link = $(element).parent().attr("href");
const image = $(element).find(".poster-image img").attr("src");
if (title && link && image) {
catalog.push({
title: title.replace("Download", "").trim(),
link: link,
image: image,
});
}
});
return catalog;
} catch (err) {
console.error("drive error ", err);
return [];
}
}
async function searchPosts({
url,
baseUrl,
signal,
}: {
url: string;
baseUrl: string;
signal: AbortSignal;
}): Promise<Post[]> {
try {
console.log("Fetching drive search URL:", url);
const res = await fetch(url, { signal });
if (!res.ok) {
throw new Error(`drive search failed with status ${res.status}`);
}
const data = (await res.json()) as {
hits?: Array<{
document?: {
permalink?: string;
post_thumbnail?: string;
post_title?: string;
};
}>;
};
return (
data.hits
?.map((hit) => {
const document = hit.document;
const title = document?.post_title?.trim();
const link = document?.permalink
? normalizeUrl(baseUrl, document.permalink)
: "";
const image = document?.post_thumbnail
? normalizeUrl(baseUrl, document.post_thumbnail)
: "";
if (!title || !link || !image) {
return null;
}
return {
title,
link,
image,
};
})
.filter((post): post is Post => post !== null) ?? []
);
} catch (err) {
console.error("drive search error ", err);
return [];
}
}
function buildSearchUrl(
baseUrl: string,
searchQuery: string,
page: number,
): string {
const separator = baseUrl.includes("?") ? "&" : "?";
return `${trimTrailingSlash(baseUrl)}/search.php${separator}q=${encodeURIComponent(
searchQuery,
)}&page=${page}`;
}
function normalizeUrl(baseUrl: string, value: string): string {
if (!value) {
return "";
}
if (/^https?:\/\//i.test(value)) {
return value;
}
if (value.startsWith("//")) {
return `https:${value}`;
}
if (value.startsWith("/")) {
return `${trimTrailingSlash(baseUrl)}${value}`;
}
return `${trimTrailingSlash(baseUrl)}/${trimLeadingSlash(value)}`;
}
function trimTrailingSlash(value: string): string {
return value.replace(/\/+$/, "");
}
function trimLeadingSlash(value: string): string {
return value.replace(/^\/+/, "");
}
+57 -8
View File
@@ -5,6 +5,43 @@ const hubcloudDecode = function (value: string) {
return atob(value.toString());
};
const extractUrlFromScript = (html: string): string => {
const doubleAtobMatch = html.match(
/var\s+url\s*=\s*atob\(atob\(['"]([^'"]+)['"]\)\)/,
);
if (doubleAtobMatch?.[1]) {
return atob(atob(doubleAtobMatch[1]));
}
const plainMatch = html.match(/var\s+url\s*=\s*['"]([^'"]+)['"]/);
return (
hubcloudDecode(plainMatch?.[1]?.split("r=")?.[1] ?? "") ||
plainMatch?.[1] ||
""
);
};
const getPixelDrainUrl = (html: string) => {
const match = html.match(/var\s+pxl\s*=\s*['"]([^'"]+)['"];?/i);
return match?.[1] || "";
};
const getRedirectedPixelDrainUrl = (
...htmlSources: Array<string | undefined>
) => {
for (const html of htmlSources) {
if (!html) {
continue;
}
const redirectedUrl = getPixelDrainUrl(html);
if (redirectedUrl) {
return redirectedUrl;
}
}
return "";
};
export async function hubcloudExtractor(
link: string,
signal: AbortSignal,
@@ -16,16 +53,14 @@ export async function hubcloudExtractor(
headers["Cookie"] =
"ext_name=ojplmecpdpgccookcobabopnaifgidhf; xla=s4t; cf_clearance=woQrFGXtLfmEMBEiGUsVHrUBMT8s3cmguIzmMjmvpkg-1770053679-1.2.1.1-xBrQdciOJsweUF6F2T_OtH6jmyanN_TduQ0yslc_XqjU6RcHSxI7.YOKv6ry7oYo64868HYoULnVyww536H2eVI3R2e4wKzsky6abjPdfQPxqpUaXjxfJ02o6jl3_Vkwr4uiaU7Wy596Vdst3y78HXvVmKdIohhtPvp.vZ9_L7wvWdce0GRixjh_6JiqWmWMws46hwEt3hboaS1e1e4EoWCvj5b0M_jVwvSxBOAW5emFzvT3QrnRh4nyYmKDERnY";
console.log("hubcloudExtractor", link);
console.log("headers", headers);
// console.log("headers", headers);
const baseUrl = link.split("/").slice(0, 3).join("/");
const streamLinks: any[] = [];
const vLinkRes = await axios(`${link}`, { headers, signal });
const vLinkText = vLinkRes.data;
const $vLink = cheerio.load(vLinkText);
const vLinkRedirect = vLinkText.match(/var\s+url\s*=\s*'([^']+)';/) || [];
let vcloudLink =
hubcloudDecode(vLinkRedirect[1]?.split("r=")?.[1]) ||
vLinkRedirect[1] ||
extractUrlFromScript(vLinkText) ||
$vLink(".fa-file-download.fa-lg").parent().attr("href") ||
link;
console.log("vcloudLink", vcloudLink);
@@ -38,8 +73,9 @@ export async function hubcloudExtractor(
signal,
redirect: "follow",
});
const $ = cheerio.load(await vcloudRes.text());
// console.log('vcloudRes', $.text());
const vcloudText = await vcloudRes.text();
const $ = cheerio.load(vcloudText);
// console.log("vcloudRes", $.text());
const linkClass = $(".btn-success.btn-lg.h6,.btn-danger,.btn-secondary");
for (const element of linkClass) {
@@ -48,10 +84,23 @@ export async function hubcloudExtractor(
switch (true) {
case link?.includes("pixeld"):
console.log("Pixeldrain link found:", link);
if (!link?.includes("api")) {
const token = link.split("/").pop();
const redirectedPixelDrainUrl = getRedirectedPixelDrainUrl(
vLinkText,
vcloudText,
);
if (redirectedPixelDrainUrl) {
console.log(
"Special case for token negn6f",
redirectedPixelDrainUrl,
);
link = redirectedPixelDrainUrl;
}
const token = link.split("/").pop()?.split("?")[0];
const baseUrl = link.split("/").slice(0, -2).join("/");
link = `${baseUrl}/api/file/${token}?download`;
link = `${baseUrl}/api/file/${token}`;
}
streamLinks.push({ server: "Pixeldrain", link: link, type: "mkv" });
break;
+43 -2
View File
@@ -39,8 +39,49 @@ export const getSearchPosts = async function ({
}): Promise<Post[]> {
const { getBaseUrl } = providerContext;
const baseUrl = await getBaseUrl("hdhub");
const url = `${baseUrl}/page/${page}/?s=${searchQuery}`;
return posts({ url, signal, providerContext });
try {
const today = new Date().toISOString().slice(0, 10);
const params = new URLSearchParams({
q: searchQuery,
query_by: "post_title,category,stars,director,imdb_id",
query_by_weights: "4,2,2,2,4",
sort_by: "sort_by_date:desc",
limit: "15",
highlight_fields: "none",
use_cache: "true",
page: String(page),
analytics_tag: today,
});
const searchUrl = `https://search.pingora.fyi/collections/post/documents/search?${params.toString()}`;
const res = await fetch(searchUrl, {
headers: {
...hdbHeaders,
Referer: baseUrl + "/",
Accept: "application/json, text/plain, */*",
},
signal,
});
const json: any = await res.json();
const hits: any[] = Array.isArray(json?.hits) ? json.hits : [];
const catalog: Post[] = [];
for (const hit of hits) {
const doc = hit?.document || {};
const title = String(doc.post_title || "")
.replace(/Download/gi, "")
.trim();
const permalink = String(doc.permalink || "");
const image = String(doc.post_thumbnail || "");
if (!title || !permalink) continue;
const link = permalink.startsWith("http")
? permalink
: `${baseUrl}${permalink.startsWith("/") ? "" : "/"}${permalink}`;
catalog.push({ title, link, image });
}
return catalog;
} catch (err) {
console.error("hdhubGetSearchPosts error ", err);
return [];
}
};
async function posts({
+15 -3
View File
@@ -13,6 +13,9 @@ export async function getStream({
}) {
const { axios, cheerio, commonHeaders: headers } = providerContext;
let hubdriveLink = "";
if (link.includes("hubcloud") || link.includes("/drive/")) {
return await hubcloudExtractor(link, signal, axios, cheerio, headers);
}
if (link.includes("hubdrive")) {
const hubdriveRes = await axios.get(link, { headers, signal });
const hubdriveText = hubdriveRes.data;
@@ -23,8 +26,8 @@ export async function getStream({
const res = await axios.get(link, { headers, signal });
const text = res.data;
const encryptedString = text.split("s('o','")?.[1]?.split("',180")?.[0];
const decodedString: any = decodeString(encryptedString);
link = atob(decodedString?.o);
const decodedString: any = decodeString(encryptedString) || link;
link = safeAtob(decodedString?.o) || link;
const redirectLink = await getRedirectLinks(link, signal, headers);
const redirectLinkRes = await axios.get(redirectLink, { headers, signal });
const redirectLinkText = redirectLinkRes.data;
@@ -40,11 +43,12 @@ export async function getStream({
const hubdriveText = hubdriveRes.data;
const $$ = cheerio.load(hubdriveText);
hubdriveLink =
$$(".btn.btn-primary.btn-user").attr("href") || hubdriveLink;
$$(".btn.btn-primary.btn-user.btn-success1").attr("href") || "";
}
console.log("hubdriveLink2", hubdriveLink);
}
let hubcloudLink = hubdriveLink;
console.log("hubdriveLink3", hubdriveLink);
try {
const hubdriveLinkRes = await axios.get(hubdriveLink, { headers, signal });
const hubcloudText = hubdriveLinkRes.data;
@@ -173,6 +177,14 @@ function rot13(str: string) {
});
}
const safeAtob = (str: string) => {
try {
return atob(str);
} catch (e) {
return null;
}
};
export function decodeString(encryptedString: string) {
try {
// First base64 decode
+102 -39
View File
@@ -40,42 +40,103 @@ export const getMeta = async ({
},
});
const $ = cheerio.load(response.data);
const infoContainer = $(".entry-content,.post-inner");
const heading = infoContainer?.find("h3");
const imdbId =
//@ts-ignore
heading?.next("p")?.find("a")?.[0]?.attribs?.href?.match(/tt\d+/g)?.[0] ||
infoContainer.text().match(/tt\d+/g)?.[0] ||
"";
// console.log(imdbId)
const infoContainer = $(
".entry-content, .post-inner, .post-content, .page-body",
);
const type = heading?.next("p")?.text()?.includes("Series Name")
? "series"
: "movie";
// console.log(type);
// title
const titleRegex = /Name: (.+)/;
const title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || "";
let title = $("h1.post-title").text().trim();
if (!title) {
const heading = infoContainer?.find("h3");
const titleRegex = /Name: (.+)/;
title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || "";
}
// console.log(title);
// imdbId
let imdbId =
$('a[href*="imdb.com"]').attr("href")?.match(/tt\d+/)?.[0] || "";
if (!imdbId) {
const heading = infoContainer?.find("h3");
imdbId =
//@ts-ignore
heading
?.next("p")
?.find("a")?.[0]
?.attribs?.href?.match(/tt\d+/g)?.[0] ||
infoContainer.text().match(/tt\d+/g)?.[0] ||
"";
}
// console.log(imdbId)
// type
let type = "movie";
const heading = infoContainer?.find("h3");
if (heading?.next("p")?.text()?.includes("Series Name")) {
type = "series";
}
// console.log(type);
// synopsis
const synopsisNode = //@ts-ignore
infoContainer?.find("p")?.next("h3,h4")?.next("p")?.[0]?.children?.[0];
const synopsis =
synopsisNode && "data" in synopsisNode ? synopsisNode.data : "";
let synopsis = "";
const synopsisHeader = $("h3").filter(
(i, el) =>
$(el).text().includes("SYNOPSIS/PLOT") || $(el).text().includes("Plot"),
);
if (synopsisHeader.length > 0) {
synopsis = synopsisHeader.next("p").text().trim();
}
if (!synopsis) {
const synopsisNode = //@ts-ignore
infoContainer?.find("p")?.next("h3,h4")?.next("p")?.[0]?.children?.[0];
synopsis =
synopsisNode && "data" in synopsisNode ? synopsisNode.data : "";
}
// console.log(synopsis);
// image
let image =
infoContainer?.find("img[data-lazy-src]")?.attr("data-lazy-src") || "";
infoContainer?.find("img[data-lazy-src]")?.attr("data-lazy-src") ||
infoContainer
?.find("img")
?.filter((i, el) => {
const src = $(el).attr("src");
return (
!!src &&
!src.includes("logo") &&
!src.includes("svg") &&
!src.includes("placeholder") &&
!src.includes("icon")
);
})
?.first()
?.attr("src") ||
"";
if (image.startsWith("//")) {
image = "https:" + image;
}
// console.log(image);
// console.log({title, synopsis, image, imdbId, type});
console.log({ title, synopsis, image, imdbId, type });
/// Links
const hr = infoContainer?.first()?.find("hr");
let hr = infoContainer?.first()?.find("hr");
// Try to find the HR before the download buttons if possible
const firstButton = $(".dwd-button").first();
if (firstButton.length > 0) {
const containerP = firstButton.closest("p");
let prev = containerP.prev();
while (prev.length && !prev.is("hr")) {
prev = prev.prev();
}
if (prev.is("hr")) {
hr = prev;
}
}
const list = hr?.nextUntil("hr");
const links: Link[] = [];
list.each((index, element: any) => {
@@ -86,39 +147,41 @@ export const getMeta = async ({
const quality = element?.text().match(/\d+p\b/)?.[0] || "";
// console.log(title);
// movieLinks
const movieLinks = element
?.next()
.find(".dwd-button")
.text()
.toLowerCase()
.includes("download")
? element?.next().find(".dwd-button")?.parent()?.attr("href")
: "";
const movieLinks =
element
?.next()
.find(".dwd-button")
.text()
.toLowerCase()
.includes("download") ||
element.next().find("a").text().toLowerCase().includes("download")
? element?.next().find(".dwd-button")?.parent()?.attr("href") ||
element?.next().find("a[href]")?.attr("href")
: "";
// episode links
const vcloudLinks = element
?.next()
.find(
".btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: white;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: #fdf8f2;']"
".btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: white;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: #fdf8f2;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152);color: white']",
)
?.parent()
?.attr("href");
console.log(title);
const episodesLink =
(vcloudLinks
? vcloudLinks
: element
?.next()
.find(".dwd-button")
.text()
.toLowerCase()
.includes("episode")
? element?.next().find(".dwd-button")?.parent()?.attr("href")
: "") ||
?.next()
.find(".dwd-button")
.text()
.toLowerCase()
.includes("episode")
? element?.next().find(".dwd-button")?.parent()?.attr("href")
: "") ||
element
?.next()
.find(
".btn-outline[style='background:linear-gradient(135deg,#0ebac3,#09d261); color: white;']"
".btn-outline[style='background:linear-gradient(135deg,#0ebac3,#09d261); color: white;']",
)
?.parent()
?.attr("href");
+59 -20
View File
@@ -34,13 +34,13 @@ export const getPosts = async ({
signal: AbortSignal;
providerContext: ProviderContext;
}): Promise<Post[]> => {
const { getBaseUrl } = providerContext;
const { getBaseUrl, axios, cheerio } = providerContext;
const baseUrl = await getBaseUrl("lux");
console.log("vegaGetPosts baseUrl:", providerValue, baseUrl);
const url = `${baseUrl}/${filter}/page/${page}/`;
console.log("lux url:", url);
return posts(url, signal, providerContext);
console.log("vegaGetPosts url:", url);
return posts(baseUrl, url, signal, headers, axios, cheerio);
};
export const getSearchPosts = async ({
@@ -56,58 +56,97 @@ export const getSearchPosts = async ({
signal: AbortSignal;
providerContext: ProviderContext;
}): Promise<Post[]> => {
const { getBaseUrl } = providerContext;
const { getBaseUrl, axios, cheerio } = providerContext;
const baseUrl = await getBaseUrl("lux");
console.log("vegaGetPosts baseUrl:", providerValue, baseUrl);
const url =
page === 1
? `https://c.8man.workers.dev/?url=${baseUrl}/?s=${searchQuery}`
: `https://c.8man.workers.dev/?url=${baseUrl}/page/${page}/?s=${searchQuery}`;
console.log("lux url:", url);
const url = `${baseUrl}/search.php?q=${searchQuery}&page=${page}`;
console.log("vegaGetPosts url:", url);
return posts(url, signal, providerContext);
try {
const response = await axios.get(url, {
headers: {
...headers,
Referer: baseUrl,
},
signal,
});
const data = response.data;
const posts: Post[] = [];
if (data?.hits) {
data.hits.forEach((hit: any) => {
const doc = hit.document;
const post = {
title: doc.post_title.replace("Download", "").trim(),
link: doc.permalink.startsWith("http")
? doc.permalink
: `${baseUrl}${doc.permalink}`,
image: doc.post_thumbnail,
};
posts.push(post);
});
}
return posts;
} catch (error) {
console.error("vegaGetSearchPosts error:", error);
return [];
}
};
async function posts(
baseUrl: string,
url: string,
signal: AbortSignal,
providerContext: ProviderContext
headers: Record<string, string> = {},
axios: ProviderContext["axios"],
cheerio: ProviderContext["cheerio"],
): Promise<Post[]> {
try {
const { axios, cheerio } = providerContext;
const urlRes = await fetch(url, {
headers: {
...headers,
Referer: url,
Referer: baseUrl,
},
signal,
});
const $ = cheerio.load(await urlRes.text());
const posts: Post[] = [];
$(".blog-items")
?.children("article")
$(".blog-items,.post-list,#archive-container,.movies-grid")
?.children("article,.entry-list-item,a")
?.each((index, element) => {
const post = {
title:
title: (
$(element)
?.find("a")
?.attr("title")
?.find(".entry-title,.poster-title")
?.text()
?.replace("Download", "")
?.match(/^(.*?)\s*\((\d{4})\)|^(.*?)\s*\((Season \d+)\)/)?.[0] ||
$(element)?.find("a")?.attr("title")?.replace("Download", "") ||
"",
$(element)
?.find(".post-title,.poster-title")
.text()
?.replace("Download", "") ||
""
).trim(),
link: $(element)?.find("a")?.attr("href") || "",
link:
$(element)?.find("a")?.attr("href") ||
$(element)?.attr("href") ||
"",
image:
$(element).find("a").find("img").attr("data-lazy-src") ||
$(element).find("a").find("img").attr("data-src") ||
$(element).find("a").find("img").attr("src") ||
$(element).find("img").attr("data-src") ||
$(element).find("img").attr("src") ||
"",
};
if (post.image.startsWith("//")) {
post.image = "https:" + post.image;
}
console.log("vegaGetPosts post:", post);
posts.push(post);
});
+1 -1
View File
@@ -37,7 +37,7 @@ export async function getStream({
try {
const streamLinks: Stream[] = [];
console.log("dotlink", link);
if (type === "movie") {
if (type === "movie" && !link.includes("cloud")) {
// vlink
const dotlinkRes = await axios(`${link}`, { headers });
const dotlinkText = dotlinkRes.data;
+1 -1
View File
@@ -1,7 +1,7 @@
export const catalog = [
{
title: "Trending",
filter: "2",
filter: "4",
},
{
title: "Cinema",
+1 -1
View File
@@ -11,7 +11,7 @@ export const getEpisodes = async function ({
try {
const episodeLinks: EpisodeLink[] = [];
const response = await fetch("https://dob-worker.8man.workers.dev", {
const response = await fetch("https://dob-worker.1proxy.workers.dev", {
method: "POST",
headers: {
"Content-Type": "application/json",
+2 -3
View File
@@ -9,10 +9,9 @@ export const getMeta = async function ({
}): Promise<Info> {
try {
const { axios, cheerio, getBaseUrl } = providerContext;
const baseUrl = await getBaseUrl("movieBox");
const links: Link[] = [];
// this is just a proxy please host your own if you want to use this code:- https://github.com/himanshu8443/Cf-Workers/blob/main/src/dob-worker/index.js
const response = await fetch("https://dob-worker.8man.workers.dev", {
const response = await fetch("https://dob-worker.1proxy.workers.dev", {
method: "POST",
headers: {
"Content-Type": "application/json",
@@ -38,7 +37,7 @@ export const getMeta = async function ({
dubs?.forEach((dub: any) => {
const link: Link = {
title: dub?.lanName,
episodesLink: `${baseUrl}/wefeed-mobile-bff/subject-api/resource?subjectId=${dub?.subjectId}&page=1&perPage=20&all=0&startPosition=1&endPosition=1&pagerMode=0&resolution=1080&se=1&epFrom=1&epTo=1`,
episodesLink: `/wefeed-mobile-bff/subject-api/resource?subjectId=${dub?.subjectId}&page=1&perPage=20&all=0&startPosition=1&endPosition=1&pagerMode=0&resolution=1080&se=1&epFrom=1&epTo=1`,
};
links.push(link);
});
+14 -7
View File
@@ -17,12 +17,11 @@ export const getPosts = async function ({
if (page > 1) {
return posts;
}
const baseUrl = await getBaseUrl("movieBox");
console.log("baseUrl", baseUrl);
const url = `${baseUrl}/wefeed-mobile-bff/tab-operating?page=3&tabId=0&version=2fe0d7c224603ff7b0df294b46d3b84b`;
const url = `/wefeed-mobile-bff/tab-operating?page=3&tabId=0&version=2fe0d7c224603ff7b0df294b46d3b84b`;
const response = await fetch("https://dob-worker.8man.workers.dev", {
// this is just a proxy please host your own if you want to use this code:- https://github.com/himanshu8443/Cf-Workers/blob/main/src/dob-worker/index.js
const response = await fetch("https://dob-worker.1proxy.workers.dev", {
signal: signal,
method: "POST",
headers: {
@@ -35,13 +34,21 @@ export const getPosts = async function ({
});
const data = await response.json();
const list = data?.data?.items?.[parseInt(filter)]?.subjects;
console.log("list", list);
const items = data?.data?.items || [];
const filterIndex = Number.parseInt(filter, 10);
let list = items?.[filterIndex]?.subjects;
if (!Array.isArray(list) || list.length === 0) {
list =
items?.find(
(item: any) =>
Array.isArray(item?.subjects) && item.subjects.length > 0,
)?.subjects || [];
}
for (const item of list) {
const post: Post = {
image: item?.cover.url,
title: item?.title?.replace(/\s*\[.*?\]\s*$/, ""),
link: `${baseUrl}/wefeed-mobile-bff/subject-api/get?subjectId=${item?.subjectId}`,
link: `/wefeed-mobile-bff/subject-api/get?subjectId=${item?.subjectId}`,
};
posts.push(post);
}
+4 -4
View File
@@ -1,10 +1,10 @@
export const catalog = [
{
title: "Trending",
title: "Latest",
filter: "",
},
{
title: "Anime",
filter: "/category/anime/",
title: "Web Series",
filter: "/category/web-series/",
},
];
];
+106 -34
View File
@@ -1,6 +1,6 @@
import { EpisodeLink, ProviderContext } from "../types";
// यहाँ `getEpisodes` फ़ंक्शन मान रहा है कि यह उस पेज को स्क्रैप कर रहा है
// यहाँ `getEpisodes` फ़ंक्शन मान रहा है कि यह उस पेज को स्क्रैप कर रहा है
// जो 'Download Links' बटन से प्राप्त हुआ है (जैसे m4ulinks.com/number/42882)
export const getEpisodes = async function ({
@@ -14,7 +14,7 @@ export const getEpisodes = async function ({
console.log("getEpisodeLinks", url);
try {
// Note: Cookies को URL के आधार पर अपडेट करने की आवश्यकता हो सकती है
const res = await axios.get(url, {
let res = await axios.get(url, {
headers: {
...headers,
// Cloudflare/Bot protection के लिए Hardcoded cookie यहाँ आवश्यक हो सकता है
@@ -22,43 +22,115 @@ export const getEpisodes = async function ({
"ext_name=ojplmecpdpgccookcobabopnaifgidhf; cf_clearance=Zl2yiOCN3pzGUd0Bgs.VyBXniJooDbG2Tk1g7DEoRnw-1756381111-1.2.1.1-RVPZoWGCAygGNAHavrVR0YaqASWZlJyYff8A.oQfPB5qbcPrAVud42BzsSwcDgiKAP0gw5D92V3o8XWwLwDRNhyg3DuL1P8wh2K4BCVKxWvcy.iCCxczKtJ8QSUAsAQqsIzRWXk29N6X.kjxuOTYlfB2jrlq12TRDld_zTbsskNcTxaA.XQekUcpGLseYqELuvlNOQU568NZD6LiLn3ICyFThMFAx6mIcgXkxVAvnxU; xla=s4t",
},
});
const $ = cheerio.load(res.data);
const container = $(".entry-content,.entry-inner, .download-links-div");
// .unili-content,.code-block-1 जैसे अवांछित तत्वों को हटा दें
$(".unili-content,.code-block-1").remove();
const episodes: EpisodeLink[] = [];
// HubCloud Links को लक्षित करने के लिए:
// 1. Episode Title (h5) से शुरू करें
// 2. उसके बाद के downloads-btns-div में HubCloud बटन खोजें
container.find("h5").each((index, element) => {
const el = $(element);
const title = el.text().trim(); // e.g., "-:Episodes: 1:- (Grand Premiere)"
// HubCloud लिंक को विशिष्ट स्टाइल और टेक्स्ट से खोजें
// बटन सेलेक्टर: style="background: linear-gradient(135deg,#e629d0,#007bff);color: white;"
const hubCloudLink = el
.next(".downloads-btns-div")
.find(
'a[style*="background: linear-gradient(135deg,#e629d0,#007bff);"]'
)
.attr("href");
if (
res.data &&
res.data.includes("Please turn JavaScript on and reload the page.")
) {
const b1Match = res.data.match(/var b1=atob\(['"]([^'"]+)['"]\)/);
const a2Match = res.data.match(/_0x2aa8=\[['"]([^'"]+)['"]\]/);
const c3Match = res.data.match(/c3=toNumbers\(['"]([^'"]+)['"]\)/);
if (title && hubCloudLink) {
// टाइटल को साफ़ करें (e.g., सिर्फ़ Episode 1: Grand Premiere रखें)
const cleanedTitle = title.replace(/[-:]/g, "").trim();
episodes.push({
title: cleanedTitle,
link: hubCloudLink,
// यदि यह HubCloud/Streaming लिंक है, तो आप 'type' को यहाँ 'stream' भी सेट कर सकते हैं
if (b1Match && a2Match && c3Match) {
const unescapeHexStr = (str: string) =>
str.replace(/\\x([0-9A-Fa-f]{2})/g, (_, hex) =>
String.fromCharCode(parseInt(hex, 16)),
);
const baseUrl = url.split("/").slice(0, 3).join("/");
const minJsRes = await axios.get(`${baseUrl}/min.js`, {
headers,
});
const b1Hex = atob(unescapeHexStr(b1Match[1]));
const a2Hex = atob(unescapeHexStr(a2Match[1]));
const c3Hex = unescapeHexStr(c3Match[1]);
const solver = new Function(
"c3Hex",
"a1Hex",
"b2Hex",
`
${minJsRes.data}
function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}
function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e='',f=0;f<d.length;f++)e+=(16>d[f]?'0':'')+d[f].toString(16);return e.toLowerCase()}
return toHex(slowAES.decrypt(toNumbers(c3Hex), 2, toNumbers(a1Hex), toNumbers(b2Hex)));
`,
);
const decrypted = solver(c3Hex, a2Hex, b1Hex);
const newCookie = `Antiddos-systems-DH=${decrypted}`;
res = await axios.get(url, {
headers: { ...headers, Cookie: newCookie },
});
}
}
const $ = cheerio.load(res.data);
const container = $(".entry-content,.entry-inner, .download-links-div");
// .unili-content,.code-block-1 जैसे अवांछित तत्वों को हटा दें
$(".unili-content,.code-block-1").remove();
const episodes: EpisodeLink[] = [];
// The site changed its layout. Links are now inside <p> tags following <h3> or <h4> tags with quality info.
// We can also just look for the <a> tags directly and find their preceding quality headers.
const hElements = container.find("h3, h4, h5, p");
hElements.each((index, element) => {
const el = $(element);
const title = el.text().trim();
// The download buttons are usually in the next <p> tag
const downloadButtons = el.nextAll().find("a").first();
const link = downloadButtons.attr("href");
if (
title &&
link &&
title.match(/Episode|Ep|E\d+/i) &&
title.length < 150
) {
// Clean up the title
const cleanedTitle = title.replace(/[-:]/g, "").trim();
// Deduplicate
if (!episodes.some((e) => e.link === link)) {
episodes.push({
title: cleanedTitle,
link: link,
});
}
}
});
// Fallback: if no episodes found by heading, just grab all mdrive/fastdl links
if (episodes.length === 0) {
$("a").each((i, el) => {
const href = $(el).attr("href");
if (
href &&
(href.includes("mdrive") ||
href.includes("fastdl") ||
href.includes("filebee") ||
href.includes("gdflix"))
) {
const title =
$(el).parent().prev().text().trim() ||
$(el).text().trim() ||
`Episode ${i + 1}`;
if (!episodes.some((e) => e.link === href)) {
episodes.push({
title: title.replace(/[-:]/g, "").trim(),
link: href,
});
}
}
});
}
// console.log(episodes);
return episodes;
} catch (err) {
@@ -66,4 +138,4 @@ export const getEpisodes = async function ({
// console.error(err);
return [];
}
};
};
+69 -27
View File
@@ -43,10 +43,53 @@ export const getMeta = async function ({
};
try {
const response = await axios.get(url, {
let response = await axios.get(url, {
headers: { ...headers, Referer: baseUrl },
});
if (
response.data &&
response.data.includes("Please turn JavaScript on and reload the page.")
) {
const b1Match = response.data.match(/var b1=atob\(['"]([^'"]+)['"]\)/);
const a2Match = response.data.match(/_0x2aa8=\[['"]([^'"]+)['"]\]/);
const c3Match = response.data.match(/c3=toNumbers\(['"]([^'"]+)['"]\)/);
if (b1Match && a2Match && c3Match) {
const unescapeHexStr = (str: string) =>
str.replace(/\\x([0-9A-Fa-f]{2})/g, (_, hex) =>
String.fromCharCode(parseInt(hex, 16)),
);
const minJsRes = await axios.get(`${baseUrl}/min.js`, {
headers: { ...headers, Referer: baseUrl },
});
const b1Hex = atob(unescapeHexStr(b1Match[1]));
const a2Hex = atob(unescapeHexStr(a2Match[1]));
const c3Hex = unescapeHexStr(c3Match[1]);
const solver = new Function(
"c3Hex",
"a1Hex",
"b2Hex",
`
${minJsRes.data}
function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}
function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e='',f=0;f<d.length;f++)e+=(16>d[f]?'0':'')+d[f].toString(16);return e.toLowerCase()}
return toHex(slowAES.decrypt(toNumbers(c3Hex), 2, toNumbers(a1Hex), toNumbers(b2Hex)));
`,
);
const decrypted = solver(c3Hex, a2Hex, b1Hex);
const newCookie = `Antiddos-systems-DH=${decrypted}`;
response = await axios.get(url, {
headers: { ...headers, Referer: baseUrl, Cookie: newCookie },
});
}
}
const $ = cheerio.load(response.data);
const infoContainer = $(".entry-content, .post-inner").length
? $(".entry-content, .post-inner")
@@ -100,29 +143,23 @@ export const getMeta = async function ({
image = "";
result.image = image;
// --- Synopsis ---
result.synopsis =
$("h3.movie-title")
.filter((i, el) => $(el).text().includes("Storyline"))
.next("p")
.text()
.trim() ||
infoContainer.find("p").first().text().trim() ||
"";
// --- LinkList extraction ---
const links: Link[] = [];
const h4Elements = $(".download-links-div").find("> h4");
h4Elements.each((index, element) => {
// The site changed its layout. Links are now inside <p> tags following <h3> or <h4> tags with quality info.
// We can also just look for the <a> tags directly and find their preceding quality headers.
const hElements = infoContainer.find("h3, h4, p");
hElements.each((index, element) => {
const el = $(element);
const titleText = el.text().trim();
const qualityMatch = titleText.match(/\d+p\b/)?.[0];
const fullTitle = titleText;
const downloadButtons = el.next(".downloads-btns-div").find("a");
// The download buttons are usually in the next <p> tag
const downloadButtons = el.nextAll().find("a").first();
if (downloadButtons.length && qualityMatch) {
if (downloadButtons.length && qualityMatch && titleText.length < 350) {
if (result.type === "series") {
links.push({
title: fullTitle,
@@ -134,17 +171,14 @@ export const getMeta = async function ({
// Movie: collect all direct download buttons
const directLinks: Link["directLinks"] = [];
downloadButtons.each((i, btn) => {
const btnEl = $(btn);
const link = btnEl.attr("href");
if (link) {
directLinks.push({
title: btnEl.text().trim() || "Download",
link,
type: "movie", // literal type
});
}
});
const link = downloadButtons.attr("href");
if (link) {
directLinks.push({
title: downloadButtons.text().trim() || "Download",
link,
type: "movie", // literal type
});
}
if (directLinks.length) {
links.push({
@@ -158,7 +192,15 @@ export const getMeta = async function ({
}
});
result.linkList = links;
// Deduplicate links by href
const uniqueLinks = new Map<string, Link>();
links.forEach((link) => {
const href = link.episodesLink || link.directLinks?.[0]?.link;
if (href && !uniqueLinks.has(href)) {
uniqueLinks.set(href, link);
}
});
result.linkList = Array.from(uniqueLinks.values());
return result;
} catch (err) {
console.log("getMeta error:", err);
+80 -11
View File
@@ -1,14 +1,23 @@
import { Post, ProviderContext } from "../types";
const defaultHeaders = {
Referer: "https://www.google.com",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " +
"(KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
Pragma: "no-cache",
"Cache-Control": "no-cache",
accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"accept-language": "en-US,en;q=0.9",
"cache-control": "no-cache",
pragma: "no-cache",
priority: "u=0, i",
"sec-ch-ua":
'"Microsoft Edge";v="147", "Not.A/Brand";v="8", "Chromium";v="147"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "same-origin",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
cookie: "Antiddos-systems-DH=395a53ac840ad21dff778291a3ffae36",
Referer: "https://movies4u.vg/category/web-series/",
};
// --- Normal catalog posts ---
@@ -81,7 +90,60 @@ async function fetchPosts({
}
const { axios, cheerio } = providerContext;
const res = await axios.get(url, { headers: defaultHeaders, signal });
let res = await axios.get(url, {
headers: defaultHeaders,
signal,
maxRedirects: 5,
});
// Anti-DDoS-Guard check
if (
res.data &&
res.data.includes("Please turn JavaScript on and reload the page.")
) {
const b1Match = res.data.match(/var b1=atob\(['"]([^'"]+)['"]\)/);
const a2Match = res.data.match(/_0x2aa8=\[['"]([^'"]+)['"]\]/);
const c3Match = res.data.match(/c3=toNumbers\(['"]([^'"]+)['"]\)/);
if (b1Match && a2Match && c3Match) {
const unescapeHexStr = (str: string) =>
str.replace(/\\x([0-9A-Fa-f]{2})/g, (_, hex) =>
String.fromCharCode(parseInt(hex, 16)),
);
// Fetch the min.js payload from the provider to safely execute slowAES
const minJsRes = await axios.get(`${baseUrl}/min.js`, {
headers: defaultHeaders,
signal,
});
const b1Hex = atob(unescapeHexStr(b1Match[1]));
const a2Hex = atob(unescapeHexStr(a2Match[1]));
const c3Hex = unescapeHexStr(c3Match[1]);
// Evaluate the decryption without needing crypto or buffers
const solver = new Function(
"c3Hex",
"a1Hex",
"b2Hex",
`
${minJsRes.data}
function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}
function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e='',f=0;f<d.length;f++)e+=(16>d[f]?'0':'')+d[f].toString(16);return e.toLowerCase()}
return toHex(slowAES.decrypt(toNumbers(c3Hex), 2, toNumbers(a1Hex), toNumbers(b2Hex)));
`,
);
const decrypted = solver(c3Hex, a2Hex, b1Hex);
const newCookie = `Antiddos-systems-DH=${decrypted}`;
res = await axios.get(url, {
headers: { ...defaultHeaders, Cookie: newCookie },
signal,
maxRedirects: 5,
});
}
}
const $ = cheerio.load(res.data || "");
const resolveUrl = (href: string) =>
@@ -100,10 +162,13 @@ async function fetchPosts({
".thumbnail",
".latest-movies",
".movie-item",
".entry-card",
].join(",");
console.log("Fetching posts from URL:", url); // Debug log
$(POST_SELECTORS).each((_, el) => {
const card = $(el);
console.log("Processing card:", card.text().trim().slice(0, 50)); // Debug log
let link = card.find("a[href]").first().attr("href") || "";
if (!link) return;
link = resolveUrl(link);
@@ -114,9 +179,13 @@ async function fetchPosts({
card.find("a[title]").first().attr("title")?.trim() ||
card.text().trim();
title = title
.replace(
/(?:480p|720p|1080p|4k|HDTC|HDRip|BluRay|LiNE|Full Movie).*$/i,
"",
)
.replace(/\[.*?\]/g, "")
.replace(/\(.+?\)/g, "")
.replace(/\s{2,}/g, " ")
.replace(/\s*[|\-]\s*$/, "")
.trim();
if (!title) return;
@@ -135,7 +204,7 @@ async function fetchPosts({
} catch (err) {
console.error(
"HDMovie2 fetchPosts error:",
err instanceof Error ? err.message : String(err)
err instanceof Error ? err.message : String(err),
);
return [];
}
+84 -9
View File
@@ -15,11 +15,6 @@ const headers = {
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
Cookie:
"xla=s4t; _ga=GA1.1.1081149560.1756378968; _ga_BLZGKYN5PF=GS2.1.s1756378968$o1$g1$t1756378984$j44$l0$h0",
"Upgrade-Insecure-Requests": "1",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0",
};
export async function getStream({
@@ -33,18 +28,98 @@ export async function getStream({
signal: AbortSignal;
providerContext: ProviderContext;
}) {
const { axios, cheerio, commonHeaders } = providerContext;
const { axios, cheerio, commonHeaders, openWebView } = providerContext;
try {
const streamLinks: Stream[] = [];
console.log("dotlink", link);
if (type === "movie") {
// vlink
const dotlinkRes = await axios(`${link}`, { headers });
let dotlinkRes;
let cookies: string | undefined;
try {
dotlinkRes = await axios(`${link}`, {
headers: {
...commonHeaders,
Referer: link,
},
});
} catch (error: any) {
if (error.response?.status === 403) {
console.log("Solving WAF for Movies4U...");
const wafResult = await openWebView(link, {
title: "Solve the captcha below and click done",
description:
"This is required to bypass the anti-bot protection and retrieve the stream link.",
headers: {
...commonHeaders,
Referer: link,
},
force: true,
waitForCookie: "cf_clearance",
});
console.log("WAF solved", wafResult.cookies);
cookies = wafResult.cookies;
dotlinkRes = await axios(`${link}`, {
headers: {
...commonHeaders,
Referer: link,
Cookie: cookies,
},
});
} else {
throw error;
}
}
const dotlinkText = dotlinkRes.data;
// console.log('dotlinkText', dotlinkText);
const vlink = dotlinkText.match(/<a\s+href="([^"]*cloud\.[^"]*)"/i) || [];
// console.log('vLink', vlink[1]);
link = vlink[1];
if (vlink[1]) {
link = vlink[1];
} else {
// Try to find hubcloud or gdflix links directly
const $ = cheerio.load(dotlinkText);
const directLink = $("a")
.filter((i, el) => {
const href = $(el).attr("href") || "";
return (
href.includes("hubcloud") ||
href.includes("gdflix") ||
href.includes("filebee") ||
href.includes("fastdl")
);
})
.first()
.attr("href");
if (directLink) {
link = directLink;
}
}
// If it's a fastdl link, extract the redirect URL
if (link.includes("fastdl.zip")) {
try {
const fastdlRes = await axios.get(link, { headers });
const reurlMatch = fastdlRes.data.match(/var reurl = "([^"]+)";/);
if (reurlMatch && reurlMatch[1]) {
const actualLink = reurlMatch[1].replace(
"https://fastdl.zip/dl.php?link=",
"",
);
streamLinks.push({
server: "fastdl",
link: actualLink,
type: "mkv",
});
return streamLinks;
}
} catch (error) {
console.log("fastdl error: ", error);
}
}
// filepress link
try {
+1 -2
View File
@@ -3,12 +3,11 @@ import { getBaseUrl } from "./getBaseUrl";
import { headers } from "./headers";
import * as cheerio from "cheerio";
import { ProviderContext } from "./types";
import Aes from "react-native-aes-crypto";
export const providerContext: ProviderContext = {
axios,
getBaseUrl,
Aes: null,
commonHeaders: headers,
Aes,
cheerio,
};
+42 -21
View File
@@ -32,10 +32,17 @@ export const getSearchPosts = async function ({
signal: AbortSignal;
providerContext: ProviderContext;
}): Promise<Post[]> {
const { getBaseUrl, axios, cheerio } = providerContext;
const { getBaseUrl, axios, cheerio, commonHeaders } = providerContext;
const baseUrl = await getBaseUrl("showbox");
const url = `${baseUrl}/search?keyword=${searchQuery}&page=${page}`;
return posts({ url, signal, baseUrl, axios, cheerio });
return posts({
url,
signal,
baseUrl,
axios,
cheerio,
headers: commonHeaders,
});
};
async function posts({
@@ -44,32 +51,46 @@ async function posts({
// baseUrl,
axios,
cheerio,
headers,
}: {
url: string;
signal: AbortSignal;
baseUrl: string;
axios: ProviderContext["axios"];
cheerio: ProviderContext["cheerio"];
headers?: Record<string, string>;
}): Promise<Post[]> {
try {
const res = await axios.get(url, { signal });
const data = res.data;
const $ = cheerio.load(data);
const catalog: Post[] = [];
$(".movie-item,.flw-item").map((i, element) => {
const title = $(element).find(".film-name").text().trim();
const link = $(element).find("a").attr("href");
const image = $(element).find("img").attr("src");
if (title && link && image) {
catalog.push({
title: title,
link: link,
image: image,
});
const maxRetries = 3;
let lastError: unknown;
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
const res = await axios.get(url, { signal, headers: headers });
const data = res.data;
console.log(data);
const $ = cheerio.load(data);
const catalog: Post[] = [];
$(".movie-item,.flw-item").map((i, element) => {
const title = $(element).find(".film-name").text().trim();
const link = $(element).find("a").attr("href");
const image = $(element).find("img").attr("src");
console.log(title, link, image);
if (title && link && image) {
catalog.push({
title: title,
link: link,
image: image,
});
}
});
return catalog;
} catch (err) {
lastError = err;
if (signal.aborted || attempt === maxRetries) {
throw err;
}
});
return catalog;
} catch (err) {
return [];
}
}
throw lastError;
}
+2 -1
View File
@@ -15,7 +15,7 @@ export const getStream = async function ({
const { axios, cheerio } = providerContext;
const stream: Stream[] = [];
const [, epId] = id.split("&");
const url = `https://febbox.vercel.app/api/video-quality?fid=${epId}`;
const url = `https://feb.8man.workers.dev/?fid=${epId}`;
const res = await axios.get(url, { signal });
const data = res.data;
const $ = cheerio.load(data.html);
@@ -35,6 +35,7 @@ export const getStream = async function ({
});
}
});
console.log(stream);
return stream;
} catch (err) {
return [];
+2 -3
View File
@@ -12,12 +12,11 @@ const headers = {
"sec-ch-ua-platform": '"Windows"',
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
Cookie: "popads_user_id=6ba8fe60a481387a3249f05aa058822d",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0",
};
export const getPosts = async function ({
@@ -60,7 +59,7 @@ export const getSearchPosts = async function ({
async function posts(
url: string,
signal: AbortSignal,
providerContext: ProviderContext
providerContext: ProviderContext,
): Promise<Post[]> {
try {
const { axios, cheerio } = providerContext;
+36
View File
@@ -129,10 +129,46 @@ export interface ProviderType {
}) => Promise<Post[]>;
}
// Options to customize the WAF-solving WebView dialog.
// Options to customize the WAF-solving WebView dialog.
export interface OpenWebViewOptions {
// Title shown in the dialog header.
title?: string;
// Helper text shown under the title.
description?: string;
headers?: Record<string, string>;
waitForCookie?: string;
force?: boolean;
// If set, the dialog auto-cancels (rejects) after this many milliseconds.
timeoutMs?: number;
}
// Result returned to the provider after the user solves the challenge.
export interface OpenWebViewResult {
// The page response after the challenge is solved: the rendered HTML of the
// document (document.documentElement.outerHTML).
data: string;
// Cookie header value, e.g. "cf_clearance=abc; other=def".
cookies: string;
// Cookies as a name -> value map.
cookieMap: Record<string, string>;
// The User-Agent used by the WebView.
userAgent: string;
// The URL that was opened.
url: string;
}
export type ProviderContext = {
axios: AxiosStatic;
Aes: any; // AES encryption utility, if used
getBaseUrl: (providerValue: string) => Promise<string>;
commonHeaders: Record<string, string>;
cheerio: typeof cheerio;
openWebView: (
url: string,
options?: OpenWebViewOptions,
) => Promise<OpenWebViewResult>;
};
+2 -2
View File
@@ -12,8 +12,8 @@ export const catalog = [
filter: "web-series/amazon-prime-video",
},
{
title: "4K Movies",
filter: "movies-by-quality/2160p",
title: "Apple TV+",
filter: "web-series/apple-tv",
},
];
+101 -37
View File
@@ -40,34 +40,81 @@ export const getMeta = async ({
},
});
const $ = cheerio.load(response.data);
const infoContainer = $(".entry-content,.post-inner");
const heading = infoContainer?.find("h3");
const imdbId =
//@ts-ignore
heading?.next("p")?.find("a")?.[0]?.attribs?.href?.match(/tt\d+/g)?.[0] ||
infoContainer.text().match(/tt\d+/g)?.[0] ||
"";
// console.log(imdbId)
const infoContainer = $(
".entry-content, .post-inner, .post-content, .page-body",
);
const type = heading?.next("p")?.text()?.includes("Series Name")
? "series"
: "movie";
// console.log(type);
// title
const titleRegex = /Name: (.+)/;
const title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || "";
let title = $("h1.post-title").text().trim();
if (!title) {
const heading = infoContainer?.find("h3");
const titleRegex = /Name: (.+)/;
title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || "";
}
// console.log(title);
// imdbId
let imdbId =
$('a[href*="imdb.com"]').attr("href")?.match(/tt\d+/)?.[0] || "";
if (!imdbId) {
const heading = infoContainer?.find("h3");
imdbId =
//@ts-ignore
heading
?.next("p")
?.find("a")?.[0]
?.attribs?.href?.match(/tt\d+/g)?.[0] ||
infoContainer.text().match(/tt\d+/g)?.[0] ||
"";
}
// console.log(imdbId)
// type
let type = "movie";
const heading = infoContainer?.find("h3");
if (heading?.next("p")?.text()?.includes("Series Name")) {
type = "series";
}
// console.log(type);
// synopsis
const synopsisNode = //@ts-ignore
infoContainer?.find("p")?.next("h3,h4")?.next("p")?.[0]?.children?.[0];
const synopsis =
synopsisNode && "data" in synopsisNode ? synopsisNode.data : "";
let synopsis = "";
const synopsisHeader = $("h3").filter(
(i, el) =>
$(el).text().includes("SYNOPSIS/PLOT") || $(el).text().includes("Plot"),
);
if (synopsisHeader.length > 0) {
synopsis = synopsisHeader.next("p").text().trim();
}
if (!synopsis) {
const synopsisNode = //@ts-ignore
infoContainer?.find("p")?.next("h3,h4")?.next("p")?.[0]?.children?.[0];
synopsis =
synopsisNode && "data" in synopsisNode ? synopsisNode.data : "";
}
// console.log(synopsis);
// image
let image =
infoContainer?.find("img[data-lazy-src]")?.attr("data-lazy-src") || "";
infoContainer?.find("img[data-lazy-src]")?.attr("data-lazy-src") ||
infoContainer
?.find("img")
?.filter((i, el) => {
const src = $(el).attr("src");
return (
!!src &&
!src.includes("logo") &&
!src.includes("svg") &&
!src.includes("placeholder") &&
!src.includes("icon")
);
})
?.first()
?.attr("src") ||
"";
if (image.startsWith("//")) {
image = "https:" + image;
}
@@ -75,7 +122,21 @@ export const getMeta = async ({
console.log({ title, synopsis, image, imdbId, type });
/// Links
const hr = infoContainer?.first()?.find("hr");
let hr = infoContainer?.first()?.find("hr");
// Try to find the HR before the download buttons if possible
const firstButton = $(".dwd-button").first();
if (firstButton.length > 0) {
const containerP = firstButton.closest("p");
let prev = containerP.prev();
while (prev.length && !prev.is("hr")) {
prev = prev.prev();
}
if (prev.is("hr")) {
hr = prev;
}
}
const list = hr?.nextUntil("hr");
const links: Link[] = [];
list.each((index, element: any) => {
@@ -86,20 +147,23 @@ export const getMeta = async ({
const quality = element?.text().match(/\d+p\b/)?.[0] || "";
// console.log(title);
// movieLinks
const movieLinks = element
?.next()
.find(".dwd-button")
.text()
.toLowerCase()
.includes("download")
? element?.next().find(".dwd-button")?.parent()?.attr("href")
: "";
const movieLinks =
element
?.next()
.find(".dwd-button")
.text()
.toLowerCase()
.includes("download") ||
element.next().find("a").text().toLowerCase().includes("download")
? element?.next().find(".dwd-button")?.parent()?.attr("href") ||
element?.next().find("a[href]")?.attr("href")
: "";
// episode links
const vcloudLinks = element
?.next()
.find(
".btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: white;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: #fdf8f2;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152);color: white']"
".btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: white;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: #fdf8f2;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152);color: white']",
)
?.parent()
?.attr("href");
@@ -107,17 +171,17 @@ export const getMeta = async ({
(vcloudLinks
? vcloudLinks
: element
?.next()
.find(".dwd-button")
.text()
.toLowerCase()
.includes("episode")
? element?.next().find(".dwd-button")?.parent()?.attr("href")
: "") ||
?.next()
.find(".dwd-button")
.text()
.toLowerCase()
.includes("episode")
? element?.next().find(".dwd-button")?.parent()?.attr("href")
: "") ||
element
?.next()
.find(
".btn-outline[style='background:linear-gradient(135deg,#0ebac3,#09d261); color: white;']"
".btn-outline[style='background:linear-gradient(135deg,#0ebac3,#09d261); color: white;']",
)
?.parent()
?.attr("href");
+49 -9
View File
@@ -38,7 +38,9 @@ export const getPosts = async ({
const baseUrl = await getBaseUrl("Vega");
console.log("vegaGetPosts baseUrl:", providerValue, baseUrl);
const url = `${baseUrl}/${filter}/page/${page}/`;
const url = filter
? `${baseUrl}/${filter}/page/${page}/`
: `${baseUrl}/page/${page}/`;
console.log("vegaGetPosts url:", url);
return posts(baseUrl, url, signal, headers, axios, cheerio);
};
@@ -60,10 +62,39 @@ export const getSearchPosts = async ({
const baseUrl = await getBaseUrl("Vega");
console.log("vegaGetPosts baseUrl:", providerValue, baseUrl);
const url = `${baseUrl}/page/${page}/?s=${searchQuery}`;
const url = `${baseUrl}/search.php?q=${searchQuery}&page=${page}`;
console.log("vegaGetPosts url:", url);
return posts(baseUrl, url, signal, headers, axios, cheerio);
try {
const response = await axios.get(url, {
headers: {
...headers,
Referer: baseUrl,
},
signal,
});
const data = response.data;
const posts: Post[] = [];
if (data?.hits) {
data.hits.forEach((hit: any) => {
const doc = hit.document;
const post = {
title: doc.post_title.replace("Download", "").trim(),
link: doc.permalink.startsWith("http")
? doc.permalink
: `${baseUrl}${doc.permalink}`,
image: doc.post_thumbnail,
};
posts.push(post);
});
}
return posts;
} catch (error) {
console.error("vegaGetSearchPosts error:", error);
return [];
}
};
async function posts(
@@ -72,7 +103,7 @@ async function posts(
signal: AbortSignal,
headers: Record<string, string> = {},
axios: ProviderContext["axios"],
cheerio: ProviderContext["cheerio"]
cheerio: ProviderContext["cheerio"],
): Promise<Post[]> {
try {
const urlRes = await fetch(url, {
@@ -84,31 +115,40 @@ async function posts(
});
const $ = cheerio.load(await urlRes.text());
const posts: Post[] = [];
$(".blog-items,.post-list,#archive-container")
?.children("article,.entry-list-item")
$(".blog-items,.post-list,#archive-container,.movies-grid")
?.children("article,.entry-list-item,a")
?.each((index, element) => {
const post = {
title: (
$(element)
?.find(".entry-title")
?.find(".entry-title,.poster-title")
?.text()
?.replace("Download", "")
?.match(/^(.*?)\s*\((\d{4})\)|^(.*?)\s*\((Season \d+)\)/)?.[0] ||
$(element)?.find("a")?.attr("title")?.replace("Download", "") ||
$(element)?.find(".post-title").text()?.replace("Download", "") ||
$(element)
?.find(".post-title,.poster-title")
.text()
?.replace("Download", "") ||
""
).trim(),
link: $(element)?.find("a")?.attr("href") || "",
link:
$(element)?.find("a")?.attr("href") ||
$(element)?.attr("href") ||
"",
image:
$(element).find("a").find("img").attr("data-lazy-src") ||
$(element).find("a").find("img").attr("data-src") ||
$(element).find("a").find("img").attr("src") ||
$(element).find("img").attr("data-src") ||
$(element).find("img").attr("src") ||
"",
};
if (post.image.startsWith("//")) {
post.image = "https:" + post.image;
}
console.log("vegaGetPosts post:", post);
posts.push(post);
});
+2 -2
View File
@@ -37,13 +37,13 @@ export async function getStream({
try {
const streamLinks: Stream[] = [];
console.log("dotlink", link);
if (type === "movie") {
if (type === "movie" && !link.includes("cloud")) {
// vlink
const dotlinkRes = await axios(`${link}`, { headers });
const dotlinkText = dotlinkRes.data;
// console.log('dotlinkText', dotlinkText);
const vlink = dotlinkText.match(/<a\s+href="([^"]*cloud\.[^"]*)"/i) || [];
// console.log('vLink', vlink[1]);
console.log("vLink", vlink[1]);
link = vlink[1];
// filepress link
+2 -2
View File
@@ -113,9 +113,9 @@ async function fetchPosts({
// Image
let img =
card.find("img").attr("data-src") ||
card.find("img").attr("bv-data-src") ||
card.find("img").attr("src") ||
card.find("img").attr("data-src") ||
card.find("img").attr("data-original") ||
"";
const image = img ? resolveUrl(img) : "";
@@ -128,7 +128,7 @@ async function fetchPosts({
} catch (err) {
console.error(
"fetchPosts error:",
err instanceof Error ? err.message : String(err)
err instanceof Error ? err.message : String(err),
);
return [];
}
+14 -22
View File
@@ -3,10 +3,6 @@ const cheerio = require("cheerio");
const axios = require("axios");
const { z } = require("zod");
const { getBaseUrl } = require("./dist/getBaseUrl.js");
const { hubcloudExtracter } = require("./dist/hubcloudExtractor.js");
const { gofileExtracter } = require("./dist/gofileExtracter.js");
const { superVideoExtractor } = require("./dist/superVideoExtractor.js");
const { gdFlixExtracter } = require("./dist/gdFlixExtractor.js");
// Create readline interface
const rl = readline.createInterface({
@@ -32,13 +28,7 @@ const providerContext = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
},
extractors: {
hubcloudExtracter: hubcloudExtracter,
gofileExtracter: gofileExtracter,
superVideoExtractor: superVideoExtractor,
gdFlixExtracter: gdFlixExtracter,
},
Crypto: {},
Aes: {},
};
// Function parameter definitions based on README and types
@@ -159,7 +149,7 @@ async function getParameters(functionName, providerName) {
const sampleValue = sampleValues[functionName]?.[paramName] || "";
let value = await prompt(
`${promptText}${sampleValue ? `[sample: ${sampleValue}] ` : ""}`
`${promptText}${sampleValue ? `[sample: ${sampleValue}] ` : ""}`,
);
if (!value && sampleValue) {
@@ -207,7 +197,7 @@ async function testProvider(providerName, functionName) {
}
} catch (error) {
console.log(
`❌ Provider '${providerName}' not found or built. Make sure to run 'npm run build' first.`
`❌ Provider '${providerName}' not found or built. Make sure to run 'npm run build' first.`,
);
console.log(`Error: ${error.message}`);
return;
@@ -217,7 +207,7 @@ async function testProvider(providerName, functionName) {
if (!module[functionName]) {
console.log(`❌ Function '${functionName}' not found in ${providerName}`);
const availableFunctions = Object.keys(module).filter(
(key) => typeof module[key] === "function"
(key) => typeof module[key] === "function",
);
console.log(`Available functions: ${availableFunctions.join(", ")}`);
return;
@@ -249,7 +239,7 @@ async function testProvider(providerName, functionName) {
if (!validationResult.isValid) {
console.log(
"\n💡 Tip: Check your provider implementation to ensure it returns the correct format."
"\n💡 Tip: Check your provider implementation to ensure it returns the correct format.",
);
}
} catch (error) {
@@ -281,7 +271,7 @@ const StreamSchema = z.object({
language: z.string(),
type: z.string(),
uri: z.string().url(),
})
}),
)
.optional(),
headers: z.any().optional(),
@@ -297,7 +287,7 @@ const LinkSchema = z.object({
title: z.string().min(1, "Direct link title cannot be empty"),
link: z.string().url("Direct link must be a valid URL"),
type: z.enum(["movie", "series"]).optional(),
})
}),
)
.optional(),
});
@@ -421,7 +411,7 @@ async function main() {
console.log("\nFlags:");
console.log(" --rebuild Rebuild TypeScript files before testing");
console.log(
"\nNote: Run with --rebuild flag if you've made changes to TypeScript files!"
"\nNote: Run with --rebuild flag if you've made changes to TypeScript files!",
);
rl.close();
return;
@@ -430,16 +420,15 @@ async function main() {
if (args.length < 2) {
console.log("❌ Please provide both provider name and function name");
console.log(
"Usage: node test-provider.js <provider> <function> [--rebuild]"
"Usage: node test-provider.js <provider> <function> [--rebuild]",
);
rl.close();
return;
}
const providerName = args[0];
const functionName = args[1];
// Validate function name
// Validate function name (case-insensitive)
const validFunctions = [
"getPosts",
"getSearchPosts",
@@ -447,8 +436,11 @@ async function main() {
"getEpisodes",
"getStream",
];
const functionName =
validFunctions.find((f) => f.toLowerCase() === args[1].toLowerCase()) ??
args[1];
if (!validFunctions.includes(functionName)) {
console.log(`❌ Invalid function name: ${functionName}`);
console.log(`❌ Invalid function name: ${args[1]}`);
console.log(`Valid functions: ${validFunctions.join(", ")}`);
rl.close();
return;
+18 -2
View File
@@ -357,9 +357,15 @@ class ProviderTester {
result.episodes.skipped = true;
result.episodes.error = "Function not available";
}
} else {
} else if (directLinks.length === 0) {
result.episodes.skipped = true;
console.log(` ️ No episode links found, skipping episodes test`);
console.log(
` ️ No episode links or direct links found, skipping episodes test`,
);
} else {
console.log(
` ️ No episode links found; will test stream via direct links instead`,
);
}
// Test direct links/stream if episodes not tested or no episode links
@@ -378,6 +384,7 @@ class ProviderTester {
const streamModule = this.loadModule(providerName, "stream");
if (streamModule && streamModule.getStream) {
let lastEmptyMessage = null;
for (const directLink of Array.isArray(linksToTest)
? linksToTest
: [linksToTest]) {
@@ -395,6 +402,7 @@ class ProviderTester {
if (Array.isArray(streams) && streams.length > 0) {
result.stream.success = true;
result.stream.error = null;
result.stream.data = {
count: streams.length,
type: directLink.type || "movie",
@@ -410,12 +418,20 @@ class ProviderTester {
break; // One success is enough
} else {
console.log(` ⚠️ No streams returned`);
lastEmptyMessage = "No streams returned";
}
} catch (err) {
console.log(` ❌ Stream error: ${err.message}`);
result.stream.error = err.message;
}
}
if (
!result.stream.success &&
!result.stream.error &&
lastEmptyMessage
) {
result.stream.error = lastEmptyMessage;
}
} else {
console.log(` ❌ getStream function not found`);
result.stream.error = "Function not available";