import { useRemuxHlsToMp4 } from "@/hooks/useRemuxHlsToMp4"; import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; import { runningProcesses } from "@/utils/atoms/downloads"; import { queueActions, queueAtom } from "@/utils/atoms/queue"; import { getPlaybackInfo } from "@/utils/jellyfin/media/getPlaybackInfo"; import Ionicons from "@expo/vector-icons/Ionicons"; import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models"; import AsyncStorage from "@react-native-async-storage/async-storage"; import { useQuery } from "@tanstack/react-query"; import { router } from "expo-router"; import { useAtom } from "jotai"; import { TouchableOpacity, View } from "react-native"; import { Loader } from "./Loader"; import ProgressCircle from "./ProgressCircle"; type DownloadProps = { item: BaseItemDto; playbackUrl: string; }; export const DownloadItem: React.FC = ({ item, playbackUrl, }) => { const [api] = useAtom(apiAtom); const [user] = useAtom(userAtom); const [process] = useAtom(runningProcesses); const [queue, setQueue] = useAtom(queueAtom); const { startRemuxing } = useRemuxHlsToMp4(playbackUrl, item); const { data: playbackInfo, isLoading } = useQuery({ queryKey: ["playbackInfo", item.Id], queryFn: async () => getPlaybackInfo(api, item.Id, user?.Id), }); const { data: downloaded, isLoading: isLoadingDownloaded } = useQuery({ queryKey: ["downloaded", item.Id], queryFn: async () => { if (!item.Id) return false; const data: BaseItemDto[] = JSON.parse( (await AsyncStorage.getItem("downloaded_files")) || "[]" ); return data.some((d) => d.Id === item.Id); }, enabled: !!item.Id, }); if (isLoading || isLoadingDownloaded) { return ( ); } if (playbackInfo?.MediaSources?.[0].SupportsDirectPlay === false) { return ( ); } if (process && process?.item.Id === item.Id) { return ( { router.push("/downloads"); }} > {process.progress === 0 ? ( ) : ( )} ); } if (queue.some((i) => i.id === item.Id)) { return ( { router.push("/downloads"); }} > ); } if (downloaded) { return ( { router.push("/downloads"); }} > ); } else { return ( { queueActions.enqueue(queue, setQueue, { id: item.Id!, execute: async () => { await startRemuxing(); }, item, }); }} > ); } };