You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
4.6 KiB
120 lines
4.6 KiB
const BASE_URL = `${process.env.REACT_APP_CORS_PROXY_URL}https://theflix.to`; |
|
|
|
async function findContent(searchTerm, type) { |
|
try { |
|
const term = searchTerm.toLowerCase() |
|
const tmdbRes = await fetch(`${process.env.REACT_APP_CORS_PROXY_URL}https://www.themoviedb.org/search/${type === 'show' ? 'tv' : type}?query=${term}`).then(d => d.text()); |
|
|
|
const doc = new DOMParser().parseFromString(tmdbRes, 'text/html'); |
|
const nodes = Array.from(doc.querySelectorAll('div.results > div > div.wrapper')); |
|
const results = nodes.slice(0, 10).map((node) => { |
|
let type = node.querySelector('div.details > div.wrapper > div.title > div > a').getAttribute('data-media-type'); |
|
type = type === 'tv' ? 'show' : type; |
|
|
|
let title; |
|
let year; |
|
let slug; |
|
|
|
if (type === 'movie') { |
|
try { |
|
title = node.querySelector('div.details > div.wrapper > div.title > div > a').textContent; |
|
year = node.querySelector('div.details > div.wrapper > div.title > span').textContent.trim().split(' ')[2]; |
|
slug = node.querySelector('div.details > div.wrapper > div.title > div > a').getAttribute('href').split('/')[2]; |
|
} catch (e) { |
|
// eslint-disable-next-line array-callback-return |
|
return; |
|
} |
|
} else if (type === 'show') { |
|
try { |
|
title = node.querySelector('div.details > div.wrapper > div.title > div > a > h2').textContent; |
|
year = node.querySelector('div.details > div.wrapper > div.title > span').textContent.trim().split(' ')[2]; |
|
slug = node.querySelector('div.details > div.wrapper > div.title > div > a').getAttribute('href').split('/')[2]; |
|
} catch (e) { |
|
// eslint-disable-next-line array-callback-return |
|
return; |
|
} |
|
} |
|
|
|
return { |
|
type: type, |
|
title: title, |
|
year: year, |
|
slug: slug + '-' + title.replace(/[^a-z0-9]+|\s+/gmi, " ").replace(/\s+/g, '-').toLowerCase(), |
|
source: 'theflix' |
|
} |
|
}); |
|
|
|
if (results.length > 1) { |
|
return { options: results }; |
|
} else { |
|
return { options: [ results[0] ] } |
|
} |
|
} catch (err) { |
|
console.error(err); |
|
throw new Error(err) |
|
} |
|
} |
|
|
|
async function getEpisodes(slug) { |
|
let tmdbRes; |
|
|
|
try { |
|
tmdbRes = await fetch(`${process.env.REACT_APP_CORS_PROXY_URL}https://www.themoviedb.org/tv/${slug}/seasons`).then(d => d.text()); |
|
} catch (err) { |
|
tmdbRes = await fetch(`${process.env.REACT_APP_CORS_PROXY_URL}https://www.themoviedb.org/tv/${slug.split('-')[0]}/seasons`).then(d => d.text()); |
|
|
|
if (tmdbRes) |
|
slug = slug.split('-')[0]; |
|
} |
|
|
|
const sNodes = Array.from(new DOMParser().parseFromString(tmdbRes, 'text/html').querySelectorAll('div.column_wrapper > div.flex > div')); |
|
|
|
let seasons = []; |
|
let episodes = []; |
|
|
|
for (let s of sNodes) { |
|
const text = s.querySelector('div > section > div > div > div > h2 > a').textContent; |
|
if (!text.includes('Season')) continue; |
|
|
|
const season = text.split(' ')[1]; |
|
|
|
if (!seasons.includes(season)) { |
|
seasons.push(season); |
|
} |
|
|
|
if (!episodes[season]) { |
|
episodes[season] = []; |
|
} |
|
|
|
const epRes = await fetch(`${process.env.REACT_APP_CORS_PROXY_URL}https://www.themoviedb.org/tv/${slug}/season/${season}`).then(d => d.text()); |
|
const epNodes = Array.from(new DOMParser().parseFromString(epRes, 'text/html').querySelectorAll('div.episode_list > div.card')); |
|
epNodes.forEach((e, i) => episodes[season].push(++i)); |
|
} |
|
|
|
return { seasons, episodes }; |
|
} |
|
|
|
async function getStreamUrl(slug, type, season, episode) { |
|
let url; |
|
|
|
if (type === 'show') { |
|
url = `${BASE_URL}/tv-show/${slug}/season-${season}/episode-${episode}`; |
|
} else { |
|
url = `${BASE_URL}/movie/${slug}?movieInfo=${slug}`; |
|
} |
|
|
|
const res = await fetch(url).then(d => d.text()); |
|
|
|
const scripts = Array.from(new DOMParser().parseFromString(res, "text/html").querySelectorAll('script')); |
|
const prop = scripts.find((e) => e.textContent.includes("theflixvd.b-cdn")); |
|
|
|
if (prop) { |
|
const data = JSON.parse(prop.textContent); |
|
return { url: data.props.pageProps.videoUrl }; |
|
} |
|
|
|
return { url: '' } |
|
} |
|
|
|
const theflix = { findContent, getStreamUrl, getEpisodes } |
|
export default theflix;
|
|
|