Compare commits

...

11 Commits

Author SHA1 Message Date
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 };
}
async function buildUtilityFiles() {
const utilityFiles = ["getBaseUrl", "headers", "providerContext"];
for (const utilityName of utilityFiles) {
const utilityPath = path.join(providersDir, `${utilityName}.ts`);
if (!fs.existsSync(utilityPath)) {
continue;
}
try {
const result = await esbuild.build({
entryPoints: [utilityPath],
bundle: true,
platform: "node",
format: "cjs",
target: "es2015",
write: false,
external: [],
minify: false,
keepNames: true,
treeShaking: true,
outfile: `${utilityName}.js`,
});
let code = result.outputFiles[0].text;
code = code.replace(/require\(['"]node:.*?['"]\)/g, "{}");
const outputPath = path.join(__dirname, "dist", `${utilityName}.js`);
fs.writeFileSync(outputPath, code);
console.log(`${utilityName}.js (${(code.length / 1024).toFixed(1)}kb)`);
} catch (error) {
console.error(`✗ Error building ${utilityName}:`, error.message);
}
}
}
async function buildAll() {
const startTime = Date.now();
console.log(
@@ -163,6 +201,9 @@ async function buildAll() {
}
fs.mkdirSync(distDir, { recursive: true });
// Build utility files first
await buildUtilityFiles();
// Build all providers
const results = await Promise.all(providerDirs.map(buildProvider));

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

View File

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

View File

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

View File

@@ -40,42 +40,103 @@ export const getMeta = async ({
},
});
const $ = cheerio.load(response.data);
const infoContainer = $(".entry-content,.post-inner");
const heading = infoContainer?.find("h3");
const imdbId =
//@ts-ignore
heading?.next("p")?.find("a")?.[0]?.attribs?.href?.match(/tt\d+/g)?.[0] ||
infoContainer.text().match(/tt\d+/g)?.[0] ||
"";
// console.log(imdbId)
const infoContainer = $(
".entry-content, .post-inner, .post-content, .page-body",
);
const type = heading?.next("p")?.text()?.includes("Series Name")
? "series"
: "movie";
// console.log(type);
// title
let title = $("h1.post-title").text().trim();
if (!title) {
const heading = infoContainer?.find("h3");
const titleRegex = /Name: (.+)/;
const title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || "";
title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || "";
}
// console.log(title);
// imdbId
let imdbId =
$('a[href*="imdb.com"]').attr("href")?.match(/tt\d+/)?.[0] || "";
if (!imdbId) {
const heading = infoContainer?.find("h3");
imdbId =
//@ts-ignore
heading
?.next("p")
?.find("a")?.[0]
?.attribs?.href?.match(/tt\d+/g)?.[0] ||
infoContainer.text().match(/tt\d+/g)?.[0] ||
"";
}
// console.log(imdbId)
// type
let type = "movie";
const heading = infoContainer?.find("h3");
if (heading?.next("p")?.text()?.includes("Series Name")) {
type = "series";
}
// console.log(type);
// synopsis
let synopsis = "";
const synopsisHeader = $("h3").filter(
(i, el) =>
$(el).text().includes("SYNOPSIS/PLOT") || $(el).text().includes("Plot"),
);
if (synopsisHeader.length > 0) {
synopsis = synopsisHeader.next("p").text().trim();
}
if (!synopsis) {
const synopsisNode = //@ts-ignore
infoContainer?.find("p")?.next("h3,h4")?.next("p")?.[0]?.children?.[0];
const synopsis =
synopsis =
synopsisNode && "data" in synopsisNode ? synopsisNode.data : "";
}
// console.log(synopsis);
// image
let image =
infoContainer?.find("img[data-lazy-src]")?.attr("data-lazy-src") || "";
infoContainer?.find("img[data-lazy-src]")?.attr("data-lazy-src") ||
infoContainer
?.find("img")
?.filter((i, el) => {
const src = $(el).attr("src");
return (
!!src &&
!src.includes("logo") &&
!src.includes("svg") &&
!src.includes("placeholder") &&
!src.includes("icon")
);
})
?.first()
?.attr("src") ||
"";
if (image.startsWith("//")) {
image = "https:" + image;
}
// console.log(image);
// console.log({title, synopsis, image, imdbId, type});
console.log({ title, synopsis, image, imdbId, type });
/// Links
const hr = infoContainer?.first()?.find("hr");
let hr = infoContainer?.first()?.find("hr");
// Try to find the HR before the download buttons if possible
const firstButton = $(".dwd-button").first();
if (firstButton.length > 0) {
const containerP = firstButton.closest("p");
let prev = containerP.prev();
while (prev.length && !prev.is("hr")) {
prev = prev.prev();
}
if (prev.is("hr")) {
hr = prev;
}
}
const list = hr?.nextUntil("hr");
const links: Link[] = [];
list.each((index, element: any) => {
@@ -86,24 +147,26 @@ export const getMeta = async ({
const quality = element?.text().match(/\d+p\b/)?.[0] || "";
// console.log(title);
// movieLinks
const movieLinks = element
const movieLinks =
element
?.next()
.find(".dwd-button")
.text()
.toLowerCase()
.includes("download")
? 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
const vcloudLinks = element
?.next()
.find(
".btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: white;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: #fdf8f2;']"
".btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: white;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: #fdf8f2;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152);color: white']",
)
?.parent()
?.attr("href");
console.log(title);
const episodesLink =
(vcloudLinks
? vcloudLinks
@@ -118,7 +181,7 @@ export const getMeta = async ({
element
?.next()
.find(
".btn-outline[style='background:linear-gradient(135deg,#0ebac3,#09d261); color: white;']"
".btn-outline[style='background:linear-gradient(135deg,#0ebac3,#09d261); color: white;']",
)
?.parent()
?.attr("href");

View File

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

View File

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

View File

@@ -40,34 +40,81 @@ export const getMeta = async ({
},
});
const $ = cheerio.load(response.data);
const infoContainer = $(".entry-content,.post-inner");
const heading = infoContainer?.find("h3");
const imdbId =
//@ts-ignore
heading?.next("p")?.find("a")?.[0]?.attribs?.href?.match(/tt\d+/g)?.[0] ||
infoContainer.text().match(/tt\d+/g)?.[0] ||
"";
// console.log(imdbId)
const infoContainer = $(
".entry-content, .post-inner, .post-content, .page-body",
);
const type = heading?.next("p")?.text()?.includes("Series Name")
? "series"
: "movie";
// console.log(type);
// title
let title = $("h1.post-title").text().trim();
if (!title) {
const heading = infoContainer?.find("h3");
const titleRegex = /Name: (.+)/;
const title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || "";
title = heading?.next("p")?.text()?.match(titleRegex)?.[1] || "";
}
// console.log(title);
// imdbId
let imdbId =
$('a[href*="imdb.com"]').attr("href")?.match(/tt\d+/)?.[0] || "";
if (!imdbId) {
const heading = infoContainer?.find("h3");
imdbId =
//@ts-ignore
heading
?.next("p")
?.find("a")?.[0]
?.attribs?.href?.match(/tt\d+/g)?.[0] ||
infoContainer.text().match(/tt\d+/g)?.[0] ||
"";
}
// console.log(imdbId)
// type
let type = "movie";
const heading = infoContainer?.find("h3");
if (heading?.next("p")?.text()?.includes("Series Name")) {
type = "series";
}
// console.log(type);
// synopsis
let synopsis = "";
const synopsisHeader = $("h3").filter(
(i, el) =>
$(el).text().includes("SYNOPSIS/PLOT") || $(el).text().includes("Plot"),
);
if (synopsisHeader.length > 0) {
synopsis = synopsisHeader.next("p").text().trim();
}
if (!synopsis) {
const synopsisNode = //@ts-ignore
infoContainer?.find("p")?.next("h3,h4")?.next("p")?.[0]?.children?.[0];
const synopsis =
synopsis =
synopsisNode && "data" in synopsisNode ? synopsisNode.data : "";
}
// console.log(synopsis);
// image
let image =
infoContainer?.find("img[data-lazy-src]")?.attr("data-lazy-src") || "";
infoContainer?.find("img[data-lazy-src]")?.attr("data-lazy-src") ||
infoContainer
?.find("img")
?.filter((i, el) => {
const src = $(el).attr("src");
return (
!!src &&
!src.includes("logo") &&
!src.includes("svg") &&
!src.includes("placeholder") &&
!src.includes("icon")
);
})
?.first()
?.attr("src") ||
"";
if (image.startsWith("//")) {
image = "https:" + image;
}
@@ -75,7 +122,21 @@ export const getMeta = async ({
console.log({ title, synopsis, image, imdbId, type });
/// Links
const hr = infoContainer?.first()?.find("hr");
let hr = infoContainer?.first()?.find("hr");
// Try to find the HR before the download buttons if possible
const firstButton = $(".dwd-button").first();
if (firstButton.length > 0) {
const containerP = firstButton.closest("p");
let prev = containerP.prev();
while (prev.length && !prev.is("hr")) {
prev = prev.prev();
}
if (prev.is("hr")) {
hr = prev;
}
}
const list = hr?.nextUntil("hr");
const links: Link[] = [];
list.each((index, element: any) => {
@@ -86,20 +147,23 @@ export const getMeta = async ({
const quality = element?.text().match(/\d+p\b/)?.[0] || "";
// console.log(title);
// movieLinks
const movieLinks = element
const movieLinks =
element
?.next()
.find(".dwd-button")
.text()
.toLowerCase()
.includes("download")
? 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
const vcloudLinks = element
?.next()
.find(
".btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: white;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: #fdf8f2;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152);color: white']"
".btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: white;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152); color: #fdf8f2;'],.btn-outline[style='background:linear-gradient(135deg,#ed0b0b,#f2d152);color: white']",
)
?.parent()
?.attr("href");
@@ -117,7 +181,7 @@ export const getMeta = async ({
element
?.next()
.find(
".btn-outline[style='background:linear-gradient(135deg,#0ebac3,#09d261); color: white;']"
".btn-outline[style='background:linear-gradient(135deg,#0ebac3,#09d261); color: white;']",
)
?.parent()
?.attr("href");

View File

@@ -60,10 +60,39 @@ export const getSearchPosts = async ({
const baseUrl = await getBaseUrl("Vega");
console.log("vegaGetPosts baseUrl:", providerValue, baseUrl);
const url = `${baseUrl}/page/${page}/?s=${searchQuery}`;
const url = `${baseUrl}/search.php?q=${searchQuery}&page=${page}`;
console.log("vegaGetPosts url:", url);
return posts(baseUrl, url, signal, headers, axios, cheerio);
try {
const response = await axios.get(url, {
headers: {
...headers,
Referer: baseUrl,
},
signal,
});
const data = response.data;
const posts: Post[] = [];
if (data?.hits) {
data.hits.forEach((hit: any) => {
const doc = hit.document;
const post = {
title: doc.post_title.replace("Download", "").trim(),
link: doc.permalink.startsWith("http")
? doc.permalink
: `${baseUrl}${doc.permalink}`,
image: doc.post_thumbnail,
};
posts.push(post);
});
}
return posts;
} catch (error) {
console.error("vegaGetSearchPosts error:", error);
return [];
}
};
async function posts(
@@ -72,7 +101,7 @@ async function posts(
signal: AbortSignal,
headers: Record<string, string> = {},
axios: ProviderContext["axios"],
cheerio: ProviderContext["cheerio"]
cheerio: ProviderContext["cheerio"],
): Promise<Post[]> {
try {
const urlRes = await fetch(url, {
@@ -84,31 +113,39 @@ async function posts(
});
const $ = cheerio.load(await urlRes.text());
const posts: Post[] = [];
$(".blog-items,.post-list,#archive-container")
?.children("article,.entry-list-item")
$(".blog-items,.post-list,#archive-container,.movies-grid")
?.children("article,.entry-list-item,a")
?.each((index, element) => {
const post = {
title: (
$(element)
?.find(".entry-title")
?.find(".entry-title,.poster-title")
?.text()
?.replace("Download", "")
?.match(/^(.*?)\s*\((\d{4})\)|^(.*?)\s*\((Season \d+)\)/)?.[0] ||
$(element)?.find("a")?.attr("title")?.replace("Download", "") ||
$(element)?.find(".post-title").text()?.replace("Download", "") ||
$(element)
?.find(".post-title,.poster-title")
.text()
?.replace("Download", "") ||
""
).trim(),
link: $(element)?.find("a")?.attr("href") || "",
link:
$(element)?.find("a")?.attr("href") ||
$(element)?.attr("href") ||
"",
image:
$(element).find("a").find("img").attr("data-lazy-src") ||
$(element).find("a").find("img").attr("data-src") ||
$(element).find("a").find("img").attr("src") ||
$(element).find("img").attr("src") ||
"",
};
if (post.image.startsWith("//")) {
post.image = "https:" + post.image;
}
console.log("vegaGetPosts post:", post);
posts.push(post);
});

View File

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

View File

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