Compare commits

...

13 Commits

Author SHA1 Message Date
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
32 changed files with 505 additions and 166 deletions

View File

@@ -150,6 +150,44 @@ async function buildProvider(providerName) {
return { providerName, modules: results }; 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() { async function buildAll() {
const startTime = Date.now(); const startTime = Date.now();
console.log( console.log(
@@ -163,6 +201,9 @@ async function buildAll() {
} }
fs.mkdirSync(distDir, { recursive: true }); fs.mkdirSync(distDir, { recursive: true });
// Build utility files first
await buildUtilityFiles();
// Build all providers // Build all providers
const results = await Promise.all(providerDirs.map(buildProvider)); const results = await Promise.all(providerDirs.map(buildProvider));

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

67
dist/getBaseUrl.js vendored Normal file
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
});

File diff suppressed because one or more lines are too long

37
dist/headers.js vendored Normal file
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
});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

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:"category/web-series/netflix"},{title:"Amazon Prime",filter:"category/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;

2
dist/vega/meta.js vendored

File diff suppressed because one or more lines are too long

2
dist/vega/posts.js vendored

File diff suppressed because one or more lines are too long

2
dist/vega/stream.js vendored

File diff suppressed because one or more lines are too long

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;

File diff suppressed because one or more lines are too long

View File

@@ -2,7 +2,7 @@
{ {
"display_name": "VegaMovies", "display_name": "VegaMovies",
"value": "vega", "value": "vega",
"version": "1.16", "version": "2.4",
"icon": "", "icon": "",
"type": "global", "type": "global",
"disabled": false "disabled": false
@@ -18,7 +18,7 @@
{ {
"display_name": "MoviesDrive", "display_name": "MoviesDrive",
"value": "drive", "value": "drive",
"version": "1.7", "version": "1.8",
"icon": "", "icon": "",
"type": "global", "type": "global",
"disabled": false "disabled": false
@@ -34,7 +34,7 @@
{ {
"display_name": "4khdHub", "display_name": "4khdHub",
"value": "4khdhub", "value": "4khdhub",
"version": "1.9", "version": "2.0",
"icon": "", "icon": "",
"type": "global", "type": "global",
"disabled": false "disabled": false
@@ -42,7 +42,7 @@
{ {
"display_name": "Cinewood", "display_name": "Cinewood",
"value": "1cinevood", "value": "1cinevood",
"version": "1.2", "version": "1.3",
"icon": "", "icon": "",
"type": "global", "type": "global",
"disabled": false "disabled": false
@@ -58,7 +58,7 @@
{ {
"display_name": "KatMoviesHd", "display_name": "KatMoviesHd",
"value": "katmovies", "value": "katmovies",
"version": "1.4", "version": "1.5",
"icon": "", "icon": "",
"type": "global", "type": "global",
"disabled": false "disabled": false
@@ -90,7 +90,7 @@
{ {
"display_name": "CinemaLuxe", "display_name": "CinemaLuxe",
"value": "cinemaLuxe", "value": "cinemaLuxe",
"version": "1.5", "version": "1.6",
"icon": "", "icon": "",
"type": "global", "type": "global",
"disabled": true "disabled": true
@@ -114,7 +114,7 @@
{ {
"display_name": "Movies4U", "display_name": "Movies4U",
"value": "movies4u", "value": "movies4u",
"version": "1.2", "version": "1.3",
"icon": "", "icon": "",
"type": "global", "type": "global",
"disabled": false "disabled": false
@@ -130,7 +130,7 @@
{ {
"display_name": "Zeefliz", "display_name": "Zeefliz",
"value": "zeefliz", "value": "zeefliz",
"version": "1.2", "version": "1.4",
"icon": "", "icon": "",
"type": "global", "type": "global",
"disabled": false "disabled": false
@@ -138,7 +138,7 @@
{ {
"display_name": "KatMovieFix", "display_name": "KatMovieFix",
"value": "katMovieFix", "value": "katMovieFix",
"version": "1.4", "version": "1.5",
"icon": "", "icon": "",
"type": "global", "type": "global",
"disabled": true "disabled": true
@@ -170,7 +170,7 @@
{ {
"display_name": "HdHub4u", "display_name": "HdHub4u",
"value": "hdhub4u", "value": "hdhub4u",
"version": "1.4", "version": "1.7",
"icon": "", "icon": "",
"type": "global", "type": "global",
"disabled": false "disabled": false
@@ -290,7 +290,7 @@
{ {
"display_name": "RogMovies", "display_name": "RogMovies",
"value": "luxMovies", "value": "luxMovies",
"version": "1.9", "version": "2.1",
"icon": "", "icon": "",
"type": "india", "type": "india",
"disabled": false "disabled": false
@@ -314,7 +314,7 @@
{ {
"display_name": "SkyMovieHD", "display_name": "SkyMovieHD",
"value": "skyMovieHD", "value": "skyMovieHD",
"version": "1.4", "version": "1.5",
"icon": "", "icon": "",
"type": "global", "type": "global",
"disabled": true "disabled": true
@@ -322,7 +322,7 @@
{ {
"display_name": "Joya9tv", "display_name": "Joya9tv",
"value": "Joya9tv", "value": "Joya9tv",
"version": "1.3", "version": "1.4",
"icon": "", "icon": "",
"type": "india", "type": "india",
"disabled": false "disabled": false

View File

@@ -51,7 +51,7 @@ export async function hubcloudExtractor(
if (!link?.includes("api")) { if (!link?.includes("api")) {
const token = link.split("/").pop(); const token = link.split("/").pop();
const baseUrl = link.split("/").slice(0, -2).join("/"); 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" }); streamLinks.push({ server: "Pixeldrain", link: link, type: "mkv" });
break; break;

View File

@@ -40,7 +40,7 @@ export async function getStream({
const hubdriveText = hubdriveRes.data; const hubdriveText = hubdriveRes.data;
const $$ = cheerio.load(hubdriveText); const $$ = cheerio.load(hubdriveText);
hubdriveLink = hubdriveLink =
$$(".btn.btn-primary.btn-user").attr("href") || hubdriveLink; $$(".btn.btn-primary.btn-user.btn-success1").attr("href") || "";
} }
console.log("hubdriveLink2", hubdriveLink); console.log("hubdriveLink2", hubdriveLink);
} }

View File

@@ -40,42 +40,103 @@ export const getMeta = async ({
}, },
}); });
const $ = cheerio.load(response.data); const $ = cheerio.load(response.data);
const infoContainer = $(".entry-content,.post-inner"); const infoContainer = $(
const heading = infoContainer?.find("h3"); ".entry-content, .post-inner, .post-content, .page-body",
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 type = heading?.next("p")?.text()?.includes("Series Name")
? "series"
: "movie";
// console.log(type);
// title // title
const titleRegex = /Name: (.+)/; let title = $("h1.post-title").text().trim();
const title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || ""; if (!title) {
const heading = infoContainer?.find("h3");
const titleRegex = /Name: (.+)/;
title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || "";
}
// console.log(title); // 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 // synopsis
const synopsisNode = //@ts-ignore let synopsis = "";
infoContainer?.find("p")?.next("h3,h4")?.next("p")?.[0]?.children?.[0]; const synopsisHeader = $("h3").filter(
const synopsis = (i, el) =>
synopsisNode && "data" in synopsisNode ? synopsisNode.data : ""; $(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); // console.log(synopsis);
// image // image
let 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("//")) { if (image.startsWith("//")) {
image = "https:" + image; image = "https:" + image;
} }
// console.log(image); // console.log(image);
// console.log({title, synopsis, image, imdbId, type}); console.log({ title, synopsis, image, imdbId, type });
/// Links /// 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 list = hr?.nextUntil("hr");
const links: Link[] = []; const links: Link[] = [];
list.each((index, element: any) => { list.each((index, element: any) => {
@@ -86,39 +147,41 @@ export const getMeta = async ({
const quality = element?.text().match(/\d+p\b/)?.[0] || ""; const quality = element?.text().match(/\d+p\b/)?.[0] || "";
// console.log(title); // console.log(title);
// movieLinks // movieLinks
const movieLinks = element const movieLinks =
?.next() element
.find(".dwd-button") ?.next()
.text() .find(".dwd-button")
.toLowerCase() .text()
.includes("download") .toLowerCase()
? element?.next().find(".dwd-button")?.parent()?.attr("href") .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 // episode links
const vcloudLinks = element const vcloudLinks = element
?.next() ?.next()
.find( .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() ?.parent()
?.attr("href"); ?.attr("href");
console.log(title);
const episodesLink = const episodesLink =
(vcloudLinks (vcloudLinks
? vcloudLinks ? vcloudLinks
: element : element
?.next() ?.next()
.find(".dwd-button") .find(".dwd-button")
.text() .text()
.toLowerCase() .toLowerCase()
.includes("episode") .includes("episode")
? element?.next().find(".dwd-button")?.parent()?.attr("href") ? element?.next().find(".dwd-button")?.parent()?.attr("href")
: "") || : "") ||
element element
?.next() ?.next()
.find( .find(
".btn-outline[style='background:linear-gradient(135deg,#0ebac3,#09d261); color: white;']" ".btn-outline[style='background:linear-gradient(135deg,#0ebac3,#09d261); color: white;']",
) )
?.parent() ?.parent()
?.attr("href"); ?.attr("href");

View File

@@ -34,13 +34,13 @@ export const getPosts = async ({
signal: AbortSignal; signal: AbortSignal;
providerContext: ProviderContext; providerContext: ProviderContext;
}): Promise<Post[]> => { }): Promise<Post[]> => {
const { getBaseUrl } = providerContext; const { getBaseUrl, axios, cheerio } = providerContext;
const baseUrl = await getBaseUrl("lux"); const baseUrl = await getBaseUrl("Vega");
console.log("vegaGetPosts baseUrl:", providerValue, baseUrl); console.log("vegaGetPosts baseUrl:", providerValue, baseUrl);
const url = `${baseUrl}/${filter}/page/${page}/`; const url = `${baseUrl}/${filter}/page/${page}/`;
console.log("lux url:", url); console.log("vegaGetPosts url:", url);
return posts(url, signal, providerContext); return posts(baseUrl, url, signal, headers, axios, cheerio);
}; };
export const getSearchPosts = async ({ export const getSearchPosts = async ({
@@ -56,58 +56,96 @@ export const getSearchPosts = async ({
signal: AbortSignal; signal: AbortSignal;
providerContext: ProviderContext; providerContext: ProviderContext;
}): Promise<Post[]> => { }): Promise<Post[]> => {
const { getBaseUrl } = providerContext; const { getBaseUrl, axios, cheerio } = providerContext;
const baseUrl = await getBaseUrl("lux"); const baseUrl = await getBaseUrl("Vega");
console.log("vegaGetPosts baseUrl:", providerValue, baseUrl); console.log("vegaGetPosts baseUrl:", providerValue, baseUrl);
const url = const url = `${baseUrl}/search.php?q=${searchQuery}&page=${page}`;
page === 1 console.log("vegaGetPosts url:", url);
? `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);
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( async function posts(
baseUrl: string,
url: string, url: string,
signal: AbortSignal, signal: AbortSignal,
providerContext: ProviderContext headers: Record<string, string> = {},
axios: ProviderContext["axios"],
cheerio: ProviderContext["cheerio"],
): Promise<Post[]> { ): Promise<Post[]> {
try { try {
const { axios, cheerio } = providerContext;
const urlRes = await fetch(url, { const urlRes = await fetch(url, {
headers: { headers: {
...headers, ...headers,
Referer: url, Referer: baseUrl,
}, },
signal, signal,
}); });
const $ = cheerio.load(await urlRes.text()); const $ = cheerio.load(await urlRes.text());
const posts: Post[] = []; const posts: Post[] = [];
$(".blog-items") $(".blog-items,.post-list,#archive-container,.movies-grid")
?.children("article") ?.children("article,.entry-list-item,a")
?.each((index, element) => { ?.each((index, element) => {
const post = { const post = {
title: title: (
$(element) $(element)
?.find("a") ?.find(".entry-title,.poster-title")
?.attr("title") ?.text()
?.replace("Download", "") ?.replace("Download", "")
?.match(/^(.*?)\s*\((\d{4})\)|^(.*?)\s*\((Season \d+)\)/)?.[0] || ?.match(/^(.*?)\s*\((\d{4})\)|^(.*?)\s*\((Season \d+)\)/)?.[0] ||
$(element)?.find("a")?.attr("title")?.replace("Download", "") || $(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: image:
$(element).find("a").find("img").attr("data-lazy-src") || $(element).find("a").find("img").attr("data-lazy-src") ||
$(element).find("a").find("img").attr("data-src") || $(element).find("a").find("img").attr("data-src") ||
$(element).find("a").find("img").attr("src") || $(element).find("a").find("img").attr("src") ||
$(element).find("img").attr("src") ||
"", "",
}; };
if (post.image.startsWith("//")) { if (post.image.startsWith("//")) {
post.image = "https:" + post.image; post.image = "https:" + post.image;
} }
console.log("vegaGetPosts post:", post);
posts.push(post); posts.push(post);
}); });

View File

@@ -5,11 +5,11 @@ export const catalog = [
}, },
{ {
title: "Netflix", title: "Netflix",
filter: "web-series/netflix", filter: "category/web-series/netflix",
}, },
{ {
title: "Amazon Prime", title: "Amazon Prime",
filter: "web-series/amazon-prime-video", filter: "category/web-series/amazon-prime-video",
}, },
{ {
title: "4K Movies", title: "4K Movies",

View File

@@ -40,34 +40,81 @@ export const getMeta = async ({
}, },
}); });
const $ = cheerio.load(response.data); const $ = cheerio.load(response.data);
const infoContainer = $(".entry-content,.post-inner"); const infoContainer = $(
const heading = infoContainer?.find("h3"); ".entry-content, .post-inner, .post-content, .page-body",
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 type = heading?.next("p")?.text()?.includes("Series Name")
? "series"
: "movie";
// console.log(type);
// title // title
const titleRegex = /Name: (.+)/; let title = $("h1.post-title").text().trim();
const title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || ""; if (!title) {
const heading = infoContainer?.find("h3");
const titleRegex = /Name: (.+)/;
title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || "";
}
// console.log(title); // 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 // synopsis
const synopsisNode = //@ts-ignore let synopsis = "";
infoContainer?.find("p")?.next("h3,h4")?.next("p")?.[0]?.children?.[0]; const synopsisHeader = $("h3").filter(
const synopsis = (i, el) =>
synopsisNode && "data" in synopsisNode ? synopsisNode.data : ""; $(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); // console.log(synopsis);
// image // image
let 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("//")) { if (image.startsWith("//")) {
image = "https:" + image; image = "https:" + image;
} }
@@ -75,7 +122,21 @@ export const getMeta = async ({
console.log({ title, synopsis, image, imdbId, type }); console.log({ title, synopsis, image, imdbId, type });
/// Links /// 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 list = hr?.nextUntil("hr");
const links: Link[] = []; const links: Link[] = [];
list.each((index, element: any) => { list.each((index, element: any) => {
@@ -86,20 +147,23 @@ export const getMeta = async ({
const quality = element?.text().match(/\d+p\b/)?.[0] || ""; const quality = element?.text().match(/\d+p\b/)?.[0] || "";
// console.log(title); // console.log(title);
// movieLinks // movieLinks
const movieLinks = element const movieLinks =
?.next() element
.find(".dwd-button") ?.next()
.text() .find(".dwd-button")
.toLowerCase() .text()
.includes("download") .toLowerCase()
? element?.next().find(".dwd-button")?.parent()?.attr("href") .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 // episode links
const vcloudLinks = element const vcloudLinks = element
?.next() ?.next()
.find( .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() ?.parent()
?.attr("href"); ?.attr("href");
@@ -107,17 +171,17 @@ export const getMeta = async ({
(vcloudLinks (vcloudLinks
? vcloudLinks ? vcloudLinks
: element : element
?.next() ?.next()
.find(".dwd-button") .find(".dwd-button")
.text() .text()
.toLowerCase() .toLowerCase()
.includes("episode") .includes("episode")
? element?.next().find(".dwd-button")?.parent()?.attr("href") ? element?.next().find(".dwd-button")?.parent()?.attr("href")
: "") || : "") ||
element element
?.next() ?.next()
.find( .find(
".btn-outline[style='background:linear-gradient(135deg,#0ebac3,#09d261); color: white;']" ".btn-outline[style='background:linear-gradient(135deg,#0ebac3,#09d261); color: white;']",
) )
?.parent() ?.parent()
?.attr("href"); ?.attr("href");

View File

@@ -60,10 +60,39 @@ export const getSearchPosts = async ({
const baseUrl = await getBaseUrl("Vega"); const baseUrl = await getBaseUrl("Vega");
console.log("vegaGetPosts baseUrl:", providerValue, baseUrl); 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); 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( async function posts(
@@ -72,7 +101,7 @@ async function posts(
signal: AbortSignal, signal: AbortSignal,
headers: Record<string, string> = {}, headers: Record<string, string> = {},
axios: ProviderContext["axios"], axios: ProviderContext["axios"],
cheerio: ProviderContext["cheerio"] cheerio: ProviderContext["cheerio"],
): Promise<Post[]> { ): Promise<Post[]> {
try { try {
const urlRes = await fetch(url, { const urlRes = await fetch(url, {
@@ -84,31 +113,39 @@ async function posts(
}); });
const $ = cheerio.load(await urlRes.text()); const $ = cheerio.load(await urlRes.text());
const posts: Post[] = []; const posts: Post[] = [];
$(".blog-items,.post-list,#archive-container") $(".blog-items,.post-list,#archive-container,.movies-grid")
?.children("article,.entry-list-item") ?.children("article,.entry-list-item,a")
?.each((index, element) => { ?.each((index, element) => {
const post = { const post = {
title: ( title: (
$(element) $(element)
?.find(".entry-title") ?.find(".entry-title,.poster-title")
?.text() ?.text()
?.replace("Download", "") ?.replace("Download", "")
?.match(/^(.*?)\s*\((\d{4})\)|^(.*?)\s*\((Season \d+)\)/)?.[0] || ?.match(/^(.*?)\s*\((\d{4})\)|^(.*?)\s*\((Season \d+)\)/)?.[0] ||
$(element)?.find("a")?.attr("title")?.replace("Download", "") || $(element)?.find("a")?.attr("title")?.replace("Download", "") ||
$(element)?.find(".post-title").text()?.replace("Download", "") || $(element)
?.find(".post-title,.poster-title")
.text()
?.replace("Download", "") ||
"" ""
).trim(), ).trim(),
link: $(element)?.find("a")?.attr("href") || "", link:
$(element)?.find("a")?.attr("href") ||
$(element)?.attr("href") ||
"",
image: image:
$(element).find("a").find("img").attr("data-lazy-src") || $(element).find("a").find("img").attr("data-lazy-src") ||
$(element).find("a").find("img").attr("data-src") || $(element).find("a").find("img").attr("data-src") ||
$(element).find("a").find("img").attr("src") || $(element).find("a").find("img").attr("src") ||
$(element).find("img").attr("src") ||
"", "",
}; };
if (post.image.startsWith("//")) { if (post.image.startsWith("//")) {
post.image = "https:" + post.image; post.image = "https:" + post.image;
} }
console.log("vegaGetPosts post:", post);
posts.push(post); posts.push(post);
}); });

View File

@@ -113,9 +113,9 @@ async function fetchPosts({
// Image // Image
let img = let img =
card.find("img").attr("data-src") ||
card.find("img").attr("bv-data-src") || card.find("img").attr("bv-data-src") ||
card.find("img").attr("src") || card.find("img").attr("src") ||
card.find("img").attr("data-src") ||
card.find("img").attr("data-original") || card.find("img").attr("data-original") ||
""; "";
const image = img ? resolveUrl(img) : ""; const image = img ? resolveUrl(img) : "";
@@ -128,7 +128,7 @@ async function fetchPosts({
} catch (err) { } catch (err) {
console.error( console.error(
"fetchPosts error:", "fetchPosts error:",
err instanceof Error ? err.message : String(err) err instanceof Error ? err.message : String(err),
); );
return []; return [];
} }

View File

@@ -3,10 +3,6 @@ const cheerio = require("cheerio");
const axios = require("axios"); const axios = require("axios");
const { z } = require("zod"); const { z } = require("zod");
const { getBaseUrl } = require("./dist/getBaseUrl.js"); 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 // Create readline interface
const rl = readline.createInterface({ const rl = readline.createInterface({
@@ -32,13 +28,7 @@ const providerContext = {
"User-Agent": "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", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
}, },
extractors: { Aes: {},
hubcloudExtracter: hubcloudExtracter,
gofileExtracter: gofileExtracter,
superVideoExtractor: superVideoExtractor,
gdFlixExtracter: gdFlixExtracter,
},
Crypto: {},
}; };
// Function parameter definitions based on README and types // Function parameter definitions based on README and types
@@ -159,7 +149,7 @@ async function getParameters(functionName, providerName) {
const sampleValue = sampleValues[functionName]?.[paramName] || ""; const sampleValue = sampleValues[functionName]?.[paramName] || "";
let value = await prompt( let value = await prompt(
`${promptText}${sampleValue ? `[sample: ${sampleValue}] ` : ""}` `${promptText}${sampleValue ? `[sample: ${sampleValue}] ` : ""}`,
); );
if (!value && sampleValue) { if (!value && sampleValue) {
@@ -207,7 +197,7 @@ async function testProvider(providerName, functionName) {
} }
} catch (error) { } catch (error) {
console.log( 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}`); console.log(`Error: ${error.message}`);
return; return;
@@ -217,7 +207,7 @@ async function testProvider(providerName, functionName) {
if (!module[functionName]) { if (!module[functionName]) {
console.log(`❌ Function '${functionName}' not found in ${providerName}`); console.log(`❌ Function '${functionName}' not found in ${providerName}`);
const availableFunctions = Object.keys(module).filter( const availableFunctions = Object.keys(module).filter(
(key) => typeof module[key] === "function" (key) => typeof module[key] === "function",
); );
console.log(`Available functions: ${availableFunctions.join(", ")}`); console.log(`Available functions: ${availableFunctions.join(", ")}`);
return; return;
@@ -249,7 +239,7 @@ async function testProvider(providerName, functionName) {
if (!validationResult.isValid) { if (!validationResult.isValid) {
console.log( 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) { } catch (error) {
@@ -281,7 +271,7 @@ const StreamSchema = z.object({
language: z.string(), language: z.string(),
type: z.string(), type: z.string(),
uri: z.string().url(), uri: z.string().url(),
}) }),
) )
.optional(), .optional(),
headers: z.any().optional(), headers: z.any().optional(),
@@ -297,7 +287,7 @@ const LinkSchema = z.object({
title: z.string().min(1, "Direct link title cannot be empty"), title: z.string().min(1, "Direct link title cannot be empty"),
link: z.string().url("Direct link must be a valid URL"), link: z.string().url("Direct link must be a valid URL"),
type: z.enum(["movie", "series"]).optional(), type: z.enum(["movie", "series"]).optional(),
}) }),
) )
.optional(), .optional(),
}); });
@@ -421,7 +411,7 @@ async function main() {
console.log("\nFlags:"); console.log("\nFlags:");
console.log(" --rebuild Rebuild TypeScript files before testing"); console.log(" --rebuild Rebuild TypeScript files before testing");
console.log( 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(); rl.close();
return; return;
@@ -430,16 +420,15 @@ async function main() {
if (args.length < 2) { if (args.length < 2) {
console.log("❌ Please provide both provider name and function name"); console.log("❌ Please provide both provider name and function name");
console.log( console.log(
"Usage: node test-provider.js <provider> <function> [--rebuild]" "Usage: node test-provider.js <provider> <function> [--rebuild]",
); );
rl.close(); rl.close();
return; return;
} }
const providerName = args[0]; const providerName = args[0];
const functionName = args[1];
// Validate function name // Validate function name (case-insensitive)
const validFunctions = [ const validFunctions = [
"getPosts", "getPosts",
"getSearchPosts", "getSearchPosts",
@@ -447,8 +436,11 @@ async function main() {
"getEpisodes", "getEpisodes",
"getStream", "getStream",
]; ];
const functionName =
validFunctions.find((f) => f.toLowerCase() === args[1].toLowerCase()) ??
args[1];
if (!validFunctions.includes(functionName)) { if (!validFunctions.includes(functionName)) {
console.log(`❌ Invalid function name: ${functionName}`); console.log(`❌ Invalid function name: ${args[1]}`);
console.log(`Valid functions: ${validFunctions.join(", ")}`); console.log(`Valid functions: ${validFunctions.join(", ")}`);
rl.close(); rl.close();
return; return;