diff --git a/app.json b/app.json index d14d982c..fd339123 100644 --- a/app.json +++ b/app.json @@ -2,7 +2,7 @@ "expo": { "name": "Streamyfin", "slug": "streamyfin", - "version": "0.10.1", + "version": "0.10.2", "orientation": "default", "icon": "./assets/images/icon.png", "scheme": "streamyfin", @@ -33,7 +33,7 @@ }, "android": { "jsEngine": "hermes", - "versionCode": 30, + "versionCode": 31, "adaptiveIcon": { "foregroundImage": "./assets/images/icon.png" }, diff --git a/app/(auth)/(tabs)/(home)/downloads.tsx b/app/(auth)/(tabs)/(home)/downloads.tsx index 05765a97..706e3581 100644 --- a/app/(auth)/(tabs)/(home)/downloads.tsx +++ b/app/(auth)/(tabs)/(home)/downloads.tsx @@ -65,15 +65,14 @@ const downloads: React.FC = () => { } return ( - - + + Queue diff --git a/app/(auth)/(tabs)/(home)/settings.tsx b/app/(auth)/(tabs)/(home)/settings.tsx index 88667016..2a64b3ce 100644 --- a/app/(auth)/(tabs)/(home)/settings.tsx +++ b/app/(auth)/(tabs)/(home)/settings.tsx @@ -27,9 +27,15 @@ export default function settings() { const insets = useSafeAreaInsets(); return ( - + = ({ item, ...props }) => { item.Id }/universal?${searchParams.toString()}`; } - } - - if (mediaSource.TranscodingUrl) { + } else if (mediaSource.TranscodingUrl) { console.log("Using transcoded stream!"); url = `${api.basePath}${mediaSource.TranscodingUrl}`; - } else { - throw new Error("No transcoding url"); } + if (!url) throw new Error("No url"); + return await startRemuxing(url); }, [ api, diff --git a/components/MediaSourceSelector.tsx b/components/MediaSourceSelector.tsx index b32ceb4b..1478837a 100644 --- a/components/MediaSourceSelector.tsx +++ b/components/MediaSourceSelector.tsx @@ -36,6 +36,14 @@ export const MediaSourceSelector: React.FC = ({ if (mediaSources?.length) onChange(mediaSources[0]); }, [mediaSources]); + const name = (name?: string | null) => { + if (name && name.length > 40) + return ( + name.substring(0, 20) + " [...] " + name.substring(name.length - 20) + ); + return name; + }; + return ( = ({ onChange(source); }} > - {source.Name} + + {name(source.Name)} + ))} diff --git a/components/common/ItemImage.tsx b/components/common/ItemImage.tsx index 8d7c6461..c3ad2ed6 100644 --- a/components/common/ItemImage.tsx +++ b/components/common/ItemImage.tsx @@ -1,11 +1,9 @@ import { useImageColors } from "@/hooks/useImageColors"; import { apiAtom } from "@/providers/JellyfinProvider"; -import { itemThemeColorAtom } from "@/utils/atoms/primaryColor"; import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models"; import { Image, ImageProps, ImageSource } from "expo-image"; import { useAtom } from "jotai"; -import { useEffect, useMemo } from "react"; -import { getColors } from "react-native-image-colors"; +import { useMemo } from "react"; interface Props extends ImageProps { item: BaseItemDto; diff --git a/eas.json b/eas.json index fe95ec60..0105680f 100644 --- a/eas.json +++ b/eas.json @@ -21,13 +21,13 @@ } }, "production": { - "channel": "0.10.1", + "channel": "0.10.2", "android": { "image": "latest" } }, "production-apk": { - "channel": "0.10.1", + "channel": "0.10.2", "android": { "buildType": "apk", "image": "latest" diff --git a/providers/JellyfinProvider.tsx b/providers/JellyfinProvider.tsx index 311b5e52..7f9eebd9 100644 --- a/providers/JellyfinProvider.tsx +++ b/providers/JellyfinProvider.tsx @@ -62,7 +62,7 @@ export const JellyfinProvider: React.FC<{ children: ReactNode }> = ({ setJellyfin( () => new Jellyfin({ - clientInfo: { name: "Streamyfin", version: "0.10.1" }, + clientInfo: { name: "Streamyfin", version: "0.10.2" }, deviceInfo: { name: Platform.OS === "ios" ? "iOS" : "Android", id }, }) ); @@ -80,7 +80,7 @@ export const JellyfinProvider: React.FC<{ children: ReactNode }> = ({ return { authorization: `MediaBrowser Client="Streamyfin", Device=${ Platform.OS === "android" ? "Android" : "iOS" - }, DeviceId="${deviceId}", Version="0.10.1"`, + }, DeviceId="${deviceId}", Version="0.10.2"`, }; }, [deviceId]); diff --git a/utils/jellyfin/media/getStreamUrl.ts b/utils/jellyfin/media/getStreamUrl.ts index 38d9fb2e..28b47f8e 100644 --- a/utils/jellyfin/media/getStreamUrl.ts +++ b/utils/jellyfin/media/getStreamUrl.ts @@ -76,10 +76,12 @@ export const getStreamUrl = async ({ throw new Error("no PlaySessionId"); } + let url: string | null | undefined; + if (mediaSource.SupportsDirectPlay || forceDirectPlay === true) { if (item.MediaType === "Video") { console.log("Using direct stream for video!"); - return `${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}`; + 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({ @@ -97,16 +99,16 @@ export const getStreamUrl = async ({ EnableRedirection: "true", EnableRemoteMedia: "false", }); - return `${ + url = `${ api.basePath }/Audio/${itemId}/universal?${searchParams.toString()}`; } + } else if (mediaSource.TranscodingUrl) { + console.log("Using transcoded stream!"); + url = `${api.basePath}${mediaSource.TranscodingUrl}`; } - if (mediaSource.TranscodingUrl) { - console.log("Using transcoded stream!"); - return `${api.basePath}${mediaSource.TranscodingUrl}`; - } else { - throw new Error("No transcoding url"); - } + if (!url) throw new Error("No url"); + + return url; };