mirror of
https://github.com/streamyfin/streamyfin.git
synced 2025-08-20 18:37:18 +02:00
livetv
This commit is contained in:
@@ -247,7 +247,7 @@ const page: React.FC = () => {
|
||||
}}
|
||||
set={setSelectedGenres}
|
||||
values={selectedGenres}
|
||||
title={t("library.headers.genres")}
|
||||
title={t("library.filters.genres")}
|
||||
renderItemLabel={(item) => item.toString()}
|
||||
searchFilter={(item, search) =>
|
||||
item.toLowerCase().includes(search.toLowerCase())
|
||||
@@ -274,7 +274,7 @@ const page: React.FC = () => {
|
||||
}}
|
||||
set={setSelectedYears}
|
||||
values={selectedYears}
|
||||
title={t("library.headers.years")}
|
||||
title={t("library.filters.years")}
|
||||
renderItemLabel={(item) => item.toString()}
|
||||
searchFilter={(item, search) => item.includes(search)}
|
||||
/>
|
||||
@@ -299,7 +299,7 @@ const page: React.FC = () => {
|
||||
}}
|
||||
set={setSelectedTags}
|
||||
values={selectedTags}
|
||||
title={t("library.headers.tags")}
|
||||
title={t("library.filters.tags")}
|
||||
renderItemLabel={(item) => item.toString()}
|
||||
searchFilter={(item, search) =>
|
||||
item.toLowerCase().includes(search.toLowerCase())
|
||||
@@ -317,7 +317,7 @@ const page: React.FC = () => {
|
||||
queryFn={async () => sortOptions.map((s) => s.key)}
|
||||
set={setSortBy}
|
||||
values={sortBy}
|
||||
title={t("library.headers.sort_by")}
|
||||
title={t("library.filters.sort_by")}
|
||||
renderItemLabel={(item) =>
|
||||
sortOptions.find((i) => i.key === item)?.value || ""
|
||||
}
|
||||
@@ -337,7 +337,7 @@ const page: React.FC = () => {
|
||||
queryFn={async () => sortOrderOptions.map((s) => s.key)}
|
||||
set={setSortOrder}
|
||||
values={sortOrder}
|
||||
title={t("library.headers.sort_order")}
|
||||
title={t("library.filters.sort_order")}
|
||||
renderItemLabel={(item) =>
|
||||
sortOrderOptions.find((i) => i.key === item)?.value || ""
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import {
|
||||
View,
|
||||
} from "react-native";
|
||||
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
const HOUR_HEIGHT = 30;
|
||||
const ITEMS_PER_PAGE = 20;
|
||||
@@ -177,6 +178,7 @@ const PageButtons: React.FC<PageButtonsProps> = ({
|
||||
onNextPage,
|
||||
isNextDisabled,
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
<View className="flex flex-row justify-between items-center bg-neutral-800 w-full px-4 py-2">
|
||||
<TouchableOpacity
|
||||
@@ -194,7 +196,7 @@ const PageButtons: React.FC<PageButtonsProps> = ({
|
||||
currentPage === 1 ? "text-gray-500" : "text-white"
|
||||
}`}
|
||||
>
|
||||
Previous
|
||||
{t("live_tv.previous")}
|
||||
</Text>
|
||||
</TouchableOpacity>
|
||||
<Text className="text-white">Page {currentPage}</Text>
|
||||
@@ -206,7 +208,7 @@ const PageButtons: React.FC<PageButtonsProps> = ({
|
||||
<Text
|
||||
className={`mr-1 ${isNextDisabled ? "text-gray-500" : "text-white"}`}
|
||||
>
|
||||
Next
|
||||
{t("live_tv.next")}
|
||||
</Text>
|
||||
<Ionicons
|
||||
name="chevron-forward"
|
||||
|
||||
@@ -7,12 +7,15 @@ import { useAtom } from "jotai";
|
||||
import React from "react";
|
||||
import { ScrollView, View } from "react-native";
|
||||
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export default function page() {
|
||||
const [api] = useAtom(apiAtom);
|
||||
const [user] = useAtom(userAtom);
|
||||
const insets = useSafeAreaInsets();
|
||||
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<ScrollView
|
||||
nestedScrollEnabled
|
||||
@@ -28,7 +31,7 @@ export default function page() {
|
||||
<View className="flex flex-col space-y-2">
|
||||
<ScrollingCollectionList
|
||||
queryKey={["livetv", "recommended"]}
|
||||
title={"On now"}
|
||||
title={t("live_tv.on_now")}
|
||||
queryFn={async () => {
|
||||
if (!api) return [] as BaseItemDto[];
|
||||
const res = await getLiveTvApi(api).getRecommendedPrograms({
|
||||
@@ -46,7 +49,7 @@ export default function page() {
|
||||
/>
|
||||
<ScrollingCollectionList
|
||||
queryKey={["livetv", "shows"]}
|
||||
title={"Shows"}
|
||||
title={t("live_tv.shows")}
|
||||
queryFn={async () => {
|
||||
if (!api) return [] as BaseItemDto[];
|
||||
const res = await getLiveTvApi(api).getLiveTvPrograms({
|
||||
@@ -68,7 +71,7 @@ export default function page() {
|
||||
/>
|
||||
<ScrollingCollectionList
|
||||
queryKey={["livetv", "movies"]}
|
||||
title={"Movies"}
|
||||
title={t("live_tv.movies")}
|
||||
queryFn={async () => {
|
||||
if (!api) return [] as BaseItemDto[];
|
||||
const res = await getLiveTvApi(api).getLiveTvPrograms({
|
||||
@@ -86,7 +89,7 @@ export default function page() {
|
||||
/>
|
||||
<ScrollingCollectionList
|
||||
queryKey={["livetv", "sports"]}
|
||||
title={"Sports"}
|
||||
title={t("live_tv.sports")}
|
||||
queryFn={async () => {
|
||||
if (!api) return [] as BaseItemDto[];
|
||||
const res = await getLiveTvApi(api).getLiveTvPrograms({
|
||||
@@ -104,7 +107,7 @@ export default function page() {
|
||||
/>
|
||||
<ScrollingCollectionList
|
||||
queryKey={["livetv", "kids"]}
|
||||
title={"For Kids"}
|
||||
title={t("live_tv.for_kids")}
|
||||
queryFn={async () => {
|
||||
if (!api) return [] as BaseItemDto[];
|
||||
const res = await getLiveTvApi(api).getLiveTvPrograms({
|
||||
@@ -122,7 +125,7 @@ export default function page() {
|
||||
/>
|
||||
<ScrollingCollectionList
|
||||
queryKey={["livetv", "news"]}
|
||||
title={"News"}
|
||||
title={t("live_tv.news")}
|
||||
queryFn={async () => {
|
||||
if (!api) return [] as BaseItemDto[];
|
||||
const res = await getLiveTvApi(api).getLiveTvPrograms({
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
import { Text } from "@/components/common/Text";
|
||||
import React from "react";
|
||||
import { View } from "react-native";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export default function page() {
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
<View className="flex items-center justify-center h-full -mt-12">
|
||||
<Text>Coming soon</Text>
|
||||
<Text>{t("live_tv.coming_soon")}</Text>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -303,7 +303,7 @@ const Page = () => {
|
||||
}}
|
||||
set={setSelectedGenres}
|
||||
values={selectedGenres}
|
||||
title={t("library.headers.genres")}
|
||||
title={t("library.filters.genres")}
|
||||
renderItemLabel={(item) => item.toString()}
|
||||
searchFilter={(item, search) =>
|
||||
item.toLowerCase().includes(search.toLowerCase())
|
||||
@@ -330,7 +330,7 @@ const Page = () => {
|
||||
}}
|
||||
set={setSelectedYears}
|
||||
values={selectedYears}
|
||||
title={t("library.headers.years")}
|
||||
title={t("library.filters.years")}
|
||||
renderItemLabel={(item) => item.toString()}
|
||||
searchFilter={(item, search) => item.includes(search)}
|
||||
/>
|
||||
@@ -355,7 +355,7 @@ const Page = () => {
|
||||
}}
|
||||
set={setSelectedTags}
|
||||
values={selectedTags}
|
||||
title={t("library.headers.tags")}
|
||||
title={t("library.filters.tags")}
|
||||
renderItemLabel={(item) => item.toString()}
|
||||
searchFilter={(item, search) =>
|
||||
item.toLowerCase().includes(search.toLowerCase())
|
||||
@@ -373,7 +373,7 @@ const Page = () => {
|
||||
queryFn={async () => sortOptions.map((s) => s.key)}
|
||||
set={setSortBy}
|
||||
values={sortBy}
|
||||
title={t("library.headers.sort_by")}
|
||||
title={t("library.filters.sort_by")}
|
||||
renderItemLabel={(item) =>
|
||||
sortOptions.find((i) => i.key === item)?.value || ""
|
||||
}
|
||||
@@ -393,7 +393,7 @@ const Page = () => {
|
||||
queryFn={async () => sortOrderOptions.map((s) => s.key)}
|
||||
set={setSortOrder}
|
||||
values={sortOrder}
|
||||
title={t("library.headers.sort_order")}
|
||||
title={t("library.filters.sort_order")}
|
||||
renderItemLabel={(item) =>
|
||||
sortOrderOptions.find((i) => i.key === item)?.value || ""
|
||||
}
|
||||
|
||||
@@ -45,19 +45,19 @@ export const VideoDebugInfo: React.FC<Props> = ({ playerRef, ...props }) => {
|
||||
}}
|
||||
{...props}
|
||||
>
|
||||
<Text className="font-bold">{t("item_card.playback_state")}</Text>
|
||||
<Text className="font-bold mt-2.5">{t("item_card.audio_tracks")}</Text>
|
||||
<Text className="font-bold">{t("player.playback_state")}</Text>
|
||||
<Text className="font-bold mt-2.5">{t("player.audio_tracks")}</Text>
|
||||
{audioTracks &&
|
||||
audioTracks.map((track, index) => (
|
||||
<Text key={index}>
|
||||
{track.name} ({t("item_card.index")} {track.index})
|
||||
{track.name} ({t("player.index")} {track.index})
|
||||
</Text>
|
||||
))}
|
||||
<Text className="font-bold mt-2.5">{t("item_card.subtitles_tracks")}</Text>
|
||||
<Text className="font-bold mt-2.5">{t("player.subtitles_tracks")}</Text>
|
||||
{subtitleTracks &&
|
||||
subtitleTracks.map((track, index) => (
|
||||
<Text key={index}>
|
||||
{track.name} ({t("item_card.index")} {track.index})
|
||||
{track.name} ({t("player.index")} {track.index})
|
||||
</Text>
|
||||
))}
|
||||
<TouchableOpacity
|
||||
@@ -69,7 +69,7 @@ export const VideoDebugInfo: React.FC<Props> = ({ playerRef, ...props }) => {
|
||||
}
|
||||
}}
|
||||
>
|
||||
<Text className="text-white text-center">{t("item_card.refresh_tracks")}</Text>
|
||||
<Text className="text-white text-center">{t("player.refresh_tracks")}</Text>
|
||||
</TouchableOpacity>
|
||||
</View>
|
||||
);
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
"show_titles": "Show titles",
|
||||
"show_stats": "Show stats"
|
||||
},
|
||||
"headers": {
|
||||
"filters": {
|
||||
"genres": "Genres",
|
||||
"years": "Years",
|
||||
"sort_by": "Sort By",
|
||||
@@ -272,7 +272,13 @@
|
||||
"message_from_server": "Message from server: {{message}}",
|
||||
"video_has_finished_playing": "Video has finished playing!",
|
||||
"no_video_source": "No video source...",
|
||||
"next_episode": "Next Episode"
|
||||
"next_episode": "Next Episode",
|
||||
"refresh_tracks": "Refresh Tracks",
|
||||
"subtitle_tracks": "Subtitle Tracks:",
|
||||
"audio_tracks": "Audio Tracks:",
|
||||
"playback_state": "Playback State:",
|
||||
"no_data_available": "No data available",
|
||||
"index": "Index:"
|
||||
},
|
||||
"item_card": {
|
||||
"next_up": "Next up",
|
||||
@@ -298,12 +304,6 @@
|
||||
"x_albums": "{{count}} albums",
|
||||
"artists": "Artists",
|
||||
"could_not_load_item": "Could not load item",
|
||||
"refresh_tracks": "Refresh Tracks",
|
||||
"subtitle_tracks": "Subtitle Tracks:",
|
||||
"audio_tracks": "Audio Tracks:",
|
||||
"playback_state": "Playback State:",
|
||||
"no_data_available": "No data available",
|
||||
"index": "Index:",
|
||||
"download": {
|
||||
"download_season": "Download Season",
|
||||
"download_x_item": "Download {{item_count}} items",
|
||||
@@ -312,6 +312,18 @@
|
||||
"using_default_method": "Using default method"
|
||||
}
|
||||
},
|
||||
"live_tv": {
|
||||
"next": "Next",
|
||||
"previous": "Previous",
|
||||
"live_tv": "Live TV",
|
||||
"coming_soon": "Coming soon",
|
||||
"on_now": "On now",
|
||||
"shows": "Shows",
|
||||
"movies": "Movies",
|
||||
"sports": "Sports",
|
||||
"for_kids": "For Kids",
|
||||
"news": "News"
|
||||
},
|
||||
"jellyseerr":{
|
||||
"confirm": "Confirm",
|
||||
"cancel": "Cancel",
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
"clear_button": "Effacer"
|
||||
},
|
||||
"home": {
|
||||
"home": "Accueil",
|
||||
"no_internet": "Pas d'Internet",
|
||||
"no_items": "Aucun item",
|
||||
"no_internet_message": "Aucun problème, vous pouvez toujours regarder\nle contenu téléchargé.",
|
||||
@@ -243,7 +242,7 @@
|
||||
"show_titles": "Afficher les titres",
|
||||
"show_stats": "Afficher les statistiques"
|
||||
},
|
||||
"headers": {
|
||||
"filters": {
|
||||
"genres": "Genres",
|
||||
"years": "Années",
|
||||
"sort_by": "Trier par",
|
||||
@@ -273,7 +272,13 @@
|
||||
"message_from_server": "Message du serveur: {{message}}",
|
||||
"video_has_finished_playing": "La vidéo a fini de jouer!",
|
||||
"no_video_source": "Aucune source vidéo...",
|
||||
"next_episode": "Épisode suivant"
|
||||
"next_episode": "Épisode suivant",
|
||||
"refresh_tracks": "Rafraîchir les pistes",
|
||||
"subtitle_tracks": "Pistes de sous-titres:",
|
||||
"audio_tracks": "Pistes audio:",
|
||||
"playback_state": "État de lecture:",
|
||||
"no_data_available": "Aucune donnée disponible",
|
||||
"index": "Index:"
|
||||
},
|
||||
"item_card": {
|
||||
"next_up": "À suivre",
|
||||
@@ -299,12 +304,6 @@
|
||||
"x_albums": "{{count}} albums",
|
||||
"artists": "Artistes",
|
||||
"could_not_load_item": "Impossible de charger l'item",
|
||||
"refresh_tracks": "Rafraîchir les pistes",
|
||||
"subtitle_tracks": "Pistes de sous-titres:",
|
||||
"audio_tracks": "Pistes audio:",
|
||||
"playback_state": "État de lecture:",
|
||||
"no_data_available": "Aucune donnée disponible",
|
||||
"index": "Index:",
|
||||
"download": {
|
||||
"download_season": "Télécharger la saison",
|
||||
"download_x_item": "Télécharger {{item_count}} items",
|
||||
@@ -313,6 +312,18 @@
|
||||
"using_default_method": "Avec la méthode par défaut"
|
||||
}
|
||||
},
|
||||
"live_tv": {
|
||||
"next": "Suivant",
|
||||
"previous": "Précédent",
|
||||
"live_tv": "TV en direct",
|
||||
"coming_soon": "Bientôt",
|
||||
"on_now": "En ce moment",
|
||||
"shows": "Émissions",
|
||||
"movies": "Films",
|
||||
"sports": "Sports",
|
||||
"for_kids": "Pour enfants",
|
||||
"news": "Actualités"
|
||||
},
|
||||
"jellyseerr":{
|
||||
"confirm": "Confirmer",
|
||||
"cancel": "Annuler",
|
||||
|
||||
Reference in New Issue
Block a user