From e49bd6a1717906a1301682b63ade0d6126c5f589 Mon Sep 17 00:00:00 2001 From: himanshu8443 Date: Wed, 16 Jul 2025 16:44:04 +0530 Subject: [PATCH] feat: add moviebox --- dist/movieBox/catalog.js | 1 + dist/movieBox/episodes.js | 1 + dist/movieBox/meta.js | 1 + dist/movieBox/posts.js | 1 + dist/movieBox/stream.js | 1 + dist/vega/stream.js | 2 +- providers/movieBox/catalog.ts | 12 +++++ providers/movieBox/episodes.ts | 49 ++++++++++++++++++ providers/movieBox/meta.ts | 76 ++++++++++++++++++++++++++++ providers/movieBox/posts.ts | 90 ++++++++++++++++++++++++++++++++++ providers/movieBox/stream.ts | 27 ++++++++++ 11 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 dist/movieBox/catalog.js create mode 100644 dist/movieBox/episodes.js create mode 100644 dist/movieBox/meta.js create mode 100644 dist/movieBox/posts.js create mode 100644 dist/movieBox/stream.js create mode 100644 providers/movieBox/catalog.ts create mode 100644 providers/movieBox/episodes.ts create mode 100644 providers/movieBox/meta.ts create mode 100644 providers/movieBox/posts.ts create mode 100644 providers/movieBox/stream.ts diff --git a/dist/movieBox/catalog.js b/dist/movieBox/catalog.js new file mode 100644 index 0000000..261d14b --- /dev/null +++ b/dist/movieBox/catalog.js @@ -0,0 +1 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.genres=exports.catalog=void 0,exports.catalog=[{title:"Trending",filter:"2"},{title:"Cinema",filter:"5"}],exports.genres=[]; \ No newline at end of file diff --git a/dist/movieBox/episodes.js b/dist/movieBox/episodes.js new file mode 100644 index 0000000..f85d031 --- /dev/null +++ b/dist/movieBox/episodes.js @@ -0,0 +1 @@ +"use strict";var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getEpisodes=void 0;const getEpisodes=function(_a){return __awaiter(this,arguments,void 0,function*({url:url,providerContext:providerContext}){var _b;const{axios:axios,cheerio:cheerio}=providerContext;try{const episodeLinks=[],response=yield fetch("https://dob-worker.8man.workers.dev",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:url,method:"GET"})}),data=yield response.json();return((null===(_b=null==data?void 0:data.data)||void 0===_b?void 0:_b.list)||[]).forEach(item=>{const seriesTitle=(null==item?void 0:item.ep)?`S-${null==item?void 0:item.se} E-${null==item?void 0:item.ep}`:(null==item?void 0:item.title)||"",episodesLink=(null==item?void 0:item.resourceLink)||"";episodesLink&&episodeLinks.push({title:seriesTitle.trim(),link:JSON.stringify({url:episodesLink,title:seriesTitle.trim()})})}),episodeLinks}catch(err){return[]}})};exports.getEpisodes=getEpisodes; \ No newline at end of file diff --git a/dist/movieBox/meta.js b/dist/movieBox/meta.js new file mode 100644 index 0000000..857217a --- /dev/null +++ b/dist/movieBox/meta.js @@ -0,0 +1 @@ +"use strict";var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getMeta=void 0;const getMeta=function(_a){return __awaiter(this,arguments,void 0,function*({link:link,providerContext:providerContext}){var _b,_c,_d;try{const{axios:axios,cheerio:cheerio,getBaseUrl:getBaseUrl}=providerContext,baseUrl=getBaseUrl("movieBox"),links=[],response=yield fetch("https://dob-worker.8man.workers.dev",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:link,method:"GET"})}),data=(yield response.json()).data,title=((null==data?void 0:data.title)||"").replace(/\s*\[.*?\]\s*$/,""),synopsis=(null==data?void 0:data.description)||"",image=(null===(_b=null==data?void 0:data.cover)||void 0===_b?void 0:_b.url)||"",rating=(null==data?void 0:data.imdbRatingValue)||"",tags=(null===(_d=null===(_c=null==data?void 0:data.genre)||void 0===_c?void 0:_c.split(","))||void 0===_d?void 0:_d.map(tag=>tag.trim()))||[],dubs=(null==data?void 0:data.dubs)||[];return null==dubs||dubs.forEach(dub=>{const link={title:null==dub?void 0:dub.lanName,episodesLink:`${baseUrl}/wefeed-mobile-bff/subject-api/resource?subjectId=${null==dub?void 0:dub.subjectId}&page=1&perPage=20&all=0&startPosition=1&endPosition=1&pagerMode=0&resolution=1080&se=1&epFrom=1&epTo=1`};links.push(link)}),{title:title,synopsis:synopsis,image:image,rating:rating,tags:tags,imdbId:"",type:"movie",linkList:links}}catch(err){return{title:"",synopsis:"",image:"",imdbId:"",type:"movie",linkList:[]}}})};exports.getMeta=getMeta; \ No newline at end of file diff --git a/dist/movieBox/posts.js b/dist/movieBox/posts.js new file mode 100644 index 0000000..df113de --- /dev/null +++ b/dist/movieBox/posts.js @@ -0,0 +1 @@ +"use strict";var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getSearchPosts=exports.getPosts=void 0;const getPosts=function(_a){return __awaiter(this,arguments,void 0,function*({filter:filter,page:page,signal:signal,providerContext:providerContext}){var _b,_c,_d,_e;const posts=[],{getBaseUrl:getBaseUrl}=providerContext;if(page>1)return posts;const baseUrl=getBaseUrl("movieBox"),url=`${baseUrl}/wefeed-mobile-bff/tab-operating?page=3&tabId=0&version=2fe0d7c224603ff7b0df294b46d3b84b`,response=yield fetch("https://dob-worker.8man.workers.dev",{signal:signal,method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:url,method:"GET"})}),data=yield response.json(),list=null===(_d=null===(_c=null===(_b=null==data?void 0:data.data)||void 0===_b?void 0:_b.items)||void 0===_c?void 0:_c[parseInt(filter)])||void 0===_d?void 0:_d.subjects;for(const item of list){const post={image:null==item?void 0:item.cover.url,title:null===(_e=null==item?void 0:item.title)||void 0===_e?void 0:_e.replace(/\s*\[.*?\]\s*$/,""),link:`${baseUrl}/wefeed-mobile-bff/subject-api/get?subjectId=${null==item?void 0:item.subjectId}`};posts.push(post)}return posts})};exports.getPosts=getPosts;const getSearchPosts=function(_a){return __awaiter(this,arguments,void 0,function*({searchQuery:searchQuery,page:page,signal:signal,providerContext:providerContext}){var _b,_c,_d;const{getBaseUrl:getBaseUrl,axios:axios,cheerio:cheerio}=providerContext,baseUrl=getBaseUrl("movieBox"),url=`${baseUrl}/wefeed-mobile-bff/subject-api/search/v2`;if(page>1)return[];const response=yield fetch("https://dob-worker.8man.workers.dev",{signal:signal,method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:url,method:"POST",body:{page:1,perPage:20,keyword:searchQuery,tabId:"Movie"}})}),data=yield response.json(),posts=((null===(_d=null===(_c=null===(_b=null==data?void 0:data.data)||void 0===_b?void 0:_b.results)||void 0===_c?void 0:_c[0])||void 0===_d?void 0:_d.subjects)||[]).map(item=>{var _a;return{image:null===(_a=null==item?void 0:item.cover)||void 0===_a?void 0:_a.url,title:null==item?void 0:item.title,link:`${baseUrl}/wefeed-mobile-bff/subject-api/get?subjectId=${null==item?void 0:item.subjectId}`}});return posts})};exports.getSearchPosts=getSearchPosts; \ No newline at end of file diff --git a/dist/movieBox/stream.js b/dist/movieBox/stream.js new file mode 100644 index 0000000..6a6299a --- /dev/null +++ b/dist/movieBox/stream.js @@ -0,0 +1 @@ +"use strict";var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getStream=void 0;const getStream=function(_a){return __awaiter(this,arguments,void 0,function*({link:url,type:type,providerContext:providerContext}){const{axios:axios,cheerio:cheerio}=providerContext;try{const stream=[],data=JSON.parse(url);return stream.push({link:data.url,server:data.title||"Unknown Server",type:"mp4"}),stream}catch(err){return[]}})};exports.getStream=getStream; \ No newline at end of file diff --git a/dist/vega/stream.js b/dist/vega/stream.js index fe6aeec..08d59c9 100644 --- a/dist/vega/stream.js +++ b/dist/vega/stream.js @@ -1 +1 @@ -"use strict";var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getStream=getStream;const headers={Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Cache-Control":"no-store","Accept-Language":"en-US,en;q=0.9",DNT:"1","sec-ch-ua":'"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',"sec-ch-ua-mobile":"?0","sec-ch-ua-platform":'"Windows"',"Sec-Fetch-Dest":"document","Sec-Fetch-Mode":"navigate","Sec-Fetch-Site":"none","Sec-Fetch-User":"?1",Cookie:"_lscache_vary=62abf8b96599676eb8ec211cffaeb8ff; ext_name=ojplmecpdpgccookcobabopnaifgidhf; cf_clearance=n4Y1XTKZ5TfIMBNQuAXzerwKpx0U35KoOm3imfT0GpU-1732097818-1.2.1.1-ZeAnEu.8D9TSZHYDoj7vwo1A1rpdKl304ZpaBn_QbAQOr211JFAb7.JRQU3EL2eIy1Dfl8HhYvH7_259.22lUz8gbchHcQ8hvfuQXMtFMCbqDBLzjNUZa9stuk.39l28IcPhH9Z2szsf3SGtNI1sAfo66Djt7sOReLK3lHw9UkJp7BdGqt6a2X9qAc8EsAI3lE480Tmt0fkHv14Oc30LSbPB_WwFmiqAki2W.Gv9hV7TN_QBFESleTDlXd.6KGflfd4.KwWF7rpSRo_cgoc9ALLLIafpxHVbe7_g5r7zvpml_Pj8fEL75fw.1GBuy16bciHBuB8s_kahuJYUnhtQFFgfTQl8_Gn6KeovBWx.PJ7nFv5sklHUfAyBVq3t30xKe8ZDydsQ_G.yipfj_In5GmmWcXGb6E4.bioDOwW_sKLtxwdTQt7Nu.RkILX_mKvXNpyLqflIVj8G7X5E8I.unw","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"};function getStream(_a){return __awaiter(this,arguments,void 0,function*({link:link,type:type,signal:signal,providerContext:providerContext}){var _b,_c,_d,_e;const{axios:axios,cheerio:cheerio,extractors:extractors}=providerContext,{hubcloudExtracter:hubcloudExtracter}=extractors;try{const streamLinks=[];if("movie"===type){const dotlinkText=(yield axios(`${link}`,{headers:headers})).data;link=(dotlinkText.match(/ { + const { axios, cheerio } = providerContext; + try { + const episodeLinks: EpisodeLink[] = []; + + const response = await fetch("https://dob-worker.8man.workers.dev", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + url: url, + method: "GET", + }), + }); + + const data = await response.json(); + const list = data?.data?.list || []; + + list.forEach((item: any) => { + const seriesTitle = item?.ep + ? `S-${item?.se} E-${item?.ep}` + : item?.title || ""; + const episodesLink = item?.resourceLink || ""; + if (episodesLink) { + episodeLinks.push({ + title: seriesTitle.trim(), + link: JSON.stringify({ + url: episodesLink, + title: seriesTitle.trim(), + }), + }); + } + }); + + return episodeLinks; + } catch (err) { + console.error(err); + return []; + } +}; diff --git a/providers/movieBox/meta.ts b/providers/movieBox/meta.ts new file mode 100644 index 0000000..cdc0c94 --- /dev/null +++ b/providers/movieBox/meta.ts @@ -0,0 +1,76 @@ +import { Info, Link, ProviderContext } from "../types"; + +export const getMeta = async function ({ + link, + providerContext, +}: { + link: string; + providerContext: ProviderContext; +}): Promise { + try { + const { axios, cheerio, getBaseUrl } = providerContext; + const baseUrl = getBaseUrl("movieBox"); + const links: Link[] = []; + // this is just a proxy please host your own if you want to use this code:- https://github.com/himanshu8443/Cf-Workers/blob/main/src/dob-worker/index.js + const response = await fetch("https://dob-worker.8man.workers.dev", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + url: link, + method: "GET", + }), + }); + const data = (await response.json()).data; + console.log("data", data); + + // metadata + const title = (data?.title || "").replace(/\s*\[.*?\]\s*$/, ""); + const synopsis = data?.description || ""; + const image = data?.cover?.url || ""; + const rating = data?.imdbRatingValue || ""; + const tags = + data?.genre?.split(",")?.map((tag: string) => tag.trim()) || []; + + const dubs = data?.dubs || []; + + dubs?.forEach((dub: any) => { + const link: Link = { + title: dub?.lanName, + episodesLink: `${baseUrl}/wefeed-mobile-bff/subject-api/resource?subjectId=${dub?.subjectId}&page=1&perPage=20&all=0&startPosition=1&endPosition=1&pagerMode=0&resolution=1080&se=1&epFrom=1&epTo=1`, + }; + links.push(link); + }); + + console.log("meta", { + title, + synopsis, + image, + rating, + tags, + links, + }); + + return { + title, + synopsis, + image, + rating, + tags, + imdbId: "", + type: "movie", + linkList: links, + }; + } catch (err) { + console.error(err); + return { + title: "", + synopsis: "", + image: "", + imdbId: "", + type: "movie", + linkList: [], + }; + } +}; diff --git a/providers/movieBox/posts.ts b/providers/movieBox/posts.ts new file mode 100644 index 0000000..f635151 --- /dev/null +++ b/providers/movieBox/posts.ts @@ -0,0 +1,90 @@ +import { Post, ProviderContext } from "../types"; + +export const getPosts = async function ({ + filter, + page, + signal, + providerContext, +}: { + filter: string; + page: number; + providerValue: string; + signal: AbortSignal; + providerContext: ProviderContext; +}): Promise { + const posts: Post[] = []; + const { getBaseUrl } = providerContext; + if (page > 1) { + return posts; + } + const baseUrl = getBaseUrl("movieBox"); + const url = `${baseUrl}/wefeed-mobile-bff/tab-operating?page=3&tabId=0&version=2fe0d7c224603ff7b0df294b46d3b84b`; + + const response = await fetch("https://dob-worker.8man.workers.dev", { + signal: signal, + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + url: url, + method: "GET", + }), + }); + + const data = await response.json(); + const list = data?.data?.items?.[parseInt(filter)]?.subjects; + console.log("list", list); + for (const item of list) { + const post: Post = { + image: item?.cover.url, + title: item?.title?.replace(/\s*\[.*?\]\s*$/, ""), + link: `${baseUrl}/wefeed-mobile-bff/subject-api/get?subjectId=${item?.subjectId}`, + }; + posts.push(post); + } + return posts; +}; + +export const getSearchPosts = async function ({ + searchQuery, + page, + signal, + providerContext, +}: { + searchQuery: string; + page: number; + providerValue: string; + signal: AbortSignal; + providerContext: ProviderContext; +}): Promise { + const { getBaseUrl, axios, cheerio } = providerContext; + const baseUrl = getBaseUrl("movieBox"); + const url = `${baseUrl}/wefeed-mobile-bff/subject-api/search/v2`; + if (page > 1) { + return []; + } + + // this is just a proxy please host your own if you want to use this code:- https://github.com/himanshu8443/Cf-Workers/blob/main/src/dob-worker/index.js + const response = await fetch("https://dob-worker.8man.workers.dev", { + signal: signal, + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + url: url, + method: "POST", + body: { page: 1, perPage: 20, keyword: searchQuery, tabId: "Movie" }, + }), + }); + + const data = await response.json(); + const list = data?.data?.results?.[0]?.subjects || []; + const posts: Post[] = list.map((item: any) => ({ + image: item?.cover?.url, + title: item?.title, + link: `${baseUrl}/wefeed-mobile-bff/subject-api/get?subjectId=${item?.subjectId}`, + })); + return posts; +}; diff --git a/providers/movieBox/stream.ts b/providers/movieBox/stream.ts new file mode 100644 index 0000000..3c3d8a2 --- /dev/null +++ b/providers/movieBox/stream.ts @@ -0,0 +1,27 @@ +import { Stream, ProviderContext, EpisodeLink } from "../types"; + +export const getStream = async function ({ + link: url, + type, + providerContext, +}: { + link: string; + type: string; + providerContext: ProviderContext; +}): Promise { + const { axios, cheerio } = providerContext; + try { + const stream: Stream[] = []; + const data = JSON.parse(url); + stream.push({ + link: data.url, + server: data.title || "Unknown Server", + type: "mp4", + }); + console.log("stream", stream); + return stream; + } catch (err) { + console.log("getStream error", err); + return []; + } +};