Fixed intro skipper for VLC

This commit is contained in:
Alex Kim
2024-10-28 21:40:09 +11:00
parent db20fffeb5
commit 0f178a502b
3 changed files with 41 additions and 6 deletions

View File

@@ -12,6 +12,7 @@ import { getDefaultPlaySettings } from "@/utils/jellyfin/getDefaultPlaySettings"
import { writeToLog } from "@/utils/log";
import {
formatTimeString,
msToSeconds,
msToTicks,
secondsToMs,
ticksToMs,
@@ -130,14 +131,16 @@ export const Controls: React.FC<Props> = ({
offline ? undefined : item.Id,
currentTime,
seek,
play
play,
isVlc
);
const { showSkipCreditButton, skipCredit } = useCreditSkipper(
offline ? undefined : item.Id,
currentTime,
seek,
play
play,
isVlc
);
const goToPreviousItem = useCallback(() => {

View File

@@ -4,6 +4,7 @@ import { useAtom } from "jotai";
import { apiAtom } from "@/providers/JellyfinProvider";
import { getAuthHeaders } from "@/utils/jellyfin/jellyfin";
import { writeToLog } from "@/utils/log";
import { msToSeconds, secondsToMs } from "@/utils/time";
interface CreditTimestamps {
Introduction: {
@@ -22,11 +23,24 @@ export const useCreditSkipper = (
itemId: string | undefined,
currentTime: number,
seek: (time: number) => void,
play: () => void
play: () => void,
isVlc: boolean = false
) => {
const [api] = useAtom(apiAtom);
const [showSkipCreditButton, setShowSkipCreditButton] = useState(false);
if (isVlc) {
currentTime = msToSeconds(currentTime);
}
const wrappedSeek = (seconds: number) => {
if (isVlc) {
seek(secondsToMs(seconds));
return;
}
seek(seconds);
};
const { data: creditTimestamps } = useQuery<CreditTimestamps | null>({
queryKey: ["creditTimestamps", itemId],
queryFn: async () => {
@@ -63,7 +77,7 @@ export const useCreditSkipper = (
const skipCredit = useCallback(() => {
if (!creditTimestamps) return;
try {
seek(creditTimestamps.Credits.End);
wrappedSeek(creditTimestamps.Credits.End);
setTimeout(() => {
play();
}, 200);

View File

@@ -4,6 +4,7 @@ import { useAtom } from "jotai";
import { apiAtom } from "@/providers/JellyfinProvider";
import { getAuthHeaders } from "@/utils/jellyfin/jellyfin";
import { writeToLog } from "@/utils/log";
import { msToSeconds, secondsToMs } from "@/utils/time";
interface IntroTimestamps {
EpisodeId: string;
@@ -14,14 +15,31 @@ interface IntroTimestamps {
Valid: boolean;
}
/**
* Custom hook to handle skipping intros in a media player.
*
* @param {number} currentTime - The current playback time in seconds.
*/
export const useIntroSkipper = (
itemId: string | undefined,
currentTime: number,
seek: (ticks: number) => void,
play: () => void
play: () => void,
isVlc: boolean = false
) => {
const [api] = useAtom(apiAtom);
const [showSkipButton, setShowSkipButton] = useState(false);
if (isVlc) {
currentTime = msToSeconds(currentTime);
}
const wrappedSeek = (seconds: number) => {
if (isVlc) {
seek(secondsToMs(seconds));
return;
}
seek(seconds);
};
const { data: introTimestamps } = useQuery<IntroTimestamps | null>({
queryKey: ["introTimestamps", itemId],
@@ -60,7 +78,7 @@ export const useIntroSkipper = (
console.log("skipIntro");
if (!introTimestamps) return;
try {
seek(introTimestamps.IntroEnd);
wrappedSeek(introTimestamps.IntroEnd);
setTimeout(() => {
play();
}, 200);