diff --git a/app/src/main/java/com/github/damontecres/wholphin/WholphinApplication.kt b/app/src/main/java/com/github/damontecres/wholphin/WholphinApplication.kt index ae4b5d28..cf2c159a 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/WholphinApplication.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/WholphinApplication.kt @@ -10,6 +10,7 @@ import androidx.compose.runtime.ExperimentalComposeRuntimeApi import androidx.hilt.work.HiltWorkerFactory import androidx.work.Configuration import dagger.hilt.android.HiltAndroidApp +import okhttp3.OkHttp import org.acra.ACRA import org.acra.ReportField import org.acra.config.dialog @@ -63,6 +64,7 @@ class WholphinApplication : override fun onCreate() { super.onCreate() + OkHttp.initialize(this) initAcra { buildConfigClass = BuildConfig::class.java reportFormat = StringFormat.JSON diff --git a/app/src/main/java/com/github/damontecres/wholphin/data/model/BaseItem.kt b/app/src/main/java/com/github/damontecres/wholphin/data/model/BaseItem.kt index c32f4a45..bc59cf27 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/data/model/BaseItem.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/data/model/BaseItem.kt @@ -73,8 +73,7 @@ data class BaseItem( @Transient val aspectRatio: Float? = data.primaryImageAspectRatio?.toFloat()?.takeIf { it > 0 } - @Transient - val indexNumber = data.indexNumber ?: dateAsIndex() + val indexNumber get() = data.indexNumber val playbackPosition get() = data.userData?.playbackPositionTicks?.ticks ?: Duration.ZERO diff --git a/app/src/main/java/com/github/damontecres/wholphin/services/SeerrServerRepository.kt b/app/src/main/java/com/github/damontecres/wholphin/services/SeerrServerRepository.kt index 135ffaf1..c6da831f 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/services/SeerrServerRepository.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/services/SeerrServerRepository.kt @@ -196,6 +196,7 @@ private suspend fun login( password = password ?: "", ), ) + client.usersApi.authMeGet() } SeerrAuthMethod.JELLYFIN -> { @@ -205,6 +206,7 @@ private suspend fun login( password = password ?: "", ), ) + client.usersApi.authMeGet() } SeerrAuthMethod.API_KEY -> { diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/series/SeriesViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/series/SeriesViewModel.kt index 4c0fb81b..8ae7a579 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/series/SeriesViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/series/SeriesViewModel.kt @@ -39,6 +39,7 @@ import com.github.damontecres.wholphin.util.GetEpisodesRequestHandler import com.github.damontecres.wholphin.util.GetItemsRequestHandler import com.github.damontecres.wholphin.util.LoadingExceptionHandler import com.github.damontecres.wholphin.util.LoadingState +import com.google.common.cache.CacheBuilder import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -57,6 +58,7 @@ import kotlinx.coroutines.withContext import org.jellyfin.sdk.api.client.ApiClient import org.jellyfin.sdk.api.client.extensions.libraryApi import org.jellyfin.sdk.api.client.extensions.tvShowsApi +import org.jellyfin.sdk.api.client.extensions.userLibraryApi import org.jellyfin.sdk.model.api.BaseItemKind import org.jellyfin.sdk.model.api.ItemFields import org.jellyfin.sdk.model.api.ItemSortBy @@ -293,14 +295,16 @@ class SeriesViewModel listOf( ItemFields.MEDIA_SOURCES, ItemFields.MEDIA_SOURCE_COUNT, - ItemFields.MEDIA_STREAMS, ItemFields.OVERVIEW, ItemFields.CUSTOM_RATING, - ItemFields.TRICKPLAY, ItemFields.PRIMARY_IMAGE_ASPECT_RATIO, - ItemFields.PEOPLE, ), ) + Timber.v( + "loadEpisodesInternal: episodeId=%s, episodeNumber=%s", + episodeId, + episodeNumber, + ) val pager = ApiRequestPager(api, request, GetEpisodesRequestHandler, viewModelScope) pager.init(episodeNumber ?: 0) val initialIndex = @@ -504,19 +508,34 @@ class SeriesViewModel } private var peopleInEpisodeJob: Job? = null + private val peopleInEpisodeCache = + CacheBuilder + .newBuilder() + .maximumSize(25) + .build>() suspend fun lookupPeopleInEpisode(item: BaseItem) { peopleInEpisodeJob?.cancel() if (peopleInEpisode.value?.itemId != item.id) { peopleInEpisode.setValueOnMain(PeopleInItem()) + val result = + peopleInEpisodeCache + .get(item.id) { + viewModelScope.async(Dispatchers.IO) { + val list = + api.userLibraryApi + .getItem(item.id) + .content.people + ?.map { Person.fromDto(it, api) } + .orEmpty() + + PeopleInItem(item.id, list) + } + } peopleInEpisodeJob = viewModelScope.launch(ExceptionHandler()) { delay(250) - val people = - item.data.people - ?.letNotEmpty { it.map { Person.fromDto(it, api) } } - .orEmpty() - peopleInEpisode.setValueOnMain(PeopleInItem(item.id, people)) + peopleInEpisode.setValueOnMain(result.await()) } } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt index 1951d1d9..931ac551 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt @@ -207,7 +207,11 @@ class PlaybackViewModel jobs.forEach { it.cancel() } } - private suspend fun createPlayer(isHdr: Boolean) { + private suspend fun createPlayer( + isHdr: Boolean, + is4k: Boolean, + ) { + val softwareDecoding = !preferences.appPreferences.playbackPreferences.mpvOptions.enableHardwareDecoding val playerBackend = when (preferences.appPreferences.playbackPreferences.playerBackend) { PlayerBackend.UNRECOGNIZED, @@ -216,7 +220,7 @@ class PlaybackViewModel PlayerBackend.MPV -> PlayerBackend.MPV - PlayerBackend.PREFER_MPV -> if (isHdr) PlayerBackend.EXO_PLAYER else PlayerBackend.MPV + PlayerBackend.PREFER_MPV -> if (isHdr || (is4k && softwareDecoding)) PlayerBackend.EXO_PLAYER else PlayerBackend.MPV } Timber.d("Selected backend: %s", playerBackend) @@ -428,11 +432,13 @@ class PlaybackViewModel val isHdr = it.videoRange == VideoRange.HDR || (it.videoRangeType != VideoRangeType.SDR && it.videoRangeType != VideoRangeType.UNKNOWN) - SimpleVideoStream(it.index, isHdr) + // Often times 4k movies have a wider aspect ratio so the height is lower even though the width is still 3840 + val is4k = (it.width ?: 0) > 2560 || (it.height ?: 0) > 1440 + SimpleVideoStream(it.index, isHdr, is4k) } // Create the correct player for the media - createPlayer(videoStream?.hdr == true) + createPlayer(videoStream?.hdr == true, videoStream?.is4k == true) val subtitleStreams = mediaSource.mediaStreams diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SimpleMediaStream.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SimpleMediaStream.kt index f63e91b2..6444a268 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SimpleMediaStream.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SimpleMediaStream.kt @@ -27,4 +27,5 @@ data class SimpleMediaStream( data class SimpleVideoStream( val index: Int, val hdr: Boolean, + val is4k: Boolean, ) diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/preferences/PreferencesContent.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/preferences/PreferencesContent.kt index fcb418b8..8fedf3b6 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/preferences/PreferencesContent.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/preferences/PreferencesContent.kt @@ -88,6 +88,7 @@ fun PreferencesContent( val state = rememberLazyListState() var preferences by remember { mutableStateOf(initialPreferences) } val currentUser by viewModel.currentUser.observeAsState() + val currentServer by seerrVm.currentSeerrServer.collectAsState(null) var showPinFlow by remember { mutableStateOf(false) } val navDrawerPins by viewModel.navDrawerPins.observeAsState(mapOf()) @@ -481,7 +482,7 @@ fun PreferencesContent( SeerrDialogMode.Remove -> { ConfirmDialog( title = stringResource(R.string.remove_seerr_server), - body = "", + body = currentServer?.url ?: "", onCancel = { seerrDialogMode = SeerrDialogMode.None }, onConfirm = { seerrVm.removeServer() diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/setup/seerr/SwitchSeerrViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/setup/seerr/SwitchSeerrViewModel.kt index 6148bfec..4f93217a 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/setup/seerr/SwitchSeerrViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/setup/seerr/SwitchSeerrViewModel.kt @@ -30,6 +30,7 @@ class SwitchSeerrViewModel private val serverRepository: ServerRepository, ) : ViewModel() { val currentUser = serverRepository.currentUser + val currentSeerrServer = seerrServerRepository.currentServer val serverConnectionStatus = MutableStateFlow(LoadingState.Pending) @@ -61,15 +62,16 @@ class SwitchSeerrViewModel passwordOrApiKey = passwordOrApiKey, ) } catch (ex: ClientException) { - Timber.w(ex, "Error logging in") + Timber.w(ex, "ClientException logging in") if (ex.statusCode == 401 || ex.statusCode == 403) { showToast(context, "Invalid credentials") - LoadingState.Error("Invalid credentials", ex) + result = LoadingState.Error("Invalid credentials", ex) break } else { LoadingState.Error("Could not connect with URL") } } catch (ex: Exception) { + Timber.w(ex, "Exception logging in") LoadingState.Error(ex) } if (result is LoadingState.Success) { diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 8f716bcd..4ed1e15c 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -7,4 +7,450 @@ Přidat uživatele Zvuk Místo narození + Bitrate + Narozen + Zrušit nahrávání + Zrušit nahrávání seriálu + Zrušit + Kapitoly + Vybrat %1$s + Vymazat mezipaměť obrázků + Sbírka + Kolekce + Hodnocení Komunity + Došlo k chybě! Stiskněte tlačítko pro odeslání protokolů na server. + Potvrdit + Pokračovat ve sledování + Hodnocení kritiků + %.1f sekund + Výchozí + Smazat + Zemřel + Režie %1$s + Režisér + Vypnuto + Nalezené Servery + Stahování… + Zapnuto + Konec v %1$s + Vložte Server IP nebo URL + Vložte adresu serveru + Epizody + Chyba při načítání kolekce %1$s + Externí + Oblíbený + Velikost + Nucené + Žánry + Přejít do + Skrýt ovládací prvky přehrávání + Přejít na sérii + Skrýt informace o ladění + Skrýt + Domů + Úvod + #ABCDEFGHIJKLMNOPQRSTUVWXYZ + Knihovna + Informace o licenci + Živá TV + Načítání… + Označit celou sérii jako zhlédnutou? + Označit celou sérii jako nezhlédnuté? + Označit jako nezhlédnuté + Označit jako zhlédnuté + Maximální bitrate + Více podobných + Více + + Filmy + + + + + Jméno + Další v pořadí + Žádná data + Žádné výsledky + Nenalezeny žádné servery + Žádné naplánované nahrávání + Žádné aktualizace nejsou k dispozici + Žádný + Pouze vynucené titulky + Závěr + Cesta + + Lidé + + + + + Počet přehrání + Přehrát odtud + Přehrát + Zobrazit informace o ladění přehrávání + Rychlost přehrávání + Přehrávání + Seznam + Seznamy + Náhled + Nastavení uživatelského profilu + Fronta + Shrnout + Nedávno přidáno v %1$s + Nedávno přidáno + Nedávno nahráno + Nedávno vydané + Doporučeno + Nahrát Program + Nahrát Seriál + Odebrat z oblíbených + Restart + Pokračovat + Uložit + Hledat + Vyhledávání… + Hlasové vyhledávání + Začátek + Hledat hlasem + Zpracování + Zrušíte stisknutím tlačítka zpět + Chyba nahrávání zvuku + Chyba rozpoznávání hlasu + Vyžadováno oprávnění k přístupu k mikrofonu + Chyba sítě + Časový limit sítě + Řeč nerozpoznaná + Rozpoznávání hlasu je zaneprázdněno + Chyba serveru + Nebyla detekována žádná řeč + Neznámá chyba + Nepodařilo se spustit rozpoznávání hlasu + Časový limit pro rozpoznávání hlasu vypršel + Zkusit znovu + Vybrat server + Vybrat Uživatele + Zobrazit informace o ladění + Zobrazit další + Ukázat + Náhodně + Přeskočit + Datum přidání + Datum přidání epizody + Datum přehraní + Datum vydání + Jméno + Náhodný + Studia + Odeslat + Stahování trvá dlouho, možná budete muset restartovat přehrávání + Podnázev + Titulky + Návrhy + Přepnout servery + Přepnout + Nejlépe hodnocené Nezhlédnuté + Upoutávka + + Upoutávky + + + + + Harmonogram nahrávání + Televizní program + Sezóna + Sezóny + + Seriály + + + + + Prostředí + Neznámý + Aktualizace + Verze + Měřítko videa + Video + Videa + Sledujte živě + %1$d let starý + Přehraj s překódováním + Informace o médiu + Zobrazit hodiny + Pořadí odvysílaných epizod + Vytvořit nový playlist + Přidat do playlistu + Pozastavení jedním kliknutím + Stisknutím středu D-Padu pozastavíte/přehrajete + Kurzíva + Font + Pozadí + Úspěch + Rodičovské hodnocení + Doplňky + + Jiný + + + + + + V zákulisí + + + + + + Znělky + + + + + + Tématická videa + + + + + + Klipy + + + + + + Vymazané scény + + + + + + Rozhovory + + + + + + Scény + + + + + + Krátkometrážní filmy + + + + + + %d hodina + %d hodin + %d hodin + %d hodin + + + %d položka + %d položky + %d položek + %d položek + + + %d sekunda + %d sekundy + %d sekund + %d sekund + + Zařízení podporuje AC3/Dolby Digital + Pokročilá Nastavení + Pokročilé UI + Vzhled Aplikace + Automaticky kontrolovat aktualizace + Zpoždění před dalším přehráním + Další přehrát automaticky + Zkontrolovat aktualizace + Platí pouze pro Seriály + Vždy downmixovat do stereo formátu + Použijte modul dekodéru FFmpeg + Výchozí měřítko obsahu + Nainstalovat aktualizaci + Nainstalovaná verze + Maximální počet položek v řádcích domovské stránky + Vyberte výchozí položky, které se mají zobrazit, ostatní budou skryty + Přizpůsobení položek navigačního panelu + Kliknutím přepnete stránky + Přepnout stránky navigačního panelu při zaostření + Ochrana proti výpadku + Přehrát tematickou hudbu + Přepsání přehrávání + Zapamatovat vybrané karty + Povolit opakované sledování v dalším videu + Kroky Seek baru + Užitečné pro ladění + Odeslat protokoly aplikací na aktuální server + Pokusím se odeslat na poslední připojený server + Odesílat zprávy o selhání + Nastavení + Přeskočit zpět při obnovení přehrávání + Přeskočit zpět + Přeskakovat reklamy + Přeskočit vpřed + Chování přeskočení úvodu + Přeskočit chování konce + Chování přeskočení náhledů + Aktualizace k dispozici + URL adresa používaná ke kontrole aktualizací aplikace + Aktualizovat URL + Velikost písma + Barva písma + Průhlednost písma + Styl okraje + Barva okraje + Průhlednost pozadí + Styl pozadí + Styl titulků + Barva pozadí + Reset + Tučné písmo + MPV: Použití hardwarového dekódování + Zakažte, pokud dojde k pádům + Možnosti MPV + Možnosti ExoPlayeru + Přeskočit segment + Přeskočit reklamy + Přeskočit náhled + Přeskočit shrnutí + Chování přeskočení shrnutí + Přeskočit konec + Přeskočit úvod + Přehráno + Filtr + Rok + Desetiletí + Odstranit + DolbyVision + Atmos + MPV: Použití gpu-next + Upravit mpv.conf + Zahodit změny? + Okraj + Podrobné protokolování + Zadejte PIN + Automatické přihlášení + Přihlášení přes server + Stiskněte středové tlačítko pro potvrzení + Vyžadovat PIN pro profil + Potvrdit PIN + Nesprávný + PIN musí mít 4 znaky nebo více + PIN bude odstraněn + Velikost mezipaměti (MB) + Možnosti zobrazení + Sloupce + Mezery + Poměr stran + Zobrazit podrobnosti + Typ obrázku + Hostující hvězdy + Velikost okraje + Přepínání obnovovací frekvence + Automaticky + Použijte uživatelské jméno/heslo + Přihlášení + Obecné + Kontejner + Titul + Kodek + Profil + Úroveň + Rozlišení + Snímková frekvence + Bitová hloubka + Rozsah videa + Typ rozsahu videa + Barevný prostor + Přenos barev + Základní barvy + Formát pixelů + Referenční snímky + NAL + Jazyk + Rozložení + Kanály + Vzorkovací frekvence + AVC + Ano + Ne + SDR + HDR + HDR10 + HDR10+ + HLG + bit + Hz + Zobrazit názvy + Opakovat + Zobrazit oblíbené kanály jako první + Řadit kanály podle naposledy sledovaných + Zpoždění titulků + Styl prospektu + Přepínání rozlišení + Místní + Přehrát upoutávku + Žádné upoutávky + Vyčistit výběr skladeb + DTS:X + DTS:HD + True HD + DD + DD+ + DTS + Direct play Dolby Vision Profil 7 + Ignoruj kontrolu kompatibility zařízení + Najít + Žádost + Čeká na vyřízení + Seerr integrace + Odstranit Seerr Server + Seerr server přidán + Heslo + Uživatelské jméno + URL + Nadcházející filmy + Trendy + Nadcházející TV pořady + Žádost ve 4K + Softwarové dekódování AV1 + Komerční + + Bezprostředně + + Trvání + + Vzorky + + + + + + Krátká videa + + + + + + %s Stažen + %s Staženo + %s Stažení + %s Stažení + + + Direct play ASS titulky + Direct play PGS titulky + Přehrávání Backendu + + Anamorfní + Prokládané + Color code programs + MPV je nyní výchozím přehrávačem mimo HDR.\nToto můžete změnit v nastavení. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e0c430d1..03038fc8 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -81,7 +81,7 @@ Automatisch auf Aktualisierungen prüfen Auf Aktualisierungen prüfen Einstellungen - Wählen %1$s + %1$s Wählen Bilder Cache leeren Community Bewertung Es ist ein Fehler aufgetreten! Drücke den Knopf um Logs zu deinem Server zu senden. @@ -118,7 +118,7 @@ Als nächstes Keine Von hier wiedergeben - Abspielen + Wiedergeben Wiedergabegeschwindigkeit Wiedergabe Vorschau @@ -369,4 +369,19 @@ DD DD+ Im Trend + Starten der Spracherkennung fehlgeschlagen + Zurück wählen um abzubrechen + MPV ist jetzt der Standard-Player, außer für HDR.\nDas kannst du in den Einstellungen ändern. + Sprachsuche + Sprechen, um zu suchen + Ignoriert geräte kompatibilität + kommende Filme + kommende Serien + Direktes abspielen von Dolby Vision Profil 7 + Untertitelverzögerung + Sortiere Kanäle nach zuletzt geschaut + Favoriten als erstes anzeigen + Hintergrundstil + Bildwiederholraten-Anpassung + Keine Spracheingabe erkannt diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index df0f7913..765c5fe2 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -405,4 +405,5 @@ Kõnetuvastus aegus Proovi uuesti AV1 tarkvaraline dekodeerimine + MPV on nüüd vaikimisi meediaesitaja kõige v.a. HDR-i jaoks.\nSeda saad muuta seadistustest. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 7c4aac7c..a53c580f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -421,4 +421,5 @@ Séries à venir Demande en 4K Décodage logiciel AV1 + MPV est désormais le lecteur par défaut, sauf pour HDR.\nVous pouvez modifier cela dans les paramètres. diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index ac50eb20..c1bf5242 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -388,4 +388,5 @@ Minta dalam 4K Minta Tertunda + Dekode perangkat lunak AV1 diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index c90f7419..15a70f3d 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -420,4 +420,6 @@ Impossibile avviare il riconoscimento vocale Riprova Riconoscimento vocale scaduto + Decodifica software AV1 + MPV è ora il lettore predefinito, eccetto per i contenuti HDR.\nPuoi modificarlo nelle impostazioni. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index f6570fbd..3205d05d 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -421,4 +421,5 @@ Tempo limite do reconhecimento de voz expirado Tentar novamente Decodificação de AV1 por software + O MPV é agora o reprodutor padrão, exceto para HDR.\nPode alterar esta configuração nas definições. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index aeb28c50..04204a19 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -299,15 +299,15 @@ Отрывки - - - + + + Дополнительные материалы - - - + + + Выбор плеера Толщина обводки @@ -316,15 +316,15 @@ Форсированные Саундтреки - - - + + + Видеоролики - - - + + + Настроить элементы боковой панели Выберите элементы для показа на панели, остальные элементы будут скрыты @@ -339,8 +339,58 @@ Остановка воспроизведения при бездействии Короткометражки - - - + + + + Конец в %1$s + Введите адрес сервера + Серверы не найдены + Только форсированные субтитры + Голосовой поиск + Запуск + Говорите для поиска + Обработка + Нажмите назад для отмены + Ошибка записи звука + Ошибка распознавания голоса + Требуется разрешение на использование микрофона + Сетевая ошибка + Сетевой таймаут + Речь не распознана + Голосовое распознавание занято + Ошибка сервера + Речь не обнаружена + Неизвестная ошибка + Не удалось запустить распознавание голоса + Время ожидания распознавания голоса истекло + Повторить + О медиаданных + Переключение частоты обновления + Автоматически + Исп. имя пользователя/пароль + Логин + Пароль + Имя пользователя + Язык + Основное + Контейнер + Заголовок + Кодек + Профиль + Уровень + Разрешение + Анаморфность + Чересстрочность + Ч-та кадров + Разрядность + Диапазон видео + Тип диапазона видео + Цветовое пространство + Передача цвета + Основные цвета + Формат пикселей + Опорные кадры + Да + Нет diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml new file mode 100644 index 00000000..dce8332a --- /dev/null +++ b/app/src/main/res/values-uk/strings.xml @@ -0,0 +1,456 @@ + + + Про застосунок + Активні Записи + Улюблене + Додати сервер + Додати користувача + Аудіо + Місце народження + Бітрейт + Місце народженя + Скасувати запис + Скасувати запис серіалу + Скасувати + Розділи + Виберіть%1$s + Очистити кеш зображень + Колекція + Колекції + Реклама + Оцінка спільноти + Сталася помилка! Натисніть кнопку, щоб надіслати звіт на ваш сервер. + Підтвердити + Продовжити перегляд + Оцінка критиків + %.1fсекунд + За замовчуванням + Видалити + Помер + Режисер: %1$s + Режисер + Вимкнутий + Виявлені сервери + + Завантаження… + Увімкнено + Закінчується о %1$s + Введіть IP-адресу сервера або URL-адресу + Введіть адресу сервера + Епізоди + Помилка під час завантаження колекції %1$s + Зовнішній + Улюблені + Розмір + Forced + Жанри + Перейти до серії + Перейти до + Приховати елементи керування відтворенням + Приховати інформацію про налагодження + Приховати + Головна + Негайно + Вступ + #абвгґдеєжзиіїйклмнопрстуфхцчшщьюя + Бібліотека + Інформація про ліцензію + Ефірне ТБ + Завантаження… + Серія переглянута? + Позначити серію не відтворену? + Позначити як непереглянуте + Позначити як переглянуте + Максимальна швидкість передачі даних + Більше подібного + Більше + + Фільми + + + + + Ім\'я + Наступний + Дані відсутні + Відсутні результати + Сервери не знайдені + Заплановані записи відсутні + Немає доступних оновлень + Нічого + Тільки примусові субтитри + Завершення + Шлях + + Люди + + + + + Кількість відтворень + Відтворити звідси + Відтворити + Показати інформацію про налагодження відтворення + Швидкість відтворення + Відтворення + Список відтворення + Списки відтворення + Попередній перегляд + Налаштування користувача + Черга + Підсумок + Нещодавно додано: %1$s + Нещодавно додано + Нещодавно записано + Нещодавно випущено + Рекомендовано + Програма запису + Запис серії + Не улюблений + Перезавантаження + Відновити + Зберегти + + Пошук + Шукаю… + Голосовий пошук + Початок + Говорити для пошуку + Обробка + Натисніть назад, щоб скасувати + Помилка аудіозапису + Помилка розпізнавання голосу + Потрібен дозвіл на використання мікрофона + Помилка мережі + Час очікування мережі завершився + Не розпізнано мовлення + Розпізнавання голосу зайнято + Помилка сервера + Не виявлено мовлення + Невідома помилка + Не вдалося запустити розпізнавання голосу + Час очікування розпізнавання голосу закінчився + Повторити спробу + Обрати сервер + Обрати користувача + Показати додаткову інформацію + Показати наступне + Показати + Перемішати + Пропустити + Дата додавання + Дата додавання епізоду + Дата відтворення + Дата випуску + Ім\'я + Випадковий + Судії + Надіслати + Завантаження триває надто довго, можливо, потрібно перезапустити відтворення + Підзаголовок + Субтитри + Пропозиції + Перемикнути сервер + Перемкнути + Топ непереглянутих + Трейлер + + Трейлери + + + + + Розклад DVR + Посібник + Сезон + Сезони + + Серіали + + + + + Інтерфейс + Невідомо + Оновлення + Версія + Маштаб відео + Відео + Відоси + Дивитись онлайн + %1$d років + Відтворити з перекодуванням + Інформація + Показати годиник + Порядок ефірних епізодів + Створити новий список відтворення + Додати до списку відтворення + Пауза в один клік + Натисніть центр D-Pad, щоб призупинити/відтворити + Курсив + Шрифт + Обкладенка + Успіх + Вікова оцінка + Час виконання + Додатково + + Інше + + + + + + Позакадром + + + + + + Тематичні пісні + + + + + + Тематичні відео + + + + + + Кліпи + + + + + + Видалені сцени + + + + + + Інтерв\'ю + + + + + + Сцени + + + + + + Зразки + + + + + + Короткометражні фільми + + + + + + Шорти + + + + + + %s завантаження + %s завантаження + %s завантажень + %s завантажень + + + %d година + %d години + %d годин + %d годин + + + %d елемент + %d елемента + %d елементів + %d елементів + + + %d секунда + %d секунди + %d секунд + %d секунд + + Пристрій підтримує AC3/Dolby Digital + Додаткові налаштування + Розширений інтерфейс користувача + Тема застосунку + Автоматична перевірка оновлень + Затримка перед відтворенням наступного + Автоматичне відтворення наступного + Перевірити оноалення + Застосовується тільки до серіалів + Пряме відтворення субтитрів ASS + Пряме відтворення субтитрів PGS + Завжди змішувати в стерео + Використовувати модуль декодера FFmpeg + Масштабувати контент за замовчуванням + Встановити оновлення + Встановлена версія + Максимальна кількість елементів в рядку на головній сторінці + Виберіть елементи, які будуть відображатися за замовчуванням, інші будуть приховані + Налаштування елементів навігаційного меню + Натисніть, щоб перейти на іншу сторінку + Перемикання сторінок навігаційного меню при фокусуванні + Захист від відключення + Відтворити музичну тему + Перегляд записів + Запам\'ятати вибрані вкладки + Увімкнути повторний перегляд як наступне + Кроки пошуку + Корисно для налагодження + Надіслати журнали програми на поточний сервер + Спробує надіслати на останній підключений сервер + Надіслати звіти про збій + Налаштування + Перейти назад при відновленні відтворення + Перейти назад + Пропускати рекламу + Перемотати вперед + Пропустити початок + Пропустити кінець + Пропусти попередній перегляд + Пропустити підсумок + Оновлення доступні + URL для перевірки оновлень + Оновити URL + Розмір шрифта + Колір шрифта + Непрозорість шрифту + Стиль контурів + Колір контуру + Прозорість фону + Стиль фону + Стиль заголовку + Колір фону + Скинути + Жирний шрифт + Playback Backend + MPV: Використовувати апаратне декодування + Вимкніть, якщо ви стикаєтеся з проблемами + Варіанти MPV + Параметри ExoPlayer + Пропустити сегмент + Пропустити реклами + Пропустити попередній перегляд + Пропустити повтор + Пропустити кінець + Пропустити вступ + Відтворено + Фільтр + Рік + Десятиліття + Видалити + Dolby Vision + Dolby Atmos + MPV: Використовувати gpu + Редагувати mpv.conf + Відмінити зміни? + Відступ + Детальне ведення журналу + Ведіть PIN + Автоматичний вхід + Увійти через сервер + Натисніть по центру для підтвердження + Вимагати PIN для профілю + Підтвердити PIN + Невірно + PIN-код повинен складатися з 4 або більше символів + Видалити PIN-код + Розмір кешу зображень (МБ) + Переглянути параметри + Колонки + Відступ(Інтервал) + Співвідношення сторін + Показати деталі + + Тип зображення + + Запрошені зірки + Розмір контуру + Перемикання частоти оновлення + Автоматично + Використовуйте ім\'я користувача/пароль + Увійти + Загальні + Контейнер + Заголовок + Codec + Профіль + Рівень + Розширення + Anamorphic + Interlaced + Частота кадрів + Bit depth + Діапазон відео + Тип діапазону відео + Кольоровий простір + Перенесення кольору + Головний колір + Формат пікселю + Ref frames + NAL + Мова + Компонування + Канали + Sample rate + AVC + Так + Ні + SDR + HDR + HDR10 + HDR10+ + HLG + біт + Гц + Показати заголовок + Повторити + Показати обрані канали на початку + Відсортувати канали за нещодавно переглянутими + Кольоровий код програм + Затримка субтитрів + Стиль фону + Перемикання розширення + Локальний + Відтворити трейлер + Трейлери відсутні + Чіткий вибір доріжки + DTS:X + DTS:HD + TrueHD + DD + DD+ + DTS + Пряме відтворення Dolby Vision Profile 7 + Ігноруваии перевірку сумісності пристроїв + Відкрийте для себе + Запит + В очікувані + Seerr інтеграція + Видалити Seerr Server + Seerr сервер додано + Пароль + Нік + URL + Популярні + Заплановані Фільми + Заплановані Серіали + Запит в 4К + Програмне декодування AV1 + MPV тепер є плеєром за замовчуванням, за винятком для HDR.\nВи можете змінити це в налаштуваннях. + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 1dc78897..10a25eac 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -254,9 +254,9 @@ 重置 粗体 播放后端 - MPV:使用硬件解码 + mpv:使用硬件解码 如果遇到崩溃,请禁用 - MPV 选项 + mpv 选项 ExoPlayer 选项 跳过片段 跳过广告 @@ -271,7 +271,7 @@ 移除 杜比视界 杜比全景声 - MPV:使用 gpu-next + mpv:使用 gpu-next 编辑 mpv.conf 舍弃更改? 边距 @@ -389,4 +389,5 @@ 语音识别超时 重试 AV1 软件解码 + 除 HDR 视频外,mpv 现在是默认播放器。\n您可以在设置中更改此设置。 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 60d38f86..fd54746c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -388,4 +388,5 @@ 無法啟動語音辨識 語音辨識逾時 重試 + AV1 軟體解碼