Merge pull request #282 from Alexk2309/hotfix/for-settings

Hotfix/for settings
This commit is contained in:
Fredrik Burmester
2024-12-12 12:20:35 +01:00
committed by GitHub
6 changed files with 54 additions and 44 deletions

1
.gitignore vendored
View File

@@ -35,3 +35,4 @@ credentials.json
*.ipa *.ipa
.continuerc.json .continuerc.json
.vscode/

View File

@@ -11,7 +11,5 @@
}, },
"[swift]": { "[swift]": {
"editor.defaultFormatter": "sswg.swift-lang" "editor.defaultFormatter": "sswg.swift-lang"
}, }
"java.configuration.updateBuildConfiguration": "interactive",
"java.compile.nullAnalysis.mode": "automatic"
} }

View File

@@ -38,7 +38,6 @@ import Video, {
SelectedTrackType, SelectedTrackType,
VideoRef, VideoRef,
} from "react-native-video"; } from "react-native-video";
import index from "../(tabs)/(home)";
const Player = () => { const Player = () => {
const api = useAtomValue(apiAtom); const api = useAtomValue(apiAtom);
@@ -54,6 +53,7 @@ const Player = () => {
const [ignoreSafeAreas, setIgnoreSafeAreas] = useState(false); const [ignoreSafeAreas, setIgnoreSafeAreas] = useState(false);
const [isPlaying, setIsPlaying] = useState(false); const [isPlaying, setIsPlaying] = useState(false);
const [isBuffering, setIsBuffering] = useState(true); const [isBuffering, setIsBuffering] = useState(true);
const [isVideoLoaded, setIsVideoLoaded] = useState(false);
const setShowControls = useCallback((show: boolean) => { const setShowControls = useCallback((show: boolean) => {
_setShowControls(show); _setShowControls(show);
@@ -117,7 +117,14 @@ const Player = () => {
isLoading: isLoadingStreamUrl, isLoading: isLoadingStreamUrl,
isError: isErrorStreamUrl, isError: isErrorStreamUrl,
} = useQuery({ } = useQuery({
queryKey: ["stream-url", itemId, bitrateValue, mediaSourceId], queryKey: [
"stream-url",
itemId,
bitrateValue,
mediaSourceId,
subtitleIndex,
audioIndex,
],
queryFn: async () => { queryFn: async () => {
if (!api) { if (!api) {

View File

@@ -1,6 +1,12 @@
import { Settings, useSettings } from "@/utils/atoms/settings"; import { Settings, useSettings } from "@/utils/atoms/settings";
import { useAtomValue } from "jotai"; 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 { apiAtom } from "@/providers/JellyfinProvider";
import { getLocalizationApi, getUserApi } from "@jellyfin/sdk/lib/utils/api"; import { getLocalizationApi, getUserApi } from "@jellyfin/sdk/lib/utils/api";
import { import {
@@ -87,16 +93,14 @@ export const MediaProvider = ({ children }: { children: ReactNode }) => {
queryKey: ["authUser"], queryKey: ["authUser"],
queryFn: async () => { queryFn: async () => {
if (!api) return; if (!api) return;
const userApi = await getUserApi(api).getCurrentUser(); const userApi = await getUserApi(api).getCurrentUser();
return userApi.data; return userApi.data;
}, },
enabled: !!api, enabled: !!api,
staleTime: 0, staleTime: 0,
refetchOnMount: true,
}); });
const { data: cultures = [] } = useQuery({ const { data: cultures = [], isFetched: isCulturesFetched } = useQuery({
queryKey: ["cultures"], queryKey: ["cultures"],
queryFn: async () => { queryFn: async () => {
if (!api) return []; if (!api) return [];
@@ -105,35 +109,33 @@ export const MediaProvider = ({ children }: { children: ReactNode }) => {
return cultures; return cultures;
}, },
enabled: !!api, enabled: !!api,
staleTime: 0, staleTime: 43200000, // 12 hours
refetchOnMount: true,
}); });
// Set default settings from user configuration.s // Set default settings from user configuration.s
useEffect(() => { useEffect(() => {
if (user && cultures) { if (!user || cultures.length === 0) return;
const userSubtitlePreference = const userSubtitlePreference =
user?.Configuration?.SubtitleLanguagePreference; user?.Configuration?.SubtitleLanguagePreference;
const userAudioPreference = user?.Configuration?.AudioLanguagePreference; const userAudioPreference = user?.Configuration?.AudioLanguagePreference;
const subtitlePreference = cultures.find( const subtitlePreference = cultures.find(
(x) => x.ThreeLetterISOLanguageName === userSubtitlePreference (x) => x.ThreeLetterISOLanguageName === userSubtitlePreference
); );
const audioPreference = cultures.find( const audioPreference = cultures.find(
(x) => x.ThreeLetterISOLanguageName === userAudioPreference (x) => x.ThreeLetterISOLanguageName === userAudioPreference
); );
updateSettings({ updateSettings({
defaultSubtitleLanguage: subtitlePreference, defaultSubtitleLanguage: subtitlePreference,
defaultAudioLanguage: audioPreference, defaultAudioLanguage: audioPreference,
subtitleMode: user?.Configuration?.SubtitleMode, subtitleMode: user?.Configuration?.SubtitleMode,
playDefaultAudioTrack: user?.Configuration?.PlayDefaultAudioTrack, playDefaultAudioTrack: user?.Configuration?.PlayDefaultAudioTrack,
rememberAudioSelections: user?.Configuration?.RememberAudioSelections, rememberAudioSelections: user?.Configuration?.RememberAudioSelections,
rememberSubtitleSelections: rememberSubtitleSelections:
user?.Configuration?.RememberSubtitleSelections, user?.Configuration?.RememberSubtitleSelections,
}); });
} }, [user, isCulturesFetched]);
}, [user, cultures]);
if (!api) return null; if (!api) return null;

View File

@@ -318,7 +318,7 @@ export const Controls: React.FC<Props> = ({
const minutes = Math.floor((progressInSeconds % 3600) / 60); const minutes = Math.floor((progressInSeconds % 3600) / 60);
const seconds = progressInSeconds % 60; const seconds = progressInSeconds % 60;
setTime({ hours, minutes, seconds }); setTime({ hours, minutes, seconds });
}, 10), }, 3),
[] []
); );

View File

@@ -34,10 +34,15 @@ const DropdownView: React.FC<DropdownViewProps> = ({ showControls }) => {
}>(); }>();
// Either its on a text subtitle or its on not on any subtitle therefore it should show all the embedded HLS subtitles. // 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( const isOnTextSubtitle = useMemo(() => {
(x) => x.Index === parseInt(subtitleIndex) && x.IsTextSubtitleStream const res = Boolean(
) || subtitleIndex === "-1"; mediaSource?.MediaStreams?.find(
(x) => x.Index === parseInt(subtitleIndex) && x.IsTextSubtitleStream
) || subtitleIndex === "-1"
);
return res;
}, []);
const allSubs = const allSubs =
mediaSource?.MediaStreams?.filter((x) => x.Type === "Subtitle") ?? []; mediaSource?.MediaStreams?.filter((x) => x.Type === "Subtitle") ?? [];
@@ -76,8 +81,6 @@ const DropdownView: React.FC<DropdownViewProps> = ({ showControls }) => {
} }
}); });
console.log("sortedSubtitles", sortedSubtitles);
return [disableSubtitle, ...sortedSubtitles]; return [disableSubtitle, ...sortedSubtitles];
} }
@@ -90,7 +93,7 @@ const DropdownView: React.FC<DropdownViewProps> = ({ showControls }) => {
return [disableSubtitle, ...transcodedSubtitle]; return [disableSubtitle, ...transcodedSubtitle];
}, [item, isVideoLoaded, subtitleTracks, mediaSource?.MediaStreams]); }, [item, isVideoLoaded, subtitleTracks, mediaSource?.MediaStreams]);
const ChangeTranscodingSubtitle = useCallback( const changeToImageBasedSub = useCallback(
(subtitleIndex: number) => { (subtitleIndex: number) => {
const queryParams = new URLSearchParams({ const queryParams = new URLSearchParams({
itemId: item.Id ?? "", // Ensure itemId is a string itemId: item.Id ?? "", // Ensure itemId is a string
@@ -180,7 +183,7 @@ const DropdownView: React.FC<DropdownViewProps> = ({ showControls }) => {
<DropdownMenu.CheckboxItem <DropdownMenu.CheckboxItem
value={ value={
subtitleIndex === subtitleIndex ===
(sub.IsTextSubtitleStream && isOnTextSubtitle (isOnTextSubtitle && sub.IsTextSubtitleStream
? getSourceSubtitleIndex(sub.index).toString() ? getSourceSubtitleIndex(sub.index).toString()
: sub?.index.toString()) : sub?.index.toString())
} }
@@ -189,7 +192,7 @@ const DropdownView: React.FC<DropdownViewProps> = ({ showControls }) => {
console.log("sub", sub); console.log("sub", sub);
if ( if (
subtitleIndex === subtitleIndex ===
(sub.IsTextSubtitleStream && isOnTextSubtitle (isOnTextSubtitle && sub.IsTextSubtitleStream
? getSourceSubtitleIndex(sub.index).toString() ? getSourceSubtitleIndex(sub.index).toString()
: sub?.index.toString()) : sub?.index.toString())
) )
@@ -206,8 +209,7 @@ const DropdownView: React.FC<DropdownViewProps> = ({ showControls }) => {
setSubtitleTrack && setSubtitleTrack(sub.index); setSubtitleTrack && setSubtitleTrack(sub.index);
return; return;
} }
console.log("ChangeTranscodingSubtitle", subtitleIndex); changeToImageBasedSub(sub.index);
ChangeTranscodingSubtitle(sub.index);
}} }}
> >
<DropdownMenu.ItemTitle key={`subtitle-item-title-${idx}`}> <DropdownMenu.ItemTitle key={`subtitle-item-title-${idx}`}>