mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-01-15 23:59:08 +00:00
chore: code improvements refactor
This commit is contained in:
@@ -41,16 +41,6 @@ const downloads: React.FC = () => {
|
|||||||
return Object.values(series);
|
return Object.values(series);
|
||||||
}, [downloadedFiles]);
|
}, [downloadedFiles]);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
console.log(
|
|
||||||
downloadedFiles?.map((i) => ({
|
|
||||||
name: i.Name,
|
|
||||||
codec: i.SourceType,
|
|
||||||
media: i.MediaSources?.[0].Container,
|
|
||||||
})),
|
|
||||||
);
|
|
||||||
}, [downloadedFiles]);
|
|
||||||
|
|
||||||
const [process, setProcess] = useAtom(runningProcesses);
|
const [process, setProcess] = useAtom(runningProcesses);
|
||||||
|
|
||||||
if (isLoading) {
|
if (isLoading) {
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ export default function page() {
|
|||||||
|
|
||||||
const fileUrl = useMemo(() => {
|
const fileUrl = useMemo(() => {
|
||||||
const u = FileSystem.documentDirectory + url;
|
const u = FileSystem.documentDirectory + url;
|
||||||
console.log({ u });
|
|
||||||
return u;
|
return u;
|
||||||
}, [url]);
|
}, [url]);
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import { Feather, FontAwesome, Ionicons } from "@expo/vector-icons";
|
|
||||||
import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models";
|
import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models";
|
||||||
import React, { useEffect } from "react";
|
import React, { useEffect } from "react";
|
||||||
import { TouchableOpacity, View } from "react-native";
|
|
||||||
import {
|
import {
|
||||||
CastButton,
|
CastButton,
|
||||||
useCastDevice,
|
useCastDevice,
|
||||||
@@ -9,14 +7,13 @@ import {
|
|||||||
useRemoteMediaClient,
|
useRemoteMediaClient,
|
||||||
} from "react-native-google-cast";
|
} from "react-native-google-cast";
|
||||||
import GoogleCast from "react-native-google-cast";
|
import GoogleCast from "react-native-google-cast";
|
||||||
import { Text } from "./common/Text";
|
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
item?: BaseItemDto | null;
|
item?: BaseItemDto | null;
|
||||||
startTimeTicks?: number | null;
|
startTimeTicks?: number | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const Chromecast: React.FC<Props> = ({ item, startTimeTicks }) => {
|
export const Chromecast: React.FC<Props> = () => {
|
||||||
const client = useRemoteMediaClient();
|
const client = useRemoteMediaClient();
|
||||||
const castDevice = useCastDevice();
|
const castDevice = useCastDevice();
|
||||||
const devices = useDevices();
|
const devices = useDevices();
|
||||||
@@ -26,43 +23,12 @@ export const Chromecast: React.FC<Props> = ({ item, startTimeTicks }) => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
(async () => {
|
(async () => {
|
||||||
if (!discoveryManager) {
|
if (!discoveryManager) {
|
||||||
console.log("No discoveryManager client");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await discoveryManager.startDiscovery();
|
await discoveryManager.startDiscovery();
|
||||||
|
|
||||||
const started = await discoveryManager.isRunning();
|
|
||||||
|
|
||||||
console.log({
|
|
||||||
devices,
|
|
||||||
castDevice,
|
|
||||||
sessionManager,
|
|
||||||
});
|
|
||||||
})();
|
})();
|
||||||
}, [client, devices, castDevice, sessionManager, discoveryManager]);
|
}, [client, devices, castDevice, sessionManager, discoveryManager]);
|
||||||
|
|
||||||
const cast = () => {
|
|
||||||
if (!client) {
|
|
||||||
console.log("No chromecast client");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
client.loadMedia({
|
|
||||||
mediaInfo: {
|
|
||||||
contentUrl:
|
|
||||||
"https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/mp4/BigBuckBunny.mp4",
|
|
||||||
contentType: "video/mp4",
|
|
||||||
metadata: {
|
|
||||||
type: item?.Type === "Episode" ? "tvShow" : "movie",
|
|
||||||
title: item?.Name || "",
|
|
||||||
subtitle: item?.Overview || "",
|
|
||||||
},
|
|
||||||
streamDuration: Math.floor((item?.RunTimeTicks || 0) / 10000),
|
|
||||||
},
|
|
||||||
startTime: Math.floor((startTimeTicks || 0) / 10000),
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return <CastButton style={{ tintColor: "white", height: 48, width: 48 }} />;
|
return <CastButton style={{ tintColor: "white", height: 48, width: 48 }} />;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -42,8 +42,6 @@ export const DownloadItem: React.FC<DownloadProps> = ({
|
|||||||
|
|
||||||
const source = playbackInfo.MediaSources?.[0];
|
const source = playbackInfo.MediaSources?.[0];
|
||||||
|
|
||||||
console.log("Source:", JSON.stringify(source));
|
|
||||||
|
|
||||||
if (source?.SupportsDirectPlay && item.CanDownload) {
|
if (source?.SupportsDirectPlay && item.CanDownload) {
|
||||||
downloadMedia(item);
|
downloadMedia(item);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { apiAtom, userAtom } from "@/providers/JellyfinProvider";
|
import { apiAtom, userAtom } from "@/providers/JellyfinProvider";
|
||||||
|
import { markAsNotPlayed } from "@/utils/jellyfin/playstate/markAsNotPlayed";
|
||||||
|
import { markAsPlayed } from "@/utils/jellyfin/playstate/markAsPlayed";
|
||||||
import { Ionicons } from "@expo/vector-icons";
|
import { Ionicons } from "@expo/vector-icons";
|
||||||
import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models";
|
import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models";
|
||||||
import { useQueryClient, InvalidateQueryFilters } from "@tanstack/react-query";
|
import { useQueryClient } from "@tanstack/react-query";
|
||||||
|
import * as Haptics from "expo-haptics";
|
||||||
import { useAtom } from "jotai";
|
import { useAtom } from "jotai";
|
||||||
import React, { useCallback } from "react";
|
import React, { useCallback } from "react";
|
||||||
import { TouchableOpacity, View } from "react-native";
|
import { TouchableOpacity, View } from "react-native";
|
||||||
import * as Haptics from "expo-haptics";
|
|
||||||
import { markAsNotPlayed } from "@/utils/jellyfin/playstate/markAsNotPlayed";
|
|
||||||
import { markAsPlayed } from "@/utils/jellyfin/playstate/markAsPlayed";
|
|
||||||
|
|
||||||
export const PlayedStatus: React.FC<{ item: BaseItemDto }> = ({ item }) => {
|
export const PlayedStatus: React.FC<{ item: BaseItemDto }> = ({ item }) => {
|
||||||
const [api] = useAtom(apiAtom);
|
const [api] = useAtom(apiAtom);
|
||||||
@@ -18,23 +18,18 @@ export const PlayedStatus: React.FC<{ item: BaseItemDto }> = ({ item }) => {
|
|||||||
const invalidateQueries = useCallback(() => {
|
const invalidateQueries = useCallback(() => {
|
||||||
queryClient.invalidateQueries({
|
queryClient.invalidateQueries({
|
||||||
queryKey: ["item", item.Id],
|
queryKey: ["item", item.Id],
|
||||||
refetchType: "all",
|
|
||||||
});
|
});
|
||||||
queryClient.invalidateQueries({
|
queryClient.invalidateQueries({
|
||||||
queryKey: ["resumeItems", user?.Id],
|
queryKey: ["resumeItems", user?.Id],
|
||||||
refetchType: "all",
|
|
||||||
});
|
});
|
||||||
queryClient.invalidateQueries({
|
queryClient.invalidateQueries({
|
||||||
queryKey: ["nextUp", item.SeriesId],
|
queryKey: ["nextUp", item.SeriesId],
|
||||||
refetchType: "all",
|
|
||||||
});
|
});
|
||||||
queryClient.invalidateQueries({
|
queryClient.invalidateQueries({
|
||||||
queryKey: ["episodes"],
|
queryKey: ["episodes"],
|
||||||
refetchType: "all",
|
|
||||||
});
|
});
|
||||||
queryClient.invalidateQueries({
|
queryClient.invalidateQueries({
|
||||||
queryKey: ["seasons"],
|
queryKey: ["seasons"],
|
||||||
refetchType: "all",
|
|
||||||
});
|
});
|
||||||
}, [api, item.Id, queryClient, user?.Id]);
|
}, [api, item.Id, queryClient, user?.Id]);
|
||||||
|
|
||||||
@@ -42,13 +37,13 @@ export const PlayedStatus: React.FC<{ item: BaseItemDto }> = ({ item }) => {
|
|||||||
<View>
|
<View>
|
||||||
{item.UserData?.Played ? (
|
{item.UserData?.Played ? (
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
onPress={() => {
|
onPress={async () => {
|
||||||
markAsNotPlayed({
|
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
|
||||||
|
await markAsNotPlayed({
|
||||||
api: api,
|
api: api,
|
||||||
itemId: item?.Id,
|
itemId: item?.Id,
|
||||||
userId: user?.Id,
|
userId: user?.Id,
|
||||||
});
|
});
|
||||||
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
|
|
||||||
invalidateQueries();
|
invalidateQueries();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -56,13 +51,13 @@ export const PlayedStatus: React.FC<{ item: BaseItemDto }> = ({ item }) => {
|
|||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
) : (
|
) : (
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
onPress={() => {
|
onPress={async () => {
|
||||||
markAsPlayed({
|
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
|
||||||
|
await markAsPlayed({
|
||||||
api: api,
|
api: api,
|
||||||
item: item,
|
item: item,
|
||||||
userId: user?.Id,
|
userId: user?.Id,
|
||||||
});
|
});
|
||||||
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
|
|
||||||
invalidateQueries();
|
invalidateQueries();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -105,8 +105,6 @@ export const VideoPlayer: React.FC<VideoPlayerProps> = ({
|
|||||||
deviceProfile: castDevice?.deviceId ? chromecastProfile : ios12,
|
deviceProfile: castDevice?.deviceId ? chromecastProfile : ios12,
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("Transcode URL:", url);
|
|
||||||
|
|
||||||
onChangePlaybackURL(url);
|
onChangePlaybackURL(url);
|
||||||
|
|
||||||
return url;
|
return url;
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
"expo-font": "~12.0.9",
|
"expo-font": "~12.0.9",
|
||||||
"expo-haptics": "~13.0.1",
|
"expo-haptics": "~13.0.1",
|
||||||
"expo-image": "~1.12.13",
|
"expo-image": "~1.12.13",
|
||||||
|
"expo-keep-awake": "~13.0.2",
|
||||||
"expo-linking": "~6.3.1",
|
"expo-linking": "~6.3.1",
|
||||||
"expo-router": "~3.5.20",
|
"expo-router": "~3.5.20",
|
||||||
"expo-splash-screen": "~0.27.5",
|
"expo-splash-screen": "~0.27.5",
|
||||||
|
|||||||
@@ -17,14 +17,14 @@ export const markAsNotPlayed = async ({
|
|||||||
api,
|
api,
|
||||||
itemId,
|
itemId,
|
||||||
userId,
|
userId,
|
||||||
}: MarkAsNotPlayedParams): Promise<boolean> => {
|
}: MarkAsNotPlayedParams): Promise<void> => {
|
||||||
if (!api || !itemId || !userId) {
|
if (!api || !itemId || !userId) {
|
||||||
console.error("Invalid parameters for markAsNotPlayed");
|
console.error("Invalid parameters for markAsNotPlayed");
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await api.axiosInstance.delete(
|
await api.axiosInstance.delete(
|
||||||
`${api.basePath}/UserPlayedItems/${itemId}`,
|
`${api.basePath}/UserPlayedItems/${itemId}`,
|
||||||
{
|
{
|
||||||
params: { userId },
|
params: { userId },
|
||||||
@@ -33,8 +33,6 @@ export const markAsNotPlayed = async ({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
return response.status === 200;
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const axiosError = error as AxiosError;
|
const axiosError = error as AxiosError;
|
||||||
console.error(
|
console.error(
|
||||||
@@ -42,6 +40,6 @@ export const markAsNotPlayed = async ({
|
|||||||
axiosError.message,
|
axiosError.message,
|
||||||
axiosError.response?.status,
|
axiosError.response?.status,
|
||||||
);
|
);
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -39,6 +39,6 @@ export const reportPlaybackProgress = async ({
|
|||||||
{ headers: getAuthHeaders(api) },
|
{ headers: getAuthHeaders(api) },
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
console.error(error);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ export const reportPlaybackStopped = async ({
|
|||||||
}: PlaybackStoppedParams): Promise<void> => {
|
}: PlaybackStoppedParams): Promise<void> => {
|
||||||
// Validate input parameters
|
// Validate input parameters
|
||||||
if (!api || !sessionId || !itemId || !positionTicks) {
|
if (!api || !sessionId || !itemId || !positionTicks) {
|
||||||
console.log("Missing required parameters", {
|
console.error("Missing required parameters", {
|
||||||
api,
|
api,
|
||||||
sessionId,
|
sessionId,
|
||||||
itemId,
|
itemId,
|
||||||
|
|||||||
Reference in New Issue
Block a user