feat(chromecast): add modal components and integrate autoskip API

This commit is contained in:
Uruk
2026-01-19 22:22:20 +01:00
parent 4a2d365d31
commit 519b2aa72f

View File

@@ -1,50 +1,47 @@
/** /**
* Hook for managing Chromecast segments (intro, credits, recap, commercial, preview) * Hook for managing Chromecast segments (intro, credits, recap, commercial, preview)
* Integrates with autoskip branch segment detection * Integrates with autoskip API for segment detection
*/ */
import type { BaseItemDto } from "@jellyfin/sdk/lib/generated-client"; import type { BaseItemDto } from "@jellyfin/sdk/lib/generated-client";
import { useAtomValue } from "jotai"; import { useAtomValue } from "jotai";
import { useCallback, useMemo } from "react"; import { useCallback, useMemo } from "react";
import { useDownloadedFiles } from "@/providers/Downloads/downloadProvider";
import { apiAtom } from "@/providers/JellyfinProvider"; import { apiAtom } from "@/providers/JellyfinProvider";
import { useSettings } from "@/utils/atoms/settings"; import { useSettings } from "@/utils/atoms/settings";
import { isWithinSegment } from "@/utils/chromecast/helpers"; import { isWithinSegment } from "@/utils/chromecast/helpers";
import type { ChromecastSegmentData } from "@/utils/chromecast/options"; import type { ChromecastSegmentData } from "@/utils/chromecast/options";
import { useSegments } from "@/utils/segments";
// Placeholder - will integrate with autoskip branch later
interface SegmentData {
introSegments?: Array<{ startTime: number; endTime: number; text: string }>;
creditSegments?: Array<{ startTime: number; endTime: number; text: string }>;
recapSegments?: Array<{ startTime: number; endTime: number; text: string }>;
commercialSegments?: Array<{
startTime: number;
endTime: number;
text: string;
}>;
previewSegments?: Array<{ startTime: number; endTime: number; text: string }>;
}
export const useChromecastSegments = ( export const useChromecastSegments = (
item: BaseItemDto | null, item: BaseItemDto | null,
currentProgressMs: number, currentProgressMs: number,
isOffline = false,
) => { ) => {
const _api = useAtomValue(apiAtom); const api = useAtomValue(apiAtom);
const { settings } = useSettings(); const { settings } = useSettings();
const { downloadedFiles } = useDownloadedFiles();
// TODO: Replace with actual segment fetching from autoskip branch // Fetch segments from autoskip API
// For now, using mock data structure const { data: segmentData } = useSegments(
const segmentData = useMemo<SegmentData>(() => { item?.Id || "",
return { isOffline,
introSegments: [], downloadedFiles,
creditSegments: [], api,
recapSegments: [], );
commercialSegments: [],
previewSegments: [],
};
}, [item?.Id]);
// Parse segments into usable format // Parse segments into usable format
const segments = useMemo<ChromecastSegmentData>(() => { const segments = useMemo<ChromecastSegmentData>(() => {
if (!segmentData) {
return {
intro: null,
credits: null,
recap: null,
commercial: [],
preview: [],
};
}
const intro = const intro =
segmentData.introSegments && segmentData.introSegments.length > 0 segmentData.introSegments && segmentData.introSegments.length > 0
? { ? {
@@ -140,20 +137,18 @@ export const useChromecastSegments = (
switch (currentSegment.type) { switch (currentSegment.type) {
case "intro": case "intro":
// TODO: Add autoSkipIntroEnabled setting return settings?.autoSkipIntro === true;
return false;
case "credits": case "credits":
// TODO: Add autoSkipCreditsEnabled setting return settings?.autoSkipCredits === true;
return false;
case "recap": case "recap":
case "commercial": case "commercial":
case "preview": case "preview":
// Add settings for these when available // These don't have settings yet, don't auto-skip
return false; return false;
default: default:
return false; return false;
} }
}, [currentSegment]); }, [currentSegment, settings?.autoSkipIntro, settings?.autoSkipCredits]);
return { return {
segments, segments,