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
This commit is contained in:
Uruk
2026-01-11 22:15:43 +01:00
committed by Gauvain
parent ceac74dbfa
commit b7db06f53d
13 changed files with 194 additions and 126 deletions

View File

@@ -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

View File

@@ -71,7 +71,7 @@ export default function page() {
))}
</ListGroup>
<Text className='px-4 text-xs text-neutral-500 mt-1'>
{t("home.settings.other.select_liraries_you_want_to_hide")}
{t("home.settings.other.select_libraries_you_want_to_hide")}
</Text>
</DisabledSetting>
</ScrollView>

View File

@@ -60,7 +60,7 @@ export default function page() {
))}
</ListGroup>
<Text className='px-4 text-xs text-neutral-500 mt-1'>
{t("home.settings.other.select_liraries_you_want_to_hide")}
{t("home.settings.other.select_libraries_you_want_to_hide")}
</Text>
</DisabledSetting>
);

View File

@@ -158,12 +158,12 @@ export const IntroSheet = forwardRef<IntroSheetRef>((_, ref) => {
</View>
<View className='shrink ml-2'>
<Text className='font-bold mb-1'>
{t("home.intro.centralised_settings_plugin_title")}
{t("home.intro.centralized_settings_plugin_title")}
</Text>
<View className='flex-row flex-wrap items-baseline'>
<Text className='shrink text-xs'>
{t(
"home.intro.centralised_settings_plugin_description",
"home.intro.centralized_settings_plugin_description",
)}{" "}
</Text>
<TouchableOpacity

View File

@@ -229,7 +229,7 @@ export const LibraryOptionsSheet: React.FC<Props> = ({
/>
</OptionGroup>
<OptionGroup title='Options'>
<OptionGroup title={t("library.options.options_title")}>
<ToggleItem
label={t("library.options.show_titles")}
value={settings.showTitles}

View File

@@ -1,5 +1,6 @@
import { Ionicons } from "@expo/vector-icons";
import { useMemo } from "react";
import { useTranslation } from "react-i18next";
import { Platform, View, type ViewProps } from "react-native";
import { Stepper } from "@/components/inputs/Stepper";
import { Text } from "../common/Text";
@@ -17,20 +18,21 @@ export const MpvSubtitleSettings: React.FC<Props> = ({ ...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<AlignX, string> = {
left: "Left",
center: "Center",
right: "Right",
left: t("player.alignment_left"),
center: t("player.alignment_center"),
right: t("player.alignment_right"),
};
const alignYLabels: Record<AlignY, string> = {
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> = ({ ...props }) => {
return (
<View {...props}>
<ListGroup
title='MPV Subtitle Settings'
title={t("player.mpv_subtitle_settings_title")}
description={
<Text className='text-[#8E8D91] text-xs'>
Advanced subtitle customization for MPV player
{t("player.mpv_subtitle_settings_description")}
</Text>
}
>
<ListItem title='Subtitle Scale'>
<ListItem title={t("player.subtitle_scale")}>
<Stepper
value={settings.mpvSubtitleScale ?? 1.0}
step={0.1}
@@ -80,7 +82,7 @@ export const MpvSubtitleSettings: React.FC<Props> = ({ ...props }) => {
/>
</ListItem>
<ListItem title='Vertical Margin'>
<ListItem title={t("player.vertical_margin")}>
<Stepper
value={settings.mpvSubtitleMarginY ?? 0}
step={5}
@@ -90,7 +92,7 @@ export const MpvSubtitleSettings: React.FC<Props> = ({ ...props }) => {
/>
</ListItem>
<ListItem title='Horizontal Alignment'>
<ListItem title={t("player.horizontal_alignment")}>
<PlatformDropdown
groups={alignXOptionGroups}
trigger={
@@ -105,11 +107,11 @@ export const MpvSubtitleSettings: React.FC<Props> = ({ ...props }) => {
/>
</View>
}
title='Horizontal Alignment'
title={t("player.horizontal_alignment")}
/>
</ListItem>
<ListItem title='Vertical Alignment'>
<ListItem title={t("player.vertical_alignment")}>
<PlatformDropdown
groups={alignYOptionGroups}
trigger={
@@ -124,7 +126,7 @@ export const MpvSubtitleSettings: React.FC<Props> = ({ ...props }) => {
/>
</View>
}
title='Vertical Alignment'
title={t("player.vertical_alignment")}
/>
</ListItem>
</ListGroup>

View File

@@ -20,22 +20,22 @@ export const PluginSettings = () => {
>
<ListItem
onPress={() => router.push("/settings/plugins/jellyseerr/page")}
title={"Jellyseerr"}
showArrow
/>
<ListItem
onPress={() => router.push("/settings/plugins/marlin-search/page")}
title='Marlin Search'
title={"Seerr"}
showArrow
/>
<ListItem
onPress={() => router.push("/settings/plugins/streamystats/page")}
title='Streamystats'
title={"Streamystats"}
showArrow
/>
<ListItem
onPress={() => router.push("/settings/plugins/marlin-search/page")}
title={"Marlin Search"}
showArrow
/>
<ListItem
onPress={() => router.push("/settings/plugins/kefinTweaks/page")}
title='KefinTweaks'
title={"KefinTweaks"}
showArrow
/>
</ListGroup>

View File

@@ -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<AspectRatioSelectorProps> = ({
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<OptionGroup[]>(() => {
return [
{
@@ -94,7 +96,7 @@ export const AspectRatioSelector: React.FC<AspectRatioSelectorProps> = ({
return (
<PlatformDropdown
title='Aspect Ratio'
title={t("player.aspect_ratio_title")}
groups={optionGroups}
trigger={trigger}
bottomSheetConfig={{

View File

@@ -1,6 +1,7 @@
import { Ionicons } from "@expo/vector-icons";
import { useLocalSearchParams } from "expo-router";
import { useCallback, useMemo, useRef } from "react";
import { useTranslation } from "react-i18next";
import { Platform, View } from "react-native";
import { BITRATES } from "@/components/BitrateSelector";
import {
@@ -41,6 +42,7 @@ const DropdownView = ({
const { settings, updateSettings } = useSettings();
const router = useRouter();
const isOffline = useOfflineMode();
const { t } = useTranslation();
const { subtitleIndex, audioIndex, bitrateValue, playbackPosition } =
useLocalSearchParams<{
@@ -194,7 +196,7 @@ const DropdownView = ({
return (
<PlatformDropdown
title='Playback Options'
title={t("player.playback_options_title")}
groups={optionGroups}
trigger={trigger}
expoUIConfig={{}}

View File

@@ -160,7 +160,7 @@ export class JellyseerrApi {
}
toast.error(t("jellyseerr.toasts.jellyseerr_test_failed"));
writeErrorLog(
`Jellyseerr returned a ${status} for url:\n${response.config.url}`,
`Seerr returned a ${status} for url:\n${response.config.url}`,
response.data,
);
return {
@@ -400,7 +400,7 @@ export class JellyseerrApi {
},
(error: AxiosError) => {
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);
},
);
}

View File

@@ -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 (
<div>
<iframe
title='MPV Player'
title={t("player.mpv_player_title")}
style={{ flex: 1 }}
src={url}
onLoad={() => props.onLoad?.({ nativeEvent: { url } })}

View File

@@ -227,7 +227,7 @@ function runTypeCheck() {
}
log(
`${colors.bold}TypeScript check passed${colors.reset} ${colors.gray}(jellyseerr utils errors ignored)${colors.reset}`,
`${colors.bold}TypeScript check passed${colors.reset} ${colors.gray}(seerr utils errors ignored)${colors.reset}`,
colors.green,
);
return { ok: true };

View File

@@ -2,18 +2,18 @@
"login": {
"username_required": "Username is required",
"error_title": "Error",
"login_title": "Log In",
"login_title": "Log in",
"login_to_title": "Log in to",
"username_placeholder": "Username",
"password_placeholder": "Password",
"login_button": "Log In",
"login_button": "Log in",
"quick_connect": "Quick Connect",
"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",
"could_not_connect_to_server": "Could not connect to the server. Please check the URL and your network connection.",
"an_unexpected_error_occured": "An Unexpected Error Occurred",
"an_unexpected_error_occured": "An unexpected error occurred",
"change_server": "Change Server",
"invalid_username_or_password": "Invalid Username or Password",
"user_does_not_have_permission_to_log_in": "User does not have permission to log in",
@@ -22,7 +22,7 @@
"there_is_a_server_error": "There is a server error",
"an_unexpected_error_occured_did_you_enter_the_correct_url": "An unexpected error occurred. Did you enter the server URL correctly?",
"too_old_server_text": "Unsupported Jellyfin Server Discovered",
"too_old_server_description": "Please update Jellyfin to the latest version"
"too_old_server_description": "Please update Jellyfin to the latest version."
},
"server": {
"enter_url_to_jellyfin_server": "Enter the URL to your Jellyfin server",
@@ -93,22 +93,22 @@
"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.",
"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 offers many features and integrates with a wide array of software which you can find in the settings menu, including:",
"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.",
"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.",
"downloads_feature_description": "Download movies and TV shows to view offline.",
"chromecast_feature_description": "Cast movies and TV shows to your Chromecast devices.",
"centralized_settings_plugin_title": "Centralized Settings Plugin",
"centralized_settings_plugin_description": "Configure settings from a centralized location on your Jellyfin server. All client settings for all users will be synced automatically.",
"done_button": "Done",
"go_to_settings_button": "Go to Settings",
"read_more": "Read More"
},
"settings": {
"settings_title": "Settings",
"log_out_button": "Log Out",
"log_out_button": "Log out",
"categories": {
"title": "Categories"
},
@@ -302,12 +302,12 @@
"show_custom_menu_links": "Show Custom Menu Links",
"show_large_home_carousel": "Show Large Home Carousel (beta)",
"hide_libraries": "Hide Libraries",
"select_liraries_you_want_to_hide": "Select the libraries you want to hide from the Library tab and home page sections.",
"select_libraries_you_want_to_hide": "Select the libraries you want to hide from the Library tab and home page sections.",
"disable_haptic_feedback": "Disable Haptic Feedback",
"default_quality": "Default Quality",
"default_playback_speed": "Default Playback Speed",
"auto_play_next_episode": "Auto-play Next Episode",
"max_auto_play_episode_count": "Max Auto Play Episode Count",
"auto_play_next_episode": "Autoplay Next Episode",
"max_auto_play_episode_count": "Max Autoplay Episode Count",
"disabled": "Disabled"
},
"downloads": {
@@ -327,7 +327,7 @@
"plugins": {
"plugins_title": "Plugins",
"jellyseerr": {
"jellyseerr_warning": "This integration is in its early stages. Expect things to change.",
"jellyseerr_warning": "This integration is in early development. Features may change.",
"server_url": "Server URL",
"server_url_hint": "Example: http(s)://your-host.url\n(add port if required)",
"server_url_placeholder": "Seerr URL",
@@ -341,7 +341,7 @@
"tv_quota_days": "TV Quota Days",
"reset_jellyseerr_config_button": "Reset Seerr Config",
"unlimited": "Unlimited",
"plus_n_more": "+{{n}} More",
"plus_n_more": "+{{n}} more",
"order_by": {
"DEFAULT": "Default",
"VOTE_COUNT_AND_AVERAGE": "Vote count and average",
@@ -353,7 +353,7 @@
"url": "URL",
"server_url_placeholder": "http(s)://domain.org:port",
"marlin_search_hint": "Enter the URL for the Marlin server. The URL should include http or https and optionally the port.",
"read_more_about_marlin": "Read More About Marlin.",
"read_more_about_marlin": "Read more about Marlin.",
"save_button": "Save",
"toasts": {
"saved": "Saved",
@@ -368,7 +368,7 @@
"url": "URL",
"server_url_placeholder": "http(s)://streamystats.example.com",
"streamystats_search_hint": "Enter the URL for your Streamystats server. The URL should include http or https and optionally the port.",
"read_more_about_streamystats": "Read More About Streamystats.",
"read_more_about_streamystats": "Read more about Streamystats.",
"save_button": "Save",
"save": "Save",
"features_title": "Features",
@@ -427,18 +427,18 @@
"system": "System"
},
"toasts": {
"error_deleting_files": "Error Deleting Files",
"error_deleting_files": "Error deleting files",
"background_downloads_enabled": "Background downloads enabled",
"background_downloads_disabled": "Background downloads disabled"
}
},
"sessions": {
"title": "Sessions",
"no_active_sessions": "No Active Sessions"
"no_active_sessions": "No active sessions"
},
"downloads": {
"downloads_title": "Downloads",
"tvseries": "TV-Series",
"tvseries": "TV Series",
"movies": "Movies",
"queue": "Queue",
"other_media": "Other media",
@@ -446,7 +446,7 @@
"no_items_in_queue": "No Items in Queue",
"no_downloaded_items": "No Downloaded Items",
"delete_all_movies_button": "Delete All Movies",
"delete_all_tvseries_button": "Delete All TV-Series",
"delete_all_tvseries_button": "Delete All TV Series",
"delete_all_button": "Delete All",
"delete_all_other_media_button": "Delete other media",
"active_download": "Active Download",
@@ -461,27 +461,27 @@
"eta": "ETA {{eta}}",
"toasts": {
"you_are_not_allowed_to_download_files": "You are not allowed to download files.",
"deleted_all_movies_successfully": "Deleted All Movies Successfully!",
"failed_to_delete_all_movies": "Failed to Delete All Movies",
"deleted_all_tvseries_successfully": "Deleted All TV-Series Successfully!",
"failed_to_delete_all_tvseries": "Failed to Delete All TV-Series",
"deleted_media_successfully": "Deleted other media Successfully!",
"failed_to_delete_media": "Failed to Delete other media",
"download_deleted": "Download Deleted",
"download_cancelled": "Download Cancelled",
"could_not_delete_download": "Could Not Delete Download",
"download_paused": "Download Paused",
"could_not_pause_download": "Could Not Pause Download",
"download_resumed": "Download Resumed",
"could_not_resume_download": "Could Not Resume Download",
"download_completed": "Download Completed",
"download_failed": "Download Failed",
"deleted_all_movies_successfully": "Deleted all movies successfully!",
"failed_to_delete_all_movies": "Failed to delete all movies",
"deleted_all_tvseries_successfully": "Deleted all TV series successfully!",
"failed_to_delete_all_tvseries": "Failed to delete all TV series",
"deleted_media_successfully": "Deleted other media successfully!",
"failed_to_delete_media": "Failed to delete other media",
"download_deleted": "Download deleted",
"download_cancelled": "Download cancelled",
"could_not_delete_download": "Could not delete download",
"download_paused": "Download paused",
"could_not_pause_download": "Could not pause download",
"download_resumed": "Download resumed",
"could_not_resume_download": "Could not resume download",
"download_completed": "Download completed",
"download_failed": "Download failed",
"download_failed_for_item": "Download failed for {{item}} - {{error}}",
"download_completed_for_item": "Download Completed for {{item}}",
"download_started_for_item": "Download Started for {{item}}",
"download_completed_for_item": "Download completed for {{item}}",
"download_started_for_item": "Download started for {{item}}",
"failed_to_start_download": "Failed to start download",
"item_already_downloading": "{{item}} is already downloading",
"all_files_deleted": "All Downloads Deleted Successfully",
"all_files_deleted": "All downloads deleted successfully",
"files_deleted_by_type": "{{count}} {{type}} deleted",
"all_files_folders_and_jobs_deleted_successfully": "All files, folders, and jobs deleted successfully",
"failed_to_clean_cache_directory": "Failed to clean cache directory",
@@ -493,7 +493,7 @@
},
"common": {
"select": "Select",
"no_trailer_available": "No trailer available",
"no_trailer_available": "No Trailer Available",
"video": "Video",
"audio": "Audio",
"subtitle": "Subtitle",
@@ -515,7 +515,7 @@
"library": "Library",
"discover": "Discover",
"no_results": "No Results",
"no_results_found_for": "No Results Found For",
"no_results_found_for": "No results found for",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
@@ -559,6 +559,7 @@
"items": "Items"
},
"options": {
"options_title": "Options",
"display": "Display",
"row": "Row",
"list": "List",
@@ -608,7 +609,27 @@
"downloaded_file_message": "Do you want to play the downloaded file?",
"downloaded_file_yes": "Yes",
"downloaded_file_no": "No",
"downloaded_file_cancel": "Cancel"
"downloaded_file_cancel": "Cancel",
"aspect_ratio_title": "Aspect Ratio",
"aspect_ratio_original": "Original",
"aspect_ratio_original_description": "Use video's original aspect ratio",
"aspect_ratio_16_9_description": "Widescreen (most common)",
"aspect_ratio_4_3_description": "Traditional TV format",
"aspect_ratio_1_1_description": "Square format",
"aspect_ratio_21_9_description": "Ultra-wide cinematic",
"playback_options_title": "Playback Options",
"mpv_subtitle_settings_title": "MPV Subtitle Settings",
"mpv_subtitle_settings_description": "Advanced subtitle customization for MPV player",
"subtitle_scale": "Subtitle Scale",
"vertical_margin": "Vertical Margin",
"horizontal_alignment": "Horizontal Alignment",
"vertical_alignment": "Vertical Alignment",
"alignment_left": "Left",
"alignment_center": "Center",
"alignment_right": "Right",
"alignment_top": "Top",
"alignment_bottom": "Bottom",
"mpv_player_title": "MPV Player"
},
"item_card": {
"next_up": "Next Up",
@@ -627,11 +648,11 @@
"media_options": "Media Options",
"quality": "Quality",
"audio": "Audio",
"subtitles": "Subtitle",
"subtitles": "Subtitles",
"show_more": "Show More",
"show_less": "Show Less",
"appeared_in": "Appeared In",
"could_not_load_item": "Could Not Load Item",
"could_not_load_item": "Could not load item",
"none": "None",
"download": {
"download_season": "Download Season",
@@ -725,7 +746,7 @@
"albums": "Albums",
"artists": "Artists",
"playlists": "Playlists",
"tracks": "tracks"
"tracks": "Tracks"
},
"filters": {
"all": "All"