2022-01-31 17:28:14 +01:00
import Fuse from 'fuse.js'
2022-01-31 01:39:28 +01:00
const BASE _URL = ` ${ process . env . REACT _APP _CORS _PROXY _URL } https://xemovie.co ` ;
async function findContent ( searchTerm , type ) {
try {
let results ;
const searchUrl = ` ${ BASE _URL } /search?q= ${ encodeURIComponent ( searchTerm ) } ` ;
const searchRes = await fetch ( searchUrl ) . then ( ( d ) => d . text ( ) ) ;
const parser = new DOMParser ( ) ;
const doc = parser . parseFromString ( searchRes , "text/html" ) ;
switch ( type ) {
case 'show' :
// const showContainer = doc.querySelectorAll(".py-10")[1].querySelector(".grid");
// const showNodes = [...showContainer.querySelectorAll("a")].filter(link => !link.className);
// results = showNodes.map(node => {
// node = node.parentElement
// return {
// type,
// title: [...new Set(node.innerText.split("\n"))][1].split("(")[0].trim(),
// year: [...new Set(node.innerText.split("\n"))][3],
// slug: node.querySelector("a").href.split('/').pop(),
// source: "xemovie"
// }
// })
// break;
return { options : [ ] } ;
case 'movie' :
const movieContainer = doc . querySelectorAll ( ".py-10" ) [ 0 ] . querySelector ( ".grid" ) ;
const movieNodes = [ ... movieContainer . querySelectorAll ( "a" ) ] . filter ( link => ! link . className ) ;
results = movieNodes . map ( node => {
node = node . parentElement
return {
type ,
title : [ ... new Set ( node . innerText . split ( "\n" ) ) ] [ 1 ] . split ( "(" ) [ 0 ] . trim ( ) ,
year : [ ... new Set ( node . innerText . split ( "\n" ) ) ] [ 3 ] ,
slug : node . querySelector ( "a" ) . href . split ( '/' ) . pop ( ) ,
source : "xemovie"
}
} )
break ;
default :
results = [ ] ;
break ;
}
2022-01-31 17:28:14 +01:00
const fuse = new Fuse ( results , { threshold : 0.3 , keys : [ "title" ] } ) ;
const matchedResults = fuse
. search ( searchTerm )
. map ( result => result . item ) ;
if ( matchedResults . length === 0 ) {
return { options : [ ] } ;
}
if ( matchedResults . length > 1 ) {
const res = { options : [ ] } ;
matchedResults . forEach ( ( r ) => res . options . push ( {
title : r . title ,
slug : r . slug ,
type : r . type ,
year : r . year ,
source : 'xemovie'
} ) ) ;
return res ;
} else {
const { title , slug , type , year } = matchedResults [ 0 ] ;
return {
options : [ { title , slug , type , year , source : 'xemovie' } ]
}
}
2022-01-31 01:39:28 +01:00
} catch {
return { options : [ ] } ;
}
}
async function getStreamUrl ( slug , type , season , episode ) {
let url ;
if ( type === "show" ) {
} else {
url = ` ${ BASE _URL } /movies/ ${ slug } /watch ` ;
}
let mediaUrl = "" ;
let subtitles = [ ] ;
const res = await fetch ( url ) . then ( d => d . text ( ) ) ;
const DOM = new DOMParser ( ) . parseFromString ( res , "text/html" ) ;
for ( const script of DOM . scripts ) {
if ( script . textContent . match ( /https:\/\/s[0-9]\.xemovie\.com/ ) ) {
// eslint-disable-next-line
let data = JSON . parse ( JSON . stringify ( eval ( ` ( ${ script . textContent . replace ( "const data = " , "" ) . split ( "};" ) [ 0 ] } }) ` ) ) ) ;
// eslint-disable-next-line
mediaUrl = data . playlist [ 0 ] . file ;
// eslint-disable-next-line
for ( const subtitleTrack of data . playlist [ 0 ] . tracks ) {
const subtitleBlob = URL . createObjectURL ( await fetch ( ` ${ process . env . REACT _APP _CORS _PROXY _URL } ${ subtitleTrack . file } ` ) . then ( res => res . blob ( ) ) ) ; // do this so no need for CORS errors
subtitles . push ( {
file : subtitleBlob ,
language : subtitleTrack . label
} )
}
}
}
return { url : mediaUrl , subtitles : subtitles }
}
async function getEpisodes ( slug ) {
}
const xemovie = { findContent , getStreamUrl , getEpisodes }
export default xemovie ;