From 6957c4fd6469336f2fc5709b37c8fc43ac18d449 Mon Sep 17 00:00:00 2001 From: Simon Eklundh Date: Sun, 11 Jan 2026 22:27:19 +0100 Subject: [PATCH 1/8] feat: add autorotate for landscape (#1265) Signed-off-by: Lance Chant <13349722+lancechant@users.noreply.github.com> Co-authored-by: Lance Chant <13349722+lancechant@users.noreply.github.com> Co-authored-by: Fredrik Burmester --- components/settings/PlaybackControlsSettings.tsx | 3 +++ hooks/useOrientation.ts | 2 ++ translations/en.json | 6 +++--- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/components/settings/PlaybackControlsSettings.tsx b/components/settings/PlaybackControlsSettings.tsx index 00348166..ad6a215e 100644 --- a/components/settings/PlaybackControlsSettings.tsx +++ b/components/settings/PlaybackControlsSettings.tsx @@ -29,6 +29,7 @@ export const PlaybackControlsSettings: React.FC = () => { const orientations = [ ScreenOrientation.OrientationLock.DEFAULT, ScreenOrientation.OrientationLock.PORTRAIT_UP, + ScreenOrientation.OrientationLock.LANDSCAPE, ScreenOrientation.OrientationLock.LANDSCAPE_LEFT, ScreenOrientation.OrientationLock.LANDSCAPE_RIGHT, ]; @@ -39,6 +40,8 @@ export const PlaybackControlsSettings: React.FC = () => { "home.settings.other.orientations.DEFAULT", [ScreenOrientation.OrientationLock.PORTRAIT_UP]: "home.settings.other.orientations.PORTRAIT_UP", + [ScreenOrientation.OrientationLock.LANDSCAPE]: + "home.settings.other.orientations.LANDSCAPE", [ScreenOrientation.OrientationLock.LANDSCAPE_LEFT]: "home.settings.other.orientations.LANDSCAPE_LEFT", [ScreenOrientation.OrientationLock.LANDSCAPE_RIGHT]: diff --git a/hooks/useOrientation.ts b/hooks/useOrientation.ts index 9d77111d..924e6253 100644 --- a/hooks/useOrientation.ts +++ b/hooks/useOrientation.ts @@ -21,6 +21,8 @@ const orientationToOrientationLock = ( return OrientationLock.LANDSCAPE_RIGHT; case Orientation.PORTRAIT_UP: return OrientationLock.PORTRAIT_UP; + case Orientation.UNKNOWN: + return OrientationLock.LANDSCAPE; default: return OrientationLock.PORTRAIT_UP; } diff --git a/translations/en.json b/translations/en.json index 7b9320be..3fe9efb6 100644 --- a/translations/en.json +++ b/translations/en.json @@ -282,12 +282,12 @@ "video_orientation": "Video Orientation", "orientation": "Orientation", "orientations": { - "DEFAULT": "Default", + "DEFAULT": "Follow Device Orientation", "ALL": "All", - "PORTRAIT": "Portrait", + "PORTRAIT": "Portrait Auto", "PORTRAIT_UP": "Portrait Up", "PORTRAIT_DOWN": "Portrait Down", - "LANDSCAPE": "Landscape", + "LANDSCAPE": "Landscape Auto", "LANDSCAPE_LEFT": "Landscape Left", "LANDSCAPE_RIGHT": "Landscape Right", "OTHER": "Other", From 7a0f70778d026dc2e04fa8c513e5a11f33838ad3 Mon Sep 17 00:00:00 2001 From: Simon Eklundh Date: Sun, 11 Jan 2026 22:31:25 +0100 Subject: [PATCH 2/8] fix: fix music videos and home videos on library (#1326) Co-authored-by: Fredrik Burmester --- app/(auth)/(tabs)/(libraries)/[libraryId].tsx | 4 ++++ components/library/LibraryItemCard.tsx | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/app/(auth)/(tabs)/(libraries)/[libraryId].tsx b/app/(auth)/(tabs)/(libraries)/[libraryId].tsx index 915c362f..d96bf5b5 100644 --- a/app/(auth)/(tabs)/(libraries)/[libraryId].tsx +++ b/app/(auth)/(tabs)/(libraries)/[libraryId].tsx @@ -209,6 +209,10 @@ const Page = () => { itemType = "Series"; } else if (library.CollectionType === "boxsets") { itemType = "BoxSet"; + } else if (library.CollectionType === "homevideos") { + itemType = "Video"; + } else if (library.CollectionType === "musicvideos") { + itemType = "MusicVideo"; } const response = await getItemsApi(api).getItems({ diff --git a/components/library/LibraryItemCard.tsx b/components/library/LibraryItemCard.tsx index efb29013..09de500d 100644 --- a/components/library/LibraryItemCard.tsx +++ b/components/library/LibraryItemCard.tsx @@ -63,6 +63,10 @@ export const LibraryItemCard: React.FC = ({ library, ...props }) => { _itemType = "Series"; } else if (library.CollectionType === "boxsets") { _itemType = "BoxSet"; + } else if (library.CollectionType === "homevideos") { + _itemType = "Video"; + } else if (library.CollectionType === "musicvideos") { + _itemType = "MusicVideo"; } return _itemType; From b6bd427e1970953694686e66f49a91e69bef75b7 Mon Sep 17 00:00:00 2001 From: Uruk Date: Sun, 11 Jan 2026 20:04:07 +0100 Subject: [PATCH 3/8] style: standardizes capitalization and punctuation in English translations Improves consistency across user-facing text by: - Normalizing sentence case in error messages and labels (e.g., "Username is required" instead of "Username Is Required") - Fixing inconsistent capitalization in feature descriptions and UI text - Standardizing punctuation, particularly replacing semicolons where appropriate and ensuring consistent usage of "log in" vs "login" - Correcting article usage ("the left side" instead of "left side") - Updating terminology consistency (e.g., "tv shows" instead of "tv-shows", "optimized" instead of "optimize") These changes enhance readability and professionalism throughout the application interface. --- translations/en.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/translations/en.json b/translations/en.json index 3fe9efb6..442f5872 100644 --- a/translations/en.json +++ b/translations/en.json @@ -1,6 +1,6 @@ { "login": { - "username_required": "Username Is Required", + "username_required": "Username is required", "error_title": "Error", "login_title": "Log In", "login_to_title": "Log in to", @@ -8,7 +8,7 @@ "password_placeholder": "Password", "login_button": "Log In", "quick_connect": "Quick Connect", - "enter_code_to_login": "Enter code {{code}} to login", + "enter_code_to_login": "Enter code {{code}} to log in", "failed_to_initiate_quick_connect": "Failed to initiate Quick Connect", "got_it": "Got It", "connection_failed": "Connection Failed", @@ -77,7 +77,7 @@ "checking_server_connection": "Checking server connection...", "no_internet": "No Internet", "no_items": "No Items", - "no_internet_message": "No worries, you can still watch\ndownloaded content.", + "no_internet_message": "No worries, you can still watch\nDownloaded content.", "checking_server_connection_message": "Checking connection to server", "go_to_downloads": "Go to Downloads", "retry": "Retry", @@ -88,18 +88,18 @@ "continue_watching": "Continue Watching", "next_up": "Next Up", "continue_and_next_up": "Continue & Next Up", - "recently_added_in": "Recently Added in {{libraryName}}", + "recently_added_in": "Recently added in {{libraryName}}", "suggested_movies": "Suggested Movies", "suggested_episodes": "Suggested Episodes", "intro": { "welcome_to_streamyfin": "Welcome to Streamyfin", "a_free_and_open_source_client_for_jellyfin": "A Free and Open-Source Client for Jellyfin.", "features_title": "Features", - "features_description": "Streamyfin has a bunch of features and integrates with a wide array of software which you can find in the settings menu, these include:", + "features_description": "Streamyfin has a bunch of features and integrates with a wide array of software which you can find in the settings menu; these include:", "jellyseerr_feature_description": "Connect to your Seerr instance and request movies directly in the app.", "downloads_feature_title": "Downloads", - "downloads_feature_description": "Download movies and tv-shows to view offline. Use either the default method or install the optimize server to download files in the background.", - "chromecast_feature_description": "Cast movies and tv-shows to your Chromecast devices.", + "downloads_feature_description": "Download movies and tv shows to view offline. Use either the default method or install the optimized server to download files in the background.", + "chromecast_feature_description": "Cast movies and tv shows to your Chromecast devices.", "centralised_settings_plugin_title": "Centralised Settings Plugin", "centralised_settings_plugin_description": "Configure settings from a centralised location on your Jellyfin server. All client settings for all users will be synced automatically.", "done_button": "Done", @@ -179,9 +179,9 @@ "horizontal_swipe_skip": "Horizontal Swipe to Skip", "horizontal_swipe_skip_description": "Swipe left/right when controls are hidden to skip", "left_side_brightness": "Left Side Brightness Control", - "left_side_brightness_description": "Swipe up/down on left side to adjust brightness", + "left_side_brightness_description": "Swipe up/down on the left side to adjust brightness", "right_side_volume": "Right Side Volume Control", - "right_side_volume_description": "Swipe up/down on right side to adjust volume", + "right_side_volume_description": "Swipe up/down on the right side to adjust volume", "hide_volume_slider": "Hide Volume Slider", "hide_volume_slider_description": "Hide the volume slider in the video player", "hide_brightness_slider": "Hide Brightness Slider", @@ -218,7 +218,7 @@ "Smart": "Smart", "Always": "Always", "None": "None", - "OnlyForced": "OnlyForced" + "OnlyForced": "Only Forced" }, "text_color": "Text Color", "background_color": "Background Color", @@ -658,7 +658,7 @@ "confirm": "Confirm", "cancel": "Cancel", "yes": "Yes", - "whats_wrong": "What's Wrong?", + "whats_wrong": "What's wrong?", "issue_type": "Issue Type", "select_an_issue": "Select an Issue", "types": "Types", @@ -667,7 +667,7 @@ "report_issue_button": "Report Issue", "request_button": "Request", "are_you_sure_you_want_to_request_all_seasons": "Are you sure you want to request all seasons?", - "failed_to_login": "Failed to Login", + "failed_to_login": "Failed to log in", "cast": "Cast", "details": "Details", "status": "Status", @@ -700,15 +700,15 @@ "toasts": { "jellyseer_does_not_meet_requirements": "Seerr server does not meet minimum version requirements! Please update to at least 2.0.0", "jellyseerr_test_failed": "Seerr test failed. Please try again.", - "failed_to_test_jellyseerr_server_url": "Failed to test Seerr server url", + "failed_to_test_jellyseerr_server_url": "Failed to test Seerr server URL", "issue_submitted": "Issue Submitted!", "requested_item": "Requested {{item}}!", "you_dont_have_permission_to_request": "You don't have permission to request!", "something_went_wrong_requesting_media": "Something went wrong requesting media!", "request_approved": "Request Approved!", "request_declined": "Request Declined!", - "failed_to_approve_request": "Failed to Approve Request", - "failed_to_decline_request": "Failed to Decline Request" + "failed_to_approve_request": "Failed to approve request", + "failed_to_decline_request": "Failed to decline request" } }, "tabs": { From ceac74dbfa705e12e940065b047a8fe533b61a74 Mon Sep 17 00:00:00 2001 From: Uruk Date: Sun, 11 Jan 2026 20:09:48 +0100 Subject: [PATCH 4/8] refactor: remove unused download settings components Removes empty download settings component files and simplifies download feature description in translations. The download settings components contained only placeholder implementations that returned null, indicating they were not in use. Updates the feature description to remove references to optimized server and background downloads, providing a clearer and more straightforward explanation of the download functionality. --- components/settings/DownloadSettings.tsx | 3 --- components/settings/DownloadSettings.tv.tsx | 3 --- translations/en.json | 2 +- 3 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 components/settings/DownloadSettings.tsx delete mode 100644 components/settings/DownloadSettings.tv.tsx diff --git a/components/settings/DownloadSettings.tsx b/components/settings/DownloadSettings.tsx deleted file mode 100644 index 3a0017ac..00000000 --- a/components/settings/DownloadSettings.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function DownloadSettings() { - return null; -} diff --git a/components/settings/DownloadSettings.tv.tsx b/components/settings/DownloadSettings.tv.tsx deleted file mode 100644 index 3a0017ac..00000000 --- a/components/settings/DownloadSettings.tv.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function DownloadSettings() { - return null; -} diff --git a/translations/en.json b/translations/en.json index 442f5872..d80fe470 100644 --- a/translations/en.json +++ b/translations/en.json @@ -98,7 +98,7 @@ "features_description": "Streamyfin has a bunch of features and integrates with a wide array of software which you can find in the settings menu; these include:", "jellyseerr_feature_description": "Connect to your Seerr instance and request movies directly in the app.", "downloads_feature_title": "Downloads", - "downloads_feature_description": "Download movies and tv shows to view offline. Use either the default method or install the optimized server to download files in the background.", + "downloads_feature_description": "Download movies and tv shows to view offline.", "chromecast_feature_description": "Cast movies and tv shows to your Chromecast devices.", "centralised_settings_plugin_title": "Centralised Settings Plugin", "centralised_settings_plugin_description": "Configure settings from a centralised location on your Jellyfin server. All client settings for all users will be synced automatically.", From b7db06f53de8a93125ce20d54048d163ab6c2c9c Mon Sep 17 00:00:00 2001 From: Uruk Date: Sun, 11 Jan 2026 22:15:43 +0100 Subject: [PATCH 5/8] docs: update README and fix typos across codebase Enhances README with comprehensive feature categorization including Media Playback, Media Management, and Advanced Features sections Expands documentation for music library support, search providers (Marlin, Streamystats, Jellysearch), and plugin functionality Updates FAQ section with more detailed answers about library visibility, downloads, subtitles, TV platform support, and Seerr integration Corrects typos throughout the application: - Fixes "liraries" to "libraries" in hide libraries settings - Changes "centralised" to "centralized" for consistency - Updates "Jellyseerr" references to "Seerr" throughout codebase Adds missing translations for player settings including aspect ratio options, alignment controls, and MPV subtitle customization Improves consistency in capitalization and punctuation across translation strings --- README.md | 73 ++++++++--- .../appearance/hide-libraries/page.tsx | 2 +- .../(home)/settings/hide-libraries/page.tsx | 2 +- components/IntroSheet.tsx | 4 +- components/settings/LibraryOptionsSheet.tsx | 2 +- components/settings/MpvSubtitleSettings.tsx | 30 ++--- components/settings/PluginSettings.tsx | 16 +-- .../controls/VideoScalingModeSelector.tsx | 62 +++++----- .../controls/dropdown/DropdownView.tsx | 4 +- hooks/useJellyseerr.ts | 6 +- modules/mpv-player/src/MpvPlayerView.web.tsx | 4 +- scripts/typecheck.js | 2 +- translations/en.json | 113 +++++++++++------- 13 files changed, 194 insertions(+), 126 deletions(-) diff --git a/README.md b/README.md index 7bb0c9bc..44a8863c 100644 --- a/README.md +++ b/README.md @@ -22,13 +22,28 @@ ## ๐ŸŒŸ Features -- ๐Ÿš€ **Skip Intro / Credits Support**: Lets you quickly skip intros and credits during playback -- ๐Ÿ–ผ๏ธ **Trickplay images**: The new golden standard for chapter previews when seeking -- ๐Ÿ“ฅ **Download media**: Save your media locally and watch it offline -- โš™๏ธ **Settings management**: Manage app configurations for all users through our plugin -- ๐Ÿค– **Seerr (formerly Jellyseerr) integration**: Request media directly in the app -- ๐Ÿ‘๏ธ **Sessions view:** View all active sessions currently streaming on your server +### ๐ŸŽฌ Media Playback +- ๐Ÿš€ **Skip Intro / Credits**: Automatically skip intros and credits during playback +- ๐Ÿ–ผ๏ธ **Trickplay Images**: Chapter previews with thumbnails when seeking +- ๐ŸŽต **Music Library**: Full support for music playback with playlists and queue management +- ๐Ÿ“บ **Live TV**: Watch and record live television streams - ๐Ÿ“ก **Chromecast**: Cast your media to any Chromecast-enabled device +- ๐ŸŽฅ **MPV Player**: Powerful open-source player with wide format support + +### ๐Ÿ“ฑ Media Management +- ๐Ÿ“ฅ **Download Media**: Save movies, shows, and music locally for offline viewing +- โญ **Favorites**: Quick access to your favorite content +- ๐Ÿ“‹ **Watchlists**: Create and manage custom watchlists with Streamystats integration +- ๐Ÿ”– **Continue Watching**: Pick up right where you left off +- ๐ŸŽฏ **Next Up**: Smart suggestions for your next episode + +### โš™๏ธ Advanced Features +- ๐Ÿค– **Seerr Integration**: Request new media directly in the app +- ๐Ÿ” **Smart Search**: Powerful search with Marlin Search and Streamystats support +- ๐Ÿ‘๏ธ **Active Sessions**: View all active streams on your server +- ๐ŸŒ **Multi-Language**: Available in 20+ languages with Crowdin integration +- ๐ŸŽจ **Customizable**: Personalize your home screen and settings +- ๐Ÿ”Œ **Plugin System**: Centralized settings sync across all devices via Jellyfin plugin ## ๐Ÿงช Experimental Features @@ -40,12 +55,13 @@ Downloading works by using FFmpeg to convert an HLS stream into a video file on ### ๐Ÿงฉ Streamyfin Plugin -The Jellyfin Plugin for Streamyfin is a plugin you install into Jellyfin that holds all settings for the client Streamyfin. This allows you to synchronize settings across all your users, like for example: +The Jellyfin Plugin for Streamyfin synchronizes settings across all your devices and users. Install it on your Jellyfin server to enable: - Automatic Seerr login with no user input required -- Set your preferred default languages -- Configure download method and search provider -- Personalize your home screen +- Default language preferences for audio and subtitles +- Configure download settings and search providers (Marlin, Streamystats) +- Customize your home screen layout and sections +- Centralized configuration management - And much more [Streamyfin Plugin](https://github.com/streamyfin/jellyfin-plugin-streamyfin) @@ -59,11 +75,24 @@ Chromecast support is currently under development. Video casting is already avai Streamyfin uses [MPV](https://mpv.io/) as its primary video player on all platforms, powered by [MPVKit](https://github.com/mpvkit/MPVKit). MPV is a powerful, open-source media player known for its wide format support and high-quality playback. Thanks to [@Alexk2309](https://github.com/Alexk2309) for the hard work building the native MPV module in Streamyfin. -### ๐Ÿ” Jellysearch +### ๐ŸŽต Music Library -[Jellysearch](https://gitlab.com/DomiStyle/jellysearch) works with Streamyfin +Streamyfin now includes full music library support with features like: -> A fast full-text search proxy for Jellyfin. Integrates seamlessly with most Jellyfin clients. +- Browse your music collection by artists, albums, and playlists +- Create and manage custom playlists +- Queue management with shuffle and repeat +- Background playback +- Now playing screen with album artwork +- Download songs for offline listening + +### ๐Ÿ” Advanced Search + +Streamyfin supports multiple search providers: + +- **Marlin Search**: Fast semantic search for your Jellyfin library +- **Streamystats**: Advanced statistics and personalized recommendations +- **Jellysearch**: Fast full-text search proxy ([Jellysearch](https://gitlab.com/DomiStyle/jellysearch)) ## ๐Ÿ›ฃ๏ธ Roadmap @@ -131,10 +160,20 @@ Need assistance or have any questions? ## โ“ FAQ -1. Q: Why can't I see my libraries in Streamyfin? - A: Make sure your server is running one of the latest versions and that you have at least one library that isn't audio only -2. Q: Why can't I see my music library? - A: We don't currently support music and are unlikely to support music in the near future +1. **Q: Why can't I see my libraries in Streamyfin?** + A: Ensure your Jellyfin server is running a recent version (10.10.0+) and that you have proper permissions to access the libraries. + +2. **Q: How do I enable downloads?** + A: Downloads use FFmpeg to convert HLS streams. Ensure your server has transcoding enabled and sufficient resources. + +3. **Q: Does Streamyfin support subtitles?** + A: Yes, with full customization including size, color, position, and automatic language selection. + +4. **Q: Can I use Streamyfin on Apple TV or Android TV?** + A: Yes, Streamyfin has dedicated TV builds optimized for remote control navigation. Please note that TV platforms are currently in early development and not very stable. Android TV is currently the most reliable platform for testing. + +5. **Q: How do I set up Seerr integration?** + A: Go to Settings โ†’ Plugins โ†’ Seerr, enter your server URL and Jellyfin credentials. ## ๐Ÿ“ Credits diff --git a/app/(auth)/(tabs)/(home)/settings/appearance/hide-libraries/page.tsx b/app/(auth)/(tabs)/(home)/settings/appearance/hide-libraries/page.tsx index a0b3bab9..5fd815d2 100644 --- a/app/(auth)/(tabs)/(home)/settings/appearance/hide-libraries/page.tsx +++ b/app/(auth)/(tabs)/(home)/settings/appearance/hide-libraries/page.tsx @@ -71,7 +71,7 @@ export default function page() { ))} - {t("home.settings.other.select_liraries_you_want_to_hide")} + {t("home.settings.other.select_libraries_you_want_to_hide")} diff --git a/app/(auth)/(tabs)/(home)/settings/hide-libraries/page.tsx b/app/(auth)/(tabs)/(home)/settings/hide-libraries/page.tsx index e1c8b56b..8bfa30a4 100644 --- a/app/(auth)/(tabs)/(home)/settings/hide-libraries/page.tsx +++ b/app/(auth)/(tabs)/(home)/settings/hide-libraries/page.tsx @@ -60,7 +60,7 @@ export default function page() { ))} - {t("home.settings.other.select_liraries_you_want_to_hide")} + {t("home.settings.other.select_libraries_you_want_to_hide")} ); diff --git a/components/IntroSheet.tsx b/components/IntroSheet.tsx index 0a744e32..ea1a23a2 100644 --- a/components/IntroSheet.tsx +++ b/components/IntroSheet.tsx @@ -158,12 +158,12 @@ export const IntroSheet = forwardRef((_, ref) => { - {t("home.intro.centralised_settings_plugin_title")} + {t("home.intro.centralized_settings_plugin_title")} {t( - "home.intro.centralised_settings_plugin_description", + "home.intro.centralized_settings_plugin_description", )}{" "} = ({ /> - + = ({ ...props }) => { const isTv = Platform.isTV; const media = useMedia(); const { settings, updateSettings } = media; + const { t } = useTranslation(); const alignXOptions: AlignX[] = ["left", "center", "right"]; const alignYOptions: AlignY[] = ["top", "center", "bottom"]; const alignXLabels: Record = { - left: "Left", - center: "Center", - right: "Right", + left: t("player.alignment_left"), + center: t("player.alignment_center"), + right: t("player.alignment_right"), }; const alignYLabels: Record = { - top: "Top", - center: "Center", - bottom: "Bottom", + top: t("player.alignment_top"), + center: t("player.alignment_center"), + bottom: t("player.alignment_bottom"), }; const alignXOptionGroups = useMemo(() => { @@ -61,14 +63,14 @@ export const MpvSubtitleSettings: React.FC = ({ ...props }) => { return ( - Advanced subtitle customization for MPV player + {t("player.mpv_subtitle_settings_description")} } > - + = ({ ...props }) => { /> - + = ({ ...props }) => { /> - + = ({ ...props }) => { /> } - title='Horizontal Alignment' + title={t("player.horizontal_alignment")} /> - + = ({ ...props }) => { /> } - title='Vertical Alignment' + title={t("player.vertical_alignment")} /> diff --git a/components/settings/PluginSettings.tsx b/components/settings/PluginSettings.tsx index 54d2c49a..1b21cf98 100644 --- a/components/settings/PluginSettings.tsx +++ b/components/settings/PluginSettings.tsx @@ -20,22 +20,22 @@ export const PluginSettings = () => { > router.push("/settings/plugins/jellyseerr/page")} - title={"Jellyseerr"} - showArrow - /> - router.push("/settings/plugins/marlin-search/page")} - title='Marlin Search' + title={"Seerr"} showArrow /> router.push("/settings/plugins/streamystats/page")} - title='Streamystats' + title={"Streamystats"} + showArrow + /> + router.push("/settings/plugins/marlin-search/page")} + title={"Marlin Search"} showArrow /> router.push("/settings/plugins/kefinTweaks/page")} - title='KefinTweaks' + title={"KefinTweaks"} showArrow /> diff --git a/components/video-player/controls/VideoScalingModeSelector.tsx b/components/video-player/controls/VideoScalingModeSelector.tsx index 2608f04d..2cf72a2f 100644 --- a/components/video-player/controls/VideoScalingModeSelector.tsx +++ b/components/video-player/controls/VideoScalingModeSelector.tsx @@ -1,5 +1,6 @@ import { Ionicons } from "@expo/vector-icons"; import React, { useMemo } from "react"; +import { useTranslation } from "react-i18next"; import { Platform, View } from "react-native"; import { type OptionGroup, @@ -18,49 +19,50 @@ interface AspectRatioSelectorProps { interface AspectRatioOption { id: AspectRatio; label: string; - description: string; + descriptionKey: string; } -const ASPECT_RATIO_OPTIONS: AspectRatioOption[] = [ - { - id: "default", - label: "Original", - description: "Use video's original aspect ratio", - }, - { - id: "16:9", - label: "16:9", - description: "Widescreen (most common)", - }, - { - id: "4:3", - label: "4:3", - description: "Traditional TV format", - }, - { - id: "1:1", - label: "1:1", - description: "Square format", - }, - { - id: "21:9", - label: "21:9", - description: "Ultra-wide cinematic", - }, -]; - export const AspectRatioSelector: React.FC = ({ currentRatio, onRatioChange, disabled = false, }) => { const lightHapticFeedback = useHaptic("light"); + const { t } = useTranslation(); const handleRatioSelect = (ratio: AspectRatio) => { onRatioChange(ratio); lightHapticFeedback(); }; + const ASPECT_RATIO_OPTIONS: AspectRatioOption[] = [ + { + id: "default", + label: t("player.aspect_ratio_original"), + descriptionKey: "player.aspect_ratio_original_description", + }, + { + id: "16:9", + label: "16:9", + descriptionKey: "player.aspect_ratio_16_9_description", + }, + { + id: "4:3", + label: "4:3", + descriptionKey: "player.aspect_ratio_4_3_description", + }, + { + id: "1:1", + label: "1:1", + descriptionKey: "player.aspect_ratio_1_1_description", + }, + { + id: "21:9", + label: "21:9", + descriptionKey: "player.aspect_ratio_21_9_description", + }, + ]; + const optionGroups = useMemo(() => { return [ { @@ -94,7 +96,7 @@ export const AspectRatioSelector: React.FC = ({ return ( { writeErrorLog( - `Jellyseerr response error\nerror: ${error.toString()}\nurl: ${error?.config?.url}`, + `Seerr response error\nerror: ${error.toString()}\nurl: ${error?.config?.url}`, error.response?.data, ); if (error.response?.status === 403) { @@ -425,7 +425,7 @@ export class JellyseerrApi { return config; }, (error) => { - console.error("Jellyseerr request error", error); + console.error("Seerr request error", error); }, ); } diff --git a/modules/mpv-player/src/MpvPlayerView.web.tsx b/modules/mpv-player/src/MpvPlayerView.web.tsx index dc322ad7..a5252b4b 100644 --- a/modules/mpv-player/src/MpvPlayerView.web.tsx +++ b/modules/mpv-player/src/MpvPlayerView.web.tsx @@ -1,11 +1,13 @@ +import { useTranslation } from "react-i18next"; import { MpvPlayerViewProps } from "./MpvPlayer.types"; export default function MpvPlayerView(props: MpvPlayerViewProps) { const url = props.source?.url ?? ""; + const { t } = useTranslation(); return (