mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-06-15 10:20:27 +01:00
Merge pull request #282 from Alexk2309/hotfix/for-settings
Hotfix/for settings
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -35,3 +35,4 @@ credentials.json
|
|||||||
*.ipa
|
*.ipa
|
||||||
.continuerc.json
|
.continuerc.json
|
||||||
|
|
||||||
|
.vscode/
|
||||||
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@@ -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"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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),
|
||||||
[]
|
[]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -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}`}>
|
||||||
|
|||||||
Reference in New Issue
Block a user