mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-06-18 20:00:25 +01:00
feat(chromecast): add modal components and integrate autoskip API
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user