mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-04-22 00:34:43 +01:00
chore: update dependencies and refactor config plugin imports (#993)
This commit is contained in:
@@ -14,7 +14,7 @@ import { toast } from "sonner-native";
|
||||
import { Button } from "@/components/Button";
|
||||
import { Text } from "@/components/common/Text";
|
||||
import { TouchableItemRouter } from "@/components/common/TouchableItemRouter";
|
||||
import { ActiveDownloads } from "@/components/downloads/ActiveDownloads";
|
||||
import ActiveDownloads from "@/components/downloads/ActiveDownloads";
|
||||
import { DownloadSize } from "@/components/downloads/DownloadSize";
|
||||
import { MovieCard } from "@/components/downloads/MovieCard";
|
||||
import { SeriesCard } from "@/components/downloads/SeriesCard";
|
||||
|
||||
@@ -116,8 +116,8 @@ export default function page() {
|
||||
style={{
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
resizeMode: "contain",
|
||||
}}
|
||||
contentFit='contain'
|
||||
item={c}
|
||||
/>
|
||||
</View>
|
||||
|
||||
@@ -141,8 +141,8 @@ const page: React.FC = () => {
|
||||
style={{
|
||||
height: 130,
|
||||
width: "100%",
|
||||
resizeMode: "contain",
|
||||
}}
|
||||
contentFit='contain'
|
||||
/>
|
||||
) : undefined
|
||||
}
|
||||
|
||||
@@ -68,6 +68,7 @@ export default function page() {
|
||||
: require("react-native-volume-manager");
|
||||
|
||||
const downloadUtils = useDownload();
|
||||
const downloadedFiles = downloadUtils.getDownloadedItems();
|
||||
|
||||
const revalidateProgressCache = useInvalidatePlaybackProgressCache();
|
||||
|
||||
@@ -175,6 +176,13 @@ export default function page() {
|
||||
const fetchStreamData = async () => {
|
||||
setStreamStatus({ isLoading: true, isError: false });
|
||||
try {
|
||||
// Don't attempt to fetch stream data if item is not available
|
||||
if (!item?.Id) {
|
||||
console.log("Item not loaded yet, skipping stream data fetch");
|
||||
setStreamStatus({ isLoading: false, isError: false });
|
||||
return;
|
||||
}
|
||||
|
||||
let result: Stream | null = null;
|
||||
if (offline && downloadedItem && downloadedItem.mediaSource) {
|
||||
const url = downloadedItem.videoFilePath;
|
||||
@@ -186,13 +194,25 @@ export default function page() {
|
||||
};
|
||||
}
|
||||
} else {
|
||||
// Validate required parameters before calling getStreamUrl
|
||||
if (!api) {
|
||||
console.warn("API not available for streaming");
|
||||
setStreamStatus({ isLoading: false, isError: true });
|
||||
return;
|
||||
}
|
||||
if (!user?.Id) {
|
||||
console.warn("User not authenticated for streaming");
|
||||
setStreamStatus({ isLoading: false, isError: true });
|
||||
return;
|
||||
}
|
||||
|
||||
const native = generateDeviceProfile();
|
||||
const transcoding = generateDeviceProfile({ transcode: true });
|
||||
const res = await getStreamUrl({
|
||||
api,
|
||||
item,
|
||||
startTimeTicks: getInitialPlaybackTicks(),
|
||||
userId: user?.Id,
|
||||
userId: user.Id,
|
||||
audioStreamIndex: audioIndex,
|
||||
maxStreamingBitrate: bitrateValue,
|
||||
mediaSourceId: mediaSourceId,
|
||||
@@ -728,6 +748,8 @@ export default function page() {
|
||||
setAspectRatio={setAspectRatio}
|
||||
setScaleFactor={setScaleFactor}
|
||||
isVlc
|
||||
api={api}
|
||||
downloadedFiles={downloadedFiles}
|
||||
/>
|
||||
)}
|
||||
</View>
|
||||
|
||||
@@ -33,28 +33,25 @@ const BackGroundDownloader = !Platform.isTV
|
||||
import { DarkTheme, ThemeProvider } from "@react-navigation/native";
|
||||
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
||||
|
||||
const BackgroundFetch = !Platform.isTV
|
||||
? require("expo-background-fetch")
|
||||
: null;
|
||||
import * as BackgroundTask from "expo-background-task";
|
||||
|
||||
import * as Device from "expo-device";
|
||||
import * as FileSystem from "expo-file-system";
|
||||
|
||||
const Notifications = !Platform.isTV ? require("expo-notifications") : null;
|
||||
|
||||
import { getLocales } from "expo-localization";
|
||||
import { router, Stack, useSegments } from "expo-router";
|
||||
import * as SplashScreen from "expo-splash-screen";
|
||||
import * as ScreenOrientation from "@/packages/expo-screen-orientation";
|
||||
|
||||
const TaskManager = !Platform.isTV ? require("expo-task-manager") : null;
|
||||
|
||||
import { getLocales } from "expo-localization";
|
||||
import * as TaskManager from "expo-task-manager";
|
||||
import { Provider as JotaiProvider } from "jotai";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import { I18nextProvider } from "react-i18next";
|
||||
import { Appearance, AppState } from "react-native";
|
||||
import { SystemBars } from "react-native-edge-to-edge";
|
||||
import { GestureHandlerRootView } from "react-native-gesture-handler";
|
||||
import * as ScreenOrientation from "@/packages/expo-screen-orientation";
|
||||
import "react-native-reanimated";
|
||||
import { getSessionApi } from "@jellyfin/sdk/lib/utils/api/session-api";
|
||||
import type { EventSubscription } from "expo-modules-core";
|
||||
@@ -136,7 +133,7 @@ if (!Platform.isTV) {
|
||||
const result = response.data.filter((s) => s.NowPlayingItem);
|
||||
Notifications.setBadgeCountAsync(result.length);
|
||||
|
||||
return BackgroundFetch.BackgroundFetchResult.NewData;
|
||||
return BackgroundTask.BackgroundTaskResult.Success;
|
||||
});
|
||||
|
||||
TaskManager.defineTask(BACKGROUND_FETCH_TASK, async () => {
|
||||
@@ -144,22 +141,22 @@ if (!Platform.isTV) {
|
||||
|
||||
const settingsData = storage.getString("settings");
|
||||
|
||||
if (!settingsData) return BackgroundFetch.BackgroundFetchResult.NoData;
|
||||
if (!settingsData) return BackgroundTask.BackgroundTaskResult.Failed;
|
||||
|
||||
const settings: Partial<Settings> = JSON.parse(settingsData);
|
||||
|
||||
if (!settings?.autoDownload)
|
||||
return BackgroundFetch.BackgroundFetchResult.NoData;
|
||||
return BackgroundTask.BackgroundTaskResult.Failed;
|
||||
|
||||
const token = getTokenFromStorage();
|
||||
const deviceId = getOrSetDeviceId();
|
||||
const baseDirectory = FileSystem.documentDirectory;
|
||||
|
||||
if (!token || !deviceId || !baseDirectory)
|
||||
return BackgroundFetch.BackgroundFetchResult.NoData;
|
||||
return BackgroundTask.BackgroundTaskResult.Failed;
|
||||
|
||||
// Be sure to return the successful result type!
|
||||
return BackgroundFetch.BackgroundFetchResult.NewData;
|
||||
return BackgroundTask.BackgroundTaskResult.Success;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -168,22 +165,31 @@ const checkAndRequestPermissions = async () => {
|
||||
const hasAskedBefore = storage.getString(
|
||||
"hasAskedForNotificationPermission",
|
||||
);
|
||||
|
||||
let granted = false;
|
||||
if (hasAskedBefore !== "true") {
|
||||
const { status } = await Notifications.requestPermissionsAsync();
|
||||
|
||||
if (status === "granted") {
|
||||
granted = status === "granted";
|
||||
if (granted) {
|
||||
writeToLog("INFO", "Notification permissions granted.");
|
||||
console.log("Notification permissions granted.");
|
||||
} else {
|
||||
writeToLog("ERROR", "Notification permissions denied.");
|
||||
console.log("Notification permissions denied.");
|
||||
}
|
||||
|
||||
storage.set("hasAskedForNotificationPermission", "true");
|
||||
} else {
|
||||
console.log("Already asked for notification permissions before.");
|
||||
// Already asked before, check current status
|
||||
const { status } = await Notifications.getPermissionsAsync();
|
||||
granted = status === "granted";
|
||||
if (!granted) {
|
||||
writeToLog(
|
||||
"ERROR",
|
||||
"Notification permissions denied (already asked before).",
|
||||
);
|
||||
console.log("Notification permissions denied (already asked before).");
|
||||
}
|
||||
}
|
||||
return granted;
|
||||
} catch (error) {
|
||||
writeToLog(
|
||||
"ERROR",
|
||||
@@ -191,6 +197,7 @@ const checkAndRequestPermissions = async () => {
|
||||
error,
|
||||
);
|
||||
console.error("Error checking/requesting notification permissions:", error);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -264,7 +271,13 @@ function Layout() {
|
||||
});
|
||||
}
|
||||
|
||||
await checkAndRequestPermissions();
|
||||
const granted = await checkAndRequestPermissions();
|
||||
if (!granted) {
|
||||
console.log(
|
||||
"Notification permissions not granted, skipping background fetch and push token registration.",
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Platform.isTV && user && user.Policy?.IsAdministrator) {
|
||||
await registerBackgroundFetchAsyncSessions();
|
||||
@@ -280,7 +293,7 @@ function Layout() {
|
||||
|
||||
useEffect(() => {
|
||||
if (!Platform.isTV) {
|
||||
registerNotifications();
|
||||
void registerNotifications();
|
||||
|
||||
notificationListener.current =
|
||||
Notifications?.addNotificationReceivedListener(
|
||||
@@ -332,14 +345,8 @@ function Layout() {
|
||||
);
|
||||
|
||||
return () => {
|
||||
notificationListener.current &&
|
||||
Notifications?.removeNotificationSubscription(
|
||||
notificationListener.current,
|
||||
);
|
||||
responseListener.current &&
|
||||
Notifications?.removeNotificationSubscription(
|
||||
responseListener.current,
|
||||
);
|
||||
notificationListener.current?.remove();
|
||||
responseListener.current?.remove();
|
||||
};
|
||||
}
|
||||
}, [user, api]);
|
||||
|
||||
Reference in New Issue
Block a user