diff --git a/src/state/watched/store.ts b/src/state/watched/store.ts index eab57080..4ea10100 100644 --- a/src/state/watched/store.ts +++ b/src/state/watched/store.ts @@ -8,80 +8,10 @@ export const VideoProgressStore = versionedStoreBuilder() .addVersion({ version: 1, migrate() { - // const output: WatchedStoreData = { items: [] }; - - // if (!data || data.constructor !== Object) return output; - - // Object.keys(data).forEach((scraperId) => { - // if (scraperId === "--version") return; - // if (scraperId === "save") return; - - // if ( - // data[scraperId].movie && - // data[scraperId].movie.constructor === Object - // ) { - // Object.keys(data[scraperId].movie).forEach((movieId) => { - // try { - // output.items.push({ - // mediaId: movieId.includes("player.php") - // ? movieId.split("player.php%3Fimdb%3D")[1] - // : movieId, - // mediaType: MWMediaType.MOVIE, - // providerId: scraperId, - // title: data[scraperId].movie[movieId].full.meta.title, - // year: data[scraperId].movie[movieId].full.meta.year, - // progress: data[scraperId].movie[movieId].full.currentlyAt, - // percentage: Math.round( - // (data[scraperId].movie[movieId].full.currentlyAt / - // data[scraperId].movie[movieId].full.totalDuration) * - // 100 - // ), - // }); - // } catch (err) { - // console.error( - // `Failed to migrate movie: ${scraperId}/${movieId}`, - // data[scraperId].movie[movieId] - // ); - // } - // }); - // } - - // if ( - // data[scraperId].show && - // data[scraperId].show.constructor === Object - // ) { - // Object.keys(data[scraperId].show).forEach((showId) => { - // if (data[scraperId].show[showId].constructor !== Object) return; - // Object.keys(data[scraperId].show[showId]).forEach((episodeId) => { - // try { - // output.items.push({ - // mediaId: showId, - // mediaType: MWMediaType.SERIES, - // providerId: scraperId, - // title: data[scraperId].show[showId][episodeId].meta.title, - // year: data[scraperId].show[showId][episodeId].meta.year, - // percentage: Math.round( - // (data[scraperId].show[showId][episodeId].currentlyAt / - // data[scraperId].show[showId][episodeId].totalDuration) * - // 100 - // ), - // progress: data[scraperId].show[showId][episodeId].currentlyAt, - // episodeId: - // data[scraperId].show[showId][episodeId].show.episode, - // seasonId: data[scraperId].show[showId][episodeId].show.season, - // }); - // } catch (err) { - // console.error( - // `Failed to migrate series: ${scraperId}/${showId}/${episodeId}`, - // data[scraperId].show[showId][episodeId] - // ); - // } - // }); - // }); - // } - // }); - - return output; + // TODO add migration back + return { + items: [], + }; }, }) .addVersion({ diff --git a/src/views/MediaView.tsx b/src/views/MediaView.tsx index 5cea1a35..e9bedc53 100644 --- a/src/views/MediaView.tsx +++ b/src/views/MediaView.tsx @@ -1,235 +1,22 @@ -// import { ReactElement, useCallback, useEffect, useState } from "react"; -// import { useHistory } from "react-router-dom"; -// import { useTranslation } from "react-i18next"; -// import { IconPatch } from "@/components/buttons/IconPatch"; -// import { Icons } from "@/components/Icon"; -// import { Navigation } from "@/components/layout/Navigation"; -// import { Paper } from "@/components/layout/Paper"; -// import { LoadingSeasons, Seasons } from "@/components/layout/Seasons"; -// import { DecoratedVideoPlayer } from "@/components/video/DecoratedVideoPlayer"; -// import { ArrowLink } from "@/components/text/ArrowLink"; -// import { DotList } from "@/components/text/DotList"; -// import { Title } from "@/components/text/Title"; -// import { useLoading } from "@/hooks/useLoading"; -// import { usePortableMedia } from "@/hooks/usePortableMedia"; -// import { -// getIfBookmarkedFromPortable, -// useBookmarkContext, -// } from "@/state/bookmark"; -// import { getWatchedFromPortable, useWatchedContext } from "@/state/watched"; -// import { SourceControl } from "@/components/video/controls/SourceControl"; -// import { ProgressListenerControl } from "@/components/video/controls/ProgressListenerControl"; -// import { Loading } from "@/components/layout/Loading"; -// import { NotFoundChecks } from "./notfound/NotFoundChecks"; - -import { useTranslation } from "react-i18next"; import { useHistory } from "react-router-dom"; -import { Navigation } from "@/components/layout/Navigation"; -import { ArrowLink } from "@/components/text/ArrowLink"; - -// interface StyledMediaViewProps { -// media: MWMedia; -// stream: MWMediaStream; -// } - -// export function SkeletonVideoPlayer(props: { error?: boolean }) { -// return ( -//
-// {props.error ? ( -//
-// -//

Couldn't get your stream

-//
-// ) : ( -//
-// -//

Getting your stream...

-//
-// )} -//
-// ); -// } - -// function StyledMediaView(props: StyledMediaViewProps) { -// const reactHistory = useHistory(); -// const watchedStore = useWatchedContext(); -// const startAtTime: number | undefined = getWatchedFromPortable( -// watchedStore.watched.items, -// props.media -// )?.progress; - -// const updateProgress = useCallback( -// (time: number, duration: number) => { -// // Don't update stored progress if less than 30s into the video -// if (time <= 30) return; -// watchedStore.updateProgress(props.media, time, duration); -// }, -// [props, watchedStore] -// ); - -// const goBack = useCallback(() => { -// if (reactHistory.action !== "POP") reactHistory.goBack(); -// else reactHistory.push("/"); -// }, [reactHistory]); - -// return ( -//
-// -// -// -// -//
-// ); -// } - -// interface StyledMediaFooterProps { -// media: MWMedia; -// provider: MWMediaProvider; -// } - -// function StyledMediaFooter(props: StyledMediaFooterProps) { -// const { setItemBookmark, getFilteredBookmarks } = useBookmarkContext(); -// const isBookmarked = getIfBookmarkedFromPortable( -// getFilteredBookmarks(), -// props.media -// ); - -// return ( -// -//
-//
-// {props.media.title} -// -//
-//
-// setItemBookmark(props.media, !isBookmarked)} -// clickable -// /> -//
-//
-// {props.media.mediaType !== MWMediaType.MOVIE ? ( -// -// ) : null} -//
-// ); -// } - -// function LoadingMediaFooter(props: { error?: boolean }) { -// const { t } = useTranslation(); - -// return ( -// -//
-//
-//
-//
-// -// -//
-// {props.error ? ( -//
-// -//

{t("media.invalidUrl")}

-//
-// ) : ( -// -// )} -//
-//
-// -// ); -// } - -// function MediaViewContent(props: { portable: MWPortableMedia }) { -// const mediaPortable = props.portable; -// const [streamUrl, setStreamUrl] = useState(); -// const [media, setMedia] = useState(); -// const [fetchMedia, loadingPortable, errorPortable] = useLoading( -// (portable: MWPortableMedia) => convertPortableToMedia(portable) -// ); -// const [fetchStream, loadingStream, errorStream] = useLoading( -// (portable: MWPortableMedia) => getStream(portable) -// ); - -// useEffect(() => { -// (async () => { -// if (mediaPortable) { -// setMedia(await fetchMedia(mediaPortable)); -// } -// })(); -// }, [mediaPortable, setMedia, fetchMedia]); - -// useEffect(() => { -// (async () => { -// if (mediaPortable) { -// setStreamUrl(await fetchStream(mediaPortable)); -// } -// })(); -// }, [mediaPortable, setStreamUrl, fetchStream]); - -// let playerContent: ReactElement | null = null; -// if (loadingStream) playerContent = ; -// else if (errorStream) playerContent = ; -// else if (media && streamUrl) -// playerContent = ; - -// let footerContent: ReactElement | null = null; -// if (loadingPortable) footerContent = ; -// else if (errorPortable) footerContent = ; -// else if (mediaPortable && media) -// footerContent = ( -// -// ); - -// return ( -// <> -// {playerContent} -// {footerContent} -// -// ); -// } +import { useCallback } from "react"; +import { DecoratedVideoPlayer } from "@/components/video/DecoratedVideoPlayer"; export function MediaView() { - const { t } = useTranslation(); - // const mediaPortable: MWPortableMedia | undefined = usePortableMedia(); const reactHistory = useHistory(); + const goBack = useCallback(() => { + if (reactHistory.action !== "POP") reactHistory.goBack(); + else reactHistory.push("/"); + }, [reactHistory]); + + // TODO fetch meta + // TODO call useScrape + // TODO not found checks + // TODO watched store + // TODO scrape loading state + // TODO error page with video header return ( -
- - - reactHistory.action !== "POP" - ? reactHistory.goBack() - : reactHistory.push("/") - } - direction="left" - linkText={t("media.arrowText")} - /> - - {/* -
- -
-
*/} -
+ ); } diff --git a/src/views/notfound/NotFoundChecks.tsx b/src/views/notfound/NotFoundChecks.tsx index a8fe9e4a..cffd9b85 100644 --- a/src/views/notfound/NotFoundChecks.tsx +++ b/src/views/notfound/NotFoundChecks.tsx @@ -1,28 +1,17 @@ import { ReactElement } from "react"; -// import { NotFoundMedia, NotFoundProvider } from "./NotFoundView"; export interface NotFoundChecksProps { - // portable: MWPortableMedia | undefined; + id: string; children?: ReactElement; } /* - ** Component that only renders children if the passed-in portable is fully correct + ** Component that only renders children if the passed in data is fully correct */ export function NotFoundChecks( props: NotFoundChecksProps ): ReactElement | null { - // const providerMeta = props.portable - // ? getProviderMetadata(props.portable.providerId) - // : undefined; - - // if (!providerMeta || !providerMeta.exists) { - // return ; - // } - - // if (!providerMeta.enabled) { - // return ; - // } + // TODO do notfound check return props.children || null; } diff --git a/src/views/search/SearchResultsView.tsx b/src/views/search/SearchResultsView.tsx index 60a61115..5c67e30e 100644 --- a/src/views/search/SearchResultsView.tsx +++ b/src/views/search/SearchResultsView.tsx @@ -65,6 +65,8 @@ export function SearchResultsView({ searchQuery }: { searchQuery: MWQuery }) { if (error) return ; if (!results) return null; + // TODO on click go to the right page with id instead of portable + return (
{results.length > 0 ? (