import React, { useMemo, useState } from "react"; import { View, TouchableOpacity } from "react-native"; import { Ionicons } from "@expo/vector-icons"; import * as DropdownMenu from "zeego/dropdown-menu"; import { useControlContext } from "../contexts/ControlContext"; import { useVideoContext } from "../contexts/VideoContext"; import { EmbeddedSubtitle, ExternalSubtitle } from "../types"; import { useAtomValue } from "jotai"; import { apiAtom } from "@/providers/JellyfinProvider"; import { router, useLocalSearchParams } from "expo-router"; interface DropdownViewDirectProps { showControls: boolean; offline?: boolean; // used to disable external subs for downloads } const DropdownViewDirect: React.FC = ({ showControls, offline = false, }) => { const api = useAtomValue(apiAtom); const ControlContext = useControlContext(); const mediaSource = ControlContext?.mediaSource; const item = ControlContext?.item; const isVideoLoaded = ControlContext?.isVideoLoaded; const videoContext = useVideoContext(); const { subtitleTracks, audioTracks, setSubtitleURL, setSubtitleTrack, setAudioTrack, } = videoContext; const allSubtitleTracksForDirectPlay = useMemo(() => { if (mediaSource?.TranscodingUrl) return null; const embeddedSubs = subtitleTracks ?.map((s) => ({ name: s.name, index: s.index, deliveryUrl: undefined, })) .filter((sub) => !sub.name.endsWith("[External]")) || []; const externalSubs = mediaSource?.MediaStreams?.filter( (stream) => stream.Type === "Subtitle" && !!stream.DeliveryUrl ).map((s) => ({ name: s.DisplayTitle! + " [External]", index: s.Index!, deliveryUrl: s.DeliveryUrl, })) || []; // Combine embedded subs with external subs only if not offline if (!offline) { return [...embeddedSubs, ...externalSubs] as ( | EmbeddedSubtitle | ExternalSubtitle )[]; } return embeddedSubs as EmbeddedSubtitle[]; }, [item, isVideoLoaded, subtitleTracks, mediaSource?.MediaStreams, offline]); const { subtitleIndex, audioIndex } = useLocalSearchParams<{ itemId: string; audioIndex: string; subtitleIndex: string; mediaSourceId: string; bitrateValue: string; }>(); return ( Subtitle {allSubtitleTracksForDirectPlay?.map((sub, idx: number) => ( { if ("deliveryUrl" in sub && sub.deliveryUrl) { setSubtitleURL && setSubtitleURL(api?.basePath + sub.deliveryUrl, sub.name); } else { setSubtitleTrack && setSubtitleTrack(sub.index); } router.setParams({ subtitleIndex: sub.index.toString(), }); }} > {sub.name} ))} Audio {audioTracks?.map((track, idx: number) => ( { setAudioTrack && setAudioTrack(track.index); router.setParams({ audioIndex: track.index.toString(), }); }} > {track.name} ))} ); }; export default DropdownViewDirect;