diff --git a/.gitignore b/.gitignore index 27dc1f71..33ed8e6d 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ credentials.json *.ipa .continuerc.json +.vscode/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 4571e3a1..22480b68 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,7 +11,5 @@ }, "[swift]": { "editor.defaultFormatter": "sswg.swift-lang" - }, - "java.configuration.updateBuildConfiguration": "interactive", - "java.compile.nullAnalysis.mode": "automatic" + } } diff --git a/app/(auth)/player/transcoding-player.tsx b/app/(auth)/player/transcoding-player.tsx index b72a9185..ce8a4c97 100644 --- a/app/(auth)/player/transcoding-player.tsx +++ b/app/(auth)/player/transcoding-player.tsx @@ -38,7 +38,6 @@ import Video, { SelectedTrackType, VideoRef, } from "react-native-video"; -import index from "../(tabs)/(home)"; const Player = () => { const api = useAtomValue(apiAtom); @@ -54,6 +53,7 @@ const Player = () => { const [ignoreSafeAreas, setIgnoreSafeAreas] = useState(false); const [isPlaying, setIsPlaying] = useState(false); const [isBuffering, setIsBuffering] = useState(true); + const [isVideoLoaded, setIsVideoLoaded] = useState(false); const setShowControls = useCallback((show: boolean) => { _setShowControls(show); @@ -117,7 +117,14 @@ const Player = () => { isLoading: isLoadingStreamUrl, isError: isErrorStreamUrl, } = useQuery({ - queryKey: ["stream-url", itemId, bitrateValue, mediaSourceId], + queryKey: [ + "stream-url", + itemId, + bitrateValue, + mediaSourceId, + subtitleIndex, + audioIndex, + ], queryFn: async () => { if (!api) { diff --git a/components/settings/MediaContext.tsx b/components/settings/MediaContext.tsx index 64acd5d1..c425b110 100644 --- a/components/settings/MediaContext.tsx +++ b/components/settings/MediaContext.tsx @@ -1,6 +1,12 @@ import { Settings, useSettings } from "@/utils/atoms/settings"; import { useAtomValue } from "jotai"; -import React, { createContext, useContext, ReactNode, useEffect } from "react"; +import React, { + createContext, + useContext, + ReactNode, + useEffect, + useState, +} from "react"; import { apiAtom } from "@/providers/JellyfinProvider"; import { getLocalizationApi, getUserApi } from "@jellyfin/sdk/lib/utils/api"; import { @@ -87,16 +93,14 @@ export const MediaProvider = ({ children }: { children: ReactNode }) => { queryKey: ["authUser"], queryFn: async () => { if (!api) return; - const userApi = await getUserApi(api).getCurrentUser(); return userApi.data; }, enabled: !!api, staleTime: 0, - refetchOnMount: true, }); - const { data: cultures = [] } = useQuery({ + const { data: cultures = [], isFetched: isCulturesFetched } = useQuery({ queryKey: ["cultures"], queryFn: async () => { if (!api) return []; @@ -105,35 +109,33 @@ export const MediaProvider = ({ children }: { children: ReactNode }) => { return cultures; }, enabled: !!api, - staleTime: 0, - refetchOnMount: true, + staleTime: 43200000, // 12 hours }); // Set default settings from user configuration.s useEffect(() => { - if (user && cultures) { - const userSubtitlePreference = - user?.Configuration?.SubtitleLanguagePreference; - const userAudioPreference = user?.Configuration?.AudioLanguagePreference; + if (!user || cultures.length === 0) return; + const userSubtitlePreference = + user?.Configuration?.SubtitleLanguagePreference; + const userAudioPreference = user?.Configuration?.AudioLanguagePreference; - const subtitlePreference = cultures.find( - (x) => x.ThreeLetterISOLanguageName === userSubtitlePreference - ); - const audioPreference = cultures.find( - (x) => x.ThreeLetterISOLanguageName === userAudioPreference - ); + const subtitlePreference = cultures.find( + (x) => x.ThreeLetterISOLanguageName === userSubtitlePreference + ); + const audioPreference = cultures.find( + (x) => x.ThreeLetterISOLanguageName === userAudioPreference + ); - updateSettings({ - defaultSubtitleLanguage: subtitlePreference, - defaultAudioLanguage: audioPreference, - subtitleMode: user?.Configuration?.SubtitleMode, - playDefaultAudioTrack: user?.Configuration?.PlayDefaultAudioTrack, - rememberAudioSelections: user?.Configuration?.RememberAudioSelections, - rememberSubtitleSelections: - user?.Configuration?.RememberSubtitleSelections, - }); - } - }, [user, cultures]); + updateSettings({ + defaultSubtitleLanguage: subtitlePreference, + defaultAudioLanguage: audioPreference, + subtitleMode: user?.Configuration?.SubtitleMode, + playDefaultAudioTrack: user?.Configuration?.PlayDefaultAudioTrack, + rememberAudioSelections: user?.Configuration?.RememberAudioSelections, + rememberSubtitleSelections: + user?.Configuration?.RememberSubtitleSelections, + }); + }, [user, isCulturesFetched]); if (!api) return null; diff --git a/components/video-player/controls/Controls.tsx b/components/video-player/controls/Controls.tsx index bedfeb31..bd3ea18a 100644 --- a/components/video-player/controls/Controls.tsx +++ b/components/video-player/controls/Controls.tsx @@ -318,7 +318,7 @@ export const Controls: React.FC = ({ const minutes = Math.floor((progressInSeconds % 3600) / 60); const seconds = progressInSeconds % 60; setTime({ hours, minutes, seconds }); - }, 10), + }, 3), [] ); diff --git a/components/video-player/controls/dropdown/DropdownViewTranscoding.tsx b/components/video-player/controls/dropdown/DropdownViewTranscoding.tsx index a555616a..515092a6 100644 --- a/components/video-player/controls/dropdown/DropdownViewTranscoding.tsx +++ b/components/video-player/controls/dropdown/DropdownViewTranscoding.tsx @@ -34,10 +34,15 @@ const DropdownView: React.FC = ({ showControls }) => { }>(); // Either its on a text subtitle or its on not on any subtitle therefore it should show all the embedded HLS subtitles. - const isOnTextSubtitle = - mediaSource?.MediaStreams?.find( - (x) => x.Index === parseInt(subtitleIndex) && x.IsTextSubtitleStream - ) || subtitleIndex === "-1"; + + const isOnTextSubtitle = useMemo(() => { + const res = Boolean( + mediaSource?.MediaStreams?.find( + (x) => x.Index === parseInt(subtitleIndex) && x.IsTextSubtitleStream + ) || subtitleIndex === "-1" + ); + return res; + }, []); const allSubs = mediaSource?.MediaStreams?.filter((x) => x.Type === "Subtitle") ?? []; @@ -76,8 +81,6 @@ const DropdownView: React.FC = ({ showControls }) => { } }); - console.log("sortedSubtitles", sortedSubtitles); - return [disableSubtitle, ...sortedSubtitles]; } @@ -90,7 +93,7 @@ const DropdownView: React.FC = ({ showControls }) => { return [disableSubtitle, ...transcodedSubtitle]; }, [item, isVideoLoaded, subtitleTracks, mediaSource?.MediaStreams]); - const ChangeTranscodingSubtitle = useCallback( + const changeToImageBasedSub = useCallback( (subtitleIndex: number) => { const queryParams = new URLSearchParams({ itemId: item.Id ?? "", // Ensure itemId is a string @@ -180,7 +183,7 @@ const DropdownView: React.FC = ({ showControls }) => { = ({ showControls }) => { console.log("sub", sub); if ( subtitleIndex === - (sub.IsTextSubtitleStream && isOnTextSubtitle + (isOnTextSubtitle && sub.IsTextSubtitleStream ? getSourceSubtitleIndex(sub.index).toString() : sub?.index.toString()) ) @@ -206,8 +209,7 @@ const DropdownView: React.FC = ({ showControls }) => { setSubtitleTrack && setSubtitleTrack(sub.index); return; } - console.log("ChangeTranscodingSubtitle", subtitleIndex); - ChangeTranscodingSubtitle(sub.index); + changeToImageBasedSub(sub.index); }} >