feat: jump to last watched position

This commit is contained in:
Adrian Castro
2024-03-27 12:52:21 +01:00
parent c828fe3bf6
commit 72b2ffefc6
3 changed files with 31 additions and 10 deletions

View File

@@ -75,7 +75,8 @@ export const VideoPlayer = () => {
const setMeta = usePlayerStore((state) => state.setMeta);
const { gestureControls, autoPlay } = usePlayerSettingsStore();
const { updateWatchHistory, removeFromWatchHistory } = useWatchHistoryStore();
const { updateWatchHistory, removeFromWatchHistory, getWatchHistorItem } =
useWatchHistoryStore();
const updateResizeMode = (newMode: ResizeMode) => {
setResizeMode(newMode);
@@ -238,14 +239,14 @@ export const VideoPlayer = () => {
setHasStartedPlaying(true);
if (videoRef) {
void videoRef.setRateAsync(currentSpeed, true);
if (meta) {
const item = convertMetaToItemData(meta);
const scrapeMedia = convertMetaToScrapeMedia(meta);
updateWatchHistory(
item,
scrapeMedia,
videoRef.props.positionMillis ?? 0,
);
const media = convertMetaToScrapeMedia(meta);
const watchHistoryItem = getWatchHistorItem(media);
if (watchHistoryItem) {
void videoRef.setPositionAsync(watchHistoryItem.positionMillis);
}
}
}
};

View File

@@ -1,5 +1,9 @@
import type { ScrapeMedia } from "@movie-web/provider-utils";
import { fetchMediaDetails, fetchSeasonDetails, getMediaPoster } from "@movie-web/tmdb";
import {
fetchMediaDetails,
fetchSeasonDetails,
getMediaPoster,
} from "@movie-web/tmdb";
import type { ItemData } from "~/components/item/item";
import type { PlayerMeta } from "~/stores/player/slices/video";

View File

@@ -141,6 +141,7 @@ interface WatchHistoryItem {
interface WatchHistoryStoreState {
watchHistory: WatchHistoryItem[];
getWatchHistorItem: (media: ScrapeMedia) => WatchHistoryItem | undefined;
setWatchHistory: (watchHistory: WatchHistoryItem[]) => void;
updateWatchHistory: (
item: ItemData,
@@ -155,8 +156,23 @@ export const useWatchHistoryStore = create<
[["zustand/persist", WatchHistoryStoreState]]
>(
persist(
(set) => ({
(set, get) => ({
watchHistory: [],
getWatchHistorItem: (media: ScrapeMedia) =>
get().watchHistory.find((historyItem) => {
if (historyItem.media.type === "movie" && media.type === "movie") {
return historyItem.media.tmdbId === media.tmdbId;
} else if (
historyItem.media.type === "show" &&
media.type === "show"
) {
return (
historyItem.media.tmdbId === media.tmdbId &&
historyItem.media.season === media.season &&
historyItem.media.episode === media.episode
);
}
}),
setWatchHistory: (watchHistory: WatchHistoryItem[]) =>
set({ watchHistory }),
updateWatchHistory: (