From 402bdec5abf482f3be42df36b6c463b4261f6f01 Mon Sep 17 00:00:00 2001 From: Fredrik Burmester Date: Mon, 16 Sep 2024 18:18:08 +0200 Subject: [PATCH] wip --- bun.lockb | Bin 586349 -> 585857 bytes components/CurrentlyPlayingBar.tsx | 247 ++++++++++++++++--------- components/ItemContent.tsx | 2 +- components/settings/SettingToggles.tsx | 140 ++++++++++++-- hooks/useAdjacentEpisodes.ts | 8 - package.json | 1 - providers/PlaybackProvider.tsx | 18 +- utils/atoms/settings.ts | 19 ++ utils/hls/parseM3U8ForSubtitles.ts | 55 ++++++ utils/jellyfin/media/getStreamUrl.ts | 12 +- 10 files changed, 368 insertions(+), 134 deletions(-) create mode 100644 utils/hls/parseM3U8ForSubtitles.ts diff --git a/bun.lockb b/bun.lockb index d52330da3f4a35e7512a501063dca6039b3fb3d4..318a72c9a6fbb321ea9d530439f8892fdd203caa 100755 GIT binary patch delta 92940 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 IoLT;V0YS(kcK`qY delta 92294 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 { const { @@ -45,7 +56,6 @@ export const CurrentlyPlayingBar: React.FC = () => { setIsPlaying, isPlaying, videoRef, - progressTicks, onProgress, isBuffering: _isBuffering, setIsBuffering, @@ -53,6 +63,8 @@ export const CurrentlyPlayingBar: React.FC = () => { useNavigationBarVisibility(isPlaying); + const [settings] = useSettings(); + const insets = useSafeAreaInsets(); const segments = useSegments(); const router = useRouter(); @@ -69,7 +81,7 @@ export const CurrentlyPlayingBar: React.FC = () => { const screenHeight = Dimensions.get("window").height; const screenWidth = Dimensions.get("window").width; - const progress = useSharedValue(progressTicks || 0); + const progress = useSharedValue(0); const min = useSharedValue(0); const max = useSharedValue(currentlyPlaying?.item.RunTimeTicks || 0); const sliding = useRef(false); @@ -222,6 +234,56 @@ export const CurrentlyPlayingBar: React.FC = () => { showControls(); }, [currentlyPlaying]); + const { data: subtitleTracks } = useQuery({ + queryKey: ["subtitleTracks", currentlyPlaying?.url], + queryFn: async () => { + if (!currentlyPlaying?.url) { + console.log("No item url"); + return null; + } + + const tracks = await parseM3U8ForSubtitles(currentlyPlaying.url); + + console.log("Subtitle tracks", tracks); + return tracks; + }, + }); + + /** + * This should clean up all values if curentlyPlaying sets to null or changes + */ + useEffect(() => { + if (!currentlyPlaying) { + // Reset all local state and shared values + progress.value = 0; + min.value = 0; + max.value = 0; + cacheProgress.value = 0; + localIsBuffering.value = false; + sliding.current = false; + hideControls(); + + resetOrientation(); + } else { + // Initialize or update values based on the new currentlyPlaying item + progress.value = + currentlyPlaying.item?.UserData?.PlaybackPositionTicks || 0; + max.value = currentlyPlaying.item.RunTimeTicks || 0; + showControls(); + setOrientation( + settings?.defaultVideoOrientation || + ScreenOrientation.OrientationLock.LANDSCAPE_LEFT + ); + } + + // Cleanup function + return () => { + // Cancel any subscriptions or timers if you have any + // clearTimeout(timerId); + // unsubscribe(); + }; + }, [currentlyPlaying, settings]); + if (!api || !currentlyPlaying) return null; return ( @@ -232,68 +294,6 @@ export const CurrentlyPlayingBar: React.FC = () => { backgroundColor: "black", }} > - - - { - if (!isVisible) return; - toggleIgnoreSafeArea(); - }} - className="aspect-square rounded flex flex-col items-center justify-center p-2" - > - - - { - if (!isVisible) return; - stopPlayback(); - }} - className="aspect-square rounded flex flex-col items-center justify-center p-2" - > - - - - - - - - { - if (!isVisible) return; - skipIntro(); - }} - className="flex flex-col items-center justify-center px-2 py-1.5 bg-purple-600 rounded-full" - > - Skip intro - - - - { @@ -340,6 +340,15 @@ export const CurrentlyPlayingBar: React.FC = () => { subtitleStyle={{ fontSize: 16, }} + onTextTracks={(e) => { + console.log("onTextTracks ~", e.textTracks); + }} + onTextTrackDataChanged={(e) => { + console.log("onTextTrackDataChanged ~", e); + }} + onVideoTracks={(e) => { + console.log("onVideoTracks ~", e.videoTracks); + }} source={videoSource} onPlaybackStateChanged={(e) => { if (e.isPlaying === true) { @@ -362,7 +371,10 @@ export const CurrentlyPlayingBar: React.FC = () => { setIsPlaying(false); }} renderLoader={ - + } @@ -371,6 +383,87 @@ export const CurrentlyPlayingBar: React.FC = () => { + + + + + + + { + if (!isVisible) return; + skipIntro(); + }} + className="flex flex-col items-center justify-center px-2 py-1.5 bg-purple-600 rounded-full" + > + Skip intro + + + + + + + { + if (!isVisible) return; + toggleIgnoreSafeArea(); + }} + className="aspect-square rounded flex flex-col items-center justify-center p-2" + > + + + { + if (!isVisible) return; + stopPlayback(); + }} + className="aspect-square rounded flex flex-col items-center justify-center p-2" + > + + + + + { )} - + { - - - - ); }; diff --git a/components/ItemContent.tsx b/components/ItemContent.tsx index b92779d4..92dba1a7 100644 --- a/components/ItemContent.tsx +++ b/components/ItemContent.tsx @@ -56,7 +56,7 @@ export const ItemContent: React.FC<{ id: string }> = React.memo(({ id }) => { useState(null); const [selectedAudioStream, setSelectedAudioStream] = useState(-1); const [selectedSubtitleStream, setSelectedSubtitleStream] = - useState(0); + useState(-1); const [maxBitrate, setMaxBitrate] = useState({ key: "Max", value: undefined, diff --git a/components/settings/SettingToggles.tsx b/components/settings/SettingToggles.tsx index 902ce309..8d8e577d 100644 --- a/components/settings/SettingToggles.tsx +++ b/components/settings/SettingToggles.tsx @@ -2,6 +2,7 @@ import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; import { DefaultLanguageOption, DownloadOptions, + ScreenOrientationEnum, useSettings, } from "@/utils/atoms/settings"; import { getItemsApi } from "@jellyfin/sdk/lib/utils/api"; @@ -21,6 +22,7 @@ import { Input } from "../common/Input"; import { useState } from "react"; import { Button } from "../Button"; import { MediaToggles } from "./MediaToggles"; +import * as ScreenOrientation from "expo-screen-orientation"; interface Props extends ViewProps {} @@ -56,6 +58,8 @@ export const SettingToggles: React.FC = ({ ...props }) => { staleTime: 0, }); + if (!settings) return null; + return ( {/* @@ -88,7 +92,7 @@ export const SettingToggles: React.FC = ({ ...props }) => { updateSettings({ autoRotate: value })} /> @@ -102,7 +106,7 @@ export const SettingToggles: React.FC = ({ ...props }) => { updateSettings({ openFullScreenVideoPlayerByDefault: value }) } @@ -118,7 +122,7 @@ export const SettingToggles: React.FC = ({ ...props }) => { { updateSettings({ openInVLC: value, forceDirectPlay: value }); }} @@ -141,13 +145,13 @@ export const SettingToggles: React.FC = ({ ...props }) => { updateSettings({ usePopularPlugin: value }) } /> - {settings?.usePopularPlugin && ( + {settings.usePopularPlugin && ( {mediaListCollections?.map((mlc) => ( = ({ ...props }) => { {mlc.Name} { if (!settings.mediaListCollectionIds) { updateSettings({ @@ -171,11 +173,11 @@ export const SettingToggles: React.FC = ({ ...props }) => { updateSettings({ mediaListCollectionIds: - settings?.mediaListCollectionIds.includes(mlc.Id!) - ? settings?.mediaListCollectionIds.filter( + settings.mediaListCollectionIds.includes(mlc.Id!) + ? settings.mediaListCollectionIds.filter( (id) => id !== mlc.Id ) - : [...settings?.mediaListCollectionIds, mlc.Id!], + : [...settings.mediaListCollectionIds, mlc.Id!], }); }} /> @@ -206,7 +208,7 @@ export const SettingToggles: React.FC = ({ ...props }) => { updateSettings({ forceDirectPlay: value }) } @@ -216,7 +218,7 @@ export const SettingToggles: React.FC = ({ ...props }) => { @@ -229,7 +231,7 @@ export const SettingToggles: React.FC = ({ ...props }) => { - {settings?.deviceProfile} + {settings.deviceProfile} = ({ ...props }) => { + + Video orientation + + Set the full screen video player orientation. + + + + + + + {ScreenOrientationEnum[settings.defaultVideoOrientation]} + + + + + Orientation + { + updateSettings({ + defaultVideoOrientation: + ScreenOrientation.OrientationLock.DEFAULT, + }); + }} + > + + { + ScreenOrientationEnum[ + ScreenOrientation.OrientationLock.DEFAULT + ] + } + + + { + updateSettings({ + defaultVideoOrientation: + ScreenOrientation.OrientationLock.PORTRAIT_UP, + }); + }} + > + + { + ScreenOrientationEnum[ + ScreenOrientation.OrientationLock.PORTRAIT_UP + ] + } + + + { + updateSettings({ + defaultVideoOrientation: + ScreenOrientation.OrientationLock.LANDSCAPE_LEFT, + }); + }} + > + + { + ScreenOrientationEnum[ + ScreenOrientation.OrientationLock.LANDSCAPE_LEFT + ] + } + + + { + updateSettings({ + defaultVideoOrientation: + ScreenOrientation.OrientationLock.LANDSCAPE_RIGHT, + }); + }} + > + + { + ScreenOrientationEnum[ + ScreenOrientation.OrientationLock.LANDSCAPE_RIGHT + ] + } + + + + + + Search engine @@ -284,7 +386,7 @@ export const SettingToggles: React.FC = ({ ...props }) => { - {settings?.searchEngine} + {settings.searchEngine} = ({ ...props }) => { - {settings?.searchEngine === "Marlin" && ( + {settings.searchEngine === "Marlin" && ( <> @@ -346,7 +448,7 @@ export const SettingToggles: React.FC = ({ ...props }) => { - {settings?.marlinServerUrl} + {settings.marlinServerUrl} diff --git a/hooks/useAdjacentEpisodes.ts b/hooks/useAdjacentEpisodes.ts index ed371383..6cf47b18 100644 --- a/hooks/useAdjacentEpisodes.ts +++ b/hooks/useAdjacentEpisodes.ts @@ -39,10 +39,6 @@ export const useAdjacentEpisodes = ({ limit: 1, }); - console.log( - "Prev: ", - res.data.Items?.map((i) => i.Name) - ); return res.data.Items?.[0] || null; }, enabled: currentlyPlaying?.item.Type === "Episode", @@ -71,10 +67,6 @@ export const useAdjacentEpisodes = ({ limit: 1, }); - console.log( - "Next: ", - res.data.Items?.map((i) => i.Name) - ); return res.data.Items?.[0] || null; }, enabled: currentlyPlaying?.item.Type === "Episode", diff --git a/package.json b/package.json index 1b38dfc5..7ef47c29 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "@expo/vector-icons": "^14.0.2", "@gorhom/bottom-sheet": "^4", "@jellyfin/sdk": "^0.10.0", - "@kesha-antonov/react-native-background-downloader": "^3.2.0", "@react-native-async-storage/async-storage": "1.23.1", "@react-native-community/netinfo": "11.3.1", "@react-native-menu/menu": "^1.1.2", diff --git a/providers/PlaybackProvider.tsx b/providers/PlaybackProvider.tsx index d7f52acd..d98a79a3 100644 --- a/providers/PlaybackProvider.tsx +++ b/providers/PlaybackProvider.tsx @@ -25,6 +25,10 @@ import { debounce } from "lodash"; import { Alert } from "react-native"; import { OnProgressData, type VideoRef } from "react-native-video"; import { apiAtom, userAtom } from "./JellyfinProvider"; +import { + parseM3U8ForSubtitles, + SubtitleTrack, +} from "@/utils/hls/parseM3U8ForSubtitles"; export type CurrentlyPlayingState = { url: string; @@ -55,6 +59,7 @@ interface PlaybackContextType { startDownloadedFilePlayback: ( currentlyPlaying: CurrentlyPlayingState | null ) => void; + subtitles: SubtitleTrack[]; } const PlaybackContext = createContext(null); @@ -77,6 +82,7 @@ export const PlaybackProvider: React.FC<{ children: ReactNode }> = ({ const [progressTicks, setProgressTicks] = useState(0); const [volume, _setVolume] = useState(null); const [session, setSession] = useState(null); + const [subtitles, setSubtitles] = useState([]); const [currentlyPlaying, setCurrentlyPlaying] = useState(null); @@ -141,12 +147,6 @@ export const PlaybackProvider: React.FC<{ children: ReactNode }> = ({ setSession(res.data); setCurrentlyPlaying(state); setIsPlaying(true); - - if (settings?.openFullScreenVideoPlayerByDefault) { - setTimeout(() => { - presentFullscreenPlayer(); - }, 300); - } } else { setCurrentlyPlaying(null); setIsFullscreen(false); @@ -164,11 +164,6 @@ export const PlaybackProvider: React.FC<{ children: ReactNode }> = ({ onPress: () => { setCurrentlyPlaying(state); setIsPlaying(true); - if (settings?.openFullScreenVideoPlayerByDefault) { - setTimeout(() => { - presentFullscreenPlayer(); - }, 300); - } }, }, { @@ -375,6 +370,7 @@ export const PlaybackProvider: React.FC<{ children: ReactNode }> = ({ presentFullscreenPlayer, dismissFullscreenPlayer, startDownloadedFilePlayback, + subtitles, }} > {children} diff --git a/utils/atoms/settings.ts b/utils/atoms/settings.ts index 94229cd1..88528cf7 100644 --- a/utils/atoms/settings.ts +++ b/utils/atoms/settings.ts @@ -1,6 +1,7 @@ import { atom, useAtom } from "jotai"; import AsyncStorage from "@react-native-async-storage/async-storage"; import { useEffect } from "react"; +import * as ScreenOrientation from "expo-screen-orientation"; export type DownloadQuality = "original" | "high" | "low"; @@ -9,6 +10,22 @@ export type DownloadOption = { value: DownloadQuality; }; +export const ScreenOrientationEnum: Record< + ScreenOrientation.OrientationLock, + string +> = { + [ScreenOrientation.OrientationLock.DEFAULT]: "Default", + [ScreenOrientation.OrientationLock.ALL]: "All", + [ScreenOrientation.OrientationLock.PORTRAIT]: "Portrait", + [ScreenOrientation.OrientationLock.PORTRAIT_UP]: "Portrait Up", + [ScreenOrientation.OrientationLock.PORTRAIT_DOWN]: "Portrait Down", + [ScreenOrientation.OrientationLock.LANDSCAPE]: "Landscape", + [ScreenOrientation.OrientationLock.LANDSCAPE_LEFT]: "Landscape Left", + [ScreenOrientation.OrientationLock.LANDSCAPE_RIGHT]: "Landscape Right", + [ScreenOrientation.OrientationLock.OTHER]: "Other", + [ScreenOrientation.OrientationLock.UNKNOWN]: "Unknown", +}; + export const DownloadOptions: DownloadOption[] = [ { label: "Original quality", @@ -53,6 +70,7 @@ type Settings = { defaultSubtitleLanguage: DefaultLanguageOption | null; defaultAudioLanguage: DefaultLanguageOption | null; showHomeTitles: boolean; + defaultVideoOrientation: ScreenOrientation.OrientationLock; }; /** @@ -86,6 +104,7 @@ const loadSettings = async (): Promise => { defaultAudioLanguage: null, defaultSubtitleLanguage: null, showHomeTitles: true, + defaultVideoOrientation: ScreenOrientation.OrientationLock.DEFAULT, }; try { diff --git a/utils/hls/parseM3U8ForSubtitles.ts b/utils/hls/parseM3U8ForSubtitles.ts new file mode 100644 index 00000000..fb1902b0 --- /dev/null +++ b/utils/hls/parseM3U8ForSubtitles.ts @@ -0,0 +1,55 @@ +import axios from "axios"; + +export interface SubtitleTrack { + index: number; + name: string; + uri: string; + language: string; + default: boolean; + forced: boolean; + autoSelect: boolean; +} + +export async function parseM3U8ForSubtitles( + url: string +): Promise { + try { + const response = await axios.get(url, { responseType: "text" }); + const lines = response.data.split(/\r?\n/); + const subtitleTracks: SubtitleTrack[] = []; + let index = 0; + + lines.forEach((line: string) => { + if (line.startsWith("#EXT-X-MEDIA:TYPE=SUBTITLES")) { + const attributes = parseAttributes(line); + const track: SubtitleTrack = { + index: index++, + name: attributes["NAME"] || "", + uri: attributes["URI"] || "", + language: attributes["LANGUAGE"] || "", + default: attributes["DEFAULT"] === "YES", + forced: attributes["FORCED"] === "YES", + autoSelect: attributes["AUTOSELECT"] === "YES", + }; + subtitleTracks.push(track); + } + }); + + return subtitleTracks; + } catch (error) { + console.error("Failed to fetch or parse the M3U8 file:", error); + throw error; + } +} + +function parseAttributes(line: string): { [key: string]: string } { + const attributes: { [key: string]: string } = {}; + const parts = line.split(","); + parts.forEach((part) => { + const [key, value] = part.split("="); + if (key && value) { + attributes[key.trim()] = value.replace(/"/g, "").trim(); + } + }); + return attributes; +} diff --git a/utils/jellyfin/media/getStreamUrl.ts b/utils/jellyfin/media/getStreamUrl.ts index b5e46780..337c355c 100644 --- a/utils/jellyfin/media/getStreamUrl.ts +++ b/utils/jellyfin/media/getStreamUrl.ts @@ -5,6 +5,7 @@ import { MediaSourceInfo, PlaybackInfoResponse, } from "@jellyfin/sdk/lib/generated-client/models"; +import { getAuthHeaders } from "../jellyfin"; export const getStreamUrl = async ({ api, @@ -15,7 +16,7 @@ export const getStreamUrl = async ({ sessionData, deviceProfile = ios, audioStreamIndex = 0, - subtitleStreamIndex = 0, + subtitleStreamIndex = undefined, forceDirectPlay = false, height, mediaSourceId, @@ -39,6 +40,9 @@ export const getStreamUrl = async ({ const itemId = item.Id; + /** + * Build the stream URL for videos + */ const response = await api.axiosInstance.post( `${api.basePath}/Items/${itemId}/PlaybackInfo`, { @@ -58,9 +62,7 @@ export const getStreamUrl = async ({ EnableMpegtsM2TsMode: false, }, { - headers: { - Authorization: `MediaBrowser DeviceId="${api.deviceInfo.id}", Token="${api.accessToken}"`, - }, + headers: getAuthHeaders(api), } ); @@ -80,10 +82,8 @@ export const getStreamUrl = async ({ if (mediaSource.SupportsDirectPlay || forceDirectPlay === true) { if (item.MediaType === "Video") { - console.log("Using direct stream for video!"); url = `${api.basePath}/Videos/${itemId}/stream.mp4?playSessionId=${sessionData.PlaySessionId}&mediaSourceId=${mediaSource.Id}&static=true&subtitleStreamIndex=${subtitleStreamIndex}&audioStreamIndex=${audioStreamIndex}&deviceId=${api.deviceInfo.id}&api_key=${api.accessToken}`; } else if (item.MediaType === "Audio") { - console.log("Using direct stream for audio!"); const searchParams = new URLSearchParams({ UserId: userId, DeviceId: api.deviceInfo.id,