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
+41
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));
+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
+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
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
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:"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;
+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
+13 -13
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
+1 -1
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;
+1 -1
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);
} }
+86 -23
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
let title = $("h1.post-title").text().trim();
if (!title) {
const heading = infoContainer?.find("h3");
const titleRegex = /Name: (.+)/; const titleRegex = /Name: (.+)/;
const title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || ""; 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
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 const synopsisNode = //@ts-ignore
infoContainer?.find("p")?.next("h3,h4")?.next("p")?.[0]?.children?.[0]; infoContainer?.find("p")?.next("h3,h4")?.next("p")?.[0]?.children?.[0];
const synopsis = synopsis =
synopsisNode && "data" in synopsisNode ? synopsisNode.data : ""; 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,24 +147,26 @@ 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 =
element
?.next() ?.next()
.find(".dwd-button") .find(".dwd-button")
.text() .text()
.toLowerCase() .toLowerCase()
.includes("download") .includes("download") ||
? element?.next().find(".dwd-button")?.parent()?.attr("href") 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
@@ -118,7 +181,7 @@ export const getMeta = async ({
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");
+60 -22
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);
}); });
+2 -2
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",
+85 -21
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
let title = $("h1.post-title").text().trim();
if (!title) {
const heading = infoContainer?.find("h3");
const titleRegex = /Name: (.+)/; const titleRegex = /Name: (.+)/;
const title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || ""; 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
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 const synopsisNode = //@ts-ignore
infoContainer?.find("p")?.next("h3,h4")?.next("p")?.[0]?.children?.[0]; infoContainer?.find("p")?.next("h3,h4")?.next("p")?.[0]?.children?.[0];
const synopsis = synopsis =
synopsisNode && "data" in synopsisNode ? synopsisNode.data : ""; 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 =
element
?.next() ?.next()
.find(".dwd-button") .find(".dwd-button")
.text() .text()
.toLowerCase() .toLowerCase()
.includes("download") .includes("download") ||
? element?.next().find(".dwd-button")?.parent()?.attr("href") 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");
@@ -117,7 +181,7 @@ export const getMeta = async ({
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");
+45 -8
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);
}); });
+2 -2
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 [];
} }
+14 -22
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;