movie-web/src2/lib/scraper/lookmovie.js

165 lines
4.8 KiB
JavaScript
Raw Normal View History

2021-07-14 00:31:37 +02:00
import Fuse from 'fuse.js'
import JSON5 from 'json5'
2021-12-29 14:01:53 +01:00
const BASE_URL = `https://lookmovie.io`;
const API_URL = `${process.env.REACT_APP_CORS_PROXY_URL}https://lookmovie125.xyz`;
2021-10-19 18:30:05 +02:00
const CORS_URL = `${process.env.REACT_APP_CORS_PROXY_URL}${BASE_URL}`;
let phpsessid;
2021-07-26 19:17:27 +02:00
async function findContent(searchTerm, type) {
2021-10-01 17:23:10 +02:00
try {
2021-10-19 18:30:05 +02:00
const searchUrl = `${CORS_URL}/${type}s/search/?q=${encodeURIComponent(searchTerm)}`;
2021-10-01 17:23:10 +02:00
const searchRes = await fetch(searchUrl).then((d) => d.text());
// Parse DOM to find search results on full search page
const parser = new DOMParser();
const doc = parser.parseFromString(searchRes, "text/html");
const nodes = Array.from(doc.querySelectorAll('.movie-item-style-1'));
const results = nodes.map(node => {
return {
type,
title: node.querySelector('h6 a').innerText.trim(),
year: node.querySelector('.year').innerText.trim(),
slug: node.querySelector('a').href.split('/').pop(),
}
});
const fuse = new Fuse(results, { threshold: 0.3, distance: 200, keys: ["title"] });
const matchedResults = fuse
.search(searchTerm.toString())
.map((result) => result.item);
if (matchedResults.length === 0) {
return { options: [] }
2021-07-26 19:17:27 +02:00
}
2021-10-01 17:23:10 +02:00
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: 'lookmovie'
}));
return res;
} else {
const { title, slug, type, year } = matchedResults[0];
return {
options: [{ title, slug, type, year, source: 'lookmovie' }]
}
2021-07-26 19:17:27 +02:00
}
2021-10-01 17:23:10 +02:00
} catch (e) {
return { options: [] }
2021-07-26 19:17:27 +02:00
}
}
2021-07-13 17:45:44 +02:00
async function getVideoUrl(config) {
2021-07-14 18:31:35 +02:00
let url = '';
if (config.type === 'movie') {
2021-12-29 14:01:53 +01:00
url = `${API_URL}/api/v1/security/movie-access?id_movie=${config.id}&token=1&sk=&step=1`;
2021-07-14 18:31:35 +02:00
} else if (config.type === 'show') {
2021-12-29 14:01:53 +01:00
url = `${API_URL}/api/v1/security/episode-access?id_episode=${config.id}`;
2021-07-14 18:31:35 +02:00
}
2021-07-13 17:45:44 +02:00
2021-10-20 19:07:33 +02:00
const data = await fetch(url, {
2021-10-19 18:30:05 +02:00
headers: { phpsessid },
}).then((d) => d.json());
2021-07-13 17:45:44 +02:00
const subs = data?.subtitles.filter((sub) => {
if (typeof sub.file === 'object') return false;
return true;
})
2021-10-20 19:07:33 +02:00
2021-07-21 00:49:33 +02:00
// Find video URL and return it (with a check for a full url if needed)
2021-10-19 18:30:05 +02:00
const opts = ["1080p", "1080", "720p", "720", "480p", "480", "auto"];
2021-07-13 17:45:44 +02:00
2021-07-21 00:49:33 +02:00
let videoUrl = "";
for (let res of opts) {
2021-10-20 19:07:33 +02:00
if (data.streams[res] && !data.streams[res].includes('dummy') && !data.streams[res].includes('earth-1984') && !videoUrl) {
videoUrl = data.streams[res]
2021-07-13 17:45:44 +02:00
}
}
2021-09-13 22:26:29 +02:00
return {
videoUrl: videoUrl.startsWith("/") ? `${BASE_URL}${videoUrl}` : videoUrl,
subs: subs,
2021-09-13 22:26:29 +02:00
};
2021-09-13 20:25:29 +02:00
}
2021-07-15 00:09:42 +02:00
async function getEpisodes(slug) {
2021-10-19 18:30:05 +02:00
const url = `${CORS_URL}/shows/view/${slug}`;
const pageReq = await fetch(url, {
headers: { phpsessid },
}).then((d) => d.text());
2021-07-15 00:09:42 +02:00
const data = JSON5.parse("{" +
pageReq
.slice(pageReq.indexOf(`show_storage`))
.split("};")[0]
.split("= {")[1]
.trim() +
"}"
);
2021-07-20 12:20:56 +02:00
let seasons = [];
let episodes = [];
data.seasons.forEach((e) => {
2021-07-19 16:32:40 +02:00
if (!seasons.includes(e.season))
seasons.push(e.season);
2021-07-20 12:20:56 +02:00
2021-07-19 16:32:40 +02:00
if (!episodes[e.season])
episodes[e.season] = []
episodes[e.season].push(e.episode)
})
return { seasons, episodes }
2021-07-15 00:09:42 +02:00
}
2021-07-14 18:31:35 +02:00
async function getStreamUrl(slug, type, season, episode) {
2021-10-19 18:30:05 +02:00
const url = `${CORS_URL}/${type}s/view/${slug}`;
const pageRes = await fetch(url);
if (pageRes.headers.get('phpsessid')) phpsessid = pageRes.headers.get('phpsessid');
const pageResText = await pageRes.text();
2021-07-13 17:45:44 +02:00
2021-07-13 19:15:56 +02:00
const data = JSON5.parse("{" +
pageResText
.slice(pageResText.indexOf(`${type}_storage`))
2021-07-13 17:45:44 +02:00
.split("};")[0]
.split("= {")[1]
.trim() +
2021-07-13 19:15:56 +02:00
"}"
);
2021-07-13 17:45:44 +02:00
2021-07-14 18:31:35 +02:00
let id = '';
if (type === "movie") {
2021-07-20 12:20:56 +02:00
id = data.id_movie;
} else if (type === "show") {
const episodeObj = data.seasons.find((v) => { return v.season === season && v.episode === episode; });
2021-07-15 00:09:42 +02:00
2021-07-14 18:31:35 +02:00
if (episodeObj) {
2021-07-20 12:20:56 +02:00
id = episodeObj.id_episode;
}
}
2021-07-14 18:31:35 +02:00
2021-07-14 19:03:10 +02:00
if (id === '') {
return { url: '' }
}
2021-07-13 19:15:56 +02:00
const videoUrl = await getVideoUrl({
2021-07-14 00:31:37 +02:00
slug: slug,
2021-07-14 18:31:35 +02:00
id: id,
type: type,
2021-09-13 20:25:29 +02:00
});
2021-07-13 17:45:44 +02:00
2021-12-29 13:39:47 +01:00
return { url: videoUrl.videoUrl, subtitles: videoUrl.subs };
2021-07-13 19:15:56 +02:00
}
2021-07-13 17:45:44 +02:00
2021-07-14 00:31:37 +02:00
2021-07-20 12:20:56 +02:00
const lookMovie = { findContent, getStreamUrl, getEpisodes };
2021-09-13 20:25:29 +02:00
export default lookMovie;