A small web app for watching movies and shows easily
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

68 lines
1.9 KiB

import { useInitializePlayer } from "@/components/player/hooks/useInitializePlayer";
import {
PlayerMeta,
PlayerStatus,
playerStatus,
} from "@/stores/player/slices/source";
import { usePlayerStore } from "@/stores/player/store";
import { SourceSliceSource } from "@/stores/player/utils/qualities";
import { ProgressMediaItem, useProgressStore } from "@/stores/progress";
export interface Source {
url: string;
type: "hls" | "mp4";
}
function getProgress(
items: Record<string, ProgressMediaItem>,
meta: PlayerMeta | null
): number {
const item = items[meta?.tmdbId ?? ""];
if (!item || !meta) return 0;
if (meta.type === "movie") {
if (!item.progress) return 0;
return item.progress.watched;
}
const ep = item.episodes[meta.episode?.tmdbId ?? ""];
if (!ep) return 0;
return ep.progress.watched;
}
export function usePlayer() {
const setStatus = usePlayerStore((s) => s.setStatus);
const setMeta = usePlayerStore((s) => s.setMeta);
const setSource = usePlayerStore((s) => s.setSource);
const setSourceId = usePlayerStore((s) => s.setSourceId);
const status = usePlayerStore((s) => s.status);
const reset = usePlayerStore((s) => s.reset);
const meta = usePlayerStore((s) => s.meta);
const { init } = useInitializePlayer();
const progressStore = useProgressStore();
return {
meta,
reset,
status,
setMeta(m: PlayerMeta, newStatus?: PlayerStatus) {
setMeta(m, newStatus);
},
playMedia(
source: SourceSliceSource,
sourceId: string | null,
startAtOverride?: number
) {
const start = startAtOverride ?? getProgress(progressStore.items, meta);
setSource(source, start);
setSourceId(sourceId);
setStatus(playerStatus.PLAYING);
init();
},
setScrapeStatus() {
setStatus(playerStatus.SCRAPING);
},
setScrapeNotFound() {
setStatus(playerStatus.SCRAPE_NOT_FOUND);
},
};
}