diff --git a/front/packages/ui/src/player/components/hover.tsx b/front/packages/ui/src/player/components/hover.tsx index 54871a7e..7420971a 100644 --- a/front/packages/ui/src/player/components/hover.tsx +++ b/front/packages/ui/src/player/components/hover.tsx @@ -65,6 +65,7 @@ export const hoverAtom = atom((get) => [!get(playAtom), ...Object.values(get(hoverReasonAtom))].includes(true), ); export const seekingAtom = atom(false); +export const seekProgressAtom = atom(null); export const Hover = ({ isLoading, @@ -163,7 +164,7 @@ export const Hover = ({ )} {showBottomSeeker ? ( - + ) : ( (null); const [layout, setLayout] = useState({ x: 0, y: 0, width: 0, height: 0 }); + const [seekProgress, setSeekProgress] = useAtom(seekProgressAtom); const setSeeking = useSetAtom(seekingAtom); return ( <> { setPlay(false); setSeeking(true); }} endSeek={() => { setSeeking(false); + setProgress(seekProgress!); + setSeekProgress(null); setTimeout(() => setPlay(true), 10); }} onHover={(progress, layout) => { setHoverProgress(progress); setLayout(layout); }} - setProgress={setProgress} + setProgress={(progress) => setSeekProgress(progress)} subtleProgress={buffered} max={duration} markers={chapters?.map((x) => x.startTime)} diff --git a/front/packages/ui/src/player/components/scrubber.tsx b/front/packages/ui/src/player/components/scrubber.tsx index e2aee12c..d89d8854 100644 --- a/front/packages/ui/src/player/components/scrubber.tsx +++ b/front/packages/ui/src/player/components/scrubber.tsx @@ -23,10 +23,11 @@ import { Sprite, P, imageBorderRadius, ts } from "@kyoo/primitives"; import { View, Platform } from "react-native"; import { percent, useYoshiki, px, Theme, useForceRerender } from "yoshiki/native"; import { ErrorView } from "../../fetch"; -import { useMemo, useState } from "react"; +import { useMemo } from "react"; import { useAtomValue } from "jotai"; -import { durationAtom, progressAtom } from "../state"; +import { durationAtom } from "../state"; import { toTimerString } from "./left-buttons"; +import { seekProgressAtom } from "./hover"; type Thumb = { from: number; @@ -147,17 +148,18 @@ export const ScrubberTooltip = ({ }; let scrubberWidth = 0; -export const BottomScrubber = ({ url }: { url: string }) => { +export const BottomScrubber = ({ url, chapters }: { url: string; chapters?: Chapter[] }) => { const { css } = useYoshiki(); const { info, error, stats } = useScrubber(url); const rerender = useForceRerender(); - const progress = useAtomValue(progressAtom); + const progress = useAtomValue(seekProgressAtom) ?? 0; const duration = useAtomValue(durationAtom) ?? 1; if (error) return ; const width = stats?.width ?? 1; + const chapter = chapters?.findLast((x) => x.startTime <= progress && progress < x.endTime); return ( { })} > {toTimerString(progress)} + {chapter && `\n${chapter.name}`}

diff --git a/transcoder/main.go b/transcoder/main.go index c093f7e4..4ba02339 100644 --- a/transcoder/main.go +++ b/transcoder/main.go @@ -206,7 +206,12 @@ func (h *Handler) GetInfo(c echo.Context) error { if err != nil { return err } + // Run extractors to have them in cache h.extractor.RunExtractor(ret.Path, ret.Sha, &ret.Subtitles) + h.thumbnails.ExtractThumbnail( + ret.Path, + fmt.Sprintf("%s/%s/thumbnails.png", resource, slug), + ) return c.JSON(http.StatusOK, ret) }