diff --git a/src/components/InputBox.css b/src/components/InputBox.css index bed5eb06..f7d2b16d 100644 --- a/src/components/InputBox.css +++ b/src/components/InputBox.css @@ -42,11 +42,10 @@ outline: none; background-color: #36363e; color: white; - padding: .7rem; + padding: .7rem 1rem; height: auto; - width: 20%; + width: 25%; color: white; - font-weight: bold; cursor: pointer; } @@ -56,7 +55,6 @@ outline: none; background-color: #36363e; color: white; - /* padding: .7rem 1.5rem; */ height: auto; width: 5%; box-sizing: border-box; @@ -74,6 +72,10 @@ background-color: #3C3D44; } +.inputOptionBox:hover { + background-color: #3C3D44; +} + .inputSearchButton .text > .arrow { opacity: 0; transition: opacity 0.2s ease-in-out, transform 0.2s ease-in-out; @@ -116,11 +118,19 @@ } .inputTextBox { + margin-top: .5rem; width: 100%; } .inputDropdown { width: 100%; - margin-bottom: .5rem; + padding: .7rem 1.5rem; + } + + .inputOptionBox { + margin-top: .5rem; + width: 50%; + align-items:stretch; + padding: .7rem 1.5rem; } } diff --git a/src/components/InputBox.js b/src/components/InputBox.js index eaaa387b..a392733c 100644 --- a/src/components/InputBox.js +++ b/src/components/InputBox.js @@ -6,13 +6,15 @@ import './InputBox.css' export function InputBox({ onSubmit, placeholder }) { const [searchTerm, setSearchTerm] = React.useState(""); const [type, setType] = React.useState("movie"); + const [season, setSeason] = React.useState(""); + const [episode, setEpisode] = React.useState(""); const showContentType = type === "show" ? false : true; return (
) diff --git a/src/lib/lookMovie.js b/src/lib/lookMovie.js index fc379f4c..9c3014f1 100644 --- a/src/lib/lookMovie.js +++ b/src/lib/lookMovie.js @@ -6,10 +6,17 @@ function getCorsUrl(url) { } async function getVideoUrl(config) { + // return getCorsUrl('https://vdoc1.sallenes.space/_eTeNnlOAFdWb-gPYTiQfg/1626297249/storage3/shows/0413573-greys-anatomy-2005/6-S1E1-1553949090/720p/v2-index.m3u8'); const accessToken = await getAccessToken(config); const now = Math.floor(Date.now() / 1e3); - let url = getCorsUrl(`https://lookmovie.io/manifests/movies/json/${config.movieId}/${now}/${accessToken}/master.m3u8`); + let url = ''; + + if (config.type === 'movie') { + url = getCorsUrl(`https://lookmovie.io/manifests/movies/json/${config.id}/${now}/${accessToken}/master.m3u8`); + } else if (config.type === 'show') { + url = getCorsUrl(`https://lookmovie.io/manifests/shows/json/${accessToken}/${now}/${config.id}/master.m3u8`); + } if (url) { const videoOpts = await fetch(url).then((d) => d.json()); @@ -31,7 +38,13 @@ async function getVideoUrl(config) { } async function getAccessToken(config) { - let url = getCorsUrl(`https://lookmovie.io/api/v1/security/movie-access?id_movie=${config.movieId}&token=1&sk=&step=1`); + let url = ''; + + if (config.type === 'movie') { + url = getCorsUrl(`https://lookmovie.io/api/v1/security/movie-access?id_movie=${config.id}&token=1&sk=&step=1`); + } else if (config.type === 'show') { + url = getCorsUrl(`https://lookmovie.io/api/v1/security/show-access?slug=${config.slug}&token=&step=2`); + } const data = await fetch(url).then((d) => d.json()); @@ -41,7 +54,7 @@ async function getAccessToken(config) { return "Invalid type provided in config"; } -async function getStreamUrl(slug, type) { +async function getStreamUrl(slug, type, season, episode) { const url = getCorsUrl(`https://lookmovie.io/${type}s/view/${slug}`); const pageReq = await fetch(url).then((d) => d.text()); @@ -54,19 +67,31 @@ async function getStreamUrl(slug, type) { "}" ); + let id = ''; + + if (type === "movie") { + id = data.id_movie; + } else if (type === "show") { + const episodeObj = data.seasons.find((v) => { return v.season === season && v.episode === episode; }); + + if (episodeObj) { + id = episodeObj.id_episode; + } + } + const videoUrl = await getVideoUrl({ slug: slug, - movieId: data.id_movie, + id: id, type: type, }); return { url: videoUrl } } -async function findContent(searchTerm, type) { - const searchUrl = getCorsUrl(`https://lookmovie.io/api/v1/movies/search/?q=${encodeURIComponent(searchTerm)}`); +async function findContent(searchTerm, type) { + const searchUrl = getCorsUrl(`https://lookmovie.io/api/v1/${type}s/search/?q=${encodeURIComponent(searchTerm)}`); const searchRes = await fetch(searchUrl).then((d) => d.json()); - let results = [...searchRes.result.map((v) => ({ ...v, type: "movie" }))]; + const results = [...searchRes.result.map((v) => ({ ...v, type: type}))]; const fuse = new Fuse(results, { threshold: 0.3, distance: 200, keys: ["title"] }); const matchedResults = fuse diff --git a/src/serviceWorkerRegistration.js b/src/serviceWorkerRegistration.js index 26468c7c..a96b00d5 100644 --- a/src/serviceWorkerRegistration.js +++ b/src/serviceWorkerRegistration.js @@ -55,10 +55,6 @@ function registerValidSW(swUrl, config) { // At this point, the updated precached content has been fetched, // but the previous service worker will still serve the older // content until all client tabs are closed. - console.log( - 'New content is available and will be used when all ' + - 'tabs for this page are closed. See https://cra.link/PWA.' - ); // Execute callback if (config && config.onUpdate) { @@ -68,7 +64,6 @@ function registerValidSW(swUrl, config) { // At this point, everything has been precached. // It's the perfect time to display a // "Content is cached for offline use." message. - console.log('Content is cached for offline use.'); // Execute callback if (config && config.onSuccess) { @@ -108,7 +103,6 @@ function checkValidServiceWorker(swUrl, config) { } }) .catch(() => { - console.log('No internet connection found. App is running in offline mode.'); }); } diff --git a/src/views/Search.js b/src/views/Search.js index 7ce3fc48..f6ef4912 100644 --- a/src/views/Search.js +++ b/src/views/Search.js @@ -26,12 +26,12 @@ export function SearchView() { setFailed(true) } - async function getStream(title, slug, type) { + async function getStream(title, slug, type, season, episode) { setStreamUrl(""); try { setProgress(2); setText(`Getting stream for "${title}"`) - const { url } = await getStreamUrl(slug, type); + const { url } = await getStreamUrl(slug, type, season, episode); setProgress(maxSteps); setStreamUrl(url); setStreamData({ @@ -45,9 +45,9 @@ export function SearchView() { } } - async function searchMovie(query, contentType) { + async function searchMovie(query, contentType, season, episode) { setFailed(false); - setText(`Searching for ${contentType} "${query}"`); + setText(`Searching for ${contentType} "${query}" ${contentType === 'show' ? ` (${season}x${episode})` : ''}`); setProgress(1) setShowingOptions(false) @@ -65,7 +65,7 @@ export function SearchView() { } const { title, slug, type } = options[0]; - getStream(title, slug, type); + getStream(title, slug, type, season, episode); } catch (err) { fail(`Failed to watch ${contentType}`) } @@ -77,7 +77,7 @@ export function SearchView() {