From b7db06f53de8a93125ce20d54048d163ab6c2c9c Mon Sep 17 00:00:00 2001 From: Uruk Date: Sun, 11 Jan 2026 22:15:43 +0100 Subject: [PATCH] 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 (