fix: encode file links in getEpisodes and getMeta for proper URL handling

This commit is contained in:
himanshu8443
2025-08-15 16:13:25 +05:30
parent f0c98f9d0a
commit 7689fbce6e
4 changed files with 4 additions and 4 deletions

View File

@@ -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.getEpisodes=void 0;const getEpisodes=function(_a){return __awaiter(this,arguments,void 0,function*({url:url,providerContext:providerContext}){const{axios:axios,cheerio:cheerio}=providerContext;try{const html=(yield axios.get(url)).data,$=cheerio.load(html),episodeLinks=[];return $("table tbody tr").each((i,element)=>{const linkElement=$(element).find("td:first-child a"),fileName=linkElement.text().trim(),fileLink=linkElement.attr("href");if(fileName&&fileLink&&"../"!==fileName&&"Parent Directory"!==fileName&&(fileName.includes(".mp4")||fileName.includes(".mkv")||fileName.includes(".avi")||fileName.includes(".mov"))){const fullLink=url+fileLink;let episodeTitle=fileName;const episodeMatch=fileName.match(/[Ss](\d+)[Ee](\d+)/),simpleEpisodeMatch=fileName.match(/[Ee](\d+)/);if(episodeMatch)episodeTitle=`S${episodeMatch[1]}E${episodeMatch[2]} - ${fileName}`;else if(simpleEpisodeMatch)episodeTitle=`Episode ${simpleEpisodeMatch[1]} - ${fileName}`;else{const numberMatch=fileName.match(/(\d+)/);numberMatch&&(episodeTitle=`Episode ${numberMatch[1]} - ${fileName}`)}episodeLinks.push({title:episodeTitle,link:fullLink})}}),episodeLinks}catch(err){return[]}})};exports.getEpisodes=getEpisodes; "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}){const{axios:axios,cheerio:cheerio}=providerContext;try{const html=(yield axios.get(url)).data,$=cheerio.load(html),episodeLinks=[];return $("table tbody tr").each((i,element)=>{const linkElement=$(element).find("td:first-child a"),fileName=linkElement.text().trim(),fileLink=linkElement.attr("href");if(fileName&&fileLink&&"../"!==fileName&&"Parent Directory"!==fileName&&(fileName.includes(".mp4")||fileName.includes(".mkv")||fileName.includes(".avi")||fileName.includes(".mov"))){const fullLink=encodeURIComponent(fileLink);let episodeTitle=fileName;const episodeMatch=fileName.match(/[Ss](\d+)[Ee](\d+)/),simpleEpisodeMatch=fileName.match(/[Ee](\d+)/);if(episodeMatch)episodeTitle=`S${episodeMatch[1]}E${episodeMatch[2]} - ${fileName}`;else if(simpleEpisodeMatch)episodeTitle=`Episode ${simpleEpisodeMatch[1]} - ${fileName}`;else{const numberMatch=fileName.match(/(\d+)/);numberMatch&&(episodeTitle=`Episode ${numberMatch[1]} - ${fileName}`)}episodeLinks.push({title:episodeTitle,link:fullLink})}}),episodeLinks}catch(err){return[]}})};exports.getEpisodes=getEpisodes;

View File

