diff --git a/back/src/Kyoo.Abstractions/Models/WatchItem.cs b/back/src/Kyoo.Abstractions/Models/WatchItem.cs index e737aa74..76c72c0a 100644 --- a/back/src/Kyoo.Abstractions/Models/WatchItem.cs +++ b/back/src/Kyoo.Abstractions/Models/WatchItem.cs @@ -75,6 +75,11 @@ namespace Kyoo.Abstractions.Models /// public string Title { get; set; } + /// + /// The summary of this episode. + /// + public string Overview { get; set; } + /// /// The release date of this episode. It can be null if unknown. /// @@ -211,6 +216,7 @@ namespace Kyoo.Abstractions.Models EpisodeNumber = ep.EpisodeNumber, AbsoluteNumber = ep.AbsoluteNumber, Title = ep.Title, + Overview = ep.Overview, ReleaseDate = ep.ReleaseDate, Path = ep.Path, Images = ep.Show.Images, diff --git a/front/package.json b/front/package.json index 60d4b727..1287fe0a 100644 --- a/front/package.json +++ b/front/package.json @@ -26,6 +26,7 @@ "@jellyfin/libass-wasm": "^4.1.1", "@mui/icons-material": "^5.8.4", "@mui/material": "^5.8.7", + "hls.js": "^1.2.4", "jotai": "^1.8.4", "next": "12.2.2", "next-translate": "^1.5.0", diff --git a/front/src/models/resources/watch-item.ts b/front/src/models/resources/watch-item.ts index 8131a47d..47f4ed8c 100644 --- a/front/src/models/resources/watch-item.ts +++ b/front/src/models/resources/watch-item.ts @@ -120,6 +120,10 @@ const WatchMovieP = z.preprocess( * The title of this episode. */ name: z.string(), + /** + * The sumarry of this episode. + */ + overview: z.string().nullable(), /** * The release date of this episode. It can be null if unknown. */ diff --git a/front/src/player/player.tsx b/front/src/player/player.tsx index 5b372049..5c906a89 100644 --- a/front/src/player/player.tsx +++ b/front/src/player/player.tsx @@ -25,9 +25,13 @@ import { useFetch } from "~/utils/query"; import { ErrorPage } from "~/components/errors"; import { useState, useEffect, PointerEvent as ReactPointerEvent } from "react"; import { Box } from "@mui/material"; -import { useAtomValue, useSetAtom } from "jotai"; +import { useAtom, useAtomValue, useSetAtom } from "jotai"; import { Hover, LoadingIndicator } from "./components/hover"; import { fullscreenAtom, playAtom, useSubtitleController, useVideoController } from "./state"; +import { useRouter } from "next/router"; +import Head from "next/head"; +import { makeTitle } from "~/utils/utils"; +import { episodeDisplayNumber } from "~/components/episode"; // Callback used to hide the controls when the mouse goes iddle. This is stored globally to clear the old timeout // if the mouse moves again (if this is stored as a state, the whole page is redrawn on mouse move) @@ -40,10 +44,11 @@ const query = (slug: string): QueryIdentifier => ({ const Player: QueryPage<{ slug: string }> = ({ slug }) => { const { data, error } = useFetch(query(slug)); - const { playerRef, videoProps, onVideoClick } = useVideoController(); + const { playerRef, videoProps, onVideoClick } = useVideoController(data?.link); const setFullscreen = useSetAtom(fullscreenAtom); + const router = useRouter(); - const isPlaying = useAtomValue(playAtom); + const [isPlaying, setPlay] = useAtom(playAtom); const [showHover, setHover] = useState(false); const [mouseMoved, setMouseMoved] = useState(false); const [menuOpenned, setMenuOpen] = useState(false); @@ -55,7 +60,7 @@ const Player: QueryPage<{ slug: string }> = ({ slug }) => { mouseCallback = setTimeout(() => { setMouseMoved(false); }, 2500); - } + }; useEffect(() => { const handler = (e: PointerEvent) => { @@ -67,6 +72,10 @@ const Player: QueryPage<{ slug: string }> = ({ slug }) => { return () => document.removeEventListener("pointermove", handler); }); + useEffect(() => { + setPlay(true); + }, [slug, setPlay]); + useSubtitleController(playerRef, data?.subtitles, data?.fonts); useEffect(() => { @@ -79,6 +88,24 @@ const Player: QueryPage<{ slug: string }> = ({ slug }) => { return ( <> + {data && ( + + + {makeTitle( + data.isMovie + ? data.name + : data.showTitle + + " " + + episodeDisplayNumber({ + seasonNumber: data.seasonNumber, + episodeNumber: data.episodeNumber, + absoluteNumber: data.absoluteNumber, + }), + )} + + + + )}