movie-web/src/views/Movie.js

114 lines
4.2 KiB
JavaScript
Raw Normal View History

2021-07-14 00:31:37 +02:00
import React from 'react'
import { Title } from '../components/Title'
import { Card } from '../components/Card'
import { useMovie } from '../hooks/useMovie'
import { VideoElement } from '../components/VideoElement'
2021-07-15 00:09:42 +02:00
import { EpisodeSelector } from '../components/EpisodeSelector'
import './Movie.css'
import { getStreamUrl } from '../lib/lookMovie'
2021-07-14 00:31:37 +02:00
export function MovieView(props) {
2021-07-15 00:09:42 +02:00
const { streamUrl, streamData, setStreamUrl } = useMovie();
const [season, setSeason] = React.useState("1");
const [seasonList, setSeasonList] = React.useState([]);
const [episodeLists, setEpisodeList] = React.useState([]);
const [episode, setEpisode] = React.useState({ episode: null, season: null });
const [loading, setLoading] = React.useState(false);
React.useEffect(() => {
setEpisodeList(streamData.episodes[season]);
}, [season, streamData.episodes])
React.useEffect(() => {
if (streamData.type === "show") {
setSeasonList(streamData.seasons);
setSeason(streamData.seasons[0])
// TODO load from localstorage last watched
setEpisode({ episode: streamData.episodes[streamData.seasons[0]][0], season: streamData.seasons[0] })
setEpisodeList(streamData.episodes[streamData.seasons[0]]);
}
}, [streamData])
React.useEffect(() => {
let cancel = false;
// ignore if not a show
if (streamData.type !== "show") return () => {
cancel = true;
};
if (!episode.episode) {
setLoading(false);
setStreamUrl('');
return;
}
setLoading(true);
getStreamUrl(streamData.slug, streamData.type, episode.season, episode.episode)
.then(({url}) => {
if (cancel) return;
setStreamUrl(url)
setLoading(false);
})
.catch(e => {
if (cancel) return;
console.error(e)
})
return () => {
cancel = true;
}
2021-07-15 00:09:42 +02:00
}, [episode, streamData, setStreamUrl])
2021-07-14 00:31:37 +02:00
2021-07-15 20:34:25 +02:00
const setProgress = (evt) => {
let ls = JSON.parse(localStorage.getItem("video-progress") || "{}")
// We're just checking lookmovie for now since there is only one scraper
if(!ls.lookmovie) ls.lookmovie = {}
if(!ls.lookmovie[streamData.type]) ls.lookmovie[streamData.type] = {}
if(!ls.lookmovie[streamData.type][streamData.slug]) {
ls.lookmovie[streamData.type][streamData.slug] = {}
}
// Store real data
let key = streamData.type === "show" ? `${season}-${episode.episode}` : "full"
ls.lookmovie[streamData.type][streamData.slug][key] = {
currentlyAt: Math.floor(evt.currentTarget.currentTime),
totalDuration: Math.floor(evt.currentTarget.duration),
updatedAt: Date.now()
2021-07-15 20:34:25 +02:00
}
if(streamData.type === "show") {
ls.lookmovie[streamData.type][streamData.slug][key].show = {
season,
episode: episode.episode
}
}
localStorage.setItem("video-progress", JSON.stringify(ls))
}
2021-07-14 00:31:37 +02:00
return (
2021-07-15 00:09:42 +02:00
<div className={`cardView showType-${streamData.type}`}>
2021-07-14 00:31:37 +02:00
<Card fullWidth>
<Title accent="Return to home" accentLink="search">
2021-07-15 00:09:42 +02:00
{streamData.title}
2021-07-14 00:31:37 +02:00
</Title>
2021-07-15 00:09:42 +02:00
{streamData.type === "show" ? <Title size="small">
Season {episode.season}: Episode {episode.episode}
</Title> : undefined}
2021-07-15 20:34:25 +02:00
<VideoElement streamUrl={streamUrl} loading={loading} setProgress={setProgress} />
2021-07-15 00:09:42 +02:00
{streamData.type === "show" ?
<EpisodeSelector
setSeason={setSeason}
setEpisode={setEpisode}
season={season}
2021-07-15 00:09:42 +02:00
seasons={seasonList}
episodes={episodeLists}
slug={streamData.slug}
2021-07-15 00:09:42 +02:00
currentSeason={season}
currentEpisode={episode}
/>
: ''}
2021-07-14 00:31:37 +02:00
</Card>
</div>
)
}