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
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); |
|
}, |
|
}; |
|
}
|
|
|