From 65ac1474417c8a67152c115b4f6961e3cf1eddff Mon Sep 17 00:00:00 2001 From: Fredrik Burmester Date: Sun, 18 Aug 2024 11:12:40 +0200 Subject: [PATCH] wip --- app.json | 19 - app/(auth)/(tabs)/home/_layout.tsx | 12 - app/(auth)/(tabs)/home/index.tsx | 15 - app/(auth)/downloads.tsx | 179 --- app/(auth)/items/[id].tsx | 6 - app/(auth)/settings.tsx | 15 +- app/(auth)/songs/[songId].tsx | 9 - app/_layout.tsx | 9 - components/DownloadItem.tsx | 138 --- components/downloads/EpisodeCard.tsx | 96 -- components/downloads/MovieCard.tsx | 99 -- components/downloads/SeriesCard.tsx | 49 - hooks/useDownloadMedia.ts | 117 -- hooks/useFiles.ts | 84 -- hooks/useRemuxHlsToMp4.ts | 138 --- package-lock.json | 1673 +++++++++++++++----------- package.json | 6 +- 17 files changed, 963 insertions(+), 1701 deletions(-) delete mode 100644 app/(auth)/downloads.tsx delete mode 100644 components/DownloadItem.tsx delete mode 100644 components/downloads/EpisodeCard.tsx delete mode 100644 components/downloads/MovieCard.tsx delete mode 100644 components/downloads/SeriesCard.tsx delete mode 100644 hooks/useDownloadMedia.ts delete mode 100644 hooks/useFiles.ts delete mode 100644 hooks/useRemuxHlsToMp4.ts diff --git a/app.json b/app.json index 8569d05b..19876abf 100644 --- a/app.json +++ b/app.json @@ -49,13 +49,6 @@ "@react-native-tvos/config-tv", "expo-router", "expo-font", - "@config-plugins/ffmpeg-kit-react-native", - [ - "react-native-google-cast", - { - "useDefaultExpandedMediaControls": true - } - ], [ "react-native-video", { @@ -69,18 +62,6 @@ } } ], - [ - "expo-build-properties", - { - "ios": { - "deploymentTarget": "14.0" - }, - "android": { - "minSdkVersion": 24, - "usesCleartextTraffic": true - } - } - ], [ "expo-screen-orientation", { diff --git a/app/(auth)/(tabs)/home/_layout.tsx b/app/(auth)/(tabs)/home/_layout.tsx index 94a68602..0330d0ed 100644 --- a/app/(auth)/(tabs)/home/_layout.tsx +++ b/app/(auth)/(tabs)/home/_layout.tsx @@ -17,18 +17,6 @@ export default function IndexLayout() { headerBlurEffect: "prominent", headerTransparent: Platform.OS === "ios" ? true : false, headerShadowVisible: false, - headerLeft: () => ( - { - router.push("/(auth)/downloads"); - }} - > - - - ), headerRight: () => ( diff --git a/app/(auth)/(tabs)/home/index.tsx b/app/(auth)/(tabs)/home/index.tsx index ccca5777..87b97c3c 100644 --- a/app/(auth)/(tabs)/home/index.tsx +++ b/app/(auth)/(tabs)/home/index.tsx @@ -217,21 +217,6 @@ export default function index() { return ( No Internet - - No worries, you can still watch{"\n"}downloaded content. - - - - ); } diff --git a/app/(auth)/downloads.tsx b/app/(auth)/downloads.tsx deleted file mode 100644 index 73603158..00000000 --- a/app/(auth)/downloads.tsx +++ /dev/null @@ -1,179 +0,0 @@ -import { Text } from "@/components/common/Text"; -import { MovieCard } from "@/components/downloads/MovieCard"; -import { SeriesCard } from "@/components/downloads/SeriesCard"; -import { Loader } from "@/components/Loader"; -import { runningProcesses } from "@/utils/atoms/downloads"; -import { queueAtom } from "@/utils/atoms/queue"; -import { Ionicons } from "@expo/vector-icons"; -import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models"; -import AsyncStorage from "@react-native-async-storage/async-storage"; -import { useQuery } from "@tanstack/react-query"; -import { router } from "expo-router"; -import { FFmpegKit } from "ffmpeg-kit-react-native"; -import { useAtom } from "jotai"; -import { useMemo } from "react"; -import { ScrollView, TouchableOpacity, View } from "react-native"; - -const downloads: React.FC = () => { - const [process, setProcess] = useAtom(runningProcesses); - const [queue, setQueue] = useAtom(queueAtom); - - const { data: downloadedFiles, isLoading } = useQuery({ - queryKey: ["downloaded_files", process?.item.Id], - queryFn: async () => - JSON.parse( - (await AsyncStorage.getItem("downloaded_files")) || "[]" - ) as BaseItemDto[], - staleTime: 0, - }); - - const movies = useMemo( - () => downloadedFiles?.filter((f) => f.Type === "Movie") || [], - [downloadedFiles] - ); - - const groupedBySeries = useMemo(() => { - const episodes = downloadedFiles?.filter((f) => f.Type === "Episode"); - const series: { [key: string]: BaseItemDto[] } = {}; - episodes?.forEach((e) => { - if (!series[e.SeriesName!]) series[e.SeriesName!] = []; - series[e.SeriesName!].push(e); - }); - return Object.values(series); - }, [downloadedFiles]); - - const eta = useMemo(() => { - const length = process?.item?.RunTimeTicks || 0; - - if (!process?.speed || !process?.progress) return ""; - - const timeLeft = - (length - length * (process.progress / 100)) / process.speed; - - return formatNumber(timeLeft / 10000); - }, [process]); - - if (isLoading) { - return ( - - - - ); - } - - return ( - - - - - Queue - - {queue.map((q) => ( - router.push(`/(auth)/items/${q.item.Id}`)} - className="relative bg-neutral-900 border border-neutral-800 p-4 rounded-2xl overflow-hidden flex flex-row items-center justify-between" - > - - {q.item.Name} - {q.item.Type} - - { - setQueue((prev) => prev.filter((i) => i.id !== q.id)); - }} - > - - - - ))} - - - {queue.length === 0 && ( - No items in queue - )} - - - - Active download - {process?.item ? ( - router.push(`/(auth)/items/${process.item.Id}`)} - className="relative bg-neutral-900 border border-neutral-800 p-4 rounded-2xl overflow-hidden flex flex-row items-center justify-between" - > - - {process.item.Name} - - {process.item.Type} - - - - {process.progress.toFixed(0)}% - - - {process.speed?.toFixed(2)}x - - - ETA {eta} - - - - { - FFmpegKit.cancel(); - setProcess(null); - }} - > - - - - - ) : ( - No active downloads - )} - - - {movies.length > 0 && ( - - - Movies - - {movies?.length} - - - {movies?.map((item: BaseItemDto) => ( - - - - ))} - - )} - {groupedBySeries?.map((items: BaseItemDto[], index: number) => ( - - ))} - - - ); -}; - -export default downloads; - -/* - * Format a number (Date.getTime) to a human readable string ex. 2m 34s - * @param {number} num - The number to format - * - * @returns {string} - The formatted string - */ -const formatNumber = (num: number) => { - const minutes = Math.floor(num / 60000); - const seconds = ((num % 60000) / 1000).toFixed(0); - return `${minutes}m ${seconds}s`; -}; diff --git a/app/(auth)/items/[id].tsx b/app/(auth)/items/[id].tsx index 91cbc7cf..98bdfb89 100644 --- a/app/(auth)/items/[id].tsx +++ b/app/(auth)/items/[id].tsx @@ -5,7 +5,6 @@ import { fullScreenAtom, playingAtom, } from "@/components/CurrentlyPlayingBar"; -import { DownloadItem } from "@/components/DownloadItem"; import { Loader } from "@/components/Loader"; import { OverviewText } from "@/components/OverviewText"; import { PlayButton } from "@/components/PlayButton"; @@ -245,11 +244,6 @@ const page: React.FC = () => { - {playbackUrl ? ( - - ) : ( - - )} diff --git a/app/(auth)/settings.tsx b/app/(auth)/settings.tsx index 348d3a24..87560a1f 100644 --- a/app/(auth)/settings.tsx +++ b/app/(auth)/settings.tsx @@ -7,12 +7,10 @@ import { useQuery } from "@tanstack/react-query"; import { useAtom } from "jotai"; import { ScrollView, View } from "react-native"; import * as Haptics from "expo-haptics"; -import { useFiles } from "@/hooks/useFiles"; import { SettingToggles } from "@/components/settings/SettingToggles"; export default function settings() { const { logout } = useJellyfin(); - const { deleteAllFiles } = useFiles(); const [api] = useAtom(apiAtom); const [user] = useAtom(userAtom); @@ -39,23 +37,12 @@ export default function settings() { -