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 9be90a51..f382411b 100644 --- a/app/(auth)/player/transcoding-player.tsx +++ b/app/(auth)/player/transcoding-player.tsx @@ -30,7 +30,7 @@ import React, { useRef, useState, } from "react"; -import { BackHandler, View } from "react-native"; +import { View } from "react-native"; import { useSharedValue } from "react-native-reanimated"; import Video, { OnProgressData, @@ -38,7 +38,6 @@ import Video, { SelectedTrackType, VideoRef, } from "react-native-video"; -import index from "../(tabs)/(home)"; import { SubtitleHelper } from "@/utils/SubtitleHelper"; const Player = () => { @@ -55,6 +54,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); 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 4ce58084..7bbe7e82 100644 --- a/components/video-player/controls/dropdown/DropdownViewTranscoding.tsx +++ b/components/video-player/controls/dropdown/DropdownViewTranscoding.tsx @@ -35,14 +35,18 @@ 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") ?? []; - const textBasedSubs = allSubs.filter((x) => x.IsTextSubtitleStream); const subtitleHelper = new SubtitleHelper(mediaSource?.MediaStreams ?? []); @@ -75,7 +79,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 @@ -184,8 +188,7 @@ const DropdownView: React.FC = ({ showControls }) => { setSubtitleTrack && setSubtitleTrack(sub.index); return; } - console.log("ChangeTranscodingSubtitle", subtitleIndex); - ChangeTranscodingSubtitle(sub.index); + changeToImageBasedSub(sub.index); }} > diff --git a/utils/SubtitleHelper.ts b/utils/SubtitleHelper.ts index e957fa0d..e060f271 100644 --- a/utils/SubtitleHelper.ts +++ b/utils/SubtitleHelper.ts @@ -127,7 +127,7 @@ export class SubtitleHelper { // This function aims to get the source subtitle index from the embedded track index. getSourceSubtitleIndex = (embeddedTrackIndex: number): number => { if (Platform.OS === "android") { - return this.getSubtitles()[embeddedTrackIndex]?.Index ?? -1; + return this.getTextSubtitles()[embeddedTrackIndex]?.Index ?? -1; } return this.getUniqueTextBasedSubtitles()[embeddedTrackIndex]?.Index ?? -1; };