mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-05-21 14:26:35 +01:00
89 lines
2.3 KiB
TypeScript
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,
|
|
);
|
|
}
|
|
}
|
|
}
|