From 92bca33b91d4372da70441ce870a69d7df762c0e Mon Sep 17 00:00:00 2001 From: mrjvs Date: Thu, 26 Oct 2023 19:36:15 +0200 Subject: [PATCH] add T param back --- src/components/player/hooks/usePlayer.ts | 9 +++++++-- src/pages/PlayerView.tsx | 12 ++++++++++-- src/utils/timestamp.ts | 14 ++++++++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 src/utils/timestamp.ts diff --git a/src/components/player/hooks/usePlayer.ts b/src/components/player/hooks/usePlayer.ts index 98cbb7a8..3869c735 100644 --- a/src/components/player/hooks/usePlayer.ts +++ b/src/components/player/hooks/usePlayer.ts @@ -47,8 +47,13 @@ export function usePlayer() { setMeta(m: PlayerMeta, newStatus?: PlayerStatus) { setMeta(m, newStatus); }, - playMedia(source: SourceSliceSource, sourceId: string | null) { - setSource(source, getProgress(progressStore.items, meta)); + playMedia( + source: SourceSliceSource, + sourceId: string | null, + startAtOverride?: number + ) { + const start = startAtOverride ?? getProgress(progressStore.items, meta); + setSource(source, start); setSourceId(sourceId); setStatus(playerStatus.PLAYING); init(); diff --git a/src/pages/PlayerView.tsx b/src/pages/PlayerView.tsx index e5a47557..e58f35e1 100644 --- a/src/pages/PlayerView.tsx +++ b/src/pages/PlayerView.tsx @@ -6,12 +6,14 @@ import { usePlayer } from "@/components/player/hooks/usePlayer"; import { usePlayerMeta } from "@/components/player/hooks/usePlayerMeta"; import { convertRunoutputToSource } from "@/components/player/utils/convertRunoutputToSource"; import { ScrapingItems, ScrapingSegment } from "@/hooks/useProviderScrape"; +import { useQueryParam } from "@/hooks/useQueryParams"; import { MetaPart } from "@/pages/parts/player/MetaPart"; import { PlayerPart } from "@/pages/parts/player/PlayerPart"; import { ScrapeErrorPart } from "@/pages/parts/player/ScrapeErrorPart"; import { ScrapingPart } from "@/pages/parts/player/ScrapingPart"; import { useLastNonPlayerLink } from "@/stores/history"; import { PlayerMeta, playerStatus } from "@/stores/player/slices/source"; +import { parseTimestamp } from "@/utils/timestamp"; export function PlayerView() { const history = useHistory(); @@ -24,6 +26,7 @@ export function PlayerView() { sources: Record; sourceOrder: ScrapingItems[]; } | null>(null); + const [startAtParam, setStartAtParam] = useQueryParam("t"); const { status, playMedia, reset, setScrapeNotFound } = usePlayer(); const { setPlayerMeta, scrapeMedia } = usePlayerMeta(); const backUrl = useLastNonPlayerLink(); @@ -51,9 +54,14 @@ export function PlayerView() { const playAfterScrape = useCallback( (out: RunOutput | null) => { if (!out) return; - playMedia(convertRunoutputToSource(out), out.sourceId); + let startAt: number | undefined; + if (startAtParam) { + setStartAtParam(null); + startAt = parseTimestamp(startAtParam) ?? undefined; + } + playMedia(convertRunoutputToSource(out), out.sourceId, startAt); }, - [playMedia] + [playMedia, setStartAtParam, startAtParam] ); return ( diff --git a/src/utils/timestamp.ts b/src/utils/timestamp.ts new file mode 100644 index 00000000..7d58ae0f --- /dev/null +++ b/src/utils/timestamp.ts @@ -0,0 +1,14 @@ +// Convert `t` param to time. Supports having only seconds (like `?t=192`), but also `3:30` or `1:30:02` +export function parseTimestamp(str: string | undefined | null): number | null { + const input = str ?? ""; + const isValid = !!input.match(/^\d+(:\d+)*$/); + if (!isValid) return null; + + const timeArr = input.split(":").map(Number).reverse(); + const hours = timeArr[2] ?? 0; + const minutes = Math.min(timeArr[1] ?? 0, 59); + const seconds = Math.min(timeArr[0] ?? 0, minutes > 0 ? 59 : Infinity); + + const timeInSeconds = hours * 60 * 60 + minutes * 60 + seconds; + return timeInSeconds; +}