@@ -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.getMeta=void 0;const getMeta=function(_a){return __awaiter(this,arguments,void 0,function*({link:link,providerContext:providerContext}){try{const{axios:axios,cheerio:cheerio}=providerContext,url=link,data=(yield axios.get(url)).data,$=cheerio.load(data),title=($("h1").text().trim()||url.split("/").filter(Boolean).pop()||"").replace("Index of /","").replace(/\/$/,""),links=[],directLinks=[];$("table tbody tr").each((i,element)=>{const linkElement=$(element).find("td:first-child a"),itemTitle=linkElement.text().trim(),itemLink=linkElement.attr("href");if(itemTitle&&itemLink&&"../"!==itemTitle&&"Parent Directory"!==itemTitle){const fullLink=link+itemLink;if(itemTitle.endsWith("/")){const cleanTitle=itemTitle.replace(/\/$/,"");links.push({episodesLink:fullLink,title:cleanTitle})}else(itemTitle.includes(".mp4")||itemTitle.includes(".mkv")||itemTitle.includes(".avi")||itemTitle.includes(".mov"))&&directLinks.push({title:itemTitle,link:fullLink})}}),directLinks.length>0&&links.push({title:title+" (Direct Files)",directLinks:directLinks});const type=links.some(link=>{var _a,_b;return(null===(_a=link.episodesLink)||void 0===_a?void 0:_a.includes("Season"))||(null===(_b=link.episodesLink)||void 0===_b?void 0:_b.includes("S0"))})||directLinks.length>1?"series":"movie";return{title:title,synopsis:"Content from 111477.xyz directory",image:`https://placehold.jp/23/000000/ffffff/300x450.png?text=${encodeURIComponent(title)}&css=%7B%22background%22%3A%22%20-webkit-gradient(linear%2C%20left%20bottom%2C%20left%20top%2C%20from(%233f3b3b)%2C%20to(%23000000))%22%2C%22text-transform%22%3A%22%20capitalize%22%7D`,imdbId:"",type:type,linkList:links}}catch(err){return{title:"",synopsis:"",image:"",imdbId:"",type:"movie",linkList:[]}}})};exports.getMeta=getMeta; "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}){try{const{axios:axios,cheerio:cheerio}=providerContext,url=link,data=(yield axios.get(url)).data,$=cheerio.load(data),title=($("h1").text().trim()||url.split("/").filter(Boolean).pop()||"").replace("Index of /","").replace(/\/$/,""),links=[],directLinks=[];$("table tbody tr").each((i,element)=>{const linkElement=$(element).find("td:first-child a"),itemTitle=linkElement.text().trim(),itemLink=linkElement.attr("href");if(itemTitle&&itemLink&&"../"!==itemTitle&&"Parent Directory"!==itemTitle){const fullLink=encodeURIComponent(itemLink);if(itemTitle.endsWith("/")){const cleanTitle=itemTitle.replace(/\/$/,"");links.push({episodesLink:fullLink,title:cleanTitle})}else(itemTitle.includes(".mp4")||itemTitle.includes(".mkv")||itemTitle.includes(".avi")||itemTitle.includes(".mov"))&&directLinks.push({title:itemTitle,link:fullLink})}}),directLinks.length>0&&links.push({title:title+" (Direct Files)",directLinks:directLinks});const type=links.some(link=>{var _a,_b;return(null===(_a=link.episodesLink)||void 0===_a?void 0:_a.includes("Season"))||(null===(_b=link.episodesLink)||void 0===_b?void 0:_b.includes("S0"))})||directLinks.length>1?"series":"movie";return{title:title,synopsis:"Content from 111477.xyz directory",image:`https://placehold.jp/23/000000/ffffff/300x450.png?text=${encodeURIComponent(title)}&css=%7B%22background%22%3A%22%20-webkit-gradient(linear%2C%20left%20bottom%2C%20left%20top%2C%20from(%233f3b3b)%2C%20to(%23000000))%22%2C%22text-transform%22%3A%22%20capitalize%22%7D`,imdbId:"",type:type,linkList:links}}catch(err){return{title:"",synopsis:"",image:"",imdbId:"",type:"movie",linkList:[]}}})};exports.getMeta=getMeta;

View File

@@ -34,7 +34,7 @@ export const getEpisodes = async function ({
fileName.includes(".avi") || fileName.includes(".avi") ||
fileName.includes(".mov") fileName.includes(".mov")
) { ) {
const fullLink = url + fileLink; const fullLink = encodeURIComponent(fileLink);
// Try to extract episode information from filename // Try to extract episode information from filename
let episodeTitle = fileName; let episodeTitle = fileName;

View File

@@ -35,7 +35,7 @@ export const getMeta = async function ({
itemTitle !== "../" && itemTitle !== "../" &&
itemTitle !== "Parent Directory" itemTitle !== "Parent Directory"
) { ) {
const fullLink = link + itemLink; const fullLink = encodeURIComponent(itemLink);
// If it's a directory (ends with /) // If it's a directory (ends with /)
if (itemTitle.endsWith("/")) { if (itemTitle.endsWith("/")) {