Files
streamyfin/utils/tvDiscovery/sync.ts
2026-05-21 13:55:26 +02:00

89 lines
2.3 KiB
TypeScript

import type { Api } from "@jellyfin/sdk";
import type { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models";
import { Platform } from "react-native";
import { clearTvRecommendations, syncTvRecommendations } from "@/modules";
import {
clearTopShelfCacheSafely,
writeTopShelfPayload,
} from "@/utils/topshelf/cache";
import { buildTVDiscoveryPayload } from "./payload";
export function updateTVDiscovery({
api,
sections,
}: {
api: Api | null | undefined;
sections: Array<{ title: string; items: BaseItemDto[] | undefined }>;
}): void {
if (!Platform.isTV) return;
const payload = buildTVDiscoveryPayload({ api, sections });
if (!payload) {
console.log("[TVDiscovery] No payload generated; clearing TV discovery");
clearTVDiscoverySafely();
return;
}
const sectionSummary = payload.sections
.map((section) => `${section.title}:${section.items.length}`)
.join(", ");
console.log(
`[TVDiscovery] Sync payload prepared for ${Platform.OS} TV with ${payload.sections.length} section(s): ${sectionSummary}`,
);
if (Platform.OS === "ios") {
writeTopShelfPayload(payload, api?.accessToken || undefined);
return;
}
if (Platform.OS === "android") {
try {
const didSync = syncTvRecommendations(JSON.stringify(payload));
console.log(`[TVDiscovery] Android sync result: ${didSync}`);
if (!didSync) {
console.warn(
"[TVDiscovery] Android recommendations sync is unavailable",
);
}
} catch (error) {
console.warn(
"[TVDiscovery] Failed to sync Android recommendations",
error,
);
}
}
}
export function clearTVDiscoverySafely(): void {
if (!Platform.isTV) return;
console.log(`[TVDiscovery] Clearing TV discovery for ${Platform.OS} TV`);
if (Platform.OS === "ios") {
clearTopShelfCacheSafely();
return;
}
if (Platform.OS === "android") {
try {
const didClear = clearTvRecommendations();
console.log(`[TVDiscovery] Android clear result: ${didClear}`);
if (!didClear) {
console.warn(
"[TVDiscovery] Android recommendations clearer is unavailable",
);
}
} catch (error) {
console.warn(
"[TVDiscovery] Failed to clear Android recommendations",
error,
);
}
}
}