From b5b5554f473af7dec3350e3ab24dbf6be22ed5b7 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Tue, 21 Apr 2026 00:22:02 +0530 Subject: [PATCH 001/143] feat: tmdb as source for collections --- .../nuvio/app/core/i18n/LocalizedUiText.kt | 127 ++- .../collection/CollectionEditorRepository.kt | 337 +++++- .../collection/CollectionEditorScreen.kt | 1015 +++++++++++++++-- .../collection/CollectionJsonPreserver.kt | 50 +- .../features/collection/CollectionModels.kt | 108 ++ .../collection/CollectionRepository.kt | 8 +- .../collection/FolderDetailRepository.kt | 111 +- .../TmdbCollectionSourceResolver.kt | 526 +++++++++ .../com/nuvio/app/features/home/HomeScreen.kt | 13 +- .../home/components/HomeHeroSection.kt | 2 +- .../app/features/library/LibraryRepository.kt | 8 +- .../watchprogress/WatchProgressModels.kt | 26 +- .../details/SeriesPlaybackResolverTest.kt | 4 +- .../watching/domain/SeriesContinuityTest.kt | 4 +- 14 files changed, 2086 insertions(+), 253 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/TmdbCollectionSourceResolver.kt diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/i18n/LocalizedUiText.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/i18n/LocalizedUiText.kt index fe9a7297..ca955abb 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/i18n/LocalizedUiText.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/i18n/LocalizedUiText.kt @@ -46,96 +46,105 @@ import nuvio.composeapp.generated.resources.unit_bytes_kb import nuvio.composeapp.generated.resources.unit_bytes_mb import org.jetbrains.compose.resources.getString -fun localizedMediaTypeLabel(type: String): String = runBlocking { - when (type.trim().lowercase()) { - "movie" -> getString(Res.string.media_movies) - "series" -> getString(Res.string.media_series) - "anime" -> getString(Res.string.media_anime) - "channel" -> getString(Res.string.media_channels) - "tv" -> getString(Res.string.media_tv) - else -> type.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } +fun localizedMediaTypeLabel(type: String): String { + val fallback = type.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } + return when (type.trim().lowercase()) { + "movie" -> resourceString("Movies") { getString(Res.string.media_movies) } + "series" -> resourceString("Series") { getString(Res.string.media_series) } + "anime" -> resourceString("Anime") { getString(Res.string.media_anime) } + "channel" -> resourceString("Channels") { getString(Res.string.media_channels) } + "tv" -> resourceString("TV") { getString(Res.string.media_tv) } + else -> fallback } } -fun localizedMovieTypeLabel(): String = runBlocking { getString(Res.string.media_movie) } +fun localizedMovieTypeLabel(): String = resourceString("Movie") { getString(Res.string.media_movie) } -fun localizedSeasonEpisodeCode(seasonNumber: Int?, episodeNumber: Int?): String? = runBlocking { +fun localizedSeasonEpisodeCode(seasonNumber: Int?, episodeNumber: Int?): String? = when { seasonNumber != null && episodeNumber != null -> - getString(Res.string.compose_player_episode_code_full, seasonNumber, episodeNumber) + resourceString("S${seasonNumber}E${episodeNumber}") { + getString(Res.string.compose_player_episode_code_full, seasonNumber, episodeNumber) + } episodeNumber != null -> - getString(Res.string.compose_player_episode_code_episode_only, episodeNumber) + resourceString("E${episodeNumber}") { + getString(Res.string.compose_player_episode_code_episode_only, episodeNumber) + } else -> null } -} -fun localizedPlayLabel(seasonNumber: Int?, episodeNumber: Int?): String = runBlocking { +fun localizedPlayLabel(seasonNumber: Int?, episodeNumber: Int?): String { val episodeCode = localizedSeasonEpisodeCode(seasonNumber, episodeNumber) - if (episodeCode != null) { - getString(Res.string.action_play_episode, episodeCode) + return if (episodeCode != null) { + resourceString("Play $episodeCode") { getString(Res.string.action_play_episode, episodeCode) } } else { - getString(Res.string.action_play) + resourceString("Play") { getString(Res.string.action_play) } } } -fun localizedResumeLabel(seasonNumber: Int?, episodeNumber: Int?): String = runBlocking { +fun localizedResumeLabel(seasonNumber: Int?, episodeNumber: Int?): String { val episodeCode = localizedSeasonEpisodeCode(seasonNumber, episodeNumber) - if (episodeCode != null) { - getString(Res.string.action_resume_episode, episodeCode) + return if (episodeCode != null) { + resourceString("Resume $episodeCode") { getString(Res.string.action_resume_episode, episodeCode) } } else { - getString(Res.string.action_resume) + resourceString("Resume") { getString(Res.string.action_resume) } } } -fun localizedUpNextLabel(seasonNumber: Int?, episodeNumber: Int?): String = runBlocking { +fun localizedUpNextLabel(seasonNumber: Int?, episodeNumber: Int?): String = if (seasonNumber != null && episodeNumber != null) { - getString(Res.string.continue_watching_up_next_episode, seasonNumber, episodeNumber) + resourceString("Up Next • S${seasonNumber}E${episodeNumber}") { + getString(Res.string.continue_watching_up_next_episode, seasonNumber, episodeNumber) + } } else { - getString(Res.string.continue_watching_up_next) + resourceString("Up Next") { getString(Res.string.continue_watching_up_next) } } -} -fun localizedMonthName(month: Int): String = runBlocking { +fun localizedMonthName(month: Int): String = when (month) { - 1 -> getString(Res.string.date_month_january) - 2 -> getString(Res.string.date_month_february) - 3 -> getString(Res.string.date_month_march) - 4 -> getString(Res.string.date_month_april) - 5 -> getString(Res.string.date_month_may) - 6 -> getString(Res.string.date_month_june) - 7 -> getString(Res.string.date_month_july) - 8 -> getString(Res.string.date_month_august) - 9 -> getString(Res.string.date_month_september) - 10 -> getString(Res.string.date_month_october) - 11 -> getString(Res.string.date_month_november) - 12 -> getString(Res.string.date_month_december) + 1 -> resourceString("January") { getString(Res.string.date_month_january) } + 2 -> resourceString("February") { getString(Res.string.date_month_february) } + 3 -> resourceString("March") { getString(Res.string.date_month_march) } + 4 -> resourceString("April") { getString(Res.string.date_month_april) } + 5 -> resourceString("May") { getString(Res.string.date_month_may) } + 6 -> resourceString("June") { getString(Res.string.date_month_june) } + 7 -> resourceString("July") { getString(Res.string.date_month_july) } + 8 -> resourceString("August") { getString(Res.string.date_month_august) } + 9 -> resourceString("September") { getString(Res.string.date_month_september) } + 10 -> resourceString("October") { getString(Res.string.date_month_october) } + 11 -> resourceString("November") { getString(Res.string.date_month_november) } + 12 -> resourceString("December") { getString(Res.string.date_month_december) } else -> month.toString() } -} -fun localizedShortMonthName(month: Int): String = runBlocking { +fun localizedShortMonthName(month: Int): String = when (month) { - 1 -> getString(Res.string.date_month_short_jan) - 2 -> getString(Res.string.date_month_short_feb) - 3 -> getString(Res.string.date_month_short_mar) - 4 -> getString(Res.string.date_month_short_apr) - 5 -> getString(Res.string.date_month_short_may) - 6 -> getString(Res.string.date_month_short_jun) - 7 -> getString(Res.string.date_month_short_jul) - 8 -> getString(Res.string.date_month_short_aug) - 9 -> getString(Res.string.date_month_short_sep) - 10 -> getString(Res.string.date_month_short_oct) - 11 -> getString(Res.string.date_month_short_nov) - 12 -> getString(Res.string.date_month_short_dec) + 1 -> resourceString("Jan") { getString(Res.string.date_month_short_jan) } + 2 -> resourceString("Feb") { getString(Res.string.date_month_short_feb) } + 3 -> resourceString("Mar") { getString(Res.string.date_month_short_mar) } + 4 -> resourceString("Apr") { getString(Res.string.date_month_short_apr) } + 5 -> resourceString("May") { getString(Res.string.date_month_short_may) } + 6 -> resourceString("Jun") { getString(Res.string.date_month_short_jun) } + 7 -> resourceString("Jul") { getString(Res.string.date_month_short_jul) } + 8 -> resourceString("Aug") { getString(Res.string.date_month_short_aug) } + 9 -> resourceString("Sep") { getString(Res.string.date_month_short_sep) } + 10 -> resourceString("Oct") { getString(Res.string.date_month_short_oct) } + 11 -> resourceString("Nov") { getString(Res.string.date_month_short_nov) } + 12 -> resourceString("Dec") { getString(Res.string.date_month_short_dec) } else -> month.toString() } -} -fun localizedByteUnit(unit: String): String = runBlocking { +fun localizedByteUnit(unit: String): String = when (unit) { - "GB" -> getString(Res.string.unit_bytes_gb) - "MB" -> getString(Res.string.unit_bytes_mb) - "KB" -> getString(Res.string.unit_bytes_kb) - else -> getString(Res.string.unit_bytes_b) + "GB" -> resourceString("GB") { getString(Res.string.unit_bytes_gb) } + "MB" -> resourceString("MB") { getString(Res.string.unit_bytes_mb) } + "KB" -> resourceString("KB") { getString(Res.string.unit_bytes_kb) } + else -> resourceString("B") { getString(Res.string.unit_bytes_b) } } -} + +private fun resourceString( + fallback: String, + provider: suspend () -> String, +): String = runCatching { + runBlocking { provider() } +}.getOrDefault(fallback) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt index e5c09ab7..cbb476c8 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt @@ -2,9 +2,13 @@ package com.nuvio.app.features.collection import co.touchlab.kermit.Logger import com.nuvio.app.features.home.PosterShape +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @@ -22,11 +26,32 @@ data class CollectionEditorUiState( val editingFolder: CollectionFolder? = null, val showFolderEditor: Boolean = false, val showCatalogPicker: Boolean = false, + val showTmdbSourcePicker: Boolean = false, val genrePickerSourceIndex: Int? = null, + val tmdbBuilderMode: TmdbBuilderMode = TmdbBuilderMode.PRESETS, + val tmdbInput: String = "", + val tmdbTitleInput: String = "", + val tmdbMediaType: TmdbCollectionMediaType = TmdbCollectionMediaType.MOVIE, + val tmdbMediaBoth: Boolean = false, + val tmdbSortBy: String = TmdbCollectionSort.POPULAR_DESC.value, + val tmdbFilters: TmdbCollectionFilters = TmdbCollectionFilters(), + val tmdbCompanyResults: List = emptyList(), + val tmdbCollectionResults: List = emptyList(), + val tmdbSearchError: String? = null, ) +enum class TmdbBuilderMode { + PRESETS, + LIST, + PRODUCTION, + NETWORK, + COLLECTION, + DISCOVER, +} + object CollectionEditorRepository { private val log = Logger.withTag("CollectionEditorRepository") + private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default) private val _uiState = MutableStateFlow(CollectionEditorUiState()) val uiState: StateFlow = _uiState.asStateFlow() @@ -198,39 +223,40 @@ object CollectionEditorRepository { catalogId = catalog.catalogId, genre = defaultGenre, ) - if (folder.catalogSources.any { + if (folder.resolvedCatalogSources.any { it.addonId == source.addonId && it.type == source.type && it.catalogId == source.catalogId }) return _uiState.value = _uiState.value.copy( - editingFolder = folder.copy(catalogSources = folder.catalogSources + source), + editingFolder = folder.withSources(folder.resolvedSources + source.toCollectionSource()), ) } fun removeCatalogSource(index: Int) { val folder = _uiState.value.editingFolder ?: return - if (index !in folder.catalogSources.indices) return + val sources = folder.resolvedSources + if (index !in sources.indices) return _uiState.value = _uiState.value.copy( - editingFolder = folder.copy( - catalogSources = folder.catalogSources.toMutableList().apply { removeAt(index) }, - ), + editingFolder = folder.withSources(sources.toMutableList().apply { removeAt(index) }), genrePickerSourceIndex = null, ) } fun updateCatalogSourceGenre(index: Int, genre: String?) { val folder = _uiState.value.editingFolder ?: return - if (index !in folder.catalogSources.indices) return - val updated = folder.catalogSources.toMutableList() + val sources = folder.resolvedSources + if (index !in sources.indices || sources[index].isTmdb) return + val updated = sources.toMutableList() updated[index] = updated[index].copy(genre = genre) _uiState.value = _uiState.value.copy( - editingFolder = folder.copy(catalogSources = updated), + editingFolder = folder.withSources(updated), ) } fun toggleCatalogSource(catalog: AvailableCatalog) { val folder = _uiState.value.editingFolder ?: return - val existingIndex = folder.catalogSources.indexOfFirst { - it.addonId == catalog.addonId && it.type == catalog.type && it.catalogId == catalog.catalogId + val sources = folder.resolvedSources + val existingIndex = sources.indexOfFirst { + !it.isTmdb && it.addonId == catalog.addonId && it.type == catalog.type && it.catalogId == catalog.catalogId } if (existingIndex >= 0) { removeCatalogSource(existingIndex) @@ -242,6 +268,7 @@ object CollectionEditorRepository { fun showCatalogPicker() { _uiState.value = _uiState.value.copy( showCatalogPicker = true, + showTmdbSourcePicker = false, genrePickerSourceIndex = null, ) } @@ -250,12 +277,27 @@ object CollectionEditorRepository { _uiState.value = _uiState.value.copy(showCatalogPicker = false) } + fun showTmdbSourcePicker() { + _uiState.value = _uiState.value.copy( + showTmdbSourcePicker = true, + showCatalogPicker = false, + genrePickerSourceIndex = null, + tmdbSearchError = null, + ) + } + + fun hideTmdbSourcePicker() { + _uiState.value = _uiState.value.copy(showTmdbSourcePicker = false, tmdbSearchError = null) + } + fun showGenrePicker(index: Int) { val folder = _uiState.value.editingFolder ?: return - if (index !in folder.catalogSources.indices) return + val sources = folder.resolvedSources + if (index !in sources.indices || sources[index].isTmdb) return _uiState.value = _uiState.value.copy( genrePickerSourceIndex = index, showCatalogPicker = false, + showTmdbSourcePicker = false, ) } @@ -265,17 +307,19 @@ object CollectionEditorRepository { fun saveFolderEdit() { val folder = _uiState.value.editingFolder ?: return + val normalizedFolder = folder.withSources(folder.resolvedSources) val existing = _uiState.value.folders - val updated = if (existing.any { it.id == folder.id }) { - existing.map { if (it.id == folder.id) folder else it } + val updated = if (existing.any { it.id == normalizedFolder.id }) { + existing.map { if (it.id == normalizedFolder.id) normalizedFolder else it } } else { - existing + folder + existing + normalizedFolder } _uiState.value = _uiState.value.copy( folders = updated, editingFolder = null, showFolderEditor = false, showCatalogPicker = false, + showTmdbSourcePicker = false, genrePickerSourceIndex = null, ) } @@ -285,10 +329,211 @@ object CollectionEditorRepository { editingFolder = null, showFolderEditor = false, showCatalogPicker = false, + showTmdbSourcePicker = false, genrePickerSourceIndex = null, ) } + fun setTmdbBuilderMode(mode: TmdbBuilderMode) { + val mediaType = if (mode == TmdbBuilderMode.NETWORK) { + TmdbCollectionMediaType.TV + } else { + _uiState.value.tmdbMediaType + } + _uiState.value = _uiState.value.copy( + tmdbBuilderMode = mode, + tmdbMediaType = mediaType, + tmdbMediaBoth = if ( + mode == TmdbBuilderMode.NETWORK || + mode == TmdbBuilderMode.LIST || + mode == TmdbBuilderMode.COLLECTION + ) { + false + } else { + _uiState.value.tmdbMediaBoth + }, + tmdbCompanyResults = emptyList(), + tmdbCollectionResults = emptyList(), + tmdbSearchError = null, + ) + } + + fun setTmdbInput(value: String) { + _uiState.value = _uiState.value.copy(tmdbInput = value, tmdbSearchError = null) + } + + fun setTmdbTitleInput(value: String) { + _uiState.value = _uiState.value.copy(tmdbTitleInput = value) + } + + fun setTmdbMediaType(value: TmdbCollectionMediaType) { + _uiState.value = _uiState.value.copy(tmdbMediaType = value, tmdbMediaBoth = false) + } + + fun setTmdbMediaBoth(value: Boolean) { + _uiState.value = _uiState.value.copy( + tmdbMediaBoth = value, + tmdbMediaType = if (value) TmdbCollectionMediaType.MOVIE else _uiState.value.tmdbMediaType, + ) + } + + fun setTmdbSortBy(value: String) { + _uiState.value = _uiState.value.copy(tmdbSortBy = value) + } + + fun updateTmdbFilters(transform: (TmdbCollectionFilters) -> TmdbCollectionFilters) { + _uiState.value = _uiState.value.copy(tmdbFilters = transform(_uiState.value.tmdbFilters)) + } + + fun addTmdbPreset(source: CollectionSource) { + addTmdbSource(source) + } + + fun searchTmdbCompanies() { + val query = _uiState.value.tmdbInput.trim() + if (query.isBlank()) return + scope.launch { + val results = runCatching { TmdbCollectionSourceResolver.searchCompanies(query) } + _uiState.value = _uiState.value.copy( + tmdbCompanyResults = results.getOrDefault(emptyList()), + tmdbSearchError = results.exceptionOrNull()?.message, + ) + } + } + + fun searchTmdbCollections() { + val query = _uiState.value.tmdbInput.trim() + if (query.isBlank()) return + scope.launch { + val results = runCatching { TmdbCollectionSourceResolver.searchCollections(query) } + _uiState.value = _uiState.value.copy( + tmdbCollectionResults = results.getOrDefault(emptyList()), + tmdbSearchError = results.exceptionOrNull()?.message, + ) + } + } + + fun addTmdbSource(source: CollectionSource) { + val sourceType = source.tmdbType() + if (source.tmdbId != null && sourceType in coverMetadataSourceTypes) { + scope.launch { + val metadata = runCatching { TmdbCollectionSourceResolver.importMetadata(sourceType, source.tmdbId) } + val resolved = metadata.getOrNull() + addTmdbSources( + sources = listOf( + if (source.title.isNullOrBlank()) { + source.copy(title = resolved?.title) + } else { + source + }, + ), + coverImageUrl = resolved?.coverImageUrl, + ) + } + return + } + addTmdbSources(listOf(source)) + } + + fun addTmdbSourcesFromPicker(sources: List) { + val metadataSource = sources.firstOrNull { + it.tmdbId != null && it.tmdbType() in coverMetadataSourceTypes + } + if (metadataSource != null) { + scope.launch { + val sourceType = metadataSource.tmdbType() + val metadata = runCatching { TmdbCollectionSourceResolver.importMetadata(sourceType, metadataSource.tmdbId!!) } + addTmdbSources(sources, metadata.getOrNull()?.coverImageUrl) + } + return + } + addTmdbSources(sources) + } + + fun addTmdbSourceFromInput() { + val state = _uiState.value + val mode = state.tmdbBuilderMode + val sourceType = when (mode) { + TmdbBuilderMode.PRESETS -> TmdbCollectionSourceType.DISCOVER + TmdbBuilderMode.LIST -> TmdbCollectionSourceType.LIST + TmdbBuilderMode.COLLECTION -> TmdbCollectionSourceType.COLLECTION + TmdbBuilderMode.PRODUCTION -> TmdbCollectionSourceType.COMPANY + TmdbBuilderMode.NETWORK -> TmdbCollectionSourceType.NETWORK + TmdbBuilderMode.DISCOVER -> TmdbCollectionSourceType.DISCOVER + } + val id = TmdbCollectionSourceResolver.parseTmdbId(state.tmdbInput) + if (sourceType != TmdbCollectionSourceType.DISCOVER && id == null) { + _uiState.value = state.copy(tmdbSearchError = "Enter a valid TMDB ID or URL.") + return + } + val mediaTypes = selectedMediaTypes(state, sourceType) + val baseTitle = state.tmdbTitleInput.ifBlank { + when (sourceType) { + TmdbCollectionSourceType.LIST -> "TMDB List ${id ?: ""}".trim() + TmdbCollectionSourceType.COLLECTION -> "TMDB Collection ${id ?: ""}".trim() + TmdbCollectionSourceType.COMPANY -> "TMDB Production ${id ?: ""}".trim() + TmdbCollectionSourceType.NETWORK -> "TMDB Network ${id ?: ""}".trim() + TmdbCollectionSourceType.DISCOVER -> "TMDB Discover" + } + } + val sources = mediaTypes.map { mediaType -> + CollectionSource( + provider = "tmdb", + tmdbSourceType = sourceType.name, + title = titleForMedia(baseTitle, mediaType, mediaTypes.size > 1), + tmdbId = id, + mediaType = mediaType.name, + sortBy = state.tmdbSortBy, + filters = state.tmdbFilters, + ) + } + if (sourceType == TmdbCollectionSourceType.LIST || sourceType == TmdbCollectionSourceType.COLLECTION) { + scope.launch { + val metadata = runCatching { TmdbCollectionSourceResolver.importMetadata(sourceType, id!!) } + val resolved = metadata.getOrNull() + if (metadata.isFailure) { + _uiState.value = _uiState.value.copy( + tmdbSearchError = metadata.exceptionOrNull()?.message ?: "Could not load TMDB source", + ) + return@launch + } + addTmdbSources( + sources.map { source -> + source.copy(title = state.tmdbTitleInput.ifBlank { resolved?.title ?: baseTitle }) + }, + coverImageUrl = resolved?.coverImageUrl, + ) + } + return + } + addTmdbSourcesFromPicker(sources) + } + + private fun addTmdbSources(sources: List, coverImageUrl: String? = null) { + val folder = _uiState.value.editingFolder ?: return + val existingKeys = folder.resolvedSources.mapTo(mutableSetOf(), ::collectionSourceKey) + val newSources = sources.filter { existingKeys.add(collectionSourceKey(it)) } + if (newSources.isEmpty()) return + val shouldApplyCover = newSources.any { it.tmdbType() in coverMetadataSourceTypes } && + !coverImageUrl.isNullOrBlank() && + folder.coverImageUrl.isNullOrBlank() + val updatedFolder = if (shouldApplyCover) { + folder.withSources(folder.resolvedSources + newSources) + .copy(coverImageUrl = coverImageUrl, coverEmoji = null) + } else { + folder.withSources(folder.resolvedSources + newSources) + } + _uiState.value = _uiState.value.copy( + editingFolder = updatedFolder, + showTmdbSourcePicker = false, + tmdbInput = "", + tmdbTitleInput = "", + tmdbCompanyResults = emptyList(), + tmdbCollectionResults = emptyList(), + tmdbSearchError = null, + ) + } + fun save(): Boolean { val state = _uiState.value if (state.title.isBlank()) return false @@ -311,3 +556,65 @@ object CollectionEditorRepository { return true } } + +private val coverMetadataSourceTypes = setOf( + TmdbCollectionSourceType.COLLECTION, + TmdbCollectionSourceType.COMPANY, + TmdbCollectionSourceType.NETWORK, +) + +private fun CollectionCatalogSource.toCollectionSource(): CollectionSource = + CollectionSource( + provider = "addon", + addonId = addonId, + type = type, + catalogId = catalogId, + genre = genre, + ) + +private fun CollectionFolder.withSources(nextSources: List): CollectionFolder = + copy( + sources = nextSources, + catalogSources = nextSources.mapNotNull { it.addonCatalogSource() }, + ) + +private fun collectionSourceKey(source: CollectionSource): String = + if (source.isTmdb) { + "tmdb_${source.tmdbSourceType}_${source.tmdbId}_${source.mediaType}_${source.sortBy}_${source.filters.hashCode()}" + } else { + "addon_${source.addonId}_${source.type}_${source.catalogId}_${source.genre.orEmpty()}" + } + +private fun selectedMediaTypes( + state: CollectionEditorUiState, + sourceType: TmdbCollectionSourceType, +): List = + when (sourceType) { + TmdbCollectionSourceType.COMPANY, + TmdbCollectionSourceType.DISCOVER -> if (state.tmdbMediaBoth) { + listOf(TmdbCollectionMediaType.MOVIE, TmdbCollectionMediaType.TV) + } else { + listOf(state.tmdbMediaType) + } + TmdbCollectionSourceType.NETWORK -> listOf(TmdbCollectionMediaType.TV) + TmdbCollectionSourceType.COLLECTION, + TmdbCollectionSourceType.LIST -> listOf(TmdbCollectionMediaType.MOVIE) + } + +private fun titleForMedia( + title: String, + mediaType: TmdbCollectionMediaType, + addSuffix: Boolean, +): String { + if (!addSuffix) return title + val suffix = when (mediaType) { + TmdbCollectionMediaType.MOVIE -> "Movies" + TmdbCollectionMediaType.TV -> "Series" + } + return "$title $suffix" +} + +private fun CollectionSource.tmdbType(): TmdbCollectionSourceType = + tmdbSourceType + ?.let { raw -> runCatching { TmdbCollectionSourceType.valueOf(raw.uppercase()) }.getOrNull() } + ?: TmdbCollectionSourceType.DISCOVER diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt index 3fb927c3..15b2a28a 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt @@ -6,10 +6,12 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxSize @@ -29,9 +31,11 @@ import androidx.compose.material.icons.rounded.Close import androidx.compose.material.icons.rounded.Delete import androidx.compose.material.icons.rounded.Edit import androidx.compose.material.icons.rounded.Menu +import androidx.compose.material.icons.rounded.Search import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FilterChip +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -85,9 +89,28 @@ fun CollectionEditorScreen( val editingFolder = state.editingFolder if (state.showFolderEditor && editingFolder != null) { + if (state.showCatalogPicker) { + CatalogPickerScreen( + availableCatalogs = state.availableCatalogs, + selectedSources = editingFolder.resolvedCatalogSources, + onToggle = { CollectionEditorRepository.toggleCatalogSource(it) }, + onBack = { CollectionEditorRepository.hideCatalogPicker() }, + ) + return + } + + if (state.showTmdbSourcePicker) { + TmdbSourcePickerScreen( + state = state, + onBack = { CollectionEditorRepository.hideTmdbSourcePicker() }, + ) + return + } + val genrePickerIndex = state.genrePickerSourceIndex - val genrePickerSource = genrePickerIndex?.let { editingFolder.catalogSources.getOrNull(it) } - val genrePickerCatalog = genrePickerSource?.let { source -> + val genrePickerSource = genrePickerIndex?.let { editingFolder.resolvedSources.getOrNull(it) } + val genrePickerCatalogSource = genrePickerSource?.addonCatalogSource() + val genrePickerCatalog = genrePickerCatalogSource?.let { source -> state.availableCatalogs.find { it.addonId == source.addonId && it.type == source.type && it.catalogId == source.catalogId } @@ -98,24 +121,15 @@ fun CollectionEditorScreen( onBack = { CollectionEditorRepository.cancelFolderEdit() }, ) - if (state.showCatalogPicker) { - CatalogPickerSheet( - availableCatalogs = state.availableCatalogs, - selectedSources = editingFolder.catalogSources, - onToggle = { CollectionEditorRepository.toggleCatalogSource(it) }, - onDismiss = { CollectionEditorRepository.hideCatalogPicker() }, - ) - } - if ( genrePickerIndex != null && - genrePickerSource != null && + genrePickerCatalogSource != null && genrePickerCatalog != null && genrePickerCatalog.genreOptions.isNotEmpty() ) { GenrePickerSheet( title = genrePickerCatalog.catalogName, - selectedGenre = genrePickerSource.genre, + selectedGenre = genrePickerCatalogSource.genre, genreOptions = genrePickerCatalog.genreOptions, allowAll = !genrePickerCatalog.genreRequired, onSelect = { @@ -129,12 +143,21 @@ fun CollectionEditorScreen( } if (state.showCatalogPicker) { - CatalogPickerSheet( + CatalogPickerScreen( availableCatalogs = state.availableCatalogs, - selectedSources = state.editingFolder?.catalogSources.orEmpty(), + selectedSources = state.editingFolder?.resolvedCatalogSources.orEmpty(), onToggle = { CollectionEditorRepository.toggleCatalogSource(it) }, - onDismiss = { CollectionEditorRepository.hideCatalogPicker() }, + onBack = { CollectionEditorRepository.hideCatalogPicker() }, ) + return + } + + if (state.showTmdbSourcePicker) { + TmdbSourcePickerScreen( + state = state, + onBack = { CollectionEditorRepository.hideTmdbSourcePicker() }, + ) + return } Box(modifier = Modifier.fillMaxSize()) { @@ -451,7 +474,7 @@ private fun FolderListItem( Column(modifier = Modifier.weight(1f)) { val summary = stringResource( Res.string.collections_editor_source_count, - folder.catalogSources.size, + folder.resolvedSources.size, posterShapeLabel(folder.posterShape), ) Text( @@ -683,18 +706,30 @@ private fun FolderEditorPage( FolderEditorSection( title = stringResource(Res.string.collections_editor_section_catalog_sources), actions = { - TextButton(onClick = { CollectionEditorRepository.showCatalogPicker() }) { - Icon( - imageVector = Icons.Rounded.Add, - contentDescription = null, - modifier = Modifier.size(18.dp), - ) - Spacer(modifier = Modifier.width(4.dp)) - Text(stringResource(Res.string.collections_editor_add_catalog)) + Row(horizontalArrangement = Arrangement.spacedBy(4.dp)) { + TextButton(onClick = { CollectionEditorRepository.showTmdbSourcePicker() }) { + Icon( + imageVector = Icons.Rounded.Add, + contentDescription = null, + modifier = Modifier.size(18.dp), + ) + Spacer(modifier = Modifier.width(4.dp)) + Text("TMDB") + } + TextButton(onClick = { CollectionEditorRepository.showCatalogPicker() }) { + Icon( + imageVector = Icons.Rounded.Add, + contentDescription = null, + modifier = Modifier.size(18.dp), + ) + Spacer(modifier = Modifier.width(4.dp)) + Text(stringResource(Res.string.collections_editor_add_catalog)) + } } }, ) { - if (folder.catalogSources.isEmpty()) { + val sources = folder.resolvedSources + if (sources.isEmpty()) { NuvioSurfaceCard { Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { Text( @@ -712,15 +747,25 @@ private fun FolderEditorPage( } } else { Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { - folder.catalogSources.forEachIndexed { index, source -> - FolderCatalogSourceCard( - source = source, - matchingCatalog = state.availableCatalogs.find { - it.addonId == source.addonId && it.type == source.type && it.catalogId == source.catalogId - }, - onRemove = { CollectionEditorRepository.removeCatalogSource(index) }, - onOpenGenrePicker = { CollectionEditorRepository.showGenrePicker(index) }, - ) + sources.forEachIndexed { index, source -> + val addonSource = source.addonCatalogSource() + if (source.isTmdb) { + FolderTmdbSourceCard( + source = source, + onRemove = { CollectionEditorRepository.removeCatalogSource(index) }, + ) + } else if (addonSource != null) { + FolderCatalogSourceCard( + source = addonSource, + matchingCatalog = state.availableCatalogs.find { + it.addonId == addonSource.addonId && + it.type == addonSource.type && + it.catalogId == addonSource.catalogId + }, + onRemove = { CollectionEditorRepository.removeCatalogSource(index) }, + onOpenGenrePicker = { CollectionEditorRepository.showGenrePicker(index) }, + ) + } } } } @@ -756,120 +801,755 @@ private fun FolderEditorPage( } } -@OptIn(ExperimentalMaterial3Api::class) @Composable -private fun CatalogPickerSheet( +private fun CatalogPickerScreen( availableCatalogs: List, selectedSources: List, onToggle: (AvailableCatalog) -> Unit, - onDismiss: () -> Unit, + onBack: () -> Unit, ) { - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + PlatformBackHandler(enabled = true) { + onBack() + } - NuvioModalBottomSheet( - onDismissRequest = onDismiss, - sheetState = sheetState, - containerColor = MaterialTheme.colorScheme.surface, - ) { - LazyColumn( - contentPadding = PaddingValues(horizontal = 20.dp, vertical = 8.dp), - verticalArrangement = Arrangement.spacedBy(2.dp), - ) { - item { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 12.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, - ) { + NuvioScreen(modifier = Modifier.fillMaxSize()) { + stickyHeader { + NuvioScreenHeader( + title = stringResource(Res.string.collections_editor_select_catalogs), + onBack = onBack, + ) + } + + item { + NuvioSurfaceCard { + Column(verticalArrangement = Arrangement.spacedBy(6.dp)) { Text( - text = stringResource(Res.string.collections_editor_select_catalogs), - style = MaterialTheme.typography.titleLarge, - fontWeight = FontWeight.Bold, - color = MaterialTheme.colorScheme.onSurface, + text = stringResource(Res.string.collections_editor_select_catalogs_description), + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant, ) - TextButton(onClick = onDismiss) { - Text(stringResource(Res.string.collections_editor_done)) + Text( + text = "${selectedSources.size} selected", + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.SemiBold, + color = MaterialTheme.colorScheme.primary, + ) + } + } + } + + val grouped = availableCatalogs.groupBy { it.addonName } + grouped.forEach { (addonName, catalogs) -> + item { + val selectedCount = catalogs.count { catalog -> + selectedSources.any { + it.addonId == catalog.addonId && + it.type == catalog.type && + it.catalogId == catalog.catalogId } } - Text( - text = stringResource(Res.string.collections_editor_select_catalogs_description), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(bottom = 8.dp), + PickerPanel( + title = addonName, + subtitle = if (selectedCount > 0) "$selectedCount selected" else "${catalogs.size} catalogs", + ) { + catalogs.forEachIndexed { index, catalog -> + val isSelected = selectedSources.any { + it.addonId == catalog.addonId && + it.type == catalog.type && + it.catalogId == catalog.catalogId + } + PickerOptionRow( + title = catalog.catalogName, + subtitle = catalog.type.replaceFirstChar { + if (it.isLowerCase()) it.titlecase() else it.toString() + }, + selected = isSelected, + onClick = { onToggle(catalog) }, + ) + if (index != catalogs.lastIndex) { + HorizontalDivider(color = MaterialTheme.colorScheme.outlineVariant.copy(alpha = 0.35f)) + } + } + } + } + } + + item { + Spacer(modifier = Modifier.height(24.dp + nuvioSafeBottomPadding())) + } + } +} + +@OptIn(ExperimentalLayoutApi::class) +@Composable +private fun TmdbSourcePickerScreen( + state: CollectionEditorUiState, + onBack: () -> Unit, +) { + val bottomInset = nuvioSafeBottomPadding() + val sourceType = when (state.tmdbBuilderMode) { + TmdbBuilderMode.PRESETS -> TmdbCollectionSourceType.DISCOVER + TmdbBuilderMode.LIST -> TmdbCollectionSourceType.LIST + TmdbBuilderMode.COLLECTION -> TmdbCollectionSourceType.COLLECTION + TmdbBuilderMode.PRODUCTION -> TmdbCollectionSourceType.COMPANY + TmdbBuilderMode.NETWORK -> TmdbCollectionSourceType.NETWORK + TmdbBuilderMode.DISCOVER -> TmdbCollectionSourceType.DISCOVER + } + val requiresId = sourceType != TmdbCollectionSourceType.DISCOVER + + PlatformBackHandler(enabled = true) { + onBack() + } + + Box(modifier = Modifier.fillMaxSize()) { + NuvioScreen(modifier = Modifier.fillMaxSize()) { + stickyHeader { + NuvioScreenHeader( + title = "TMDB Sources", + onBack = onBack, ) } - val grouped = availableCatalogs.groupBy { it.addonName } - grouped.forEach { (addonName, catalogs) -> - item { - NuvioSectionLabel( - text = addonName.uppercase(), - modifier = Modifier.padding(top = 8.dp, bottom = 4.dp), - ) - } - catalogs.forEach { catalog -> - val isSelected = selectedSources.any { - it.addonId == catalog.addonId && it.type == catalog.type && it.catalogId == catalog.catalogId - } - item(key = "${catalog.addonId}:${catalog.type}:${catalog.catalogId}") { - val bgColor = if (isSelected) { - MaterialTheme.colorScheme.primary.copy(alpha = 0.12f) - } else { - MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.3f) - } - val borderColor = if (isSelected) { - MaterialTheme.colorScheme.primary.copy(alpha = 0.5f) - } else { - MaterialTheme.colorScheme.outlineVariant.copy(alpha = 0.3f) - } - Row( - modifier = Modifier - .fillMaxWidth() - .clip(RoundedCornerShape(10.dp)) - .background(bgColor) - .border(1.dp, borderColor, RoundedCornerShape(10.dp)) - .clickable { onToggle(catalog) } - .padding(horizontal = 14.dp, vertical = 12.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, - ) { - Column(modifier = Modifier.weight(1f)) { - Text( - text = catalog.catalogName, - style = MaterialTheme.typography.bodyLarge, - fontWeight = FontWeight.Medium, - color = MaterialTheme.colorScheme.onSurface, - ) - Text( - text = catalog.type.replaceFirstChar { - if (it.isLowerCase()) it.titlecase() else it.toString() - }, - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - ) - } - if (isSelected) { - Icon( - imageVector = Icons.Rounded.Check, - contentDescription = stringResource(Res.string.cd_selected), - tint = MaterialTheme.colorScheme.primary, - modifier = Modifier.size(20.dp), - ) - } - } + item { + FlowRow( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + TmdbBuilderMode.entries.forEach { mode -> + FilterChip( + selected = state.tmdbBuilderMode == mode, + onClick = { CollectionEditorRepository.setTmdbBuilderMode(mode) }, + label = { Text(tmdbBuilderModeLabel(mode)) }, + leadingIcon = if (state.tmdbBuilderMode == mode) { + { + Icon( + imageVector = Icons.Rounded.Check, + contentDescription = null, + modifier = Modifier.size(18.dp), + ) + } + } else null, + ) } } } item { - Spacer(modifier = Modifier.height(24.dp)) + NuvioSurfaceCard { + Text( + text = tmdbModeHelpText(state.tmdbBuilderMode), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } + + if (state.tmdbBuilderMode != TmdbBuilderMode.PRESETS) item { + NuvioSurfaceCard { + Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { + if (requiresId) { + TmdbLabeledField( + label = tmdbInputLabel(state.tmdbBuilderMode), + value = state.tmdbInput, + onValueChange = { CollectionEditorRepository.setTmdbInput(it) }, + placeholder = tmdbInputPlaceholder(state.tmdbBuilderMode), + helper = tmdbInputHelper(state.tmdbBuilderMode), + ) + } + TmdbLabeledField( + label = "Display title", + value = state.tmdbTitleInput, + onValueChange = { CollectionEditorRepository.setTmdbTitleInput(it) }, + placeholder = tmdbTitlePlaceholder(state.tmdbBuilderMode), + helper = "Shown as the row/tab name. If blank, Nuvio creates one from the source.", + ) + if (state.tmdbSearchError != null) { + Text( + text = state.tmdbSearchError, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.error, + ) + } + } + } + } + + if (state.tmdbBuilderMode == TmdbBuilderMode.PRODUCTION && state.tmdbCompanyResults.isNotEmpty()) { + item { + PickerSectionLabel("Search Results") + } + itemsIndexed(state.tmdbCompanyResults) { _, result -> + val title = result.name ?: "TMDB Company ${result.id}" + PickerOptionRow( + title = title, + subtitle = listOfNotNull("Production", result.originCountry).joinToString(" • "), + selected = false, + onClick = { + val sources = tmdbSelectedMediaTypes(state).map { mediaType -> + CollectionSource( + provider = "tmdb", + tmdbSourceType = TmdbCollectionSourceType.COMPANY.name, + title = tmdbTitleForMedia(title, mediaType, state.tmdbMediaBoth), + tmdbId = result.id, + mediaType = mediaType.name, + sortBy = state.tmdbSortBy, + filters = state.tmdbFilters, + ) + } + CollectionEditorRepository.addTmdbSourcesFromPicker(sources) + }, + ) + } + } + + if (state.tmdbBuilderMode == TmdbBuilderMode.COLLECTION && state.tmdbCollectionResults.isNotEmpty()) { + item { + PickerSectionLabel("Search Results") + } + itemsIndexed(state.tmdbCollectionResults) { _, result -> + val title = result.name ?: "TMDB Collection ${result.id}" + PickerOptionRow( + title = title, + subtitle = "TMDB Movie Collection", + selected = false, + onClick = { + CollectionEditorRepository.addTmdbSource( + CollectionSource( + provider = "tmdb", + tmdbSourceType = TmdbCollectionSourceType.COLLECTION.name, + title = title, + tmdbId = result.id, + mediaType = TmdbCollectionMediaType.MOVIE.name, + sortBy = state.tmdbSortBy, + ), + ) + }, + ) + } + } + + if (sourceType == TmdbCollectionSourceType.COMPANY || sourceType == TmdbCollectionSourceType.DISCOVER) { + item { + PickerPanel( + title = "Media", + subtitle = "Create one source or split it into movie and series feeds.", + ) { + FlowRow( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + FilterChip( + selected = state.tmdbMediaType == TmdbCollectionMediaType.MOVIE && !state.tmdbMediaBoth, + onClick = { + CollectionEditorRepository.setTmdbMediaBoth(false) + CollectionEditorRepository.setTmdbMediaType(TmdbCollectionMediaType.MOVIE) + }, + label = { Text("Movies") }, + ) + FilterChip( + selected = state.tmdbMediaType == TmdbCollectionMediaType.TV && !state.tmdbMediaBoth, + onClick = { + CollectionEditorRepository.setTmdbMediaBoth(false) + CollectionEditorRepository.setTmdbMediaType(TmdbCollectionMediaType.TV) + }, + label = { Text("Series") }, + ) + FilterChip( + selected = state.tmdbMediaBoth, + onClick = { CollectionEditorRepository.setTmdbMediaBoth(true) }, + label = { Text("Both") }, + ) + } + } + } + } + + if (sourceType == TmdbCollectionSourceType.COMPANY || + sourceType == TmdbCollectionSourceType.NETWORK || + sourceType == TmdbCollectionSourceType.DISCOVER + ) { + item { + PickerPanel( + title = "Sort", + subtitle = "Controls the default order TMDB returns.", + ) { + FlowRow( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + val sorts = listOf( + TmdbCollectionSort.POPULAR_DESC, + TmdbCollectionSort.VOTE_AVERAGE_DESC, + if (state.tmdbMediaType == TmdbCollectionMediaType.TV && !state.tmdbMediaBoth) { + TmdbCollectionSort.FIRST_AIR_DATE_DESC + } else { + TmdbCollectionSort.RELEASE_DATE_DESC + }, + ) + sorts.forEach { sort -> + FilterChip( + selected = state.tmdbSortBy == sort.value, + onClick = { CollectionEditorRepository.setTmdbSortBy(sort.value) }, + label = { Text(tmdbSortLabel(sort)) }, + ) + } + } + } + } + + item { + PickerPanel( + title = "Filters", + subtitle = "Combine TMDB IDs and date/rating constraints for exact feeds.", + ) { + Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { + TmdbQuickChips( + label = "Quick genres", + chips = tmdbGenreQuickChips(state.tmdbMediaType), + onSelect = { value -> + CollectionEditorRepository.updateTmdbFilters { it.copy(withGenres = value) } + }, + ) + TmdbFilterField( + value = state.tmdbFilters.withGenres.orEmpty(), + placeholder = "Genre IDs, comma-separated", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(withGenres = value.ifBlank { null }) + } + }, + ) + TmdbFilterField( + value = state.tmdbFilters.year?.toString().orEmpty(), + placeholder = "Year", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(year = value.toIntOrNull()) + } + }, + ) + TmdbFilterField( + value = state.tmdbFilters.releaseDateGte.orEmpty(), + placeholder = "Release from YYYY-MM-DD", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(releaseDateGte = value.ifBlank { null }) + } + }, + ) + TmdbFilterField( + value = state.tmdbFilters.releaseDateLte.orEmpty(), + placeholder = "Release until YYYY-MM-DD", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(releaseDateLte = value.ifBlank { null }) + } + }, + ) + TmdbFilterField( + value = state.tmdbFilters.voteAverageGte?.toString().orEmpty(), + placeholder = "Minimum rating", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(voteAverageGte = value.toDoubleOrNull()) + } + }, + ) + TmdbFilterField( + value = state.tmdbFilters.voteCountGte?.toString().orEmpty(), + placeholder = "Minimum vote count", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(voteCountGte = value.toIntOrNull()) + } + }, + ) + TmdbFilterField( + value = state.tmdbFilters.voteAverageLte?.toString().orEmpty(), + placeholder = "Maximum rating", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(voteAverageLte = value.toDoubleOrNull()) + } + }, + ) + TmdbQuickChips( + label = "Quick languages", + chips = listOf("English" to "en", "Korean" to "ko", "Japanese" to "ja", "Hindi" to "hi", "Spanish" to "es"), + onSelect = { value -> + CollectionEditorRepository.updateTmdbFilters { it.copy(withOriginalLanguage = value) } + }, + ) + TmdbFilterField( + value = state.tmdbFilters.withOriginalLanguage.orEmpty(), + placeholder = "Original language, e.g. en", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(withOriginalLanguage = value.ifBlank { null }) + } + }, + ) + TmdbQuickChips( + label = "Quick countries", + chips = listOf("United States" to "US", "Korea" to "KR", "Japan" to "JP", "India" to "IN", "United Kingdom" to "GB"), + onSelect = { value -> + CollectionEditorRepository.updateTmdbFilters { it.copy(withOriginCountry = value) } + }, + ) + TmdbFilterField( + value = state.tmdbFilters.withOriginCountry.orEmpty(), + placeholder = "Origin country, e.g. US", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(withOriginCountry = value.ifBlank { null }) + } + }, + ) + TmdbQuickChips( + label = "Quick keywords", + chips = listOf("Superhero" to "9715", "Based on Novel" to "818", "Time Travel" to "4379", "Space" to "9882"), + onSelect = { value -> + CollectionEditorRepository.updateTmdbFilters { it.copy(withKeywords = value) } + }, + ) + TmdbFilterField( + value = state.tmdbFilters.withKeywords.orEmpty(), + placeholder = "Keyword IDs", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(withKeywords = value.ifBlank { null }) + } + }, + ) + TmdbQuickChips( + label = "Quick companies", + chips = listOf("Marvel" to "420", "Disney" to "2", "Pixar" to "3", "Lucasfilm" to "1", "Warner Bros." to "174"), + onSelect = { value -> + CollectionEditorRepository.updateTmdbFilters { it.copy(withCompanies = value) } + }, + ) + TmdbFilterField( + value = state.tmdbFilters.withCompanies.orEmpty(), + placeholder = "Company IDs, e.g. 420", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(withCompanies = value.ifBlank { null }) + } + }, + ) + TmdbQuickChips( + label = "Quick networks", + chips = listOf("Netflix" to "213", "HBO" to "49", "Disney+" to "2739", "Prime Video" to "1024", "Hulu" to "453"), + onSelect = { value -> + CollectionEditorRepository.updateTmdbFilters { it.copy(withNetworks = value) } + }, + ) + TmdbFilterField( + value = state.tmdbFilters.withNetworks.orEmpty(), + placeholder = "Network IDs, e.g. 213", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(withNetworks = value.ifBlank { null }) + } + }, + ) + } + } + } + } + + if (state.tmdbBuilderMode == TmdbBuilderMode.PRESETS) item { + PickerSectionLabel("Presets") + } + if (state.tmdbBuilderMode == TmdbBuilderMode.PRESETS) { + itemsIndexed(TmdbCollectionSourceResolver.presets()) { _, preset -> + PickerOptionRow( + title = preset.label, + subtitle = tmdbSourceSubtitle(preset.source), + selected = false, + onClick = { CollectionEditorRepository.addTmdbPreset(preset.source) }, + ) + } + } + + item { + val spacerHeight = if (state.tmdbBuilderMode == TmdbBuilderMode.PRESETS) { + 24.dp + bottomInset + } else { + 96.dp + bottomInset + } + Spacer(modifier = Modifier.height(spacerHeight)) + } + } + + if (state.tmdbBuilderMode != TmdbBuilderMode.PRESETS) { + Surface( + modifier = Modifier + .align(Alignment.BottomCenter) + .fillMaxWidth(), + color = MaterialTheme.colorScheme.background.copy(alpha = 0.96f), + tonalElevation = 6.dp, + shadowElevation = 10.dp, + ) { + PickerActionBar( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 12.dp) + .padding(bottom = bottomInset), + ) { + if (sourceType == TmdbCollectionSourceType.COMPANY || sourceType == TmdbCollectionSourceType.COLLECTION) { + TextButton( + onClick = { + if (sourceType == TmdbCollectionSourceType.COMPANY) { + CollectionEditorRepository.searchTmdbCompanies() + } else { + CollectionEditorRepository.searchTmdbCollections() + } + }, + ) { + Icon( + imageVector = Icons.Rounded.Search, + contentDescription = null, + modifier = Modifier.size(18.dp), + ) + Spacer(modifier = Modifier.width(4.dp)) + Text("Search") + } + } + NuvioPrimaryButton( + text = "Add TMDB source", + modifier = Modifier.weight(1f), + enabled = !requiresId || state.tmdbInput.isNotBlank(), + onClick = { CollectionEditorRepository.addTmdbSourceFromInput() }, + ) + } } } } } +@Composable +private fun PickerPanel( + title: String, + subtitle: String? = null, + content: @Composable ColumnScope.() -> Unit, +) { + NuvioSurfaceCard { + Column( + verticalArrangement = Arrangement.spacedBy(12.dp), + ) { + Column(verticalArrangement = Arrangement.spacedBy(3.dp)) { + Text( + text = title, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + color = MaterialTheme.colorScheme.onSurface, + ) + if (!subtitle.isNullOrBlank()) { + Text( + text = subtitle, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } + content() + } + } +} + +@Composable +private fun PickerOptionRow( + title: String, + subtitle: String? = null, + selected: Boolean, + onClick: () -> Unit, +) { + val rowShape = RoundedCornerShape(12.dp) + val bgColor = if (selected) { + MaterialTheme.colorScheme.primary.copy(alpha = 0.14f) + } else { + MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.4f) + } + Row( + modifier = Modifier + .fillMaxWidth() + .clip(rowShape) + .background(bgColor) + .clickable(onClick = onClick) + .padding(horizontal = 14.dp, vertical = 12.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + ) { + Column( + modifier = Modifier.weight(1f).padding(end = 12.dp), + verticalArrangement = Arrangement.spacedBy(2.dp), + ) { + Text( + text = title, + style = MaterialTheme.typography.bodyLarge, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colorScheme.onSurface, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + if (!subtitle.isNullOrBlank()) { + Text( + text = subtitle, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + } + if (selected) { + Icon( + imageVector = Icons.Rounded.Check, + contentDescription = stringResource(Res.string.cd_selected), + tint = MaterialTheme.colorScheme.primary, + modifier = Modifier.size(20.dp), + ) + } + } +} + +@Composable +private fun PickerSectionLabel(text: String) { + NuvioSectionLabel( + text = text.uppercase(), + modifier = Modifier.padding(top = 4.dp, bottom = 2.dp), + ) +} + +@Composable +private fun PickerActionBar( + modifier: Modifier = Modifier, + content: @Composable RowScope.() -> Unit, +) { + Row( + modifier = modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(10.dp), + verticalAlignment = Alignment.CenterVertically, + content = content, + ) +} + +@Composable +private fun TmdbLabeledField( + label: String, + value: String, + onValueChange: (String) -> Unit, + placeholder: String, + helper: String, +) { + Column(verticalArrangement = Arrangement.spacedBy(6.dp)) { + Text( + text = label, + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colorScheme.onSurface, + ) + NuvioInputField( + value = value, + onValueChange = onValueChange, + placeholder = placeholder, + ) + if (helper.isNotBlank()) { + Text( + text = helper, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } +} + +@Composable +private fun TmdbFilterField( + label: String, + helper: String, + value: String, + placeholder: String, + onValueChange: (String) -> Unit, +) { + TmdbLabeledField( + label = label, + value = value, + onValueChange = onValueChange, + placeholder = placeholder, + helper = helper, + ) +} + +@Composable +private fun TmdbQuickChips( + label: String, + chips: List>, + onSelect: (String) -> Unit, +) { + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + Text( + text = label, + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + FlowRow( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + chips.forEach { (chipLabel, value) -> + FilterChip( + selected = false, + onClick = { onSelect(value) }, + label = { Text(chipLabel) }, + ) + } + } + } +} + +private fun tmdbGenreQuickChips(mediaType: TmdbCollectionMediaType): List> = + when (mediaType) { + TmdbCollectionMediaType.MOVIE -> listOf( + "Action" to "28", + "Adventure" to "12", + "Animation" to "16", + "Comedy" to "35", + "Horror" to "27", + "Sci-Fi" to "878", + ) + TmdbCollectionMediaType.TV -> listOf( + "Drama" to "18", + "Comedy" to "35", + "Animation" to "16", + "Crime" to "80", + "Sci-Fi" to "10765", + "Reality" to "10764", + ) + } + +private fun tmdbSelectedMediaTypes(state: CollectionEditorUiState): List = + if (state.tmdbMediaBoth) { + listOf(TmdbCollectionMediaType.MOVIE, TmdbCollectionMediaType.TV) + } else { + listOf(state.tmdbMediaType) + } + +private fun tmdbTitleForMedia( + title: String, + mediaType: TmdbCollectionMediaType, + addSuffix: Boolean, +): String { + if (!addSuffix) return title + val suffix = when (mediaType) { + TmdbCollectionMediaType.MOVIE -> "Movies" + TmdbCollectionMediaType.TV -> "Series" + } + return "$title $suffix" +} + @OptIn(ExperimentalMaterial3Api::class) @Composable private fun GenrePickerSheet( @@ -997,6 +1677,51 @@ private fun FolderEditorToggleRow( } } +@Composable +private fun FolderTmdbSourceCard( + source: CollectionSource, + onRemove: () -> Unit, +) { + NuvioSurfaceCard { + Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { + Row(verticalAlignment = Alignment.CenterVertically) { + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text( + text = source.title?.takeIf { it.isNotBlank() } ?: "TMDB", + style = MaterialTheme.typography.bodyLarge, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colorScheme.onSurface, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + Text( + text = "TMDB", + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + IconButton( + onClick = onRemove, + modifier = Modifier.size(36.dp), + ) { + Icon( + imageVector = Icons.Rounded.Close, + contentDescription = stringResource(Res.string.action_remove), + modifier = Modifier.size(20.dp), + tint = MaterialTheme.colorScheme.error, + ) + } + } + + Text( + text = tmdbSourceSubtitle(source), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } +} + @OptIn(ExperimentalLayoutApi::class) @Composable private fun FolderCatalogSourceCard( @@ -1091,6 +1816,44 @@ private fun FolderCatalogSourceCard( } } +private fun tmdbBuilderModeLabel(mode: TmdbBuilderMode): String = + when (mode) { + TmdbBuilderMode.PRESETS -> "Presets" + TmdbBuilderMode.LIST -> "List" + TmdbBuilderMode.COLLECTION -> "Collection" + TmdbBuilderMode.PRODUCTION -> "Production" + TmdbBuilderMode.NETWORK -> "Network" + TmdbBuilderMode.DISCOVER -> "Discover" + } + +private fun tmdbSortLabel(sort: TmdbCollectionSort): String = + when (sort) { + TmdbCollectionSort.POPULAR_DESC -> "Popular" + TmdbCollectionSort.VOTE_AVERAGE_DESC -> "Top rated" + TmdbCollectionSort.RELEASE_DATE_DESC -> "Newest movies" + TmdbCollectionSort.FIRST_AIR_DATE_DESC -> "Newest series" + } + +private fun tmdbSourceSubtitle(source: CollectionSource): String { + val media = when (TmdbCollectionMediaType.fromString(source.mediaType)) { + TmdbCollectionMediaType.MOVIE -> "Movies" + TmdbCollectionMediaType.TV -> "Series" + } + val sort = source.sortBy?.let { value -> + TmdbCollectionSort.entries.firstOrNull { it.value == value }?.let(::tmdbSortLabel) + } ?: "Popular" + val sourceType = runCatching { + TmdbCollectionSourceType.valueOf(source.tmdbSourceType.orEmpty()) + }.getOrDefault(TmdbCollectionSourceType.DISCOVER) + return when (sourceType) { + TmdbCollectionSourceType.LIST -> "TMDB List" + TmdbCollectionSourceType.COLLECTION -> "TMDB Movie Collection" + TmdbCollectionSourceType.COMPANY -> listOf("Production", media, sort).joinToString(" • ") + TmdbCollectionSourceType.NETWORK -> listOf("Network", "Series", sort).joinToString(" • ") + TmdbCollectionSourceType.DISCOVER -> listOf("TMDB Discover", media, sort).joinToString(" • ") + } +} + @Composable private fun posterShapeLabel(shape: PosterShape): String = when (shape) { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionJsonPreserver.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionJsonPreserver.kt index f7da122a..660e8a45 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionJsonPreserver.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionJsonPreserver.kt @@ -57,9 +57,22 @@ internal object CollectionJsonPreserver { folder: CollectionFolder, ): JsonObject { val encoded = json.encodeToJsonElement(CollectionFolder.serializer(), folder).jsonObject + val rawUnifiedSourcesByKey = raw?.get("sources").asObjectArrayByKey(::unifiedSourceKey) + val mergedUnifiedSources = buildJsonArray { + folder.resolvedSources.forEach { source -> + val sourceElement = json.encodeToJsonElement(CollectionSource.serializer(), source) + add( + mergeUnifiedSource( + json = json, + raw = rawUnifiedSourcesByKey[unifiedSourceKey(sourceElement)], + source = source, + ), + ) + } + } val rawSourcesByKey = raw?.get("catalogSources").asObjectArrayByKey(::sourceKey) val mergedSources = buildJsonArray { - folder.catalogSources.forEach { source -> + folder.resolvedCatalogSources.forEach { source -> val sourceElement = json.encodeToJsonElement(CollectionCatalogSource.serializer(), source) add( @@ -71,7 +84,23 @@ internal object CollectionJsonPreserver { ) } } - return mergeObjects(raw, encoded, mapOf("catalogSources" to mergedSources)) + return mergeObjects( + raw, + encoded, + mapOf( + "sources" to mergedUnifiedSources, + "catalogSources" to mergedSources, + ), + ) + } + + private fun mergeUnifiedSource( + json: Json, + raw: JsonObject?, + source: CollectionSource, + ): JsonObject { + val encoded = json.encodeToJsonElement(CollectionSource.serializer(), source).jsonObject + return mergeObjects(raw, encoded) } private fun mergeSource( @@ -111,4 +140,21 @@ internal object CollectionJsonPreserver { val catalogId = obj["catalogId"]?.jsonPrimitive?.contentOrNull ?: return null return "$addonId|$type|$catalogId" } + + private fun unifiedSourceKey(element: JsonElement): String? { + val obj = element as? JsonObject ?: return null + val provider = obj["provider"]?.jsonPrimitive?.contentOrNull ?: "addon" + return if (provider.equals("tmdb", ignoreCase = true)) { + val sourceType = obj["tmdbSourceType"]?.jsonPrimitive?.contentOrNull ?: return null + val tmdbId = obj["tmdbId"]?.jsonPrimitive?.contentOrNull.orEmpty() + val mediaType = obj["mediaType"]?.jsonPrimitive?.contentOrNull.orEmpty() + val sortBy = obj["sortBy"]?.jsonPrimitive?.contentOrNull.orEmpty() + "$provider|$sourceType|$tmdbId|$mediaType|$sortBy" + } else { + val addonId = obj["addonId"]?.jsonPrimitive?.contentOrNull ?: return null + val type = obj["type"]?.jsonPrimitive?.contentOrNull ?: return null + val catalogId = obj["catalogId"]?.jsonPrimitive?.contentOrNull ?: return null + "$provider|$addonId|$type|$catalogId" + } + } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt index fc1aacef..5d17161b 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt @@ -30,6 +30,95 @@ data class CollectionCatalogSource( val genre: String? = null, ) +@Immutable +@Serializable +data class CollectionSource( + val provider: String = "addon", + val addonId: String? = null, + val type: String? = null, + val catalogId: String? = null, + val genre: String? = null, + val tmdbSourceType: String? = null, + val title: String? = null, + val tmdbId: Int? = null, + val mediaType: String? = null, + val sortBy: String? = null, + val filters: TmdbCollectionFilters? = null, +) { + val isTmdb: Boolean + get() = provider.equals("tmdb", ignoreCase = true) + + fun addonCatalogSource(): CollectionCatalogSource? { + if (isTmdb) return null + val sourceAddonId = addonId?.takeIf { it.isNotBlank() } ?: return null + val sourceType = type?.takeIf { it.isNotBlank() } ?: return null + val sourceCatalogId = catalogId?.takeIf { it.isNotBlank() } ?: return null + return CollectionCatalogSource( + addonId = sourceAddonId, + type = sourceType, + catalogId = sourceCatalogId, + genre = genre, + ) + } +} + +@Serializable +enum class TmdbCollectionSourceType { + LIST, + COLLECTION, + COMPANY, + NETWORK, + DISCOVER, +} + +@Serializable +enum class TmdbCollectionMediaType(val value: String) { + MOVIE("movie"), + TV("tv"); + + companion object { + fun fromString(value: String?): TmdbCollectionMediaType = + when (value?.trim()?.lowercase()) { + "tv", "series" -> TV + else -> MOVIE + } + } +} + +enum class TmdbCollectionSort(val value: String) { + POPULAR_DESC("popularity.desc"), + VOTE_AVERAGE_DESC("vote_average.desc"), + RELEASE_DATE_DESC("primary_release_date.desc"), + FIRST_AIR_DATE_DESC("first_air_date.desc"), +} + +@Immutable +@Serializable +data class TmdbCollectionFilters( + val withGenres: String? = null, + val releaseDateGte: String? = null, + val releaseDateLte: String? = null, + val voteAverageGte: Double? = null, + val voteAverageLte: Double? = null, + val voteCountGte: Int? = null, + val withOriginalLanguage: String? = null, + val withOriginCountry: String? = null, + val withKeywords: String? = null, + val withCompanies: String? = null, + val withNetworks: String? = null, + val year: Int? = null, +) + +data class TmdbSourceImportMetadata( + val title: String? = null, + val coverImageUrl: String? = null, +) + +data class TmdbPresetSource( + val label: String, + val source: CollectionSource, +) + @Immutable @Serializable data class CollectionFolder( @@ -41,7 +130,10 @@ data class CollectionFolder( val coverEmoji: String? = null, val tileShape: String = "poster", val hideTitle: Boolean = false, + val sources: List = emptyList(), val catalogSources: List = emptyList(), + val heroBackdropUrl: String? = null, + val titleLogoUrl: String? = null, ) { val posterShape: PosterShape get() = when (tileShape.lowercase()) { @@ -50,6 +142,22 @@ data class CollectionFolder( "square" -> PosterShape.Square else -> PosterShape.Poster } + + val resolvedSources: List + get() = sources.ifEmpty { + catalogSources.map { source -> + CollectionSource( + provider = "addon", + addonId = source.addonId, + type = source.type, + catalogId = source.catalogId, + genre = source.genre, + ) + } + } + + val resolvedCatalogSources: List + get() = resolvedSources.mapNotNull { it.addonCatalogSource() } } @Immutable diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt index 860f97d5..9d57d011 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt @@ -179,8 +179,12 @@ object CollectionRepository { }, ) } - f.catalogSources.forEachIndexed { si, s -> - if (s.addonId.isBlank() || s.type.isBlank() || s.catalogId.isBlank()) { + f.resolvedSources.forEachIndexed { si, s -> + val invalidAddon = !s.isTmdb && + (s.addonId.isNullOrBlank() || s.type.isNullOrBlank() || s.catalogId.isNullOrBlank()) + val invalidTmdb = s.isTmdb && + s.tmdbSourceType.isNullOrBlank() + if (invalidAddon || invalidTmdb) { return ValidationResult( valid = false, error = runBlocking { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt index b7a4b096..e853eeba 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt @@ -27,6 +27,7 @@ import org.jetbrains.compose.resources.getString data class FolderTab( val label: String, val typeLabel: String = "", + val source: CollectionSource? = null, val manifestUrl: String? = null, val type: String = "", val catalogId: String = "", @@ -114,7 +115,8 @@ object FolderDetailRepository { return } - val showAll = collection.showAllTab && folder.catalogSources.size > 1 + val sources = folder.resolvedSources + val showAll = collection.showAllTab && sources.size > 1 val addons = AddonRepository.uiState.value.addons val tabs = buildList { @@ -127,26 +129,44 @@ object FolderDetailRepository { ), ) } - folder.catalogSources.forEach { source -> - val addon = addons.find { it.manifest?.id == source.addonId } - val catalog = addon?.manifest?.catalogs?.find { - it.id == source.catalogId && it.type == source.type + sources.forEach { source -> + if (source.isTmdb) { + val mediaType = TmdbCollectionMediaType.fromString(source.mediaType) + val type = if (mediaType == TmdbCollectionMediaType.TV) "series" else "movie" + add( + FolderTab( + label = source.title?.takeIf { it.isNotBlank() } ?: "TMDB", + typeLabel = "TMDB", + source = source, + type = type, + catalogId = tmdbCatalogId(source), + supportsPagination = source.tmdbSourceType != TmdbCollectionSourceType.COLLECTION.name, + isLoading = true, + ), + ) + } else { + val catalogSource = source.addonCatalogSource() ?: return@forEach + val addon = addons.find { it.manifest?.id == catalogSource.addonId } + val catalog = addon?.manifest?.catalogs?.find { + it.id == catalogSource.catalogId && it.type == catalogSource.type + } + val label = catalog?.name ?: catalogSource.catalogId + val typeLabel = localizedMediaTypeLabel(catalogSource.type) + val genreSuffix = if (catalogSource.genre != null) " · ${catalogSource.genre}" else "" + add( + FolderTab( + label = "$label ($typeLabel)$genreSuffix", + typeLabel = typeLabel, + source = source, + manifestUrl = addon?.manifestUrl, + type = catalogSource.type, + catalogId = catalogSource.catalogId, + genre = catalogSource.genre, + supportsPagination = catalog?.supportsPagination() == true, + isLoading = true, + ), + ) } - val label = catalog?.name ?: source.catalogId - val typeLabel = localizedMediaTypeLabel(source.type) - val genreSuffix = if (source.genre != null) " · ${source.genre}" else "" - add( - FolderTab( - label = "$label ($typeLabel)$genreSuffix", - typeLabel = typeLabel, - manifestUrl = addon?.manifestUrl, - type = source.type, - catalogId = source.catalogId, - genre = source.genre, - supportsPagination = catalog?.supportsPagination() == true, - isLoading = true, - ), - ) } } @@ -161,15 +181,16 @@ object FolderDetailRepository { ) // Load catalog data for each source - folder.catalogSources.forEachIndexed { sourceIndex, source -> + sources.forEachIndexed { sourceIndex, source -> val tabIndex = if (showAll) sourceIndex + 1 else sourceIndex - val addon = addons.find { it.manifest?.id == source.addonId } - if (addon == null) { + val catalogSource = source.addonCatalogSource() + val addon = catalogSource?.let { value -> addons.find { it.manifest?.id == value.addonId } } + if (!source.isTmdb && addon == null) { updateTab(tabIndex) { it.copy( isLoading = false, error = runBlocking { - getString(Res.string.collections_folder_addon_not_found, source.addonId) + getString(Res.string.collections_folder_addon_not_found, catalogSource?.addonId.orEmpty()) }, ) } @@ -180,7 +201,7 @@ object FolderDetailRepository { } // If no sources, mark as done - if (folder.catalogSources.isEmpty()) { + if (sources.isEmpty()) { _uiState.value = _uiState.value.copy(isLoading = false) } } @@ -229,8 +250,8 @@ object FolderDetailRepository { private fun loadTabPage(index: Int, reset: Boolean) { val currentTab = _uiState.value.tabs.getOrNull(index) ?: return - val manifestUrl = currentTab.manifestUrl ?: return val requestedSkip = if (reset) 0 else currentTab.nextSkip ?: return + if (!currentTab.source?.isTmdb.orFalse() && currentTab.manifestUrl == null) return updateTab(index) { tab -> if (reset) { @@ -252,13 +273,21 @@ object FolderDetailRepository { loadJobs.remove(index)?.cancel() val job = scope.launch { runCatching { - fetchCatalogPage( - manifestUrl = manifestUrl, - type = currentTab.type, - catalogId = currentTab.catalogId, - genre = currentTab.genre, - skip = requestedSkip.takeIf { it > 0 }, - ) + val source = currentTab.source + if (source?.isTmdb == true) { + TmdbCollectionSourceResolver.resolve( + source = source, + page = if (reset) 1 else requestedSkip, + ) + } else { + fetchCatalogPage( + manifestUrl = requireNotNull(currentTab.manifestUrl), + type = currentTab.type, + catalogId = currentTab.catalogId, + genre = currentTab.genre, + skip = requestedSkip.takeIf { it > 0 }, + ) + } }.onSuccess { page -> updateTab(index) { tab -> val mergedItems = if (reset) { @@ -279,7 +308,7 @@ object FolderDetailRepository { } rebuildAllTab() }.onFailure { error -> - log.e(error) { "Failed to load catalog ${currentTab.catalogId} from $manifestUrl" } + log.e(error) { "Failed to load source ${currentTab.catalogId}" } updateTab(index) { tab -> tab.copy( isLoading = false, @@ -353,3 +382,17 @@ object FolderDetailRepository { } } } + +private fun Boolean?.orFalse(): Boolean = this == true + +private fun tmdbCatalogId(source: CollectionSource): String = + buildString { + append("tmdb_") + append(source.tmdbSourceType?.lowercase().orEmpty()) + source.tmdbId?.let { + append("_") + append(it) + } + append("_") + append(source.mediaType?.lowercase().orEmpty()) + } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/TmdbCollectionSourceResolver.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/TmdbCollectionSourceResolver.kt new file mode 100644 index 00000000..ee25fa48 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/TmdbCollectionSourceResolver.kt @@ -0,0 +1,526 @@ +package com.nuvio.app.features.collection + +import co.touchlab.kermit.Logger +import com.nuvio.app.features.addons.httpGetText +import com.nuvio.app.features.catalog.CatalogPage +import com.nuvio.app.features.home.MetaPreview +import com.nuvio.app.features.home.PosterShape +import com.nuvio.app.features.tmdb.TmdbSettingsRepository +import com.nuvio.app.features.tmdb.buildTmdbUrl +import com.nuvio.app.features.tmdb.normalizeTmdbLanguage +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import kotlin.math.roundToInt + +object TmdbCollectionSourceResolver { + private val log = Logger.withTag("TmdbCollectionSource") + private val json = Json { ignoreUnknownKeys = true } + + suspend fun resolve(source: CollectionSource, page: Int = 1): CatalogPage = withContext(Dispatchers.Default) { + val settings = TmdbSettingsRepository.snapshot() + val apiKey = settings.apiKey.trim().takeIf { it.isNotBlank() } + ?: error("Add a TMDB API key in Settings to use TMDB sources.") + val language = normalizeTmdbLanguage(settings.language) + val sourceType = source.tmdbType() + + when (sourceType) { + TmdbCollectionSourceType.LIST -> resolveList(source, apiKey, language, page) + TmdbCollectionSourceType.COLLECTION -> resolveCollection(source, apiKey, language) + TmdbCollectionSourceType.COMPANY, + TmdbCollectionSourceType.NETWORK, + TmdbCollectionSourceType.DISCOVER -> resolveDiscover(source, apiKey, language, page) + } + } + + suspend fun importMetadata(sourceType: TmdbCollectionSourceType, id: Int): TmdbSourceImportMetadata = + withContext(Dispatchers.Default) { + val settings = TmdbSettingsRepository.snapshot() + val apiKey = settings.apiKey.trim().takeIf { it.isNotBlank() } + ?: error("Add a TMDB API key in Settings to use TMDB sources.") + val language = normalizeTmdbLanguage(settings.language) + when (sourceType) { + TmdbCollectionSourceType.LIST -> { + val body = fetch( + endpoint = "list/$id", + apiKey = apiKey, + query = mapOf("language" to language, "page" to "1"), + ) ?: error("TMDB list not found") + TmdbSourceImportMetadata(title = body.name?.takeIf { it.isNotBlank() }) + } + + TmdbCollectionSourceType.COLLECTION -> { + val body = fetch( + endpoint = "collection/$id", + apiKey = apiKey, + query = mapOf("language" to language), + ) ?: error("TMDB collection not found") + TmdbSourceImportMetadata( + title = body.name?.takeIf { it.isNotBlank() }, + coverImageUrl = imageUrl(body.posterPath, "w500") ?: imageUrl(body.backdropPath, "w1280"), + ) + } + + TmdbCollectionSourceType.COMPANY -> { + val body = fetch( + endpoint = "company/$id", + apiKey = apiKey, + ) ?: error("TMDB company not found") + TmdbSourceImportMetadata( + title = body.name?.takeIf { it.isNotBlank() }, + coverImageUrl = imageUrl(body.logoPath, "w500"), + ) + } + + TmdbCollectionSourceType.NETWORK -> { + val body = fetch( + endpoint = "network/$id", + apiKey = apiKey, + ) ?: error("TMDB network not found") + TmdbSourceImportMetadata( + title = body.name?.takeIf { it.isNotBlank() }, + coverImageUrl = imageUrl(body.logoPath, "w500"), + ) + } + + TmdbCollectionSourceType.DISCOVER -> TmdbSourceImportMetadata(title = "TMDB Discover") + } + } + + suspend fun searchCompanies(query: String): List = withContext(Dispatchers.Default) { + val trimmed = query.trim() + if (trimmed.isBlank()) return@withContext emptyList() + val settings = TmdbSettingsRepository.snapshot() + val apiKey = settings.apiKey.trim().takeIf { it.isNotBlank() } + ?: error("Add a TMDB API key in Settings to use TMDB sources.") + fetch( + endpoint = "search/company", + apiKey = apiKey, + query = mapOf("query" to trimmed), + )?.results.orEmpty() + } + + suspend fun searchCollections(query: String): List = withContext(Dispatchers.Default) { + val trimmed = query.trim() + if (trimmed.isBlank()) return@withContext emptyList() + val settings = TmdbSettingsRepository.snapshot() + val apiKey = settings.apiKey.trim().takeIf { it.isNotBlank() } + ?: error("Add a TMDB API key in Settings to use TMDB sources.") + val language = normalizeTmdbLanguage(settings.language) + fetch( + endpoint = "search/collection", + apiKey = apiKey, + query = mapOf("query" to trimmed, "language" to language), + )?.results.orEmpty() + } + + suspend fun searchKeywords(query: String): Map = withContext(Dispatchers.Default) { + val trimmed = query.trim() + if (trimmed.isBlank()) return@withContext emptyMap() + val settings = TmdbSettingsRepository.snapshot() + val apiKey = settings.apiKey.trim().takeIf { it.isNotBlank() } + ?: error("Add a TMDB API key in Settings to use TMDB sources.") + fetch( + endpoint = "search/keyword", + apiKey = apiKey, + query = mapOf("query" to trimmed), + )?.results.orEmpty() + .mapNotNull { result -> + val name = result.name?.takeIf { it.isNotBlank() } ?: return@mapNotNull null + result.id to name + } + .toMap() + } + + suspend fun genres(mediaType: TmdbCollectionMediaType): Map = withContext(Dispatchers.Default) { + val settings = TmdbSettingsRepository.snapshot() + val apiKey = settings.apiKey.trim().takeIf { it.isNotBlank() } + ?: error("Add a TMDB API key in Settings to use TMDB sources.") + val language = normalizeTmdbLanguage(settings.language) + val endpoint = when (mediaType) { + TmdbCollectionMediaType.MOVIE -> "genre/movie/list" + TmdbCollectionMediaType.TV -> "genre/tv/list" + } + fetch( + endpoint = endpoint, + apiKey = apiKey, + query = mapOf("language" to language), + )?.genres.orEmpty().associate { it.id to it.name } + } + + fun parseTmdbId(input: String): Int? { + val trimmed = input.trim() + trimmed.toIntOrNull()?.let { return it } + return Regex("""(?:list|collection|company|network)/(\d+)""") + .find(trimmed) + ?.groupValues + ?.getOrNull(1) + ?.toIntOrNull() + ?: Regex("""[?&]id=(\d+)""") + .find(trimmed) + ?.groupValues + ?.getOrNull(1) + ?.toIntOrNull() + } + + fun presets(): List = listOf( + TmdbPresetSource("Marvel Studios", company("Marvel Studios", 420)), + TmdbPresetSource("Walt Disney Pictures", company("Walt Disney Pictures", 2)), + TmdbPresetSource("Pixar", company("Pixar", 3)), + TmdbPresetSource("Lucasfilm", company("Lucasfilm", 1)), + TmdbPresetSource("Warner Bros.", company("Warner Bros.", 174)), + TmdbPresetSource("Netflix", network("Netflix", 213)), + TmdbPresetSource("HBO", network("HBO", 49)), + TmdbPresetSource("Disney+", network("Disney+", 2739)), + TmdbPresetSource("Prime Video", network("Prime Video", 1024)), + TmdbPresetSource("Hulu", network("Hulu", 453)), + TmdbPresetSource("Apple TV+", network("Apple TV+", 2552)), + ) + + private suspend fun resolveList( + source: CollectionSource, + apiKey: String, + language: String, + page: Int, + ): CatalogPage { + val id = source.tmdbId ?: error("Missing TMDB list ID") + val body = fetch( + endpoint = "list/$id", + apiKey = apiKey, + query = mapOf("language" to language, "page" to page.toString()), + ) ?: error("TMDB list not found") + val items = body.items.orEmpty() + .mapNotNull { it.toPreview() } + .distinctBy { "${it.type}:${it.id}" } + return CatalogPage( + items = items, + rawItemCount = items.size, + nextSkip = if ((body.page ?: page) < (body.totalPages ?: page) && items.isNotEmpty()) page + 1 else null, + ) + } + + private suspend fun resolveCollection( + source: CollectionSource, + apiKey: String, + language: String, + ): CatalogPage { + val id = source.tmdbId ?: error("Missing TMDB collection ID") + val body = fetch( + endpoint = "collection/$id", + apiKey = apiKey, + query = mapOf("language" to language), + ) ?: error("TMDB collection not found") + val items = body.parts.orEmpty() + .sortedBy { it.releaseDate ?: "9999" } + .mapNotNull { it.toPreview(TmdbCollectionMediaType.MOVIE) } + .distinctBy { it.id } + return CatalogPage(items = items, rawItemCount = items.size, nextSkip = null) + } + + private suspend fun resolveDiscover( + source: CollectionSource, + apiKey: String, + language: String, + page: Int, + ): CatalogPage { + val sourceType = source.tmdbType() + val mediaType = if (sourceType == TmdbCollectionSourceType.NETWORK) { + TmdbCollectionMediaType.TV + } else { + source.tmdbMediaType() + } + val filters = source.filters ?: TmdbCollectionFilters() + val query = buildDiscoverQuery( + source = source, + sourceType = sourceType, + mediaType = mediaType, + language = language, + page = page, + filters = filters, + ) + val endpoint = when (mediaType) { + TmdbCollectionMediaType.MOVIE -> "discover/movie" + TmdbCollectionMediaType.TV -> "discover/tv" + } + val body = fetch( + endpoint = endpoint, + apiKey = apiKey, + query = query, + ) ?: error("TMDB discover returned no data") + val items = body.results.orEmpty() + .mapNotNull { it.toPreview(mediaType) } + .distinctBy { it.id } + return CatalogPage( + items = items, + rawItemCount = items.size, + nextSkip = if ((body.page ?: page) < (body.totalPages ?: page) && items.isNotEmpty()) page + 1 else null, + ) + } + + private fun buildDiscoverQuery( + source: CollectionSource, + sourceType: TmdbCollectionSourceType, + mediaType: TmdbCollectionMediaType, + language: String, + page: Int, + filters: TmdbCollectionFilters, + ): Map { + val sortBy = when (mediaType) { + TmdbCollectionMediaType.MOVIE -> movieSort(source.sortBy) + TmdbCollectionMediaType.TV -> tvSort(source.sortBy) + } + return buildMap { + put("language", language) + put("page", page.toString()) + put("sort_by", sortBy) + val companyId = source.tmdbId?.toString().takeIf { sourceType == TmdbCollectionSourceType.COMPANY } + val networkId = source.tmdbId?.toString().takeIf { sourceType == TmdbCollectionSourceType.NETWORK } + putIfNotBlank("with_companies", companyId ?: filters.withCompanies) + putIfNotBlank("with_networks", networkId ?: filters.withNetworks) + putIfNotBlank("with_genres", filters.withGenres) + putIfNotBlank("vote_count.gte", filters.voteCountGte?.toString()) + putIfNotBlank("vote_average.gte", filters.voteAverageGte?.toString()) + putIfNotBlank("vote_average.lte", filters.voteAverageLte?.toString()) + putIfNotBlank("with_original_language", filters.withOriginalLanguage) + putIfNotBlank("with_origin_country", filters.withOriginCountry) + putIfNotBlank("with_keywords", filters.withKeywords) + putIfNotBlank("year", filters.year?.takeIf { mediaType == TmdbCollectionMediaType.MOVIE }?.toString()) + putIfNotBlank("first_air_date_year", filters.year?.takeIf { mediaType == TmdbCollectionMediaType.TV }?.toString()) + putIfNotBlank( + if (mediaType == TmdbCollectionMediaType.MOVIE) "primary_release_date.gte" else "first_air_date.gte", + filters.releaseDateGte, + ) + putIfNotBlank( + if (mediaType == TmdbCollectionMediaType.MOVIE) "primary_release_date.lte" else "first_air_date.lte", + filters.releaseDateLte, + ) + } + } + + private suspend inline fun fetch( + endpoint: String, + apiKey: String, + query: Map = emptyMap(), + ): T? { + val url = buildTmdbUrl(endpoint = endpoint, apiKey = apiKey, query = query) + return runCatching { + json.decodeFromString(httpGetText(url)) + }.onFailure { error -> + log.w(error) { "TMDB source request failed for $endpoint" } + }.getOrNull() + } + + private fun TmdbListItem.toPreview(): MetaPreview? { + val media = mediaType?.lowercase() + val contentType = if (media == "tv") TmdbCollectionMediaType.TV else TmdbCollectionMediaType.MOVIE + return toPreview(contentType) + } + + private fun TmdbListItem.toPreview(mediaType: TmdbCollectionMediaType): MetaPreview? { + val title = title?.takeIf { it.isNotBlank() } + ?: name?.takeIf { it.isNotBlank() } + ?: originalTitle?.takeIf { it.isNotBlank() } + ?: originalName?.takeIf { it.isNotBlank() } + ?: return null + return MetaPreview( + id = "tmdb:$id", + type = if (mediaType == TmdbCollectionMediaType.TV) "series" else "movie", + name = title, + poster = imageUrl(posterPath, "w500") ?: imageUrl(backdropPath, "w780"), + banner = imageUrl(backdropPath, "w1280"), + posterShape = PosterShape.Poster, + description = overview?.takeIf { it.isNotBlank() }, + releaseInfo = when (mediaType) { + TmdbCollectionMediaType.MOVIE -> releaseDate?.take(4) + TmdbCollectionMediaType.TV -> firstAirDate?.take(4) + }, + rawReleaseDate = when (mediaType) { + TmdbCollectionMediaType.MOVIE -> releaseDate + TmdbCollectionMediaType.TV -> firstAirDate + }, + popularity = popularity, + imdbRating = voteAverage?.let { ((it * 10).roundToInt() / 10.0).toString() }, + ) + } + + private fun TmdbCollectionPart.toPreview(mediaType: TmdbCollectionMediaType): MetaPreview? { + val title = title?.takeIf { it.isNotBlank() } ?: return null + return MetaPreview( + id = "tmdb:$id", + type = if (mediaType == TmdbCollectionMediaType.TV) "series" else "movie", + name = title, + poster = imageUrl(posterPath, "w500") ?: imageUrl(backdropPath, "w780"), + banner = imageUrl(backdropPath, "w1280"), + posterShape = PosterShape.Poster, + description = overview?.takeIf { it.isNotBlank() }, + releaseInfo = releaseDate?.take(4), + rawReleaseDate = releaseDate, + popularity = popularity, + imdbRating = voteAverage?.let { ((it * 10).roundToInt() / 10.0).toString() }, + ) + } + + private fun CollectionSource.tmdbType(): TmdbCollectionSourceType = + tmdbSourceType + ?.let { raw -> runCatching { TmdbCollectionSourceType.valueOf(raw.uppercase()) }.getOrNull() } + ?: TmdbCollectionSourceType.DISCOVER + + private fun CollectionSource.tmdbMediaType(): TmdbCollectionMediaType = + TmdbCollectionMediaType.fromString(mediaType) + + private fun company(title: String, id: Int) = CollectionSource( + provider = "tmdb", + tmdbSourceType = TmdbCollectionSourceType.COMPANY.name, + title = title, + tmdbId = id, + mediaType = TmdbCollectionMediaType.MOVIE.name, + sortBy = TmdbCollectionSort.POPULAR_DESC.value, + ) + + private fun network(title: String, id: Int) = CollectionSource( + provider = "tmdb", + tmdbSourceType = TmdbCollectionSourceType.NETWORK.name, + title = title, + tmdbId = id, + mediaType = TmdbCollectionMediaType.TV.name, + sortBy = TmdbCollectionSort.POPULAR_DESC.value, + ) + + private fun movieSort(sortBy: String?): String = + when (sortBy) { + TmdbCollectionSort.FIRST_AIR_DATE_DESC.value -> TmdbCollectionSort.RELEASE_DATE_DESC.value + null, "" -> TmdbCollectionSort.POPULAR_DESC.value + else -> sortBy + } + + private fun tvSort(sortBy: String?): String = + when (sortBy) { + TmdbCollectionSort.RELEASE_DATE_DESC.value -> TmdbCollectionSort.FIRST_AIR_DATE_DESC.value + null, "" -> TmdbCollectionSort.POPULAR_DESC.value + else -> sortBy + } +} + +private fun MutableMap.putIfNotBlank(key: String, value: String?) { + if (!value.isNullOrBlank()) { + put(key, value) + } +} + +private fun imageUrl(path: String?, size: String): String? { + val clean = path?.takeIf { it.isNotBlank() } ?: return null + return "https://image.tmdb.org/t/p/$size$clean" +} + +@Serializable +private data class TmdbListResponse( + val name: String? = null, + val page: Int? = null, + @SerialName("total_pages") val totalPages: Int? = null, + val items: List? = null, +) + +@Serializable +private data class TmdbCollectionResponse( + val name: String? = null, + @SerialName("poster_path") val posterPath: String? = null, + @SerialName("backdrop_path") val backdropPath: String? = null, + val parts: List? = null, +) + +@Serializable +private data class TmdbDiscoverResponse( + val page: Int? = null, + @SerialName("total_pages") val totalPages: Int? = null, + val results: List? = null, +) + +@Serializable +private data class TmdbCompanyResponse( + val name: String? = null, + @SerialName("logo_path") val logoPath: String? = null, +) + +@Serializable +private data class TmdbNetworkResponse( + val name: String? = null, + @SerialName("logo_path") val logoPath: String? = null, +) + +@Serializable +data class TmdbCompanySearchResult( + val id: Int, + val name: String? = null, + @SerialName("origin_country") val originCountry: String? = null, +) + +@Serializable +private data class TmdbCompanySearchResponse( + val results: List? = null, +) + +@Serializable +data class TmdbCollectionSearchResult( + val id: Int, + val name: String? = null, + @SerialName("poster_path") val posterPath: String? = null, + @SerialName("backdrop_path") val backdropPath: String? = null, +) + +@Serializable +private data class TmdbCollectionSearchResponse( + val results: List? = null, +) + +@Serializable +private data class TmdbKeywordSearchResponse( + val results: List? = null, +) + +@Serializable +private data class TmdbKeywordSearchResult( + val id: Int, + val name: String? = null, +) + +@Serializable +private data class TmdbGenreResponse( + val genres: List? = null, +) + +@Serializable +private data class TmdbGenreItem( + val id: Int, + val name: String, +) + +@Serializable +private data class TmdbListItem( + val id: Int, + @SerialName("media_type") val mediaType: String? = null, + val title: String? = null, + val name: String? = null, + @SerialName("original_title") val originalTitle: String? = null, + @SerialName("original_name") val originalName: String? = null, + val overview: String? = null, + @SerialName("poster_path") val posterPath: String? = null, + @SerialName("backdrop_path") val backdropPath: String? = null, + @SerialName("release_date") val releaseDate: String? = null, + @SerialName("first_air_date") val firstAirDate: String? = null, + @SerialName("vote_average") val voteAverage: Double? = null, + val popularity: Double? = null, +) + +@Serializable +private data class TmdbCollectionPart( + val id: Int, + val title: String? = null, + val overview: String? = null, + @SerialName("poster_path") val posterPath: String? = null, + @SerialName("backdrop_path") val backdropPath: String? = null, + @SerialName("release_date") val releaseDate: String? = null, + @SerialName("vote_average") val voteAverage: Double? = null, + val popularity: Double? = null, +) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeScreen.kt index b2ddbb8c..82659478 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeScreen.kt @@ -40,6 +40,7 @@ import com.nuvio.app.features.watchprogress.nextUpDismissKey import com.nuvio.app.features.watchprogress.WatchProgressClock import com.nuvio.app.features.watchprogress.WatchProgressEntry import com.nuvio.app.features.watchprogress.WatchProgressRepository +import com.nuvio.app.features.watchprogress.buildContinueWatchingEpisodeSubtitle import com.nuvio.app.features.watchprogress.toContinueWatchingItem import com.nuvio.app.features.watchprogress.toUpNextContinueWatchingItem import com.nuvio.app.features.watching.application.WatchingState @@ -617,7 +618,11 @@ private fun CachedNextUpItem.toContinueWatchingItem(): ContinueWatchingItem? { parentMetaType = contentType, videoId = videoId, title = name, - subtitle = episodeTitle.orEmpty(), + subtitle = buildContinueWatchingEpisodeSubtitle( + seasonNumber = season, + episodeNumber = episode, + episodeTitle = episodeTitle, + ), imageUrl = episodeThumbnail ?: backdrop ?: poster, logo = logo, poster = poster, @@ -654,7 +659,11 @@ private fun CachedInProgressItem.toContinueWatchingItem(): ContinueWatchingItem parentMetaType = contentType, videoId = videoId, title = name, - subtitle = episodeTitle.orEmpty(), + subtitle = buildContinueWatchingEpisodeSubtitle( + seasonNumber = season, + episodeNumber = episode, + episodeTitle = episodeTitle, + ), imageUrl = episodeThumbnail ?: backdrop ?: poster, logo = logo, poster = poster, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeHeroSection.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeHeroSection.kt index 32ab8059..b76fdf7c 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeHeroSection.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeHeroSection.kt @@ -65,7 +65,7 @@ private const val HERO_SCROLL_UP_SCALE_MULTIPLIER = 0.002f private const val HERO_SCROLL_MAX_SCALE = 1.3f private const val HERO_SWIPE_THRESHOLD_FRACTION = 0.16f private const val HERO_SWIPE_VELOCITY_THRESHOLD = 300f -private const val MOBILE_HERO_VIEWPORT_RATIO = 0.78f +private const val MOBILE_HERO_VIEWPORT_RATIO = 0.82f private const val MOBILE_HERO_MIN_HEIGHT_DP = 360f private const val MOBILE_HERO_MAX_HEIGHT_DP = 760f diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/library/LibraryRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/library/LibraryRepository.kt index 7aae75f8..a3983cbf 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/library/LibraryRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/library/LibraryRepository.kt @@ -11,7 +11,6 @@ import io.github.jan.supabase.postgrest.rpc import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.runBlocking import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -25,9 +24,6 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.encodeToJsonElement import kotlinx.serialization.json.put -import nuvio.composeapp.generated.resources.Res -import nuvio.composeapp.generated.resources.library_other -import org.jetbrains.compose.resources.getString @Serializable private data class StoredLibraryPayload( @@ -370,7 +366,7 @@ private fun LibraryItem.toSyncItem(): LibrarySyncItem = LibrarySyncItem( internal fun String.toLibraryDisplayTitle(): String { val normalized = trim() - if (normalized.isBlank()) return runBlocking { getString(Res.string.library_other) } + if (normalized.isBlank()) return "Other" return normalized .split('-', '_', ' ') @@ -378,5 +374,5 @@ internal fun String.toLibraryDisplayTitle(): String { .joinToString(" ") { token -> token.lowercase().replaceFirstChar { char -> char.uppercase() } } - .ifBlank { runBlocking { getString(Res.string.library_other) } } + .ifBlank { "Other" } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressModels.kt index 5f4157b0..12efbd73 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressModels.kt @@ -190,7 +190,11 @@ internal fun WatchProgressEntry.toContinueWatchingItem(): ContinueWatchingItem { parentMetaType = normalizedEntry.parentMetaType, videoId = normalizedEntry.videoId, title = normalizedEntry.title, - subtitle = normalizedEntry.episodeTitle.orEmpty(), + subtitle = buildContinueWatchingEpisodeSubtitle( + seasonNumber = normalizedEntry.seasonNumber, + episodeNumber = normalizedEntry.episodeNumber, + episodeTitle = normalizedEntry.episodeTitle, + ), imageUrl = normalizedEntry.episodeThumbnail ?: normalizedEntry.background ?: normalizedEntry.poster, logo = normalizedEntry.logo, poster = normalizedEntry.poster, @@ -223,7 +227,11 @@ internal fun WatchProgressEntry.toUpNextContinueWatchingItem( fallbackVideoId = nextEpisode.id, ), title = title, - subtitle = nextEpisode.title, + subtitle = buildContinueWatchingEpisodeSubtitle( + seasonNumber = nextEpisode.season, + episodeNumber = nextEpisode.episode, + episodeTitle = nextEpisode.title, + ), imageUrl = nextEpisode.thumbnail ?: episodeThumbnail ?: background ?: poster, logo = logo, poster = poster, @@ -243,6 +251,20 @@ internal fun WatchProgressEntry.toUpNextContinueWatchingItem( ) } +internal fun buildContinueWatchingEpisodeSubtitle( + seasonNumber: Int?, + episodeNumber: Int?, + episodeTitle: String?, +): String { + val episodeCode = when { + seasonNumber != null && episodeNumber != null -> "S${seasonNumber}E${episodeNumber}" + episodeNumber != null -> "E${episodeNumber}" + else -> null + } + val title = episodeTitle.orEmpty() + return listOfNotNull(episodeCode, title.takeIf { it.isNotBlank() }).joinToString(" • ") +} + fun buildPlaybackVideoId( parentMetaId: String, seasonNumber: Int?, diff --git a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/details/SeriesPlaybackResolverTest.kt b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/details/SeriesPlaybackResolverTest.kt index a7b47fdc..1713004f 100644 --- a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/details/SeriesPlaybackResolverTest.kt +++ b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/details/SeriesPlaybackResolverTest.kt @@ -36,7 +36,7 @@ class SeriesPlaybackResolverTest { ) assertNotNull(action) - assertEquals("Up Next S1E3", action.label) + assertEquals("Up Next • S1E3", action.label) assertEquals("show:1:3", action.videoId) assertEquals(1, action.seasonNumber) assertEquals(3, action.episodeNumber) @@ -85,7 +85,7 @@ class SeriesPlaybackResolverTest { ) assertNotNull(action) - assertEquals("Up Next S1E3", action.label) + assertEquals("Up Next • S1E3", action.label) assertEquals("show:1:3", action.videoId) } } diff --git a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/watching/domain/SeriesContinuityTest.kt b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/watching/domain/SeriesContinuityTest.kt index 51727f2e..cb3f6ba7 100644 --- a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/watching/domain/SeriesContinuityTest.kt +++ b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/watching/domain/SeriesContinuityTest.kt @@ -39,7 +39,7 @@ class SeriesContinuityTest { ) assertNotNull(action) - assertEquals("Up Next S1E3", action.label) + assertEquals("Up Next • S1E3", action.label) assertEquals("show:1:3", action.videoId) assertEquals(3, action.episodeNumber) } @@ -142,7 +142,7 @@ class SeriesContinuityTest { ) assertNotNull(action) - assertEquals("Up Next S2E2", action.label) + assertEquals("Up Next • S2E2", action.label) assertEquals("show:2:2", action.videoId) } } From bb51a1c1beca7c0811d5bc7214bf4dc6cbe8af99 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 00:59:28 +0530 Subject: [PATCH 002/143] update deps --- .gitignore | 2 ++ .gitmodules | 3 +++ gradle/libs.versions.toml | 8 ++++---- 3 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 .gitmodules diff --git a/.gitignore b/.gitignore index fb351f31..36411eba 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ keystore/ scripts/build-distribution.sh asset scripts/scrape_android_compose_animation_docs.py +tools +AGENTS.md diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..00634e56 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "MPVKit"] + path = MPVKit + url = https://github.com/tapframe/MPVNuvio.git diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3a8920f1..aa57b2d5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,22 +4,22 @@ android-compileSdk = "36" android-minSdk = "24" android-targetSdk = "36" androidx-activity = "1.12.2" -androidx-navigation = "2.9.0" +androidx-navigation = "2.9.2" androidx-appcompat = "1.7.1" androidx-core = "1.17.0" androidx-core-splashscreen = "1.0.1" androidx-espresso = "3.7.0" -androidx-lifecycle = "2.9.6" +androidx-lifecycle = "2.11.0-alpha03" androidx-work = "2.10.3" androidx-testExt = "1.3.0" -composeMultiplatform = "1.10.0" +composeMultiplatform = "1.11.0-beta03" coil = "3.4.0" kermit = "2.0.5" junit = "4.13.2" kotlin = "2.3.0" kotlinx-serialization = "1.8.1" ktor = "3.4.1" -material3 = "1.10.0-alpha05" +material3 = "1.11.0-alpha07" androidx-media3 = "1.8.0" supabase = "3.4.1" quickjsKt = "1.0.1" From 19edc6de610efd09ea76b58da6365e5808daaf32 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 01:33:43 +0530 Subject: [PATCH 003/143] feat: horizontal episode cards to autoscroll to recent activity card --- .../app/features/details/MetaDetailsScreen.kt | 3 +++ .../details/components/DetailSeriesContent.kt | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt index 6398649a..31a9614e 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt @@ -636,6 +636,7 @@ fun MetaDetailsScreen( onSaveClick = toggleSaved, showManualPlayOption = showManualPlayOption, preferredEpisodeSeasonNumber = seriesAction?.seasonNumber, + preferredEpisodeNumber = seriesAction?.episodeNumber, hasProductionSection = hasProductionSection, hasTrailersSection = hasTrailersSection, hasEpisodes = hasEpisodes, @@ -940,6 +941,7 @@ private fun ConfiguredMetaSections( onSaveClick: () -> Unit, showManualPlayOption: Boolean, preferredEpisodeSeasonNumber: Int?, + preferredEpisodeNumber: Int?, hasProductionSection: Boolean, hasTrailersSection: Boolean, hasEpisodes: Boolean, @@ -1042,6 +1044,7 @@ private fun ConfiguredMetaSections( meta = meta, showHeader = showHeader, preferredSeasonNumber = preferredEpisodeSeasonNumber, + preferredEpisodeNumber = preferredEpisodeNumber, episodeCardStyle = settings.episodeCardStyle, progressByVideoId = progressByVideoId, watchedKeys = watchedKeys, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailSeriesContent.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailSeriesContent.kt index efa1857e..ce6f2a2f 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailSeriesContent.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailSeriesContent.kt @@ -80,6 +80,7 @@ fun DetailSeriesContent( modifier: Modifier = Modifier, showHeader: Boolean = true, preferredSeasonNumber: Int? = null, + preferredEpisodeNumber: Int? = null, episodeCardStyle: MetaEpisodeCardStyle = MetaEpisodeCardStyle.Horizontal, progressByVideoId: Map = emptyMap(), watchedKeys: Set = emptySet(), @@ -269,6 +270,7 @@ fun DetailSeriesContent( watchedKeys = watchedKeys, fallbackImage = meta.background ?: meta.poster, progressByVideoId = progressByVideoId, + preferredEpisodeNumber = preferredEpisodeNumber, onEpisodeClick = onEpisodeClick, onEpisodeLongPress = onEpisodeLongPress, ) @@ -541,12 +543,32 @@ private fun EpisodeHorizontalRow( watchedKeys: Set, fallbackImage: String?, progressByVideoId: Map, + preferredEpisodeNumber: Int? = null, onEpisodeClick: ((MetaVideo) -> Unit)?, onEpisodeLongPress: ((MetaVideo) -> Unit)?, ) { val rowMetrics = rememberEpisodeHorizontalCardMetrics(maxWidthDp) + val listState = rememberLazyListState() + var hasPositioned by remember(episodes) { mutableStateOf(false) } + + LaunchedEffect(episodes, preferredEpisodeNumber) { + val targetIndex = if (preferredEpisodeNumber != null) { + episodes.indexOfFirst { it.episode == preferredEpisodeNumber } + } else { + -1 + } + if (targetIndex >= 0) { + if (hasPositioned) { + listState.animateScrollToItem(targetIndex) + } else { + listState.scrollToItem(targetIndex) + hasPositioned = true + } + } + } LazyRow( + state = listState, modifier = Modifier.fillMaxWidth(), contentPadding = PaddingValues(horizontal = rowMetrics.rowHorizontalPadding, vertical = rowMetrics.rowVerticalPadding), horizontalArrangement = Arrangement.spacedBy(rowMetrics.itemSpacing), From 5bbd0dc6f720b301b24f442c55155c357d55935e Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 01:44:15 +0530 Subject: [PATCH 004/143] feat: implement cache removal for active video in PlayerScreen --- .../kotlin/com/nuvio/app/features/player/PlayerScreen.kt | 8 ++++++++ .../app/features/streams/StreamLinkCacheRepository.kt | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt index 81c52ea4..5376fc00 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt @@ -1488,6 +1488,14 @@ fun PlayerScreen( errorMessage = message if (message != null) { controlsVisible = !playerControlsLocked + val currentVideoId = activeVideoId + if (currentVideoId != null) { + val cacheKey = StreamLinkCacheRepository.contentKey( + contentType ?: parentMetaType, + currentVideoId, + ) + StreamLinkCacheRepository.remove(cacheKey) + } } }, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamLinkCacheRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamLinkCacheRepository.kt index 07519fd7..0d497166 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamLinkCacheRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamLinkCacheRepository.kt @@ -53,6 +53,10 @@ object StreamLinkCacheRepository { StreamLinkCacheStorage.saveEntry(hashedKey(contentKey), payload) } + fun remove(contentKey: String) { + StreamLinkCacheStorage.removeEntry(hashedKey(contentKey)) + } + fun getValid(contentKey: String, maxAgeMs: Long): CachedStreamLink? { if (maxAgeMs <= 0L) return null val raw = StreamLinkCacheStorage.loadEntry(hashedKey(contentKey)) ?: return null From c9674812c35925abcba638829a194dfe13aa046d Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 01:52:59 +0530 Subject: [PATCH 005/143] ref: tablet stream layout to use backdrop instead of episode thumbnails --- .../features/streams/StreamsTabletLayout.kt | 22 ++----------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsTabletLayout.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsTabletLayout.kt index 72ef11dd..a7410f7f 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsTabletLayout.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsTabletLayout.kt @@ -65,13 +65,8 @@ internal fun TabletStreamsLayout( modifier: Modifier = Modifier, ) { val hazeState = rememberHazeState() - val tabletBackdrop = remember(isEpisode, episodeThumbnail, background, poster) { - resolveTabletBackdrop( - isEpisode = isEpisode, - episodeThumbnail = episodeThumbnail, - background = background, - poster = poster, - ) + val tabletBackdrop = remember(background, poster) { + background ?: poster } var backdropVisible by remember(tabletBackdrop) { mutableStateOf(false) } @@ -381,16 +376,3 @@ private fun ActiveScrapersStatusBlock( } } -private fun resolveTabletBackdrop( - isEpisode: Boolean, - episodeThumbnail: String?, - background: String?, - poster: String?, -): String? { - if (!isEpisode) return background ?: poster - - val preferredEpisodeThumbnail = episodeThumbnail?.takeIf { - it.isNotBlank() && it != poster - } - return preferredEpisodeThumbnail ?: background ?: poster -} \ No newline at end of file From 1eb82c55e73a88d76578de91e28a86664278cf91 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 01:54:05 +0530 Subject: [PATCH 006/143] fix: update stored progress handling to check resumable state --- .../kotlin/com/nuvio/app/features/streams/StreamsScreen.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsScreen.kt index 18202efa..3dcffda4 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsScreen.kt @@ -131,7 +131,9 @@ fun StreamsScreen( } else { watchProgressUiState.byVideoId[videoId] } - val storedProgressFraction = storedProgress?.progressPercent + val storedProgressFraction = storedProgress + ?.takeIf { it.isResumable } + ?.progressPercent ?.takeIf { it > 0f } ?.let { explicitPercent -> (explicitPercent / 100f).coerceIn(0f, 1f) } val effectiveResumeProgressFraction = if (startFromBeginning) { @@ -148,7 +150,7 @@ fun StreamsScreen( if (startFromBeginning) { null } else { - (resumePositionMs ?: storedProgress?.lastPositionMs)?.takeIf { it > 0L } + (resumePositionMs ?: storedProgress?.takeIf { it.isResumable }?.lastPositionMs)?.takeIf { it > 0L } } } From 2b5d4a881f2fa1477bd401a215207aaabb8ad64b Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 01:55:25 +0530 Subject: [PATCH 007/143] refr: reorder playback button --- .../app/features/settings/SettingsRootPage.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsRootPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsRootPage.kt index 0f4cfb6a..47b341bc 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsRootPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsRootPage.kt @@ -97,14 +97,6 @@ internal fun LazyListScope.settingsRootContent( onClick = onContentDiscoveryClick, ) SettingsGroupDivider(isTablet = isTablet) - SettingsNavigationRow( - title = "Playback", - description = "Control player behavior and viewing defaults.", - icon = Icons.Rounded.PlayArrow, - isTablet = isTablet, - onClick = onPlaybackClick, - ) - SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( title = "Downloads", description = "Manage your downloaded movies and episodes.", @@ -113,6 +105,14 @@ internal fun LazyListScope.settingsRootContent( onClick = onDownloadsClick, ) SettingsGroupDivider(isTablet = isTablet) + SettingsNavigationRow( + title = "Playback", + description = "Control player behavior and viewing defaults.", + icon = Icons.Rounded.PlayArrow, + isTablet = isTablet, + onClick = onPlaybackClick, + ) + SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( title = "Integrations", description = "Connect TMDB and MDBList services.", From 040824d9b90798c3e8efbaaf93af82ced71a9811 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 02:02:30 +0530 Subject: [PATCH 008/143] ref: adjust spacing and padding in DiscoverDropdownChip --- .../app/features/search/SearchDiscoverContent.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchDiscoverContent.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchDiscoverContent.kt index 0b338ab5..25d57c04 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchDiscoverContent.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchDiscoverContent.kt @@ -166,7 +166,7 @@ private fun DiscoverFilterRow( ) { Row( modifier = modifier.horizontalScroll(rememberScrollState()), - horizontalArrangement = Arrangement.spacedBy(10.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp), ) { DiscoverDropdownChip( title = "Select Type", @@ -221,7 +221,7 @@ private fun DiscoverDropdownChip( Row( modifier = Modifier - .clip(RoundedCornerShape(20.dp)) + .clip(RoundedCornerShape(12.dp)) .background(MaterialTheme.colorScheme.surface) .then( if (enabled) { @@ -230,13 +230,13 @@ private fun DiscoverDropdownChip( Modifier }, ) - .padding(horizontal = 18.dp, vertical = 14.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp), + .padding(horizontal = 12.dp, vertical = 8.dp), + horizontalArrangement = Arrangement.spacedBy(6.dp), verticalAlignment = Alignment.CenterVertically, ) { Text( text = label, - style = MaterialTheme.typography.titleMedium, + style = MaterialTheme.typography.labelLarge, color = if (enabled) MaterialTheme.colorScheme.onSurface else MaterialTheme.colorScheme.onSurfaceVariant, maxLines = 1, overflow = TextOverflow.Ellipsis, @@ -244,6 +244,7 @@ private fun DiscoverDropdownChip( Icon( imageVector = Icons.Rounded.KeyboardArrowDown, contentDescription = null, + modifier = Modifier.size(18.dp), tint = if (enabled) MaterialTheme.colorScheme.onSurfaceVariant else MaterialTheme.colorScheme.outline, ) } From 629ec5a7f45cbcfaf31c9c834f0f2b08f187851a Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 02:03:12 +0530 Subject: [PATCH 009/143] bump version --- iosApp/Configuration/Version.xcconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iosApp/Configuration/Version.xcconfig b/iosApp/Configuration/Version.xcconfig index 55e78afa..5e09d094 100644 --- a/iosApp/Configuration/Version.xcconfig +++ b/iosApp/Configuration/Version.xcconfig @@ -1,3 +1,3 @@ -CURRENT_PROJECT_VERSION=35 -MARKETING_VERSION=0.1.4 +CURRENT_PROJECT_VERSION=36 +MARKETING_VERSION=0.1.5 From 632f5571e171164302e31bd1ef709b2f766c6cdc Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 17:34:42 +0530 Subject: [PATCH 010/143] ref: update selectedHeroSourceCount to filter by catalog keys --- .../app/features/home/HomeCatalogSettingsRepository.kt | 8 +++++--- gradle/libs.versions.toml | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeCatalogSettingsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeCatalogSettingsRepository.kt index 20e31963..ee49f681 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeCatalogSettingsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeCatalogSettingsRepository.kt @@ -346,10 +346,12 @@ object HomeCatalogSettingsRepository { HomeRepository.applyCurrentSettings() } - private fun selectedHeroSourceCount(excludingKey: String? = null): Int = - preferences.count { (itemKey, preference) -> - itemKey != excludingKey && preference.heroSourceEnabled + private fun selectedHeroSourceCount(excludingKey: String? = null): Int { + val catalogKeys = definitions.mapTo(mutableSetOf()) { it.key } + return preferences.count { (itemKey, preference) -> + itemKey != excludingKey && itemKey in catalogKeys && preference.heroSourceEnabled } + } private fun move( key: String, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index aa57b2d5..5026f75c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.11.2" +agp = "8.13.2" android-compileSdk = "36" android-minSdk = "24" android-targetSdk = "36" From ebc695cbc55d45d1dc8cf1b25b481900b9acc62a Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 18:08:15 +0530 Subject: [PATCH 011/143] ref: integrate profile state management in HomeScreen and clear HomeRepository on profile change --- .../kotlin/com/nuvio/app/features/home/HomeScreen.kt | 8 ++++++-- .../com/nuvio/app/features/profiles/ProfileRepository.kt | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeScreen.kt index cfc6da38..15c6cb35 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeScreen.kt @@ -45,6 +45,7 @@ import com.nuvio.app.features.watchprogress.toUpNextContinueWatchingItem import com.nuvio.app.features.watching.application.WatchingState import com.nuvio.app.features.watching.domain.WatchingContentRef import com.nuvio.app.features.collection.CollectionRepository +import com.nuvio.app.features.profiles.ProfileRepository import com.nuvio.app.features.home.components.HomeCollectionRowSection import com.nuvio.app.features.watchprogress.ContinueWatchingSectionStyle import kotlinx.coroutines.async @@ -149,9 +150,12 @@ fun HomeScreen( latestCompletedBySeries = latestCompletedBySeries, ) } - var nextUpItemsBySeries by remember { mutableStateOf>>(emptyMap()) } + val profileState by ProfileRepository.state.collectAsStateWithLifecycle() + val activeProfileId = profileState.activeProfile?.profileIndex ?: 1 - val cachedSnapshots = remember { ContinueWatchingEnrichmentCache.getSnapshots() } + var nextUpItemsBySeries by remember(activeProfileId) { mutableStateOf>>(emptyMap()) } + + val cachedSnapshots = remember(activeProfileId) { ContinueWatchingEnrichmentCache.getSnapshots() } val cachedNextUpItems = remember(cachedSnapshots.first, continueWatchingPreferences.dismissedNextUpKeys) { cachedSnapshots.first.mapNotNull { cached -> if (nextUpDismissKey(cached.contentId, cached.seedSeason, cached.seedEpisode) in continueWatchingPreferences.dismissedNextUpKeys) { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileRepository.kt index 51181a2b..65e48b5c 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileRepository.kt @@ -10,6 +10,7 @@ import com.nuvio.app.features.collection.CollectionRepository import com.nuvio.app.features.downloads.DownloadsRepository import com.nuvio.app.features.details.MetaScreenSettingsRepository import com.nuvio.app.features.home.HomeCatalogSettingsRepository +import com.nuvio.app.features.home.HomeRepository import com.nuvio.app.core.ui.PosterCardStyleRepository import com.nuvio.app.features.library.LibraryRepository import com.nuvio.app.features.mdblist.MdbListSettingsRepository @@ -138,6 +139,7 @@ object ProfileRepository { PosterCardStyleRepository.onProfileChanged() PlayerSettingsRepository.onProfileChanged() HomeCatalogSettingsRepository.onProfileChanged() + HomeRepository.clear() MetaScreenSettingsRepository.onProfileChanged() ContinueWatchingPreferencesRepository.onProfileChanged() EpisodeReleaseNotificationsRepository.onProfileChanged() From 9491bc944f826e5503d4605526c0afd64612c966 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 18:09:21 +0530 Subject: [PATCH 012/143] bump version --- iosApp/Configuration/Version.xcconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iosApp/Configuration/Version.xcconfig b/iosApp/Configuration/Version.xcconfig index 5e09d094..c593677b 100644 --- a/iosApp/Configuration/Version.xcconfig +++ b/iosApp/Configuration/Version.xcconfig @@ -1,3 +1,3 @@ -CURRENT_PROJECT_VERSION=36 -MARKETING_VERSION=0.1.5 +CURRENT_PROJECT_VERSION=37 +MARKETING_VERSION=0.1.6 From f4b1e9ba73286e58b207a005035a51ad880b75d7 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 23:19:42 +0530 Subject: [PATCH 013/143] fix: threshold calculation fix --- .../com/nuvio/app/features/trakt/TraktProgressRepository.kt | 6 +++--- .../nuvio/app/features/watchprogress/WatchProgressModels.kt | 2 +- .../app/features/watchprogress/WatchProgressRepository.kt | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktProgressRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktProgressRepository.kt index c7c49c49..b75022a6 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktProgressRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktProgressRepository.kt @@ -4,7 +4,6 @@ import co.touchlab.kermit.Logger import com.nuvio.app.features.addons.httpGetTextWithHeaders import com.nuvio.app.features.addons.httpRequestRaw import com.nuvio.app.features.details.MetaDetailsRepository -import com.nuvio.app.features.watchprogress.WatchProgressCompletionPercentThreshold import com.nuvio.app.features.watchprogress.WatchProgressEntry import com.nuvio.app.features.watchprogress.buildPlaybackVideoId import kotlinx.coroutines.CancellationException @@ -28,6 +27,7 @@ import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json private const val BASE_URL = "https://api.trakt.tv" +private const val TRAKT_COMPLETION_PERCENT_THRESHOLD = 80f private const val HISTORY_LIMIT = 250 private const val METADATA_FETCH_TIMEOUT_MS = 3_500L private const val METADATA_FETCH_CONCURRENCY = 5 @@ -468,7 +468,7 @@ object TraktProgressRepository { lastPositionMs = 0L, durationMs = 0L, lastUpdatedEpochMs = rankedTimestamp(item.pausedAt, fallbackIndex), - isCompleted = progressPercent >= WatchProgressCompletionPercentThreshold, + isCompleted = progressPercent >= TRAKT_COMPLETION_PERCENT_THRESHOLD, progressPercent = progressPercent, ).normalizedCompletion() } @@ -502,7 +502,7 @@ object TraktProgressRepository { lastPositionMs = 0L, durationMs = 0L, lastUpdatedEpochMs = rankedTimestamp(item.pausedAt, fallbackIndex), - isCompleted = progressPercent >= WatchProgressCompletionPercentThreshold, + isCompleted = progressPercent >= TRAKT_COMPLETION_PERCENT_THRESHOLD, progressPercent = progressPercent, ).normalizedCompletion() } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressModels.kt index 855596c5..5a678bdc 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressModels.kt @@ -44,7 +44,7 @@ data class WatchProgressEntry( val isEffectivelyCompleted: Boolean get() = isCompleted || (normalizedProgressPercent?.let { it >= WatchProgressCompletionPercentThreshold } == true) || - (durationMs > 0L && lastPositionMs >= durationMs) + (durationMs > 0L && isWatchProgressComplete(lastPositionMs, durationMs, false)) val progressFraction: Float get() { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressRepository.kt index 84fb18e0..55adcebe 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressRepository.kt @@ -138,7 +138,7 @@ object WatchProgressRepository { lastStreamSubtitle = cached?.lastStreamSubtitle, pauseDescription = cached?.pauseDescription, lastSourceUrl = cached?.lastSourceUrl, - isCompleted = entry.duration > 0 && entry.position >= entry.duration, + isCompleted = isWatchProgressComplete(entry.position, entry.duration, false), ) } From 9b1fbb29f14aea02fb576c7c3e2fd97d1f1358af Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 23:33:32 +0530 Subject: [PATCH 014/143] ref: update trackedShowsByKey to use immutable map --- .../EpisodeReleaseNotificationsRepository.kt | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationsRepository.kt index 96c48587..a7d41fa5 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationsRepository.kt @@ -24,6 +24,7 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withPermit +import kotlin.concurrent.Volatile import kotlinx.coroutines.withTimeoutOrNull import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString @@ -44,8 +45,10 @@ object EpisodeReleaseNotificationsRepository { private val _uiState = MutableStateFlow(EpisodeReleaseNotificationsUiState()) val uiState: StateFlow = _uiState.asStateFlow() + @Volatile private var hasLoaded = false - private var trackedShowsByKey: MutableMap = mutableMapOf() + @Volatile + private var trackedShowsByKey: Map = emptyMap() init { scope.launch { @@ -81,7 +84,7 @@ object EpisodeReleaseNotificationsRepository { fun clearLocalState() { hasLoaded = false - trackedShowsByKey.clear() + trackedShowsByKey = emptyMap() _uiState.value = EpisodeReleaseNotificationsUiState() scope.launch { runCatching { EpisodeReleaseNotificationPlatform.clearScheduledEpisodeReleaseNotifications() } @@ -239,7 +242,6 @@ object EpisodeReleaseNotificationsRepository { private fun loadFromDisk() { hasLoaded = true - trackedShowsByKey.clear() val payload = EpisodeReleaseNotificationsStorage.loadPayload().orEmpty().trim() val stored = payload.takeIf { it.isNotEmpty() } @@ -251,11 +253,11 @@ object EpisodeReleaseNotificationsRepository { }.getOrNull() } - stored?.followedShows - .orEmpty() - .forEach { trackedShow -> - trackedShowsByKey[buildTrackedShowKey(trackedShow.contentType, trackedShow.contentId)] = trackedShow + trackedShowsByKey = buildMap { + stored?.followedShows.orEmpty().forEach { trackedShow -> + put(buildTrackedShowKey(trackedShow.contentType, trackedShow.contentId), trackedShow) } + } _uiState.value = EpisodeReleaseNotificationsUiState( isEnabled = stored?.enabled ?: false, @@ -318,7 +320,7 @@ object EpisodeReleaseNotificationsRepository { val changed = nextTrackedShows != trackedShowsByKey if (changed) { - trackedShowsByKey = nextTrackedShows.toMutableMap() + trackedShowsByKey = nextTrackedShows.toMap() } updateTestTargetState() return changed From 8134194461dce1fb7a230f601069f0ca1296bea2 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 23 Apr 2026 23:39:04 +0530 Subject: [PATCH 015/143] ref: add desugaring support --- composeApp/build.gradle.kts | 2 ++ gradle/libs.versions.toml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 54a4483c..ca333a1c 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -276,6 +276,7 @@ afterEvaluate { } dependencies { + coreLibraryDesugaring(libs.desugar.jdk.libs) debugImplementation(libs.compose.uiTooling) } @@ -348,6 +349,7 @@ android { } } compileOptions { + isCoreLibraryDesugaringEnabled = true sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5026f75c..d5929dc6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,6 +25,7 @@ supabase = "3.4.1" quickjsKt = "1.0.1" ksoup = "0.2.6" reorderable = "3.0.0" +desugarJdkLibs = "2.1.5" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } @@ -73,6 +74,7 @@ supabase-functions = { module = "io.github.jan-tennert.supabase:functions-kt", v quickjs-kt = { module = "io.github.dokar3:quickjs-kt", version.ref = "quickjsKt" } ksoup = { module = "com.fleeksoft.ksoup:ksoup", version.ref = "ksoup" } reorderable = { module = "sh.calvin.reorderable:reorderable", version.ref = "reorderable" } +desugar-jdk-libs = { module = "com.android.tools:desugar_jdk_libs", version.ref = "desugarJdkLibs" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" } From 40588e0ed61b0729326ad73c9c5ee51b2db1e43f Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Fri, 24 Apr 2026 02:03:23 +0530 Subject: [PATCH 016/143] feat: auto fetchfetch addon subtitles Co-authored-by: Copilot --- .../nuvio/app/features/player/PlayerScreen.kt | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt index 5376fc00..196b81f6 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt @@ -1036,6 +1036,12 @@ fun PlayerScreen( controlsVisible = false } + fun fetchAddonSubtitlesForActiveItem() { + val type = contentType ?: return + val videoId = activeVideoId ?: return + SubtitleRepository.fetchAddonSubtitles(type, videoId) + } + LaunchedEffect(activeSourceUrl, activeSourceAudioUrl, activeSourceHeaders, activeSourceResponseHeaders) { errorMessage = null playerController = null @@ -1066,6 +1072,13 @@ fun PlayerScreen( playerController?.applySubtitleStyle(subtitleStyle) } + LaunchedEffect(showSubtitleModal, activeSubtitleTab, contentType, activeVideoId) { + if (!showSubtitleModal || activeSubtitleTab != SubtitleTab.Addons) return@LaunchedEffect + if (!isLoadingAddonSubtitles && addonSubtitles.isEmpty()) { + fetchAddonSubtitlesForActiveItem() + } + } + LaunchedEffect(playbackSnapshot.isLoading, playerController) { if (!playbackSnapshot.isLoading && playerController != null) { refreshTracks() @@ -1709,11 +1722,7 @@ fun PlayerScreen( useCustomSubtitles = true playerController?.setSubtitleUri(addon.url) }, - onFetchAddonSubtitles = { - if (contentType != null && activeVideoId != null) { - SubtitleRepository.fetchAddonSubtitles(contentType, activeVideoId!!) - } - }, + onFetchAddonSubtitles = ::fetchAddonSubtitlesForActiveItem, onStyleChanged = PlayerSettingsRepository::setSubtitleStyle, onDismiss = { showSubtitleModal = false }, ) From 57fc85518096b572d52f03c5b5c2e3bb4a4f7988 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Fri, 24 Apr 2026 02:24:45 +0530 Subject: [PATCH 017/143] feat: addon confiuguration and reordering --- .../app/features/addons/AddonRepository.kt | 21 +++ .../nuvio/app/features/addons/AddonsScreen.kt | 147 +++++++++++++----- 2 files changed, 127 insertions(+), 41 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonRepository.kt index 79ce45da..4433d65a 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonRepository.kt @@ -250,6 +250,27 @@ object AddonRepository { pushToServer() } + fun moveAddon(fromIndex: Int, toIndex: Int) { + if (isUsingPrimaryAddonsFromSecondaryProfile()) return + _uiState.update { current -> + val addons = current.addons + if ( + fromIndex !in addons.indices || + toIndex !in addons.indices || + fromIndex == toIndex + ) { + return@update current + } + + val reordered = addons.toMutableList() + val movingAddon = reordered.removeAt(fromIndex) + reordered.add(toIndex, movingAddon) + current.copy(addons = reordered) + } + persist() + pushToServer() + } + fun refreshAll() { _uiState.value.addons.distinctBy { it.manifestUrl }.forEach { addon -> refreshAddon(addon.manifestUrl) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonsScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonsScreen.kt index e8b0ad45..91c85d88 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonsScreen.kt @@ -12,12 +12,14 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.ArrowDownward +import androidx.compose.material.icons.rounded.ArrowUpward import androidx.compose.material.icons.rounded.Delete import androidx.compose.material.icons.rounded.Extension import androidx.compose.material.icons.rounded.Refresh +import androidx.compose.material.icons.rounded.Settings import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme @@ -36,6 +38,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -80,6 +83,7 @@ internal fun AddonsSettingsPageContent( } val uiState by AddonRepository.uiState.collectAsStateWithLifecycle() + val uriHandler = LocalUriHandler.current val coroutineScope = rememberCoroutineScope() var addonUrl by rememberSaveable { mutableStateOf("") } var formMessage by rememberSaveable { mutableStateOf(null) } @@ -131,10 +135,34 @@ internal fun AddonsSettingsPageContent( if (uiState.addons.isEmpty()) { EmptyStateCard() } else { - uiState.addons.forEach { addon -> + val lastIndex = uiState.addons.lastIndex + uiState.addons.forEachIndexed { index, addon -> + val manifest = addon.manifest + val behaviorHints = manifest?.behaviorHints + val showConfigureAction = behaviorHints?.configurable == true || behaviorHints?.configurationRequired == true + val configureUrl = addon.manifestUrl.toConfigureUrl() InstalledAddonCard( addon = addon, + onMoveUpClick = if (index > 0) { + { AddonRepository.moveAddon(index, index - 1) } + } else { + null + }, + onMoveDownClick = if (index < lastIndex) { + { AddonRepository.moveAddon(index, index + 1) } + } else { + null + }, onRefreshClick = { AddonRepository.refreshAddon(addon.manifestUrl) }, + onConfigureClick = if (showConfigureAction && !configureUrl.isNullOrBlank()) { + { + runCatching { + uriHandler.openUri(configureUrl) + } + } + } else { + null + }, onDeleteClick = { AddonRepository.removeAddon(addon.manifestUrl) }, ) } @@ -307,7 +335,10 @@ private fun EmptyStateCard() { @Composable private fun InstalledAddonCard( addon: ManagedAddon, + onMoveUpClick: (() -> Unit)?, + onMoveDownClick: (() -> Unit)?, onRefreshClick: () -> Unit, + onConfigureClick: (() -> Unit)?, onDeleteClick: () -> Unit, ) { val manifest = addon.manifest @@ -315,54 +346,79 @@ private fun InstalledAddonCard( NuvioSurfaceCard { Row( modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.Top, ) { - Row( - modifier = Modifier.weight(1f), - verticalAlignment = Alignment.Top, - ) { - AddonIconBadge( - imageUrl = manifest?.logoUrl, - icon = Icons.Rounded.Extension, - tint = if (manifest != null) Color(0xFF71BDE8) else MaterialTheme.colorScheme.onSurfaceVariant, + AddonIconBadge( + imageUrl = manifest?.logoUrl, + icon = Icons.Rounded.Extension, + tint = if (manifest != null) Color(0xFF71BDE8) else MaterialTheme.colorScheme.onSurfaceVariant, + ) + Spacer(modifier = Modifier.width(16.dp)) + Column(modifier = Modifier.weight(1f)) { + Text( + text = addon.displayTitle, + style = MaterialTheme.typography.headlineLarge, + color = MaterialTheme.colorScheme.onSurface, + maxLines = 2, + overflow = TextOverflow.Ellipsis, ) - Spacer(modifier = Modifier.width(16.dp)) - Column(modifier = Modifier.weight(1f)) { + manifest?.version?.let { version -> + Spacer(modifier = Modifier.height(8.dp)) Text( - text = addon.displayTitle, - style = MaterialTheme.typography.headlineLarge, - color = MaterialTheme.colorScheme.onSurface, - maxLines = 2, - overflow = TextOverflow.Ellipsis, + text = "Version $version", + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant, ) - manifest?.version?.let { version -> - Spacer(modifier = Modifier.height(8.dp)) - Text( - text = "Version $version", - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onSurfaceVariant, - ) - } } } - Row(verticalAlignment = Alignment.CenterVertically) { - NuvioIconActionButton( - icon = Icons.Rounded.Refresh, - contentDescription = "Refresh addon", - tint = MaterialTheme.colorScheme.primary, - onClick = onRefreshClick, - ) - NuvioIconActionButton( - icon = Icons.Rounded.Delete, - contentDescription = "Delete addon", - tint = MaterialTheme.colorScheme.error, - onClick = onDeleteClick, - ) - } } - Spacer(modifier = Modifier.height(18.dp)) + Spacer(modifier = Modifier.height(12.dp)) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.End), + verticalAlignment = Alignment.CenterVertically, + ) { + onMoveUpClick?.let { onMoveUp -> + NuvioIconActionButton( + icon = Icons.Rounded.ArrowUpward, + contentDescription = "Move addon up", + tint = MaterialTheme.colorScheme.onSurfaceVariant, + onClick = onMoveUp, + ) + } + onMoveDownClick?.let { onMoveDown -> + NuvioIconActionButton( + icon = Icons.Rounded.ArrowDownward, + contentDescription = "Move addon down", + tint = MaterialTheme.colorScheme.onSurfaceVariant, + onClick = onMoveDown, + ) + } + NuvioIconActionButton( + icon = Icons.Rounded.Refresh, + contentDescription = "Refresh addon", + tint = MaterialTheme.colorScheme.primary, + onClick = onRefreshClick, + ) + onConfigureClick?.let { onConfigure -> + NuvioIconActionButton( + icon = Icons.Rounded.Settings, + contentDescription = "Configure addon", + tint = MaterialTheme.colorScheme.tertiary, + onClick = onConfigure, + ) + } + NuvioIconActionButton( + icon = Icons.Rounded.Delete, + contentDescription = "Delete addon", + tint = MaterialTheme.colorScheme.error, + onClick = onDeleteClick, + ) + } + + Spacer(modifier = Modifier.height(12.dp)) HorizontalDivider(color = MaterialTheme.colorScheme.outline) Spacer(modifier = Modifier.height(18.dp)) @@ -484,3 +540,12 @@ private fun manifestSummary(manifest: AddonManifest): String { } } } + +private fun String.toConfigureUrl(): String { + val base = substringBefore("?").trimEnd('/') + return if (base.endsWith("/manifest.json")) { + base.removeSuffix("/manifest.json") + "/configure" + } else { + "$base/configure" + } +} From 5fb414ea2f6286f728bb07b84bd70725be59e182 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Fri, 24 Apr 2026 02:26:04 +0530 Subject: [PATCH 018/143] bump version --- iosApp/Configuration/Version.xcconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iosApp/Configuration/Version.xcconfig b/iosApp/Configuration/Version.xcconfig index c593677b..a8260160 100644 --- a/iosApp/Configuration/Version.xcconfig +++ b/iosApp/Configuration/Version.xcconfig @@ -1,3 +1,3 @@ -CURRENT_PROJECT_VERSION=37 -MARKETING_VERSION=0.1.6 +CURRENT_PROJECT_VERSION=38 +MARKETING_VERSION=0.1.7 From 23080c4344641e43ef830e7b479bfb5d3f65fbe3 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sat, 25 Apr 2026 07:25:24 +0530 Subject: [PATCH 019/143] feat: localization --- composeApp/build.gradle.kts | 1 + .../src/androidMain/AndroidManifest.xml | 1 + .../kotlin/com/nuvio/app/MainActivity.kt | 5 +- .../DownloadsLiveStatusPlatform.android.kt | 25 +- .../DownloadsPlatformDownloader.android.kt | 25 +- ...sodeReleaseNotificationPlatform.android.kt | 9 +- .../features/player/PlayerEngine.android.kt | 10 +- .../settings/ThemeSettingsStorage.android.kt | 25 +- .../src/androidMain/res/values-es/strings.xml | 4 + .../src/androidMain/res/values-v31/themes.xml | 4 +- .../src/androidMain/res/values/themes.xml | 2 +- .../src/androidMain/res/xml/locale_config.xml | 5 + .../composeResources/values-es/strings.xml | 1043 +++++++++++++++++ .../composeResources/values/strings.xml | 1043 +++++++++++++++++ .../commonMain/kotlin/com/nuvio/app/App.kt | 77 +- .../com/nuvio/app/core/auth/AuthRepository.kt | 10 +- .../app/core/format/ReleaseDateDisplay.kt | 17 +- .../nuvio/app/core/i18n/LocalizedUiText.kt | 141 +++ .../kotlin/com/nuvio/app/core/ui/AppTheme.kt | 37 +- .../nuvio/app/core/ui/ContinueWatchingText.kt | 26 + .../com/nuvio/app/core/ui/NuvioComponents.kt | 10 +- .../ui/NuvioContinueWatchingActionSheet.kt | 18 +- .../nuvio/app/core/ui/NuvioFloatingPrompt.kt | 5 +- .../app/core/ui/NuvioNetworkOfflineCard.kt | 7 +- .../app/core/ui/NuvioPosterActionSheet.kt | 22 +- .../nuvio/app/core/ui/NuvioShelfComponents.kt | 8 +- .../app/core/ui/TraktListPickerDialog.kt | 16 +- .../nuvio/app/features/addons/AddonModels.kt | 9 +- .../app/features/addons/AddonRepository.kt | 12 +- .../nuvio/app/features/addons/AddonsScreen.kt | 98 +- .../com/nuvio/app/features/auth/AuthScreen.kt | 50 +- .../app/features/catalog/CatalogRepository.kt | 6 +- .../app/features/catalog/CatalogScreen.kt | 6 +- .../collection/CollectionEditorRepository.kt | 11 +- .../collection/CollectionEditorScreen.kt | 142 ++- .../collection/CollectionManagementScreen.kt | 62 +- .../features/collection/CollectionModels.kt | 2 +- .../collection/CollectionRepository.kt | 69 +- .../collection/FolderDetailRepository.kt | 27 +- .../features/collection/FolderDetailScreen.kt | 15 +- .../app/features/details/MetaDetailsParser.kt | 11 +- .../features/details/MetaDetailsRepository.kt | 6 +- .../app/features/details/MetaDetailsScreen.kt | 41 +- .../details/MetaScreenSettingsRepository.kt | 55 +- .../features/details/PersonDetailScreen.kt | 37 +- .../details/TmdbEntityBrowseScreen.kt | 35 +- .../details/components/CommentDetailSheet.kt | 16 +- .../details/components/DetailActionButtons.kt | 8 +- .../components/DetailAdditionalInfoSection.kt | 26 +- .../details/components/DetailCastSection.kt | 4 +- .../components/DetailCommentsSection.kt | 18 +- .../components/DetailFloatingHeader.kt | 10 +- .../features/details/components/DetailHero.kt | 4 +- .../details/components/DetailMetaInfo.kt | 19 +- .../components/DetailProductionSection.kt | 8 +- .../details/components/DetailSeriesContent.kt | 35 +- .../components/DetailTrailersSection.kt | 14 +- .../components/EpisodeWatchedActionSheet.kt | 27 +- .../details/components/TrailerPlayerPopup.kt | 10 +- .../app/features/downloads/DownloadsModels.kt | 45 +- .../features/downloads/DownloadsRepository.kt | 5 +- .../app/features/downloads/DownloadsScreen.kt | 64 +- .../features/home/HomeCatalogDefinitions.kt | 18 +- .../home/HomeCatalogSettingsRepository.kt | 5 +- .../com/nuvio/app/features/home/HomeScreen.kt | 41 +- .../components/HomeContinueWatchingSection.kt | 24 +- .../home/components/HomeHeroSection.kt | 4 +- .../app/features/library/LibraryRepository.kt | 8 +- .../app/features/library/LibraryScreen.kt | 36 +- .../EpisodeReleaseNotificationsModels.kt | 37 +- .../EpisodeReleaseNotificationsRepository.kt | 16 +- .../app/features/player/AudioTrackModal.kt | 10 +- .../app/features/player/PlayerControls.kt | 41 +- .../features/player/PlayerEpisodesPanel.kt | 46 +- .../player/PlayerLanguagePreferences.kt | 285 +++-- .../nuvio/app/features/player/PlayerLayout.kt | 13 +- .../app/features/player/PlayerOverlays.kt | 34 +- .../nuvio/app/features/player/PlayerScreen.kt | 46 +- .../app/features/player/PlayerSourcesPanel.kt | 16 +- .../features/player/SubtitleAudioModels.kt | 106 +- .../app/features/player/SubtitleModal.kt | 24 +- .../app/features/player/SubtitleRepository.kt | 7 +- .../app/features/player/SubtitleStylePanel.kt | 19 +- .../features/player/skip/NextEpisodeCard.kt | 34 +- .../features/player/skip/SkipIntroButton.kt | 22 +- .../app/features/profiles/PinEntryDialog.kt | 14 +- .../features/profiles/ProfileEditScreen.kt | 86 +- .../features/profiles/ProfileRepository.kt | 21 +- .../profiles/ProfileSelectionScreen.kt | 16 +- .../features/profiles/ProfileSwitcherTab.kt | 23 +- .../features/search/SearchDiscoverContent.kt | 51 +- .../app/features/search/SearchRepository.kt | 11 +- .../nuvio/app/features/search/SearchScreen.kt | 54 +- .../features/settings/AccountSettingsPage.kt | 53 +- .../app/features/settings/AppLanguage.kt | 20 + .../settings/AppearanceSettingsPage.kt | 145 ++- .../settings/ContentDiscoverySettingsPage.kt | 38 +- .../settings/ContinueWatchingSettingsPage.kt | 57 +- .../settings/HomescreenSettingsPage.kt | 68 +- .../settings/IntegrationsSettingsPage.kt | 17 +- .../features/settings/MdbListSettingsPage.kt | 58 +- .../settings/MetaScreenSettingsPage.kt | 129 +- .../settings/NotificationsSettingsPage.kt | 44 +- .../features/settings/PlaybackSettingsPage.kt | 444 +++---- .../PosterCustomizationSettingsPage.kt | 77 +- .../features/settings/SettingsComponents.kt | 44 +- .../settings/SettingsFullScreenPages.kt | 20 +- .../app/features/settings/SettingsModels.kt | 66 +- .../app/features/settings/SettingsRootPage.kt | 87 +- .../app/features/settings/SettingsScreen.kt | 28 +- .../settings/SupportersContributorsPage.kt | 86 +- .../settings/ThemeSettingsRepository.kt | 15 + .../features/settings/ThemeSettingsStorage.kt | 3 + .../app/features/settings/TmdbSettingsPage.kt | 112 +- .../features/settings/TraktSettingsPage.kt | 59 +- .../app/features/streams/StreamModels.kt | 6 +- .../app/features/streams/StreamsRepository.kt | 4 +- .../app/features/streams/StreamsScreen.kt | 61 +- .../features/streams/StreamsTabletLayout.kt | 14 +- .../app/features/tmdb/TmdbMetadataService.kt | 38 +- .../app/features/trakt/TraktAuthRepository.kt | 21 +- .../features/trakt/TraktCommentsRepository.kt | 5 +- .../features/trakt/TraktLibraryRepository.kt | 9 +- .../features/trakt/TraktProgressRepository.kt | 7 +- .../nuvio/app/features/updater/AppUpdater.kt | 86 +- .../watching/domain/SeriesContinuity.kt | 22 +- .../watchprogress/WatchProgressModels.kt | 33 +- .../settings/ThemeSettingsStorage.ios.kt | 14 +- 128 files changed, 5205 insertions(+), 1556 deletions(-) create mode 100644 composeApp/src/androidMain/res/values-es/strings.xml create mode 100644 composeApp/src/androidMain/res/xml/locale_config.xml create mode 100644 composeApp/src/commonMain/composeResources/values-es/strings.xml create mode 100644 composeApp/src/commonMain/composeResources/values/strings.xml create mode 100644 composeApp/src/commonMain/kotlin/com/nuvio/app/core/i18n/LocalizedUiText.kt create mode 100644 composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/ContinueWatchingText.kt create mode 100644 composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index ca333a1c..51f0d145 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -219,6 +219,7 @@ kotlin { } androidMain.dependencies { implementation(libs.compose.uiToolingPreview) + implementation(libs.androidx.appcompat) implementation(libs.androidx.activity.compose) implementation(libs.androidx.core.splashscreen) implementation(libs.androidx.work.runtime) diff --git a/composeApp/src/androidMain/AndroidManifest.xml b/composeApp/src/androidMain/AndroidManifest.xml index a4b48672..dc8f0964 100644 --- a/composeApp/src/androidMain/AndroidManifest.xml +++ b/composeApp/src/androidMain/AndroidManifest.xml @@ -10,6 +10,7 @@ android:label="@string/app_name" android:usesCleartextTraffic="true" android:roundIcon="@mipmap/ic_launcher_round" + android:localeConfig="@xml/locale_config" android:supportsRtl="true" android:theme="@style/Theme.Nuvio"> "Paused $detail" - DownloadStatus.Failed -> item.errorMessage?.takeIf { it.isNotBlank() } ?: "Download failed" - DownloadStatus.Completed -> "Download completed" + DownloadStatus.Paused -> runBlocking { getString(Res.string.downloads_live_paused, detail) } + DownloadStatus.Failed -> item.errorMessage?.takeIf { it.isNotBlank() } ?: runBlocking { getString(Res.string.downloads_live_failed) } + DownloadStatus.Completed -> runBlocking { getString(Res.string.downloads_live_completed) } } } @@ -224,8 +225,12 @@ internal actual object DownloadsLiveStatusPlatform { if (manager.getNotificationChannel(channelId) != null) return manager.createNotificationChannel( - NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_LOW).apply { - description = channelDescription + NotificationChannel( + channelId, + runBlocking { getString(Res.string.downloads_channel_name) }, + NotificationManager.IMPORTANCE_LOW, + ).apply { + description = runBlocking { getString(Res.string.downloads_channel_description) } }, ) } diff --git a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.android.kt b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.android.kt index e1e3b60d..502c14b1 100644 --- a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.android.kt +++ b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.android.kt @@ -8,9 +8,12 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.ensureActive import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import okhttp3.Call import okhttp3.OkHttpClient import okhttp3.Request +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString import java.io.File import java.io.FileOutputStream import java.net.URI @@ -44,7 +47,7 @@ internal actual object DownloadsPlatformDownloader { scope.launch { val context = appContext if (context == null) { - onFailure("Download system is not initialized") + onFailure(runBlocking { getString(Res.string.downloads_error_not_initialized) }) return@launch } @@ -69,7 +72,9 @@ internal actual object DownloadsPlatformDownloader { var attemptedRangeRequest = resumeFromBytes > 0L var httpRequest = buildRequest(if (attemptedRangeRequest) resumeFromBytes else null) call = downloadHttpClient.newCall(httpRequest) - var response = call?.execute() ?: error("Download request failed") + var response = call?.execute() ?: error( + runBlocking { getString(Res.string.downloads_error_request_failed) }, + ) if (attemptedRangeRequest && response.code == 416) { response.close() @@ -78,12 +83,18 @@ internal actual object DownloadsPlatformDownloader { attemptedRangeRequest = false httpRequest = buildRequest(null) call = downloadHttpClient.newCall(httpRequest) - response = call?.execute() ?: error("Download request failed") + response = call?.execute() ?: error( + runBlocking { getString(Res.string.downloads_error_request_failed) }, + ) } response.use { response -> if (!response.isSuccessful) { - error("Request failed with HTTP ${response.code}") + error( + runBlocking { + getString(Res.string.downloads_error_http_failed, response.code) + }, + ) } val isPartialResume = attemptedRangeRequest && response.code == 206 && resumeFromBytes > 0L @@ -94,7 +105,9 @@ internal actual object DownloadsPlatformDownloader { tempFile.delete() } - val body = response.body ?: error("Empty response body") + val body = response.body ?: error( + runBlocking { getString(Res.string.downloads_error_empty_body) }, + ) val totalBytes = resolveTotalBytes( startingBytes = startingBytes, isPartialResume = isPartialResume, @@ -131,7 +144,7 @@ internal actual object DownloadsPlatformDownloader { onSuccess(destination.toURI().toString(), totalBytes ?: finalSize) } } catch (error: Throwable) { - onFailure(error.message ?: "Download failed") + onFailure(error.message ?: runBlocking { getString(Res.string.download_failed) }) } } diff --git a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationPlatform.android.kt b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationPlatform.android.kt index cee05234..9fe424a1 100644 --- a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationPlatform.android.kt +++ b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationPlatform.android.kt @@ -23,6 +23,9 @@ import androidx.work.WorkManager import io.ktor.client.HttpClient import io.ktor.client.call.body import io.ktor.client.engine.android.Android +import kotlinx.coroutines.runBlocking +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString import io.ktor.client.plugins.HttpTimeout import io.ktor.client.request.get import java.time.LocalDate @@ -285,13 +288,13 @@ internal actual object EpisodeReleaseNotificationPlatform { val channel = NotificationChannel( channelId, - "Episode Releases", + runBlocking { getString(Res.string.notifications_channel_episode_releases_name) }, NotificationManager.IMPORTANCE_DEFAULT, ).apply { - description = "Alerts when a saved show's new episode is released." + description = runBlocking { getString(Res.string.notifications_channel_episode_releases_description) } } notificationManager.createNotificationChannel(channel) } private fun uniqueWorkName(requestId: String): String = "$workTag:$requestId" -} \ No newline at end of file +} diff --git a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/player/PlayerEngine.android.kt b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/player/PlayerEngine.android.kt index bcf964c8..b6f7be0c 100644 --- a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/player/PlayerEngine.android.kt +++ b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/player/PlayerEngine.android.kt @@ -23,6 +23,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.platform.LocalContext import androidx.lifecycle.Lifecycle +import kotlinx.coroutines.runBlocking +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.media3.common.C @@ -184,7 +187,7 @@ actual fun PlatformPlayerSurface( val listener = object : Player.Listener { override fun onPlayerError(error: PlaybackException) { - latestOnError.value(error.localizedMessage ?: "Unable to play this stream.") + latestOnError.value(error.localizedMessage ?: runBlocking { getString(Res.string.player_unable_to_play_stream) }) } override fun onPlaybackStateChanged(playbackState: Int) { @@ -585,7 +588,10 @@ private fun ExoPlayer.extractAudioTracks(): List { else -> null } val resolvedLanguage = format.language?.let { lang -> Locale(lang).displayLanguage.takeIf { name -> name.isNotBlank() && name != lang } } - val baseName = format.label?.takeIf { it.isNotBlank() } ?: resolvedLanguage ?: format.language ?: "Track ${idx + 1}" + val baseName = format.label?.takeIf { it.isNotBlank() } + ?: resolvedLanguage + ?: format.language + ?: runBlocking { getString(Res.string.compose_player_track_number, idx + 1) } val suffix = listOfNotNull(channelLabel, codecLabel) .joinToString(" ") .let { if (it.isNotBlank()) " ($it)" else "" } diff --git a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.android.kt b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.android.kt index aa0002f9..32e659c1 100644 --- a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.android.kt +++ b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.android.kt @@ -2,6 +2,8 @@ package com.nuvio.app.features.settings import android.content.Context import android.content.SharedPreferences +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.os.LocaleListCompat import com.nuvio.app.core.sync.decodeSyncBoolean import com.nuvio.app.core.sync.decodeSyncString import com.nuvio.app.core.sync.encodeSyncBoolean @@ -15,12 +17,14 @@ actual object ThemeSettingsStorage { private const val preferencesName = "nuvio_theme_settings" private const val selectedThemeKey = "selected_theme" private const val amoledEnabledKey = "amoled_enabled" - private val syncKeys = listOf(selectedThemeKey, amoledEnabledKey) + private const val selectedAppLanguageKey = "selected_app_language" + private val syncKeys = listOf(selectedThemeKey, amoledEnabledKey, selectedAppLanguageKey) private var preferences: SharedPreferences? = null fun initialize(context: Context) { preferences = context.getSharedPreferences(preferencesName, Context.MODE_PRIVATE) + applySelectedAppLanguage(loadSelectedAppLanguage() ?: AppLanguage.ENGLISH.code) } actual fun loadSelectedTheme(): String? = @@ -46,9 +50,26 @@ actual object ThemeSettingsStorage { ?.apply() } + actual fun loadSelectedAppLanguage(): String? = + preferences?.getString(ProfileScopedKey.of(selectedAppLanguageKey), null) + + actual fun saveSelectedAppLanguage(languageCode: String) { + preferences + ?.edit() + ?.putString(ProfileScopedKey.of(selectedAppLanguageKey), languageCode) + ?.apply() + } + + actual fun applySelectedAppLanguage(languageCode: String) { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.forLanguageTags(languageCode), + ) + } + actual fun exportToSyncPayload(): JsonObject = buildJsonObject { loadSelectedTheme()?.let { put(selectedThemeKey, encodeSyncString(it)) } loadAmoledEnabled()?.let { put(amoledEnabledKey, encodeSyncBoolean(it)) } + loadSelectedAppLanguage()?.let { put(selectedAppLanguageKey, encodeSyncString(it)) } } actual fun replaceFromSyncPayload(payload: JsonObject) { @@ -58,5 +79,7 @@ actual object ThemeSettingsStorage { payload.decodeSyncString(selectedThemeKey)?.let(::saveSelectedTheme) payload.decodeSyncBoolean(amoledEnabledKey)?.let(::saveAmoledEnabled) + payload.decodeSyncString(selectedAppLanguageKey)?.let(::saveSelectedAppLanguage) + applySelectedAppLanguage(loadSelectedAppLanguage() ?: AppLanguage.ENGLISH.code) } } diff --git a/composeApp/src/androidMain/res/values-es/strings.xml b/composeApp/src/androidMain/res/values-es/strings.xml new file mode 100644 index 00000000..f5bd09e2 --- /dev/null +++ b/composeApp/src/androidMain/res/values-es/strings.xml @@ -0,0 +1,4 @@ + + + Nuvio + diff --git a/composeApp/src/androidMain/res/values-v31/themes.xml b/composeApp/src/androidMain/res/values-v31/themes.xml index 28ee2797..97bab989 100644 --- a/composeApp/src/androidMain/res/values-v31/themes.xml +++ b/composeApp/src/androidMain/res/values-v31/themes.xml @@ -1,6 +1,6 @@ - @@ -9,4 +9,4 @@ @drawable/ic_splash_logo @style/Theme.Nuvio - \ No newline at end of file + diff --git a/composeApp/src/androidMain/res/values/themes.xml b/composeApp/src/androidMain/res/values/themes.xml index 309123d3..91536bd1 100644 --- a/composeApp/src/androidMain/res/values/themes.xml +++ b/composeApp/src/androidMain/res/values/themes.xml @@ -1,6 +1,6 @@ - diff --git a/composeApp/src/androidMain/res/xml/locale_config.xml b/composeApp/src/androidMain/res/xml/locale_config.xml new file mode 100644 index 00000000..98f6f9a3 --- /dev/null +++ b/composeApp/src/androidMain/res/xml/locale_config.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/composeApp/src/commonMain/composeResources/values-es/strings.xml b/composeApp/src/commonMain/composeResources/values-es/strings.xml new file mode 100644 index 00000000..421b1531 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/values-es/strings.xml @@ -0,0 +1,1043 @@ + + Reconocimiento abierto y créditos del proyecto + Atrás + Cancelar + Cerrar + Eliminar + Listo + Editar + Importar + Siguiente + Aceptar + Reproducir + Anterior + Eliminar + Reordenar + Restablecer + Reanudar + Reintentar + Guardar + Instalando + Complementos + Activo + %1$d catálogos + Configurable + Actualizando + %1$d recursos + No disponible + Configurar complemento + Eliminar complemento + Agrega una URL de manifiesto para empezar a cargar catálogos, metadatos, streams o subtítulos en Nuvio. + Aún no hay complementos instalados. + Introduce una URL de complemento. + URL del complemento + Instalar complemento + Cargando detalles del manifiesto... + Validando la URL del manifiesto y cargando los detalles del complemento antes de instalar. + Comprobando complemento + Error de instalación + %1$s se validó y añadió correctamente. + Complemento instalado + Mover complemento abajo + Mover complemento arriba + Activo + Complementos + Catálogos + Actualizar complemento + Añadir complemento + Complementos instalados + Resumen + %1$d reglas de ID + Versión %1$s + Seleccionado + Copiar JSON + %1$d colección(es), %2$d carpeta(s) + ¿Eliminar "%1$s"? Esto no se puede deshacer. + Eliminar colección + Añadir catálogo + Añadir carpeta + Todos los géneros + Añade catálogos de tus complementos instalados para definir qué muestra esta carpeta. + Aún no hay fuentes de catálogo + Elegir + Emoji + URL de imagen + Ninguna + Portada + Crear colección + Listo + Editar colección + Editar carpeta + Configura la identidad, presentación y fuentes de catálogo de la carpeta con la misma estructura que el editor principal de colecciones. + Añade una para empezar. + Aún no hay carpetas + Carpetas + Filtro de género + Mostrar solo la imagen de portada + Ocultar título + Nueva carpeta + Muestra esta colección por encima de todos los catálogos normales del inicio. Varias colecciones fijadas siguen el orden de creación. + Fijar sobre los catálogos + URL de imagen de fondo (opcional) + Nombre de la carpeta + URL de GIF animado (solo se reproduce al enfocarse) + Nombre de la colección + Guardar cambios + Guardar + Apariencia + Básicos + Fuentes de catálogo + Elige los catálogos del complemento que debe agrupar esta carpeta. + Seleccionar catálogos + Seleccionar género + Póster + Cuadrado + Panorámico + Combinar todos los catálogos en una sola pestaña + Mostrar pestaña "Todo" + Reproducir el GIF configurado en lugar de la portada estática cuando esté disponible. + Mostrar GIF cuando esté configurado + %1$d fuente(s) · %2$s + Forma del mosaico + Filas + Pestañas + Modo de vista + Crea una para organizar tus catálogos. + Aún no hay colecciones + %1$d carpeta(s) + No se encontraron elementos + Carpeta no encontrada + Colecciones + Importar colecciones + JSON + Pega abajo el JSON de tus colecciones. + Importar + Nueva colección + Fijado + Todo + Tus colecciones + Hecho con ❤️ por Tapframe y amigos + Versión %1$s (%2$s) + Desactivado + Activado + Pausar + Recargar + ¿Ya tienes una cuenta? + Continuar sin cuenta + Crear cuenta + ¿No tienes una cuenta? + Correo electrónico + o + Contraseña + Inicia sesión para acceder a tu biblioteca y progreso + Iniciar sesión + Regístrate para sincronizar tus datos entre dispositivos + Registrarse + Tus datos solo se almacenarán localmente + Transmite todo, en todas partes + Bienvenido de nuevo + Biblioteca + Biblioteca de Trakt + Inicio + Biblioteca + Perfil + Buscar + Pistas de audio + Audio + Integrado + Desplazamiento inferior + Cerrar reproductor + Color + Reproduciendo ahora + E%1$d + S%1$dE%2$d + S%1$dE%2$d • %3$s + Episodios + Tamaño de fuente + %1$dsp + Bloquear controles del reproductor + No hay pistas de audio disponibles + No hay episodios disponibles + No se encontraron streams + Ninguno + Contorno + Episodios + Fuentes + Streams + Error de reproducción + Reproduciendo + Toca para buscar subtítulos + Volver + Restablecer valores predeterminados + Rellenar + Ajustar + Zoom + Retroceder 10 segundos + -%1$ds + +%1$ds + -%1$ds + +%1$ds + Avanzar 10 segundos + Fuentes + Estilo + Subs + Subtítulos + Brillo %1$d%% + Volumen %1$d%% + Silenciado + Descargado + Se emite + Por confirmar + Toca para desbloquear + Pista %1$d + Desbloquear controles del reproductor + Estás viendo + Añadir perfil + Borrar búsqueda + Descubrir + Los complementos instalados no devolvieron resultados de búsqueda válidos. + La búsqueda falló + Instala y valida al menos un complemento antes de buscar. + No hay complementos activos + Los catálogos instalados no devolvieron coincidencias para esta consulta. + No se encontraron resultados + Tus complementos instalados no exponen búsqueda de catálogo. + No hay catálogos de búsqueda + Buscar películas, series... + Búsquedas recientes + Eliminar búsqueda reciente + Acerca de + General + Cuenta + Complementos + Apariencia + Contenido y descubrimiento + Seguir viendo + Pantalla de inicio + Integraciones + Calificaciones de MDBList + Pantalla meta + Notificaciones + Reproducción + Plugins + Personalización de póster + Configuración + Patrocinadores y colaboradores + Enriquecimiento TMDB + Trakt + ACERCA DE + Administra tu cuenta, cierra sesión o elimínala. + CUENTA + Ajusta la presentación de inicio y las preferencias visuales. + Buscar nuevas versiones de la app. + Buscar actualizaciones + Administra complementos y fuentes de descubrimiento. + Administra tus películas y episodios descargados. + Descargas + GENERAL + Conecta los servicios TMDB y MDBList. + Administra alertas de estreno de episodios y envía una notificación de prueba. + Cambiar a un perfil diferente. + Cambiar perfil + Conecta Trakt, sincroniza listas y guarda títulos directamente en Trakt. + Cargando tus listas de Trakt… + Elige dónde guardar este título en Trakt + Donar + Ir a detalles + Eliminar + Empezar desde el principio + Reproducir + %1$d/10 + Reseña + Spoiler + Aún no hay reseñas de Trakt. + %1$d me gusta + Este comentario contiene spoilers. + Este comentario contiene spoilers y se ha ocultado. + Comentarios + Tráiler + %1$s (%2$d) + Tráilers + No hay episodios completados + Aún no hay descargas + %1$d episodio(s) descargado(s) + Activas + Películas + Series + Mostrar descargas + Completado • %1$s + Descargando • %1$s + Falló + Pausado • %1$s + Visto + Temporada %1$d + Especiales + Continuar donde lo dejaste + Añadir a la biblioteca + Marcar como no visto + Marcar como visto + Eliminar de la biblioteca + Ver todo + Reproducir manualmente + Logo de %1$s + Cuenta + Eliminar cuenta + Esto eliminará permanentemente tu cuenta y todos los datos asociados. + Esta acción no se puede deshacer. Todos tus datos, perfiles e historial de sincronización se eliminarán permanentemente. + ¿Eliminar cuenta? + Correo electrónico + Sin iniciar sesión + Cerrar sesión + Volverás a la pantalla de inicio de sesión. + ¿Cerrar sesión? + Estado + Anónimo + Sesión iniciada + Negro AMOLED + Usa fondos negros puros para pantallas OLED. + Idioma de la app + Elegir idioma + Muestra, oculta y ajusta el estante de Seguir viendo. + Ajusta el ancho compartido de las tarjetas de póster y los radios de esquina. + PANTALLA + INICIO + TEMA + Colección • %1$s + Nombre visible + Instala un complemento con catálogos compatibles con tableros para configurar las filas de la pantalla de inicio. + No hay catálogos de inicio + Fuente del Hero + Oculto + Mantener Inicio enfocado + %1$s • Límite alcanzado (máx. %2$d) + No hay fuentes Hero seleccionadas + No está en Hero + Quita fijar arriba de la colección para moverla + Fijado + Fijado arriba + Reordenar + CATÁLOGOS + CATÁLOGOS Y COLECCIONES + COLECCIONES + HERO + FUENTES DEL HERO + %1$d de %2$d seleccionados + Mostrar Hero + Mostrar un carrusel Hero destacado en la parte superior del inicio. Elige hasta 2 catálogos fuente abajo. + %1$d de %2$d catálogos visibles • %3$d fuentes Hero seleccionadas + Abre un catálogo solo cuando necesites cambiarle el nombre o reordenarlo. + Visible + Reproductor, subtítulos y reproducción automática + Radio de tarjeta + ESTILO DE TARJETA DE PÓSTER + Ancho de tarjeta + Personalizado + Personaliza el ancho de la tarjeta y el radio de las esquinas para las tarjetas de póster compartidas en toda la app. + Ocultar etiquetas + Modo horizontal para pósters en estantes + Vista previa en vivo + %1$s (%2$s) + Radio de esquina: %1$ddp + Altura: %1$ddp + Ancho: %1$ddp + Clásico + Píldora + Redondeado + Marcado + Sutil + Equilibrado + Cómodo + Compacto + Denso + Grande + Estándar + Mostrar un aviso para continuar donde lo dejaste al abrir la app después de salir del reproductor. + Aviso para reanudar al iniciar + ESTILO DE TARJETA + AL INICIAR + COMPORTAMIENTO DE SIGUIENTE + VISIBILIDAD + Mostrar el estante de Seguir viendo en la pantalla de inicio. + Mostrar Seguir viendo + Póster + Tarjeta de póster centrada en la portada + Panorámica + Tarjeta horizontal rica en información + Cuando está activado, Siguiente siempre continúa desde el episodio más avanzado visto. Cuando está desactivado, sigue el episodio visto más recientemente. Útil si vuelves a ver episodios anteriores. + Siguiente desde el episodio más avanzado + INICIO + FUENTES + Instala, elimina, actualiza y ordena tus fuentes de contenido. + Instala repositorios de scrapers en JavaScript y prueba proveedores internamente. + Controla qué catálogos aparecen en Inicio y en qué orden. + Desactiva secciones de detalles y reordena todo debajo del Hero. + Crea agrupaciones de catálogos personalizadas con carpetas mostradas en Inicio. + INTEGRACIONES + Mejora las páginas de detalles con arte, créditos, metadatos de episodios y más desde TMDB. + Añade calificaciones externas de IMDb, Rotten Tomatoes, Metacritic y otras a las páginas de detalles. + Añade tu clave API de MDBList abajo antes de activar las calificaciones. + Obtén una clave en https://mdblist.com/preferences y pégala aquí. + Clave API + Clave API de MDBList + Activar calificaciones de MDBList + Mostrar calificaciones externas de MDBList en páginas de metadatos cuando haya un ID de IMDb disponible. + CLAVE API + PROVEEDORES DE CALIFICACIÓN + MDBLIST + Acciones + Controles de reproducción y guardado. + Reparto + Lista principal de reparto. + Fondo cinematográfico + Fondo desenfocado detrás del contenido, similar a la pantalla de streams. + Colección + Carril de colección o franquicia relacionada. + Comentarios + Sección de comentarios de Trakt. + Detalles + Duración, estado, estreno, idioma e información relacionada. + Tarjetas de episodios + Elige cómo se muestran los episodios en la pantalla de metadatos. + Horizontal + Tarjetas en fila estilo fondo + Lista + Tarjetas apiladas centradas en detalles + Episodios + Temporadas y lista de episodios para series. + Grupo %1$d + Más como esto + Carril de recomendaciones. + Ninguno + Resumen + Sinopsis, calificaciones, géneros y créditos principales. + Producción + Estudios y cadenas. + APARIENCIA + SECCIONES + Grupo de pestañas %1$d + Diseño de pestañas + Agrupa secciones en pestañas como en la app de TV. Asigna hasta 3 secciones por grupo de pestañas. + Tráilers + Carril de tráilers y atajos de reproducción. + Las notificaciones están actualmente desactivadas en Nuvio. + Alertas de estreno de episodios + Programa notificaciones locales cuando haya disponible un nuevo episodio de una serie guardada. + Las notificaciones del sistema están desactivadas para Nuvio. Actívalas para recibir alertas y notificaciones de prueba. + Actualmente hay %1$d alertas de estreno programadas en este dispositivo. + ALERTAS + PRUEBA + Enviar notificación de prueba + Enviando notificación de prueba... + Enviar una notificación local de prueba para %1$s. + Guarda primero una serie en tu biblioteca para probar las notificaciones. + Notificación de prueba + Comunidad + Mira a las personas que construyen y apoyan Nuvio en Mobile, TV y Web. + La API de patrocinadores no está configurada. Agrega DONATIONS_BASE_URL a local.properties. + Colaboradores + Patrocinadores + Abrir GitHub + Perfil de GitHub no disponible + No hay mensaje adjunto. + Cargando colaboradores... + Cargando patrocinadores... + No se pudieron cargar los colaboradores + No se pudieron cargar los patrocinadores + No se encontraron colaboradores. + No se encontraron patrocinadores. + No se pudieron cargar los colaboradores. + No se pudieron cargar los patrocinadores. + No se pudieron cargar los colaboradores en este momento. + No se pudieron cargar los patrocinadores en este momento. + %1$d commits totales + Ene + Feb + Mar + Abr + May + Jun + Jul + Ago + Sep + Oct + Nov + Dic + %2$s de %1$s de %3$s + Todos los complementos + Todos los plugins + Complementos permitidos + Plugins permitidos + Anime Skip + ID de cliente de AnimeSkip + Introduce tu ID de cliente API de AnimeSkip. Obtén uno en anime-skip.com. + Buscar también marcas de salto en AnimeSkip (requiere ID de cliente). + Reproducción automática del siguiente episodio + Buscar y reproducir automáticamente el siguiente episodio cuando se alcance el umbral. + Solo dispositivo + Preferir app (FFmpeg) + Preferir dispositivo + Prioridad del decodificador + Toca afuera para cerrar + Toca afuera para guardar y cerrar + %1$d día + %1$d días + %1$d hora + %1$d horas + Activar libass + Usar libass para renderizar subtítulos ASS/SSA en lugar del renderizador predeterminado. + Velocidad al mantener + Mantener para acelerar + Mantén pulsado en cualquier parte de la superficie del reproductor para aumentar temporalmente la velocidad. + Patrón regex no válido + Duración de caché del último enlace + Mapear DV7 a HEVC + Usar Dolby Vision Perfil 7 a HEVC como alternativa para dispositivos no compatibles. + Minutos antes del final + Mostrar la tarjeta del siguiente episodio esta cantidad de minutos antes del final. + %1$d min + No hay elementos disponibles + No establecido + Predeterminado + Idioma del dispositivo + Forzado + Ninguno + Preferir grupo binge + Al reproducir automáticamente, preferir un stream del mismo grupo binge que el actual. + Idioma de audio preferido + Idioma de subtítulos preferido + Preajustes + Coincide con nombre del stream, etiqueta, descripción, complemento y URL. + Patrón regex + 4K|2160p|Remux + Cualquier 1080p+ + AVC / x264 + Calidad BluRay + Dolby Atmos / DTS + Inglés + HDR / Dolby Vision + HEVC / x265 + Sin CAM/TS + Sin REMUX/HDR + 1080p estándar + 4K / Remux + 720p / más pequeño + Fuentes WEB + Tipo de renderizado + Estándar (Cues) + Canvas con efectos + OpenGL con efectos + Canvas superpuesto + OpenGL superpuesto + Reutilizar último enlace + Reproducir automáticamente tu último stream funcional para esta misma película/episodio cuando la caché siga siendo válida. + Idioma de audio secundario + Idioma de subtítulos secundario + DECODIFICADOR + SIGUIENTE EPISODIO + REPRODUCTOR + SALTAR SEGMENTOS + REPRODUCCIÓN AUTOMÁTICA DE STREAMS + SELECCIÓN DE STREAM + SUBTÍTULOS Y AUDIO + RENDERIZADO DE SUBTÍTULOS + %1$d seleccionados + Mostrar superposición de carga + Mostrar la superposición de carga inicial mientras empieza a reproducirse un stream. + Saltar intro/outro/resumen + Mostrar botón de salto durante segmentos detectados de intro, outro y resumen. + Ámbito de fuentes + Todos los complementos + Considerar streams de todos los complementos instalados. + Todas las fuentes + Considerar streams tanto de complementos como de plugins. + Solo plugins habilitados + Considerar solo streams de plugins habilitados. + Solo complementos instalados + Considerar solo streams de complementos instalados. + Modo de selección de stream + Primer stream disponible + Reproducir automáticamente el primer stream encontrado. + Manual + Seleccionar streams manualmente cada vez. + Coincidencia regex + Seleccionar automáticamente un stream que coincida con un patrón regex. + Tiempo de espera del stream + Cuánto esperar por los streams antes de autoseleccionar. + Minutos antes del final + Modo de umbral + Minutos antes del final + Porcentaje + Porcentaje de umbral + Mostrar la tarjeta del siguiente episodio cuando la reproducción alcance este porcentaje. + %1$d%% + Instantáneo + %1$ds + Ilimitado + Reproducción tunneled + Activa la reproducción tunneled para una menor latencia en la sincronización de audio/video. + Añade tu propia clave API de TMDB abajo antes de activar el enriquecimiento. + Clave API de TMDB + Activar enriquecimiento TMDB + Usar tu clave API de TMDB para enriquecer metadatos del complemento en la pantalla de detalles cuando haya un ID de TMDB o IMDb disponible. + Introduce tu clave API v3 de TMDB. + Código de idioma + Arte + Reemplazar fondo, póster y logo con arte de TMDB. + Información básica + Usar título, sinopsis, géneros y calificación de TMDB. + Colecciones + Mostrar carriles de franquicia y colección para películas cuando TMDB los proporcione. + Créditos + Usar creadores, directores, guionistas y fotos del reparto de TMDB. + Detalles + Usar información de estreno, duración, clasificación por edad, estado, país e idioma de TMDB. + Episodios + Usar títulos, miniaturas, descripciones y duraciones de episodios de TMDB para series. + Más como esto + Mostrar recomendaciones de TMDB al final de las páginas de detalles. + Cadenas + Usar metadatos de cadenas de TMDB para títulos de TV. + Productoras + Usar metadatos de productoras de TMDB en la pantalla de detalles. + Pósters de temporada + Usar pósters de temporada de TMDB en el selector de temporadas de la pantalla de metadatos para series. + Tráilers + Obtener y mostrar la sección de vídeos de tráiler de TMDB en páginas de detalles. + Clave API personal + Idioma preferido + Configura el código de idioma de TMDB usado para metadatos localizados, por ejemplo `en`, `en-US` o `pt-BR`. + CREDENCIALES + LOCALIZACIÓN + MÓDULOS + TMDB + Después de aprobar, serás redirigido automáticamente. + AUTENTICACIÓN + Comentarios + Mostrar comentarios de Trakt en detalles de películas y series + Conectar Trakt + Conectado como %1$s + Usuario de Trakt + Desconectar + No se pudo abrir el navegador + FUNCIONES + Completa el inicio de sesión de Trakt en tu navegador + Haz seguimiento de lo que ves, guarda en tu lista o listas personalizadas y mantén tu biblioteca sincronizada con Trakt. + Faltan credenciales de Trakt en local.properties (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET). + Abrir inicio de sesión de Trakt + Tus acciones de Guardar ahora pueden apuntar a la watchlist de Trakt y a listas personales. + Inicia sesión con Trakt para habilitar el guardado basado en listas y el modo biblioteca de Trakt. + Calificación del público + IMDb + Letterboxd + Metacritic + Rotten Tomatoes + TMDB + Trakt + Desconocido + Ámbar + Carmesí + Esmeralda + Océano + Rosa + Violeta + Blanco + Siguiente episodio + Buscando fuente… + Reproduciendo vía %1$s en %2$d… + Miniatura del siguiente episodio + No emitido + Saltar + Saltar intro + Saltar outro + Saltar resumen + No se encontraron subtítulos + Afrikáans + Albanés + Amhárico + Árabe + Armenio + Azerbaiyano + Euskera + Bielorruso + Bengalí + Bosnio + Búlgaro + Birmano + Catalán + Chino + Chino (simplificado) + Chino (tradicional) + Croata + Checo + Danés + Neerlandés + Inglés + Estonio + Filipino + Finés + Francés + Gallego + Georgiano + Alemán + Griego + Guyaratí + Hebreo + Hindi + Húngaro + Islandés + Indonesio + Irlandés + Italiano + Japonés + Kannada + Kazajo + Jemer + Coreano + Lao + Letón + Lituano + Macedonio + Malayo + Malayalam + Maltés + Maratí + Mongol + Nepalí + Noruego + Persa + Polaco + Portugués (Portugal) + Portugués (Brasil) + Punyabí + Rumano + Ruso + Serbio + Cingalés + Eslovaco + Esloveno + Español + Español (Latinoamérica) + Suajili + Sueco + Tamil + Telugu + Tailandés + Turco + Ucraniano + Urdu + Uzbeko + Vietnamita + Galés + Zulú + Limpiar + Continuar + Ignorar + Instalar + Más tarde + No + Actualizar + + ¿Quieres salir de la app? + Salir de la app + Este catálogo no devolvió ningún elemento. + No se encontraron títulos + Comprueba tu conexión Wi‑Fi o de datos móviles e inténtalo de nuevo. + Director + No se pudo cargar + Más como esto + Temporadas + Este addon devolvió videos para la serie, pero ninguno incluía números de temporada o episodio. + Este addon no proporcionó metadatos de episodios para esta serie. + Este addon aún no ha publicado episodios. + Tu dispositivo está en línea, pero Nuvio no pudo conectarse a los servidores necesarios. + Mostrar menos + Mostrar más ▾ + Guionista + Todos los géneros + Catálogo + %1$s • %2$s + El catálogo seleccionado no devolvió elementos de descubrimiento. + No se pudo cargar Descubrir + Los addons instalados no exponen catálogos compatibles con el tablero para Descubrir. + No hay catálogos de descubrir + El catálogo y los filtros seleccionados no devolvieron ningún elemento. + No se encontraron títulos + Instala y valida al menos un addon antes de explorar catálogos en Descubrir. + Seleccionar catálogo + Seleccionar género + Seleccionar tipo + Tipo + Marcar anteriores como no vistos + Marcar anteriores como vistos + Marcar %1$s como no vista + Marcar %1$s como vista + Marcar como no visto + Marcar como visto + Siguiente + %1$d%% visto + Instala y valida al menos un addon antes de cargar filas de catálogo en Inicio. + Los addons instalados no exponen actualmente catálogos compatibles con el tablero sin extras requeridos. + No hay filas de inicio disponibles + Ver detalles + Controles para reproducir y guardar. + Acciones + Lista principal del reparto. + Fila de colección o franquicia relacionada. + Colección + Sección de comentarios de Trakt. + Duración, estado, fecha de estreno, idioma e información relacionada. + Detalles + Temporadas y lista de episodios para series. + Fila de recomendaciones. + Más como esto + Sinopsis, calificaciones, géneros y créditos principales. + Resumen + Estudios y cadenas. + Producción + Fila de tráilers y accesos rápidos de reproducción. + De nuevo en línea + No se puede acceder a los servidores + Sin conexión a internet + (edad %1$d) + Nació %1$s%2$s + Murió %1$s + Conocido por: %1$s + Más reciente + No se pudieron cargar los detalles de %1$s + Popular + Algo salió mal + Próximamente + Borrar + Cancelar + Introducir PIN + Introducir PIN para %1$s + ¿Olvidaste el PIN? + PIN incorrecto + Bloqueado. Inténtalo de nuevo en %1$ds + Las opciones de avatar aparecerán aquí cuando se cargue el catálogo. + Avatar: %1$s + Elige un avatar + Elige un avatar abajo. + Crear perfil + Todos los datos de "%1$s" se eliminarán permanentemente. + Eliminar perfil + Añadir perfil + Editar perfil + Introducir PIN actual + Introducir PIN nuevo + Perfil %1$d + Cargando avatares... + Gestionar perfiles + Nombre del perfil + Perfil nuevo + Addons principales desactivados + Addons principales activados + Quitar PIN para %1$s + Quitar bloqueo PIN + Guardando... + Seguridad + Añade un PIN si quieres que este perfil quede bloqueado antes de cambiar a él. + Este perfil está protegido con un PIN. + Selecciona un avatar para este perfil. + Configurar bloqueo PIN + Perfil sin nombre + Usar addons principales + Comparte la configuración de addons del perfil principal en lugar de gestionar una lista separada. + ¿Quién está viendo? + Descargado + Reanudar + Scrapers activos + Comprobando más addons… + Copiar enlace del stream + Descargar archivo + Los addons de streams instalados no devolvieron una respuesta válida. + No se pudieron cargar los streams + Instala primero un addon para cargar streams de este título. + Tus addons instalados no proporcionan streams para este tipo de título. + No hay addon de streams disponible + Ninguno de tus addons instalados devolvió streams para este título. + T%1$d E%2$d + Episodio + T%1$dE%2$d - %3$s + Obteniendo… + Buscando fuente… + Buscando streams… + Enlace del stream copiado + No hay enlace directo del stream disponible + No hay metadatos disponibles + Actualizar streams + Reanudar desde %1$d%% + Reanudar desde %1$s + TAMAÑO %1$s + Cerrar tráiler + No se puede reproducir el tráiler + No se pudieron cargar las listas de Trakt + No se pudieron actualizar las listas de Trakt + %1$s • %2$s + Falló la comprobación de actualizaciones + La descarga falló + Descargando %1$d%% + No se pudo iniciar la instalación + Estás usando la versión más reciente. + Activa la instalación de apps para Nuvio y luego vuelve para continuar. + Descargando actualización... + No se encontraron actualizaciones. + Hay una nueva versión lista para instalar. + Las actualizaciones dentro de la app no están disponibles en esta compilación. + Preparando descarga + Notas de la versión + Permitir instalaciones para continuar + Actualización disponible + Estado de la actualización + Ese complemento ya está instalado. + Introduce una URL de complemento válida + No se pudo cargar el manifiesto + Nuvio + No se pudo eliminar la cuenta + Error al iniciar sesión + Error al cerrar sesión + Error al registrarse + No se pudieron cargar los elementos del catálogo. + A continuación + A continuación • T%1$dE%2$d + logotipo de %1$s + No se pudieron cargar los comentarios + No se pudieron cargar los detalles desde ningún complemento. + Redes + Ningún complemento proporciona metadatos para este contenido. + Descarga fallida + Muestra el progreso en vivo y los controles de descarga. + Descargas + Descarga completada + Descargando %1$s • %2$s + Descargando %1$s • %2$s / %3$s + Descarga fallida + En pausa %1$s + Eliminar + ¿Eliminar %1$s de tu biblioteca? + ¿Eliminar de la biblioteca? + Película + Alertas cuando se estrena un nuevo episodio de una serie guardada. + Vista previa de la alerta de estreno de episodio. + No se pudo enviar una notificación de prueba. + Notificación de prueba enviada para %1$s. + No se puede reproducir esta transmisión. + El PIN de este perfil cambió. Conéctate una vez para actualizar el bloqueo en este dispositivo. + No se pudo quitar el bloqueo por PIN. Inténtalo de nuevo. + Conéctate a internet para quitar el bloqueo por PIN. + Este PIN aún no puede verificarse sin conexión en este dispositivo. Conéctate una vez y desbloquéalo en línea primero. + No se pudo establecer el PIN. Inténtalo de nuevo. + Conéctate a internet para establecer un PIN. + Este perfil usa los complementos principales. + No se pudo cargar %1$s + Fuente + Integrado + Autorización denegada + Completa el inicio de sesión de Trakt en tu navegador + Callback de Trakt no válido + Estado de callback de Trakt no válido + Respuesta de token de Trakt no válida + No se pudo cargar la biblioteca de Trakt + Lista %1$d + Trakt no devolvió un código de autorización + Faltan credenciales de Trakt + No se pudo cargar el progreso de Trakt + No se pudo completar el inicio de sesión de Trakt + Usuario de Trakt + Lista de seguimiento + Tráiler + Desconocido + Complemento + Guardado + Reproducir %1$s + Reanudar %1$s + El JSON está vacío. + La colección %1$d tiene el id vacío. + La colección '%1$s' tiene el título vacío. + La carpeta %1$d en '%2$s' tiene el id vacío. + La carpeta '%1$s' en '%2$s' tiene el título vacío. + La fuente %1$d en la carpeta '%2$s' tiene campos vacíos. + JSON inválido: %1$s + Complemento no encontrado: %1$s + Enero + Febrero + Marzo + Abril + Mayo + Junio + Julio + Agosto + Septiembre + Octubre + Noviembre + Diciembre + Ene + Feb + Mar + Abr + May + Jun + Jul + Ago + Sep + Oct + Nov + Dic + Productora + Cadena + No se pudo cargar %1$s + Popular + Reciente + %1$s • %2$s + Mejor valorado + Clasificación + Detalles de la película + Idioma original + País de origen + Información de estreno + Duración + Pósteres + Texto + Detalles de la serie + Estado + Videos + ARCHIVO + No hay enlace directo del stream disponible + Se reemplazó la descarga anterior + Descarga iniciada + Formato de stream no compatible para descargas + Cuerpo de respuesta vacío + La solicitud falló con HTTP %1$d + El sistema de descargas no está inicializado + La solicitud de descarga falló + %1$s - %2$s + Los títulos guardados aparecerán aquí después de tocar Guardar en una pantalla de detalles. + Tu biblioteca está vacía + No se pudo cargar la biblioteca + Otro + Biblioteca + Conecta Trakt y guarda títulos en tu lista de seguimiento o listas personales. + Tu biblioteca de Trakt está vacía + No se pudo cargar la biblioteca de Trakt + Biblioteca de Trakt + Anime + Canales + Películas + Series + TV + %1$s ya está disponible + %1$s • %2$s ya está disponible + Ya hay un episodio nuevo disponible + %1$s ya está disponible + Estrenos de episodios + Creador + Director + Guionista + Puntuación del público + No se encontró un stream de tráiler reproducible. + Temporada %1$d - %2$s + B + KB + MB + GB + diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml new file mode 100644 index 00000000..842bef80 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -0,0 +1,1043 @@ + + Open recognition and project credits + Back + Cancel + Close + Delete + Done + Edit + Import + Next + OK + Play + Previous + Remove + Reorder + Reset + Resume + Retry + Save + Installing + Addons + Active + %1$d catalogs + Configurable + Refreshing + %1$d resources + Unavailable + Configure addon + Delete addon + Add a manifest URL to start loading catalogs, metadata, streams or subtitles into Nuvio. + No addons installed yet. + Enter an addon URL. + Addon URL + Install Addon + Loading manifest details... + Validating the manifest URL and loading addon details before install. + Checking Addon + Install Failed + %1$s was validated and added successfully. + Addon Installed + Move addon down + Move addon up + Active + Addons + Catalogs + Refresh addon + Add Addon + Installed Addons + Overview + %1$d id rules + Version %1$s + Selected + Copy JSON + %1$d collection(s), %2$d folder(s) + Delete "%1$s"? This cannot be undone. + Delete Collection + Add Catalog + Add Folder + All genres + Add catalogs from your installed addons to define what this folder shows. + No catalog sources yet + Choose + Emoji + Image URL + None + Cover + Create Collection + Done + Edit Collection + Edit Folder + Set the folder identity, presentation, and catalog sources with the same structure as the main collections editor. + Add one to get started. + No folders yet + Folders + Genre Filter + Only show the cover image + Hide Title + New Folder + Show this collection above all regular home catalogs. Multiple pinned collections follow collection creation order. + Pin Above Catalogs + Backdrop image URL (optional) + Folder name + Animated GIF URL (plays only while focused) + Collection name + Save Changes + Save + Appearance + Basics + Catalog Sources + Choose the addon catalogs this folder should aggregate. + Select Catalogs + Select genre + Poster + Square + Wide + Combine all catalogs into one tab + Show \"All\" Tab + Play the configured GIF instead of the static cover when available. + Show GIF When Configured + %1$d source(s) · %2$s + Tile Shape + Rows + Tabs + View Mode + Create one to organize your catalogs. + No collections yet + %1$d folder(s) + No items found + Folder not found + Collections + Import Collections + JSON + Paste your collections JSON below. + Import + New Collection + Pinned + All + Your Collections + Made with ❤️ by Tapframe and friends + Version %1$s (%2$s) + Off + On + Pause + Reload + Already have an account? + Continue Without Account + Create Account + Don't have an account? + Email + or + Password + Sign in to access your library and progress + Sign In + Sign up to sync your data across devices + Sign Up + Your data will only be stored locally + Stream everything, everywhere + Welcome Back + Library + Trakt Library + Home + Library + Profile + Search + Audio Tracks + Audio + Built-in + Bottom Offset + Close player + Color + Currently playing + E%1$d + S%1$dE%2$d + S%1$dE%2$d • %3$s + Episodes + Font Size + %1$dsp + Lock player controls + No audio tracks available + No episodes available + No streams found + None + Outline + Episodes + Sources + Streams + Playback error + Playing + Tap to fetch subtitles + Go back + Reset Defaults + Fill + Fit + Zoom + Seek backward 10 seconds + -%1$ds + +%1$ds + -%1$ds + +%1$ds + Seek forward 10 seconds + Sources + Style + Subs + Subtitles + Brightness %1$d%% + Volume %1$d%% + Muted + Downloaded + Airs + TBA + Tap to unlock + Track %1$d + Unlock player controls + You're watching + Add Profile + Clear search + Discover + Installed addons failed to return valid search results. + Search failed + Install and validate at least one addon before searching. + No active addons + Installed searchable catalogs did not return any matches for this query. + No results found + Your installed addons do not expose catalog search. + No searchable catalogs + Search movies, shows... + Recent Searches + Remove recent search + About + General + Account + Addons + Appearance + Content & Discovery + Continue Watching + Homescreen + Integrations + MDBList Ratings + Meta Screen + Notifications + Playback + Plugins + Poster Customization + Settings + Supporters & Contributors + TMDB Enrichment + Trakt + ABOUT + Manage your account, sign out, or delete. + ACCOUNT + Tune home presentation and visual preferences. + Check for new versions of the app. + Check for updates + Manage addons and discovery sources. + Manage your downloaded movies and episodes. + Downloads + GENERAL + Connect TMDB and MDBList services. + Manage episode release alerts and send a test notification. + Change to a different profile. + Switch Profile + Connect Trakt, sync watchlist lists, and save titles directly to Trakt. + Loading your Trakt lists… + Choose where to save this title on Trakt + Donate + Go to details + Remove + Start from beginning + Play + %1$d/10 + Review + Spoiler + No Trakt reviews available yet. + %1$d likes + This comment contains spoilers. + This comment contains spoilers and has been hidden. + Comments + Trailer + %1$s (%2$d) + Trailers + No completed episodes + No downloads yet + %1$d downloaded episode(s) + Active + Movies + Shows + Show Downloads + Completed • %1$s + Downloading • %1$s + Failed + Paused • %1$s + Watched + Season %1$d + Specials + Continue where you left off + Add to library + Mark as unwatched + Mark as watched + Remove from library + View All + Play manually + %1$s logo + Account + Delete Account + This will permanently delete your account and all associated data. + This action cannot be undone. All your data, profiles, and sync history will be permanently removed. + Delete Account? + Email + Not signed in + Sign Out + You will be returned to the login screen. + Sign Out? + Status + Anonymous + Signed In + AMOLED Black + Use pure black backgrounds for OLED screens. + App Language + Choose Language + Show, hide, and style the Continue Watching shelf. + Adjust shared poster card width and corner radius presets. + DISPLAY + HOME + THEME + Collection • %1$s + Display Name + Install an addon with board-compatible catalogs to configure Homescreen rows. + No home catalogs + Hero source + Hidden + Keep Home focused + %1$s • Limit reached (max %2$d) + No hero sources selected + Not in hero + Remove pin to top from collection to move + Pinned + Pinned to top + Reorder + CATALOGS + CATALOGS & COLLECTIONS + COLLECTIONS + HERO + HERO SOURCES + %1$d of %2$d selected + Show Hero + Display a featured hero carousel at the top of Home. Choose up to 2 source catalogs below. + %1$d of %2$d catalogs visible • %3$d hero sources selected + Open a catalog only when you need to rename or reorder it. + Visible + Player, subtitles, and auto-play + Card Radius + POSTER CARD STYLE + Card Width + Custom + Customize card width and corner radius for shared poster cards across the app. + Hide labels + Landscape mode for shelf posters + Live Preview + %1$s (%2$s) + Corner radius: %1$ddp + Height: %1$ddp + Width: %1$ddp + Classic + Pill + Rounded + Sharp + Subtle + Balanced + Comfort + Compact + Dense + Large + Standard + Show a popup to continue where you left off when opening the app after leaving from the player. + Resume prompt on launch + CARD STYLE + ON LAUNCH + UP NEXT BEHAVIOR + VISIBILITY + Display the Continue Watching shelf on the Home screen. + Show Continue Watching + Poster + Artwork-first poster card + Wide + Info-dense horizontal card + When enabled, Up Next always continues from the furthest watched episode. When disabled, it follows from the most recently watched episode. Useful if you rewatch earlier episodes. + Up Next from furthest episode + HOME + SOURCES + Install, remove, refresh, and sort your content sources. + Install JavaScript scraper repositories and test providers internally. + Control which catalogs appear on Home and in what order. + Disable detail sections and reorder everything below Hero. + Create custom catalog groupings with folders shown on Home. + INTEGRATIONS + Enhance detail pages with TMDB artwork, credits, episode metadata, and more. + Add IMDb, Rotten Tomatoes, Metacritic, and other external ratings to details pages. + Add your MDBList API key below before turning ratings on. + Get a key from https://mdblist.com/preferences and paste it here. + API key + MDBList API key + Enable MDBList ratings + Show external ratings from MDBList on metadata pages when an IMDb ID is available. + API KEY + RATING PROVIDERS + MDBLIST + Actions + Play and save controls. + Cast + Principal cast list. + Cinematic Background + Blurred backdrop behind content, similar to stream screen. + Collection + Related collection or franchise rail. + Comments + Trakt comments section. + Details + Runtime, status, release, language, and related info. + Episode Cards + Choose how episodes are rendered on the metadata screen. + Horizontal + Backdrop-style row cards + List + Detail-first stacked cards + Episodes + Seasons and episode list for series. + Group %1$d + More Like This + Recommendation rail. + None + Overview + Synopsis, ratings, genres, and core credits. + Production + Studios and networks. + APPEARANCE + SECTIONS + Tab Group %1$d + Tab Layout + Group sections into tabs like the TV app. Assign up to 3 sections per tab group. + Trailers + Trailer rail and playback shortcuts. + Notifications are currently disabled in Nuvio. + Episode release alerts + Schedule local notifications when a new episode for a saved show becomes available. + System notifications are disabled for Nuvio. Enable them to receive alerts and test notifications. + %1$d release alerts are currently scheduled on this device. + ALERTS + TEST + Send Test Notification + Sending Test Notification... + Send a local test notification for %1$s. + Save a show to your library first to test notifications. + Test notification + Community + See the people building and supporting Nuvio across Mobile, TV, and Web. + Supporters API is not configured. Add DONATIONS_BASE_URL to local.properties. + Contributors + Supporters + Open GitHub + GitHub profile unavailable + No message attached. + Loading contributors... + Loading supporters... + Couldn't load contributors + Couldn't load supporters + No contributors found. + No supporters found. + Unable to load contributors. + Unable to load supporters. + Couldn't load contributors right now. + Couldn't load supporters right now. + %1$d total commits + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + %1$s %2$s, %3$s + All Addons + All Plugins + Allowed Addons + Allowed Plugins + Anime Skip + AnimeSkip Client ID + Enter your AnimeSkip API client ID. Get one at anime-skip.com. + Also search AnimeSkip for skip timestamps (requires client ID). + Auto-Play Next Episode + Automatically find and play the next episode when the threshold is reached. + Device Only + Prefer App (FFmpeg) + Prefer Device + Decoder Priority + Tap outside to close + Tap outside to save & close + %1$d day + %1$d days + %1$d hour + %1$d hours + Enable libass + Use libass for ASS/SSA subtitle rendering instead of the default renderer. + Hold Speed + Hold To Speed + Long-press anywhere on the player surface to temporarily boost playback speed. + Invalid regex pattern + Last Link Cache Duration + Map DV7 to HEVC + Dolby Vision Profile 7 to HEVC fallback for unsupported devices. + Minutes Before End + Show next episode card this many minutes before the end. + %1$d min + No items available + Not set + Default + Device Language + Forced + None + Prefer Binge Group + When auto-playing, prefer a stream from the same binge group as the current one. + Preferred Audio Language + Preferred Subtitle Language + Presets + Matches against stream name, label, description, addon, and URL. + Regex Pattern + 4K|2160p|Remux + Any 1080p+ + AVC / x264 + BluRay Quality + Dolby Atmos / DTS + English + HDR / Dolby Vision + HEVC / x265 + No CAM/TS + No REMUX/HDR + 1080p Standard + 4K / Remux + 720p / Smaller + WEB Sources + Render Type + Standard (Cues) + Effects Canvas + Effects OpenGL + Overlay Canvas + Overlay OpenGL + Reuse Last Link + Auto-play your last working stream for this same movie/episode when cache is still valid. + Secondary Audio Language + Secondary Subtitle Language + DECODER + NEXT EPISODE + PLAYER + SKIP SEGMENTS + STREAM AUTO-PLAY + STREAM SELECTION + SUBTITLE AND AUDIO + SUBTITLE RENDERING + %1$d selected + Show Loading Overlay + Show the opening loading overlay while a stream starts playing. + Skip Intro/Outro/Recap + Show skip button during detected intro, outro, and recap segments. + Source Scope + All Addons + Consider streams from all installed addons. + All Sources + Consider streams from both addons and plugins. + Enabled Plugins Only + Only consider streams from enabled plugins. + Installed Addons Only + Only consider streams from installed addons. + Stream Selection Mode + First Available Stream + Automatically play the first stream found. + Manual + Select streams manually each time. + Regex Match + Auto-select a stream matching a regex pattern. + Stream Timeout + How long to wait for streams before auto-selecting. + Minutes Before End + Threshold Mode + Minutes Before End + Percentage + Threshold Percentage + Show next episode card when playback reaches this percentage. + %1$d%% + Instant + %1$ds + Unlimited + Tunneled Playback + Enable tunneled playback for lower latency audio/video sync. + Add your own TMDB API key below before turning enrichment on. + TMDB API key + Enable TMDB enrichment + Use your TMDB API key to enrich addon metadata on the details screen when a TMDB or IMDb ID is available. + Enter your TMDB v3 API key. + Language code + Artwork + Replace backdrop, poster, and logo with TMDB artwork. + Basic info + Use TMDB title, synopsis, genres, and rating. + Collections + Show franchise and collection rails for movies when TMDB provides them. + Credits + Use TMDB creators, directors, writers, and cast photos. + Details + Use TMDB release info, runtime, age rating, status, country, and language. + Episodes + Use TMDB episode titles, thumbnails, descriptions, and runtimes for series. + More like this + Show TMDB recommendations at the bottom of detail pages. + Networks + Use TMDB network metadata for TV titles. + Production companies + Use TMDB production company metadata on the details screen. + Season posters + Use TMDB season posters in the metadata screen season selector for series. + Trailers + Fetch and show TMDB trailer videos section on detail pages. + Personal API key + Preferred language + Set the TMDB language code used for localized metadata, for example `en`, `en-US`, or `pt-BR`. + CREDENTIALS + LOCALIZATION + MODULES + TMDB + After approval, you will be redirected back automatically. + AUTHENTICATION + Comments + Show Trakt comments on movie and show details + Connect Trakt + Connected as %1$s + Trakt user + Disconnect + Failed to open browser + FEATURES + Finish Trakt sign in in your browser + Track what you watch, save to watchlist or custom lists, and keep your library synced with Trakt. + Missing Trakt credentials in local.properties (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET). + Open Trakt Login + Your Save actions can now target Trakt watchlist and personal lists. + Sign in with Trakt to enable list-based saving and Trakt library mode. + Audience Score + IMDb + Letterboxd + Metacritic + Rotten Tomatoes + TMDB + Trakt + Unknown + Amber + Crimson + Emerald + Ocean + Rose + Violet + White + Next Episode + Finding source… + Playing via %1$s in %2$d… + Next episode thumbnail + Unaired + Skip + Skip Intro + Skip Outro + Skip Recap + No subtitles found + Afrikaans + Albanian + Amharic + Arabic + Armenian + Azerbaijani + Basque + Belarusian + Bengali + Bosnian + Bulgarian + Burmese + Catalan + Chinese + Chinese (Simplified) + Chinese (Traditional) + Croatian + Czech + Danish + Dutch + English + Estonian + Filipino + Finnish + French + Galician + Georgian + German + Greek + Gujarati + Hebrew + Hindi + Hungarian + Icelandic + Indonesian + Irish + Italian + Japanese + Kannada + Kazakh + Khmer + Korean + Lao + Latvian + Lithuanian + Macedonian + Malay + Malayalam + Maltese + Marathi + Mongolian + Nepali + Norwegian + Persian + Polish + Portuguese (Portugal) + Portuguese (Brazil) + Punjabi + Romanian + Russian + Serbian + Sinhala + Slovak + Slovenian + Spanish + Spanish (Latin America) + Swahili + Swedish + Tamil + Telugu + Thai + Turkish + Ukrainian + Urdu + Uzbek + Vietnamese + Welsh + Zulu + Clear + Continue + Ignore + Install + Later + No + Update + Yes + Do you want to exit the app? + Exit app + This catalog did not return any items. + No titles found + Check your Wi-Fi or mobile data connection and try again. + Director + Failed to load + More Like This + Seasons + This addon returned videos for the series, but none included season or episode numbers. + This addon did not provide episode metadata for this series. + Episodes have not been published by this addon yet. + Your device is online, but Nuvio could not reach required servers. + Show Less + Show More ▾ + Writer + All Genres + Catalog + %1$s • %2$s + The selected catalog failed to return discover items. + Could not load discover + Installed addons do not expose board-compatible catalogs for discover. + No discover catalogs + The selected catalog and filters did not return any items. + No titles found + Install and validate at least one addon before browsing discover catalogs. + Select Catalog + Select Genre + Select Type + Type + Mark previous as unwatched + Mark previous as watched + Mark %1$s as unwatched + Mark %1$s as watched + Mark as unwatched + Mark as watched + Up next + %1$d%% watched + Install and validate at least one addon before loading catalog rows on Home. + Installed addons do not currently expose board-compatible catalogs without required extras. + No home rows available + View Details + Play and save controls. + Actions + Principal cast list. + Related collection or franchise rail. + Collection + Trakt comments section. + Runtime, status, release, language, and related info. + Details + Seasons and episode list for series. + Recommendation rail. + More Like This + Synopsis, ratings, genres, and core credits. + Overview + Studios and networks. + Production + Trailer rail and playback shortcuts. + Back online + Cannot reach servers + No internet connection + (age %1$d) + Born %1$s%2$s + Died %1$s + Known for: %1$s + Latest + Could not load details for %1$s + Popular + Something went wrong + Upcoming + Backspace + Cancel + Enter PIN + Enter PIN for %1$s + Forgot PIN? + Incorrect PIN + Locked. Try again in %1$ds + Avatar options will appear here when the catalog loads. + Avatar: %1$s + Choose an avatar + Choose an avatar below. + Create Profile + All data for "%1$s" will be permanently deleted. + Delete Profile + Add Profile + Edit Profile + Enter current PIN + Enter new PIN + Profile %1$d + Loading avatars... + Manage Profiles + Profile name + New profile + Primary addons off + Primary addons on + Remove PIN for %1$s + Remove PIN Lock + Saving... + Security + Add a PIN if you want this profile locked before switching into it. + This profile is protected with a PIN. + Select an avatar for this profile. + Set PIN Lock + Unnamed profile + Use Primary Addons + Share the main profile's addon setup instead of managing a separate list. + Who's watching? + Downloaded + Resume + Active scrapers + Checking more addons… + Copy stream link + Download file + The installed stream addons failed to return a valid stream response. + Could not load streams + Install an addon first to load streams for this title. + Your installed addons do not provide streams for this type of title. + No stream addon available + None of your installed addons returned streams for this title. + S%1$d E%2$d + Episode + S%1$dE%2$d - %3$s + Fetching… + Finding source… + Finding streams… + Stream link copied + No direct stream link available + No metadata available + Refresh streams + Resume from %1$d%% + Resume from %1$s + SIZE %1$s + Close trailer + Unable to play trailer + Failed to load Trakt lists + Failed to update Trakt lists + %1$s • %2$s + Update check failed + Download failed + Downloading %1$d%% + Unable to start installation + You're using the latest version. + Enable app installs for Nuvio, then come back and continue. + Downloading update... + No updates found. + A new version is ready to install. + In-app updates are not available on this build. + Preparing download + Release notes + Allow installs to continue + Update available + Update status + That addon is already installed. + Enter a valid addon URL + Unable to load manifest + Nuvio + Account deletion failed + Sign-in failed + Sign-out failed + Sign-up failed + Unable to load catalog items. + Up Next + Up Next • S%1$dE%2$d + %1$s logo + Failed to load comments + Could not load details from any addon. + Networks + No addon provides meta for this content. + Download failed + Shows live download progress and controls. + Downloads + Download completed + Downloading %1$s • %2$s + Downloading %1$s • %2$s / %3$s + Download failed + Paused %1$s + Remove + Remove %1$s from your library? + Remove from Library? + Movie + Alerts when a saved show's new episode is released. + Preview episode release alert. + Failed to send a test notification. + Test notification sent for %1$s. + Unable to play this stream. + This profile PIN changed. Connect once to refresh the lock on this device. + Couldn't remove PIN lock. Try again. + Connect to the internet to remove the PIN lock. + This PIN can't be verified offline on this device yet. Connect once and unlock it online first. + Couldn't set PIN. Try again. + Connect to the internet to set a PIN. + This profile uses primary addons. + Failed to load %1$s + Stream + Embedded + Authorization denied + Complete Trakt sign in in your browser + Invalid Trakt callback + Invalid Trakt callback state + Invalid Trakt token response + Failed to load Trakt library + List %1$d + Trakt did not return an authorization code + Missing Trakt credentials + Failed to load Trakt progress + Failed to complete Trakt sign in + Trakt user + Watchlist + Trailer + Unknown + Addon + Saved + Play %1$s + Resume %1$s + JSON is empty. + Collection %1$d has blank id. + Collection '%1$s' has blank title. + Folder %1$d in '%2$s' has blank id. + Folder '%1$s' in '%2$s' has blank title. + Source %1$d in folder '%2$s' has blank fields. + Invalid JSON: %1$s + Addon not found: %1$s + January + February + March + April + May + June + July + August + September + October + November + December + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + Production Company + Network + Could not load %1$s + Popular + Recent + %1$s • %2$s + Top Rated + Certification + Movie Details + Original Language + Origin Country + Release Info + Runtime + Posters + Text + Show Details + Status + Videos + FILE + No direct stream link available + Replaced previous download + Download started + Unsupported stream format for downloads + Empty response body + Request failed with HTTP %1$d + Download system is not initialized + Download request failed + %1$s - %2$s + Saved titles will appear here after you tap Save on a details screen. + Your library is empty + Couldn't load library + Other + Library + Connect Trakt and save titles to your watchlist or personal lists. + Your Trakt library is empty + Couldn't load Trakt library + Trakt Library + Anime + Channels + Movies + Series + TV + %1$s is out now + %1$s • %2$s is out now + A new episode is out now + %1$s is out now + Episode Releases + Creator + Director + Writer + Audience Score + No playable trailer stream found. + Season %1$d - %2$s + B + KB + MB + GB + diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt index f3b35366..4e68adf2 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt @@ -92,6 +92,7 @@ import com.nuvio.app.core.ui.NuvioToastController import com.nuvio.app.core.ui.NuvioFloatingPrompt import com.nuvio.app.core.ui.TraktListPickerDialog import com.nuvio.app.core.ui.NuvioTheme +import com.nuvio.app.core.ui.localizedContinueWatchingSubtitle import com.nuvio.app.features.auth.AuthScreen import com.nuvio.app.features.addons.AddonRepository import com.nuvio.app.features.catalog.CatalogRepository @@ -167,12 +168,20 @@ import com.nuvio.app.features.watching.application.WatchingState import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import kotlinx.serialization.Serializable -import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.* import nuvio.composeapp.generated.resources.app_logo_wordmark +import nuvio.composeapp.generated.resources.compose_catalog_subtitle_library +import nuvio.composeapp.generated.resources.compose_catalog_subtitle_trakt_library +import nuvio.composeapp.generated.resources.compose_nav_home +import nuvio.composeapp.generated.resources.compose_nav_library +import nuvio.composeapp.generated.resources.compose_nav_profile +import nuvio.composeapp.generated.resources.compose_nav_search import nuvio.composeapp.generated.resources.sidebar_library import nuvio.composeapp.generated.resources.sidebar_search import org.jetbrains.compose.resources.DrawableResource +import org.jetbrains.compose.resources.getString import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource @Serializable object TabsRoute @@ -278,7 +287,6 @@ fun App() { ThemeSettingsRepository.selectedTheme }.collectAsStateWithLifecycle() val amoledEnabled by remember { ThemeSettingsRepository.amoledEnabled }.collectAsStateWithLifecycle() - NuvioTheme(appTheme = selectedTheme, amoled = amoledEnabled) { LaunchedEffect(Unit) { AuthRepository.initialize() @@ -499,6 +507,7 @@ private fun MainAppContent( val networkStatusUiState by remember { NetworkStatusRepository.uiState }.collectAsStateWithLifecycle() + val downloadedProviderLabel = stringResource(Res.string.provider_downloaded) val isTraktConnected = traktAuthUiState.mode == TraktConnectionMode.CONNECTED var initialHomeReady by rememberSaveable { mutableStateOf(false) } var offlineLaunchRouteHandled by rememberSaveable { mutableStateOf(false) } @@ -542,11 +551,11 @@ private fun MainAppContent( when (condition) { NetworkCondition.NoInternet -> { - NuvioToastController.show("No internet connection") + NuvioToastController.show(getString(Res.string.network_no_internet_connection)) } NetworkCondition.ServersUnreachable -> { - NuvioToastController.show("Cannot reach servers") + NuvioToastController.show(getString(Res.string.network_cannot_reach_servers)) } NetworkCondition.Online -> { @@ -554,7 +563,7 @@ private fun MainAppContent( previousConditionName == NetworkCondition.NoInternet.name || previousConditionName == NetworkCondition.ServersUnreachable.name ) { - NuvioToastController.show("Back online") + NuvioToastController.show(getString(Res.string.network_back_online)) } } @@ -698,7 +707,7 @@ private fun MainAppContent( streamTitle = downloadedItem.streamTitle.ifBlank { title }, streamSubtitle = downloadedItem.streamSubtitle, pauseDescription = pauseDescription, - providerName = downloadedItem.providerName.ifBlank { "Downloaded" }, + providerName = downloadedItem.providerName.ifBlank { downloadedProviderLabel }, providerAddonId = downloadedItem.providerAddonId, contentType = type, videoId = videoId, @@ -798,15 +807,17 @@ private fun MainAppContent( ) } + val librarySectionSubtitle = if (libraryUiState.sourceMode == LibrarySourceMode.TRAKT) { + stringResource(Res.string.compose_catalog_subtitle_trakt_library) + } else { + stringResource(Res.string.compose_catalog_subtitle_library) + } + val onLibrarySectionViewAllClick: (LibrarySection) -> Unit = { section -> navController.navigate( CatalogRoute( title = section.displayTitle, - subtitle = if (libraryUiState.sourceMode == LibrarySourceMode.TRAKT) { - "Trakt Library" - } else { - "Library" - }, + subtitle = librarySectionSubtitle, manifestUrl = INTERNAL_LIBRARY_MANIFEST_URL, type = section.items.firstOrNull()?.type ?: "movie", catalogId = section.type, @@ -899,19 +910,19 @@ private fun MainAppContent( selected = selectedTab == AppScreenTab.Home, onClick = { selectedTab = AppScreenTab.Home }, icon = Icons.Filled.Home, - contentDescription = "Home", + contentDescription = stringResource(Res.string.compose_nav_home), ) NavItem( selected = selectedTab == AppScreenTab.Search, onClick = { selectedTab = AppScreenTab.Search }, icon = Res.drawable.sidebar_search, - contentDescription = "Search", + contentDescription = stringResource(Res.string.compose_nav_search), ) NavItem( selected = selectedTab == AppScreenTab.Library, onClick = { selectedTab = AppScreenTab.Library }, icon = Res.drawable.sidebar_library, - contentDescription = "Library", + contentDescription = stringResource(Res.string.compose_nav_library), ) NavItem( selected = selectedTab == AppScreenTab.Settings, @@ -994,6 +1005,9 @@ private fun MainAppContent( } composable { backStackEntry -> val route = backStackEntry.toRoute() + val directorRole = stringResource(Res.string.person_role_director) + val writerRole = stringResource(Res.string.person_role_writer) + val creatorRole = stringResource(Res.string.person_role_creator) MetaDetailsScreen( type = route.type, id = route.id, @@ -1034,8 +1048,11 @@ private fun MainAppContent( castAvatarTransitionKey = avatarTransitionKey, preferCrew = person.role?.let { it.equals("Director", ignoreCase = true) || + it.equals(directorRole, ignoreCase = true) || it.equals("Writer", ignoreCase = true) || + it.equals(writerRole, ignoreCase = true) || it.equals("Creator", ignoreCase = true) + || it.equals(creatorRole, ignoreCase = true) } ?: false, ), ) @@ -1662,7 +1679,7 @@ private fun MainAppContent( tab.key to (snapshot[tab.key] == true) } }.onFailure { error -> - pickerError = error.message ?: "Failed to load Trakt lists" + pickerError = error.message ?: getString(Res.string.trakt_lists_load_failed) } pickerPending = false } @@ -1748,7 +1765,7 @@ private fun MainAppContent( pickerItem = null pickerError = null }.onFailure { error -> - pickerError = error.message ?: "Failed to update Trakt lists" + pickerError = error.message ?: getString(Res.string.trakt_lists_update_failed) } pickerPending = false } @@ -1756,11 +1773,11 @@ private fun MainAppContent( ) NuvioStatusModal( - title = "Exit app", - message = "Do you want to exit the app?", + title = stringResource(Res.string.app_exit_title), + message = stringResource(Res.string.app_exit_message), isVisible = showExitConfirmation, - confirmText = "Yes", - dismissText = "No", + confirmText = stringResource(Res.string.action_yes), + dismissText = stringResource(Res.string.action_no), onConfirm = { showExitConfirmation = false platformExitApp() @@ -1791,9 +1808,9 @@ private fun MainAppContent( visible = resumePromptItem != null, imageUrl = resumePromptItem?.poster ?: resumePromptItem?.imageUrl, title = resumePromptItem?.title.orEmpty(), - subtitle = resumePromptItem?.subtitle.orEmpty(), + subtitle = resumePromptItem?.let { localizedContinueWatchingSubtitle(it) }.orEmpty(), progressFraction = resumePromptItem?.progressFraction ?: 0f, - actionLabel = "Resume", + actionLabel = stringResource(Res.string.resume_prompt_action), onAction = { val item = resumePromptItem ?: return@NuvioFloatingPrompt resumePromptItem = null @@ -1948,13 +1965,13 @@ private fun TabletFloatingTopBar( verticalAlignment = Alignment.CenterVertically, ) { TabletTopPillItem( - label = "Home", + label = stringResource(Res.string.compose_nav_home), selected = selectedTab == AppScreenTab.Home, onClick = { onTabSelected(AppScreenTab.Home) }, icon = { Icon( imageVector = Icons.Filled.Home, - contentDescription = "Home", + contentDescription = stringResource(Res.string.compose_nav_home), modifier = Modifier.size(18.dp), tint = if (selectedTab == AppScreenTab.Home) { MaterialTheme.colorScheme.onPrimaryContainer @@ -1965,13 +1982,13 @@ private fun TabletFloatingTopBar( }, ) TabletTopPillItem( - label = "Search", + label = stringResource(Res.string.compose_nav_search), selected = selectedTab == AppScreenTab.Search, onClick = { onTabSelected(AppScreenTab.Search) }, icon = { Icon( painter = painterResource(Res.drawable.sidebar_search), - contentDescription = "Search", + contentDescription = stringResource(Res.string.compose_nav_search), modifier = Modifier.size(18.dp), tint = if (selectedTab == AppScreenTab.Search) { MaterialTheme.colorScheme.onPrimaryContainer @@ -1982,13 +1999,13 @@ private fun TabletFloatingTopBar( }, ) TabletTopPillItem( - label = "Library", + label = stringResource(Res.string.compose_nav_library), selected = selectedTab == AppScreenTab.Library, onClick = { onTabSelected(AppScreenTab.Library) }, icon = { Icon( painter = painterResource(Res.drawable.sidebar_library), - contentDescription = "Library", + contentDescription = stringResource(Res.string.compose_nav_library), modifier = Modifier.size(18.dp), tint = if (selectedTab == AppScreenTab.Library) { MaterialTheme.colorScheme.onPrimaryContainer @@ -2018,7 +2035,7 @@ private fun TabletFloatingTopBar( onAddProfileRequested = onAddProfileRequested, ) Text( - text = "Profile", + text = stringResource(Res.string.compose_nav_profile), modifier = Modifier.clickable { onTabSelected(AppScreenTab.Settings) }, style = MaterialTheme.typography.labelLarge, color = if (selectedTab == AppScreenTab.Settings) { @@ -2081,7 +2098,7 @@ private fun AppLaunchOverlay( ) { Image( painter = painterResource(Res.drawable.app_logo_wordmark), - contentDescription = "Nuvio", + contentDescription = stringResource(Res.string.app_brand_name), modifier = Modifier .fillMaxWidth(0.48f) .height(44.dp), diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/auth/AuthRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/auth/AuthRepository.kt index d17dc078..7e5f9d85 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/auth/AuthRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/auth/AuthRepository.kt @@ -16,6 +16,8 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString object AuthRepository { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default) @@ -89,7 +91,7 @@ object AuthRepository { Unit }.onFailure { e -> log.e(e) { "Email sign-up failed" } - _error.value = e.message ?: "Sign-up failed" + _error.value = e.message ?: getString(Res.string.auth_sign_up_failed) } suspend fun signInWithEmail(email: String, password: String): Result = runCatching { @@ -100,7 +102,7 @@ object AuthRepository { } }.onFailure { e -> log.e(e) { "Email sign-in failed" } - _error.value = e.message ?: "Sign-in failed" + _error.value = e.message ?: getString(Res.string.auth_sign_in_failed) } suspend fun signOut(): Result = runCatching { @@ -114,7 +116,7 @@ object AuthRepository { LocalAccountDataCleaner.wipe() }.onFailure { e -> log.e(e) { "Sign-out failed" } - _error.value = e.message ?: "Sign-out failed" + _error.value = e.message ?: getString(Res.string.auth_sign_out_failed) } suspend fun deleteAccount(): Result = runCatching { @@ -124,7 +126,7 @@ object AuthRepository { LocalAccountDataCleaner.wipe() }.onFailure { e -> log.e(e) { "Account deletion failed" } - _error.value = e.message ?: "Account deletion failed" + _error.value = e.message ?: getString(Res.string.auth_account_deletion_failed) } fun clearError() { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/format/ReleaseDateDisplay.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/format/ReleaseDateDisplay.kt index 87616ba5..9af52b9e 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/format/ReleaseDateDisplay.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/format/ReleaseDateDisplay.kt @@ -1,19 +1,6 @@ package com.nuvio.app.core.format -private val MONTH_NAMES = listOf( - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", -) +import com.nuvio.app.core.i18n.localizedMonthName /** * Formats ISO calendar dates (yyyy-MM-dd or yyyy-MM-ddTHH:mm:ss…) for UI as "2025 February 1". @@ -28,7 +15,7 @@ fun formatReleaseDateForDisplay(raw: String): String { val year = parts[0].toIntOrNull() ?: return raw val month = parts[1].toIntOrNull()?.takeIf { it in 1..12 } ?: return raw val day = parts[2].toIntOrNull()?.takeIf { it in 1..31 } ?: return raw - return "$year ${MONTH_NAMES[month - 1]} $day" + return "$year ${localizedMonthName(month)} $day" } /** diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/i18n/LocalizedUiText.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/i18n/LocalizedUiText.kt new file mode 100644 index 00000000..fe9a7297 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/i18n/LocalizedUiText.kt @@ -0,0 +1,141 @@ +package com.nuvio.app.core.i18n + +import kotlinx.coroutines.runBlocking +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.action_play +import nuvio.composeapp.generated.resources.action_play_episode +import nuvio.composeapp.generated.resources.action_resume +import nuvio.composeapp.generated.resources.action_resume_episode +import nuvio.composeapp.generated.resources.compose_player_episode_code_episode_only +import nuvio.composeapp.generated.resources.compose_player_episode_code_full +import nuvio.composeapp.generated.resources.continue_watching_up_next +import nuvio.composeapp.generated.resources.continue_watching_up_next_episode +import nuvio.composeapp.generated.resources.date_month_april +import nuvio.composeapp.generated.resources.date_month_august +import nuvio.composeapp.generated.resources.date_month_december +import nuvio.composeapp.generated.resources.date_month_february +import nuvio.composeapp.generated.resources.date_month_january +import nuvio.composeapp.generated.resources.date_month_july +import nuvio.composeapp.generated.resources.date_month_june +import nuvio.composeapp.generated.resources.date_month_march +import nuvio.composeapp.generated.resources.date_month_may +import nuvio.composeapp.generated.resources.date_month_november +import nuvio.composeapp.generated.resources.date_month_october +import nuvio.composeapp.generated.resources.date_month_september +import nuvio.composeapp.generated.resources.date_month_short_apr +import nuvio.composeapp.generated.resources.date_month_short_aug +import nuvio.composeapp.generated.resources.date_month_short_dec +import nuvio.composeapp.generated.resources.date_month_short_feb +import nuvio.composeapp.generated.resources.date_month_short_jan +import nuvio.composeapp.generated.resources.date_month_short_jul +import nuvio.composeapp.generated.resources.date_month_short_jun +import nuvio.composeapp.generated.resources.date_month_short_mar +import nuvio.composeapp.generated.resources.date_month_short_may +import nuvio.composeapp.generated.resources.date_month_short_nov +import nuvio.composeapp.generated.resources.date_month_short_oct +import nuvio.composeapp.generated.resources.date_month_short_sep +import nuvio.composeapp.generated.resources.media_anime +import nuvio.composeapp.generated.resources.media_channels +import nuvio.composeapp.generated.resources.media_movie +import nuvio.composeapp.generated.resources.media_movies +import nuvio.composeapp.generated.resources.media_series +import nuvio.composeapp.generated.resources.media_tv +import nuvio.composeapp.generated.resources.unit_bytes_b +import nuvio.composeapp.generated.resources.unit_bytes_gb +import nuvio.composeapp.generated.resources.unit_bytes_kb +import nuvio.composeapp.generated.resources.unit_bytes_mb +import org.jetbrains.compose.resources.getString + +fun localizedMediaTypeLabel(type: String): String = runBlocking { + when (type.trim().lowercase()) { + "movie" -> getString(Res.string.media_movies) + "series" -> getString(Res.string.media_series) + "anime" -> getString(Res.string.media_anime) + "channel" -> getString(Res.string.media_channels) + "tv" -> getString(Res.string.media_tv) + else -> type.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } + } +} + +fun localizedMovieTypeLabel(): String = runBlocking { getString(Res.string.media_movie) } + +fun localizedSeasonEpisodeCode(seasonNumber: Int?, episodeNumber: Int?): String? = runBlocking { + when { + seasonNumber != null && episodeNumber != null -> + getString(Res.string.compose_player_episode_code_full, seasonNumber, episodeNumber) + episodeNumber != null -> + getString(Res.string.compose_player_episode_code_episode_only, episodeNumber) + else -> null + } +} + +fun localizedPlayLabel(seasonNumber: Int?, episodeNumber: Int?): String = runBlocking { + val episodeCode = localizedSeasonEpisodeCode(seasonNumber, episodeNumber) + if (episodeCode != null) { + getString(Res.string.action_play_episode, episodeCode) + } else { + getString(Res.string.action_play) + } +} + +fun localizedResumeLabel(seasonNumber: Int?, episodeNumber: Int?): String = runBlocking { + val episodeCode = localizedSeasonEpisodeCode(seasonNumber, episodeNumber) + if (episodeCode != null) { + getString(Res.string.action_resume_episode, episodeCode) + } else { + getString(Res.string.action_resume) + } +} + +fun localizedUpNextLabel(seasonNumber: Int?, episodeNumber: Int?): String = runBlocking { + if (seasonNumber != null && episodeNumber != null) { + getString(Res.string.continue_watching_up_next_episode, seasonNumber, episodeNumber) + } else { + getString(Res.string.continue_watching_up_next) + } +} + +fun localizedMonthName(month: Int): String = runBlocking { + when (month) { + 1 -> getString(Res.string.date_month_january) + 2 -> getString(Res.string.date_month_february) + 3 -> getString(Res.string.date_month_march) + 4 -> getString(Res.string.date_month_april) + 5 -> getString(Res.string.date_month_may) + 6 -> getString(Res.string.date_month_june) + 7 -> getString(Res.string.date_month_july) + 8 -> getString(Res.string.date_month_august) + 9 -> getString(Res.string.date_month_september) + 10 -> getString(Res.string.date_month_october) + 11 -> getString(Res.string.date_month_november) + 12 -> getString(Res.string.date_month_december) + else -> month.toString() + } +} + +fun localizedShortMonthName(month: Int): String = runBlocking { + when (month) { + 1 -> getString(Res.string.date_month_short_jan) + 2 -> getString(Res.string.date_month_short_feb) + 3 -> getString(Res.string.date_month_short_mar) + 4 -> getString(Res.string.date_month_short_apr) + 5 -> getString(Res.string.date_month_short_may) + 6 -> getString(Res.string.date_month_short_jun) + 7 -> getString(Res.string.date_month_short_jul) + 8 -> getString(Res.string.date_month_short_aug) + 9 -> getString(Res.string.date_month_short_sep) + 10 -> getString(Res.string.date_month_short_oct) + 11 -> getString(Res.string.date_month_short_nov) + 12 -> getString(Res.string.date_month_short_dec) + else -> month.toString() + } +} + +fun localizedByteUnit(unit: String): String = runBlocking { + when (unit) { + "GB" -> getString(Res.string.unit_bytes_gb) + "MB" -> getString(Res.string.unit_bytes_mb) + "KB" -> getString(Res.string.unit_bytes_kb) + else -> getString(Res.string.unit_bytes_b) + } +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/AppTheme.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/AppTheme.kt index 23321cf8..081f1756 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/AppTheme.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/AppTheme.kt @@ -1,11 +1,32 @@ package com.nuvio.app.core.ui -enum class AppTheme(val displayName: String) { - CRIMSON("Crimson"), - OCEAN("Ocean"), - VIOLET("Violet"), - EMERALD("Emerald"), - AMBER("Amber"), - ROSE("Rose"), - WHITE("White"), +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.theme_amber +import nuvio.composeapp.generated.resources.theme_crimson +import nuvio.composeapp.generated.resources.theme_emerald +import nuvio.composeapp.generated.resources.theme_ocean +import nuvio.composeapp.generated.resources.theme_rose +import nuvio.composeapp.generated.resources.theme_violet +import nuvio.composeapp.generated.resources.theme_white +import org.jetbrains.compose.resources.StringResource + +enum class AppTheme { + CRIMSON, + OCEAN, + VIOLET, + EMERALD, + AMBER, + ROSE, + WHITE, } + +val AppTheme.labelRes: StringResource + get() = when (this) { + AppTheme.CRIMSON -> Res.string.theme_crimson + AppTheme.OCEAN -> Res.string.theme_ocean + AppTheme.VIOLET -> Res.string.theme_violet + AppTheme.EMERALD -> Res.string.theme_emerald + AppTheme.AMBER -> Res.string.theme_amber + AppTheme.ROSE -> Res.string.theme_rose + AppTheme.WHITE -> Res.string.theme_white + } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/ContinueWatchingText.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/ContinueWatchingText.kt new file mode 100644 index 00000000..8c122e2c --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/ContinueWatchingText.kt @@ -0,0 +1,26 @@ +package com.nuvio.app.core.ui + +import androidx.compose.runtime.Composable +import com.nuvio.app.features.watchprogress.ContinueWatchingItem +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource + +@Composable +fun localizedContinueWatchingSubtitle(item: ContinueWatchingItem): String { + val seasonNumber = item.seasonNumber + val episodeNumber = item.episodeNumber + val episodeTitle = item.episodeTitle?.takeIf { it.isNotBlank() } + + val base = when { + seasonNumber != null && episodeNumber != null && item.isNextUp -> + stringResource(Res.string.continue_watching_up_next_episode, seasonNumber, episodeNumber) + seasonNumber != null && episodeNumber != null -> + stringResource(Res.string.compose_player_episode_code_full, seasonNumber, episodeNumber) + item.isNextUp -> + stringResource(Res.string.continue_watching_up_next) + else -> + stringResource(Res.string.media_movie) + } + + return episodeTitle?.let { "$base • $it" } ?: base +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioComponents.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioComponents.kt index 53830e66..365b1a84 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioComponents.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioComponents.kt @@ -65,6 +65,10 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.rounded.ArrowBack +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.action_back +import nuvio.composeapp.generated.resources.action_ok +import org.jetbrains.compose.resources.stringResource import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -141,7 +145,7 @@ fun NuvioScreenHeader( IconButton(onClick = onBack) { Icon( imageVector = Icons.AutoMirrored.Rounded.ArrowBack, - contentDescription = "Back", + contentDescription = stringResource(Res.string.action_back), tint = MaterialTheme.colorScheme.onBackground, ) } @@ -233,7 +237,7 @@ fun NuvioBackButton( contentColor: Color = MaterialTheme.colorScheme.onSurface, buttonSize: Dp = 40.dp, iconSize: Dp = 22.dp, - contentDescription: String = "Back", + contentDescription: String = stringResource(Res.string.action_back), ) { Box( modifier = modifier @@ -375,7 +379,7 @@ fun NuvioStatusModal( modifier: Modifier = Modifier, isVisible: Boolean, isBusy: Boolean = false, - confirmText: String = "OK", + confirmText: String = stringResource(Res.string.action_ok), dismissText: String? = null, onConfirm: () -> Unit, onDismiss: (() -> Unit)? = null, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioContinueWatchingActionSheet.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioContinueWatchingActionSheet.kt index 1d326687..b85173d3 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioContinueWatchingActionSheet.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioContinueWatchingActionSheet.kt @@ -30,6 +30,12 @@ import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage import com.nuvio.app.features.watchprogress.ContinueWatchingItem import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.cw_action_go_to_details +import nuvio.composeapp.generated.resources.cw_action_remove +import nuvio.composeapp.generated.resources.cw_action_start_from_beginning +import nuvio.composeapp.generated.resources.play_manually +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -70,14 +76,14 @@ fun NuvioContinueWatchingActionSheet( NuvioBottomSheetDivider() NuvioBottomSheetActionRow( icon = Icons.Default.Info, - title = "Go to details", + title = stringResource(Res.string.cw_action_go_to_details), onClick = { dismissAfter(onOpenDetails) }, ) if (showManualPlayOption && onPlayManually != null) { NuvioBottomSheetDivider() NuvioBottomSheetActionRow( icon = Icons.Default.PlayArrow, - title = "Play manually", + title = stringResource(Res.string.play_manually), onClick = { dismissAfter(onPlayManually) }, ) } @@ -85,14 +91,14 @@ fun NuvioContinueWatchingActionSheet( NuvioBottomSheetDivider() NuvioBottomSheetActionRow( icon = Icons.Default.Replay, - title = "Start from beginning", + title = stringResource(Res.string.cw_action_start_from_beginning), onClick = { dismissAfter(onStartFromBeginning) }, ) } NuvioBottomSheetDivider() NuvioBottomSheetActionRow( icon = Icons.Default.DeleteOutline, - title = "Remove", + title = stringResource(Res.string.cw_action_remove), onClick = { dismissAfter(onRemove) }, ) } @@ -152,7 +158,7 @@ private fun ContinueWatchingSheetHeader( overflow = TextOverflow.Ellipsis, ) Text( - text = item.subtitle, + text = localizedContinueWatchingSubtitle(item), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, maxLines = 2, @@ -160,4 +166,4 @@ private fun ContinueWatchingSheetHeader( ) } } -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioFloatingPrompt.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioFloatingPrompt.kt index ca57e37a..b7b15ef1 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioFloatingPrompt.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioFloatingPrompt.kt @@ -52,6 +52,9 @@ import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.floating_prompt_continue_where_left_off +import org.jetbrains.compose.resources.stringResource import kotlin.math.roundToInt private const val AutoDismissDelayMs = 15_000L @@ -202,7 +205,7 @@ fun NuvioFloatingPrompt( verticalArrangement = Arrangement.spacedBy(4.dp), ) { Text( - text = "Continue where you left off", + text = stringResource(Res.string.floating_prompt_continue_where_left_off), style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioNetworkOfflineCard.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioNetworkOfflineCard.kt index 958ccd0c..f751e6df 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioNetworkOfflineCard.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioNetworkOfflineCard.kt @@ -10,6 +10,9 @@ import androidx.compose.ui.unit.dp import com.nuvio.app.core.network.NetworkCondition import com.nuvio.app.core.network.messageForEmptyState import com.nuvio.app.core.network.titleForEmptyState +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.action_retry +import org.jetbrains.compose.resources.stringResource @Composable fun NuvioNetworkOfflineCard( @@ -32,9 +35,9 @@ fun NuvioNetworkOfflineCard( if (onRetry != null) { Spacer(modifier = Modifier.height(16.dp)) NuvioPrimaryButton( - text = "Retry", + text = stringResource(Res.string.action_retry), onClick = onRetry, ) } } -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioPosterActionSheet.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioPosterActionSheet.kt index 8a1081eb..e226f637 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioPosterActionSheet.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioPosterActionSheet.kt @@ -37,6 +37,13 @@ import coil3.compose.AsyncImage import com.nuvio.app.core.format.formatReleaseDateForDisplay import com.nuvio.app.features.home.MetaPreview import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.episodes_cd_watched +import nuvio.composeapp.generated.resources.hero_add_to_library +import nuvio.composeapp.generated.resources.hero_mark_unwatched +import nuvio.composeapp.generated.resources.hero_mark_watched +import nuvio.composeapp.generated.resources.hero_remove_from_library +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -72,7 +79,11 @@ fun NuvioPosterActionSheet( NuvioBottomSheetDivider() NuvioBottomSheetActionRow( icon = if (isSaved) Icons.Default.Bookmark else Icons.Default.BookmarkBorder, - title = if (isSaved) "Remove from Library" else "Add to Library", + title = if (isSaved) { + stringResource(Res.string.hero_remove_from_library) + } else { + stringResource(Res.string.hero_add_to_library) + }, onClick = { onToggleLibrary() coroutineScope.launch { @@ -86,7 +97,11 @@ fun NuvioPosterActionSheet( NuvioBottomSheetDivider() NuvioBottomSheetActionRow( icon = if (isWatched) Icons.Default.CheckCircle else Icons.Default.CheckCircleOutline, - title = if (isWatched) "Mark as Unwatched" else "Mark as Watched", + title = if (isWatched) { + stringResource(Res.string.hero_mark_unwatched) + } else { + stringResource(Res.string.hero_mark_watched) + }, onClick = { onToggleWatched() coroutineScope.launch { @@ -114,7 +129,7 @@ fun NuvioWatchedBadge( ) { Icon( imageVector = Icons.Default.Check, - contentDescription = "Watched", + contentDescription = stringResource(Res.string.episodes_cd_watched), tint = MaterialTheme.colorScheme.onPrimary, modifier = Modifier.size(12.dp), ) @@ -200,4 +215,3 @@ private fun PosterSheetHeader( } } } - diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioShelfComponents.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioShelfComponents.kt index b1139b86..b1b99312 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioShelfComponents.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioShelfComponents.kt @@ -33,6 +33,10 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.home_view_all +import nuvio.composeapp.generated.resources.poster_logo_content_description +import org.jetbrains.compose.resources.stringResource enum class NuvioPosterShape { Poster, @@ -156,7 +160,7 @@ fun NuvioPosterCard( if (!bottomLeftLogoUrl.isNullOrBlank()) { AsyncImage( model = bottomLeftLogoUrl, - contentDescription = "$title logo", + contentDescription = stringResource(Res.string.poster_logo_content_description, title), modifier = Modifier .width(catalogLogoOverlaySize.width) .height(catalogLogoOverlaySize.height), @@ -280,7 +284,7 @@ private fun NuvioViewAllPill( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "View All", + text = stringResource(Res.string.home_view_all), style = textStyle, color = MaterialTheme.colorScheme.onSurface, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/TraktListPickerDialog.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/TraktListPickerDialog.kt index 6a39e445..8684d5ae 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/TraktListPickerDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/TraktListPickerDialog.kt @@ -28,6 +28,12 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.nuvio.app.features.trakt.TraktListTab +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.action_cancel +import nuvio.composeapp.generated.resources.action_save +import nuvio.composeapp.generated.resources.compose_trakt_list_picker_loading +import nuvio.composeapp.generated.resources.compose_trakt_list_picker_subtitle +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -62,7 +68,7 @@ fun TraktListPickerDialog( color = MaterialTheme.colorScheme.onSurface, ) Text( - text = "Choose where to save this title on Trakt", + text = stringResource(Res.string.compose_trakt_list_picker_subtitle), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -91,7 +97,7 @@ fun TraktListPickerDialog( modifier = Modifier.size(24.dp), ) Text( - text = "Loading your Trakt lists…", + text = stringResource(Res.string.compose_trakt_list_picker_loading), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -151,7 +157,7 @@ fun TraktListPickerDialog( contentColor = MaterialTheme.colorScheme.onSurface, ), ) { - Text("Cancel") + Text(stringResource(Res.string.action_cancel)) } Button( onClick = onSave, @@ -164,11 +170,11 @@ fun TraktListPickerDialog( modifier = Modifier.size(16.dp), ) } else { - Text("Save") + Text(stringResource(Res.string.action_save)) } } } } } } -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonModels.kt index 163861fc..6b73ffe6 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonModels.kt @@ -1,5 +1,10 @@ package com.nuvio.app.features.addons +import kotlinx.coroutines.runBlocking +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.generic_addon +import org.jetbrains.compose.resources.getString + data class AddonManifest( val id: String, val name: String, @@ -54,7 +59,9 @@ data class ManagedAddon( val displayTitle: String get() = userSetName?.takeIf { it.isNotBlank() && it != manifest?.name } ?: manifest?.name - ?: manifestUrl.substringBefore("?").substringAfterLast("/").ifBlank { "Addon" } + ?: manifestUrl.substringBefore("?").substringAfterLast("/").ifBlank { + runBlocking { getString(Res.string.generic_addon) } + } } data class AddonsUiState( diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonRepository.kt index 4433d65a..bf4b1a4c 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonRepository.kt @@ -23,6 +23,8 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.encodeToJsonElement import kotlinx.serialization.json.put +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString @Serializable private data class AddonRow( @@ -198,17 +200,17 @@ object AddonRepository { suspend fun addAddon(rawUrl: String): AddAddonResult { if (isUsingPrimaryAddonsFromSecondaryProfile()) { - return AddAddonResult.Error("This profile uses primary addons.") + return AddAddonResult.Error(getString(Res.string.profile_primary_addons_required)) } log.i { "addAddon() — rawUrl=$rawUrl" } val manifestUrl = try { normalizeManifestUrl(rawUrl) } catch (error: IllegalArgumentException) { - return AddAddonResult.Error(error.message ?: "Enter a valid addon URL") + return AddAddonResult.Error(error.message ?: getString(Res.string.addon_invalid_url)) } if (_uiState.value.addons.any { it.manifestUrl == manifestUrl }) { - return AddAddonResult.Error("That addon is already installed.") + return AddAddonResult.Error(getString(Res.string.addon_already_installed)) } val manifest = try { @@ -220,7 +222,7 @@ object AddonRepository { ) } } catch (error: Throwable) { - return AddAddonResult.Error(error.message ?: "Unable to load manifest") + return AddAddonResult.Error(error.message ?: getString(Res.string.addon_load_manifest_failed)) } _uiState.update { current -> @@ -310,7 +312,7 @@ object AddonRepository { onFailure = { error -> addon.copy( isRefreshing = false, - errorMessage = error.message ?: "Unable to load manifest", + errorMessage = error.message ?: getString(Res.string.addon_load_manifest_failed), ) }, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonsScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonsScreen.kt index 91c85d88..32c9554e 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/addons/AddonsScreen.kt @@ -53,17 +53,19 @@ import com.nuvio.app.core.ui.NuvioSectionLabel import com.nuvio.app.core.ui.NuvioStatusModal import com.nuvio.app.core.ui.NuvioSurfaceCard import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun AddonsScreen( modifier: Modifier = Modifier, - title: String = "Addons", + title: String? = null, onBack: (() -> Unit)? = null, ) { NuvioScreen(modifier = modifier) { stickyHeader { NuvioScreenHeader( - title = title, + title = title ?: stringResource(Res.string.addon_title), onBack = onBack, ) { } @@ -88,6 +90,7 @@ internal fun AddonsSettingsPageContent( var addonUrl by rememberSaveable { mutableStateOf("") } var formMessage by rememberSaveable { mutableStateOf(null) } var installModalState by remember { mutableStateOf(null) } + val enterAddonUrlMessage = stringResource(Res.string.addons_error_enter_url) val overview = remember(uiState.addons) { uiState.addons.toOverview() } @@ -95,10 +98,10 @@ internal fun AddonsSettingsPageContent( modifier = modifier, verticalArrangement = Arrangement.spacedBy(12.dp), ) { - SectionHeader("OVERVIEW") + SectionHeader(stringResource(Res.string.addons_section_overview)) OverviewCard(overview = overview) - SectionHeader("ADD ADDON") + SectionHeader(stringResource(Res.string.addons_section_add_addon)) AddAddonCard( addonUrl = addonUrl, formMessage = formMessage, @@ -109,7 +112,7 @@ internal fun AddonsSettingsPageContent( onAddClick = { val requestedUrl = addonUrl.trim() if (requestedUrl.isBlank()) { - formMessage = "Enter an addon URL." + formMessage = enterAddonUrlMessage return@AddAddonCard } @@ -131,7 +134,7 @@ internal fun AddonsSettingsPageContent( }, ) - SectionHeader("INSTALLED ADDONS") + SectionHeader(stringResource(Res.string.addons_section_installed)) if (uiState.addons.isEmpty()) { EmptyStateCard() } else { @@ -171,12 +174,30 @@ internal fun AddonsSettingsPageContent( val modalState = installModalState if (modalState != null) { + val modalTitle = when (modalState) { + AddonInstallModalState.Checking -> stringResource(Res.string.addons_modal_checking_title) + is AddonInstallModalState.Success -> stringResource(Res.string.addons_modal_success_title) + is AddonInstallModalState.Error -> stringResource(Res.string.addons_modal_failure_title) + } + val modalMessage = when (modalState) { + AddonInstallModalState.Checking -> stringResource(Res.string.addons_modal_checking_message) + is AddonInstallModalState.Success -> stringResource( + Res.string.addons_modal_success_message, + modalState.addonName, + ) + is AddonInstallModalState.Error -> modalState.reason + } + val modalConfirmText = when (modalState) { + AddonInstallModalState.Checking -> stringResource(Res.string.addon_installing) + is AddonInstallModalState.Success -> stringResource(Res.string.action_done) + is AddonInstallModalState.Error -> stringResource(Res.string.action_close) + } NuvioStatusModal( - title = modalState.title, - message = modalState.message, + title = modalTitle, + message = modalMessage, isVisible = true, isBusy = modalState.isBusy, - confirmText = modalState.confirmText, + confirmText = modalConfirmText, onConfirm = { if (!modalState.isBusy) { installModalState = null @@ -200,19 +221,19 @@ private fun OverviewCard(overview: AddonOverview) { ) { OverviewStat( value = overview.totalAddons.toString(), - label = "Addons", + label = stringResource(Res.string.addons_overview_addons), modifier = Modifier.weight(1f), ) VerticalSeparator() OverviewStat( value = overview.activeAddons.toString(), - label = "Active", + label = stringResource(Res.string.addons_overview_active), modifier = Modifier.weight(1f), ) VerticalSeparator() OverviewStat( value = overview.totalCatalogs.toString(), - label = "Catalogs", + label = stringResource(Res.string.addons_overview_catalogs), modifier = Modifier.weight(1f), ) } @@ -264,11 +285,11 @@ private fun AddAddonCard( NuvioInputField( value = addonUrl, onValueChange = onAddonUrlChange, - placeholder = "Addon URL", + placeholder = stringResource(Res.string.addons_input_placeholder), ) Spacer(modifier = Modifier.height(18.dp)) NuvioPrimaryButton( - text = "Install Addon", + text = stringResource(Res.string.addons_install_button), enabled = addonUrl.isNotBlank(), onClick = onAddClick, ) @@ -284,33 +305,21 @@ private fun AddAddonCard( } private sealed interface AddonInstallModalState { - val title: String - val message: String - val confirmText: String val isBusy: Boolean data object Checking : AddonInstallModalState { - override val title: String = "Checking Addon" - override val message: String = "Validating the manifest URL and loading addon details before install." - override val confirmText: String = "Installing" override val isBusy: Boolean = true } data class Success( - private val addonName: String, + val addonName: String, ) : AddonInstallModalState { - override val title: String = "Addon Installed" - override val message: String = "$addonName was validated and added successfully." - override val confirmText: String = "Done" override val isBusy: Boolean = false } data class Error( - private val reason: String, + val reason: String, ) : AddonInstallModalState { - override val title: String = "Install Failed" - override val message: String = reason - override val confirmText: String = "Close" override val isBusy: Boolean = false } } @@ -319,13 +328,13 @@ private sealed interface AddonInstallModalState { private fun EmptyStateCard() { NuvioSurfaceCard { Text( - text = "No addons installed yet.", + text = stringResource(Res.string.addons_empty_title), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, ) Spacer(modifier = Modifier.height(8.dp)) Text( - text = "Add a manifest URL to start loading catalogs, metadata, streams or subtitles into Nuvio.", + text = stringResource(Res.string.addons_empty_subtitle), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -365,7 +374,7 @@ private fun InstalledAddonCard( manifest?.version?.let { version -> Spacer(modifier = Modifier.height(8.dp)) Text( - text = "Version $version", + text = stringResource(Res.string.addons_version_format, version), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -383,7 +392,7 @@ private fun InstalledAddonCard( onMoveUpClick?.let { onMoveUp -> NuvioIconActionButton( icon = Icons.Rounded.ArrowUpward, - contentDescription = "Move addon up", + contentDescription = stringResource(Res.string.addons_move_up), tint = MaterialTheme.colorScheme.onSurfaceVariant, onClick = onMoveUp, ) @@ -391,28 +400,28 @@ private fun InstalledAddonCard( onMoveDownClick?.let { onMoveDown -> NuvioIconActionButton( icon = Icons.Rounded.ArrowDownward, - contentDescription = "Move addon down", + contentDescription = stringResource(Res.string.addons_move_down), tint = MaterialTheme.colorScheme.onSurfaceVariant, onClick = onMoveDown, ) } NuvioIconActionButton( icon = Icons.Rounded.Refresh, - contentDescription = "Refresh addon", + contentDescription = stringResource(Res.string.addons_refresh), tint = MaterialTheme.colorScheme.primary, onClick = onRefreshClick, ) onConfigureClick?.let { onConfigure -> NuvioIconActionButton( icon = Icons.Rounded.Settings, - contentDescription = "Configure addon", + contentDescription = stringResource(Res.string.addons_configure), tint = MaterialTheme.colorScheme.tertiary, onClick = onConfigure, ) } NuvioIconActionButton( icon = Icons.Rounded.Delete, - contentDescription = "Delete addon", + contentDescription = stringResource(Res.string.addons_delete), tint = MaterialTheme.colorScheme.error, onClick = onDeleteClick, ) @@ -429,16 +438,16 @@ private fun InstalledAddonCard( ) { NuvioInfoBadge( text = when { - addon.isRefreshing -> "Refreshing" - manifest != null -> "Active" - else -> "Unavailable" + addon.isRefreshing -> stringResource(Res.string.addons_badge_refreshing) + manifest != null -> stringResource(Res.string.addons_badge_active) + else -> stringResource(Res.string.addons_badge_unavailable) }, ) manifest?.let { - NuvioInfoBadge(text = "${it.resources.size} resources") - NuvioInfoBadge(text = "${it.catalogs.size} catalogs") + NuvioInfoBadge(text = stringResource(Res.string.addons_badge_resources, it.resources.size)) + NuvioInfoBadge(text = stringResource(Res.string.addons_badge_catalogs, it.catalogs.size)) if (it.behaviorHints.configurable) { - NuvioInfoBadge(text = "Configurable") + NuvioInfoBadge(text = stringResource(Res.string.addons_badge_configurable)) } } } @@ -447,7 +456,7 @@ private fun InstalledAddonCard( addon.isRefreshing -> { Spacer(modifier = Modifier.height(16.dp)) Text( - text = "Loading manifest details...", + text = stringResource(Res.string.addons_loading_manifest_details), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -524,6 +533,7 @@ private fun AddonIconBadge( } } +@Composable private fun manifestSummary(manifest: AddonManifest): String { val resources = manifest.resources.joinToString(separator = ", ") { it.name } val types = manifest.types.joinToString(separator = " / ") { it.replaceFirstChar(Char::uppercase) } @@ -533,7 +543,7 @@ private fun manifestSummary(manifest: AddonManifest): String { append(resources) if (manifest.idPrefixes.isNotEmpty()) { append(" • ") - append("${manifest.idPrefixes.size} id rules") + append(stringResource(Res.string.addons_summary_id_rules, manifest.idPrefixes.size)) } if (manifest.behaviorHints.p2p) { append(" • P2P") diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/auth/AuthScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/auth/AuthScreen.kt index 2a24f2e1..c6362e85 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/auth/AuthScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/auth/AuthScreen.kt @@ -62,7 +62,22 @@ import com.nuvio.app.core.ui.NuvioSurfaceCard import kotlinx.coroutines.launch import nuvio.composeapp.generated.resources.Res import nuvio.composeapp.generated.resources.app_logo_wordmark +import nuvio.composeapp.generated.resources.compose_auth_already_have_account +import nuvio.composeapp.generated.resources.compose_auth_continue_without_account +import nuvio.composeapp.generated.resources.compose_auth_create_account +import nuvio.composeapp.generated.resources.compose_auth_dont_have_account +import nuvio.composeapp.generated.resources.compose_auth_email +import nuvio.composeapp.generated.resources.compose_auth_or_separator +import nuvio.composeapp.generated.resources.compose_auth_password +import nuvio.composeapp.generated.resources.compose_auth_sign_in +import nuvio.composeapp.generated.resources.compose_auth_sign_in_subtitle +import nuvio.composeapp.generated.resources.compose_auth_sign_up +import nuvio.composeapp.generated.resources.compose_auth_sign_up_subtitle +import nuvio.composeapp.generated.resources.compose_auth_store_locally +import nuvio.composeapp.generated.resources.compose_auth_tagline +import nuvio.composeapp.generated.resources.compose_auth_welcome_back import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource @Composable fun AuthScreen( @@ -97,7 +112,7 @@ fun AuthScreen( ) { Image( painter = painterResource(Res.drawable.app_logo_wordmark), - contentDescription = "Nuvio", + contentDescription = null, modifier = Modifier .fillMaxWidth(0.6f) .height(48.dp), @@ -105,7 +120,7 @@ fun AuthScreen( ) Spacer(modifier = Modifier.height(8.dp)) Text( - text = "Stream everything, everywhere", + text = stringResource(Res.string.compose_auth_tagline), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -119,7 +134,8 @@ fun AuthScreen( label = "heading", ) { signUp -> Text( - text = if (signUp) "Create Account" else "Welcome Back", + text = if (signUp) stringResource(Res.string.compose_auth_create_account) + else stringResource(Res.string.compose_auth_welcome_back), style = MaterialTheme.typography.headlineLarge, color = MaterialTheme.colorScheme.onSurface, ) @@ -131,8 +147,8 @@ fun AuthScreen( label = "subtitle", ) { signUp -> Text( - text = if (signUp) "Sign up to sync your data across devices" - else "Sign in to access your library and progress", + text = if (signUp) stringResource(Res.string.compose_auth_sign_up_subtitle) + else stringResource(Res.string.compose_auth_sign_in_subtitle), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -150,7 +166,7 @@ fun AuthScreen( singleLine = true, placeholder = { Text( - text = "Email", + text = stringResource(Res.string.compose_auth_email), color = MaterialTheme.colorScheme.onSurfaceVariant, ) }, @@ -183,7 +199,7 @@ fun AuthScreen( singleLine = true, placeholder = { Text( - text = "Password", + text = stringResource(Res.string.compose_auth_password), color = MaterialTheme.colorScheme.onSurfaceVariant, ) }, @@ -240,7 +256,13 @@ fun AuthScreen( Spacer(modifier = Modifier.height(24.dp)) NuvioPrimaryButton( - text = if (isLoading) "" else if (isSignUp) "Create Account" else "Sign In", + text = if (isLoading) { + "" + } else if (isSignUp) { + stringResource(Res.string.compose_auth_create_account) + } else { + stringResource(Res.string.compose_auth_sign_in) + }, enabled = email.isNotBlank() && password.length >= 6 && !isLoading, onClick = { isLoading = true @@ -279,7 +301,8 @@ fun AuthScreen( label = "togglePrompt", ) { signUp -> Text( - text = if (signUp) "Already have an account? " else "Don't have an account? ", + text = if (signUp) stringResource(Res.string.compose_auth_already_have_account) + else stringResource(Res.string.compose_auth_dont_have_account), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -290,7 +313,8 @@ fun AuthScreen( label = "toggleAction", ) { signUp -> Text( - text = if (signUp) "Sign In" else "Sign Up", + text = if (signUp) stringResource(Res.string.compose_auth_sign_in) + else stringResource(Res.string.compose_auth_sign_up), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.primary, fontWeight = FontWeight.SemiBold, @@ -317,7 +341,7 @@ fun AuthScreen( .background(MaterialTheme.colorScheme.outline), ) Text( - text = " or ", + text = stringResource(Res.string.compose_auth_or_separator), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -346,7 +370,7 @@ fun AuthScreen( ), ) { Text( - text = "Continue Without Account", + text = stringResource(Res.string.compose_auth_continue_without_account), style = MaterialTheme.typography.titleMedium, textAlign = TextAlign.Center, ) @@ -354,7 +378,7 @@ fun AuthScreen( Spacer(modifier = Modifier.height(12.dp)) Text( - text = "Your data will only be stored locally", + text = stringResource(Res.string.compose_auth_store_locally), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.Center, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/catalog/CatalogRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/catalog/CatalogRepository.kt index d1df68d4..a46ddcbf 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/catalog/CatalogRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/catalog/CatalogRepository.kt @@ -10,6 +10,8 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString const val INTERNAL_LIBRARY_MANIFEST_URL = "nuvio://library" @@ -92,7 +94,7 @@ object CatalogRepository { items = emptyList(), isLoading = false, nextSkip = null, - errorMessage = error.message ?: "Unable to load catalog items.", + errorMessage = error.message ?: getString(Res.string.catalog_load_failed), ) }, ) @@ -148,7 +150,7 @@ object CatalogRepository { items = if (reset) emptyList() else current.items, isLoading = false, nextSkip = null, - errorMessage = error.message ?: "Unable to load catalog items.", + errorMessage = error.message ?: getString(Res.string.catalog_load_failed), ) }, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/catalog/CatalogScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/catalog/CatalogScreen.kt index ec60a08d..9e53063e 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/catalog/CatalogScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/catalog/CatalogScreen.kt @@ -56,6 +56,8 @@ import com.nuvio.app.features.home.stableKey import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun CatalogScreen( @@ -329,12 +331,12 @@ private fun CatalogEmptyState( verticalArrangement = Arrangement.spacedBy(10.dp), ) { Text( - text = "No titles found", + text = stringResource(Res.string.catalog_empty_title), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onBackground, ) Text( - text = errorMessage ?: "This catalog did not return any items.", + text = errorMessage ?: stringResource(Res.string.catalog_empty_message), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt index cf2172df..e5c09ab7 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt @@ -93,10 +93,10 @@ object CollectionEditorRepository { } @OptIn(ExperimentalUuidApi::class) - fun addFolder() { + fun addFolder(defaultTitle: String) { val newFolder = CollectionFolder( id = Uuid.random().toString(), - title = "New Folder", + title = defaultTitle, ) _uiState.value = _uiState.value.copy( editingFolder = newFolder, @@ -177,13 +177,8 @@ object CollectionEditorRepository { fun updateFolderTileShape(shape: PosterShape) { val folder = _uiState.value.editingFolder ?: return - val shapeStr = when (shape) { - PosterShape.Poster -> "Poster" - PosterShape.Landscape -> "Landscape" - PosterShape.Square -> "Square" - } _uiState.value = _uiState.value.copy( - editingFolder = folder.copy(tileShape = shapeStr), + editingFolder = folder.copy(tileShape = shape.name.lowercase()), ) } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt index 8f50790c..3fb927c3 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt @@ -64,6 +64,8 @@ import com.nuvio.app.core.ui.NuvioSurfaceCard import com.nuvio.app.core.ui.nuvioSafeBottomPadding import com.nuvio.app.core.ui.PlatformBackHandler import com.nuvio.app.features.home.PosterShape +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource import sh.calvin.reorderable.ReorderableCollectionItemScope import sh.calvin.reorderable.ReorderableItem import sh.calvin.reorderable.rememberReorderableLazyListState @@ -141,7 +143,11 @@ fun CollectionEditorScreen( ) { stickyHeader { NuvioScreenHeader( - title = if (state.isNew) "New Collection" else "Edit Collection", + title = if (state.isNew) { + stringResource(Res.string.collections_new) + } else { + stringResource(Res.string.collections_editor_edit_collection) + }, onBack = onBack, ) } @@ -150,7 +156,7 @@ fun CollectionEditorScreen( NuvioInputField( value = state.title, onValueChange = { CollectionEditorRepository.setTitle(it) }, - placeholder = "Collection Title", + placeholder = stringResource(Res.string.collections_editor_placeholder_name), ) } @@ -158,7 +164,7 @@ fun CollectionEditorScreen( NuvioInputField( value = state.backdropImageUrl, onValueChange = { CollectionEditorRepository.setBackdropImageUrl(it) }, - placeholder = "Backdrop Image URL (optional)", + placeholder = stringResource(Res.string.collections_editor_placeholder_backdrop), ) } @@ -173,13 +179,13 @@ fun CollectionEditorScreen( ) { Column(modifier = Modifier.weight(1f).padding(end = 12.dp)) { Text( - text = "Pin to Top", + text = stringResource(Res.string.collections_editor_pin_above), style = MaterialTheme.typography.bodyLarge, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurface, ) Text( - text = "Display this collection above regular catalog rows.", + text = stringResource(Res.string.collections_editor_pin_above_desc), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -204,7 +210,7 @@ fun CollectionEditorScreen( item { NuvioSurfaceCard { Text( - text = "View Mode", + text = stringResource(Res.string.collections_editor_view_mode), style = MaterialTheme.typography.bodyLarge, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurface, @@ -223,9 +229,9 @@ fun CollectionEditorScreen( label = { Text( when (mode) { - FolderViewMode.TABBED_GRID -> "Tabbed Grid" - FolderViewMode.ROWS -> "Rows" - FolderViewMode.FOLLOW_LAYOUT -> "Rows" + FolderViewMode.TABBED_GRID -> stringResource(Res.string.collections_editor_view_mode_tabs) + FolderViewMode.ROWS -> stringResource(Res.string.collections_editor_view_mode_rows) + FolderViewMode.FOLLOW_LAYOUT -> stringResource(Res.string.collections_editor_view_mode_rows) } ) }, @@ -256,13 +262,13 @@ fun CollectionEditorScreen( ) { Column(modifier = Modifier.weight(1f).padding(end = 12.dp)) { Text( - text = "Show \"All\" Tab", + text = stringResource(Res.string.collections_editor_show_all_tab), style = MaterialTheme.typography.bodyLarge, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurface, ) Text( - text = "Combine all folder catalogs into a single tab.", + text = stringResource(Res.string.collections_editor_show_all_tab_desc), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -283,20 +289,23 @@ fun CollectionEditorScreen( // Folders Section Header item { + val newFolderTitle = stringResource(Res.string.collections_editor_new_folder) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { - NuvioSectionLabel(text = "FOLDERS") - TextButton(onClick = { CollectionEditorRepository.addFolder() }) { + NuvioSectionLabel(text = stringResource(Res.string.collections_editor_folders)) + TextButton( + onClick = { CollectionEditorRepository.addFolder(newFolderTitle) }, + ) { Icon( imageVector = Icons.Rounded.Add, contentDescription = null, modifier = Modifier.size(18.dp), ) Spacer(modifier = Modifier.width(4.dp)) - Text("Add Folder") + Text(stringResource(Res.string.collections_editor_add_folder)) } } } @@ -318,13 +327,13 @@ fun CollectionEditorScreen( modifier = Modifier.padding(top = 8.dp), ) { Text( - text = "No folders yet", + text = stringResource(Res.string.collections_editor_folder_empty_title), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, ) Spacer(modifier = Modifier.height(8.dp)) Text( - text = "Add one to get started.", + text = stringResource(Res.string.collections_editor_folder_empty_subtitle), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -352,7 +361,11 @@ fun CollectionEditorScreen( .padding(bottom = bottomInset), ) { NuvioPrimaryButton( - text = if (state.isNew) "Create Collection" else "Save Changes", + text = if (state.isNew) { + stringResource(Res.string.collections_editor_create_collection) + } else { + stringResource(Res.string.collections_editor_save_changes) + }, enabled = state.title.isNotBlank(), onClick = { if (CollectionEditorRepository.save()) { @@ -436,6 +449,11 @@ private fun FolderListItem( Spacer(modifier = Modifier.width(12.dp)) } Column(modifier = Modifier.weight(1f)) { + val summary = stringResource( + Res.string.collections_editor_source_count, + folder.catalogSources.size, + posterShapeLabel(folder.posterShape), + ) Text( text = folder.title, style = MaterialTheme.typography.bodyLarge, @@ -445,7 +463,7 @@ private fun FolderListItem( overflow = TextOverflow.Ellipsis, ) Text( - text = "${folder.catalogSources.size} source${if (folder.catalogSources.size != 1) "s" else ""} · ${folder.posterShape.name}", + text = summary, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -471,7 +489,7 @@ private fun FolderListItem( ) { Icon( imageVector = Icons.Rounded.Menu, - contentDescription = "Reorder", + contentDescription = stringResource(Res.string.action_reorder), modifier = Modifier.size(20.dp), tint = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -480,7 +498,7 @@ private fun FolderListItem( IconButton(onClick = onEdit, modifier = Modifier.size(36.dp)) { Icon( imageVector = Icons.Rounded.Edit, - contentDescription = "Edit", + contentDescription = stringResource(Res.string.action_edit), modifier = Modifier.size(20.dp), tint = MaterialTheme.colorScheme.primary, ) @@ -488,7 +506,7 @@ private fun FolderListItem( IconButton(onClick = onDelete, modifier = Modifier.size(36.dp)) { Icon( imageVector = Icons.Rounded.Delete, - contentDescription = "Delete", + contentDescription = stringResource(Res.string.action_delete), modifier = Modifier.size(20.dp), tint = MaterialTheme.colorScheme.error, ) @@ -514,7 +532,11 @@ private fun FolderEditorPage( NuvioScreen(modifier = Modifier.fillMaxSize()) { stickyHeader { NuvioScreenHeader( - title = if (state.folders.any { it.id == folder.id }) "Edit Folder" else "New Folder", + title = if (state.folders.any { it.id == folder.id }) { + stringResource(Res.string.collections_editor_edit_folder) + } else { + stringResource(Res.string.collections_editor_new_folder) + }, onBack = onBack, ) } @@ -522,7 +544,7 @@ private fun FolderEditorPage( item { NuvioSurfaceCard { Text( - text = "Set the folder identity, presentation, and catalog sources with the same structure as the main collections editor.", + text = stringResource(Res.string.collections_editor_folder_editor_help), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -530,24 +552,24 @@ private fun FolderEditorPage( } item { - FolderEditorSection(title = "BASICS") { + FolderEditorSection(title = stringResource(Res.string.collections_editor_section_basics)) { NuvioSurfaceCard { NuvioInputField( value = folder.title, onValueChange = { CollectionEditorRepository.updateFolderTitle(it) }, - placeholder = "Folder Title", + placeholder = stringResource(Res.string.collections_editor_placeholder_folder), ) } } } item { - FolderEditorSection(title = "APPEARANCE") { + FolderEditorSection(title = stringResource(Res.string.collections_editor_section_appearance)) { NuvioSurfaceCard { Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { Text( - text = "Cover", + text = stringResource(Res.string.collections_editor_cover), style = MaterialTheme.typography.bodyLarge, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurface, @@ -559,7 +581,7 @@ private fun FolderEditorPage( FilterChip( selected = folder.coverEmoji == null && folder.coverImageUrl == null, onClick = { CollectionEditorRepository.clearFolderCover() }, - label = { Text("None") }, + label = { Text(stringResource(Res.string.collections_editor_cover_none)) }, ) FilterChip( selected = folder.coverEmoji != null, @@ -568,7 +590,7 @@ private fun FolderEditorPage( CollectionEditorRepository.updateFolderCoverEmoji("📁") } }, - label = { Text("Emoji") }, + label = { Text(stringResource(Res.string.collections_editor_cover_emoji)) }, ) FilterChip( selected = folder.coverImageUrl != null, @@ -577,7 +599,7 @@ private fun FolderEditorPage( CollectionEditorRepository.updateFolderCoverImage("") } }, - label = { Text("Image") }, + label = { Text(stringResource(Res.string.collections_editor_cover_image_url)) }, ) } } @@ -586,7 +608,7 @@ private fun FolderEditorPage( NuvioInputField( value = folder.coverEmoji, onValueChange = { CollectionEditorRepository.updateFolderCoverEmoji(it) }, - placeholder = "Emoji", + placeholder = stringResource(Res.string.collections_editor_cover_emoji), modifier = Modifier.width(100.dp), ) } @@ -595,14 +617,14 @@ private fun FolderEditorPage( NuvioInputField( value = folder.coverImageUrl, onValueChange = { CollectionEditorRepository.updateFolderCoverImage(it) }, - placeholder = "Image URL", + placeholder = stringResource(Res.string.collections_editor_cover_image_url), ) } NuvioInputField( value = folder.focusGifUrl.orEmpty(), onValueChange = { CollectionEditorRepository.updateFolderFocusGifUrl(it) }, - placeholder = "Always-play GIF URL (optional)", + placeholder = stringResource(Res.string.collections_editor_placeholder_gif), ) } } @@ -611,7 +633,7 @@ private fun FolderEditorPage( Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { Text( - text = "Tile Shape", + text = stringResource(Res.string.collections_editor_tile_shape), style = MaterialTheme.typography.bodyLarge, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurface, @@ -624,7 +646,7 @@ private fun FolderEditorPage( FilterChip( selected = folder.posterShape == shape, onClick = { CollectionEditorRepository.updateFolderTileShape(shape) }, - label = { Text(shape.name) }, + label = { Text(posterShapeLabel(shape)) }, leadingIcon = if (folder.posterShape == shape) { { Icon( @@ -640,15 +662,15 @@ private fun FolderEditorPage( } FolderEditorToggleRow( - title = "Show GIF When Configured", - subtitle = "Play the configured GIF instead of the static cover when available.", + title = stringResource(Res.string.collections_editor_show_gif_when_configured), + subtitle = stringResource(Res.string.collections_editor_show_gif_when_configured_desc), checked = folder.focusGifEnabled, onCheckedChange = { CollectionEditorRepository.updateFolderFocusGifEnabled(it) }, ) FolderEditorToggleRow( - title = "Hide Title", - subtitle = "Only show the artwork or emoji for this folder tile.", + title = stringResource(Res.string.collections_editor_hide_title), + subtitle = stringResource(Res.string.collections_editor_hide_title_desc), checked = folder.hideTitle, onCheckedChange = { CollectionEditorRepository.updateFolderHideTitle(it) }, ) @@ -659,7 +681,7 @@ private fun FolderEditorPage( item { FolderEditorSection( - title = "CATALOG SOURCES", + title = stringResource(Res.string.collections_editor_section_catalog_sources), actions = { TextButton(onClick = { CollectionEditorRepository.showCatalogPicker() }) { Icon( @@ -668,7 +690,7 @@ private fun FolderEditorPage( modifier = Modifier.size(18.dp), ) Spacer(modifier = Modifier.width(4.dp)) - Text("Add") + Text(stringResource(Res.string.collections_editor_add_catalog)) } }, ) { @@ -676,13 +698,13 @@ private fun FolderEditorPage( NuvioSurfaceCard { Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { Text( - text = "No catalog sources yet", + text = stringResource(Res.string.collections_editor_catalog_sources_empty_title), style = MaterialTheme.typography.bodyLarge, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurface, ) Text( - text = "Add catalogs from your installed addons to define what this folder shows.", + text = stringResource(Res.string.collections_editor_catalog_sources_empty_subtitle), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -725,7 +747,7 @@ private fun FolderEditorPage( .padding(bottom = bottomInset), ) { NuvioPrimaryButton( - text = "Save Folder", + text = stringResource(Res.string.collections_editor_save), enabled = folder.title.isNotBlank(), onClick = { CollectionEditorRepository.saveFolderEdit() }, ) @@ -762,17 +784,17 @@ private fun CatalogPickerSheet( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "Select Catalog Sources", + text = stringResource(Res.string.collections_editor_select_catalogs), style = MaterialTheme.typography.titleLarge, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onSurface, ) TextButton(onClick = onDismiss) { - Text("Done") + Text(stringResource(Res.string.collections_editor_done)) } } Text( - text = "Choose the addon catalogs this folder should aggregate.", + text = stringResource(Res.string.collections_editor_select_catalogs_description), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.padding(bottom = 8.dp), @@ -831,7 +853,7 @@ private fun CatalogPickerSheet( if (isSelected) { Icon( imageVector = Icons.Rounded.Check, - contentDescription = "Selected", + contentDescription = stringResource(Res.string.cd_selected), tint = MaterialTheme.colorScheme.primary, modifier = Modifier.size(20.dp), ) @@ -872,7 +894,7 @@ private fun GenrePickerSheet( item { Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { Text( - text = "Genre Filter", + text = stringResource(Res.string.collections_editor_genre_filter), style = MaterialTheme.typography.titleLarge, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onSurface, @@ -888,7 +910,7 @@ private fun GenrePickerSheet( if (allowAll) { item { GenrePickerOptionRow( - title = "All genres", + title = stringResource(Res.string.collections_editor_all_genres), selected = selectedGenre == null, onClick = { onSelect(null) }, ) @@ -991,7 +1013,11 @@ private fun FolderCatalogSourceCard( append(" · ${source.catalogId}") } val genreOptions = matchingCatalog?.genreOptions.orEmpty() - val selectedGenreLabel = source.genre ?: if (matchingCatalog?.genreRequired == true) "Select genre" else "All genres" + val selectedGenreLabel = source.genre ?: if (matchingCatalog?.genreRequired == true) { + stringResource(Res.string.collections_editor_select_genre) + } else { + stringResource(Res.string.collections_editor_all_genres) + } NuvioSurfaceCard { Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { @@ -1019,7 +1045,7 @@ private fun FolderCatalogSourceCard( ) { Icon( imageVector = Icons.Rounded.Close, - contentDescription = "Remove", + contentDescription = stringResource(Res.string.action_remove), modifier = Modifier.size(20.dp), tint = MaterialTheme.colorScheme.error, ) @@ -1045,7 +1071,7 @@ private fun FolderCatalogSourceCard( verticalArrangement = Arrangement.spacedBy(2.dp), ) { Text( - text = "Genre Filter", + text = stringResource(Res.string.collections_editor_genre_filter), style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurface, @@ -1057,7 +1083,7 @@ private fun FolderCatalogSourceCard( ) } TextButton(onClick = onOpenGenrePicker) { - Text("Choose") + Text(stringResource(Res.string.collections_editor_choose_genre)) } } } @@ -1065,6 +1091,14 @@ private fun FolderCatalogSourceCard( } } +@Composable +private fun posterShapeLabel(shape: PosterShape): String = + when (shape) { + PosterShape.Poster -> stringResource(Res.string.collections_editor_shape_poster) + PosterShape.Square -> stringResource(Res.string.collections_editor_shape_square) + PosterShape.Landscape -> stringResource(Res.string.collections_editor_shape_wide) + } + @Composable private fun GenrePickerOptionRow( title: String, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionManagementScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionManagementScreen.kt index d1649ba0..74deba81 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionManagementScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionManagementScreen.kt @@ -55,6 +55,8 @@ import com.nuvio.app.core.ui.NuvioScreenHeader import com.nuvio.app.core.ui.NuvioSectionLabel import com.nuvio.app.core.ui.NuvioStatusModal import com.nuvio.app.core.ui.NuvioSurfaceCard +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource import sh.calvin.reorderable.ReorderableCollectionItemScope import sh.calvin.reorderable.ReorderableItem import sh.calvin.reorderable.rememberReorderableLazyListState @@ -75,7 +77,7 @@ fun CollectionManagementScreen( NuvioScreen { stickyHeader { NuvioScreenHeader( - title = "Collections", + title = stringResource(Res.string.collections_header), onBack = onBack, ) { IconButton(onClick = { @@ -84,14 +86,14 @@ fun CollectionManagementScreen( }) { Icon( imageVector = Icons.Rounded.ContentCopy, - contentDescription = "Copy JSON", + contentDescription = stringResource(Res.string.collections_copy_json), tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } IconButton(onClick = { showImportDialog = true }) { Icon( imageVector = Icons.Rounded.ContentPaste, - contentDescription = "Import", + contentDescription = stringResource(Res.string.collections_import), tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } @@ -100,8 +102,11 @@ fun CollectionManagementScreen( item { NuvioSurfaceCard { Text( - text = "${collections.size} collection${if (collections.size != 1) "s" else ""}, " + - "${collections.sumOf { it.folders.size }} folder${if (collections.sumOf { it.folders.size } != 1) "s" else ""}", + text = stringResource( + Res.string.collections_count_summary, + collections.size, + collections.sumOf { it.folders.size }, + ), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -110,13 +115,13 @@ fun CollectionManagementScreen( item { NuvioPrimaryButton( - text = "New Collection", + text = stringResource(Res.string.collections_new), onClick = { onNavigateToEditor(null) }, ) } if (collections.isNotEmpty()) { - item { NuvioSectionLabel(text = "YOUR COLLECTIONS") } + item { NuvioSectionLabel(text = stringResource(Res.string.collections_your_collections)) } } if (collections.isNotEmpty()) { @@ -142,13 +147,13 @@ fun CollectionManagementScreen( ) Spacer(modifier = Modifier.height(12.dp)) Text( - text = "No collections yet", + text = stringResource(Res.string.collections_empty_title), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, ) Spacer(modifier = Modifier.height(8.dp)) Text( - text = "Create one to organize your catalogs.", + text = stringResource(Res.string.collections_empty_subtitle), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -187,11 +192,11 @@ fun CollectionManagementScreen( val deleteId = showDeleteConfirm val deleteCollection = deleteId?.let { id -> collections.find { it.id == id } } NuvioStatusModal( - title = "Delete Collection", - message = "Delete \"${deleteCollection?.title ?: ""}\"? This cannot be undone.", + title = stringResource(Res.string.collections_delete_title), + message = stringResource(Res.string.collections_delete_message, deleteCollection?.title.orEmpty()), isVisible = deleteId != null, - confirmText = "Delete", - dismissText = "Cancel", + confirmText = stringResource(Res.string.action_delete), + dismissText = stringResource(Res.string.action_cancel), onConfirm = { if (deleteId != null) { CollectionRepository.removeCollection(deleteId) @@ -261,6 +266,13 @@ private fun CollectionListItem( verticalAlignment = Alignment.CenterVertically, ) { Column(modifier = Modifier.weight(1f)) { + val summary = buildString { + append(stringResource(Res.string.collections_folder_count, collection.folders.size)) + if (collection.pinToTop) { + append(" · ") + append(stringResource(Res.string.collections_pinned)) + } + } Text( text = collection.title, style = MaterialTheme.typography.bodyLarge, @@ -271,8 +283,7 @@ private fun CollectionListItem( ) Spacer(modifier = Modifier.height(2.dp)) Text( - text = "${collection.folders.size} folder${if (collection.folders.size != 1) "s" else ""}" + - if (collection.pinToTop) " · Pinned" else "", + text = summary, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -298,7 +309,7 @@ private fun CollectionListItem( ) { Icon( imageVector = Icons.Rounded.Menu, - contentDescription = "Reorder", + contentDescription = stringResource(Res.string.action_reorder), modifier = Modifier.size(20.dp), tint = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -310,7 +321,7 @@ private fun CollectionListItem( ) { Icon( imageVector = Icons.Rounded.Edit, - contentDescription = "Edit", + contentDescription = stringResource(Res.string.action_edit), modifier = Modifier.size(20.dp), tint = MaterialTheme.colorScheme.primary, ) @@ -321,7 +332,7 @@ private fun CollectionListItem( ) { Icon( imageVector = Icons.Rounded.Delete, - contentDescription = "Delete", + contentDescription = stringResource(Res.string.action_delete), modifier = Modifier.size(20.dp), tint = MaterialTheme.colorScheme.error, ) @@ -349,13 +360,13 @@ private fun ImportDialog( ) { Column(modifier = Modifier.padding(20.dp)) { Text( - text = "Import Collections", + text = stringResource(Res.string.collections_import_header), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, ) Spacer(modifier = Modifier.height(8.dp)) Text( - text = "Paste your collections JSON below.", + text = stringResource(Res.string.collections_import_paste_description), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -366,7 +377,12 @@ private fun ImportDialog( modifier = Modifier .fillMaxWidth() .height(160.dp), - placeholder = { Text("JSON", style = MaterialTheme.typography.bodyLarge) }, + placeholder = { + Text( + stringResource(Res.string.collections_import_json_placeholder), + style = MaterialTheme.typography.bodyLarge, + ) + }, isError = importError != null, supportingText = importError?.let { { Text(it, color = MaterialTheme.colorScheme.error) } @@ -399,7 +415,7 @@ private fun ImportDialog( contentColor = MaterialTheme.colorScheme.onSurface, ), ) { - Text("Cancel") + Text(stringResource(Res.string.action_cancel)) } Spacer(modifier = Modifier.width(10.dp)) androidx.compose.material3.Button( @@ -407,7 +423,7 @@ private fun ImportDialog( enabled = importText.isNotBlank(), shape = RoundedCornerShape(16.dp), ) { - Text("Import") + Text(stringResource(Res.string.action_import)) } } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt index 1c58ca32..fc1aacef 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt @@ -39,7 +39,7 @@ data class CollectionFolder( val focusGifUrl: String? = null, val focusGifEnabled: Boolean = true, val coverEmoji: String? = null, - val tileShape: String = "Poster", + val tileShape: String = "poster", val hideTitle: Boolean = false, val catalogSources: List = emptyList(), ) { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt index b2d19bbe..7d9f5abd 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt @@ -6,9 +6,19 @@ import com.nuvio.app.features.addons.ManagedAddon import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.runBlocking import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.collections_import_error_collection_blank_id +import nuvio.composeapp.generated.resources.collections_import_error_collection_blank_title +import nuvio.composeapp.generated.resources.collections_import_error_empty_json +import nuvio.composeapp.generated.resources.collections_import_error_folder_blank_id +import nuvio.composeapp.generated.resources.collections_import_error_folder_blank_title +import nuvio.composeapp.generated.resources.collections_import_error_invalid_json +import nuvio.composeapp.generated.resources.collections_import_error_source_blank_fields +import org.jetbrains.compose.resources.getString import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @@ -110,28 +120,68 @@ object CollectionRepository { fun validateJson(jsonString: String): ValidationResult { if (jsonString.isBlank()) { - return ValidationResult(valid = false, error = "JSON is empty.") + return ValidationResult( + valid = false, + error = runBlocking { getString(Res.string.collections_import_error_empty_json) }, + ) } return try { val collections = json.decodeFromString>(jsonString) var totalFolders = 0 collections.forEachIndexed { ci, c -> if (c.id.isBlank()) { - return ValidationResult(valid = false, error = "Collection ${ci + 1} has blank id.") + return ValidationResult( + valid = false, + error = runBlocking { + getString(Res.string.collections_import_error_collection_blank_id, ci + 1) + }, + ) } if (c.title.isBlank()) { - return ValidationResult(valid = false, error = "Collection '${c.id}' has blank title.") + return ValidationResult( + valid = false, + error = runBlocking { + getString(Res.string.collections_import_error_collection_blank_title, c.id) + }, + ) } c.folders.forEachIndexed { fi, f -> if (f.id.isBlank()) { - return ValidationResult(valid = false, error = "Folder ${fi + 1} in '${c.title}' has blank id.") + return ValidationResult( + valid = false, + error = runBlocking { + getString( + Res.string.collections_import_error_folder_blank_id, + fi + 1, + c.title, + ) + }, + ) } if (f.title.isBlank()) { - return ValidationResult(valid = false, error = "Folder '${f.id}' in '${c.title}' has blank title.") + return ValidationResult( + valid = false, + error = runBlocking { + getString( + Res.string.collections_import_error_folder_blank_title, + f.id, + c.title, + ) + }, + ) } f.catalogSources.forEachIndexed { si, s -> if (s.addonId.isBlank() || s.type.isBlank() || s.catalogId.isBlank()) { - return ValidationResult(valid = false, error = "Source ${si + 1} in folder '${f.title}' has blank fields.") + return ValidationResult( + valid = false, + error = runBlocking { + getString( + Res.string.collections_import_error_source_blank_fields, + si + 1, + f.title, + ) + }, + ) } } totalFolders++ @@ -143,7 +193,12 @@ object CollectionRepository { folderCount = totalFolders, ) } catch (e: Exception) { - ValidationResult(valid = false, error = "Invalid JSON: ${e.message}") + ValidationResult( + valid = false, + error = runBlocking { + getString(Res.string.collections_import_error_invalid_json, e.message.orEmpty()) + }, + ) } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt index 2328eb75..b7a4b096 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt @@ -6,6 +6,7 @@ import com.nuvio.app.features.catalog.CATALOG_PAGE_SIZE import com.nuvio.app.features.catalog.fetchCatalogPage import com.nuvio.app.features.catalog.mergeCatalogItems import com.nuvio.app.features.catalog.supportsPagination +import com.nuvio.app.core.i18n.localizedMediaTypeLabel import com.nuvio.app.features.home.HomeCatalogSection import com.nuvio.app.features.home.MetaPreview import com.nuvio.app.features.home.stableKey @@ -17,6 +18,11 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.collections_folder_addon_not_found +import nuvio.composeapp.generated.resources.collections_tab_all +import org.jetbrains.compose.resources.getString data class FolderTab( val label: String, @@ -113,7 +119,13 @@ object FolderDetailRepository { val tabs = buildList { if (showAll) { - add(FolderTab(label = "All", isAllTab = true, isLoading = true)) + add( + FolderTab( + label = runBlocking { getString(Res.string.collections_tab_all) }, + isAllTab = true, + isLoading = true, + ), + ) } folder.catalogSources.forEach { source -> val addon = addons.find { it.manifest?.id == source.addonId } @@ -121,9 +133,7 @@ object FolderDetailRepository { it.id == source.catalogId && it.type == source.type } val label = catalog?.name ?: source.catalogId - val typeLabel = source.type.replaceFirstChar { - if (it.isLowerCase()) it.titlecase() else it.toString() - } + val typeLabel = localizedMediaTypeLabel(source.type) val genreSuffix = if (source.genre != null) " · ${source.genre}" else "" add( FolderTab( @@ -155,7 +165,14 @@ object FolderDetailRepository { val tabIndex = if (showAll) sourceIndex + 1 else sourceIndex val addon = addons.find { it.manifest?.id == source.addonId } if (addon == null) { - updateTab(tabIndex) { it.copy(isLoading = false, error = "Addon not found: ${source.addonId}") } + updateTab(tabIndex) { + it.copy( + isLoading = false, + error = runBlocking { + getString(Res.string.collections_folder_addon_not_found, source.addonId) + }, + ) + } return@forEachIndexed } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailScreen.kt index fd065aef..07c3cb73 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailScreen.kt @@ -63,6 +63,11 @@ import com.nuvio.app.features.home.components.HomeCatalogRowSection import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.collections_folder_empty_items +import nuvio.composeapp.generated.resources.collections_folder_not_found +import nuvio.composeapp.generated.resources.collections_tab_all +import org.jetbrains.compose.resources.stringResource private val FolderCoverHeight = 176.dp @@ -143,7 +148,7 @@ fun FolderDetailScreen( contentAlignment = Alignment.Center, ) { Text( - text = "Folder not found", + text = stringResource(Res.string.collections_folder_not_found), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -229,7 +234,11 @@ private fun TabbedGridContent( onClick = { onTabSelected(index) }, text = { Text( - text = tab.label, + text = if (tab.isAllTab) { + stringResource(Res.string.collections_tab_all) + } else { + tab.label + }, maxLines = 1, overflow = TextOverflow.Ellipsis, ) @@ -395,7 +404,7 @@ private fun EmptyMessage() { contentAlignment = Alignment.Center, ) { Text( - text = "No items found", + text = stringResource(Res.string.collections_folder_empty_items), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.Center, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsParser.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsParser.kt index 6dbf3cfa..adcf6811 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsParser.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsParser.kt @@ -3,6 +3,7 @@ package com.nuvio.app.features.details import com.nuvio.app.features.streams.StreamBehaviorHints import com.nuvio.app.features.streams.StreamItem import com.nuvio.app.features.streams.StreamProxyHeaders +import kotlinx.coroutines.runBlocking import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonElement @@ -13,6 +14,8 @@ import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.intOrNull import kotlinx.serialization.json.longOrNull import kotlinx.serialization.json.jsonPrimitive +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString internal object MetaDetailsParser { private val json = Json { ignoreUnknownKeys = true } @@ -248,10 +251,10 @@ internal object MetaDetailsParser { MetaTrailer( id = trailer.string("id")?.takeIf(String::isNotBlank) ?: normalizedKey, key = normalizedKey, - name = trailer.string("name")?.takeIf(String::isNotBlank) ?: "Trailer", + name = trailer.string("name")?.takeIf(String::isNotBlank) ?: runBlocking { getString(Res.string.generic_trailer) }, site = trailer.string("site")?.takeIf(String::isNotBlank) ?: "YouTube", size = trailer.int("size"), - type = trailer.string("type")?.takeIf(String::isNotBlank) ?: "Trailer", + type = trailer.string("type")?.takeIf(String::isNotBlank) ?: runBlocking { getString(Res.string.generic_trailer) }, official = trailer.boolean("official") == true, publishedAt = trailer.string("published_at") ?: trailer.string("publishedAt"), seasonNumber = trailer.int("seasonNumber") ?: trailer.int("season_number"), @@ -273,7 +276,9 @@ internal object MetaDetailsParser { ?.objectValue("proxyHeaders") ?.toProxyHeaders() val streamData = obj["streamData"] as? JsonObject - val addonName = streamData?.string("addon") ?: obj.string("name") ?: "Embedded" + val addonName = streamData?.string("addon") + ?: obj.string("name") + ?: runBlocking { getString(Res.string.source_embedded) } StreamItem( name = obj.string("name"), description = obj.string("description") ?: obj.string("title"), diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsRepository.kt index a5d32843..61f4ba86 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsRepository.kt @@ -19,6 +19,8 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.coroutines.withTimeoutOrNull +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString object MetaDetailsRepository { private data class CachedMetaEntry( @@ -112,7 +114,7 @@ object MetaDetailsRepository { if (manifests.isEmpty()) { log.w { "No addon provides meta for type=$type id=$id" } _uiState.value = MetaDetailsUiState( - errorMessage = "No addon provides meta for this content.", + errorMessage = getString(Res.string.details_no_addon_meta), ) activeRequestKey = null return@launch @@ -157,7 +159,7 @@ object MetaDetailsRepository { } _uiState.value = MetaDetailsUiState( - errorMessage = "Could not load details from any addon.", + errorMessage = getString(Res.string.details_load_failed_all_addons), ) activeRequestKey = null } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt index 31a9614e..0161bba5 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsScreen.kt @@ -100,6 +100,9 @@ import com.nuvio.app.features.watchprogress.ContinueWatchingPreferencesRepositor import com.nuvio.app.features.watching.application.WatchingActions import com.nuvio.app.features.watching.application.WatchingState import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString +import org.jetbrains.compose.resources.stringResource @Composable @OptIn(ExperimentalSharedTransitionApi::class) @@ -186,7 +189,7 @@ fun MetaDetailsScreen( commentsCurrentPage = result.currentPage commentsPageCount = result.pageCount } catch (e: Exception) { - commentsError = e.message ?: "Failed to load comments" + commentsError = e.message ?: getString(Res.string.details_comments_load_failed) } isCommentsLoading = false } @@ -242,14 +245,14 @@ fun MetaDetailsScreen( verticalArrangement = Arrangement.spacedBy(8.dp), ) { Text( - text = "Failed to load", + text = stringResource(Res.string.details_failed_to_load), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onBackground, ) Text( text = when (networkStatusUiState.condition) { - NetworkCondition.NoInternet -> "Check your Wi-Fi or mobile data connection and try again." - NetworkCondition.ServersUnreachable -> "Your device is online, but Nuvio could not reach required servers." + NetworkCondition.NoInternet -> stringResource(Res.string.details_check_connection) + NetworkCondition.ServersUnreachable -> stringResource(Res.string.details_servers_unreachable) else -> uiState.errorMessage.orEmpty() }, style = MaterialTheme.typography.bodyMedium, @@ -262,7 +265,7 @@ fun MetaDetailsScreen( MetaDetailsRepository.load(type, id) }, ) { - Text("Retry") + Text(stringResource(Res.string.action_retry)) } } } @@ -300,7 +303,7 @@ fun MetaDetailsScreen( tab.key to (snapshot[tab.key] == true) } }.onFailure { error -> - pickerError = error.message ?: "Failed to load Trakt lists" + pickerError = error.message ?: getString(Res.string.trakt_lists_load_failed) } pickerPending = false } @@ -394,7 +397,7 @@ fun MetaDetailsScreen( } trailerPlaybackSource = resolvedSource trailerErrorMessage = if (resolvedSource == null) { - "No playable trailer stream found." + getString(Res.string.trailer_no_playable_stream) } else { null } @@ -403,13 +406,15 @@ fun MetaDetailsScreen( } } } - val playButtonLabel = remember(movieProgress, seriesAction, meta.type, hasEpisodes) { + val playText = stringResource(Res.string.action_play) + val resumeText = stringResource(Res.string.action_resume) + val playButtonLabel = remember(movieProgress, seriesAction, meta.type, hasEpisodes, playText, resumeText) { when { (meta.type == "series" || hasEpisodes) && seriesAction != null -> seriesAction.label meta.type != "series" && !hasEpisodes && movieProgress != null -> - "Resume" - else -> "Play" + resumeText + else -> playText } } val onPrimaryPlayClick: () -> Unit = { @@ -660,7 +665,7 @@ fun MetaDetailsScreen( commentsCurrentPage = result.currentPage commentsPageCount = result.pageCount } catch (e: Exception) { - commentsError = e.message ?: "Failed to load comments" + commentsError = e.message ?: getString(Res.string.details_comments_load_failed) } isCommentsLoading = false } @@ -780,7 +785,9 @@ fun MetaDetailsScreen( } EpisodeWatchedActionSheet( episode = selectedEpisode, - seasonLabel = selectedEpisode.season?.let { "Season $it" } ?: "Specials", + seasonLabel = selectedEpisode.season?.let { + stringResource(Res.string.episodes_season, it) + } ?: stringResource(Res.string.episodes_specials), isEpisodeWatched = isSelectedEpisodeWatched, canMarkPreviousEpisodes = previousEpisodes.isNotEmpty(), arePreviousEpisodesWatched = arePreviousEpisodesWatched, @@ -865,7 +872,7 @@ fun MetaDetailsScreen( }.onSuccess { showLibraryListPicker = false }.onFailure { error -> - pickerError = error.message ?: "Failed to update Trakt lists" + pickerError = error.message ?: getString(Res.string.trakt_lists_update_failed) } pickerPending = false } @@ -993,7 +1000,11 @@ private fun ConfiguredMetaSections( MetaScreenSectionKey.ACTIONS -> { DetailActionButtons( playLabel = playButtonLabel, - saveLabel = if (isSaved) "Saved" else "Save", + saveLabel = if (isSaved) { + stringResource(Res.string.action_saved) + } else { + stringResource(Res.string.action_save) + }, isSaved = isSaved, isTablet = isTablet, onPlayClick = onPrimaryPlayClick, @@ -1072,7 +1083,7 @@ private fun ConfiguredMetaSections( MetaScreenSectionKey.MORE_LIKE_THIS -> { if (hasMoreLikeThisSection) { DetailPosterRailSection( - title = "More Like This", + title = stringResource(Res.string.details_more_like_this), items = meta.moreLikeThis, watchedKeys = watchedKeys, showHeader = showHeader, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaScreenSettingsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaScreenSettingsRepository.kt index 93660110..22f1d1eb 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaScreenSettingsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaScreenSettingsRepository.kt @@ -3,11 +3,15 @@ package com.nuvio.app.features.details import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.runBlocking import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.getString enum class MetaScreenSectionKey { ACTIONS, @@ -81,8 +85,8 @@ private data class StoredMetaScreenSettingsPayload( private data class MetaScreenSectionDefinition( val key: MetaScreenSectionKey, - val title: String, - val description: String, + val titleRes: StringResource, + val descriptionRes: StringResource, ) object MetaScreenSettingsRepository { @@ -94,53 +98,53 @@ object MetaScreenSettingsRepository { private val definitions = listOf( MetaScreenSectionDefinition( key = MetaScreenSectionKey.ACTIONS, - title = "Actions", - description = "Play and save controls.", + titleRes = Res.string.meta_section_actions_title, + descriptionRes = Res.string.meta_section_actions_description, ), MetaScreenSectionDefinition( key = MetaScreenSectionKey.OVERVIEW, - title = "Overview", - description = "Synopsis, ratings, genres, and core credits.", + titleRes = Res.string.meta_section_overview_title, + descriptionRes = Res.string.meta_section_overview_description, ), MetaScreenSectionDefinition( key = MetaScreenSectionKey.PRODUCTION, - title = "Production", - description = "Studios and networks.", + titleRes = Res.string.meta_section_production_title, + descriptionRes = Res.string.meta_section_production_description, ), MetaScreenSectionDefinition( key = MetaScreenSectionKey.CAST, - title = "Cast", - description = "Principal cast list.", + titleRes = Res.string.settings_meta_cast, + descriptionRes = Res.string.meta_section_cast_description, ), MetaScreenSectionDefinition( key = MetaScreenSectionKey.COMMENTS, - title = "Comments", - description = "Trakt comments section.", + titleRes = Res.string.settings_meta_comments, + descriptionRes = Res.string.meta_section_comments_description, ), MetaScreenSectionDefinition( key = MetaScreenSectionKey.TRAILERS, - title = "Trailers", - description = "Trailer rail and playback shortcuts.", + titleRes = Res.string.settings_meta_trailers, + descriptionRes = Res.string.meta_section_trailers_description, ), MetaScreenSectionDefinition( key = MetaScreenSectionKey.EPISODES, - title = "Episodes", - description = "Seasons and episode list for series.", + titleRes = Res.string.settings_meta_episodes, + descriptionRes = Res.string.meta_section_episodes_description, ), MetaScreenSectionDefinition( key = MetaScreenSectionKey.DETAILS, - title = "Details", - description = "Runtime, status, release, language, and related info.", + titleRes = Res.string.meta_section_details_title, + descriptionRes = Res.string.meta_section_details_description, ), MetaScreenSectionDefinition( key = MetaScreenSectionKey.COLLECTION, - title = "Collection", - description = "Related collection or franchise rail.", + titleRes = Res.string.meta_section_collection_title, + descriptionRes = Res.string.meta_section_collection_description, ), MetaScreenSectionDefinition( key = MetaScreenSectionKey.MORE_LIKE_THIS, - title = "More Like This", - description = "Recommendation rail.", + titleRes = Res.string.meta_section_more_like_this_title, + descriptionRes = Res.string.meta_section_more_like_this_description, ), ) @@ -152,6 +156,7 @@ object MetaScreenSettingsRepository { private var cinematicBackground: Boolean = false private var tabLayout: Boolean = false private var episodeCardStyle: MetaEpisodeCardStyle = MetaEpisodeCardStyle.Horizontal + private fun localizedString(resource: StringResource): String = runBlocking { getString(resource) } fun ensureLoaded() { if (hasLoaded) return @@ -322,8 +327,8 @@ object MetaScreenSettingsRepository { val preference = preferences[definition.key] MetaScreenSectionItem( key = definition.key, - title = definition.title, - description = definition.description, + title = localizedString(definition.titleRes), + description = localizedString(definition.descriptionRes), enabled = preference?.enabled ?: true, order = preference?.order ?: 0, tabGroup = preference?.tabGroup, @@ -347,4 +352,4 @@ object MetaScreenSettingsRepository { ), ) } -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/PersonDetailScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/PersonDetailScreen.kt index 0a00b7a5..769456b6 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/PersonDetailScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/PersonDetailScreen.kt @@ -56,6 +56,7 @@ import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage import coil3.compose.LocalPlatformContext import coil3.request.ImageRequest +import com.nuvio.app.core.i18n.localizedShortMonthName import com.nuvio.app.core.ui.landscapePosterHeightForWidth import com.nuvio.app.core.ui.landscapePosterWidth import com.nuvio.app.core.ui.rememberPosterCardStyleUiState @@ -63,6 +64,9 @@ import com.nuvio.app.features.details.components.DetailPosterRailSection import com.nuvio.app.features.home.MetaPreview import com.nuvio.app.features.tmdb.TmdbMetadataService import com.nuvio.app.features.watchprogress.CurrentDateProvider +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString +import org.jetbrains.compose.resources.stringResource private sealed interface PersonDetailUiState { data object Loading : PersonDetailUiState @@ -96,7 +100,7 @@ fun PersonDetailScreen( uiState = if (detail != null) { PersonDetailUiState.Success(detail) } else { - PersonDetailUiState.Error("Could not load details for $personName") + PersonDetailUiState.Error(getString(Res.string.person_load_failed, personName)) } } @@ -141,7 +145,7 @@ fun PersonDetailScreen( ) { Icon( imageVector = Icons.AutoMirrored.Rounded.ArrowBack, - contentDescription = "Back", + contentDescription = stringResource(Res.string.action_back), tint = MaterialTheme.colorScheme.onSurface, ) } @@ -268,7 +272,7 @@ private fun PersonDetailContent( if (popularCredits.isNotEmpty()) { Spacer(modifier = Modifier.height(24.dp)) DetailPosterRailSection( - title = "Popular", + title = stringResource(Res.string.person_popular), items = popularCredits, watchedKeys = emptySet(), headerHorizontalPadding = 20.dp, @@ -279,7 +283,7 @@ private fun PersonDetailContent( if (latestCredits.isNotEmpty()) { Spacer(modifier = Modifier.height(24.dp)) DetailPosterRailSection( - title = "Latest", + title = stringResource(Res.string.person_latest), items = latestCredits, watchedKeys = emptySet(), headerHorizontalPadding = 20.dp, @@ -290,7 +294,7 @@ private fun PersonDetailContent( if (upcomingCredits.isNotEmpty()) { Spacer(modifier = Modifier.height(24.dp)) DetailPosterRailSection( - title = "Upcoming", + title = stringResource(Res.string.person_upcoming), items = upcomingCredits, watchedKeys = emptySet(), headerHorizontalPadding = 20.dp, @@ -405,18 +409,23 @@ private fun HeroSection( val infoItems = buildList { person.birthday?.let { bday -> val age = calculateAge(bday, person.deathday) - val ageStr = if (age != null) " (age $age)" else "" + val ageStr = if (age != null) stringResource(Res.string.person_age, age) else "" val bdayDisplay = formatDateForDisplay(bday) ?: bday val deathDisplay = person.deathday?.let { formatDateForDisplay(it) ?: it } val line = if (deathDisplay != null) { - "Born $bdayDisplay — Died $deathDisplay$ageStr" + buildString { + append(stringResource(Res.string.person_born, bdayDisplay, "")) + append(" — ") + append(stringResource(Res.string.person_died, deathDisplay)) + append(ageStr) + } } else { - "Born $bdayDisplay$ageStr" + stringResource(Res.string.person_born, bdayDisplay, ageStr) } add(line) } person.placeOfBirth?.let { add(it) } - person.knownFor?.let { add("Known for: $it") } + person.knownFor?.let { add(stringResource(Res.string.person_known_for, it)) } } if (infoItems.isNotEmpty()) { infoItems.forEach { info -> @@ -682,7 +691,7 @@ private fun PersonDetailError( ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Text( - text = "Something went wrong", + text = stringResource(Res.string.person_something_wrong), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, ) @@ -700,7 +709,7 @@ private fun PersonDetailError( contentColor = MaterialTheme.colorScheme.onPrimary, ), ) { - Text("Retry") + Text(stringResource(Res.string.action_retry)) } } } @@ -741,15 +750,11 @@ private fun calculateAge(birthday: String, deathday: String?): Int? { private fun formatDateForDisplay(date: String): String? { val parts = date.split("-").mapNotNull { it.toIntOrNull() } if (parts.size < 3) return null - val months = arrayOf( - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", - ) val month = parts[1] val day = parts[2] val year = parts[0] return if (month in 1..12) { - "${months[month - 1]} $day, $year" + "${localizedShortMonthName(month)} $day, $year" } else { null } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/TmdbEntityBrowseScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/TmdbEntityBrowseScreen.kt index 7b0793e1..2c03a8fe 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/TmdbEntityBrowseScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/TmdbEntityBrowseScreen.kt @@ -43,6 +43,8 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource import com.nuvio.app.core.ui.landscapePosterHeightForWidth import com.nuvio.app.core.ui.landscapePosterWidth import com.nuvio.app.core.ui.rememberPosterCardStyleUiState @@ -73,6 +75,7 @@ fun TmdbEntityBrowseScreen( var uiState by remember(entityKind, entityId) { mutableStateOf(EntityBrowseUiState.Loading) } + val loadFailedMessage = stringResource(Res.string.details_browse_load_failed, entityName) LaunchedEffect(entityKind, entityId) { uiState = EntityBrowseUiState.Loading @@ -85,7 +88,7 @@ fun TmdbEntityBrowseScreen( uiState = if (data != null) { EntityBrowseUiState.Success(data) } else { - EntityBrowseUiState.Error("Could not load $entityName") + EntityBrowseUiState.Error(loadFailedMessage) } } @@ -117,7 +120,7 @@ fun TmdbEntityBrowseScreen( ) { Icon( imageVector = Icons.AutoMirrored.Rounded.ArrowBack, - contentDescription = "Back", + contentDescription = stringResource(Res.string.action_back), tint = MaterialTheme.colorScheme.onSurface, ) } @@ -170,7 +173,7 @@ private fun EntityBrowseContent( contentAlignment = Alignment.Center, ) { Text( - text = "No titles found", + text = stringResource(Res.string.catalog_empty_title), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -191,18 +194,16 @@ private fun EntityBrowseContent( ) data.rails.forEach { rail -> - val railTitle = remember(rail.mediaType, rail.railType) { - val mediaLabel = when (rail.mediaType) { - TmdbEntityMediaType.MOVIE -> "Movies" - TmdbEntityMediaType.TV -> "Series" - } - val railLabel = when (rail.railType) { - TmdbEntityRailType.POPULAR -> "Popular" - TmdbEntityRailType.TOP_RATED -> "Top Rated" - TmdbEntityRailType.RECENT -> "Recent" - } - "$mediaLabel • $railLabel" + val mediaLabel = when (rail.mediaType) { + TmdbEntityMediaType.MOVIE -> stringResource(Res.string.media_movies) + TmdbEntityMediaType.TV -> stringResource(Res.string.media_series) } + val railLabel = when (rail.railType) { + TmdbEntityRailType.POPULAR -> stringResource(Res.string.details_browse_rail_popular) + TmdbEntityRailType.TOP_RATED -> stringResource(Res.string.details_browse_rail_top_rated) + TmdbEntityRailType.RECENT -> stringResource(Res.string.details_browse_rail_recent) + } + val railTitle = stringResource(Res.string.details_browse_rail_title, mediaLabel, railLabel) DetailPosterRailSection( title = railTitle, @@ -230,8 +231,8 @@ private fun EntityHeroSection( Column(modifier = modifier.padding(horizontal = 20.dp)) { Text( text = when (header.kind) { - TmdbEntityKind.COMPANY -> "Production Company" - TmdbEntityKind.NETWORK -> "Network" + TmdbEntityKind.COMPANY -> stringResource(Res.string.details_browse_kind_company) + TmdbEntityKind.NETWORK -> stringResource(Res.string.details_browse_kind_network) }, style = MaterialTheme.typography.labelLarge.copy( fontWeight = FontWeight.Medium, @@ -405,7 +406,7 @@ private fun EntityBrowseError( contentColor = MaterialTheme.colorScheme.onPrimaryContainer, ), ) { - Text("Retry") + Text(stringResource(Res.string.action_retry)) } } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/CommentDetailSheet.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/CommentDetailSheet.kt index c157b529..c13ae124 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/CommentDetailSheet.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/CommentDetailSheet.kt @@ -36,6 +36,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.nuvio.app.core.ui.NuvioModalBottomSheet import com.nuvio.app.features.trakt.TraktCommentReview +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -114,7 +116,7 @@ fun CommentDetailSheet( ) { Icon( imageVector = Icons.AutoMirrored.Rounded.KeyboardArrowLeft, - contentDescription = "Previous", + contentDescription = stringResource(Res.string.action_previous), tint = if (canGoBack) MaterialTheme.colorScheme.onSurface else MaterialTheme.colorScheme.onSurface.copy(alpha = 0.3f), modifier = Modifier.size(20.dp), @@ -140,7 +142,7 @@ fun CommentDetailSheet( ) { Icon( imageVector = Icons.AutoMirrored.Rounded.KeyboardArrowRight, - contentDescription = "Next", + contentDescription = stringResource(Res.string.action_next), tint = if (canGoForward) MaterialTheme.colorScheme.onSurface else MaterialTheme.colorScheme.onSurface.copy(alpha = 0.3f), modifier = Modifier.size(20.dp), @@ -153,13 +155,13 @@ fun CommentDetailSheet( Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { if (comment.review) { - CommentDetailChip(text = "Review") + CommentDetailChip(text = stringResource(Res.string.detail_comments_badge_review)) } if (comment.hasSpoilerContent) { - CommentDetailChip(text = "Spoiler") + CommentDetailChip(text = stringResource(Res.string.detail_comments_badge_spoiler)) } comment.rating?.let { rating -> - CommentDetailChip(text = "Rating $rating/10") + CommentDetailChip(text = stringResource(Res.string.detail_comments_badge_rating, rating)) } } @@ -173,7 +175,7 @@ fun CommentDetailSheet( ) { Text( text = if (comment.hasSpoilerContent) { - "This comment contains spoilers and has been hidden." + stringResource(Res.string.detail_comments_spoiler_hidden_sheet) } else { comment.comment }, @@ -189,7 +191,7 @@ fun CommentDetailSheet( horizontalArrangement = Arrangement.SpaceBetween, ) { Text( - text = "${comment.likes} likes", + text = stringResource(Res.string.detail_comments_likes, comment.likes), style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailActionButtons.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailActionButtons.kt index 32b3a03d..6eb1d515 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailActionButtons.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailActionButtons.kt @@ -28,13 +28,17 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.nuvio.app.core.ui.AppIconResource import com.nuvio.app.core.ui.appIconPainter +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.action_play +import nuvio.composeapp.generated.resources.action_save +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalFoundationApi::class) @Composable fun DetailActionButtons( modifier: Modifier = Modifier, - playLabel: String = "Play", - saveLabel: String = "Save", + playLabel: String = stringResource(Res.string.action_play), + saveLabel: String = stringResource(Res.string.action_save), isSaved: Boolean = false, isTablet: Boolean = false, onPlayClick: () -> Unit = {}, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailAdditionalInfoSection.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailAdditionalInfoSection.kt index 40ec96ed..e3b42fdb 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailAdditionalInfoSection.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailAdditionalInfoSection.kt @@ -19,6 +19,8 @@ import androidx.compose.ui.unit.dp import com.nuvio.app.core.format.formatReleaseDateForDisplay import com.nuvio.app.features.details.MetaDetails import com.nuvio.app.features.details.formatRuntimeForDisplay +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun DetailAdditionalInfoSection( @@ -27,14 +29,24 @@ fun DetailAdditionalInfoSection( showHeader: Boolean = true, ) { val isSeriesLike = meta.type == "series" || meta.videos.any { it.season != null || it.episode != null } - val title = if (isSeriesLike) "Show Details" else "Movie Details" + val title = if (isSeriesLike) { + stringResource(Res.string.details_show_details) + } else { + stringResource(Res.string.details_movie_details) + } val rows = buildList { - meta.status?.let { add("Status" to it) } - meta.releaseInfo?.let { add("Release Info" to formatReleaseDateForDisplay(it)) } - formatRuntimeForDisplay(meta.runtime)?.let { add("Runtime" to it) } - meta.ageRating?.let { add("Certification" to it) } - meta.country?.let { add("Origin Country" to it) } - meta.language?.let { add("Original Language" to it.uppercase()) } + meta.status?.let { add(stringResource(Res.string.details_status) to it) } + meta.releaseInfo?.let { + add(stringResource(Res.string.details_release_info) to formatReleaseDateForDisplay(it)) + } + formatRuntimeForDisplay(meta.runtime)?.let { + add(stringResource(Res.string.details_runtime) to it) + } + meta.ageRating?.let { add(stringResource(Res.string.details_certification) to it) } + meta.country?.let { add(stringResource(Res.string.details_origin_country) to it) } + meta.language?.let { + add(stringResource(Res.string.details_original_language) to it.uppercase()) + } } if (rows.isEmpty()) return diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailCastSection.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailCastSection.kt index 370a77bb..306152a5 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailCastSection.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailCastSection.kt @@ -34,6 +34,8 @@ import coil3.compose.LocalPlatformContext import coil3.request.ImageRequest import com.nuvio.app.features.details.MetaPerson import com.nuvio.app.features.details.castAvatarSharedTransitionKey +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable @OptIn(ExperimentalSharedTransitionApi::class) @@ -48,7 +50,7 @@ fun DetailCastSection( if (cast.isEmpty()) return DetailSection( - title = "Cast", + title = stringResource(Res.string.settings_meta_cast), modifier = modifier, showHeader = showHeader, ) { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailCommentsSection.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailCommentsSection.kt index 3d533343..43d740d1 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailCommentsSection.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailCommentsSection.kt @@ -40,6 +40,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.nuvio.app.features.trakt.TraktCommentReview import kotlinx.coroutines.flow.distinctUntilChanged +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun DetailCommentsSection( @@ -101,14 +103,14 @@ fun DetailCommentsSection( contentColor = MaterialTheme.colorScheme.onSurface, ), ) { - Text("Retry") + Text(stringResource(Res.string.action_retry)) } } } comments.isEmpty() -> { Text( - text = "No comments yet.", + text = stringResource(Res.string.detail_comments_empty), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -144,7 +146,7 @@ private fun CommentsHeader() { val titleSize = if (isTablet) 22.sp else 20.sp Text( - text = "Trakt Comments", + text = stringResource(Res.string.detail_comments_title), style = MaterialTheme.typography.titleLarge.copy( fontSize = titleSize, fontWeight = FontWeight.SemiBold, @@ -163,7 +165,7 @@ private fun CommentCard( val colorScheme = MaterialTheme.colorScheme val isAmoled = colorScheme.background == Color.Black && colorScheme.surface == Color(0xFF050505) val bodyText = if (review.hasSpoilerContent) { - "This comment contains spoilers." + stringResource(Res.string.detail_comments_spoiler_card) } else { review.comment } @@ -199,13 +201,13 @@ private fun CommentCard( Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { if (review.review) { - CommentChip(text = "Review") + CommentChip(text = stringResource(Res.string.detail_comments_badge_review)) } if (review.hasSpoilerContent) { - CommentChip(text = "Spoiler") + CommentChip(text = stringResource(Res.string.detail_comments_badge_spoiler)) } review.rating?.let { rating -> - CommentChip(text = "Rating $rating/10") + CommentChip(text = stringResource(Res.string.detail_comments_badge_rating, rating)) } } @@ -219,7 +221,7 @@ private fun CommentCard( ) Text( - text = "${review.likes} likes", + text = stringResource(Res.string.detail_comments_likes, review.likes), style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.7f), maxLines = 1, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailFloatingHeader.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailFloatingHeader.kt index 6fe603e9..55563357 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailFloatingHeader.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailFloatingHeader.kt @@ -41,6 +41,8 @@ import coil3.compose.AsyncImage import com.nuvio.app.core.ui.NuvioBackButton import com.nuvio.app.features.details.MetaDetails import com.nuvio.app.isIos +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun DetailFloatingHeader( @@ -112,7 +114,7 @@ fun DetailFloatingHeader( if (meta.logo != null && !logoLoadError) { AsyncImage( model = meta.logo, - contentDescription = "${meta.name} logo", + contentDescription = stringResource(Res.string.detail_logo_content_description, meta.name), modifier = Modifier .width(logoWidth) .widthIn(max = 240.dp) @@ -166,7 +168,11 @@ private fun DetailFloatingHeaderAction( ) { Icon( imageVector = if (isSaved) Icons.Default.Bookmark else Icons.Default.BookmarkBorder, - contentDescription = if (isSaved) "Remove from Library" else "Add to Library", + contentDescription = if (isSaved) { + stringResource(Res.string.hero_remove_from_library) + } else { + stringResource(Res.string.hero_add_to_library) + }, tint = MaterialTheme.colorScheme.onBackground, ) } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailHero.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailHero.kt index a091925f..4c60ee24 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailHero.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailHero.kt @@ -25,6 +25,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.graphics.graphicsLayer import coil3.compose.AsyncImage import com.nuvio.app.features.details.MetaDetails +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun DetailHero( @@ -103,7 +105,7 @@ fun DetailHero( if (meta.logo != null) { AsyncImage( model = meta.logo, - contentDescription = "${meta.name} logo", + contentDescription = stringResource(Res.string.detail_logo_content_description, meta.name), modifier = Modifier .fillMaxWidth(if (isTablet) 0.56f else 0.6f) .widthIn(max = contentMaxWidth) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailMetaInfo.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailMetaInfo.kt index 52bcde1c..50add3ca 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailMetaInfo.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailMetaInfo.kt @@ -49,7 +49,7 @@ import com.nuvio.app.features.mdblist.MdbListMetadataService.PROVIDER_METACRITIC import com.nuvio.app.features.mdblist.MdbListMetadataService.PROVIDER_TMDB import com.nuvio.app.features.mdblist.MdbListMetadataService.PROVIDER_TOMATOES import com.nuvio.app.features.mdblist.MdbListMetadataService.PROVIDER_TRAKT -import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.* import nuvio.composeapp.generated.resources.rating_audience_score import nuvio.composeapp.generated.resources.rating_imdb import nuvio.composeapp.generated.resources.rating_letterboxd @@ -58,7 +58,10 @@ import nuvio.composeapp.generated.resources.rating_rotten_tomatoes import nuvio.composeapp.generated.resources.rating_tmdb import nuvio.composeapp.generated.resources.rating_trakt import org.jetbrains.compose.resources.DrawableResource +import org.jetbrains.compose.resources.getString import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource +import kotlinx.coroutines.runBlocking import kotlin.math.absoluteValue import kotlin.math.roundToInt @@ -114,7 +117,7 @@ fun DetailMetaInfo( color = ImdbYellow, ) { Text( - text = "IMDb", + text = stringResource(Res.string.source_imdb), modifier = Modifier.padding(horizontal = 4.dp, vertical = 2.dp), style = MaterialTheme.typography.labelMedium.copy( fontSize = 10.sp, @@ -148,14 +151,14 @@ fun DetailMetaInfo( if (meta.director.isNotEmpty()) { MetaLabelValueRow( - label = "Director", + label = stringResource(Res.string.details_director), value = meta.director.joinToString(", "), ) } if (meta.writer.isNotEmpty()) { MetaLabelValueRow( - label = "Writer", + label = stringResource(Res.string.details_writer), value = meta.writer.joinToString(", "), ) } @@ -182,7 +185,11 @@ fun DetailMetaInfo( if (canExpand) { Spacer(modifier = Modifier.height(4.dp)) Text( - text = if (expanded) "Show Less" else "Show More ▾", + text = if (expanded) { + stringResource(Res.string.details_show_less) + } else { + stringResource(Res.string.details_show_more) + }, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.clickable { expanded = !expanded }, @@ -341,7 +348,7 @@ private val ratingVisuals = listOf( ), RatingVisuals( source = PROVIDER_AUDIENCE, - displayName = "Audience Score", + displayName = runBlocking { getString(Res.string.rating_audience_score) }, logo = Res.drawable.rating_audience_score, logoWidth = 16.dp, valueColor = Color(0xFFFA320A), diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailProductionSection.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailProductionSection.kt index 84072c94..b9308252 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailProductionSection.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailProductionSection.kt @@ -25,6 +25,8 @@ import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage import com.nuvio.app.features.details.MetaCompany import com.nuvio.app.features.details.MetaDetails +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalLayoutApi::class) @Composable @@ -54,7 +56,11 @@ fun DetailProductionSection( if (displayItems.isEmpty()) return DetailSection( - title = if (isSeriesLike) "Network" else "Production", + title = if (isSeriesLike) { + stringResource(Res.string.details_networks) + } else { + stringResource(Res.string.meta_section_production_title) + }, modifier = modifier, showHeader = showHeader, ) { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailSeriesContent.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailSeriesContent.kt index ce6f2a2f..a463e5a2 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailSeriesContent.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailSeriesContent.kt @@ -57,6 +57,7 @@ import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage import co.touchlab.kermit.Logger import com.nuvio.app.core.format.formatReleaseDateForDisplay +import com.nuvio.app.core.i18n.localizedSeasonEpisodeCode import com.nuvio.app.core.ui.NuvioAnimatedWatchedBadge import com.nuvio.app.core.ui.NuvioProgressBar import com.nuvio.app.features.details.MetaDetails @@ -71,6 +72,10 @@ import com.nuvio.app.features.details.seasonSortKey import com.nuvio.app.features.watchprogress.WatchProgressEntry import com.nuvio.app.features.watchprogress.buildPlaybackVideoId import com.nuvio.app.features.watching.application.WatchingState +import kotlinx.coroutines.runBlocking +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString +import org.jetbrains.compose.resources.stringResource private val log = Logger.withTag("SeriesContent") @@ -92,16 +97,16 @@ fun DetailSeriesContent( if (meta.videos.isEmpty()) { DetailSection( - title = "Episodes", + title = stringResource(Res.string.settings_meta_episodes), modifier = modifier, showHeader = showHeader, ) { Text( text = when { meta.status.equals("Not yet aired", ignoreCase = true) || meta.hasScheduledVideos -> - "Episodes have not been published by this addon yet." + stringResource(Res.string.details_series_unpublished) else -> - "This addon did not provide episode metadata for this series." + stringResource(Res.string.details_series_no_metadata) }, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, @@ -132,12 +137,12 @@ fun DetailSeriesContent( if (groupedEpisodes.isEmpty()) { if (meta.type == "series") { DetailSection( - title = "Episodes", + title = stringResource(Res.string.settings_meta_episodes), modifier = modifier, showHeader = showHeader, ) { Text( - text = "This addon returned videos for the series, but none included season or episode numbers.", + text = stringResource(Res.string.details_series_missing_numbers), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -182,7 +187,7 @@ fun DetailSeriesContent( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "Seasons", + text = stringResource(Res.string.details_seasons), style = MaterialTheme.typography.titleLarge.copy( fontSize = sizing.seasonHeaderSize, fontWeight = FontWeight.SemiBold, @@ -250,7 +255,7 @@ fun DetailSeriesContent( label = "season_episodes", ) { seasonForContent -> val sectionTitle = if (meta.type != "series" && seasons.size == 1 && seasonForContent <= 0) { - "Videos" + stringResource(Res.string.details_videos) } else { seasonForContent.label() } @@ -336,7 +341,11 @@ private fun SeasonViewModeToggle( contentAlignment = Alignment.Center, ) { Text( - text = if (isPosters) "Posters" else "Text", + text = if (isPosters) { + stringResource(Res.string.details_season_view_posters) + } else { + stringResource(Res.string.details_season_view_text) + }, style = MaterialTheme.typography.labelLarge.copy( fontSize = sizing.seasonToggleTextSize, fontWeight = FontWeight.SemiBold, @@ -1187,14 +1196,14 @@ private fun seriesContentSizing(maxWidthDp: Float): SeriesContentSizing = private fun Int.label(): String = if (this <= 0) { - "Specials" + runBlocking { getString(Res.string.episodes_specials) } } else { - "Season $this" + runBlocking { getString(Res.string.episodes_season, this@label) } } private fun MetaVideo.episodeBadge(): String = when { - episode != null -> "E${episode.toString().padStart(2, '0')}" - season != null -> "S${season.toString().padStart(2, '0')}" - else -> "FILE" + episode != null || season != null -> + localizedSeasonEpisodeCode(seasonNumber = season, episodeNumber = episode).orEmpty() + else -> runBlocking { getString(Res.string.details_episode_badge_file) } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailTrailersSection.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailTrailersSection.kt index e4e02355..0edc1a3c 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailTrailersSection.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailTrailersSection.kt @@ -38,6 +38,11 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage import com.nuvio.app.features.details.MetaTrailer +import nuvio.composeapp.generated.resources.* +import nuvio.composeapp.generated.resources.detail_tab_trailer +import nuvio.composeapp.generated.resources.detail_trailer_category_count +import nuvio.composeapp.generated.resources.detail_trailers_title +import org.jetbrains.compose.resources.stringResource @Composable fun DetailTrailersSection( @@ -48,10 +53,11 @@ fun DetailTrailersSection( ) { if (trailers.isEmpty()) return + val trailerLabel = stringResource(Res.string.detail_tab_trailer) val grouped = remember(trailers) { linkedMapOf>().apply { trailers.forEach { trailer -> - val category = trailer.type.ifBlank { "Trailer" } + val category = trailer.type.ifBlank { trailerLabel } getOrPut(category) { mutableListOf() }.add(trailer) } } @@ -60,7 +66,7 @@ fun DetailTrailersSection( if (grouped.isEmpty()) return val initialCategory = remember(grouped) { - grouped.keys.firstOrNull { it.equals("Trailer", ignoreCase = true) } + grouped.keys.firstOrNull { it.equals(trailerLabel, ignoreCase = true) } ?: grouped.keys.first() } var selectedCategory by remember(grouped) { mutableStateOf(initialCategory) } @@ -82,7 +88,7 @@ fun DetailTrailersSection( ) { if (showHeader) { DetailSectionTitle( - title = "Trailers", + title = stringResource(Res.string.detail_trailers_title), fullWidth = false, ) } @@ -131,7 +137,7 @@ fun DetailTrailersSection( DropdownMenuItem( text = { Text( - text = "$category ($count)", + text = stringResource(Res.string.detail_trailer_category_count, category, count), style = MaterialTheme.typography.bodyMedium, ) }, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/EpisodeWatchedActionSheet.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/EpisodeWatchedActionSheet.kt index 5a66d7e5..44c02bba 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/EpisodeWatchedActionSheet.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/EpisodeWatchedActionSheet.kt @@ -29,8 +29,11 @@ import com.nuvio.app.core.ui.NuvioBottomSheetDivider import com.nuvio.app.core.ui.NuvioModalBottomSheet import com.nuvio.app.core.ui.dismissNuvioBottomSheet import com.nuvio.app.core.ui.nuvioSafeBottomPadding +import com.nuvio.app.core.i18n.localizedSeasonEpisodeCode import com.nuvio.app.features.details.MetaVideo import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -71,7 +74,11 @@ fun EpisodeWatchedActionSheet( NuvioBottomSheetDivider() NuvioBottomSheetActionRow( icon = Icons.Default.CheckCircle, - title = if (isEpisodeWatched) "Mark as unwatched" else "Mark as watched", + title = if (isEpisodeWatched) { + stringResource(Res.string.episode_mark_unwatched) + } else { + stringResource(Res.string.episode_mark_watched) + }, onClick = { onToggleWatched() coroutineScope.launch { @@ -84,9 +91,9 @@ fun EpisodeWatchedActionSheet( NuvioBottomSheetActionRow( icon = Icons.Default.DoneAll, title = if (arePreviousEpisodesWatched) { - "Mark previous as unwatched" + stringResource(Res.string.episode_mark_previous_unwatched) } else { - "Mark previous as watched" + stringResource(Res.string.episode_mark_previous_watched) }, onClick = { onTogglePreviousWatched() @@ -100,9 +107,9 @@ fun EpisodeWatchedActionSheet( NuvioBottomSheetActionRow( icon = Icons.Default.PlaylistAddCheckCircle, title = if (isSeasonWatched) { - "Mark $seasonLabel as unwatched" + stringResource(Res.string.episode_mark_season_unwatched, seasonLabel) } else { - "Mark $seasonLabel as watched" + stringResource(Res.string.episode_mark_season_watched, seasonLabel) }, onClick = { onToggleSeasonWatched() @@ -115,7 +122,7 @@ fun EpisodeWatchedActionSheet( NuvioBottomSheetDivider() NuvioBottomSheetActionRow( icon = Icons.Default.PlayArrow, - title = "Play manually", + title = stringResource(Res.string.play_manually), onClick = { onPlayManually() coroutineScope.launch { @@ -149,8 +156,11 @@ private fun EpisodeActionSheetHeader( ) Text( text = buildString { - if (episode.season != null && episode.episode != null) { - append("S${episode.season}E${episode.episode}") + localizedSeasonEpisodeCode( + seasonNumber = episode.season, + episodeNumber = episode.episode, + )?.let { + append(it) append(" • ") } append(seasonLabel) @@ -162,4 +172,3 @@ private fun EpisodeActionSheetHeader( ) } } - diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/TrailerPlayerPopup.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/TrailerPlayerPopup.kt index 33142d68..c12ead6b 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/TrailerPlayerPopup.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/TrailerPlayerPopup.kt @@ -39,6 +39,8 @@ import com.nuvio.app.features.player.PlatformPlayerSurface import com.nuvio.app.features.player.PlayerResizeMode import com.nuvio.app.features.trailer.TrailerPlaybackSource import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -55,7 +57,7 @@ fun TrailerPlayerPopup( ) { if (!visible) return - val headerType = trailerType.trim().ifBlank { "Trailer" } + val headerType = trailerType.trim().ifBlank { stringResource(Res.string.detail_tab_trailer) } val headerSubtitle = buildList { if (trailerTitle.isNotBlank() && !trailerTitle.equals(headerType, ignoreCase = true)) { add(trailerTitle) @@ -119,7 +121,7 @@ fun TrailerPlayerPopup( IconButton(onClick = dismissSheet) { Icon( imageVector = Icons.Rounded.Close, - contentDescription = "Close trailer", + contentDescription = stringResource(Res.string.trailer_close), tint = MaterialTheme.colorScheme.onSurface, ) } @@ -147,7 +149,7 @@ fun TrailerPlayerPopup( verticalArrangement = Arrangement.spacedBy(8.dp), ) { Text( - text = "Unable to play trailer", + text = stringResource(Res.string.trailer_unable_to_play), style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onSurface, ) @@ -160,7 +162,7 @@ fun TrailerPlayerPopup( ) if (onRetry != null) { TextButton(onClick = onRetry) { - Text("Retry") + Text(stringResource(Res.string.action_retry)) } } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsModels.kt index 05b1d0bf..94769875 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsModels.kt @@ -1,6 +1,13 @@ package com.nuvio.app.features.downloads import kotlinx.serialization.Serializable +import kotlinx.coroutines.runBlocking +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.downloads_enqueue_missing_url +import nuvio.composeapp.generated.resources.downloads_enqueue_replaced +import nuvio.composeapp.generated.resources.downloads_enqueue_started +import nuvio.composeapp.generated.resources.downloads_enqueue_unsupported_format +import org.jetbrains.compose.resources.getString @Serializable enum class DownloadStatus { @@ -48,22 +55,7 @@ data class DownloadItem( get() = status == DownloadStatus.Completed && !localFileUri.isNullOrBlank() val displaySubtitle: String - get() = if (isEpisode) { - buildString { - append("S") - append(seasonNumber) - append("E") - append(episodeNumber) - episodeTitle - ?.takeIf { it.isNotBlank() } - ?.let { - append(" • ") - append(it) - } - } - } else { - "Movie" - } + get() = episodeTitle.orEmpty() val progressFraction: Float get() { @@ -91,11 +83,18 @@ data class DownloadsUiState( get() = items.filter { it.status == DownloadStatus.Completed } } -enum class DownloadEnqueueResult( - val toastMessage: String, -) { - Started("Download started"), - Replaced("Replaced previous download"), - MissingUrl("No direct stream link available"), - UnsupportedFormat("Unsupported stream format for downloads"), +enum class DownloadEnqueueResult { + Started, + Replaced, + MissingUrl, + UnsupportedFormat; + + fun toastMessage(): String = runBlocking { + when (this@DownloadEnqueueResult) { + Started -> getString(Res.string.downloads_enqueue_started) + Replaced -> getString(Res.string.downloads_enqueue_replaced) + MissingUrl -> getString(Res.string.downloads_enqueue_missing_url) + UnsupportedFormat -> getString(Res.string.downloads_enqueue_unsupported_format) + } + } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsRepository.kt index d60b97a0..f6e715ba 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsRepository.kt @@ -1,6 +1,7 @@ package com.nuvio.app.features.downloads import com.nuvio.app.features.streams.StreamItem +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -9,6 +10,8 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString object DownloadsRepository { private val _uiState = MutableStateFlow(DownloadsUiState()) @@ -294,7 +297,7 @@ object DownloadsRepository { } else { current.copy( status = DownloadStatus.Failed, - errorMessage = message.ifBlank { "Download failed" }, + errorMessage = message.ifBlank { runBlocking { getString(Res.string.download_failed) } }, updatedAtEpochMs = DownloadsClock.nowEpochMs(), ) } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsScreen.kt index d1215d60..d8952adf 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsScreen.kt @@ -35,8 +35,11 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.nuvio.app.core.i18n.localizedByteUnit import com.nuvio.app.core.ui.NuvioScreen import com.nuvio.app.core.ui.NuvioScreenHeader +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun DownloadsScreen( @@ -66,9 +69,9 @@ fun DownloadsScreen( stickyHeader { NuvioScreenHeader( title = if (selectedShowId == null) { - "Downloads" + stringResource(Res.string.compose_settings_root_downloads_title) } else { - selectedShowTitle ?: "Show Downloads" + selectedShowTitle ?: stringResource(Res.string.downloads_show_downloads) }, onBack = { if (selectedShowId != null) { @@ -115,7 +118,7 @@ private fun LazyListScope.downloadsRootContent( if (activeItems.isNotEmpty()) { item { - SectionTitle("ACTIVE") + SectionTitle(stringResource(Res.string.downloads_section_active)) } items( items = activeItems, @@ -134,7 +137,7 @@ private fun LazyListScope.downloadsRootContent( if (completedMovies.isNotEmpty()) { item { - SectionTitle("MOVIES") + SectionTitle(stringResource(Res.string.downloads_section_movies)) } items( items = completedMovies, @@ -153,7 +156,7 @@ private fun LazyListScope.downloadsRootContent( if (completedShows.isNotEmpty()) { item { - SectionTitle("SHOWS") + SectionTitle(stringResource(Res.string.downloads_section_shows)) } items( items = completedShows, @@ -186,7 +189,7 @@ private fun LazyListScope.downloadsRootContent( overflow = TextOverflow.Ellipsis, ) Text( - text = "${episodes.size} downloaded episode${if (episodes.size == 1) "" else "s"}", + text = stringResource(Res.string.downloads_episode_count, episodes.size), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -210,7 +213,7 @@ private fun LazyListScope.downloadsRootContent( contentAlignment = Alignment.Center, ) { Text( - text = "No downloads yet", + text = stringResource(Res.string.downloads_empty_title), style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -245,7 +248,7 @@ private fun LazyListScope.downloadsShowContent( contentAlignment = Alignment.Center, ) { Text( - text = "No completed episodes", + text = stringResource(Res.string.downloads_empty_episodes), style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -255,13 +258,14 @@ private fun LazyListScope.downloadsShowContent( } seasons.forEach { (seasonNumber, entries) -> - val seasonTitle = if (seasonNumber == 0) { - "Specials" - } else { - "Season $seasonNumber" - } item { - SectionTitle(seasonTitle) + SectionTitle( + if (seasonNumber == 0) { + stringResource(Res.string.episodes_specials) + } else { + stringResource(Res.string.episodes_season, seasonNumber) + }, + ) } val sortedEpisodes = entries.sortedWith( @@ -345,7 +349,7 @@ private fun DownloadRow( IconButton(onClick = onPause) { Icon( imageVector = Icons.Rounded.Pause, - contentDescription = "Pause", + contentDescription = stringResource(Res.string.compose_action_pause), ) } } @@ -353,7 +357,7 @@ private fun DownloadRow( IconButton(onClick = onResume) { Icon( imageVector = Icons.Rounded.PlayArrow, - contentDescription = "Resume", + contentDescription = stringResource(Res.string.action_resume), ) } } @@ -361,7 +365,7 @@ private fun DownloadRow( IconButton(onClick = onRetry) { Icon( imageVector = Icons.Rounded.Refresh, - contentDescription = "Retry", + contentDescription = stringResource(Res.string.action_retry), ) } } @@ -369,7 +373,7 @@ private fun DownloadRow( IconButton(onClick = onOpen) { Icon( imageVector = Icons.Rounded.PlayArrow, - contentDescription = "Play", + contentDescription = stringResource(Res.string.action_play), ) } } @@ -377,7 +381,7 @@ private fun DownloadRow( IconButton(onClick = onDelete) { Icon( imageVector = Icons.Rounded.Delete, - contentDescription = "Delete", + contentDescription = stringResource(Res.string.action_delete), ) } } @@ -410,6 +414,7 @@ private fun SectionTitle(title: String) { ) } +@Composable private fun statusText(item: DownloadItem): String { val size = if (item.totalBytes != null && item.totalBytes > 0L) { "${formatBytes(item.downloadedBytes)} / ${formatBytes(item.totalBytes)}" @@ -418,23 +423,26 @@ private fun statusText(item: DownloadItem): String { } return when (item.status) { - DownloadStatus.Downloading -> "Downloading • $size" - DownloadStatus.Paused -> "Paused • $size" - DownloadStatus.Completed -> "Completed • ${formatBytes(item.totalBytes ?: item.downloadedBytes)}" - DownloadStatus.Failed -> item.errorMessage ?: "Failed" + DownloadStatus.Downloading -> stringResource(Res.string.downloads_status_downloading, size) + DownloadStatus.Paused -> stringResource(Res.string.downloads_status_paused, size) + DownloadStatus.Completed -> stringResource( + Res.string.downloads_status_completed, + formatBytes(item.totalBytes ?: item.downloadedBytes), + ) + DownloadStatus.Failed -> item.errorMessage ?: stringResource(Res.string.downloads_status_failed) } } private fun formatBytes(bytes: Long): String { - if (bytes <= 0L) return "0 B" + if (bytes <= 0L) return "0 ${localizedByteUnit("B")}" val kib = 1024.0 val mib = kib * 1024.0 val gib = mib * 1024.0 val value = bytes.toDouble() return when { - value >= gib -> "${((value / gib) * 10.0).toInt() / 10.0} GB" - value >= mib -> "${((value / mib) * 10.0).toInt() / 10.0} MB" - value >= kib -> "${((value / kib) * 10.0).toInt() / 10.0} KB" - else -> "$bytes B" + value >= gib -> "${((value / gib) * 10.0).toInt() / 10.0} ${localizedByteUnit("GB")}" + value >= mib -> "${((value / mib) * 10.0).toInt() / 10.0} ${localizedByteUnit("MB")}" + value >= kib -> "${((value / kib) * 10.0).toInt() / 10.0} ${localizedByteUnit("KB")}" + else -> "$bytes ${localizedByteUnit("B")}" } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeCatalogDefinitions.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeCatalogDefinitions.kt index 52342795..74f54494 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeCatalogDefinitions.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeCatalogDefinitions.kt @@ -1,7 +1,12 @@ package com.nuvio.app.features.home +import com.nuvio.app.core.i18n.localizedMediaTypeLabel import com.nuvio.app.features.addons.ManagedAddon import com.nuvio.app.features.catalog.supportsPagination +import kotlinx.coroutines.runBlocking +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.home_catalog_default_title +import org.jetbrains.compose.resources.getString data class HomeCatalogDefinition( val key: String, @@ -23,7 +28,13 @@ fun buildHomeCatalogDefinitions(addons: List): List HomeCatalogDefinition( key = "${manifest.id}:${catalog.type}:${catalog.id}", - defaultTitle = "${catalog.name} - ${catalog.type.displayLabel()}", + defaultTitle = runBlocking { + getString( + Res.string.home_catalog_default_title, + catalog.name, + localizedMediaTypeLabel(catalog.type), + ) + }, addonName = addon.displayTitle, manifestUrl = addon.manifestUrl, type = catalog.type, @@ -33,7 +44,4 @@ fun buildHomeCatalogDefinitions(addons: List): List - if (char.isLowerCase()) char.titlecase() else char.toString() - } +internal fun String.displayLabel(): String = localizedMediaTypeLabel(this) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeCatalogSettingsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeCatalogSettingsRepository.kt index ee49f681..96b5ba6a 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeCatalogSettingsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/HomeCatalogSettingsRepository.kt @@ -3,6 +3,7 @@ package com.nuvio.app.features.home import com.nuvio.app.features.addons.ManagedAddon import com.nuvio.app.features.collection.Collection import com.nuvio.app.features.collection.CollectionRepository +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -10,6 +11,8 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString data class HomeCatalogSettingsItem( val key: String, @@ -480,7 +483,7 @@ internal fun buildCollectionDefinitions(collections: List): List 0f } ?.let { (it / 100f).coerceIn(0f, 1f) } @@ -679,7 +654,7 @@ private fun CachedInProgressItem.toContinueWatchingItem(): ContinueWatchingItem parentMetaType = contentType, videoId = videoId, title = name, - subtitle = subtitle, + subtitle = episodeTitle.orEmpty(), imageUrl = episodeThumbnail ?: backdrop ?: poster, logo = logo, poster = poster, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeContinueWatchingSection.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeContinueWatchingSection.kt index c4281808..1fd74b47 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeContinueWatchingSection.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeContinueWatchingSection.kt @@ -37,12 +37,15 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage +import com.nuvio.app.core.ui.localizedContinueWatchingSubtitle import com.nuvio.app.core.ui.NuvioProgressBar import com.nuvio.app.core.ui.NuvioShelfSection import com.nuvio.app.core.ui.posterCardClickable import com.nuvio.app.features.watchprogress.ContinueWatchingItem import com.nuvio.app.features.watchprogress.ContinueWatchingSectionStyle import kotlin.math.roundToInt +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource private fun continueWatchingProgressPercent(progressFraction: Float): Int = (progressFraction * 100f).roundToInt().coerceIn(1, 99) @@ -95,7 +98,7 @@ private fun HomeContinueWatchingSectionContent( onItemLongPress: ((ContinueWatchingItem) -> Unit)?, ) { NuvioShelfSection( - title = "Continue Watching", + title = stringResource(Res.string.compose_settings_page_continue_watching), entries = items, modifier = modifier, headerHorizontalPadding = sectionPadding, @@ -305,11 +308,7 @@ private fun ContinueWatchingWideCard( ) { val isEpisodeCard = item.seasonNumber != null && item.episodeNumber != null val hasEpisodeTitle = !item.episodeTitle.isNullOrBlank() - val wideMetaLine = when { - item.progressFraction <= 0f && isEpisodeCard -> "Up Next • S${item.seasonNumber}E${item.episodeNumber}" - isEpisodeCard -> "S${item.seasonNumber}E${item.episodeNumber}" - else -> item.subtitle - } + val wideMetaLine = localizedContinueWatchingSubtitle(item) Column(verticalArrangement = Arrangement.spacedBy(6.dp)) { Row( modifier = Modifier.fillMaxWidth(), @@ -364,7 +363,10 @@ private fun ContinueWatchingWideCard( trackColor = Color.White.copy(alpha = 0.10f), ) Text( - text = "${continueWatchingProgressPercent(item.progressFraction)}% watched", + text = stringResource( + Res.string.home_continue_watching_watched, + continueWatchingProgressPercent(item.progressFraction), + ), style = MaterialTheme.typography.labelSmall.copy( fontSize = layout.progressLabelSize, fontWeight = FontWeight.Medium, @@ -466,7 +468,11 @@ private fun ContinueWatchingPosterCard( } if (item.seasonNumber != null && item.episodeNumber != null) { Text( - text = "S${item.seasonNumber} E${item.episodeNumber}", + text = stringResource( + Res.string.streams_episode_badge, + item.seasonNumber, + item.episodeNumber, + ), modifier = Modifier.padding(start = 6.dp), style = MaterialTheme.typography.labelSmall.copy( fontSize = layout.posterMetaSize, @@ -519,7 +525,7 @@ private fun UpNextBadge( ), ) { Text( - text = "Up next", + text = stringResource(Res.string.home_continue_watching_up_next), style = MaterialTheme.typography.labelSmall.copy( fontSize = textSize, fontWeight = FontWeight.Bold, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeHeroSection.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeHeroSection.kt index 15f08ebb..32ab8059 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeHeroSection.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeHeroSection.kt @@ -52,6 +52,8 @@ import com.nuvio.app.core.format.formatReleaseDateForDisplay import com.nuvio.app.features.home.MetaPreview import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource import kotlin.math.abs private const val HERO_BACKGROUND_PARALLAX = 0.055f @@ -256,7 +258,7 @@ fun HomeHeroSection( shape = RoundedCornerShape(40.dp), ) { Text( - text = "View Details", + text = stringResource(Res.string.home_view_details), modifier = Modifier.padding(horizontal = 28.dp, vertical = 12.dp), style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Bold, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/library/LibraryRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/library/LibraryRepository.kt index a3983cbf..7aae75f8 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/library/LibraryRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/library/LibraryRepository.kt @@ -11,6 +11,7 @@ import io.github.jan.supabase.postgrest.rpc import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -24,6 +25,9 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.encodeToJsonElement import kotlinx.serialization.json.put +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.library_other +import org.jetbrains.compose.resources.getString @Serializable private data class StoredLibraryPayload( @@ -366,7 +370,7 @@ private fun LibraryItem.toSyncItem(): LibrarySyncItem = LibrarySyncItem( internal fun String.toLibraryDisplayTitle(): String { val normalized = trim() - if (normalized.isBlank()) return "Other" + if (normalized.isBlank()) return runBlocking { getString(Res.string.library_other) } return normalized .split('-', '_', ' ') @@ -374,5 +378,5 @@ internal fun String.toLibraryDisplayTitle(): String { .joinToString(" ") { token -> token.lowercase().replaceFirstChar { char -> char.uppercase() } } - .ifBlank { "Other" } + .ifBlank { runBlocking { getString(Res.string.library_other) } } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/library/LibraryScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/library/LibraryScreen.kt index 1f86203f..9b48e32d 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/library/LibraryScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/library/LibraryScreen.kt @@ -32,6 +32,8 @@ import com.nuvio.app.features.home.components.HomePosterCard import com.nuvio.app.features.home.components.HomeSkeletonRow import com.nuvio.app.features.profiles.ProfileRepository import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun LibraryScreen( @@ -84,7 +86,11 @@ fun LibraryScreen( .background(MaterialTheme.colorScheme.background), ) { NuvioScreenHeader( - title = if (isTraktSource) "Trakt Library" else "Library", + title = if (isTraktSource) { + stringResource(Res.string.library_trakt_title) + } else { + stringResource(Res.string.library_title) + }, modifier = Modifier.padding(horizontal = 16.dp), ) Spacer(modifier = Modifier.height(6.dp)) @@ -116,7 +122,11 @@ fun LibraryScreen( } else { HomeEmptyStateCard( modifier = Modifier.padding(horizontal = 16.dp), - title = if (isTraktSource) "Couldn't load Trakt library" else "Couldn't load library", + title = if (isTraktSource) { + stringResource(Res.string.library_trakt_load_failed) + } else { + stringResource(Res.string.library_load_failed) + }, message = uiState.errorMessage.orEmpty(), ) } @@ -139,11 +149,15 @@ fun LibraryScreen( } else { HomeEmptyStateCard( modifier = Modifier.padding(horizontal = 16.dp), - title = if (isTraktSource) "Your Trakt library is empty" else "Your library is empty", - message = if (isTraktSource) { - "Connect Trakt and save titles to your watchlist or personal lists." + title = if (isTraktSource) { + stringResource(Res.string.library_trakt_empty_title) } else { - "Saved titles will appear here after you tap Save on a details screen." + stringResource(Res.string.library_empty_title) + }, + message = if (isTraktSource) { + stringResource(Res.string.library_trakt_empty_message) + } else { + stringResource(Res.string.library_empty_message) }, ) } @@ -166,11 +180,13 @@ fun LibraryScreen( } NuvioStatusModal( - title = "Remove from Library?", - message = pendingRemovalItem?.let { "Remove ${it.name} from your library?" }.orEmpty(), + title = stringResource(Res.string.library_remove_title), + message = pendingRemovalItem?.let { + stringResource(Res.string.library_remove_message, it.name) + }.orEmpty(), isVisible = pendingRemovalItem != null, - confirmText = "Remove", - dismissText = "Cancel", + confirmText = stringResource(Res.string.library_remove_confirm), + dismissText = stringResource(Res.string.action_cancel), onConfirm = { pendingRemovalItem?.id?.let(LibraryRepository::remove) pendingRemovalItem = null diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationsModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationsModels.kt index fa4ec03c..2e71f651 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationsModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationsModels.kt @@ -1,6 +1,15 @@ package com.nuvio.app.features.notifications +import kotlinx.coroutines.runBlocking import kotlinx.serialization.Serializable +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_player_episode_code_episode_only +import nuvio.composeapp.generated.resources.compose_player_episode_code_full +import nuvio.composeapp.generated.resources.notifications_episode_release_body_code +import nuvio.composeapp.generated.resources.notifications_episode_release_body_code_title +import nuvio.composeapp.generated.resources.notifications_episode_release_body_generic +import nuvio.composeapp.generated.resources.notifications_episode_release_body_title +import org.jetbrains.compose.resources.getString import kotlin.math.abs data class EpisodeReleaseNotificationsUiState( @@ -76,16 +85,24 @@ internal fun buildEpisodeReleaseNotificationBody( seasonNumber: Int?, episodeNumber: Int?, episodeTitle: String?, -): String { - val seasonLabel = seasonNumber?.let { season -> "S${season.toString().padStart(2, '0')}" } - val episodeLabel = episodeNumber?.let { episode -> "E${episode.toString().padStart(2, '0')}" } - val code = listOfNotNull(seasonLabel, episodeLabel).joinToString(separator = "") +): String = runBlocking { + val code = when { + seasonNumber != null && episodeNumber != null -> + getString(Res.string.compose_player_episode_code_full, seasonNumber, episodeNumber) + episodeNumber != null -> + getString(Res.string.compose_player_episode_code_episode_only, episodeNumber) + else -> "" + } val title = episodeTitle?.trim().takeUnless { it.isNullOrBlank() } - return when { - code.isNotBlank() && title != null -> "$code • $title is out now" - code.isNotBlank() -> "$code is out now" - title != null -> "$title is out now" - else -> "A new episode is out now" + when { + code.isNotBlank() && title != null -> + getString(Res.string.notifications_episode_release_body_code_title, code, title) + code.isNotBlank() -> + getString(Res.string.notifications_episode_release_body_code, code) + title != null -> + getString(Res.string.notifications_episode_release_body_title, title) + else -> + getString(Res.string.notifications_episode_release_body_generic) } -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationsRepository.kt index a7d41fa5..c2ab3eac 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/notifications/EpisodeReleaseNotificationsRepository.kt @@ -28,6 +28,8 @@ import kotlin.concurrent.Volatile import kotlinx.coroutines.withTimeoutOrNull import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString import kotlinx.serialization.json.Json object EpisodeReleaseNotificationsRepository { @@ -149,7 +151,7 @@ object EpisodeReleaseNotificationsRepository { permissionGranted = false, scheduledCount = 0, statusMessage = null, - errorMessage = "Notifications permission is disabled for Nuvio.", + errorMessage = getString(Res.string.settings_notifications_permission_disabled), ) persist() return@launch @@ -175,7 +177,7 @@ object EpisodeReleaseNotificationsRepository { _uiState.value = _uiState.value.copy( isSendingTest = false, statusMessage = null, - errorMessage = "Save a show to your library first to test a deeplink notification.", + errorMessage = getString(Res.string.settings_notifications_test_requires_saved_show), ) return@launch } @@ -197,7 +199,7 @@ object EpisodeReleaseNotificationsRepository { isSendingTest = false, permissionGranted = false, statusMessage = null, - errorMessage = "Notifications permission is disabled for Nuvio.", + errorMessage = getString(Res.string.settings_notifications_permission_disabled), ) return@launch } @@ -205,7 +207,7 @@ object EpisodeReleaseNotificationsRepository { val request = EpisodeReleaseNotificationRequest( requestId = "episode-release-test-${ProfileRepository.activeProfileId}-${TraktPlatformClock.nowEpochMs()}", notificationTitle = target.name, - notificationBody = "Preview episode release alert.", + notificationBody = getString(Res.string.notifications_test_preview_body), releaseDateIso = CurrentDateProvider.todayIsoDate(), deepLinkUrl = buildMetaDeepLinkUrl(type = target.type, id = target.id), backdropUrl = target.banner ?: target.poster, @@ -219,7 +221,7 @@ object EpisodeReleaseNotificationsRepository { _uiState.value = _uiState.value.copy( isSendingTest = false, permissionGranted = true, - statusMessage = "Test notification sent for ${target.name}.", + statusMessage = getString(Res.string.notifications_test_sent_for, target.name), errorMessage = null, ) }.onFailure { @@ -227,7 +229,7 @@ object EpisodeReleaseNotificationsRepository { isSendingTest = false, permissionGranted = true, statusMessage = null, - errorMessage = "Failed to send a test notification.", + errorMessage = getString(Res.string.notifications_test_send_failed), ) } } @@ -467,4 +469,4 @@ object EpisodeReleaseNotificationsRepository { ) } } -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/AudioTrackModal.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/AudioTrackModal.kt index 719476ae..3ae0de1c 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/AudioTrackModal.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/AudioTrackModal.kt @@ -38,6 +38,10 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_player_audio_tracks +import nuvio.composeapp.generated.resources.compose_player_no_audio_tracks_available +import org.jetbrains.compose.resources.stringResource @Composable fun AudioTrackModal( @@ -93,7 +97,7 @@ fun AudioTrackModal( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "Audio Tracks", + text = stringResource(Res.string.compose_player_audio_tracks), color = colorScheme.onSurface, fontSize = 18.sp, fontWeight = FontWeight.Bold, @@ -148,7 +152,7 @@ private fun AudioTrackRow( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = getTrackDisplayName(track.label, track.language, track.index), + text = localizedTrackDisplayName(track.label, track.language, track.index), color = textColor, fontSize = 15.sp, fontWeight = weight, @@ -184,7 +188,7 @@ private fun AudioEmptyState() { .then(Modifier), ) Text( - text = "No audio tracks available", + text = stringResource(Res.string.compose_player_no_audio_tracks_available), color = colorScheme.onSurfaceVariant, modifier = Modifier.padding(top = 10.dp), ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt index d19c5334..018c1d5e 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt @@ -52,6 +52,8 @@ import com.nuvio.app.core.ui.AppIconResource import com.nuvio.app.core.ui.NuvioBackButton import com.nuvio.app.core.ui.appIconPainter import com.nuvio.app.core.ui.nuvioTypeScale +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable internal fun PlayerControlsShell( @@ -212,7 +214,12 @@ private fun PlayerHeader( ) if (seasonNumber != null && episodeNumber != null && !episodeTitle.isNullOrBlank()) { Text( - text = "S${seasonNumber}E${episodeNumber} • $episodeTitle", + text = stringResource( + Res.string.compose_player_episode_title_format, + seasonNumber, + episodeNumber, + episodeTitle, + ), style = typeScale.bodyMd.copy( fontSize = metrics.episodeInfoSize, lineHeight = metrics.episodeInfoSize * 1.3f, @@ -256,7 +263,11 @@ private fun PlayerHeader( ) { PlayerHeaderIconButton( icon = if (isLocked) Icons.Rounded.LockOpen else Icons.Rounded.Lock, - contentDescription = if (isLocked) "Unlock player controls" else "Lock player controls", + contentDescription = if (isLocked) { + stringResource(Res.string.compose_player_unlock_controls) + } else { + stringResource(Res.string.compose_player_lock_controls) + }, buttonSize = metrics.headerIconSize + 16.dp, iconSize = metrics.headerIconSize, onClick = onLockToggle, @@ -267,7 +278,7 @@ private fun PlayerHeader( contentColor = Color.White, buttonSize = metrics.headerIconSize + 16.dp, iconSize = metrics.headerIconSize, - contentDescription = "Close player", + contentDescription = stringResource(Res.string.compose_player_close), ) } } @@ -315,7 +326,7 @@ private fun CenterControls( ) { SideControlButton( icon = Icons.Rounded.Replay10, - contentDescription = "Seek backward 10 seconds", + contentDescription = stringResource(Res.string.compose_player_seek_back_10), metrics = metrics, onClick = onSeekBack, ) @@ -327,7 +338,7 @@ private fun CenterControls( ) SideControlButton( icon = Icons.Rounded.Forward10, - contentDescription = "Seek forward 10 seconds", + contentDescription = stringResource(Res.string.compose_player_seek_forward_10), metrics = metrics, onClick = onSeekForward, ) @@ -384,7 +395,11 @@ private fun PlayPauseControlButton( } else { Icon( painter = playPausePainter, - contentDescription = if (isPlaying) "Pause" else "Play", + contentDescription = if (isPlaying) { + stringResource(Res.string.compose_action_pause) + } else { + stringResource(Res.string.detail_btn_play) + }, tint = Color.White, modifier = Modifier.size(metrics.playIconSize), ) @@ -454,7 +469,7 @@ private fun ProgressControls( verticalAlignment = Alignment.CenterVertically, ) { PlayerActionPillButton( - label = resizeMode.label, + label = stringResource(resizeMode.labelRes), painter = aspectRatioPainter, onClick = onResizeModeClick, ) @@ -464,25 +479,25 @@ private fun ProgressControls( onClick = onSpeedClick, ) PlayerActionPillButton( - label = "Subs", + label = stringResource(Res.string.compose_player_subs), painter = subtitlesPainter, onClick = onSubtitleClick, ) PlayerActionPillButton( - label = "Audio", + label = stringResource(Res.string.compose_player_audio), painter = audioPainter, onClick = onAudioClick, ) if (onSourcesClick != null) { PlayerActionPillButton( - label = "Sources", + label = stringResource(Res.string.compose_player_sources), icon = Icons.Rounded.SwapHoriz, onClick = onSourcesClick, ) } if (onEpisodesClick != null) { PlayerActionPillButton( - label = "Episodes", + label = stringResource(Res.string.compose_player_episodes), icon = Icons.Rounded.VideoLibrary, onClick = onEpisodesClick, ) @@ -545,14 +560,14 @@ internal fun LockedPlayerOverlay( ) { Icon( imageVector = Icons.Rounded.Lock, - contentDescription = "Unlock player controls", + contentDescription = stringResource(Res.string.compose_player_unlock_controls), tint = Color.White, modifier = Modifier.size(34.dp), ) } Spacer(modifier = Modifier.height(12.dp)) Text( - text = "Tap to unlock", + text = stringResource(Res.string.compose_player_tap_to_unlock), style = MaterialTheme.nuvioTypeScale.bodyMd.copy(fontWeight = FontWeight.SemiBold), color = Color.White.copy(alpha = 0.92f), ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerEpisodesPanel.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerEpisodesPanel.kt index 8661f690..fc675a39 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerEpisodesPanel.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerEpisodesPanel.kt @@ -60,6 +60,8 @@ import coil3.compose.AsyncImage import com.nuvio.app.features.details.MetaVideo import com.nuvio.app.features.streams.StreamItem import com.nuvio.app.features.streams.StreamsUiState +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource /** * Episode selection panel shown inside the player. @@ -232,12 +234,12 @@ private fun EpisodesListSubView( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "Episodes", + text = stringResource(Res.string.compose_player_panel_episodes), color = colorScheme.onSurface, fontSize = 18.sp, fontWeight = FontWeight.Bold, ) - PanelChipButton(label = "Close", onClick = onDismiss) + PanelChipButton(label = stringResource(Res.string.action_close), onClick = onDismiss) } // Season tabs @@ -251,7 +253,11 @@ private fun EpisodesListSubView( horizontalArrangement = Arrangement.spacedBy(8.dp), ) { items(availableSeasons, key = { season -> season }) { season -> - val label = if (season == 0) "Specials" else "Season $season" + val label = if (season == 0) { + stringResource(Res.string.episodes_specials) + } else { + stringResource(Res.string.episodes_season, season) + } AddonFilterChip( label = label, isSelected = selectedSeason == season, @@ -273,7 +279,7 @@ private fun EpisodesListSubView( contentAlignment = Alignment.Center, ) { Text( - text = "No episodes available", + text = stringResource(Res.string.compose_player_no_episodes_available), color = colorScheme.onSurfaceVariant, fontSize = 14.sp, ) @@ -345,9 +351,15 @@ private fun EpisodeRow( ) { val episodeLabel = buildString { if (episode.season != null && episode.episode != null) { - append("S${episode.season}E${episode.episode}") + append( + stringResource( + Res.string.compose_player_episode_code_full, + episode.season, + episode.episode, + ), + ) } else if (episode.episode != null) { - append("E${episode.episode}") + append(stringResource(Res.string.compose_player_episode_code_episode_only, episode.episode)) } } if (episodeLabel.isNotBlank()) { @@ -366,7 +378,7 @@ private fun EpisodeRow( .padding(horizontal = 6.dp, vertical = 2.dp), ) { Text( - text = "Playing", + text = stringResource(Res.string.compose_player_playing), color = colorScheme.onPrimaryContainer, fontSize = 9.sp, fontWeight = FontWeight.SemiBold, @@ -421,12 +433,12 @@ private fun EpisodeStreamsSubView( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "Streams", + text = stringResource(Res.string.compose_player_panel_streams), color = colorScheme.onSurface, fontSize = 18.sp, fontWeight = FontWeight.Bold, ) - PanelChipButton(label = "Close", onClick = onDismiss) + PanelChipButton(label = stringResource(Res.string.action_close), onClick = onDismiss) } // Back + reload + episode info @@ -439,19 +451,25 @@ private fun EpisodeStreamsSubView( horizontalArrangement = Arrangement.spacedBy(8.dp), ) { PanelChipButton( - label = "Back", + label = stringResource(Res.string.action_back), icon = Icons.AutoMirrored.Rounded.ArrowBack, onClick = onBack, ) PanelChipButton( - label = "Reload", + label = stringResource(Res.string.compose_action_reload), icon = Icons.Rounded.Refresh, onClick = onReload, ) Text( text = buildString { if (episode.season != null && episode.episode != null) { - append("S${episode.season} E${episode.episode}") + append( + stringResource( + Res.string.compose_player_episode_code_full, + episode.season, + episode.episode, + ), + ) } if (episode.title.isNotBlank()) { if (isNotEmpty()) append(" • ") @@ -480,7 +498,7 @@ private fun EpisodeStreamsSubView( horizontalArrangement = Arrangement.spacedBy(8.dp), ) { AddonFilterChip( - label = "All", + label = stringResource(Res.string.collections_tab_all), isSelected = streamsUiState.selectedFilter == null, onClick = { onFilterSelected(null) }, ) @@ -522,7 +540,7 @@ private fun EpisodeStreamsSubView( contentAlignment = Alignment.Center, ) { Text( - text = "No streams found", + text = stringResource(Res.string.compose_player_no_streams_found), color = colorScheme.onSurfaceVariant, fontSize = 14.sp, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerLanguagePreferences.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerLanguagePreferences.kt index 47746d49..48088665 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerLanguagePreferences.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerLanguagePreferences.kt @@ -1,8 +1,97 @@ package com.nuvio.app.features.player +import androidx.compose.runtime.Composable +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.lang_afrikaans +import nuvio.composeapp.generated.resources.lang_albanian +import nuvio.composeapp.generated.resources.lang_amharic +import nuvio.composeapp.generated.resources.lang_arabic +import nuvio.composeapp.generated.resources.lang_armenian +import nuvio.composeapp.generated.resources.lang_azerbaijani +import nuvio.composeapp.generated.resources.lang_basque +import nuvio.composeapp.generated.resources.lang_belarusian +import nuvio.composeapp.generated.resources.lang_bengali +import nuvio.composeapp.generated.resources.lang_bosnian +import nuvio.composeapp.generated.resources.lang_bulgarian +import nuvio.composeapp.generated.resources.lang_burmese +import nuvio.composeapp.generated.resources.lang_catalan +import nuvio.composeapp.generated.resources.lang_chinese +import nuvio.composeapp.generated.resources.lang_chinese_simplified +import nuvio.composeapp.generated.resources.lang_chinese_traditional +import nuvio.composeapp.generated.resources.lang_croatian +import nuvio.composeapp.generated.resources.lang_czech +import nuvio.composeapp.generated.resources.lang_danish +import nuvio.composeapp.generated.resources.lang_dutch +import nuvio.composeapp.generated.resources.lang_english +import nuvio.composeapp.generated.resources.lang_estonian +import nuvio.composeapp.generated.resources.lang_filipino +import nuvio.composeapp.generated.resources.lang_finnish +import nuvio.composeapp.generated.resources.lang_french +import nuvio.composeapp.generated.resources.lang_galician +import nuvio.composeapp.generated.resources.lang_georgian +import nuvio.composeapp.generated.resources.lang_german +import nuvio.composeapp.generated.resources.lang_greek +import nuvio.composeapp.generated.resources.lang_gujarati +import nuvio.composeapp.generated.resources.lang_hebrew +import nuvio.composeapp.generated.resources.lang_hindi +import nuvio.composeapp.generated.resources.lang_hungarian +import nuvio.composeapp.generated.resources.lang_icelandic +import nuvio.composeapp.generated.resources.lang_indonesian +import nuvio.composeapp.generated.resources.lang_irish +import nuvio.composeapp.generated.resources.lang_italian +import nuvio.composeapp.generated.resources.lang_japanese +import nuvio.composeapp.generated.resources.lang_kannada +import nuvio.composeapp.generated.resources.lang_kazakh +import nuvio.composeapp.generated.resources.lang_khmer +import nuvio.composeapp.generated.resources.lang_korean +import nuvio.composeapp.generated.resources.lang_lao +import nuvio.composeapp.generated.resources.lang_latvian +import nuvio.composeapp.generated.resources.lang_lithuanian +import nuvio.composeapp.generated.resources.lang_macedonian +import nuvio.composeapp.generated.resources.lang_malay +import nuvio.composeapp.generated.resources.lang_malayalam +import nuvio.composeapp.generated.resources.lang_maltese +import nuvio.composeapp.generated.resources.lang_marathi +import nuvio.composeapp.generated.resources.lang_mongolian +import nuvio.composeapp.generated.resources.lang_nepali +import nuvio.composeapp.generated.resources.lang_norwegian +import nuvio.composeapp.generated.resources.lang_persian +import nuvio.composeapp.generated.resources.lang_polish +import nuvio.composeapp.generated.resources.lang_portuguese_brazil +import nuvio.composeapp.generated.resources.lang_portuguese_portugal +import nuvio.composeapp.generated.resources.lang_punjabi +import nuvio.composeapp.generated.resources.lang_romanian +import nuvio.composeapp.generated.resources.lang_russian +import nuvio.composeapp.generated.resources.lang_serbian +import nuvio.composeapp.generated.resources.lang_sinhala +import nuvio.composeapp.generated.resources.lang_slovak +import nuvio.composeapp.generated.resources.lang_slovenian +import nuvio.composeapp.generated.resources.lang_spanish +import nuvio.composeapp.generated.resources.lang_spanish_latin_america +import nuvio.composeapp.generated.resources.lang_swahili +import nuvio.composeapp.generated.resources.lang_swedish +import nuvio.composeapp.generated.resources.lang_tamil +import nuvio.composeapp.generated.resources.lang_telugu +import nuvio.composeapp.generated.resources.lang_thai +import nuvio.composeapp.generated.resources.lang_turkish +import nuvio.composeapp.generated.resources.lang_ukrainian +import nuvio.composeapp.generated.resources.lang_urdu +import nuvio.composeapp.generated.resources.lang_uzbek +import nuvio.composeapp.generated.resources.lang_vietnamese +import nuvio.composeapp.generated.resources.lang_welsh +import nuvio.composeapp.generated.resources.lang_zulu +import nuvio.composeapp.generated.resources.settings_playback_option_default +import nuvio.composeapp.generated.resources.settings_playback_option_device_language +import nuvio.composeapp.generated.resources.settings_playback_option_forced +import nuvio.composeapp.generated.resources.settings_playback_option_none +import nuvio.composeapp.generated.resources.subtitle_language_unknown +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.getString +import org.jetbrains.compose.resources.stringResource + data class LanguagePreferenceOption( val code: String, - val label: String, + val labelRes: StringResource, ) object AudioLanguageOption { @@ -17,84 +106,84 @@ object SubtitleLanguageOption { } val AvailableLanguageOptions: List = listOf( - LanguagePreferenceOption("af", "Afrikaans"), - LanguagePreferenceOption("sq", "Albanian"), - LanguagePreferenceOption("am", "Amharic"), - LanguagePreferenceOption("ar", "Arabic"), - LanguagePreferenceOption("hy", "Armenian"), - LanguagePreferenceOption("az", "Azerbaijani"), - LanguagePreferenceOption("eu", "Basque"), - LanguagePreferenceOption("be", "Belarusian"), - LanguagePreferenceOption("bn", "Bengali"), - LanguagePreferenceOption("bs", "Bosnian"), - LanguagePreferenceOption("bg", "Bulgarian"), - LanguagePreferenceOption("my", "Burmese"), - LanguagePreferenceOption("ca", "Catalan"), - LanguagePreferenceOption("zh", "Chinese"), - LanguagePreferenceOption("zh-CN", "Chinese (Simplified)"), - LanguagePreferenceOption("zh-TW", "Chinese (Traditional)"), - LanguagePreferenceOption("hr", "Croatian"), - LanguagePreferenceOption("cs", "Czech"), - LanguagePreferenceOption("da", "Danish"), - LanguagePreferenceOption("nl", "Dutch"), - LanguagePreferenceOption("en", "English"), - LanguagePreferenceOption("et", "Estonian"), - LanguagePreferenceOption("tl", "Filipino"), - LanguagePreferenceOption("fi", "Finnish"), - LanguagePreferenceOption("fr", "French"), - LanguagePreferenceOption("gl", "Galician"), - LanguagePreferenceOption("ka", "Georgian"), - LanguagePreferenceOption("de", "German"), - LanguagePreferenceOption("el", "Greek"), - LanguagePreferenceOption("gu", "Gujarati"), - LanguagePreferenceOption("he", "Hebrew"), - LanguagePreferenceOption("hi", "Hindi"), - LanguagePreferenceOption("hu", "Hungarian"), - LanguagePreferenceOption("is", "Icelandic"), - LanguagePreferenceOption("id", "Indonesian"), - LanguagePreferenceOption("ga", "Irish"), - LanguagePreferenceOption("it", "Italian"), - LanguagePreferenceOption("ja", "Japanese"), - LanguagePreferenceOption("kn", "Kannada"), - LanguagePreferenceOption("kk", "Kazakh"), - LanguagePreferenceOption("km", "Khmer"), - LanguagePreferenceOption("ko", "Korean"), - LanguagePreferenceOption("lo", "Lao"), - LanguagePreferenceOption("lv", "Latvian"), - LanguagePreferenceOption("lt", "Lithuanian"), - LanguagePreferenceOption("mk", "Macedonian"), - LanguagePreferenceOption("ms", "Malay"), - LanguagePreferenceOption("ml", "Malayalam"), - LanguagePreferenceOption("mt", "Maltese"), - LanguagePreferenceOption("mr", "Marathi"), - LanguagePreferenceOption("mn", "Mongolian"), - LanguagePreferenceOption("ne", "Nepali"), - LanguagePreferenceOption("no", "Norwegian"), - LanguagePreferenceOption("pa", "Punjabi"), - LanguagePreferenceOption("fa", "Persian"), - LanguagePreferenceOption("pl", "Polish"), - LanguagePreferenceOption("pt", "Portuguese (Portugal)"), - LanguagePreferenceOption("pt-BR", "Portuguese (Brazil)"), - LanguagePreferenceOption("ro", "Romanian"), - LanguagePreferenceOption("ru", "Russian"), - LanguagePreferenceOption("sr", "Serbian"), - LanguagePreferenceOption("si", "Sinhala"), - LanguagePreferenceOption("sk", "Slovak"), - LanguagePreferenceOption("sl", "Slovenian"), - LanguagePreferenceOption("es", "Spanish"), - LanguagePreferenceOption("es-419", "Spanish (Latin America)"), - LanguagePreferenceOption("sw", "Swahili"), - LanguagePreferenceOption("sv", "Swedish"), - LanguagePreferenceOption("ta", "Tamil"), - LanguagePreferenceOption("te", "Telugu"), - LanguagePreferenceOption("th", "Thai"), - LanguagePreferenceOption("tr", "Turkish"), - LanguagePreferenceOption("uk", "Ukrainian"), - LanguagePreferenceOption("ur", "Urdu"), - LanguagePreferenceOption("uz", "Uzbek"), - LanguagePreferenceOption("vi", "Vietnamese"), - LanguagePreferenceOption("cy", "Welsh"), - LanguagePreferenceOption("zu", "Zulu"), + LanguagePreferenceOption("af", Res.string.lang_afrikaans), + LanguagePreferenceOption("sq", Res.string.lang_albanian), + LanguagePreferenceOption("am", Res.string.lang_amharic), + LanguagePreferenceOption("ar", Res.string.lang_arabic), + LanguagePreferenceOption("hy", Res.string.lang_armenian), + LanguagePreferenceOption("az", Res.string.lang_azerbaijani), + LanguagePreferenceOption("eu", Res.string.lang_basque), + LanguagePreferenceOption("be", Res.string.lang_belarusian), + LanguagePreferenceOption("bn", Res.string.lang_bengali), + LanguagePreferenceOption("bs", Res.string.lang_bosnian), + LanguagePreferenceOption("bg", Res.string.lang_bulgarian), + LanguagePreferenceOption("my", Res.string.lang_burmese), + LanguagePreferenceOption("ca", Res.string.lang_catalan), + LanguagePreferenceOption("zh", Res.string.lang_chinese), + LanguagePreferenceOption("zh-CN", Res.string.lang_chinese_simplified), + LanguagePreferenceOption("zh-TW", Res.string.lang_chinese_traditional), + LanguagePreferenceOption("hr", Res.string.lang_croatian), + LanguagePreferenceOption("cs", Res.string.lang_czech), + LanguagePreferenceOption("da", Res.string.lang_danish), + LanguagePreferenceOption("nl", Res.string.lang_dutch), + LanguagePreferenceOption("en", Res.string.lang_english), + LanguagePreferenceOption("et", Res.string.lang_estonian), + LanguagePreferenceOption("tl", Res.string.lang_filipino), + LanguagePreferenceOption("fi", Res.string.lang_finnish), + LanguagePreferenceOption("fr", Res.string.lang_french), + LanguagePreferenceOption("gl", Res.string.lang_galician), + LanguagePreferenceOption("ka", Res.string.lang_georgian), + LanguagePreferenceOption("de", Res.string.lang_german), + LanguagePreferenceOption("el", Res.string.lang_greek), + LanguagePreferenceOption("gu", Res.string.lang_gujarati), + LanguagePreferenceOption("he", Res.string.lang_hebrew), + LanguagePreferenceOption("hi", Res.string.lang_hindi), + LanguagePreferenceOption("hu", Res.string.lang_hungarian), + LanguagePreferenceOption("is", Res.string.lang_icelandic), + LanguagePreferenceOption("id", Res.string.lang_indonesian), + LanguagePreferenceOption("ga", Res.string.lang_irish), + LanguagePreferenceOption("it", Res.string.lang_italian), + LanguagePreferenceOption("ja", Res.string.lang_japanese), + LanguagePreferenceOption("kn", Res.string.lang_kannada), + LanguagePreferenceOption("kk", Res.string.lang_kazakh), + LanguagePreferenceOption("km", Res.string.lang_khmer), + LanguagePreferenceOption("ko", Res.string.lang_korean), + LanguagePreferenceOption("lo", Res.string.lang_lao), + LanguagePreferenceOption("lv", Res.string.lang_latvian), + LanguagePreferenceOption("lt", Res.string.lang_lithuanian), + LanguagePreferenceOption("mk", Res.string.lang_macedonian), + LanguagePreferenceOption("ms", Res.string.lang_malay), + LanguagePreferenceOption("ml", Res.string.lang_malayalam), + LanguagePreferenceOption("mt", Res.string.lang_maltese), + LanguagePreferenceOption("mr", Res.string.lang_marathi), + LanguagePreferenceOption("mn", Res.string.lang_mongolian), + LanguagePreferenceOption("ne", Res.string.lang_nepali), + LanguagePreferenceOption("no", Res.string.lang_norwegian), + LanguagePreferenceOption("pa", Res.string.lang_punjabi), + LanguagePreferenceOption("fa", Res.string.lang_persian), + LanguagePreferenceOption("pl", Res.string.lang_polish), + LanguagePreferenceOption("pt", Res.string.lang_portuguese_portugal), + LanguagePreferenceOption("pt-BR", Res.string.lang_portuguese_brazil), + LanguagePreferenceOption("ro", Res.string.lang_romanian), + LanguagePreferenceOption("ru", Res.string.lang_russian), + LanguagePreferenceOption("sr", Res.string.lang_serbian), + LanguagePreferenceOption("si", Res.string.lang_sinhala), + LanguagePreferenceOption("sk", Res.string.lang_slovak), + LanguagePreferenceOption("sl", Res.string.lang_slovenian), + LanguagePreferenceOption("es", Res.string.lang_spanish), + LanguagePreferenceOption("es-419", Res.string.lang_spanish_latin_america), + LanguagePreferenceOption("sw", Res.string.lang_swahili), + LanguagePreferenceOption("sv", Res.string.lang_swedish), + LanguagePreferenceOption("ta", Res.string.lang_tamil), + LanguagePreferenceOption("te", Res.string.lang_telugu), + LanguagePreferenceOption("th", Res.string.lang_thai), + LanguagePreferenceOption("tr", Res.string.lang_turkish), + LanguagePreferenceOption("uk", Res.string.lang_ukrainian), + LanguagePreferenceOption("ur", Res.string.lang_urdu), + LanguagePreferenceOption("uz", Res.string.lang_uzbek), + LanguagePreferenceOption("vi", Res.string.lang_vietnamese), + LanguagePreferenceOption("cy", Res.string.lang_welsh), + LanguagePreferenceOption("zu", Res.string.lang_zulu), ) private val Iso639Aliases = mapOf( @@ -149,12 +238,40 @@ fun languageMatchesPreference(trackLanguage: String?, targetLanguage: String): B return trackPrimary == targetPrimary } -fun languageLabelForCode(code: String?): String { - if (code.isNullOrBlank()) return "None" - if (code.equals(SubtitleLanguageOption.FORCED, ignoreCase = true)) return "Forced" +private fun languageLabelResForCode(code: String?): StringResource? { + val normalized = normalizeLanguageCode(code) ?: return null return AvailableLanguageOptions.firstOrNull { - it.code.equals(code, ignoreCase = true) - }?.label ?: formatLanguage(code) + normalizeLanguageCode(it.code) == normalized + }?.labelRes +} + +@Composable +fun languageLabelForCode(code: String?): String = when { + code.isNullOrBlank() || code.equals(SubtitleLanguageOption.NONE, ignoreCase = true) -> + stringResource(Res.string.settings_playback_option_none) + code.equals(SubtitleLanguageOption.FORCED, ignoreCase = true) -> + stringResource(Res.string.settings_playback_option_forced) + code.equals(AudioLanguageOption.DEFAULT, ignoreCase = true) -> + stringResource(Res.string.settings_playback_option_default) + code.equals(AudioLanguageOption.DEVICE, ignoreCase = true) || + code.equals(SubtitleLanguageOption.DEVICE, ignoreCase = true) -> + stringResource(Res.string.settings_playback_option_device_language) + else -> languageLabelResForCode(code)?.let { stringResource(it) } + ?: stringResource(Res.string.subtitle_language_unknown) +} + +suspend fun getLanguageLabelForCode(code: String?): String = when { + code.isNullOrBlank() || code.equals(SubtitleLanguageOption.NONE, ignoreCase = true) -> + getString(Res.string.settings_playback_option_none) + code.equals(SubtitleLanguageOption.FORCED, ignoreCase = true) -> + getString(Res.string.settings_playback_option_forced) + code.equals(AudioLanguageOption.DEFAULT, ignoreCase = true) -> + getString(Res.string.settings_playback_option_default) + code.equals(AudioLanguageOption.DEVICE, ignoreCase = true) || + code.equals(SubtitleLanguageOption.DEVICE, ignoreCase = true) -> + getString(Res.string.settings_playback_option_device_language) + else -> languageLabelResForCode(code)?.let { getString(it) } + ?: getString(Res.string.subtitle_language_unknown) } fun resolvePreferredAudioLanguageTargets( diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerLayout.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerLayout.kt index 88616160..86a0d318 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerLayout.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerLayout.kt @@ -9,6 +9,11 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_player_resize_fill +import nuvio.composeapp.generated.resources.compose_player_resize_fit +import nuvio.composeapp.generated.resources.compose_player_resize_zoom +import org.jetbrains.compose.resources.StringResource import kotlin.math.max internal data class PlayerLayoutMetrics( @@ -124,11 +129,11 @@ internal fun PlayerResizeMode.next(): PlayerResizeMode = PlayerResizeMode.Zoom -> PlayerResizeMode.Fit } -internal val PlayerResizeMode.label: String +internal val PlayerResizeMode.labelRes: StringResource get() = when (this) { - PlayerResizeMode.Fit -> "Fit" - PlayerResizeMode.Fill -> "Fill" - PlayerResizeMode.Zoom -> "Zoom" + PlayerResizeMode.Fit -> Res.string.compose_player_resize_fit + PlayerResizeMode.Fill -> Res.string.compose_player_resize_fill + PlayerResizeMode.Zoom -> Res.string.compose_player_resize_zoom } internal fun formatPlaybackTime(positionMs: Long): String { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerOverlays.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerOverlays.kt index f32d2c63..a9644baa 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerOverlays.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerOverlays.kt @@ -59,6 +59,14 @@ import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage import com.nuvio.app.core.ui.NuvioBackButton import com.nuvio.app.core.ui.nuvioTypeScale +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_player_close +import nuvio.composeapp.generated.resources.compose_player_episode_code_full +import nuvio.composeapp.generated.resources.compose_player_go_back +import nuvio.composeapp.generated.resources.compose_player_playback_error +import nuvio.composeapp.generated.resources.compose_player_youre_watching +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource import kotlin.math.max internal enum class GestureFeedbackIcon { @@ -71,10 +79,14 @@ internal enum class GestureFeedbackIcon { } internal data class GestureFeedbackState( - val message: String, + val message: String? = null, + val messageRes: StringResource? = null, + val messageArgs: List = emptyList(), val icon: GestureFeedbackIcon = GestureFeedbackIcon.Speed, val isDanger: Boolean = false, val secondaryMessage: String? = null, + val secondaryMessageRes: StringResource? = null, + val secondaryMessageArgs: List = emptyList(), val secondaryMessageColor: Color? = null, ) @@ -141,7 +153,7 @@ internal fun OpeningOverlay( contentColor = Color.White, buttonSize = 44.dp, iconSize = 24.dp, - contentDescription = "Close player", + contentDescription = stringResource(Res.string.compose_player_close), ) Column( @@ -218,6 +230,12 @@ internal fun GestureFeedbackPill( GestureFeedbackIcon.SeekBackward -> Icons.Rounded.FastRewind } val iconTint = if (feedback.isDanger) Color(0xFFFFC1C1) else Color.White + val messageText = feedback.messageRes?.let { resource -> + stringResource(resource, *feedback.messageArgs.toTypedArray()) + } ?: feedback.message.orEmpty() + val secondaryMessageText = feedback.secondaryMessageRes?.let { resource -> + stringResource(resource, *feedback.secondaryMessageArgs.toTypedArray()) + } ?: feedback.secondaryMessage Row( modifier = modifier @@ -242,11 +260,11 @@ internal fun GestureFeedbackPill( ) } Text( - text = feedback.message, + text = messageText, style = MaterialTheme.nuvioTypeScale.bodyLg.copy(fontWeight = FontWeight.SemiBold), color = Color.White, ) - feedback.secondaryMessage?.let { secondaryMessage -> + secondaryMessageText?.let { secondaryMessage -> Text( text = secondaryMessage, style = MaterialTheme.nuvioTypeScale.bodyMd.copy(fontWeight = FontWeight.SemiBold), @@ -290,7 +308,7 @@ internal fun PauseMetadataOverlay( verticalArrangement = Arrangement.Bottom, ) { Text( - text = "You're watching", + text = stringResource(Res.string.compose_player_youre_watching), style = MaterialTheme.nuvioTypeScale.bodyLg, color = Color(0xFFB8B8B8), ) @@ -318,7 +336,7 @@ internal fun PauseMetadataOverlay( } val episodeInfo = if (isEpisode && seasonNumber != null && episodeNumber != null) { - "S${seasonNumber}E${episodeNumber}" + stringResource(Res.string.compose_player_episode_code_full, seasonNumber, episodeNumber) } else { providerName } @@ -377,7 +395,7 @@ internal fun ErrorModal( verticalArrangement = Arrangement.spacedBy(16.dp), ) { Text( - text = "Playback error", + text = stringResource(Res.string.compose_player_playback_error), style = MaterialTheme.nuvioTypeScale.displaySm.copy(fontWeight = FontWeight.Bold), color = Color.White, textAlign = TextAlign.Center, @@ -399,7 +417,7 @@ internal fun ErrorModal( shape = RoundedCornerShape(12.dp), ) { Text( - text = "Go back", + text = stringResource(Res.string.compose_player_go_back), modifier = Modifier .fillMaxWidth() .padding(vertical = 12.dp), diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt index 196b81f6..6363109d 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt @@ -62,6 +62,8 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource import kotlin.math.abs import kotlin.math.roundToLong import kotlin.math.roundToInt @@ -153,6 +155,12 @@ fun PlayerScreen( val overlayBottomPadding = sliderOverlayBottomPadding(metrics) val scope = rememberCoroutineScope() val hapticFeedback = LocalHapticFeedback.current + val resizeModeFitLabel = stringResource(Res.string.compose_player_resize_fit) + val resizeModeFillLabel = stringResource(Res.string.compose_player_resize_fill) + val resizeModeZoomLabel = stringResource(Res.string.compose_player_resize_zoom) + val downloadedLabel = stringResource(Res.string.compose_player_downloaded) + val airsPrefix = stringResource(Res.string.compose_player_airs_prefix) + val tbaLabel = stringResource(Res.string.compose_player_tba) val gestureController = rememberPlayerGestureController() var controlsVisible by rememberSaveable { mutableStateOf(true) } var playerControlsLocked by rememberSaveable { mutableStateOf(false) } @@ -534,7 +542,12 @@ fun PlayerScreen( if (seconds <= 0L) return showGestureFeedback( GestureFeedbackState( - message = if (direction == PlayerSeekDirection.Forward) "+${seconds}s" else "-${seconds}s", + messageRes = if (direction == PlayerSeekDirection.Forward) { + Res.string.compose_player_seek_feedback_forward + } else { + Res.string.compose_player_seek_feedback_backward + }, + messageArgs = listOf(seconds), icon = if (direction == PlayerSeekDirection.Forward) { GestureFeedbackIcon.SeekForward } else { @@ -554,11 +567,12 @@ fun PlayerScreen( } else { GestureFeedbackIcon.SeekBackward }, - secondaryMessage = buildString { - if (deltaMs >= 0L) append("+") - append((abs(deltaMs) / 1000f).roundToInt()) - append("s") + secondaryMessageRes = if (deltaMs >= 0L) { + Res.string.compose_player_seek_delta_forward + } else { + Res.string.compose_player_seek_delta_backward }, + secondaryMessageArgs = listOf((abs(deltaMs) / 1000f).roundToInt()), secondaryMessageColor = if (direction == PlayerSeekDirection.Forward) { Color(0xFF6EE7A8) } else { @@ -571,7 +585,8 @@ fun PlayerScreen( val percentage = (level.coerceIn(0f, 1f) * 100f).roundToInt() showGestureFeedback( GestureFeedbackState( - message = "Brightness $percentage%", + messageRes = Res.string.compose_player_brightness_level, + messageArgs = listOf(percentage), icon = GestureFeedbackIcon.Brightness, ), ) @@ -581,7 +596,12 @@ fun PlayerScreen( val percentage = (level.fraction.coerceIn(0f, 1f) * 100f).roundToInt() showGestureFeedback( GestureFeedbackState( - message = if (level.isMuted) "Muted" else "Volume $percentage%", + messageRes = if (level.isMuted) { + Res.string.compose_player_muted + } else { + Res.string.compose_player_volume_level + }, + messageArgs = if (level.isMuted) emptyList() else listOf(percentage), icon = if (level.isMuted) GestureFeedbackIcon.VolumeMuted else GestureFeedbackIcon.Volume, isDanger = level.isMuted, ), @@ -650,7 +670,13 @@ fun PlayerScreen( val nextMode = resizeMode.next() resizeMode = nextMode PlayerSettingsRepository.setResizeMode(nextMode) - showGestureMessage(nextMode.label) + showGestureMessage( + when (nextMode) { + PlayerResizeMode.Fit -> resizeModeFitLabel + PlayerResizeMode.Fill -> resizeModeFillLabel + PlayerResizeMode.Zoom -> resizeModeZoomLabel + }, + ) controlsVisible = true } @@ -872,7 +898,7 @@ fun PlayerScreen( episode.title.ifBlank { title } } activeStreamSubtitle = downloadItem.streamSubtitle - activeProviderName = downloadItem.providerName.ifBlank { "Downloaded" } + activeProviderName = downloadItem.providerName.ifBlank { downloadedLabel } activeProviderAddonId = downloadItem.providerAddonId currentStreamBingeGroup = null activeSeasonNumber = episode.season @@ -1268,7 +1294,7 @@ fun PlayerScreen( released = nextVideo.released, hasAired = PlayerNextEpisodeRules.hasEpisodeAired(nextVideo.released), unairedMessage = if (!PlayerNextEpisodeRules.hasEpisodeAired(nextVideo.released)) { - "Airs ${nextVideo.released ?: "TBA"}" + "$airsPrefix ${nextVideo.released ?: tbaLabel}" } else null, ) } else null diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSourcesPanel.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSourcesPanel.kt index e13e2318..9d54dfd1 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSourcesPanel.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSourcesPanel.kt @@ -48,6 +48,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.nuvio.app.features.streams.StreamItem import com.nuvio.app.features.streams.StreamsUiState +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun PlayerSourcesPanel( @@ -108,19 +110,19 @@ fun PlayerSourcesPanel( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "Sources", + text = stringResource(Res.string.compose_player_panel_sources), color = colorScheme.onSurface, fontSize = 18.sp, fontWeight = FontWeight.Bold, ) Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { PanelChipButton( - label = "Reload", + label = stringResource(Res.string.compose_action_reload), icon = Icons.Rounded.Refresh, onClick = onReload, ) PanelChipButton( - label = "Close", + label = stringResource(Res.string.action_close), onClick = onDismiss, ) } @@ -140,7 +142,7 @@ fun PlayerSourcesPanel( horizontalArrangement = Arrangement.spacedBy(8.dp), ) { AddonFilterChip( - label = "All", + label = stringResource(Res.string.collections_tab_all), isSelected = streamsUiState.selectedFilter == null, onClick = { onFilterSelected(null) }, ) @@ -182,7 +184,7 @@ fun PlayerSourcesPanel( contentAlignment = Alignment.Center, ) { Text( - text = "No streams found", + text = stringResource(Res.string.compose_player_no_streams_found), color = colorScheme.onSurfaceVariant, fontSize = 14.sp, ) @@ -270,7 +272,7 @@ private fun SourceStreamRow( .padding(horizontal = 8.dp, vertical = 3.dp), ) { Text( - text = "Playing", + text = stringResource(Res.string.compose_player_playing), color = colorScheme.onPrimaryContainer, fontSize = 10.sp, fontWeight = FontWeight.SemiBold, @@ -301,7 +303,7 @@ private fun SourceStreamRow( if (isCurrent) { Icon( imageVector = Icons.Rounded.Check, - contentDescription = "Currently playing", + contentDescription = stringResource(Res.string.compose_player_currently_playing), tint = colorScheme.primary, modifier = Modifier.size(20.dp), ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleAudioModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleAudioModels.kt index bf8dcafb..895e6fde 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleAudioModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleAudioModels.kt @@ -1,6 +1,10 @@ package com.nuvio.app.features.player +import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_player_track_number +import org.jetbrains.compose.resources.stringResource import kotlin.math.roundToInt data class AudioTrack( @@ -109,103 +113,9 @@ data class SubtitleAudioUiState( val activeSubtitleTab: SubtitleTab = SubtitleTab.BuiltIn, ) -fun getTrackDisplayName(label: String?, language: String?, index: Int): String { +@Composable +fun localizedTrackDisplayName(label: String?, language: String?, index: Int): String { if (!label.isNullOrBlank()) return label - if (!language.isNullOrBlank()) return formatLanguage(language) - return "Track ${index + 1}" + if (!language.isNullOrBlank()) return languageLabelForCode(language) + return stringResource(Res.string.compose_player_track_number, index + 1) } - -fun formatLanguage(code: String): String { - val lower = code.lowercase() - return LanguageNames[lower] ?: lower.replaceFirstChar { it.uppercase() } -} - -private val LanguageNames = mapOf( - "en" to "English", - "eng" to "English", - "es" to "Spanish", - "spa" to "Spanish", - "fr" to "French", - "fre" to "French", - "fra" to "French", - "de" to "German", - "ger" to "German", - "deu" to "German", - "it" to "Italian", - "ita" to "Italian", - "pt" to "Portuguese", - "por" to "Portuguese", - "ru" to "Russian", - "rus" to "Russian", - "ja" to "Japanese", - "jpn" to "Japanese", - "ko" to "Korean", - "kor" to "Korean", - "zh" to "Chinese", - "chi" to "Chinese", - "zho" to "Chinese", - "ar" to "Arabic", - "ara" to "Arabic", - "hi" to "Hindi", - "hin" to "Hindi", - "nl" to "Dutch", - "nld" to "Dutch", - "dut" to "Dutch", - "pl" to "Polish", - "pol" to "Polish", - "sv" to "Swedish", - "swe" to "Swedish", - "tr" to "Turkish", - "tur" to "Turkish", - "he" to "Hebrew", - "heb" to "Hebrew", - "th" to "Thai", - "tha" to "Thai", - "vi" to "Vietnamese", - "vie" to "Vietnamese", - "cs" to "Czech", - "ces" to "Czech", - "cze" to "Czech", - "ro" to "Romanian", - "ron" to "Romanian", - "rum" to "Romanian", - "hu" to "Hungarian", - "hun" to "Hungarian", - "el" to "Greek", - "ell" to "Greek", - "gre" to "Greek", - "da" to "Danish", - "dan" to "Danish", - "fi" to "Finnish", - "fin" to "Finnish", - "no" to "Norwegian", - "nor" to "Norwegian", - "uk" to "Ukrainian", - "ukr" to "Ukrainian", - "bg" to "Bulgarian", - "bul" to "Bulgarian", - "hr" to "Croatian", - "hrv" to "Croatian", - "sr" to "Serbian", - "srp" to "Serbian", - "sk" to "Slovak", - "slk" to "Slovak", - "slo" to "Slovak", - "sl" to "Slovenian", - "slv" to "Slovenian", - "id" to "Indonesian", - "ind" to "Indonesian", - "ms" to "Malay", - "msa" to "Malay", - "may" to "Malay", - "ta" to "Tamil", - "tam" to "Tamil", - "te" to "Telugu", - "tel" to "Telugu", - "ml" to "Malayalam", - "mal" to "Malayalam", - "bn" to "Bengali", - "ben" to "Bengali", - "ur" to "Urdu", - "urd" to "Urdu", -) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleModal.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleModal.kt index 7aa3b9b2..e519a854 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleModal.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleModal.kt @@ -43,6 +43,14 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.addon_title +import nuvio.composeapp.generated.resources.compose_player_built_in +import nuvio.composeapp.generated.resources.compose_player_fetch_subtitles +import nuvio.composeapp.generated.resources.compose_player_none +import nuvio.composeapp.generated.resources.compose_player_style +import nuvio.composeapp.generated.resources.compose_player_subtitles +import org.jetbrains.compose.resources.stringResource @Composable fun SubtitleModal( @@ -110,7 +118,7 @@ fun SubtitleModal( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "Subtitles", + text = stringResource(Res.string.compose_player_subtitles), color = colorScheme.onSurface, fontSize = 18.sp, fontWeight = FontWeight.Bold, @@ -191,9 +199,9 @@ private fun SubtitleTabBar( ) { Text( text = when (tab) { - SubtitleTab.BuiltIn -> "Built-in" - SubtitleTab.Addons -> "Addons" - SubtitleTab.Style -> "Style" + SubtitleTab.BuiltIn -> stringResource(Res.string.compose_player_built_in) + SubtitleTab.Addons -> stringResource(Res.string.addon_title) + SubtitleTab.Style -> stringResource(Res.string.compose_player_style) }, color = if (isSelected) colorScheme.onPrimaryContainer else colorScheme.onSurfaceVariant, fontSize = 13.sp, @@ -230,7 +238,7 @@ private fun BuiltInSubtitleList( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "None", + text = stringResource(Res.string.compose_player_none), color = if (isNoneSelected) colorScheme.onPrimaryContainer else colorScheme.onSurface, fontSize = 15.sp, fontWeight = FontWeight.SemiBold, @@ -258,7 +266,7 @@ private fun BuiltInSubtitleList( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = getTrackDisplayName(track.label, track.language, track.index), + text = localizedTrackDisplayName(track.label, track.language, track.index), color = if (isSelected) colorScheme.onPrimaryContainer else colorScheme.onSurface, fontSize = 15.sp, fontWeight = if (isSelected) FontWeight.Bold else FontWeight.Normal, @@ -324,7 +332,7 @@ private fun AddonSubtitleList( modifier = Modifier.size(32.dp), ) Text( - text = "Tap to fetch subtitles", + text = stringResource(Res.string.compose_player_fetch_subtitles), color = colorScheme.onSurfaceVariant, modifier = Modifier.padding(top = 10.dp), ) @@ -360,7 +368,7 @@ private fun AddonSubtitleList( fontWeight = FontWeight.SemiBold, ) Text( - text = formatLanguage(sub.language), + text = languageLabelForCode(sub.language), color = if (isSelected) colorScheme.onPrimaryContainer.copy(alpha = 0.72f) else colorScheme.onSurfaceVariant, fontSize = 11.sp, modifier = Modifier.padding(bottom = 3.dp), diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleRepository.kt index 82ed1dcb..a6991e74 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleRepository.kt @@ -18,6 +18,9 @@ import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_player_no_subtitles_found +import org.jetbrains.compose.resources.getString object SubtitleRepository { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default) @@ -76,7 +79,7 @@ object SubtitleRepository { id = id, url = url, language = lang, - display = "${formatLanguage(lang)} (${addon.displayTitle})", + display = "${getLanguageLabelForCode(lang)} (${addon.displayTitle})", ) ) } @@ -86,7 +89,7 @@ object SubtitleRepository { _addonSubtitles.value = allSubs if (allSubs.isEmpty() && addons.any { it.manifest?.resources?.any { r -> r.name == "subtitles" } == true }) { - _error.value = "No subtitles found" + _error.value = getString(Res.string.compose_player_no_subtitles_found) } _isLoading.value = false } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleStylePanel.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleStylePanel.kt index 31781ab1..0f5fc243 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleStylePanel.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/SubtitleStylePanel.kt @@ -28,6 +28,8 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun SubtitleStylePanel( @@ -73,7 +75,7 @@ private fun StyleControlsCard( ) { SectionHeader( icon = Icons.Rounded.Tune, - label = "Style", + label = stringResource(Res.string.compose_player_style), ) Row( @@ -82,13 +84,13 @@ private fun StyleControlsCard( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "Font Size", + text = stringResource(Res.string.compose_player_font_size), color = colorScheme.onSurfaceVariant, fontSize = 14.sp, fontWeight = FontWeight.Medium, ) StepperControl( - value = "${style.fontSizeSp}sp", + value = stringResource(Res.string.compose_player_font_size_value, style.fontSizeSp), onMinus = { onStyleChanged(style.copy(fontSizeSp = (style.fontSizeSp - 2).coerceAtLeast(12))) }, @@ -109,7 +111,7 @@ private fun StyleControlsCard( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "Outline", + text = stringResource(Res.string.compose_player_outline), color = colorScheme.onSurfaceVariant, fontSize = 14.sp, fontWeight = FontWeight.Medium, @@ -126,7 +128,8 @@ private fun StyleControlsCard( .padding(horizontal = 10.dp, vertical = 8.dp), ) { Text( - text = if (style.outlineEnabled) "On" else "Off", + text = if (style.outlineEnabled) stringResource(Res.string.compose_action_on) + else stringResource(Res.string.compose_action_off), color = if (style.outlineEnabled) colorScheme.onPrimaryContainer else colorScheme.onSurface, fontWeight = FontWeight.Bold, fontSize = 13.sp, @@ -140,7 +143,7 @@ private fun StyleControlsCard( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "Bottom Offset", + text = stringResource(Res.string.compose_player_bottom_offset), color = colorScheme.onSurfaceVariant, fontSize = 14.sp, fontWeight = FontWeight.Medium, @@ -163,7 +166,7 @@ private fun StyleControlsCard( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "Color", + text = stringResource(Res.string.compose_player_color), color = colorScheme.onSurfaceVariant, fontSize = 14.sp, fontWeight = FontWeight.Medium, @@ -203,7 +206,7 @@ private fun StyleControlsCard( .padding(horizontal = if (isCompact) 8.dp else 12.dp, vertical = if (isCompact) 6.dp else 8.dp), ) { Text( - text = "Reset Defaults", + text = stringResource(Res.string.compose_player_reset_defaults), color = colorScheme.onSurface, fontWeight = FontWeight.SemiBold, fontSize = if (isCompact) 12.sp else 14.sp, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/NextEpisodeCard.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/NextEpisodeCard.kt index 5cc44184..2de18276 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/NextEpisodeCard.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/NextEpisodeCard.kt @@ -38,6 +38,15 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_player_episode_title_format +import nuvio.composeapp.generated.resources.detail_btn_play +import nuvio.composeapp.generated.resources.player_next_episode +import nuvio.composeapp.generated.resources.player_next_episode_finding_source +import nuvio.composeapp.generated.resources.player_next_episode_playing_via_countdown +import nuvio.composeapp.generated.resources.player_next_episode_thumbnail +import nuvio.composeapp.generated.resources.player_next_episode_unaired +import org.jetbrains.compose.resources.stringResource @Composable fun NextEpisodeCard( @@ -81,7 +90,7 @@ fun NextEpisodeCard( ) { AsyncImage( model = nextEpisode.thumbnail, - contentDescription = "Next episode thumbnail", + contentDescription = stringResource(Res.string.player_next_episode_thumbnail), modifier = Modifier.fillMaxSize(), contentScale = ContentScale.Crop, ) @@ -107,14 +116,19 @@ fun NextEpisodeCard( verticalArrangement = Arrangement.Center, ) { Text( - text = "Next Episode", + text = stringResource(Res.string.player_next_episode), color = Color.White.copy(alpha = 0.8f), fontSize = 10.sp, fontWeight = FontWeight.Medium, ) Spacer(modifier = Modifier.height(2.dp)) Text( - text = "S${nextEpisode.season}E${nextEpisode.episode} • ${nextEpisode.title}", + text = stringResource( + Res.string.compose_player_episode_title_format, + nextEpisode.season, + nextEpisode.episode, + nextEpisode.title, + ), color = Color.White, fontSize = 12.sp, maxLines = 1, @@ -123,9 +137,13 @@ fun NextEpisodeCard( ) val autoPlayStatus = when { !isPlayable && !nextEpisode.unairedMessage.isNullOrBlank() -> nextEpisode.unairedMessage - isAutoPlaySearching -> "Finding source…" + isAutoPlaySearching -> stringResource(Res.string.player_next_episode_finding_source) !autoPlaySourceName.isNullOrBlank() && autoPlayCountdownSec != null -> - "Playing via $autoPlaySourceName in $autoPlayCountdownSec…" + stringResource( + Res.string.player_next_episode_playing_via_countdown, + autoPlaySourceName, + autoPlayCountdownSec, + ) else -> null } if (autoPlayStatus != null) { @@ -156,7 +174,11 @@ fun NextEpisodeCard( modifier = Modifier.size(13.dp), ) Text( - text = if (isPlayable) "Play" else "Unaired", + text = if (isPlayable) { + stringResource(Res.string.detail_btn_play) + } else { + stringResource(Res.string.player_next_episode_unaired) + }, color = if (isPlayable) Color.White else Color.White.copy(alpha = 0.72f), fontSize = 11.sp, modifier = Modifier.padding(start = 3.dp), diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipIntroButton.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipIntroButton.kt index 94a187ad..755a67f0 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipIntroButton.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipIntroButton.kt @@ -37,6 +37,12 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.player_skip +import nuvio.composeapp.generated.resources.player_skip_intro +import nuvio.composeapp.generated.resources.player_skip_outro +import nuvio.composeapp.generated.resources.player_skip_recap +import org.jetbrains.compose.resources.stringResource @Composable fun SkipIntroButton( @@ -112,7 +118,7 @@ fun SkipIntroButton( modifier = Modifier.size(20.dp), ) Text( - text = getSkipLabel(lastType), + text = skipLabel(lastType), color = Color.White, fontSize = 14.sp, modifier = Modifier.padding(start = 8.dp), @@ -140,11 +146,11 @@ fun SkipIntroButton( } } -private fun getSkipLabel(type: String?): String { - return when (type?.lowercase()) { - "intro", "op", "mixed-op" -> "Skip Intro" - "outro", "ed", "mixed-ed", "credits" -> "Skip Outro" - "recap" -> "Skip Recap" - else -> "Skip" +@Composable +private fun skipLabel(type: String?): String = + when (type?.lowercase()) { + "intro", "op", "mixed-op" -> stringResource(Res.string.player_skip_intro) + "outro", "ed", "mixed-ed", "credits" -> stringResource(Res.string.player_skip_outro) + "recap" -> stringResource(Res.string.player_skip_recap) + else -> stringResource(Res.string.player_skip) } -} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/PinEntryDialog.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/PinEntryDialog.kt index 26707681..ce6ef590 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/PinEntryDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/PinEntryDialog.kt @@ -48,6 +48,9 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -75,7 +78,7 @@ fun PinEntryDialog( horizontalAlignment = Alignment.CenterHorizontally, ) { Text( - text = "Enter PIN", + text = stringResource(Res.string.pin_enter), style = MaterialTheme.typography.headlineLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Bold, @@ -128,9 +131,12 @@ fun PinEntryDialog( } else { haptic.performHapticFeedback(HapticFeedbackType.LongPress) error = result.message ?: if (result.retryAfterSeconds > 0) { - "Locked. Try again in ${result.retryAfterSeconds}s" + getString( + Res.string.pin_locked_try_again, + result.retryAfterSeconds, + ) } else { - "Incorrect PIN" + getString(Res.string.pin_incorrect) } pin = "" } @@ -151,7 +157,7 @@ fun PinEntryDialog( if (onForgotPin != null) { Spacer(modifier = Modifier.height(16.dp)) Text( - text = "Forgot PIN?", + text = stringResource(Res.string.pin_forgot), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.primary, fontWeight = FontWeight.Medium, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileEditScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileEditScreen.kt index 4a0e7142..83d26dc6 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileEditScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileEditScreen.kt @@ -55,6 +55,8 @@ import com.nuvio.app.core.ui.NuvioScreenHeader import com.nuvio.app.core.ui.NuvioStatusModal import com.nuvio.app.core.ui.NuvioSurfaceCard import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalLayoutApi::class) @Composable @@ -104,7 +106,11 @@ fun ProfileEditScreen( NuvioScreen(modifier = modifier) { stickyHeader { NuvioScreenHeader( - title = if (isNew) "Add Profile" else "Edit Profile", + title = if (isNew) { + stringResource(Res.string.profile_edit_add_title) + } else { + stringResource(Res.string.profile_edit_edit_title) + }, onBack = onBack, ) } @@ -127,13 +133,17 @@ fun ProfileEditScreen( NuvioSurfaceCard { Column(verticalArrangement = Arrangement.spacedBy(14.dp)) { Text( - text = "Choose an avatar", + text = stringResource(Res.string.profile_choose_avatar), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, ) Text( text = selectedAvatarItem?.displayName - ?: if (avatars.isEmpty()) "Loading avatars..." else "Select an avatar for this profile.", + ?: if (avatars.isEmpty()) { + stringResource(Res.string.profile_loading_avatars) + } else { + stringResource(Res.string.profile_select_avatar) + }, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -171,27 +181,27 @@ fun ProfileEditScreen( NuvioSurfaceCard { Column(verticalArrangement = Arrangement.spacedBy(14.dp)) { Text( - text = "Security", + text = stringResource(Res.string.profile_security), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, ) Text( text = if (currentProfile?.pinEnabled == true) { - "This profile is protected with a PIN." + stringResource(Res.string.profile_security_pin_enabled) } else { - "Add a PIN if you want this profile locked before switching into it." + stringResource(Res.string.profile_security_pin_disabled) }, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) if (currentProfile?.pinEnabled == true) { NuvioPrimaryButton( - text = "Remove PIN Lock", + text = stringResource(Res.string.profile_remove_pin_lock), onClick = { showPinClear = true }, ) } else { NuvioPrimaryButton( - text = "Set PIN Lock", + text = stringResource(Res.string.profile_set_pin_lock), onClick = { showPinSetup = true }, ) } @@ -203,7 +213,13 @@ fun ProfileEditScreen( item { Spacer(modifier = Modifier.height(8.dp)) NuvioPrimaryButton( - text = if (isSaving) "Saving..." else if (isNew) "Create Profile" else "Save Changes", + text = if (isSaving) { + stringResource(Res.string.profile_saving) + } else if (isNew) { + stringResource(Res.string.profile_create_profile) + } else { + stringResource(Res.string.collections_editor_save_changes) + }, enabled = name.isNotBlank() && !isSaving, onClick = { isSaving = true @@ -247,7 +263,7 @@ fun ProfileEditScreen( ), ) { Text( - text = "Delete Profile", + text = stringResource(Res.string.profile_delete_title), style = MaterialTheme.typography.titleMedium, textAlign = TextAlign.Center, ) @@ -257,11 +273,14 @@ fun ProfileEditScreen( } NuvioStatusModal( - title = "Delete Profile?", - message = "All data for \"${currentProfile?.name}\" will be permanently deleted.", + title = stringResource(Res.string.profile_delete_title), + message = stringResource( + Res.string.profile_delete_confirm_message, + currentProfile?.name.orEmpty(), + ), isVisible = showDeleteConfirm, - confirmText = "Delete", - dismissText = "Cancel", + confirmText = stringResource(Res.string.action_delete), + dismissText = stringResource(Res.string.action_cancel), onConfirm = { showDeleteConfirm = false scope.launch { @@ -290,7 +309,7 @@ fun ProfileEditScreen( if (showPinClear && currentProfile != null) { PinEntryDialog( - profileName = "Remove PIN for ${currentProfile.name}", + profileName = stringResource(Res.string.profile_remove_pin_for, currentProfile.name), onVerify = { pin -> ProfileRepository.clearPin(currentProfile.profileIndex, pin) }, onVerified = { showPinClear = false @@ -364,24 +383,39 @@ private fun ProfileIdentityCard( verticalArrangement = Arrangement.spacedBy(6.dp), ) { Text( - text = name.ifBlank { if (isNew) "New profile" else "Unnamed profile" }, + text = name.ifBlank { + if (isNew) stringResource(Res.string.profile_new) + else stringResource(Res.string.profile_unnamed) + }, style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, ) Text( text = listOf( - if (isNew) "New profile" else (profileIndex?.let { "Profile $it" } ?: "Profile"), - if (usesPrimaryAddons) "Primary addons on" else "Primary addons off", + if (isNew) { + stringResource(Res.string.profile_new) + } else { + profileIndex?.let { stringResource(Res.string.profile_label_number, it) } + ?: stringResource(Res.string.profile_unnamed) + }, + if (usesPrimaryAddons) { + stringResource(Res.string.profile_primary_addons_on) + } else { + stringResource(Res.string.profile_primary_addons_off) + }, ).joinToString(" | "), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) Text( text = when { - selectedAvatar != null -> "Avatar: ${selectedAvatar.displayName}" - hasAvatarChoices -> "Choose an avatar below." - else -> "Avatar options will appear here when the catalog loads." + selectedAvatar != null -> stringResource( + Res.string.profile_avatar_selected, + selectedAvatar.displayName, + ) + hasAvatarChoices -> stringResource(Res.string.profile_choose_avatar_below) + else -> stringResource(Res.string.profile_avatar_options_pending) }, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, @@ -392,12 +426,12 @@ private fun ProfileIdentityCard( NuvioInputField( value = name, onValueChange = onNameChange, - placeholder = "Profile name", + placeholder = stringResource(Res.string.profile_name_placeholder), ) ProfileOptionRow( - title = "Use Primary Addons", - description = "Share the main profile's addon setup instead of managing a separate list.", + title = stringResource(Res.string.profile_use_primary_addons), + description = stringResource(Res.string.profile_use_primary_addons_description), checked = usesPrimaryAddons, onCheckedChange = onUsesPrimaryAddonsChange, ) @@ -510,7 +544,7 @@ fun PinSetupDialog( when (step) { "current" -> PinEntryDialog( - profileName = "Enter current PIN", + profileName = stringResource(Res.string.profile_enter_current_pin), onVerify = { pin -> ProfileRepository.verifyPin(profileIndex, pin) }, onVerified = { pin -> currentPin = pin @@ -520,7 +554,7 @@ fun PinSetupDialog( ) "new" -> PinEntryDialog( - profileName = "Enter new PIN", + profileName = stringResource(Res.string.profile_enter_new_pin), onVerify = { pin -> ProfileRepository.setPin( profileIndex = profileIndex, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileRepository.kt index 65e48b5c..b6637490 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileRepository.kt @@ -33,6 +33,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString @@ -40,6 +41,9 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.encodeToJsonElement import kotlinx.serialization.json.put +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.getString @Serializable private data class StoredProfilePayload( @@ -52,6 +56,7 @@ object ProfileRepository { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default) private val log = Logger.withTag("ProfileRepository") private val json = Json { ignoreUnknownKeys = true; encodeDefaults = true } + private fun localizedString(resource: StringResource): String = runBlocking { getString(resource) } private val _state = MutableStateFlow(ProfileState()) val state: StateFlow = _state.asStateFlow() @@ -274,7 +279,7 @@ object ProfileRepository { suspend fun setPin(profileIndex: Int, pin: String, currentPin: String? = null): PinVerifyResult { if (AuthRepository.state.value !is AuthState.Authenticated) { - return PinVerifyResult(unlocked = false, message = "Connect to the internet to set a PIN.") + return PinVerifyResult(unlocked = false, message = getString(Res.string.profile_pin_set_requires_internet)) } return runCatching { @@ -290,13 +295,13 @@ object ProfileRepository { }.onFailure { e -> log.e(e) { "Failed to set pin" } }.getOrElse { - PinVerifyResult(unlocked = false, message = "Couldn't set PIN. Try again.") + PinVerifyResult(unlocked = false, message = getString(Res.string.profile_pin_set_failed)) } } suspend fun clearPin(profileIndex: Int, currentPin: String? = null): PinVerifyResult { if (AuthRepository.state.value !is AuthState.Authenticated) { - return PinVerifyResult(unlocked = false, message = "Connect to the internet to remove the PIN lock.") + return PinVerifyResult(unlocked = false, message = getString(Res.string.profile_pin_clear_requires_internet)) } return runCatching { @@ -311,7 +316,7 @@ object ProfileRepository { }.onFailure { e -> log.e(e) { "Failed to clear pin" } }.getOrElse { - PinVerifyResult(unlocked = false, message = "Couldn't remove PIN lock. Try again.") + PinVerifyResult(unlocked = false, message = getString(Res.string.profile_pin_clear_failed)) } } @@ -407,7 +412,7 @@ object ProfileRepository { if (payload.isEmpty()) { return PinVerifyResult( unlocked = false, - message = "This PIN can't be verified offline on this device yet. Connect once and unlock it online first.", + message = localizedString(Res.string.profile_pin_offline_verification_requires_online), ) } @@ -415,7 +420,7 @@ object ProfileRepository { json.decodeFromString(payload) }.getOrNull() ?: return PinVerifyResult( unlocked = false, - message = "This PIN can't be verified offline on this device yet. Connect once and unlock it online first.", + message = localizedString(Res.string.profile_pin_offline_verification_requires_online), ) if ( @@ -426,7 +431,7 @@ object ProfileRepository { ProfilePinCacheStorage.removePayload(profileIndex) return PinVerifyResult( unlocked = false, - message = "This profile PIN changed. Connect once to refresh the lock on this device.", + message = localizedString(Res.string.profile_pin_changed_requires_refresh), ) } @@ -434,7 +439,7 @@ object ProfileRepository { return if (digest == cached.digest) { PinVerifyResult(unlocked = true) } else { - PinVerifyResult(unlocked = false, message = "Incorrect PIN") + PinVerifyResult(unlocked = false, message = localizedString(Res.string.pin_incorrect)) } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileSelectionScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileSelectionScreen.kt index 4b4f165c..3d487c02 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileSelectionScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileSelectionScreen.kt @@ -61,6 +61,8 @@ import com.nuvio.app.core.auth.AuthRepository import com.nuvio.app.core.auth.AuthState import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun ProfileSelectionScreen( @@ -132,7 +134,7 @@ fun ProfileSelectionScreen( Spacer(modifier = Modifier.height(if (isTabletLayout) 0.dp else 60.dp)) Text( - text = "Who's watching?", + text = stringResource(Res.string.profile_who_is_watching), style = MaterialTheme.typography.headlineLarge.copy( fontSize = 30.sp, letterSpacing = (-0.5).sp, @@ -258,7 +260,11 @@ fun ProfileSelectionScreen( .padding(horizontal = 24.dp, vertical = 10.dp), ) { Text( - text = if (isEditMode) "Done" else "Manage Profiles", + text = if (isEditMode) { + stringResource(Res.string.action_done) + } else { + stringResource(Res.string.profile_manage_profiles) + }, style = MaterialTheme.typography.bodyLarge, color = if (isEditMode) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant, @@ -429,7 +435,9 @@ private fun ProfileAvatarCard( Spacer(modifier = Modifier.height(12.dp)) Text( - text = profile.name.ifBlank { "Profile ${profile.profileIndex}" }, + text = profile.name.ifBlank { + stringResource(Res.string.profile_label_number, profile.profileIndex) + }, style = MaterialTheme.typography.bodyLarge.copy(fontSize = 16.sp), color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, @@ -506,7 +514,7 @@ private fun AddProfileCard( Spacer(modifier = Modifier.height(12.dp)) Text( - text = "Add Profile", + text = stringResource(Res.string.compose_profile_add_profile), style = MaterialTheme.typography.bodyLarge.copy(fontSize = 16.sp), color = MaterialTheme.colorScheme.onSurfaceVariant, fontWeight = FontWeight.SemiBold, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileSwitcherTab.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileSwitcherTab.kt index 198956be..d6a77b3f 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileSwitcherTab.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileSwitcherTab.kt @@ -66,6 +66,9 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import coil3.compose.AsyncImage import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString +import org.jetbrains.compose.resources.stringResource @Composable fun ProfileSwitcherTab( @@ -305,7 +308,7 @@ private fun PopupAddProfileBubble( ) { Icon( imageVector = Icons.Rounded.Add, - contentDescription = "Add Profile", + contentDescription = stringResource(Res.string.compose_profile_add_profile), tint = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.size(22.dp), ) @@ -314,7 +317,7 @@ private fun PopupAddProfileBubble( Spacer(modifier = Modifier.height(4.dp)) Text( - text = "Add", + text = stringResource(Res.string.compose_profile_add_profile), style = MaterialTheme.typography.labelSmall.copy(fontSize = 10.sp), color = MaterialTheme.colorScheme.onSurfaceVariant, fontWeight = FontWeight.Medium, @@ -466,7 +469,9 @@ private fun PopupProfileBubble( Spacer(modifier = Modifier.height(4.dp)) Text( - text = profile.name.ifBlank { "Profile ${profile.profileIndex}" }, + text = profile.name.ifBlank { + stringResource(Res.string.profile_label_number, profile.profileIndex) + }, style = MaterialTheme.typography.labelSmall.copy(fontSize = 10.sp), color = if (isSelected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant, @@ -501,7 +506,7 @@ private fun InlinePinEntry( modifier = Modifier.padding(top = 16.dp), ) { Text( - text = "Enter PIN for $profileName", + text = stringResource(Res.string.pin_enter_for, profileName), style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -579,9 +584,9 @@ private fun InlinePinEntry( onVerified() } else { error = if (result.retryAfterSeconds > 0) { - "Locked. Try again in ${result.retryAfterSeconds}s" + getString(Res.string.pin_locked_try_again, result.retryAfterSeconds) } else { - "Wrong PIN" + getString(Res.string.pin_incorrect) } pin = "" } @@ -601,7 +606,7 @@ private fun InlinePinEntry( Spacer(modifier = Modifier.height(8.dp)) Text( - text = "Cancel", + text = stringResource(Res.string.pin_cancel), style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.primary, fontWeight = FontWeight.SemiBold, @@ -645,7 +650,7 @@ private fun CompactPinKeypad( ) { Icon( imageVector = Icons.AutoMirrored.Rounded.Backspace, - contentDescription = "Backspace", + contentDescription = stringResource(Res.string.pin_backspace), tint = MaterialTheme.colorScheme.onSurface, modifier = Modifier.size(20.dp), ) @@ -685,7 +690,7 @@ fun ActiveProfileMiniAvatar( if (profile == null) { Icon( imageVector = Icons.Rounded.Person, - contentDescription = "Profile", + contentDescription = stringResource(Res.string.compose_nav_profile), modifier = Modifier.size(size.dp), ) return diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchDiscoverContent.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchDiscoverContent.kt index 25d57c04..5648e096 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchDiscoverContent.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchDiscoverContent.kt @@ -63,6 +63,8 @@ import com.nuvio.app.features.home.PosterShape import com.nuvio.app.features.home.components.HomeEmptyStateCard import com.nuvio.app.features.watching.application.WatchingState import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource internal fun LazyListScope.discoverContent( state: DiscoverUiState, @@ -91,7 +93,11 @@ internal fun LazyListScope.discoverContent( state.selectedCatalog?.let { selectedCatalog -> item { Text( - text = "${selectedCatalog.addonName} • ${selectedCatalog.type.displayTypeLabel()}", + text = stringResource( + Res.string.discover_catalog_context, + selectedCatalog.addonName, + selectedCatalog.type.displayTypeLabel(), + ), modifier = Modifier.padding(horizontal = 16.dp), style = MaterialTheme.typography.bodyMedium.copy( fontSize = 14.sp, @@ -149,7 +155,7 @@ internal fun LazyListScope.discoverContent( @Composable private fun DiscoverSectionHeader(modifier: Modifier = Modifier) { Text( - text = "Discover", + text = stringResource(Res.string.compose_search_discover_title), modifier = modifier, style = MaterialTheme.typography.displaySmall, color = MaterialTheme.colorScheme.onBackground, @@ -169,16 +175,16 @@ private fun DiscoverFilterRow( horizontalArrangement = Arrangement.spacedBy(8.dp), ) { DiscoverDropdownChip( - title = "Select Type", - label = state.selectedType?.displayTypeLabel() ?: "Type", + title = stringResource(Res.string.discover_select_type), + label = state.selectedType?.displayTypeLabel() ?: stringResource(Res.string.discover_type), selectedKey = state.selectedType, options = state.typeOptions.map { DiscoverOptionItem(key = it, label = it.displayTypeLabel()) }, enabled = state.typeOptions.isNotEmpty(), onSelected = { onTypeSelected(it.key) }, ) DiscoverDropdownChip( - title = "Select Catalog", - label = state.selectedCatalog?.catalogName ?: "Catalog", + title = stringResource(Res.string.discover_select_catalog), + label = state.selectedCatalog?.catalogName ?: stringResource(Res.string.discover_catalog), selectedKey = state.selectedCatalogKey, options = state.catalogOptions.map { option -> DiscoverOptionItem(key = option.key, label = option.catalogName) }, enabled = state.catalogOptions.isNotEmpty(), @@ -188,13 +194,13 @@ private fun DiscoverFilterRow( val selectedCatalog = state.selectedCatalog val genreOptions = buildList { if (selectedCatalog?.genreRequired != true) { - add(DiscoverOptionItem(key = "", label = "All Genres")) + add(DiscoverOptionItem(key = "", label = stringResource(Res.string.discover_all_genres))) } addAll(state.genreOptions.map { genre -> DiscoverOptionItem(key = genre, label = genre) }) } DiscoverDropdownChip( - title = "Select Genre", - label = state.selectedGenre ?: "All Genres", + title = stringResource(Res.string.discover_select_genre), + label = state.selectedGenre ?: stringResource(Res.string.discover_all_genres), selectedKey = state.selectedGenre ?: "", options = genreOptions, enabled = genreOptions.size > 1 || selectedCatalog?.genreRequired == true, @@ -490,23 +496,23 @@ private fun DiscoverEmptyStateCard( when (reason) { DiscoverEmptyStateReason.NoActiveAddons -> { - title = "No active addons" - message = "Install and validate at least one addon before browsing discover catalogs." + title = stringResource(Res.string.compose_search_empty_no_active_addons_title) + message = stringResource(Res.string.discover_empty_no_active_addons_message) } DiscoverEmptyStateReason.NoDiscoverCatalogs -> { - title = "No discover catalogs" - message = "Installed addons do not expose board-compatible catalogs for discover." + title = stringResource(Res.string.discover_empty_no_catalogs_title) + message = stringResource(Res.string.discover_empty_no_catalogs_message) } DiscoverEmptyStateReason.RequestFailed -> { - title = "Could not load discover" - message = errorMessage ?: "The selected catalog failed to return discover items." + title = stringResource(Res.string.discover_empty_load_failed_title) + message = errorMessage ?: stringResource(Res.string.discover_empty_load_failed_message) } DiscoverEmptyStateReason.NoResults, null -> { - title = "No titles found" - message = "The selected catalog and filters did not return any items." + title = stringResource(Res.string.discover_empty_no_results_title) + message = stringResource(Res.string.discover_empty_no_results_message) } } @@ -522,13 +528,14 @@ private data class DiscoverOptionItem( val label: String, ) +@Composable private fun String.displayTypeLabel(): String = when (lowercase()) { - "movie" -> "Movies" - "series" -> "Series" - "anime" -> "Anime" - "channel" -> "Channels" - "tv" -> "TV" + "movie" -> stringResource(Res.string.media_movies) + "series" -> stringResource(Res.string.media_series) + "anime" -> stringResource(Res.string.media_anime) + "channel" -> stringResource(Res.string.media_channels) + "tv" -> stringResource(Res.string.media_tv) else -> replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchRepository.kt index 30d3c5f7..6579e0db 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchRepository.kt @@ -1,6 +1,7 @@ package com.nuvio.app.features.search import co.touchlab.kermit.Logger +import com.nuvio.app.core.i18n.localizedMediaTypeLabel import com.nuvio.app.features.addons.AddonCatalog import com.nuvio.app.features.addons.AddonExtraProperty import com.nuvio.app.features.addons.ManagedAddon @@ -21,6 +22,8 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString object SearchRepository { private val log = Logger.withTag("SearchRepository") @@ -313,7 +316,7 @@ object SearchRepository { return HomeCatalogSection( key = "${manifest.id}:search:$type:$catalogId:${query.lowercase()}", - title = "$catalogName - ${type.displayLabel()}", + title = getString(Res.string.discover_catalog_context, catalogName, type.displayLabel()), subtitle = addon.displayTitle, addonName = addon.displayTitle, type = type, @@ -410,7 +413,7 @@ object SearchRepository { isLoading = false, nextSkip = null, emptyStateReason = DiscoverEmptyStateReason.RequestFailed, - errorMessage = error.message ?: "Unable to load discover items.", + errorMessage = error.message ?: getString(Res.string.discover_empty_load_failed_message), ) }, ) @@ -486,9 +489,7 @@ private fun List.previewNames(limit: Int = 5): String { } private fun String.displayLabel(): String = - replaceFirstChar { char -> - if (char.isLowerCase()) char.titlecase() else char.toString() - } + localizedMediaTypeLabel(this) private fun String.typeSortKey(): String = when (lowercase()) { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchScreen.kt index 90a834b6..c127cf3c 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchScreen.kt @@ -55,6 +55,22 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_nav_search +import nuvio.composeapp.generated.resources.compose_search_clear +import nuvio.composeapp.generated.resources.compose_search_discover_title +import nuvio.composeapp.generated.resources.compose_search_empty_failed_message +import nuvio.composeapp.generated.resources.compose_search_empty_failed_title +import nuvio.composeapp.generated.resources.compose_search_empty_no_active_addons_message +import nuvio.composeapp.generated.resources.compose_search_empty_no_active_addons_title +import nuvio.composeapp.generated.resources.compose_search_empty_no_results_message +import nuvio.composeapp.generated.resources.compose_search_empty_no_results_title +import nuvio.composeapp.generated.resources.compose_search_empty_no_search_catalogs_message +import nuvio.composeapp.generated.resources.compose_search_empty_no_search_catalogs_title +import nuvio.composeapp.generated.resources.compose_search_placeholder +import nuvio.composeapp.generated.resources.compose_search_recent_searches +import nuvio.composeapp.generated.resources.compose_search_remove_recent_search +import org.jetbrains.compose.resources.stringResource @Composable fun SearchScreen( @@ -78,14 +94,9 @@ fun SearchScreen( var lastRequestedQuery by rememberSaveable { mutableStateOf(null) } var observedOfflineState by remember { mutableStateOf(false) } val listState = rememberLazyListState() - val headerTitle by remember(query, listState) { + val discoverInFocus by remember(query, listState) { derivedStateOf { - if (query.isNotBlank()) { - "Search" - } else { - val discoverInFocus = listState.firstVisibleItemIndex > 0 - if (discoverInFocus) "Discover" else "Search" - } + query.isBlank() && listState.firstVisibleItemIndex > 0 } } @@ -191,6 +202,11 @@ fun SearchScreen( val homeSectionPadding = remember(maxWidth) { homeSectionHorizontalPaddingForWidth(maxWidth.value) } + val headerTitle = when { + query.isNotBlank() -> stringResource(Res.string.compose_nav_search) + discoverInFocus -> stringResource(Res.string.compose_search_discover_title) + else -> stringResource(Res.string.compose_nav_search) + } NuvioScreen( horizontalPadding = 0.dp, @@ -212,13 +228,13 @@ fun SearchScreen( NuvioInputField( value = query, onValueChange = { query = it }, - placeholder = "Search movies, shows...", + placeholder = stringResource(Res.string.compose_search_placeholder), trailingContent = if (query.isNotBlank()) { { IconButton(onClick = { query = "" }) { Icon( imageVector = Icons.Rounded.Close, - contentDescription = "Clear search", + contentDescription = stringResource(Res.string.compose_search_clear), tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } @@ -336,23 +352,23 @@ private fun SearchEmptyStateCard( when (reason) { SearchEmptyStateReason.NoActiveAddons -> { - title = "No active addons" - message = "Install and validate at least one addon before searching." + title = stringResource(Res.string.compose_search_empty_no_active_addons_title) + message = stringResource(Res.string.compose_search_empty_no_active_addons_message) } SearchEmptyStateReason.NoSearchCatalogs -> { - title = "No searchable catalogs" - message = "Your installed addons do not expose catalog search." + title = stringResource(Res.string.compose_search_empty_no_search_catalogs_title) + message = stringResource(Res.string.compose_search_empty_no_search_catalogs_message) } SearchEmptyStateReason.RequestFailed -> { - title = "Search failed" - message = errorMessage ?: "Installed addons failed to return valid search results." + title = stringResource(Res.string.compose_search_empty_failed_title) + message = errorMessage ?: stringResource(Res.string.compose_search_empty_failed_message) } SearchEmptyStateReason.NoResults, null -> { - title = "No results found" - message = "Installed searchable catalogs did not return any matches for this query." + title = stringResource(Res.string.compose_search_empty_no_results_title) + message = stringResource(Res.string.compose_search_empty_no_results_message) } } @@ -377,7 +393,7 @@ private fun SearchRecentSection( verticalArrangement = Arrangement.spacedBy(4.dp), ) { Text( - text = "Recent Searches", + text = stringResource(Res.string.compose_search_recent_searches), style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.SemiBold), color = MaterialTheme.colorScheme.onBackground, ) @@ -439,7 +455,7 @@ private fun SearchRecentRow( IconButton(onClick = onRemovePress) { Icon( imageVector = Icons.Rounded.Close, - contentDescription = "Remove recent search", + contentDescription = stringResource(Res.string.compose_search_remove_recent_search), tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AccountSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AccountSettingsPage.kt index acb2ff97..4e17b58a 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AccountSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AccountSettingsPage.kt @@ -30,6 +30,23 @@ import com.nuvio.app.core.ui.NuvioPrimaryButton import com.nuvio.app.core.ui.NuvioStatusModal import com.nuvio.app.core.ui.NuvioSurfaceCard import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.action_cancel +import nuvio.composeapp.generated.resources.action_delete +import nuvio.composeapp.generated.resources.compose_settings_page_account +import nuvio.composeapp.generated.resources.settings_account_delete_account +import nuvio.composeapp.generated.resources.settings_account_delete_account_description +import nuvio.composeapp.generated.resources.settings_account_delete_confirm_message +import nuvio.composeapp.generated.resources.settings_account_delete_confirm_title +import nuvio.composeapp.generated.resources.settings_account_email +import nuvio.composeapp.generated.resources.settings_account_not_signed_in +import nuvio.composeapp.generated.resources.settings_account_sign_out +import nuvio.composeapp.generated.resources.settings_account_sign_out_confirm_message +import nuvio.composeapp.generated.resources.settings_account_sign_out_confirm_title +import nuvio.composeapp.generated.resources.settings_account_status +import nuvio.composeapp.generated.resources.settings_account_status_anonymous +import nuvio.composeapp.generated.resources.settings_account_status_signed_in +import org.jetbrains.compose.resources.stringResource internal fun LazyListScope.accountSettingsContent( isTablet: Boolean, @@ -51,7 +68,7 @@ private fun AccountSettingsBody( Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { NuvioSurfaceCard { Text( - text = "Account", + text = stringResource(Res.string.compose_settings_page_account), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, @@ -65,12 +82,16 @@ private fun AccountSettingsBody( horizontalArrangement = Arrangement.SpaceBetween, ) { Text( - text = "Status", + text = stringResource(Res.string.settings_account_status), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) Text( - text = if (state.isAnonymous) "Anonymous" else "Signed In", + text = if (state.isAnonymous) { + stringResource(Res.string.settings_account_status_anonymous) + } else { + stringResource(Res.string.settings_account_status_signed_in) + }, style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.primary, fontWeight = FontWeight.Medium, @@ -83,7 +104,7 @@ private fun AccountSettingsBody( horizontalArrangement = Arrangement.SpaceBetween, ) { Text( - text = "Email", + text = stringResource(Res.string.settings_account_email), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -98,7 +119,7 @@ private fun AccountSettingsBody( } else -> { Text( - text = "Not signed in", + text = stringResource(Res.string.settings_account_not_signed_in), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -107,7 +128,7 @@ private fun AccountSettingsBody( } NuvioPrimaryButton( - text = "Sign Out", + text = stringResource(Res.string.settings_account_sign_out), onClick = { showSignOutConfirm = true }, ) @@ -126,13 +147,13 @@ private fun AccountSettingsBody( ), ) { Text( - text = "Delete Account", + text = stringResource(Res.string.settings_account_delete_account), style = MaterialTheme.typography.titleMedium, textAlign = TextAlign.Center, ) } Text( - text = "This will permanently delete your account and all associated data.", + text = stringResource(Res.string.settings_account_delete_account_description), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.fillMaxWidth(), @@ -142,11 +163,11 @@ private fun AccountSettingsBody( } NuvioStatusModal( - title = "Sign Out?", - message = "You will be returned to the login screen.", + title = stringResource(Res.string.settings_account_sign_out_confirm_title), + message = stringResource(Res.string.settings_account_sign_out_confirm_message), isVisible = showSignOutConfirm, - confirmText = "Sign Out", - dismissText = "Cancel", + confirmText = stringResource(Res.string.settings_account_sign_out), + dismissText = stringResource(Res.string.action_cancel), onConfirm = { showSignOutConfirm = false scope.launch { AuthRepository.signOut() } @@ -155,11 +176,11 @@ private fun AccountSettingsBody( ) NuvioStatusModal( - title = "Delete Account?", - message = "This action cannot be undone. All your data, profiles, and sync history will be permanently removed.", + title = stringResource(Res.string.settings_account_delete_confirm_title), + message = stringResource(Res.string.settings_account_delete_confirm_message), isVisible = showDeleteConfirm, - confirmText = "Delete", - dismissText = "Cancel", + confirmText = stringResource(Res.string.action_delete), + dismissText = stringResource(Res.string.action_cancel), onConfirm = { showDeleteConfirm = false scope.launch { AuthRepository.deleteAccount() } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt new file mode 100644 index 00000000..10bd8606 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt @@ -0,0 +1,20 @@ +package com.nuvio.app.features.settings + +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.lang_english +import nuvio.composeapp.generated.resources.lang_spanish +import org.jetbrains.compose.resources.StringResource + +enum class AppLanguage( + val code: String, + val labelRes: StringResource, +) { + ENGLISH("en", Res.string.lang_english), + SPANISH("es", Res.string.lang_spanish), + ; + + companion object { + fun fromCode(code: String?): AppLanguage = + entries.firstOrNull { it.code.equals(code, ignoreCase = true) } ?: ENGLISH + } +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppearanceSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppearanceSettingsPage.kt index 96239860..f697b48d 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppearanceSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppearanceSettingsPage.kt @@ -18,12 +18,18 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.rounded.Language import androidx.compose.material.icons.rounded.Style import androidx.compose.material.icons.rounded.Tune import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -32,7 +38,30 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.nuvio.app.core.ui.AppTheme +import com.nuvio.app.core.ui.NuvioBottomSheetActionRow +import com.nuvio.app.core.ui.NuvioBottomSheetDivider +import com.nuvio.app.core.ui.NuvioModalBottomSheet +import com.nuvio.app.core.ui.dismissNuvioBottomSheet +import com.nuvio.app.core.ui.labelRes import com.nuvio.app.core.ui.ThemeColors +import kotlinx.coroutines.launch +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.cd_selected +import nuvio.composeapp.generated.resources.compose_settings_page_continue_watching +import nuvio.composeapp.generated.resources.compose_settings_page_poster_customization +import nuvio.composeapp.generated.resources.settings_appearance_app_language +import nuvio.composeapp.generated.resources.settings_appearance_app_language_sheet_title +import nuvio.composeapp.generated.resources.settings_appearance_amoled_black +import nuvio.composeapp.generated.resources.settings_appearance_amoled_description +import nuvio.composeapp.generated.resources.settings_appearance_continue_watching_description +import nuvio.composeapp.generated.resources.settings_appearance_poster_customization_description +import nuvio.composeapp.generated.resources.settings_appearance_section_display +import nuvio.composeapp.generated.resources.settings_appearance_section_home +import nuvio.composeapp.generated.resources.settings_appearance_section_theme +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.rememberModalBottomSheetState @OptIn(ExperimentalLayoutApi::class) internal fun LazyListScope.appearanceSettingsContent( @@ -41,12 +70,14 @@ internal fun LazyListScope.appearanceSettingsContent( onThemeSelected: (AppTheme) -> Unit, amoledEnabled: Boolean, onAmoledToggle: (Boolean) -> Unit, + selectedAppLanguage: AppLanguage, + onAppLanguageSelected: (AppLanguage) -> Unit, onContinueWatchingClick: () -> Unit, onPosterCustomizationClick: () -> Unit, ) { item { SettingsSection( - title = "THEME", + title = stringResource(Res.string.settings_appearance_section_theme), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { @@ -74,39 +105,59 @@ internal fun LazyListScope.appearanceSettingsContent( } item { + var showLanguageSheet by remember { mutableStateOf(false) } SettingsSection( - title = "DISPLAY", + title = stringResource(Res.string.settings_appearance_section_display), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "AMOLED Black", - description = "Use pure black backgrounds for OLED screens.", + title = stringResource(Res.string.settings_appearance_amoled_black), + description = stringResource(Res.string.settings_appearance_amoled_description), checked = amoledEnabled, isTablet = isTablet, onCheckedChange = onAmoledToggle, ) + SettingsGroupDivider(isTablet = isTablet) + SettingsNavigationRow( + title = stringResource(Res.string.settings_appearance_app_language), + description = stringResource(selectedAppLanguage.labelRes), + icon = Icons.Rounded.Language, + isTablet = isTablet, + onClick = { showLanguageSheet = true }, + ) } } + + if (showLanguageSheet) { + AppearanceLanguageBottomSheet( + selectedLanguage = selectedAppLanguage, + onLanguageSelected = { + onAppLanguageSelected(it) + showLanguageSheet = false + }, + onDismiss = { showLanguageSheet = false }, + ) + } } item { SettingsSection( - title = "HOME", + title = stringResource(Res.string.settings_appearance_section_home), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsNavigationRow( - title = "Continue Watching", - description = "Show, hide, and style the Continue Watching shelf.", + title = stringResource(Res.string.compose_settings_page_continue_watching), + description = stringResource(Res.string.settings_appearance_continue_watching_description), icon = Icons.Rounded.Style, isTablet = isTablet, onClick = onContinueWatchingClick, ) SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Poster Customization", - description = "Adjust shared poster card width and corner radius presets.", + title = stringResource(Res.string.compose_settings_page_poster_customization), + description = stringResource(Res.string.settings_appearance_poster_customization_description), icon = Icons.Rounded.Tune, isTablet = isTablet, onClick = onPosterCustomizationClick, @@ -116,6 +167,78 @@ internal fun LazyListScope.appearanceSettingsContent( } } +private data class AppLanguageSheetOption( + val language: AppLanguage, + val labelRes: StringResource, +) + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun AppearanceLanguageBottomSheet( + selectedLanguage: AppLanguage, + onLanguageSelected: (AppLanguage) -> Unit, + onDismiss: () -> Unit, +) { + val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val coroutineScope = rememberCoroutineScope() + val options = remember { + AppLanguage.entries.map { language -> + AppLanguageSheetOption( + language = language, + labelRes = language.labelRes, + ) + } + } + + NuvioModalBottomSheet( + onDismissRequest = { + coroutineScope.launch { + dismissNuvioBottomSheet(sheetState = sheetState, onDismiss = onDismiss) + } + }, + sheetState = sheetState, + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 16.dp), + verticalArrangement = Arrangement.spacedBy(0.dp), + ) { + Text( + text = stringResource(Res.string.settings_appearance_app_language_sheet_title), + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.onSurface, + fontWeight = FontWeight.SemiBold, + modifier = Modifier.padding(horizontal = 16.dp, vertical = 14.dp), + ) + + options.forEachIndexed { index, option -> + if (index > 0) { + NuvioBottomSheetDivider() + } + NuvioBottomSheetActionRow( + title = stringResource(option.labelRes), + onClick = { + onLanguageSelected(option.language) + coroutineScope.launch { + dismissNuvioBottomSheet(sheetState = sheetState, onDismiss = onDismiss) + } + }, + trailingContent = { + if (option.language == selectedLanguage) { + Icon( + imageVector = Icons.Default.Check, + contentDescription = stringResource(Res.string.cd_selected), + tint = MaterialTheme.colorScheme.primary, + ) + } + }, + ) + } + } + } +} + @Composable private fun ThemeChip( theme: AppTheme, @@ -152,7 +275,7 @@ private fun ThemeChip( if (isSelected) { Icon( imageVector = Icons.Default.Check, - contentDescription = "Selected", + contentDescription = stringResource(Res.string.cd_selected), tint = palette.onSecondary, modifier = Modifier.size(22.dp), ) @@ -162,7 +285,7 @@ private fun ThemeChip( Spacer(modifier = Modifier.height(6.dp)) Text( - text = theme.displayName, + text = stringResource(theme.labelRes), style = MaterialTheme.typography.labelMedium, color = if (isSelected) { MaterialTheme.colorScheme.onSurface diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ContentDiscoverySettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ContentDiscoverySettingsPage.kt index 4d1b4da8..438fd3c3 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ContentDiscoverySettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ContentDiscoverySettingsPage.kt @@ -7,6 +7,20 @@ import androidx.compose.material.icons.rounded.Extension import androidx.compose.material.icons.rounded.Home import androidx.compose.material.icons.rounded.Hub import androidx.compose.material.icons.rounded.Tune +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_settings_page_addons +import nuvio.composeapp.generated.resources.compose_settings_page_homescreen +import nuvio.composeapp.generated.resources.compose_settings_page_meta_screen +import nuvio.composeapp.generated.resources.compose_settings_page_plugins +import nuvio.composeapp.generated.resources.collections_header +import nuvio.composeapp.generated.resources.settings_content_discovery_addons_description +import nuvio.composeapp.generated.resources.settings_content_discovery_collections_description +import nuvio.composeapp.generated.resources.settings_content_discovery_homescreen_description +import nuvio.composeapp.generated.resources.settings_content_discovery_meta_screen_description +import nuvio.composeapp.generated.resources.settings_content_discovery_plugins_description +import nuvio.composeapp.generated.resources.settings_content_discovery_section_home +import nuvio.composeapp.generated.resources.settings_content_discovery_section_sources +import org.jetbrains.compose.resources.stringResource internal fun LazyListScope.contentDiscoveryContent( isTablet: Boolean, @@ -19,21 +33,21 @@ internal fun LazyListScope.contentDiscoveryContent( ) { item { SettingsSection( - title = "SOURCES", + title = stringResource(Res.string.settings_content_discovery_section_sources), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsNavigationRow( - title = "Addons", - description = "Install, remove, refresh, and sort your content sources.", + title = stringResource(Res.string.compose_settings_page_addons), + description = stringResource(Res.string.settings_content_discovery_addons_description), icon = Icons.Rounded.Extension, isTablet = isTablet, onClick = onAddonsClick, ) if (showPluginsEntry) { SettingsNavigationRow( - title = "Plugins", - description = "Install JavaScript scraper repositories and test providers internally.", + title = stringResource(Res.string.compose_settings_page_plugins), + description = stringResource(Res.string.settings_content_discovery_plugins_description), icon = Icons.Rounded.Hub, isTablet = isTablet, onClick = onPluginsClick, @@ -44,27 +58,27 @@ internal fun LazyListScope.contentDiscoveryContent( } item { SettingsSection( - title = "HOME", + title = stringResource(Res.string.settings_content_discovery_section_home), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsNavigationRow( - title = "Homescreen", - description = "Control which catalogs appear on Home and in what order.", + title = stringResource(Res.string.compose_settings_page_homescreen), + description = stringResource(Res.string.settings_content_discovery_homescreen_description), icon = Icons.Rounded.Home, isTablet = isTablet, onClick = onHomescreenClick, ) SettingsNavigationRow( - title = "Meta Screen", - description = "Disable detail sections and reorder everything below Hero.", + title = stringResource(Res.string.compose_settings_page_meta_screen), + description = stringResource(Res.string.settings_content_discovery_meta_screen_description), icon = Icons.Rounded.Tune, isTablet = isTablet, onClick = onMetaScreenClick, ) SettingsNavigationRow( - title = "Collections", - description = "Create custom catalog groupings with folders shown on Home.", + title = stringResource(Res.string.collections_header), + description = stringResource(Res.string.settings_content_discovery_collections_description), icon = Icons.Rounded.CollectionsBookmark, isTablet = isTablet, onClick = onCollectionsClick, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ContinueWatchingSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ContinueWatchingSettingsPage.kt index 8668f0e8..34ab403c 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ContinueWatchingSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ContinueWatchingSettingsPage.kt @@ -25,6 +25,23 @@ import androidx.compose.ui.unit.dp import com.nuvio.app.features.home.components.ContinueWatchingStylePreview import com.nuvio.app.features.watchprogress.ContinueWatchingPreferencesRepository import com.nuvio.app.features.watchprogress.ContinueWatchingSectionStyle +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.settings_continue_watching_resume_prompt_description +import nuvio.composeapp.generated.resources.settings_continue_watching_resume_prompt_title +import nuvio.composeapp.generated.resources.settings_continue_watching_section_card_style +import nuvio.composeapp.generated.resources.settings_continue_watching_section_on_launch +import nuvio.composeapp.generated.resources.settings_continue_watching_section_up_next_behavior +import nuvio.composeapp.generated.resources.settings_continue_watching_section_visibility +import nuvio.composeapp.generated.resources.settings_continue_watching_show_description +import nuvio.composeapp.generated.resources.settings_continue_watching_show_title +import nuvio.composeapp.generated.resources.settings_continue_watching_style_poster +import nuvio.composeapp.generated.resources.settings_continue_watching_style_poster_description +import nuvio.composeapp.generated.resources.settings_continue_watching_style_wide +import nuvio.composeapp.generated.resources.settings_continue_watching_style_wide_description +import nuvio.composeapp.generated.resources.settings_continue_watching_up_next_description +import nuvio.composeapp.generated.resources.settings_continue_watching_up_next_title +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource internal fun LazyListScope.continueWatchingSettingsContent( isTablet: Boolean, @@ -35,13 +52,13 @@ internal fun LazyListScope.continueWatchingSettingsContent( ) { item { SettingsSection( - title = "VISIBILITY", + title = stringResource(Res.string.settings_continue_watching_section_visibility), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Show Continue Watching", - description = "Display the Continue Watching shelf on the Home screen.", + title = stringResource(Res.string.settings_continue_watching_show_title), + description = stringResource(Res.string.settings_continue_watching_show_description), checked = isVisible, isTablet = isTablet, onCheckedChange = ContinueWatchingPreferencesRepository::setVisible, @@ -51,7 +68,7 @@ internal fun LazyListScope.continueWatchingSettingsContent( } item { SettingsSection( - title = "CARD STYLE", + title = stringResource(Res.string.settings_continue_watching_section_card_style), isTablet = isTablet, ) { ContinueWatchingStyleSelector( @@ -63,13 +80,13 @@ internal fun LazyListScope.continueWatchingSettingsContent( } item { SettingsSection( - title = "UP NEXT BEHAVIOR", + title = stringResource(Res.string.settings_continue_watching_section_up_next_behavior), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Up Next from furthest episode", - description = "When enabled, Up Next always continues from the furthest watched episode. When disabled, it follows from the most recently watched episode. useful if you rewatch earlier episodes.", + title = stringResource(Res.string.settings_continue_watching_up_next_title), + description = stringResource(Res.string.settings_continue_watching_up_next_description), checked = upNextFromFurthestEpisode, isTablet = isTablet, onCheckedChange = ContinueWatchingPreferencesRepository::setUpNextFromFurthestEpisode, @@ -79,13 +96,13 @@ internal fun LazyListScope.continueWatchingSettingsContent( } item { SettingsSection( - title = "ON LAUNCH", + title = stringResource(Res.string.settings_continue_watching_section_on_launch), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Resume prompt on launch", - description = "Show a popup to continue where you left off when opening the app after leaving from the player.", + title = stringResource(Res.string.settings_continue_watching_resume_prompt_title), + description = stringResource(Res.string.settings_continue_watching_resume_prompt_description), checked = showResumePromptOnLaunch, isTablet = isTablet, onCheckedChange = ContinueWatchingPreferencesRepository::setShowResumePromptOnLaunch, @@ -173,20 +190,28 @@ private fun ContinueWatchingStyleOption( ) } Text( - text = style.name.lowercase().replaceFirstChar(Char::uppercase), + text = stringResource(style.labelRes), style = MaterialTheme.typography.bodyMedium, color = if (selected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, ) Text( - text = if (style == ContinueWatchingSectionStyle.Wide) { - "Info-dense horizontal card" - } else { - "Artwork-first poster card" - }, + text = stringResource(style.descriptionRes), style = if (isTablet) MaterialTheme.typography.bodySmall else MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) } } } + +private val ContinueWatchingSectionStyle.labelRes: StringResource + get() = when (this) { + ContinueWatchingSectionStyle.Wide -> Res.string.settings_continue_watching_style_wide + ContinueWatchingSectionStyle.Poster -> Res.string.settings_continue_watching_style_poster + } + +private val ContinueWatchingSectionStyle.descriptionRes: StringResource + get() = when (this) { + ContinueWatchingSectionStyle.Wide -> Res.string.settings_continue_watching_style_wide_description + ContinueWatchingSectionStyle.Poster -> Res.string.settings_continue_watching_style_poster_description + } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/HomescreenSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/HomescreenSettingsPage.kt index 4ea4b783..adaea670 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/HomescreenSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/HomescreenSettingsPage.kt @@ -36,6 +36,25 @@ import com.nuvio.app.core.ui.NuvioToastController import com.nuvio.app.features.home.HomeCatalogSettingsItem import com.nuvio.app.features.home.HomeCatalogSettingsRepository import com.nuvio.app.features.home.components.HomeEmptyStateCard +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.action_reset +import nuvio.composeapp.generated.resources.settings_homescreen_empty_message +import nuvio.composeapp.generated.resources.settings_homescreen_empty_title +import nuvio.composeapp.generated.resources.settings_homescreen_keep_home_focused +import nuvio.composeapp.generated.resources.settings_homescreen_limit_reached +import nuvio.composeapp.generated.resources.settings_homescreen_no_sources_selected +import nuvio.composeapp.generated.resources.settings_homescreen_pin_to_move_toast +import nuvio.composeapp.generated.resources.settings_homescreen_section_catalogs +import nuvio.composeapp.generated.resources.settings_homescreen_section_catalogs_collections +import nuvio.composeapp.generated.resources.settings_homescreen_section_collections +import nuvio.composeapp.generated.resources.settings_homescreen_section_hero +import nuvio.composeapp.generated.resources.settings_homescreen_section_hero_sources +import nuvio.composeapp.generated.resources.settings_homescreen_selected_count +import nuvio.composeapp.generated.resources.settings_homescreen_show_hero +import nuvio.composeapp.generated.resources.settings_homescreen_show_hero_description +import nuvio.composeapp.generated.resources.settings_homescreen_summary +import nuvio.composeapp.generated.resources.settings_homescreen_summary_hint +import org.jetbrains.compose.resources.stringResource import sh.calvin.reorderable.ReorderableCollectionItemScope import sh.calvin.reorderable.ReorderableItem import sh.calvin.reorderable.rememberReorderableLazyListState @@ -57,13 +76,13 @@ internal fun LazyListScope.homescreenSettingsContent( } item { SettingsSection( - title = "HERO", + title = stringResource(Res.string.settings_homescreen_section_hero), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Show Hero", - description = "Display a featured hero carousel at the top of Home. Choose up to 2 source catalogs below.", + title = stringResource(Res.string.settings_homescreen_show_hero), + description = stringResource(Res.string.settings_homescreen_show_hero_description), checked = heroEnabled, isTablet = isTablet, onCheckedChange = HomeCatalogSettingsRepository::setHeroEnabled, @@ -76,7 +95,7 @@ internal fun LazyListScope.homescreenSettingsContent( if (heroEnabled && catalogOnlyItems.isNotEmpty()) { var heroSourcesExpanded by remember { mutableStateOf(false) } SettingsSection( - title = "HERO SOURCES", + title = stringResource(Res.string.settings_homescreen_section_hero_sources), isTablet = isTablet, ) { HeroSourcesDropdown( @@ -93,35 +112,36 @@ internal fun LazyListScope.homescreenSettingsContent( if (items.isEmpty()) { HomeEmptyStateCard( modifier = Modifier.fillMaxWidth(), - title = "No home catalogs", - message = "Install an addon with board-compatible catalogs to configure Homescreen rows.", + title = stringResource(Res.string.settings_homescreen_empty_title), + message = stringResource(Res.string.settings_homescreen_empty_message), ) } else { val catalogCount = items.count { !it.isCollection } val collectionCount = items.count { it.isCollection } val sectionTitle = when { - collectionCount > 0 && catalogCount > 0 -> "CATALOGS & COLLECTIONS" - collectionCount > 0 -> "COLLECTIONS" - else -> "CATALOGS" + collectionCount > 0 && catalogCount > 0 -> stringResource(Res.string.settings_homescreen_section_catalogs_collections) + collectionCount > 0 -> stringResource(Res.string.settings_homescreen_section_collections) + else -> stringResource(Res.string.settings_homescreen_section_catalogs) } SettingsSection( title = sectionTitle, isTablet = isTablet, actions = { NuvioActionLabel( - text = "Reset", + text = stringResource(Res.string.action_reset), onClick = HomeCatalogSettingsRepository::resetToDefaults, ) }, ) { val hapticFeedback = LocalHapticFeedback.current + val pinToMoveToast = stringResource(Res.string.settings_homescreen_pin_to_move_toast) HomescreenCatalogList( isTablet = isTablet, items = items, onPinnedDragAttempt = { hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress) - NuvioToastController.show("Remove pin to top from collection to move") + NuvioToastController.show(pinToMoveToast) }, ) } @@ -137,6 +157,7 @@ private fun HeroSourcesDropdown( expanded: Boolean, onExpandedChange: (Boolean) -> Unit, ) { + val noSourcesSelected = stringResource(Res.string.settings_homescreen_no_sources_selected) SettingsGroup(isTablet = isTablet) { Row( modifier = Modifier @@ -150,7 +171,11 @@ private fun HeroSourcesDropdown( verticalArrangement = Arrangement.spacedBy(4.dp), ) { Text( - text = "$selectedHeroSourceCount of ${HomeCatalogSettingsRepository.HERO_SOURCE_SELECTION_LIMIT} selected", + text = stringResource( + Res.string.settings_homescreen_selected_count, + selectedHeroSourceCount, + HomeCatalogSettingsRepository.HERO_SOURCE_SELECTION_LIMIT, + ), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Medium, @@ -158,7 +183,7 @@ private fun HeroSourcesDropdown( Text( text = items.filter { it.heroSourceEnabled } .joinToString(separator = ", ") { it.displayTitle } - .ifBlank { "No hero sources selected" }, + .ifBlank { noSourcesSelected }, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -182,7 +207,11 @@ private fun HeroSourcesDropdown( description = if (!item.heroSourceEnabled && selectedHeroSourceCount >= HomeCatalogSettingsRepository.HERO_SOURCE_SELECTION_LIMIT ) { - "${item.addonName} • Limit reached (max 2)" + stringResource( + Res.string.settings_homescreen_limit_reached, + item.addonName, + HomeCatalogSettingsRepository.HERO_SOURCE_SELECTION_LIMIT, + ) } else { item.addonName }, @@ -211,18 +240,23 @@ private fun HomescreenSummaryCard( verticalArrangement = Arrangement.spacedBy(6.dp), ) { Text( - text = "Keep Home focused", + text = stringResource(Res.string.settings_homescreen_keep_home_focused), style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, ) Text( - text = "$enabledCatalogCount of $totalCatalogCount catalogs visible • $selectedHeroSourceCount hero sources selected", + text = stringResource( + Res.string.settings_homescreen_summary, + enabledCatalogCount, + totalCatalogCount, + selectedHeroSourceCount, + ), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) Text( - text = "Open a catalog only when you need to rename or reorder it.", + text = stringResource(Res.string.settings_homescreen_summary_hint), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/IntegrationsSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/IntegrationsSettingsPage.kt index a069bff0..7602c3e2 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/IntegrationsSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/IntegrationsSettingsPage.kt @@ -1,6 +1,13 @@ package com.nuvio.app.features.settings import androidx.compose.foundation.lazy.LazyListScope +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_settings_page_mdblist_ratings +import nuvio.composeapp.generated.resources.compose_settings_page_tmdb_enrichment +import nuvio.composeapp.generated.resources.settings_integrations_mdblist_description +import nuvio.composeapp.generated.resources.settings_integrations_section_title +import nuvio.composeapp.generated.resources.settings_integrations_tmdb_description +import org.jetbrains.compose.resources.stringResource internal fun LazyListScope.integrationsContent( isTablet: Boolean, @@ -9,21 +16,21 @@ internal fun LazyListScope.integrationsContent( ) { item { SettingsSection( - title = "INTEGRATIONS", + title = stringResource(Res.string.settings_integrations_section_title), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsNavigationRow( - title = "TMDB Enrichment", - description = "Enhance detail pages with TMDB artwork, credits, episode metadata, and more.", + title = stringResource(Res.string.compose_settings_page_tmdb_enrichment), + description = stringResource(Res.string.settings_integrations_tmdb_description), iconPainter = integrationLogoPainter(IntegrationLogo.Tmdb), isTablet = isTablet, onClick = onTmdbClick, ) SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "MDBList Ratings", - description = "Add IMDb, Rotten Tomatoes, Metacritic, and other external ratings to details pages.", + title = stringResource(Res.string.compose_settings_page_mdblist_ratings), + description = stringResource(Res.string.settings_integrations_mdblist_description), iconPainter = integrationLogoPainter(IntegrationLogo.MdbList), isTablet = isTablet, onClick = onMdbListClick, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/MdbListSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/MdbListSettingsPage.kt index 951aed40..9787b732 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/MdbListSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/MdbListSettingsPage.kt @@ -24,6 +24,26 @@ import androidx.compose.ui.unit.dp import com.nuvio.app.features.mdblist.MdbListMetadataService import com.nuvio.app.features.mdblist.MdbListSettings import com.nuvio.app.features.mdblist.MdbListSettingsRepository +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.action_save +import nuvio.composeapp.generated.resources.settings_mdb_add_api_key_first +import nuvio.composeapp.generated.resources.settings_mdb_api_key_description +import nuvio.composeapp.generated.resources.settings_mdb_api_key_label +import nuvio.composeapp.generated.resources.settings_mdb_api_key_title +import nuvio.composeapp.generated.resources.settings_mdb_enable_ratings +import nuvio.composeapp.generated.resources.settings_mdb_enable_ratings_description +import nuvio.composeapp.generated.resources.settings_mdb_section_api_key +import nuvio.composeapp.generated.resources.settings_mdb_section_rating_providers +import nuvio.composeapp.generated.resources.settings_mdb_section_title +import nuvio.composeapp.generated.resources.source_audience_score +import nuvio.composeapp.generated.resources.source_imdb +import nuvio.composeapp.generated.resources.source_letterboxd +import nuvio.composeapp.generated.resources.source_metacritic +import nuvio.composeapp.generated.resources.source_rotten_tomatoes +import nuvio.composeapp.generated.resources.source_tmdb +import nuvio.composeapp.generated.resources.source_trakt +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource internal fun LazyListScope.mdbListSettingsContent( isTablet: Boolean, @@ -33,13 +53,13 @@ internal fun LazyListScope.mdbListSettingsContent( item { SettingsSection( - title = "MDBLIST", + title = stringResource(Res.string.settings_mdb_section_title), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Enable MDBList ratings", - description = "Show external ratings from MDBList on metadata pages when an IMDb ID is available.", + title = stringResource(Res.string.settings_mdb_enable_ratings), + description = stringResource(Res.string.settings_mdb_enable_ratings_description), checked = settings.enabled, enabled = settings.hasApiKey, isTablet = isTablet, @@ -49,7 +69,7 @@ internal fun LazyListScope.mdbListSettingsContent( SettingsGroupDivider(isTablet = isTablet) MdbListInfoRow( isTablet = isTablet, - text = "Add your MDBList API key below before turning ratings on.", + text = stringResource(Res.string.settings_mdb_add_api_key_first), ) } } @@ -58,7 +78,7 @@ internal fun LazyListScope.mdbListSettingsContent( item { SettingsSection( - title = "API KEY", + title = stringResource(Res.string.settings_mdb_section_api_key), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { @@ -73,7 +93,7 @@ internal fun LazyListScope.mdbListSettingsContent( item { SettingsSection( - title = "RATING PROVIDERS", + title = stringResource(Res.string.settings_mdb_section_rating_providers), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { @@ -94,18 +114,18 @@ private fun ProviderRows( controlsEnabled: Boolean, ) { val providers = listOf( - MdbListMetadataService.PROVIDER_IMDB to "IMDb", - MdbListMetadataService.PROVIDER_TMDB to "TMDB", - MdbListMetadataService.PROVIDER_TOMATOES to "Rotten Tomatoes", - MdbListMetadataService.PROVIDER_METACRITIC to "Metacritic", - MdbListMetadataService.PROVIDER_TRAKT to "Trakt", - MdbListMetadataService.PROVIDER_LETTERBOXD to "Letterboxd", - MdbListMetadataService.PROVIDER_AUDIENCE to "Audience Score", + MdbListMetadataService.PROVIDER_IMDB to Res.string.source_imdb, + MdbListMetadataService.PROVIDER_TMDB to Res.string.source_tmdb, + MdbListMetadataService.PROVIDER_TOMATOES to Res.string.source_rotten_tomatoes, + MdbListMetadataService.PROVIDER_METACRITIC to Res.string.source_metacritic, + MdbListMetadataService.PROVIDER_TRAKT to Res.string.source_trakt, + MdbListMetadataService.PROVIDER_LETTERBOXD to Res.string.source_letterboxd, + MdbListMetadataService.PROVIDER_AUDIENCE to Res.string.source_audience_score, ) - providers.forEachIndexed { index, (providerId, providerLabel) -> + providers.forEachIndexed { index, (providerId, providerLabelRes) -> SettingsSwitchRow( - title = providerLabel, + title = stringResource(providerLabelRes), checked = settings.isProviderEnabled(providerId), enabled = controlsEnabled, isTablet = isTablet, @@ -138,13 +158,13 @@ private fun MdbListApiKeyRow( ) { Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { Text( - text = "MDBList API key", + text = stringResource(Res.string.settings_mdb_api_key_title), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Medium, ) Text( - text = "Get a key from https://mdblist.com/preferences and paste it here.", + text = stringResource(Res.string.settings_mdb_api_key_description), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -157,7 +177,7 @@ private fun MdbListApiKeyRow( }, modifier = Modifier.fillMaxWidth(), singleLine = true, - label = { Text("API key") }, + label = { Text(stringResource(Res.string.settings_mdb_api_key_label)) }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), colors = OutlinedTextFieldDefaults.colors( focusedBorderColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.75f), @@ -176,7 +196,7 @@ private fun MdbListApiKeyRow( }, enabled = normalizedDraft != value, ) { - Text("Save Key") + Text(stringResource(Res.string.action_save)) } } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/MetaScreenSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/MetaScreenSettingsPage.kt index 8885fa89..adfd3e02 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/MetaScreenSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/MetaScreenSettingsPage.kt @@ -50,8 +50,51 @@ import androidx.compose.ui.unit.dp import com.nuvio.app.core.ui.NuvioActionLabel import com.nuvio.app.features.details.MetaEpisodeCardStyle import com.nuvio.app.features.details.MetaScreenSectionItem +import com.nuvio.app.features.details.MetaScreenSectionKey import com.nuvio.app.features.details.MetaScreenSettingsRepository import com.nuvio.app.features.details.MetaScreenSettingsUiState +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.action_reorder +import nuvio.composeapp.generated.resources.action_reset +import nuvio.composeapp.generated.resources.settings_homescreen_hidden +import nuvio.composeapp.generated.resources.settings_homescreen_visible +import nuvio.composeapp.generated.resources.settings_meta_actions +import nuvio.composeapp.generated.resources.settings_meta_actions_description +import nuvio.composeapp.generated.resources.settings_meta_cast +import nuvio.composeapp.generated.resources.settings_meta_cast_description +import nuvio.composeapp.generated.resources.settings_meta_cinematic_background +import nuvio.composeapp.generated.resources.settings_meta_cinematic_background_description +import nuvio.composeapp.generated.resources.settings_meta_collection +import nuvio.composeapp.generated.resources.settings_meta_collection_description +import nuvio.composeapp.generated.resources.settings_meta_comments +import nuvio.composeapp.generated.resources.settings_meta_comments_description +import nuvio.composeapp.generated.resources.settings_meta_details +import nuvio.composeapp.generated.resources.settings_meta_details_description +import nuvio.composeapp.generated.resources.settings_meta_episode_cards +import nuvio.composeapp.generated.resources.settings_meta_episode_cards_description +import nuvio.composeapp.generated.resources.settings_meta_episode_style_horizontal +import nuvio.composeapp.generated.resources.settings_meta_episode_style_horizontal_description +import nuvio.composeapp.generated.resources.settings_meta_episode_style_list +import nuvio.composeapp.generated.resources.settings_meta_episode_style_list_description +import nuvio.composeapp.generated.resources.settings_meta_episodes +import nuvio.composeapp.generated.resources.settings_meta_episodes_description +import nuvio.composeapp.generated.resources.settings_meta_group_label +import nuvio.composeapp.generated.resources.settings_meta_more_like_this +import nuvio.composeapp.generated.resources.settings_meta_more_like_this_description +import nuvio.composeapp.generated.resources.settings_meta_none +import nuvio.composeapp.generated.resources.settings_meta_overview +import nuvio.composeapp.generated.resources.settings_meta_overview_description +import nuvio.composeapp.generated.resources.settings_meta_production +import nuvio.composeapp.generated.resources.settings_meta_production_description +import nuvio.composeapp.generated.resources.settings_meta_section_appearance +import nuvio.composeapp.generated.resources.settings_meta_section_sections +import nuvio.composeapp.generated.resources.settings_meta_tab_group_format +import nuvio.composeapp.generated.resources.settings_meta_tab_layout +import nuvio.composeapp.generated.resources.settings_meta_tab_layout_description +import nuvio.composeapp.generated.resources.settings_meta_trailers +import nuvio.composeapp.generated.resources.settings_meta_trailers_description +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource import sh.calvin.reorderable.ReorderableCollectionItemScope import sh.calvin.reorderable.ReorderableItem import sh.calvin.reorderable.rememberReorderableLazyListState @@ -62,21 +105,21 @@ internal fun LazyListScope.metaScreenSettingsContent( ) { item { SettingsSection( - title = "APPEARANCE", + title = stringResource(Res.string.settings_meta_section_appearance), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Cinematic Background", - description = "Blurred backdrop behind content, similar to stream screen.", + title = stringResource(Res.string.settings_meta_cinematic_background), + description = stringResource(Res.string.settings_meta_cinematic_background_description), checked = uiState.cinematicBackground, isTablet = isTablet, onCheckedChange = { MetaScreenSettingsRepository.setCinematicBackground(it) }, ) SettingsGroupDivider(isTablet = isTablet) SettingsSwitchRow( - title = "Tab Layout", - description = "Group sections into tabs like the TV app. Assign up to 3 sections per tab group.", + title = stringResource(Res.string.settings_meta_tab_layout), + description = stringResource(Res.string.settings_meta_tab_layout_description), checked = uiState.tabLayout, isTablet = isTablet, onCheckedChange = { MetaScreenSettingsRepository.setTabLayout(it) }, @@ -92,11 +135,11 @@ internal fun LazyListScope.metaScreenSettingsContent( } item { SettingsSection( - title = "SECTIONS", + title = stringResource(Res.string.settings_meta_section_sections), isTablet = isTablet, actions = { NuvioActionLabel( - text = "Reset", + text = stringResource(Res.string.action_reset), onClick = MetaScreenSettingsRepository::resetToDefaults, ) }, @@ -197,7 +240,7 @@ private fun MetaSectionRow( verticalArrangement = Arrangement.spacedBy(4.dp), ) { Text( - text = item.title, + text = stringResource(item.key.titleRes), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, @@ -205,7 +248,7 @@ private fun MetaSectionRow( overflow = TextOverflow.Ellipsis, ) Text( - text = item.description, + text = stringResource(item.key.descriptionRes), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -214,7 +257,11 @@ private fun MetaSectionRow( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = if (item.enabled) "Visible" else "Hidden", + text = if (item.enabled) { + stringResource(Res.string.settings_homescreen_visible) + } else { + stringResource(Res.string.settings_homescreen_hidden) + }, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -226,7 +273,7 @@ private fun MetaSectionRow( .background(MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.4f)), ) Text( - text = "Tab Group ${item.tabGroup}", + text = stringResource(Res.string.settings_meta_tab_group_format, item.tabGroup ?: 0), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.primary, fontWeight = FontWeight.Medium, @@ -259,7 +306,7 @@ private fun MetaSectionRow( ) { Icon( Icons.Rounded.Menu, - contentDescription = "Reorder", + contentDescription = stringResource(Res.string.action_reorder), tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } @@ -277,7 +324,7 @@ private fun MetaSectionRow( verticalArrangement = Arrangement.spacedBy(4.dp), ) { TabGroupChip( - label = "None", + label = stringResource(Res.string.settings_meta_none), selected = item.tabGroup == null, onClick = { onTabGroupChange(null) }, ) @@ -286,7 +333,7 @@ private fun MetaSectionRow( val isSelected = item.tabGroup == groupId val isFull = currentCount >= 3 && !isSelected TabGroupChip( - label = "Group $groupId", + label = stringResource(Res.string.settings_meta_group_label, groupId), selected = isSelected, enabled = !isFull, onClick = { onTabGroupChange(groupId) }, @@ -334,13 +381,13 @@ private fun MetaEpisodeCardStyleSelector( verticalArrangement = Arrangement.spacedBy(12.dp), ) { Text( - text = "Episode Cards", + text = stringResource(Res.string.settings_meta_episode_cards), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, ) Text( - text = "Choose how episodes are rendered on the metadata screen.", + text = stringResource(Res.string.settings_meta_episode_cards_description), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -404,17 +451,13 @@ private fun MetaEpisodeCardStyleOption( ) } Text( - text = if (style == MetaEpisodeCardStyle.Horizontal) "Horizontal" else "List", + text = stringResource(style.labelRes), style = MaterialTheme.typography.bodyMedium, color = if (selected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, ) Text( - text = if (style == MetaEpisodeCardStyle.Horizontal) { - "Backdrop-style row cards" - } else { - "Detail-first stacked cards" - }, + text = stringResource(style.descriptionRes), style = if (isTablet) MaterialTheme.typography.bodySmall else MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -422,6 +465,46 @@ private fun MetaEpisodeCardStyleOption( } } +private val MetaEpisodeCardStyle.labelRes: StringResource + get() = when (this) { + MetaEpisodeCardStyle.Horizontal -> Res.string.settings_meta_episode_style_horizontal + MetaEpisodeCardStyle.List -> Res.string.settings_meta_episode_style_list + } + +private val MetaEpisodeCardStyle.descriptionRes: StringResource + get() = when (this) { + MetaEpisodeCardStyle.Horizontal -> Res.string.settings_meta_episode_style_horizontal_description + MetaEpisodeCardStyle.List -> Res.string.settings_meta_episode_style_list_description + } + +private val MetaScreenSectionKey.titleRes: StringResource + get() = when (this) { + MetaScreenSectionKey.ACTIONS -> Res.string.settings_meta_actions + MetaScreenSectionKey.OVERVIEW -> Res.string.settings_meta_overview + MetaScreenSectionKey.PRODUCTION -> Res.string.settings_meta_production + MetaScreenSectionKey.CAST -> Res.string.settings_meta_cast + MetaScreenSectionKey.COMMENTS -> Res.string.settings_meta_comments + MetaScreenSectionKey.TRAILERS -> Res.string.settings_meta_trailers + MetaScreenSectionKey.EPISODES -> Res.string.settings_meta_episodes + MetaScreenSectionKey.DETAILS -> Res.string.settings_meta_details + MetaScreenSectionKey.COLLECTION -> Res.string.settings_meta_collection + MetaScreenSectionKey.MORE_LIKE_THIS -> Res.string.settings_meta_more_like_this + } + +private val MetaScreenSectionKey.descriptionRes: StringResource + get() = when (this) { + MetaScreenSectionKey.ACTIONS -> Res.string.settings_meta_actions_description + MetaScreenSectionKey.OVERVIEW -> Res.string.settings_meta_overview_description + MetaScreenSectionKey.PRODUCTION -> Res.string.settings_meta_production_description + MetaScreenSectionKey.CAST -> Res.string.settings_meta_cast_description + MetaScreenSectionKey.COMMENTS -> Res.string.settings_meta_comments_description + MetaScreenSectionKey.TRAILERS -> Res.string.settings_meta_trailers_description + MetaScreenSectionKey.EPISODES -> Res.string.settings_meta_episodes_description + MetaScreenSectionKey.DETAILS -> Res.string.settings_meta_details_description + MetaScreenSectionKey.COLLECTION -> Res.string.settings_meta_collection_description + MetaScreenSectionKey.MORE_LIKE_THIS -> Res.string.settings_meta_more_like_this_description + } + @Composable private fun MetaEpisodeCardStylePreview( style: MetaEpisodeCardStyle, @@ -530,4 +613,4 @@ private fun MetaEpisodeCardStylePreview( } } } -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/NotificationsSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/NotificationsSettingsPage.kt index f2ef00c5..a7eab2c2 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/NotificationsSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/NotificationsSettingsPage.kt @@ -16,6 +16,20 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import com.nuvio.app.features.notifications.EpisodeReleaseNotificationsRepository import com.nuvio.app.features.notifications.EpisodeReleaseNotificationsUiState +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.settings_notifications_disabled_in_app +import nuvio.composeapp.generated.resources.settings_notifications_episode_release_alerts +import nuvio.composeapp.generated.resources.settings_notifications_episode_release_alerts_description +import nuvio.composeapp.generated.resources.settings_notifications_permission_disabled +import nuvio.composeapp.generated.resources.settings_notifications_scheduled_count +import nuvio.composeapp.generated.resources.settings_notifications_section_alerts +import nuvio.composeapp.generated.resources.settings_notifications_section_test +import nuvio.composeapp.generated.resources.settings_notifications_send_test +import nuvio.composeapp.generated.resources.settings_notifications_sending_test +import nuvio.composeapp.generated.resources.settings_notifications_test_for_title +import nuvio.composeapp.generated.resources.settings_notifications_test_requires_saved_show +import nuvio.composeapp.generated.resources.settings_notifications_test_title +import org.jetbrains.compose.resources.stringResource internal fun LazyListScope.notificationsSettingsContent( isTablet: Boolean, @@ -23,13 +37,13 @@ internal fun LazyListScope.notificationsSettingsContent( ) { item { SettingsSection( - title = "ALERTS", + title = stringResource(Res.string.settings_notifications_section_alerts), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Episode release alerts", - description = "Schedule local notifications when a new episode for a saved show becomes available.", + title = stringResource(Res.string.settings_notifications_episode_release_alerts), + description = stringResource(Res.string.settings_notifications_episode_release_alerts_description), checked = uiState.isEnabled, enabled = !uiState.isLoading, isTablet = isTablet, @@ -41,7 +55,7 @@ internal fun LazyListScope.notificationsSettingsContent( item { SettingsSection( - title = "TEST", + title = stringResource(Res.string.settings_notifications_section_test), isTablet = isTablet, ) { NotificationTestCard( @@ -74,23 +88,23 @@ private fun NotificationTestCard( verticalArrangement = Arrangement.spacedBy(6.dp), ) { Text( - text = "Test notification", + text = stringResource(Res.string.settings_notifications_test_title), style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, ) Text( text = uiState.testTargetTitle?.let { title -> - "Send a local test notification for $title." - } ?: "Save a show to your library first to test notifications.", + stringResource(Res.string.settings_notifications_test_for_title, title) + } ?: stringResource(Res.string.settings_notifications_test_requires_saved_show), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) Text( text = if (uiState.isEnabled) { - "${uiState.scheduledCount} release alerts are currently scheduled on this device." + stringResource(Res.string.settings_notifications_scheduled_count, uiState.scheduledCount) } else { - "Notifications are currently disabled in Nuvio." + stringResource(Res.string.settings_notifications_disabled_in_app) }, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, @@ -108,7 +122,13 @@ private fun NotificationTestCard( contentColor = MaterialTheme.colorScheme.onPrimary, ), ) { - Text(if (uiState.isSendingTest) "Sending Test Notification..." else "Send Test Notification") + Text( + if (uiState.isSendingTest) { + stringResource(Res.string.settings_notifications_sending_test) + } else { + stringResource(Res.string.settings_notifications_send_test) + }, + ) } uiState.statusMessage?.let { message -> @@ -129,11 +149,11 @@ private fun NotificationTestCard( if (!uiState.permissionGranted) { Text( - text = "System notifications are disabled for Nuvio. Enable them to receive alerts and test notifications.", + text = stringResource(Res.string.settings_notifications_permission_disabled), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.error, ) } } } -} \ No newline at end of file +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt index 590338df..d3ba2d92 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt @@ -58,6 +58,9 @@ import com.nuvio.app.features.plugins.PluginRepository import com.nuvio.app.features.streams.StreamAutoPlayMode import com.nuvio.app.features.streams.StreamAutoPlaySource import com.nuvio.app.isIos +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource internal fun LazyListScope.playbackSettingsContent( isTablet: Boolean, @@ -144,21 +147,21 @@ private fun PlaybackSettingsSection( verticalArrangement = Arrangement.spacedBy(sectionSpacing), ) { SettingsSection( - title = "PLAYER", + title = stringResource(Res.string.settings_playback_section_player), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Show Loading Overlay", - description = "Show the opening loading overlay while a stream starts playing.", + title = stringResource(Res.string.settings_playback_show_loading_overlay), + description = stringResource(Res.string.settings_playback_show_loading_overlay_description), checked = showLoadingOverlay, isTablet = isTablet, onCheckedChange = PlayerSettingsRepository::setShowLoadingOverlay, ) SettingsGroupDivider(isTablet = isTablet) SettingsSwitchRow( - title = "Hold To Speed", - description = "Long-press anywhere on the player surface to temporarily boost playback speed.", + title = stringResource(Res.string.settings_playback_hold_to_speed), + description = stringResource(Res.string.settings_playback_hold_to_speed_description), checked = holdToSpeedEnabled, isTablet = isTablet, onCheckedChange = PlayerSettingsRepository::setHoldToSpeedEnabled, @@ -166,7 +169,7 @@ private fun PlaybackSettingsSection( if (holdToSpeedEnabled) { SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Hold Speed", + title = stringResource(Res.string.settings_playback_hold_speed), description = formatPlaybackSpeedLabel(holdToSpeedValue), isTablet = isTablet, onClick = { showHoldToSpeedValueDialog = true }, @@ -176,15 +179,15 @@ private fun PlaybackSettingsSection( } SettingsSection( - title = "SUBTITLE AND AUDIO", + title = stringResource(Res.string.settings_playback_section_subtitle_audio), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsNavigationRow( - title = "Preferred Audio Language", + title = stringResource(Res.string.settings_playback_preferred_audio_language), description = when (preferredAudioLanguage) { - AudioLanguageOption.DEFAULT -> "Default" - AudioLanguageOption.DEVICE -> "Device Language" + AudioLanguageOption.DEFAULT -> stringResource(Res.string.settings_playback_option_default) + AudioLanguageOption.DEVICE -> stringResource(Res.string.settings_playback_option_device_language) else -> languageLabelForCode(preferredAudioLanguage) }, isTablet = isTablet, @@ -192,18 +195,18 @@ private fun PlaybackSettingsSection( ) SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Secondary Audio Language", + title = stringResource(Res.string.settings_playback_secondary_audio_language), description = languageLabelForCode(secondaryPreferredAudioLanguage), isTablet = isTablet, onClick = { showSecondaryAudioDialog = true }, ) SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Preferred Subtitle Language", + title = stringResource(Res.string.settings_playback_preferred_subtitle_language), description = when (preferredSubtitleLanguage) { - SubtitleLanguageOption.NONE -> "None" - SubtitleLanguageOption.DEVICE -> "Device Language" - SubtitleLanguageOption.FORCED -> "Forced" + SubtitleLanguageOption.NONE -> stringResource(Res.string.settings_playback_option_none) + SubtitleLanguageOption.DEVICE -> stringResource(Res.string.settings_playback_option_device_language) + SubtitleLanguageOption.FORCED -> stringResource(Res.string.settings_playback_option_forced) else -> languageLabelForCode(preferredSubtitleLanguage) }, isTablet = isTablet, @@ -211,7 +214,7 @@ private fun PlaybackSettingsSection( ) SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Secondary Subtitle Language", + title = stringResource(Res.string.settings_playback_secondary_subtitle_language), description = languageLabelForCode(secondaryPreferredSubtitleLanguage), isTablet = isTablet, onClick = { showSecondarySubtitleDialog = true }, @@ -220,13 +223,13 @@ private fun PlaybackSettingsSection( } SettingsSection( - title = "STREAM SELECTION", + title = stringResource(Res.string.settings_playback_section_stream_selection), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Reuse Last Link", - description = "Auto-play your last working stream for this same movie/episode when cache is still valid.", + title = stringResource(Res.string.settings_playback_reuse_last_link), + description = stringResource(Res.string.settings_playback_reuse_last_link_description), checked = streamReuseLastLinkEnabled, isTablet = isTablet, onCheckedChange = PlayerSettingsRepository::setStreamReuseLastLinkEnabled, @@ -234,7 +237,7 @@ private fun PlaybackSettingsSection( if (streamReuseLastLinkEnabled) { SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Last Link Cache Duration", + title = stringResource(Res.string.settings_playback_last_link_cache_duration), description = formatReuseCacheDuration(streamReuseLastLinkCacheHours), isTablet = isTablet, onClick = { showReuseCacheDurationDialog = true }, @@ -244,26 +247,23 @@ private fun PlaybackSettingsSection( } SettingsSection( - title = "STREAM AUTO-PLAY", + title = stringResource(Res.string.settings_playback_section_stream_auto_play), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsNavigationRow( - title = "Stream Selection Mode", - description = when (autoPlayPlayerSettings.streamAutoPlayMode) { - StreamAutoPlayMode.MANUAL -> "Manual" - StreamAutoPlayMode.FIRST_STREAM -> "First Available Stream" - StreamAutoPlayMode.REGEX_MATCH -> "Regex Match" - }, + title = stringResource(Res.string.settings_playback_stream_selection_mode), + description = stringResource(autoPlayPlayerSettings.streamAutoPlayMode.labelRes), isTablet = isTablet, onClick = { showAutoPlayModeDialog = true }, ) if (autoPlayPlayerSettings.streamAutoPlayMode != StreamAutoPlayMode.MANUAL) { if (autoPlayPlayerSettings.streamAutoPlayMode == StreamAutoPlayMode.REGEX_MATCH) { SettingsGroupDivider(isTablet = isTablet) + val notSetLabel = stringResource(Res.string.settings_playback_not_set) SettingsNavigationRow( - title = "Regex Pattern", - description = autoPlayPlayerSettings.streamAutoPlayRegex.ifBlank { "Not set" }, + title = stringResource(Res.string.settings_playback_regex_pattern), + description = autoPlayPlayerSettings.streamAutoPlayRegex.ifBlank { notSetLabel }, isTablet = isTablet, onClick = { showAutoPlayRegexDialog = true }, ) @@ -271,9 +271,9 @@ private fun PlaybackSettingsSection( SettingsGroupDivider(isTablet = isTablet) val timeoutSec = autoPlayPlayerSettings.streamAutoPlayTimeoutSeconds val timeoutLabel = when (timeoutSec) { - 0 -> "Instant" - 11 -> "Unlimited" - else -> "${timeoutSec}s" + 0 -> stringResource(Res.string.settings_playback_timeout_instant) + 11 -> stringResource(Res.string.settings_playback_timeout_unlimited) + else -> stringResource(Res.string.settings_playback_timeout_seconds, timeoutSec) } Column( modifier = Modifier @@ -287,12 +287,12 @@ private fun PlaybackSettingsSection( ) { Column(modifier = Modifier.weight(1f)) { Text( - text = "Stream Timeout", + text = stringResource(Res.string.settings_playback_stream_timeout), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, ) Text( - text = "How long to wait for streams before auto-selecting.", + text = stringResource(Res.string.settings_playback_stream_timeout_description), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -330,24 +330,23 @@ private fun PlaybackSettingsSection( } SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Source Scope", - description = when (autoPlayPlayerSettings.streamAutoPlaySource) { - StreamAutoPlaySource.ALL_SOURCES -> if (pluginsEnabled) "All Sources" else "All Addons" - StreamAutoPlaySource.INSTALLED_ADDONS_ONLY -> "Installed Addons Only" - StreamAutoPlaySource.ENABLED_PLUGINS_ONLY -> "Enabled Plugins Only" - }, + title = stringResource(Res.string.settings_playback_source_scope), + description = stringResource(autoPlayPlayerSettings.streamAutoPlaySource.labelRes(pluginsEnabled)), isTablet = isTablet, onClick = { showAutoPlaySourceDialog = true }, ) if (autoPlayPlayerSettings.streamAutoPlaySource != StreamAutoPlaySource.ENABLED_PLUGINS_ONLY) { SettingsGroupDivider(isTablet = isTablet) val addonSubtitle = if (autoPlayPlayerSettings.streamAutoPlaySelectedAddons.isEmpty()) { - "All Addons" + stringResource(Res.string.settings_playback_all_addons) } else { - "${autoPlayPlayerSettings.streamAutoPlaySelectedAddons.size} selected" + stringResource( + Res.string.settings_playback_selected_count, + autoPlayPlayerSettings.streamAutoPlaySelectedAddons.size, + ) } SettingsNavigationRow( - title = "Allowed Addons", + title = stringResource(Res.string.settings_playback_allowed_addons), description = addonSubtitle, isTablet = isTablet, onClick = { showAutoPlayAddonSelectionDialog = true }, @@ -356,12 +355,15 @@ private fun PlaybackSettingsSection( if (pluginsEnabled && autoPlayPlayerSettings.streamAutoPlaySource != StreamAutoPlaySource.INSTALLED_ADDONS_ONLY) { SettingsGroupDivider(isTablet = isTablet) val pluginSubtitle = if (autoPlayPlayerSettings.streamAutoPlaySelectedPlugins.isEmpty()) { - "All Plugins" + stringResource(Res.string.settings_playback_all_plugins) } else { - "${autoPlayPlayerSettings.streamAutoPlaySelectedPlugins.size} selected" + stringResource( + Res.string.settings_playback_selected_count, + autoPlayPlayerSettings.streamAutoPlaySelectedPlugins.size, + ) } SettingsNavigationRow( - title = "Allowed Plugins", + title = stringResource(Res.string.settings_playback_allowed_plugins), description = pluginSubtitle, isTablet = isTablet, onClick = { showAutoPlayPluginSelectionDialog = true }, @@ -373,33 +375,28 @@ private fun PlaybackSettingsSection( if (!isIos) { SettingsSection( - title = "DECODER", + title = stringResource(Res.string.settings_playback_section_decoder), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsNavigationRow( - title = "Decoder Priority", - description = when (decoderPriority) { - 0 -> "Device Only" - 1 -> "Prefer Device" - 2 -> "Prefer App (FFmpeg)" - else -> "Prefer Device" - }, + title = stringResource(Res.string.settings_playback_decoder_priority), + description = decoderPriorityLabel(decoderPriority), isTablet = isTablet, onClick = { showDecoderPriorityDialog = true }, ) SettingsGroupDivider(isTablet = isTablet) SettingsSwitchRow( - title = "Map DV7 to HEVC", - description = "Dolby Vision Profile 7 to HEVC fallback for unsupported devices.", + title = stringResource(Res.string.settings_playback_map_dv7_to_hevc), + description = stringResource(Res.string.settings_playback_map_dv7_to_hevc_description), checked = mapDV7ToHevc, isTablet = isTablet, onCheckedChange = PlayerSettingsRepository::setMapDV7ToHevc, ) SettingsGroupDivider(isTablet = isTablet) SettingsSwitchRow( - title = "Tunneled Playback", - description = "Enable tunneled playback for lower latency audio/video sync.", + title = stringResource(Res.string.settings_playback_tunneled_playback), + description = stringResource(Res.string.settings_playback_tunneled_playback_description), checked = tunnelingEnabled, isTablet = isTablet, onCheckedChange = PlayerSettingsRepository::setTunnelingEnabled, @@ -410,13 +407,13 @@ private fun PlaybackSettingsSection( if (!isIos) { SettingsSection( - title = "SUBTITLE RENDERING", + title = stringResource(Res.string.settings_playback_section_subtitle_rendering), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Enable libass", - description = "Use libass for ASS/SSA subtitle rendering instead of the default renderer.", + title = stringResource(Res.string.settings_playback_enable_libass), + description = stringResource(Res.string.settings_playback_enable_libass_description), checked = useLibass, isTablet = isTablet, onCheckedChange = PlayerSettingsRepository::setUseLibass, @@ -424,15 +421,8 @@ private fun PlaybackSettingsSection( if (useLibass) { SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Render Type", - description = when (libassRenderType) { - "OVERLAY_OPEN_GL" -> "Overlay OpenGL" - "OVERLAY_CANVAS" -> "Overlay Canvas" - "EFFECTS_OPEN_GL" -> "Effects OpenGL" - "EFFECTS_CANVAS" -> "Effects Canvas" - "CUES" -> "Standard (Cues)" - else -> "Standard (Cues)" - }, + title = stringResource(Res.string.settings_playback_render_type), + description = libassRenderTypeLabel(libassRenderType), isTablet = isTablet, onClick = { showLibassRenderTypeDialog = true }, ) @@ -442,21 +432,21 @@ private fun PlaybackSettingsSection( } SettingsSection( - title = "SKIP SEGMENTS", + title = stringResource(Res.string.settings_playback_section_skip_segments), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Skip Intro/Outro/Recap", - description = "Show skip button during detected intro, outro, and recap segments.", + title = stringResource(Res.string.settings_playback_skip_intro_outro_recap), + description = stringResource(Res.string.settings_playback_skip_intro_outro_recap_description), checked = autoPlayPlayerSettings.skipIntroEnabled, isTablet = isTablet, onCheckedChange = PlayerSettingsRepository::setSkipIntroEnabled, ) SettingsGroupDivider(isTablet = isTablet) SettingsSwitchRow( - title = "Anime Skip", - description = "Also search AnimeSkip for skip timestamps (requires client ID).", + title = stringResource(Res.string.settings_playback_anime_skip), + description = stringResource(Res.string.settings_playback_anime_skip_description), checked = autoPlayPlayerSettings.animeSkipEnabled, isTablet = isTablet, onCheckedChange = PlayerSettingsRepository::setAnimeSkipEnabled, @@ -464,9 +454,10 @@ private fun PlaybackSettingsSection( if (autoPlayPlayerSettings.animeSkipEnabled) { SettingsGroupDivider(isTablet = isTablet) var showAnimeSkipClientIdDialog by remember { mutableStateOf(false) } + val notSetLabel = stringResource(Res.string.settings_playback_not_set) SettingsNavigationRow( - title = "AnimeSkip Client ID", - description = autoPlayPlayerSettings.animeSkipClientId.ifBlank { "Not set" }, + title = stringResource(Res.string.settings_playback_anime_skip_client_id), + description = autoPlayPlayerSettings.animeSkipClientId.ifBlank { notSetLabel }, isTablet = isTablet, onClick = { showAnimeSkipClientIdDialog = true }, ) @@ -485,21 +476,21 @@ private fun PlaybackSettingsSection( } SettingsSection( - title = "NEXT EPISODE", + title = stringResource(Res.string.settings_playback_section_next_episode), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Auto-Play Next Episode", - description = "Automatically find and play the next episode when the threshold is reached.", + title = stringResource(Res.string.settings_playback_auto_play_next_episode), + description = stringResource(Res.string.settings_playback_auto_play_next_episode_description), checked = autoPlayPlayerSettings.streamAutoPlayNextEpisodeEnabled, isTablet = isTablet, onCheckedChange = PlayerSettingsRepository::setStreamAutoPlayNextEpisodeEnabled, ) SettingsGroupDivider(isTablet = isTablet) SettingsSwitchRow( - title = "Prefer Binge Group", - description = "When auto-playing, prefer a stream from the same binge group as the current one.", + title = stringResource(Res.string.settings_playback_prefer_binge_group), + description = stringResource(Res.string.settings_playback_prefer_binge_group_description), checked = autoPlayPlayerSettings.streamAutoPlayPreferBingeGroup, isTablet = isTablet, onCheckedChange = PlayerSettingsRepository::setStreamAutoPlayPreferBingeGroup, @@ -507,11 +498,8 @@ private fun PlaybackSettingsSection( SettingsGroupDivider(isTablet = isTablet) var showThresholdModeDialog by remember { mutableStateOf(false) } SettingsNavigationRow( - title = "Threshold Mode", - description = when (autoPlayPlayerSettings.nextEpisodeThresholdMode) { - com.nuvio.app.features.player.skip.NextEpisodeThresholdMode.PERCENTAGE -> "Percentage" - com.nuvio.app.features.player.skip.NextEpisodeThresholdMode.MINUTES_BEFORE_END -> "Minutes Before End" - }, + title = stringResource(Res.string.settings_playback_threshold_mode), + description = stringResource(autoPlayPlayerSettings.nextEpisodeThresholdMode.labelRes), isTablet = isTablet, onClick = { showThresholdModeDialog = true }, ) @@ -541,18 +529,21 @@ private fun PlaybackSettingsSection( ) { Column(modifier = Modifier.weight(1f)) { Text( - text = "Threshold Percentage", + text = stringResource(Res.string.settings_playback_threshold_percentage), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, ) Text( - text = "Show next episode card when playback reaches this percentage.", + text = stringResource(Res.string.settings_playback_threshold_percentage_description), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) } Text( - text = "${thresholdPercent.toInt()}%", + text = stringResource( + Res.string.settings_playback_threshold_percentage_value, + thresholdPercent.toInt(), + ), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.primary, fontWeight = FontWeight.SemiBold, @@ -597,18 +588,21 @@ private fun PlaybackSettingsSection( ) { Column(modifier = Modifier.weight(1f)) { Text( - text = "Minutes Before End", + text = stringResource(Res.string.settings_playback_minutes_before_end), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, ) Text( - text = "Show next episode card this many minutes before the end.", + text = stringResource(Res.string.settings_playback_minutes_before_end_description), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) } Text( - text = "${thresholdMinutes.toInt()} min", + text = stringResource( + Res.string.settings_playback_minutes_value, + thresholdMinutes.toInt(), + ), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.primary, fontWeight = FontWeight.SemiBold, @@ -646,12 +640,12 @@ private fun PlaybackSettingsSection( if (showPreferredAudioDialog) { LanguageSelectionDialog( - title = "Preferred Audio Language", + title = stringResource(Res.string.settings_playback_preferred_audio_language), options = listOf( - LanguageSelectionOption(AudioLanguageOption.DEFAULT, "Default"), - LanguageSelectionOption(AudioLanguageOption.DEVICE, "Device Language"), + LanguageSelectionOption(AudioLanguageOption.DEFAULT, stringResource(Res.string.settings_playback_option_default)), + LanguageSelectionOption(AudioLanguageOption.DEVICE, stringResource(Res.string.settings_playback_option_device_language)), ) + AvailableLanguageOptions.map { option -> - LanguageSelectionOption(option.code, option.label) + LanguageSelectionOption(option.code, stringResource(option.labelRes)) }, selectedValue = preferredAudioLanguage, onSelect = { value -> @@ -664,11 +658,11 @@ private fun PlaybackSettingsSection( if (showSecondaryAudioDialog) { LanguageSelectionDialog( - title = "Secondary Audio Language", + title = stringResource(Res.string.settings_playback_secondary_audio_language), options = listOf( - LanguageSelectionOption(null, "None"), + LanguageSelectionOption(null, stringResource(Res.string.settings_playback_option_none)), ) + AvailableLanguageOptions.map { option -> - LanguageSelectionOption(option.code, option.label) + LanguageSelectionOption(option.code, stringResource(option.labelRes)) }, selectedValue = secondaryPreferredAudioLanguage, onSelect = { value -> @@ -681,13 +675,13 @@ private fun PlaybackSettingsSection( if (showPreferredSubtitleDialog) { LanguageSelectionDialog( - title = "Preferred Subtitle Language", + title = stringResource(Res.string.settings_playback_preferred_subtitle_language), options = listOf( - LanguageSelectionOption(SubtitleLanguageOption.NONE, "None"), - LanguageSelectionOption(SubtitleLanguageOption.DEVICE, "Device Language"), - LanguageSelectionOption(SubtitleLanguageOption.FORCED, "Forced"), + LanguageSelectionOption(SubtitleLanguageOption.NONE, stringResource(Res.string.settings_playback_option_none)), + LanguageSelectionOption(SubtitleLanguageOption.DEVICE, stringResource(Res.string.settings_playback_option_device_language)), + LanguageSelectionOption(SubtitleLanguageOption.FORCED, stringResource(Res.string.settings_playback_option_forced)), ) + AvailableLanguageOptions.map { option -> - LanguageSelectionOption(option.code, option.label) + LanguageSelectionOption(option.code, stringResource(option.labelRes)) }, selectedValue = preferredSubtitleLanguage, onSelect = { value -> @@ -700,12 +694,12 @@ private fun PlaybackSettingsSection( if (showSecondarySubtitleDialog) { LanguageSelectionDialog( - title = "Secondary Subtitle Language", + title = stringResource(Res.string.settings_playback_secondary_subtitle_language), options = listOf( - LanguageSelectionOption(null, "None"), - LanguageSelectionOption(SubtitleLanguageOption.FORCED, "Forced"), + LanguageSelectionOption(null, stringResource(Res.string.settings_playback_option_none)), + LanguageSelectionOption(SubtitleLanguageOption.FORCED, stringResource(Res.string.settings_playback_option_forced)), ) + AvailableLanguageOptions.map { option -> - LanguageSelectionOption(option.code, option.label) + LanguageSelectionOption(option.code, stringResource(option.labelRes)) }, selectedValue = secondaryPreferredSubtitleLanguage, onSelect = { value -> @@ -791,8 +785,8 @@ private fun PlaybackSettingsSection( .distinct() .sorted() StreamAutoPlayProviderSelectionDialog( - title = "Allowed Addons", - allLabel = "All Addons", + title = stringResource(Res.string.settings_playback_allowed_addons), + allLabel = stringResource(Res.string.settings_playback_all_addons), items = addonNames, selectedItems = autoPlayPlayerSettings.streamAutoPlaySelectedAddons, onSelectionSaved = { @@ -810,8 +804,8 @@ private fun PlaybackSettingsSection( .distinct() .sorted() StreamAutoPlayProviderSelectionDialog( - title = "Allowed Plugins", - allLabel = "All Plugins", + title = stringResource(Res.string.settings_playback_allowed_plugins), + allLabel = stringResource(Res.string.settings_playback_all_plugins), items = pluginNames, selectedItems = autoPlayPlayerSettings.streamAutoPlaySelectedPlugins, onSelectionSaved = { @@ -834,13 +828,16 @@ private fun PlaybackSettingsSection( } } +@Composable private fun formatReuseCacheDuration(hours: Int): String = when { - hours < 24 -> "$hours hour${if (hours != 1) "s" else ""}" + hours < 24 && hours == 1 -> stringResource(Res.string.settings_playback_duration_hour_one, hours) + hours < 24 -> stringResource(Res.string.settings_playback_duration_hours, hours) hours % 24 == 0 -> { val days = hours / 24 - "$days day${if (days != 1) "s" else ""}" + if (days == 1) stringResource(Res.string.settings_playback_duration_day_one, days) + else stringResource(Res.string.settings_playback_duration_days, days) } - else -> "$hours hours" + else -> stringResource(Res.string.settings_playback_duration_hours, hours) } private data class LanguageSelectionOption( @@ -929,7 +926,7 @@ private fun LanguageSelectionDialog( Spacer(modifier = Modifier.height(2.dp)) Text( - text = "Tap outside to close", + text = stringResource(Res.string.settings_playback_dialog_close), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -960,7 +957,7 @@ private fun ReuseCacheDurationDialog( verticalArrangement = Arrangement.spacedBy(12.dp), ) { Text( - text = "Last Link Cache Duration", + text = stringResource(Res.string.settings_playback_last_link_cache_duration), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, @@ -1016,7 +1013,7 @@ private fun ReuseCacheDurationDialog( Spacer(modifier = Modifier.height(2.dp)) Text( - text = "Tap outside to close", + text = stringResource(Res.string.settings_playback_dialog_close), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1033,9 +1030,9 @@ private fun DecoderPriorityDialog( onDismiss: () -> Unit, ) { val options = listOf( - 0 to "Device Only", - 1 to "Prefer Device", - 2 to "Prefer App (FFmpeg)", + 0 to Res.string.settings_playback_decoder_device_only, + 1 to Res.string.settings_playback_decoder_prefer_device, + 2 to Res.string.settings_playback_decoder_prefer_app, ) BasicAlertDialog( @@ -1051,7 +1048,7 @@ private fun DecoderPriorityDialog( verticalArrangement = Arrangement.spacedBy(12.dp), ) { Text( - text = "Decoder Priority", + text = stringResource(Res.string.settings_playback_decoder_priority), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, @@ -1061,7 +1058,7 @@ private fun DecoderPriorityDialog( modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(8.dp), ) { - options.forEach { (priority, label) -> + options.forEach { (priority, labelRes) -> val isSelected = priority == selectedPriority val containerColor = if (isSelected) { MaterialTheme.colorScheme.primary.copy(alpha = 0.14f) @@ -1083,7 +1080,7 @@ private fun DecoderPriorityDialog( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = label, + text = stringResource(labelRes), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, modifier = Modifier.weight(1f), @@ -1107,7 +1104,7 @@ private fun DecoderPriorityDialog( Spacer(modifier = Modifier.height(2.dp)) Text( - text = "Tap outside to close", + text = stringResource(Res.string.settings_playback_dialog_close), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1138,7 +1135,7 @@ private fun HoldToSpeedValueDialog( verticalArrangement = Arrangement.spacedBy(12.dp), ) { Text( - text = "Hold Speed", + text = stringResource(Res.string.settings_playback_hold_speed), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, @@ -1194,7 +1191,7 @@ private fun HoldToSpeedValueDialog( Spacer(modifier = Modifier.height(2.dp)) Text( - text = "Tap outside to close", + text = stringResource(Res.string.settings_playback_dialog_close), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1211,11 +1208,11 @@ private fun LibassRenderTypeDialog( onDismiss: () -> Unit, ) { val options = listOf( - "OVERLAY_OPEN_GL" to "Overlay OpenGL", - "OVERLAY_CANVAS" to "Overlay Canvas", - "EFFECTS_OPEN_GL" to "Effects OpenGL", - "EFFECTS_CANVAS" to "Effects Canvas", - "CUES" to "Standard (Cues)", + "OVERLAY_OPEN_GL" to Res.string.settings_playback_render_type_overlay_opengl, + "OVERLAY_CANVAS" to Res.string.settings_playback_render_type_overlay_canvas, + "EFFECTS_OPEN_GL" to Res.string.settings_playback_render_type_effects_opengl, + "EFFECTS_CANVAS" to Res.string.settings_playback_render_type_effects_canvas, + "CUES" to Res.string.settings_playback_render_type_cues, ) BasicAlertDialog( @@ -1231,7 +1228,7 @@ private fun LibassRenderTypeDialog( verticalArrangement = Arrangement.spacedBy(12.dp), ) { Text( - text = "Render Type", + text = stringResource(Res.string.settings_playback_render_type), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, @@ -1241,7 +1238,7 @@ private fun LibassRenderTypeDialog( modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(8.dp), ) { - options.forEach { (value, label) -> + options.forEach { (value, labelRes) -> val isSelected = value == selectedRenderType val containerColor = if (isSelected) { MaterialTheme.colorScheme.primary.copy(alpha = 0.14f) @@ -1263,7 +1260,7 @@ private fun LibassRenderTypeDialog( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = label, + text = stringResource(labelRes), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, modifier = Modifier.weight(1f), @@ -1287,7 +1284,7 @@ private fun LibassRenderTypeDialog( Spacer(modifier = Modifier.height(2.dp)) Text( - text = "Tap outside to close", + text = stringResource(Res.string.settings_playback_dialog_close), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1304,9 +1301,21 @@ private fun StreamAutoPlayModeDialog( onDismiss: () -> Unit, ) { val options = listOf( - Triple(StreamAutoPlayMode.MANUAL, "Manual", "Select streams manually each time."), - Triple(StreamAutoPlayMode.FIRST_STREAM, "First Available Stream", "Automatically play the first stream found."), - Triple(StreamAutoPlayMode.REGEX_MATCH, "Regex Match", "Auto-select a stream matching a regex pattern."), + Triple( + StreamAutoPlayMode.MANUAL, + Res.string.settings_playback_stream_selection_mode_manual, + Res.string.settings_playback_stream_selection_mode_manual_description, + ), + Triple( + StreamAutoPlayMode.FIRST_STREAM, + Res.string.settings_playback_stream_selection_mode_first_stream, + Res.string.settings_playback_stream_selection_mode_first_stream_description, + ), + Triple( + StreamAutoPlayMode.REGEX_MATCH, + Res.string.settings_playback_stream_selection_mode_regex, + Res.string.settings_playback_stream_selection_mode_regex_description, + ), ) BasicAlertDialog( @@ -1322,7 +1331,7 @@ private fun StreamAutoPlayModeDialog( verticalArrangement = Arrangement.spacedBy(12.dp), ) { Text( - text = "Stream Selection Mode", + text = stringResource(Res.string.settings_playback_stream_selection_mode), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, @@ -1332,7 +1341,7 @@ private fun StreamAutoPlayModeDialog( modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(8.dp), ) { - options.forEach { (mode, title, description) -> + options.forEach { (mode, titleRes, descriptionRes) -> val isSelected = mode == selectedMode val containerColor = if (isSelected) { MaterialTheme.colorScheme.primary.copy(alpha = 0.14f) @@ -1355,13 +1364,13 @@ private fun StreamAutoPlayModeDialog( ) { Column(modifier = Modifier.weight(1f)) { Text( - text = title, + text = stringResource(titleRes), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, ) Spacer(modifier = Modifier.height(2.dp)) Text( - text = description, + text = stringResource(descriptionRes), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1385,7 +1394,7 @@ private fun StreamAutoPlayModeDialog( Spacer(modifier = Modifier.height(2.dp)) Text( - text = "Tap outside to close", + text = stringResource(Res.string.settings_playback_dialog_close), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1406,27 +1415,31 @@ private fun StreamAutoPlaySourceDialog( add( Triple( StreamAutoPlaySource.ALL_SOURCES, - if (pluginsEnabled) "All Sources" else "All Addons", if (pluginsEnabled) { - "Consider streams from both addons and plugins." + Res.string.settings_playback_source_scope_all_sources } else { - "Consider streams from all installed addons." + Res.string.settings_playback_source_scope_all_addons + }, + if (pluginsEnabled) { + Res.string.settings_playback_source_scope_all_sources_description + } else { + Res.string.settings_playback_source_scope_all_addons_description }, ), ) add( Triple( StreamAutoPlaySource.INSTALLED_ADDONS_ONLY, - "Installed Addons Only", - "Only consider streams from installed addons.", + Res.string.settings_playback_source_scope_installed_addons_only, + Res.string.settings_playback_source_scope_installed_addons_only_description, ), ) if (pluginsEnabled) { add( Triple( StreamAutoPlaySource.ENABLED_PLUGINS_ONLY, - "Enabled Plugins Only", - "Only consider streams from enabled plugins.", + Res.string.settings_playback_source_scope_enabled_plugins_only, + Res.string.settings_playback_source_scope_enabled_plugins_only_description, ), ) } @@ -1445,7 +1458,7 @@ private fun StreamAutoPlaySourceDialog( verticalArrangement = Arrangement.spacedBy(12.dp), ) { Text( - text = "Source Scope", + text = stringResource(Res.string.settings_playback_source_scope), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, @@ -1455,7 +1468,7 @@ private fun StreamAutoPlaySourceDialog( modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(8.dp), ) { - options.forEach { (source, title, description) -> + options.forEach { (source, titleRes, descriptionRes) -> val isSelected = source == selectedSource val containerColor = if (isSelected) { MaterialTheme.colorScheme.primary.copy(alpha = 0.14f) @@ -1478,13 +1491,13 @@ private fun StreamAutoPlaySourceDialog( ) { Column(modifier = Modifier.weight(1f)) { Text( - text = title, + text = stringResource(titleRes), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, ) Spacer(modifier = Modifier.height(2.dp)) Text( - text = description, + text = stringResource(descriptionRes), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1508,7 +1521,7 @@ private fun StreamAutoPlaySourceDialog( Spacer(modifier = Modifier.height(2.dp)) Text( - text = "Tap outside to close", + text = stringResource(Res.string.settings_playback_dialog_close), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1589,7 +1602,7 @@ private fun StreamAutoPlayProviderSelectionDialog( if (items.isEmpty()) { Text( - text = "No items available", + text = stringResource(Res.string.settings_playback_no_items_available), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1648,7 +1661,7 @@ private fun StreamAutoPlayProviderSelectionDialog( Spacer(modifier = Modifier.height(2.dp)) Text( - text = "Tap outside to save & close", + text = stringResource(Res.string.settings_playback_dialog_save_close), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1667,23 +1680,22 @@ private fun StreamAutoPlayRegexDialog( var regex by remember(initialRegex) { mutableStateOf(initialRegex) } var regexError by remember { mutableStateOf(null) } - val presets = remember { - listOf( - "Any 1080p+" to "(2160p|4k|1080p)", - "4K / Remux" to "(2160p|4k|remux)", - "1080p Standard" to "(1080p|full\\s*hd)", - "720p / Smaller" to "(720p|webrip|web-dl)", - "WEB Sources" to "(web[-\\s]?dl|webrip)", - "BluRay Quality" to "(bluray|b[dr]rip|remux)", - "HEVC / x265" to "(hevc|x265|h\\.265)", - "AVC / x264" to "(x264|h\\.264|avc)", - "HDR / Dolby Vision" to "(hdr|hdr10\\+?|dv|dolby\\s*vision)", - "Dolby Atmos / DTS" to "(atmos|truehd|dts[-\\s]?hd|dtsx?)", - "English" to "(\\beng\\b|english)", - "No CAM/TS" to "^(?!.*\\b(cam|hdcam|ts|telesync)\\b).*$", - "No REMUX/HDR" to "(?is)^(?!.*\\b(hdr|hdr10|dv|dolby|vision|hevc|remux|2160p)\\b).+$", - ) - } + val invalidRegexPattern = stringResource(Res.string.settings_playback_invalid_regex_pattern) + val presets = listOf( + stringResource(Res.string.settings_playback_regex_preset_any_1080p) to "(2160p|4k|1080p)", + stringResource(Res.string.settings_playback_regex_preset_quality_4k_remux) to "(2160p|4k|remux)", + stringResource(Res.string.settings_playback_regex_preset_quality_1080p_standard) to "(1080p|full\\s*hd)", + stringResource(Res.string.settings_playback_regex_preset_quality_720p_smaller) to "(720p|webrip|web-dl)", + stringResource(Res.string.settings_playback_regex_preset_web_sources) to "(web[-\\s]?dl|webrip)", + stringResource(Res.string.settings_playback_regex_preset_bluray_quality) to "(bluray|b[dr]rip|remux)", + stringResource(Res.string.settings_playback_regex_preset_hevc_x265) to "(hevc|x265|h\\.265)", + stringResource(Res.string.settings_playback_regex_preset_avc_x264) to "(x264|h\\.264|avc)", + stringResource(Res.string.settings_playback_regex_preset_hdr_dolby_vision) to "(hdr|hdr10\\+?|dv|dolby\\s*vision)", + stringResource(Res.string.settings_playback_regex_preset_dolby_atmos_dts) to "(atmos|truehd|dts[-\\s]?hd|dtsx?)", + stringResource(Res.string.settings_playback_regex_preset_english) to "(\\beng\\b|english)", + stringResource(Res.string.settings_playback_regex_preset_no_cam_ts) to "^(?!.*\\b(cam|hdcam|ts|telesync)\\b).*$", + stringResource(Res.string.settings_playback_regex_preset_no_remux_hdr) to "(?is)^(?!.*\\b(hdr|hdr10|dv|dolby|vision|hevc|remux|2160p)\\b).+$", + ) BasicAlertDialog( onDismissRequest = onDismiss, @@ -1700,20 +1712,20 @@ private fun StreamAutoPlayRegexDialog( verticalArrangement = Arrangement.spacedBy(12.dp), ) { Text( - text = "Regex Pattern", + text = stringResource(Res.string.settings_playback_regex_pattern), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, ) Text( - text = "Matches against stream name, label, description, addon, and URL.", + text = stringResource(Res.string.settings_playback_regex_matches_against), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) Text( - text = "Presets", + text = stringResource(Res.string.settings_playback_presets), style = MaterialTheme.typography.titleSmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1772,7 +1784,7 @@ private fun StreamAutoPlayRegexDialog( decorationBox = { innerTextField -> if (regex.isBlank()) { Text( - text = "4K|2160p|Remux", + text = stringResource(Res.string.settings_playback_regex_placeholder), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.5f), ) @@ -1796,26 +1808,26 @@ private fun StreamAutoPlayRegexDialog( verticalAlignment = Alignment.CenterVertically, ) { TextButton(onClick = onDismiss) { - Text("Cancel") + Text(stringResource(Res.string.action_cancel)) } TextButton(onClick = { regex = "" regexError = null }) { - Text("Clear") + Text(stringResource(Res.string.action_clear)) } TextButton(onClick = { val value = regex.trim() if (value.isNotEmpty()) { val valid = runCatching { Regex(value, RegexOption.IGNORE_CASE) }.isSuccess if (!valid) { - regexError = "Invalid regex pattern" + regexError = invalidRegexPattern return@TextButton } } onSave(value) }) { - Text("Save") + Text(stringResource(Res.string.action_save)) } } } @@ -1843,13 +1855,13 @@ private fun AnimeSkipClientIdDialog( verticalArrangement = Arrangement.spacedBy(12.dp), ) { Text( - text = "AnimeSkip Client ID", + text = stringResource(Res.string.settings_playback_anime_skip_client_id), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, ) Text( - text = "Enter your AnimeSkip API client ID. Get one at anime-skip.com.", + text = stringResource(Res.string.settings_playback_anime_skip_client_id_description), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1875,8 +1887,8 @@ private fun AnimeSkipClientIdDialog( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End, ) { - TextButton(onClick = onDismiss) { Text("Cancel") } - TextButton(onClick = { onSave(value.trim()) }) { Text("Save") } + TextButton(onClick = onDismiss) { Text(stringResource(Res.string.action_cancel)) } + TextButton(onClick = { onSave(value.trim()) }) { Text(stringResource(Res.string.action_save)) } } } } @@ -1903,7 +1915,7 @@ private fun NextEpisodeThresholdModeDialog( verticalArrangement = Arrangement.spacedBy(12.dp), ) { Text( - text = "Threshold Mode", + text = stringResource(Res.string.settings_playback_threshold_mode), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, @@ -1916,11 +1928,6 @@ private fun NextEpisodeThresholdModeDialog( } else { MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.35f) } - val label = when (mode) { - com.nuvio.app.features.player.skip.NextEpisodeThresholdMode.PERCENTAGE -> "Percentage" - com.nuvio.app.features.player.skip.NextEpisodeThresholdMode.MINUTES_BEFORE_END -> "Minutes Before End" - } - Surface( modifier = Modifier .fillMaxWidth() @@ -1935,7 +1942,7 @@ private fun NextEpisodeThresholdModeDialog( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = label, + text = stringResource(mode.labelRes), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, modifier = Modifier.weight(1f), @@ -1958,7 +1965,7 @@ private fun NextEpisodeThresholdModeDialog( Spacer(modifier = Modifier.height(2.dp)) Text( - text = "Tap outside to close", + text = stringResource(Res.string.settings_playback_dialog_close), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1966,3 +1973,48 @@ private fun NextEpisodeThresholdModeDialog( } } } + +private fun decoderPriorityRes(priority: Int): StringResource = when (priority) { + 0 -> Res.string.settings_playback_decoder_device_only + 1 -> Res.string.settings_playback_decoder_prefer_device + 2 -> Res.string.settings_playback_decoder_prefer_app + else -> Res.string.settings_playback_decoder_prefer_device +} + +@Composable +private fun decoderPriorityLabel(priority: Int): String = stringResource(decoderPriorityRes(priority)) + +private fun StreamAutoPlaySource.labelRes(pluginsEnabled: Boolean): StringResource = when (this) { + StreamAutoPlaySource.ALL_SOURCES -> + if (pluginsEnabled) Res.string.settings_playback_source_scope_all_sources + else Res.string.settings_playback_source_scope_all_addons + StreamAutoPlaySource.INSTALLED_ADDONS_ONLY -> Res.string.settings_playback_source_scope_installed_addons_only + StreamAutoPlaySource.ENABLED_PLUGINS_ONLY -> Res.string.settings_playback_source_scope_enabled_plugins_only +} + +private val StreamAutoPlayMode.labelRes: StringResource + get() = when (this) { + StreamAutoPlayMode.MANUAL -> Res.string.settings_playback_stream_selection_mode_manual + StreamAutoPlayMode.FIRST_STREAM -> Res.string.settings_playback_stream_selection_mode_first_stream + StreamAutoPlayMode.REGEX_MATCH -> Res.string.settings_playback_stream_selection_mode_regex + } + +private val com.nuvio.app.features.player.skip.NextEpisodeThresholdMode.labelRes: StringResource + get() = when (this) { + com.nuvio.app.features.player.skip.NextEpisodeThresholdMode.PERCENTAGE -> + Res.string.settings_playback_threshold_mode_percentage + com.nuvio.app.features.player.skip.NextEpisodeThresholdMode.MINUTES_BEFORE_END -> + Res.string.settings_playback_threshold_mode_minutes_before_end + } + +private fun libassRenderTypeRes(renderType: String): StringResource = when (renderType) { + "OVERLAY_OPEN_GL" -> Res.string.settings_playback_render_type_overlay_opengl + "OVERLAY_CANVAS" -> Res.string.settings_playback_render_type_overlay_canvas + "EFFECTS_OPEN_GL" -> Res.string.settings_playback_render_type_effects_opengl + "EFFECTS_CANVAS" -> Res.string.settings_playback_render_type_effects_canvas + "CUES" -> Res.string.settings_playback_render_type_cues + else -> Res.string.settings_playback_render_type_cues +} + +@Composable +private fun libassRenderTypeLabel(renderType: String): String = stringResource(libassRenderTypeRes(renderType)) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PosterCustomizationSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PosterCustomizationSettingsPage.kt index 17fc67d5..f4f494d2 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PosterCustomizationSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PosterCustomizationSettingsPage.kt @@ -33,6 +33,32 @@ import androidx.compose.ui.unit.dp import com.nuvio.app.core.ui.NuvioActionLabel import com.nuvio.app.core.ui.PosterCardStyleRepository import com.nuvio.app.core.ui.PosterCardStyleUiState +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.action_reset +import nuvio.composeapp.generated.resources.settings_poster_card_radius +import nuvio.composeapp.generated.resources.settings_poster_card_style +import nuvio.composeapp.generated.resources.settings_poster_card_width +import nuvio.composeapp.generated.resources.settings_poster_custom +import nuvio.composeapp.generated.resources.settings_poster_description +import nuvio.composeapp.generated.resources.settings_poster_hide_labels +import nuvio.composeapp.generated.resources.settings_poster_landscape_mode +import nuvio.composeapp.generated.resources.settings_poster_live_preview +import nuvio.composeapp.generated.resources.settings_poster_option_with_value +import nuvio.composeapp.generated.resources.settings_poster_preview_corner_radius +import nuvio.composeapp.generated.resources.settings_poster_preview_height +import nuvio.composeapp.generated.resources.settings_poster_preview_width +import nuvio.composeapp.generated.resources.settings_poster_radius_classic +import nuvio.composeapp.generated.resources.settings_poster_radius_pill +import nuvio.composeapp.generated.resources.settings_poster_radius_rounded +import nuvio.composeapp.generated.resources.settings_poster_radius_sharp +import nuvio.composeapp.generated.resources.settings_poster_radius_subtle +import nuvio.composeapp.generated.resources.settings_poster_width_balanced +import nuvio.composeapp.generated.resources.settings_poster_width_comfort +import nuvio.composeapp.generated.resources.settings_poster_width_compact +import nuvio.composeapp.generated.resources.settings_poster_width_dense +import nuvio.composeapp.generated.resources.settings_poster_width_large +import nuvio.composeapp.generated.resources.settings_poster_width_standard +import org.jetbrains.compose.resources.stringResource internal fun LazyListScope.posterCustomizationSettingsContent( isTablet: Boolean, @@ -40,11 +66,11 @@ internal fun LazyListScope.posterCustomizationSettingsContent( ) { item { SettingsSection( - title = "POSTER CARD STYLE", + title = stringResource(Res.string.settings_poster_card_style), isTablet = isTablet, actions = { NuvioActionLabel( - text = "Reset", + text = stringResource(Res.string.action_reset), onClick = PosterCardStyleRepository::resetToDefaults, ) }, @@ -80,19 +106,19 @@ private fun PosterCardStyleControls( onHideLabelsChange: (Boolean) -> Unit, ) { val widthOptions = listOf( - PresetOption("Compact", 104), - PresetOption("Dense", 112), - PresetOption("Standard", 120), - PresetOption("Balanced", 126), - PresetOption("Comfort", 134), - PresetOption("Large", 140), + PresetOption(stringResource(Res.string.settings_poster_width_compact), 104), + PresetOption(stringResource(Res.string.settings_poster_width_dense), 112), + PresetOption(stringResource(Res.string.settings_poster_width_standard), 120), + PresetOption(stringResource(Res.string.settings_poster_width_balanced), 126), + PresetOption(stringResource(Res.string.settings_poster_width_comfort), 134), + PresetOption(stringResource(Res.string.settings_poster_width_large), 140), ) val radiusOptions = listOf( - PresetOption("Sharp", 0), - PresetOption("Subtle", 4), - PresetOption("Classic", 8), - PresetOption("Rounded", 12), - PresetOption("Pill", 16), + PresetOption(stringResource(Res.string.settings_poster_radius_sharp), 0), + PresetOption(stringResource(Res.string.settings_poster_radius_subtle), 4), + PresetOption(stringResource(Res.string.settings_poster_radius_classic), 8), + PresetOption(stringResource(Res.string.settings_poster_radius_rounded), 12), + PresetOption(stringResource(Res.string.settings_poster_radius_pill), 16), ) Column( @@ -102,7 +128,7 @@ private fun PosterCardStyleControls( verticalArrangement = Arrangement.spacedBy(14.dp), ) { Text( - text = "Customize card width and corner radius for shared poster cards across the app.", + text = stringResource(Res.string.settings_poster_description), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -111,13 +137,13 @@ private fun PosterCardStyleControls( cornerRadiusDp = cornerRadiusDp, ) PosterStyleOptionRow( - title = "Card Width", + title = stringResource(Res.string.settings_poster_card_width), selectedValue = widthDp, options = widthOptions, onSelected = onWidthSelected, ) PosterStyleOptionRow( - title = "Card Radius", + title = stringResource(Res.string.settings_poster_card_radius), selectedValue = cornerRadiusDp, options = radiusOptions, onSelected = onCornerRadiusSelected, @@ -127,7 +153,7 @@ private fun PosterCardStyleControls( onCheckedChange = onCatalogLandscapeModeChange, ) PosterToggleRow( - title = "Hide labels", + title = stringResource(Res.string.settings_poster_hide_labels), checked = hideLabelsEnabled, onCheckedChange = onHideLabelsChange, ) @@ -140,7 +166,7 @@ private fun PosterLandscapeModeToggleRow( onCheckedChange: (Boolean) -> Unit, ) { PosterToggleRow( - title = "Landscape mode for shelf posters", + title = stringResource(Res.string.settings_poster_landscape_mode), checked = checked, onCheckedChange = onCheckedChange, ) @@ -205,7 +231,7 @@ private fun PosterCardLivePreview( verticalArrangement = Arrangement.spacedBy(8.dp), ) { Text( - text = "Live Preview", + text = stringResource(Res.string.settings_poster_live_preview), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, @@ -239,17 +265,17 @@ private fun PosterCardLivePreview( verticalArrangement = Arrangement.spacedBy(4.dp), ) { Text( - text = "Width: ${widthDp}dp", + text = stringResource(Res.string.settings_poster_preview_width, widthDp), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurface, ) Text( - text = "Corner radius: ${cornerRadiusDp}dp", + text = stringResource(Res.string.settings_poster_preview_corner_radius, cornerRadiusDp), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurface, ) Text( - text = "Height: ${targetHeightDp}dp", + text = stringResource(Res.string.settings_poster_preview_height, targetHeightDp), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -273,13 +299,14 @@ private fun PosterStyleOptionRow( options: List, onSelected: (Int) -> Unit, ) { - val selectedLabel = options.firstOrNull { it.value == selectedValue }?.label ?: "Custom" + val selectedLabel = options.firstOrNull { it.value == selectedValue }?.label + ?: stringResource(Res.string.settings_poster_custom) Column( verticalArrangement = Arrangement.spacedBy(8.dp), ) { Text( - text = "$title ($selectedLabel)", + text = stringResource(Res.string.settings_poster_option_with_value, title, selectedLabel), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, @@ -307,4 +334,4 @@ private fun PosterStyleOptionRow( private data class PresetOption( val label: String, val value: Int, -) \ No newline at end of file +) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsComponents.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsComponents.kt index e835a4da..c8e2e418 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsComponents.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsComponents.kt @@ -49,6 +49,17 @@ import com.nuvio.app.core.ui.NuvioActionLabel import com.nuvio.app.core.ui.NuvioBackButton import com.nuvio.app.core.ui.NuvioSectionLabel import com.nuvio.app.features.home.HomeCatalogSettingsItem +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.settings_homescreen_collection_with_addon +import nuvio.composeapp.generated.resources.settings_homescreen_display_name +import nuvio.composeapp.generated.resources.settings_homescreen_hero_source +import nuvio.composeapp.generated.resources.settings_homescreen_hidden +import nuvio.composeapp.generated.resources.settings_homescreen_not_in_hero +import nuvio.composeapp.generated.resources.settings_homescreen_pinned +import nuvio.composeapp.generated.resources.settings_homescreen_pinned_to_top +import nuvio.composeapp.generated.resources.settings_homescreen_reorder +import nuvio.composeapp.generated.resources.settings_homescreen_visible +import org.jetbrains.compose.resources.stringResource import sh.calvin.reorderable.ReorderableCollectionItemScope @Composable @@ -377,18 +388,37 @@ internal fun HomescreenCatalogRow( overflow = TextOverflow.Ellipsis, ) Text( - text = if (item.isCollection) "Collection • ${item.addonName}" else item.addonName, + text = if (item.isCollection) { + stringResource(Res.string.settings_homescreen_collection_with_addon, item.addonName) + } else { + item.addonName + }, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) Text( text = buildString { - append(if (item.enabled) "Visible" else "Hidden") + append( + if (item.enabled) { + stringResource(Res.string.settings_homescreen_visible) + } else { + stringResource(Res.string.settings_homescreen_hidden) + }, + ) if (item.isCollection) { - if (item.isPinnedToTop) append(" • Pinned to top") + if (item.isPinnedToTop) { + append(" • ") + append(stringResource(Res.string.settings_homescreen_pinned_to_top)) + } } else { append(" • ") - append(if (item.heroSourceEnabled) "Hero source" else "Not in hero") + append( + if (item.heroSourceEnabled) { + stringResource(Res.string.settings_homescreen_hero_source) + } else { + stringResource(Res.string.settings_homescreen_not_in_hero) + }, + ) } }, style = MaterialTheme.typography.bodySmall, @@ -415,7 +445,7 @@ internal fun HomescreenCatalogRow( ) { Icon( imageVector = Icons.Rounded.Lock, - contentDescription = "Pinned", + contentDescription = stringResource(Res.string.settings_homescreen_pinned), tint = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.5f), ) } @@ -435,7 +465,7 @@ internal fun HomescreenCatalogRow( ) { Icon( imageVector = Icons.Rounded.Menu, - contentDescription = "Reorder", + contentDescription = stringResource(Res.string.settings_homescreen_reorder), tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } @@ -452,7 +482,7 @@ internal fun HomescreenCatalogRow( onValueChange = onTitleChange, modifier = Modifier.fillMaxWidth(), singleLine = true, - label = { Text("Display Name") }, + label = { Text(stringResource(Res.string.settings_homescreen_display_name)) }, placeholder = { Text(item.defaultTitle) }, colors = OutlinedTextFieldDefaults.colors( focusedBorderColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.75f), diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsFullScreenPages.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsFullScreenPages.kt index f23a4fc0..4dbd27d2 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsFullScreenPages.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsFullScreenPages.kt @@ -16,6 +16,14 @@ import com.nuvio.app.features.details.MetaScreenSettingsRepository import com.nuvio.app.features.plugins.PluginRepository import com.nuvio.app.features.home.HomeCatalogSettingsRepository import com.nuvio.app.features.watchprogress.ContinueWatchingPreferencesRepository +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_settings_page_account +import nuvio.composeapp.generated.resources.compose_settings_page_addons +import nuvio.composeapp.generated.resources.compose_settings_page_continue_watching +import nuvio.composeapp.generated.resources.compose_settings_page_homescreen +import nuvio.composeapp.generated.resources.compose_settings_page_meta_screen +import nuvio.composeapp.generated.resources.compose_settings_page_plugins +import org.jetbrains.compose.resources.stringResource @Composable fun HomescreenSettingsScreen( @@ -59,7 +67,7 @@ fun HomescreenSettingsScreen( ) { stickyHeader { NuvioScreenHeader( - title = "Homescreen", + title = stringResource(Res.string.compose_settings_page_homescreen), onBack = onBack, ) } @@ -85,7 +93,7 @@ fun MetaScreenSettingsScreen( ) { stickyHeader { NuvioScreenHeader( - title = "Meta Screen", + title = stringResource(Res.string.compose_settings_page_meta_screen), onBack = onBack, ) } @@ -110,7 +118,7 @@ fun ContinueWatchingSettingsScreen( ) { stickyHeader { NuvioScreenHeader( - title = "Continue Watching", + title = stringResource(Res.string.compose_settings_page_continue_watching), onBack = onBack, ) } @@ -137,7 +145,7 @@ fun AddonsSettingsScreen( ) { stickyHeader { NuvioScreenHeader( - title = "Addons", + title = stringResource(Res.string.compose_settings_page_addons), onBack = onBack, ) } @@ -163,7 +171,7 @@ fun PluginsSettingsScreen( ) { stickyHeader { NuvioScreenHeader( - title = "Plugins", + title = stringResource(Res.string.compose_settings_page_plugins), onBack = onBack, ) } @@ -180,7 +188,7 @@ fun AccountSettingsScreen( ) { stickyHeader { NuvioScreenHeader( - title = "Account", + title = stringResource(Res.string.compose_settings_page_account), onBack = onBack, ) } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsModels.kt index ba432304..e66779fd 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsModels.kt @@ -6,103 +6,125 @@ import androidx.compose.material.icons.rounded.Info import androidx.compose.material.icons.rounded.Notifications import androidx.compose.material.icons.rounded.Settings import androidx.compose.ui.graphics.vector.ImageVector +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_settings_category_about +import nuvio.composeapp.generated.resources.compose_settings_category_general +import nuvio.composeapp.generated.resources.compose_settings_page_account +import nuvio.composeapp.generated.resources.compose_settings_page_addons +import nuvio.composeapp.generated.resources.compose_settings_page_appearance +import nuvio.composeapp.generated.resources.compose_settings_page_content_discovery +import nuvio.composeapp.generated.resources.compose_settings_page_continue_watching +import nuvio.composeapp.generated.resources.compose_settings_page_homescreen +import nuvio.composeapp.generated.resources.compose_settings_page_integrations +import nuvio.composeapp.generated.resources.compose_settings_page_mdblist_ratings +import nuvio.composeapp.generated.resources.compose_settings_page_meta_screen +import nuvio.composeapp.generated.resources.compose_settings_page_notifications +import nuvio.composeapp.generated.resources.compose_settings_page_playback +import nuvio.composeapp.generated.resources.compose_settings_page_plugins +import nuvio.composeapp.generated.resources.compose_settings_page_poster_customization +import nuvio.composeapp.generated.resources.compose_settings_page_root +import nuvio.composeapp.generated.resources.compose_settings_page_supporters_contributors +import nuvio.composeapp.generated.resources.compose_settings_page_tmdb_enrichment +import nuvio.composeapp.generated.resources.compose_settings_page_trakt +import nuvio.composeapp.generated.resources.settings_account +import org.jetbrains.compose.resources.StringResource internal enum class SettingsCategory( - val label: String, + val labelRes: StringResource, val icon: ImageVector, ) { - Account("Account", Icons.Rounded.AccountCircle), - General("General", Icons.Rounded.Settings), - About("About", Icons.Rounded.Info), + Account(Res.string.settings_account, Icons.Rounded.AccountCircle), + General(Res.string.compose_settings_category_general, Icons.Rounded.Settings), + About(Res.string.compose_settings_category_about, Icons.Rounded.Info), } internal enum class SettingsPage( - val title: String, + val titleRes: StringResource, val category: SettingsCategory, val parentPage: SettingsPage?, ) { Root( - title = "Settings", + titleRes = Res.string.compose_settings_page_root, category = SettingsCategory.General, parentPage = null, ), Account( - title = "Account", + titleRes = Res.string.compose_settings_page_account, category = SettingsCategory.Account, parentPage = Root, ), SupportersContributors( - title = "Supporters & Contributors", + titleRes = Res.string.compose_settings_page_supporters_contributors, category = SettingsCategory.About, parentPage = Root, ), Playback( - title = "Playback", + titleRes = Res.string.compose_settings_page_playback, category = SettingsCategory.General, parentPage = Root, ), Appearance( - title = "Appearance", + titleRes = Res.string.compose_settings_page_appearance, category = SettingsCategory.General, parentPage = Root, ), Notifications( - title = "Notifications", + titleRes = Res.string.compose_settings_page_notifications, category = SettingsCategory.General, parentPage = Root, ), ContinueWatching( - title = "Continue Watching", + titleRes = Res.string.compose_settings_page_continue_watching, category = SettingsCategory.General, parentPage = Appearance, ), PosterCustomization( - title = "Poster Customization", + titleRes = Res.string.compose_settings_page_poster_customization, category = SettingsCategory.General, parentPage = Appearance, ), ContentDiscovery( - title = "Content & Discovery", + titleRes = Res.string.compose_settings_page_content_discovery, category = SettingsCategory.General, parentPage = Root, ), Addons( - title = "Addons", + titleRes = Res.string.compose_settings_page_addons, category = SettingsCategory.General, parentPage = ContentDiscovery, ), Plugins( - title = "Plugins", + titleRes = Res.string.compose_settings_page_plugins, category = SettingsCategory.General, parentPage = ContentDiscovery, ), Homescreen( - title = "Homescreen", + titleRes = Res.string.compose_settings_page_homescreen, category = SettingsCategory.General, parentPage = ContentDiscovery, ), MetaScreen( - title = "Meta Screen", + titleRes = Res.string.compose_settings_page_meta_screen, category = SettingsCategory.General, parentPage = ContentDiscovery, ), Integrations( - title = "Integrations", + titleRes = Res.string.compose_settings_page_integrations, category = SettingsCategory.General, parentPage = Root, ), TmdbEnrichment( - title = "TMDB Enrichment", + titleRes = Res.string.compose_settings_page_tmdb_enrichment, category = SettingsCategory.General, parentPage = Integrations, ), MdbListRatings( - title = "MDBList Ratings", + titleRes = Res.string.compose_settings_page_mdblist_ratings, category = SettingsCategory.General, parentPage = Integrations, ), TraktAuthentication( - title = "Trakt", + titleRes = Res.string.compose_settings_page_trakt, category = SettingsCategory.Account, parentPage = Root, ), diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsRootPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsRootPage.kt index 47b341bc..e97576f6 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsRootPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsRootPage.kt @@ -20,6 +20,35 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.nuvio.app.core.build.AppVersionConfig +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_about_made_with +import nuvio.composeapp.generated.resources.compose_about_version_format +import nuvio.composeapp.generated.resources.compose_settings_page_account +import nuvio.composeapp.generated.resources.compose_settings_page_appearance +import nuvio.composeapp.generated.resources.compose_settings_page_integrations +import nuvio.composeapp.generated.resources.compose_settings_page_notifications +import nuvio.composeapp.generated.resources.compose_settings_page_playback +import nuvio.composeapp.generated.resources.compose_settings_page_supporters_contributors +import nuvio.composeapp.generated.resources.compose_settings_root_account_description +import nuvio.composeapp.generated.resources.compose_settings_root_appearance_description +import nuvio.composeapp.generated.resources.compose_settings_root_check_updates_description +import nuvio.composeapp.generated.resources.compose_settings_root_check_updates_title +import nuvio.composeapp.generated.resources.compose_settings_root_content_discovery_description +import nuvio.composeapp.generated.resources.compose_settings_root_downloads_description +import nuvio.composeapp.generated.resources.compose_settings_root_downloads_title +import nuvio.composeapp.generated.resources.compose_settings_root_general_section +import nuvio.composeapp.generated.resources.compose_settings_root_integrations_description +import nuvio.composeapp.generated.resources.compose_settings_root_notifications_description +import nuvio.composeapp.generated.resources.compose_settings_root_switch_profile_description +import nuvio.composeapp.generated.resources.compose_settings_root_switch_profile_title +import nuvio.composeapp.generated.resources.compose_settings_root_trakt_description +import nuvio.composeapp.generated.resources.compose_settings_root_about_section +import nuvio.composeapp.generated.resources.compose_settings_root_account_section +import nuvio.composeapp.generated.resources.compose_settings_page_content_discovery +import nuvio.composeapp.generated.resources.compose_settings_page_trakt +import nuvio.composeapp.generated.resources.settings_playback_subtitle +import nuvio.composeapp.generated.resources.about_supporters_contributors_subtitle +import org.jetbrains.compose.resources.stringResource internal fun LazyListScope.settingsRootContent( isTablet: Boolean, @@ -41,14 +70,14 @@ internal fun LazyListScope.settingsRootContent( if (showAccountSection) { item { SettingsSection( - title = "ACCOUNT", + title = stringResource(Res.string.compose_settings_root_account_section), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { if (onSwitchProfileClick != null) { SettingsNavigationRow( - title = "Switch Profile", - description = "Change to a different profile.", + title = stringResource(Res.string.compose_settings_root_switch_profile_title), + description = stringResource(Res.string.compose_settings_root_switch_profile_description), icon = Icons.Rounded.People, isTablet = isTablet, onClick = onSwitchProfileClick, @@ -56,16 +85,16 @@ internal fun LazyListScope.settingsRootContent( SettingsGroupDivider(isTablet = isTablet) } SettingsNavigationRow( - title = "Account", - description = "Manage your account, sign out, or delete.", + title = stringResource(Res.string.compose_settings_page_account), + description = stringResource(Res.string.compose_settings_root_account_description), icon = Icons.Rounded.AccountCircle, isTablet = isTablet, onClick = onAccountClick, ) SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Trakt", - description = "Connect Trakt, sync watchlist lists, and save titles directly to Trakt.", + title = stringResource(Res.string.compose_settings_page_trakt), + description = stringResource(Res.string.compose_settings_root_trakt_description), iconPainter = integrationLogoPainter(IntegrationLogo.Trakt), isTablet = isTablet, onClick = onTraktClick, @@ -77,53 +106,53 @@ internal fun LazyListScope.settingsRootContent( if (showGeneralSection) { item { SettingsSection( - title = "GENERAL", + title = stringResource(Res.string.compose_settings_root_general_section), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsNavigationRow( - title = "Appearance", - description = "Tune home presentation and visual preferences.", + title = stringResource(Res.string.compose_settings_page_appearance), + description = stringResource(Res.string.compose_settings_root_appearance_description), icon = Icons.Rounded.Palette, isTablet = isTablet, onClick = onAppearanceClick, ) SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Content & Discovery", - description = "Manage addons and discovery sources.", + title = stringResource(Res.string.compose_settings_page_content_discovery), + description = stringResource(Res.string.compose_settings_root_content_discovery_description), icon = Icons.Rounded.Extension, isTablet = isTablet, onClick = onContentDiscoveryClick, ) SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Downloads", - description = "Manage your downloaded movies and episodes.", + title = stringResource(Res.string.compose_settings_root_downloads_title), + description = stringResource(Res.string.compose_settings_root_downloads_description), icon = Icons.Rounded.CloudDownload, isTablet = isTablet, onClick = onDownloadsClick, ) SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Playback", - description = "Control player behavior and viewing defaults.", + title = stringResource(Res.string.compose_settings_page_playback), + description = stringResource(Res.string.settings_playback_subtitle), icon = Icons.Rounded.PlayArrow, isTablet = isTablet, onClick = onPlaybackClick, ) SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Integrations", - description = "Connect TMDB and MDBList services.", + title = stringResource(Res.string.compose_settings_page_integrations), + description = stringResource(Res.string.compose_settings_root_integrations_description), icon = Icons.Rounded.Link, isTablet = isTablet, onClick = onIntegrationsClick, ) SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Notifications", - description = "Manage episode release alerts and send a test notification.", + title = stringResource(Res.string.compose_settings_page_notifications), + description = stringResource(Res.string.compose_settings_root_notifications_description), icon = Icons.Rounded.Notifications, isTablet = isTablet, onClick = onNotificationsClick, @@ -135,13 +164,13 @@ internal fun LazyListScope.settingsRootContent( if (showAboutSection) { item { SettingsSection( - title = "ABOUT", + title = stringResource(Res.string.compose_settings_root_about_section), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsNavigationRow( - title = "Supporters & Contributors", - description = "See cross-app contributors and the supporters backing Nuvio.", + title = stringResource(Res.string.compose_settings_page_supporters_contributors), + description = stringResource(Res.string.about_supporters_contributors_subtitle), icon = Icons.Rounded.Favorite, isTablet = isTablet, onClick = onSupportersContributorsClick, @@ -149,8 +178,8 @@ internal fun LazyListScope.settingsRootContent( if (onCheckForUpdatesClick != null) { SettingsGroupDivider(isTablet = isTablet) SettingsNavigationRow( - title = "Check for updates", - description = "Check for new versions of the app.", + title = stringResource(Res.string.compose_settings_root_check_updates_title), + description = stringResource(Res.string.compose_settings_root_check_updates_description), icon = Icons.Rounded.CloudDownload, isTablet = isTablet, onClick = onCheckForUpdatesClick, @@ -167,14 +196,18 @@ internal fun LazyListScope.settingsRootContent( .padding(horizontal = 20.dp, vertical = if (isTablet) 20.dp else 16.dp), ) { Text( - text = "Made with ❤️ by Tapframe and friends", + text = stringResource(Res.string.compose_about_made_with), modifier = Modifier.fillMaxWidth(), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.Center, ) Text( - text = "Version ${AppVersionConfig.VERSION_NAME} (${AppVersionConfig.VERSION_CODE})", + text = stringResource( + Res.string.compose_about_version_format, + AppVersionConfig.VERSION_NAME, + AppVersionConfig.VERSION_CODE, + ), modifier = Modifier.fillMaxWidth(), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsScreen.kt index 3b31e45f..94ec9cd3 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SettingsScreen.kt @@ -58,6 +58,9 @@ import com.nuvio.app.features.tmdb.TmdbSettings import com.nuvio.app.features.tmdb.TmdbSettingsRepository import com.nuvio.app.features.watchprogress.ContinueWatchingPreferencesRepository import com.nuvio.app.features.watchprogress.ContinueWatchingPreferencesUiState +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.compose_settings_page_root +import org.jetbrains.compose.resources.stringResource @Composable fun SettingsScreen( @@ -87,6 +90,7 @@ fun SettingsScreen( ThemeSettingsRepository.selectedTheme }.collectAsStateWithLifecycle() val amoledEnabled by remember { ThemeSettingsRepository.amoledEnabled }.collectAsStateWithLifecycle() + val selectedAppLanguage by remember { ThemeSettingsRepository.selectedAppLanguage }.collectAsStateWithLifecycle() val tmdbSettings by remember { TmdbSettingsRepository.ensureLoaded() TmdbSettingsRepository.uiState @@ -178,6 +182,8 @@ fun SettingsScreen( onThemeSelected = ThemeSettingsRepository::setTheme, amoledEnabled = amoledEnabled, onAmoledToggle = ThemeSettingsRepository::setAmoled, + selectedAppLanguage = selectedAppLanguage, + onAppLanguageSelected = ThemeSettingsRepository::setAppLanguage, episodeReleaseNotificationsUiState = episodeReleaseNotificationsUiState, tmdbSettings = tmdbSettings, mdbListSettings = mdbListSettings, @@ -216,6 +222,8 @@ fun SettingsScreen( onThemeSelected = ThemeSettingsRepository::setTheme, amoledEnabled = amoledEnabled, onAmoledToggle = ThemeSettingsRepository::setAmoled, + selectedAppLanguage = selectedAppLanguage, + onAppLanguageSelected = ThemeSettingsRepository::setAppLanguage, episodeReleaseNotificationsUiState = episodeReleaseNotificationsUiState, tmdbSettings = tmdbSettings, mdbListSettings = mdbListSettings, @@ -264,6 +272,8 @@ private fun MobileSettingsScreen( onThemeSelected: (AppTheme) -> Unit, amoledEnabled: Boolean, onAmoledToggle: (Boolean) -> Unit, + selectedAppLanguage: AppLanguage, + onAppLanguageSelected: (AppLanguage) -> Unit, episodeReleaseNotificationsUiState: EpisodeReleaseNotificationsUiState, tmdbSettings: TmdbSettings, mdbListSettings: MdbListSettings, @@ -290,7 +300,7 @@ private fun MobileSettingsScreen( stickyHeader { val previousPage = page.previousPage() NuvioScreenHeader( - title = page.title, + title = stringResource(page.titleRes), onBack = previousPage?.let { { onPageChange(it) } }, ) } @@ -339,6 +349,8 @@ private fun MobileSettingsScreen( onThemeSelected = onThemeSelected, amoledEnabled = amoledEnabled, onAmoledToggle = onAmoledToggle, + selectedAppLanguage = selectedAppLanguage, + onAppLanguageSelected = onAppLanguageSelected, onContinueWatchingClick = onContinueWatchingClick, onPosterCustomizationClick = { onPageChange(SettingsPage.PosterCustomization) }, ) @@ -422,6 +434,8 @@ private fun TabletSettingsScreen( onThemeSelected: (AppTheme) -> Unit, amoledEnabled: Boolean, onAmoledToggle: (Boolean) -> Unit, + selectedAppLanguage: AppLanguage, + onAppLanguageSelected: (AppLanguage) -> Unit, episodeReleaseNotificationsUiState: EpisodeReleaseNotificationsUiState, tmdbSettings: TmdbSettings, mdbListSettings: MdbListSettings, @@ -468,7 +482,7 @@ private fun TabletSettingsScreen( .padding(top = topOffset), ) { Text( - text = "Settings", + text = stringResource(Res.string.compose_settings_page_root), modifier = Modifier .fillMaxWidth() .padding(horizontal = 24.dp) @@ -482,7 +496,7 @@ private fun TabletSettingsScreen( Spacer(modifier = Modifier.height(10.dp)) SettingsCategory.entries.forEach { category -> SettingsSidebarItem( - label = category.label, + label = stringResource(category.labelRes), icon = category.icon, selected = category == activeCategory, onClick = { @@ -509,7 +523,11 @@ private fun TabletSettingsScreen( item { val previousPage = page.previousPage() TabletPageHeader( - title = if (page == SettingsPage.Root) activeCategory.label else page.title, + title = if (page == SettingsPage.Root) { + stringResource(activeCategory.labelRes) + } else { + stringResource(page.titleRes) + }, showBack = previousPage != null, onBack = { previousPage?.let(onPageChange) }, ) @@ -561,6 +579,8 @@ private fun TabletSettingsScreen( onThemeSelected = onThemeSelected, amoledEnabled = amoledEnabled, onAmoledToggle = onAmoledToggle, + selectedAppLanguage = selectedAppLanguage, + onAppLanguageSelected = onAppLanguageSelected, onContinueWatchingClick = { openInlinePage(SettingsPage.ContinueWatching) }, onPosterCustomizationClick = { openInlinePage(SettingsPage.PosterCustomization) }, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SupportersContributorsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SupportersContributorsPage.kt index b6fafa2d..ce25497f 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SupportersContributorsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SupportersContributorsPage.kt @@ -61,6 +61,9 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString +import org.jetbrains.compose.resources.stringResource private enum class CommunityTab { Contributors, @@ -142,7 +145,7 @@ private object SupportersContributorsRepository { mobileResult.exceptionOrNull() ?: tvResult.exceptionOrNull() ?: webResult.exceptionOrNull() - ?: IllegalStateException("Unable to load contributors") + ?: IllegalStateException(getString(Res.string.community_error_unable_load_contributors)) ) } @@ -157,7 +160,7 @@ private object SupportersContributorsRepository { suspend fun getSupporters(limit: Int = 200): Result> = runCatching { val baseUrl = CommunityConfig.DONATIONS_BASE_URL.trim().removeSuffix("/") check(baseUrl.isNotBlank()) { - "Supporters endpoint is not configured. Add DONATIONS_BASE_URL to local.properties." + getString(Res.string.community_supporters_not_configured) } val response = httpRequestRaw( @@ -167,7 +170,7 @@ private object SupportersContributorsRepository { body = "", ) if (response.status !in 200..299) { - error("Donations API error: ${response.status}") + error(getString(Res.string.community_error_supporters_request_failed)) } json.decodeFromString(response.body) @@ -206,7 +209,7 @@ private object SupportersContributorsRepository { body = "", ) if (response.status !in 200..299) { - error("GitHub contributors API error for $repo: ${response.status}") + error(getString(Res.string.community_error_contributors_request_failed)) } contributors += json.decodeFromString>(response.body) @@ -348,7 +351,7 @@ fun SupportersContributorsSettingsScreen( ) { stickyHeader { NuvioScreenHeader( - title = "Supporters & Contributors", + title = stringResource(Res.string.compose_settings_page_supporters_contributors), onBack = onBack, ) } @@ -373,6 +376,8 @@ private fun SupportersContributorsBody( val donateUrl = remember { CommunityConfig.DONATIONS_DONATE_URL.trim().removeSuffix("/") } val donationsConfigured = remember { CommunityConfig.DONATIONS_BASE_URL.trim().isNotBlank() } val donateConfigured = donateUrl.isNotBlank() + val contributorsErrorFallback = stringResource(Res.string.community_error_unable_load_contributors) + val supportersErrorFallback = stringResource(Res.string.community_error_unable_load_supporters) var uiState by remember { mutableStateOf(CommunityUiState()) } var selectedContributor by remember { mutableStateOf(null) } @@ -400,7 +405,7 @@ private fun SupportersContributorsBody( isContributorsLoading = false, hasLoadedContributors = false, contributors = emptyList(), - contributorsErrorMessage = error.message ?: "Unable to load contributors.", + contributorsErrorMessage = error.message ?: contributorsErrorFallback, ) } } @@ -428,7 +433,7 @@ private fun SupportersContributorsBody( isSupportersLoading = false, hasLoadedSupporters = false, supporters = emptyList(), - supportersErrorMessage = error.message ?: "Unable to load supporters.", + supportersErrorMessage = error.message ?: supportersErrorFallback, ) } } @@ -449,14 +454,14 @@ private fun SupportersContributorsBody( ) { NuvioSurfaceCard { Text( - text = "Community", + text = stringResource(Res.string.community_section_title), style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.SemiBold, ) Spacer(modifier = Modifier.height(10.dp)) Text( - text = "See the people building and supporting Nuvio across Mobile, TV, and Web.", + text = stringResource(Res.string.community_section_description), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -472,12 +477,12 @@ private fun SupportersContributorsBody( modifier = Modifier.size(18.dp), ) Spacer(modifier = Modifier.size(8.dp)) - Text("Donate") + Text(stringResource(Res.string.action_donate)) } if (!donationsConfigured) { Spacer(modifier = Modifier.height(10.dp)) Text( - text = "Supporters API is not configured. Add DONATIONS_BASE_URL to local.properties.", + text = stringResource(Res.string.community_supporters_not_configured), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.error, ) @@ -512,13 +517,18 @@ private fun SupportersContributorsBody( selectedContributor?.let { contributor -> val supportUrl = contributorSupportLink(contributor.login) + val contributionSummary = contributorContributionSummary(contributor) CommunityDetailsDialog( title = contributor.login, - subtitle = contributorContributionSummary(contributor), + subtitle = contributionSummary, onDismiss = { selectedContributor = null }, - primaryActionLabel = if (contributor.profileUrl != null) "Open GitHub" else null, + primaryActionLabel = if (contributor.profileUrl != null) { + stringResource(Res.string.community_open_github) + } else { + null + }, onPrimaryAction = contributor.profileUrl?.let { url -> { uriHandler.openUri(url) } }, - secondaryActionLabel = if (supportUrl != null) "Donate" else null, + secondaryActionLabel = if (supportUrl != null) stringResource(Res.string.action_donate) else null, onSecondaryAction = supportUrl?.let { url -> { uriHandler.openUri(url) } }, ) { Row( @@ -535,12 +545,12 @@ private fun SupportersContributorsBody( verticalArrangement = Arrangement.spacedBy(6.dp), ) { Text( - text = contributorContributionSummary(contributor), + text = contributionSummary, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurface, ) Text( - text = contributor.profileUrl ?: "GitHub profile unavailable", + text = contributor.profileUrl ?: stringResource(Res.string.community_github_profile_unavailable), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -568,7 +578,7 @@ private fun SupportersContributorsBody( modifier = Modifier.size(72.dp), ) Text( - text = supporter.message ?: "No message attached.", + text = supporter.message ?: stringResource(Res.string.community_no_message_attached), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -605,7 +615,11 @@ private fun CommunityTabRow( contentAlignment = Alignment.Center, ) { Text( - text = if (tab == CommunityTab.Contributors) "Contributors" else "Supporters", + text = if (tab == CommunityTab.Contributors) { + stringResource(Res.string.community_tab_contributors) + } else { + stringResource(Res.string.community_tab_supporters) + }, style = MaterialTheme.typography.bodyLarge, color = if (isSelected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant, fontWeight = if (isSelected) FontWeight.SemiBold else FontWeight.Medium, @@ -626,13 +640,13 @@ private fun ContributorsCard( ) { NuvioSurfaceCard { when { - isLoading -> LoadingState(label = "Loading contributors...") + isLoading -> LoadingState(label = stringResource(Res.string.community_loading_contributors)) errorMessage != null -> ErrorState( - title = "Couldn't load contributors", + title = stringResource(Res.string.community_load_contributors_failed), message = errorMessage, onRetry = onRetry, ) - contributors.isEmpty() -> EmptyState(label = "No contributors found.") + contributors.isEmpty() -> EmptyState(label = stringResource(Res.string.community_empty_contributors)) else -> LazyColumn( modifier = Modifier .fillMaxWidth() @@ -664,13 +678,13 @@ private fun SupportersCard( ) { NuvioSurfaceCard { when { - isLoading -> LoadingState(label = "Loading supporters...") + isLoading -> LoadingState(label = stringResource(Res.string.community_loading_supporters)) errorMessage != null -> ErrorState( - title = "Couldn't load supporters", + title = stringResource(Res.string.community_load_supporters_failed), message = errorMessage, onRetry = onRetry, ) - supporters.isEmpty() -> EmptyState(label = "No supporters found.") + supporters.isEmpty() -> EmptyState(label = stringResource(Res.string.community_empty_supporters)) else -> LazyColumn( modifier = Modifier .fillMaxWidth() @@ -905,7 +919,7 @@ private fun ErrorState( textAlign = TextAlign.Center, ) Button(onClick = onRetry) { - Text("Retry") + Text(stringResource(Res.string.action_retry)) } } } @@ -969,8 +983,9 @@ private fun CommunityDetailsDialog( } } +@Composable private fun contributorContributionSummary(contributor: CommunityContributor): String = - "${contributor.totalContributions} total commits" + stringResource(Res.string.community_total_commits, contributor.totalContributions) private fun contributorSupportLink(login: String): String? = when (login.lowercase()) { "skoruppa" -> "https://ko-fi.com/skoruppa" @@ -978,6 +993,7 @@ private fun contributorSupportLink(login: String): String? = when (login.lowerca else -> null } +@Composable private fun formatDonationDate(rawDate: String): String { val datePart = rawDate.substringBefore('T') val parts = datePart.split('-') @@ -985,10 +1001,20 @@ private fun formatDonationDate(rawDate: String): String { val year = parts[0] val month = parts[1].toIntOrNull()?.let { monthIndex -> listOf( - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + stringResource(Res.string.community_month_jan), + stringResource(Res.string.community_month_feb), + stringResource(Res.string.community_month_mar), + stringResource(Res.string.community_month_apr), + stringResource(Res.string.community_month_may), + stringResource(Res.string.community_month_jun), + stringResource(Res.string.community_month_jul), + stringResource(Res.string.community_month_aug), + stringResource(Res.string.community_month_sep), + stringResource(Res.string.community_month_oct), + stringResource(Res.string.community_month_nov), + stringResource(Res.string.community_month_dec), ).getOrNull(monthIndex - 1) } ?: return rawDate val day = parts[2].toIntOrNull()?.toString() ?: return rawDate - return "$month $day, $year" -} \ No newline at end of file + return stringResource(Res.string.community_date_format, month, day, year) +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsRepository.kt index af35280e..8a2b5241 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsRepository.kt @@ -12,6 +12,9 @@ object ThemeSettingsRepository { private val _amoledEnabled = MutableStateFlow(false) val amoledEnabled: StateFlow = _amoledEnabled.asStateFlow() + private val _selectedAppLanguage = MutableStateFlow(AppLanguage.ENGLISH) + val selectedAppLanguage: StateFlow = _selectedAppLanguage.asStateFlow() + private var hasLoaded = false fun ensureLoaded() { @@ -27,6 +30,7 @@ object ThemeSettingsRepository { hasLoaded = false _selectedTheme.value = AppTheme.WHITE _amoledEnabled.value = false + _selectedAppLanguage.value = AppLanguage.ENGLISH } private fun loadFromDisk() { @@ -43,6 +47,9 @@ object ThemeSettingsRepository { } _selectedTheme.value = theme _amoledEnabled.value = ThemeSettingsStorage.loadAmoledEnabled() ?: false + val appLanguage = AppLanguage.fromCode(ThemeSettingsStorage.loadSelectedAppLanguage()) + _selectedAppLanguage.value = appLanguage + ThemeSettingsStorage.applySelectedAppLanguage(appLanguage.code) } fun setTheme(theme: AppTheme) { @@ -58,4 +65,12 @@ object ThemeSettingsRepository { _amoledEnabled.value = enabled ThemeSettingsStorage.saveAmoledEnabled(enabled) } + + fun setAppLanguage(language: AppLanguage) { + ensureLoaded() + if (_selectedAppLanguage.value == language) return + _selectedAppLanguage.value = language + ThemeSettingsStorage.saveSelectedAppLanguage(language.code) + ThemeSettingsStorage.applySelectedAppLanguage(language.code) + } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.kt index 9de3eb78..dc39dee5 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.kt @@ -7,6 +7,9 @@ internal expect object ThemeSettingsStorage { fun saveSelectedTheme(themeName: String) fun loadAmoledEnabled(): Boolean? fun saveAmoledEnabled(enabled: Boolean) + fun loadSelectedAppLanguage(): String? + fun saveSelectedAppLanguage(languageCode: String) + fun applySelectedAppLanguage(languageCode: String) fun exportToSyncPayload(): JsonObject fun replaceFromSyncPayload(payload: JsonObject) } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/TmdbSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/TmdbSettingsPage.kt index 9a586d3f..8e1c330f 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/TmdbSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/TmdbSettingsPage.kt @@ -22,6 +22,44 @@ import androidx.compose.ui.unit.dp import com.nuvio.app.features.tmdb.TmdbSettings import com.nuvio.app.features.tmdb.TmdbSettingsRepository import com.nuvio.app.features.tmdb.normalizeLanguage +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.action_save +import nuvio.composeapp.generated.resources.settings_tmdb_add_api_key_first +import nuvio.composeapp.generated.resources.settings_tmdb_api_key_label +import nuvio.composeapp.generated.resources.settings_tmdb_enable_enrichment +import nuvio.composeapp.generated.resources.settings_tmdb_enable_enrichment_description +import nuvio.composeapp.generated.resources.settings_tmdb_enter_api_key +import nuvio.composeapp.generated.resources.settings_tmdb_language_code_label +import nuvio.composeapp.generated.resources.settings_tmdb_module_artwork +import nuvio.composeapp.generated.resources.settings_tmdb_module_artwork_description +import nuvio.composeapp.generated.resources.settings_tmdb_module_basic_info +import nuvio.composeapp.generated.resources.settings_tmdb_module_basic_info_description +import nuvio.composeapp.generated.resources.settings_tmdb_module_collections +import nuvio.composeapp.generated.resources.settings_tmdb_module_collections_description +import nuvio.composeapp.generated.resources.settings_tmdb_module_credits +import nuvio.composeapp.generated.resources.settings_tmdb_module_credits_description +import nuvio.composeapp.generated.resources.settings_tmdb_module_details +import nuvio.composeapp.generated.resources.settings_tmdb_module_details_description +import nuvio.composeapp.generated.resources.settings_tmdb_module_episodes +import nuvio.composeapp.generated.resources.settings_tmdb_module_episodes_description +import nuvio.composeapp.generated.resources.settings_tmdb_module_more_like_this +import nuvio.composeapp.generated.resources.settings_tmdb_module_more_like_this_description +import nuvio.composeapp.generated.resources.settings_tmdb_module_networks +import nuvio.composeapp.generated.resources.settings_tmdb_module_networks_description +import nuvio.composeapp.generated.resources.settings_tmdb_module_production_companies +import nuvio.composeapp.generated.resources.settings_tmdb_module_production_companies_description +import nuvio.composeapp.generated.resources.settings_tmdb_module_season_posters +import nuvio.composeapp.generated.resources.settings_tmdb_module_season_posters_description +import nuvio.composeapp.generated.resources.settings_tmdb_module_trailers +import nuvio.composeapp.generated.resources.settings_tmdb_module_trailers_description +import nuvio.composeapp.generated.resources.settings_tmdb_personal_api_key +import nuvio.composeapp.generated.resources.settings_tmdb_preferred_language +import nuvio.composeapp.generated.resources.settings_tmdb_preferred_language_description +import nuvio.composeapp.generated.resources.settings_tmdb_section_credentials +import nuvio.composeapp.generated.resources.settings_tmdb_section_localization +import nuvio.composeapp.generated.resources.settings_tmdb_section_modules +import nuvio.composeapp.generated.resources.settings_tmdb_section_title +import org.jetbrains.compose.resources.stringResource internal fun LazyListScope.tmdbSettingsContent( isTablet: Boolean, @@ -32,13 +70,13 @@ internal fun LazyListScope.tmdbSettingsContent( item { SettingsSection( - title = "TMDB", + title = stringResource(Res.string.settings_tmdb_section_title), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Enable TMDB enrichment", - description = "Use your TMDB API key to enrich addon metadata on the details screen when a TMDB or IMDb ID is available.", + title = stringResource(Res.string.settings_tmdb_enable_enrichment), + description = stringResource(Res.string.settings_tmdb_enable_enrichment_description), checked = settings.enabled, enabled = settings.hasApiKey, isTablet = isTablet, @@ -48,7 +86,7 @@ internal fun LazyListScope.tmdbSettingsContent( SettingsGroupDivider(isTablet = isTablet) TmdbInfoRow( isTablet = isTablet, - text = "Add your own TMDB API key below before turning enrichment on.", + text = stringResource(Res.string.settings_tmdb_add_api_key_first), ) } } @@ -57,7 +95,7 @@ internal fun LazyListScope.tmdbSettingsContent( item { SettingsSection( - title = "CREDENTIALS", + title = stringResource(Res.string.settings_tmdb_section_credentials), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { @@ -72,7 +110,7 @@ internal fun LazyListScope.tmdbSettingsContent( item { SettingsSection( - title = "LOCALIZATION", + title = stringResource(Res.string.settings_tmdb_section_localization), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { @@ -88,14 +126,14 @@ internal fun LazyListScope.tmdbSettingsContent( item { SettingsSection( - title = "MODULES", + title = stringResource(Res.string.settings_tmdb_section_modules), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { TmdbToggleRow( isTablet = isTablet, - title = "Trailers", - description = "Fetch and show TMDB trailer videos section on detail pages.", + title = stringResource(Res.string.settings_tmdb_module_trailers), + description = stringResource(Res.string.settings_tmdb_module_trailers_description), checked = settings.useTrailers, enabled = enrichmentControlsEnabled, onCheckedChange = TmdbSettingsRepository::setUseTrailers, @@ -103,8 +141,8 @@ internal fun LazyListScope.tmdbSettingsContent( SettingsGroupDivider(isTablet = isTablet) TmdbToggleRow( isTablet = isTablet, - title = "Artwork", - description = "Replace backdrop, poster, and logo with TMDB artwork.", + title = stringResource(Res.string.settings_tmdb_module_artwork), + description = stringResource(Res.string.settings_tmdb_module_artwork_description), checked = settings.useArtwork, enabled = enrichmentControlsEnabled, onCheckedChange = TmdbSettingsRepository::setUseArtwork, @@ -112,8 +150,8 @@ internal fun LazyListScope.tmdbSettingsContent( SettingsGroupDivider(isTablet = isTablet) TmdbToggleRow( isTablet = isTablet, - title = "Basic info", - description = "Use TMDB title, synopsis, genres, and rating.", + title = stringResource(Res.string.settings_tmdb_module_basic_info), + description = stringResource(Res.string.settings_tmdb_module_basic_info_description), checked = settings.useBasicInfo, enabled = enrichmentControlsEnabled, onCheckedChange = TmdbSettingsRepository::setUseBasicInfo, @@ -121,8 +159,8 @@ internal fun LazyListScope.tmdbSettingsContent( SettingsGroupDivider(isTablet = isTablet) TmdbToggleRow( isTablet = isTablet, - title = "Details", - description = "Use TMDB release info, runtime, age rating, status, country, and language.", + title = stringResource(Res.string.settings_tmdb_module_details), + description = stringResource(Res.string.settings_tmdb_module_details_description), checked = settings.useDetails, enabled = enrichmentControlsEnabled, onCheckedChange = TmdbSettingsRepository::setUseDetails, @@ -130,8 +168,8 @@ internal fun LazyListScope.tmdbSettingsContent( SettingsGroupDivider(isTablet = isTablet) TmdbToggleRow( isTablet = isTablet, - title = "Credits", - description = "Use TMDB creators, directors, writers, and cast photos.", + title = stringResource(Res.string.settings_tmdb_module_credits), + description = stringResource(Res.string.settings_tmdb_module_credits_description), checked = settings.useCredits, enabled = enrichmentControlsEnabled, onCheckedChange = TmdbSettingsRepository::setUseCredits, @@ -139,8 +177,8 @@ internal fun LazyListScope.tmdbSettingsContent( SettingsGroupDivider(isTablet = isTablet) TmdbToggleRow( isTablet = isTablet, - title = "Production companies", - description = "Use TMDB production company metadata on the details screen.", + title = stringResource(Res.string.settings_tmdb_module_production_companies), + description = stringResource(Res.string.settings_tmdb_module_production_companies_description), checked = settings.useProductions, enabled = enrichmentControlsEnabled, onCheckedChange = TmdbSettingsRepository::setUseProductions, @@ -148,8 +186,8 @@ internal fun LazyListScope.tmdbSettingsContent( SettingsGroupDivider(isTablet = isTablet) TmdbToggleRow( isTablet = isTablet, - title = "Networks", - description = "Use TMDB network metadata for TV titles.", + title = stringResource(Res.string.settings_tmdb_module_networks), + description = stringResource(Res.string.settings_tmdb_module_networks_description), checked = settings.useNetworks, enabled = enrichmentControlsEnabled, onCheckedChange = TmdbSettingsRepository::setUseNetworks, @@ -157,8 +195,8 @@ internal fun LazyListScope.tmdbSettingsContent( SettingsGroupDivider(isTablet = isTablet) TmdbToggleRow( isTablet = isTablet, - title = "Episodes", - description = "Use TMDB episode titles, thumbnails, descriptions, and runtimes for series.", + title = stringResource(Res.string.settings_tmdb_module_episodes), + description = stringResource(Res.string.settings_tmdb_module_episodes_description), checked = settings.useEpisodes, enabled = enrichmentControlsEnabled, onCheckedChange = TmdbSettingsRepository::setUseEpisodes, @@ -166,8 +204,8 @@ internal fun LazyListScope.tmdbSettingsContent( SettingsGroupDivider(isTablet = isTablet) TmdbToggleRow( isTablet = isTablet, - title = "Season posters", - description = "Use TMDB season posters in the metadata screen season selector for series.", + title = stringResource(Res.string.settings_tmdb_module_season_posters), + description = stringResource(Res.string.settings_tmdb_module_season_posters_description), checked = settings.useSeasonPosters, enabled = enrichmentControlsEnabled, onCheckedChange = TmdbSettingsRepository::setUseSeasonPosters, @@ -175,8 +213,8 @@ internal fun LazyListScope.tmdbSettingsContent( SettingsGroupDivider(isTablet = isTablet) TmdbToggleRow( isTablet = isTablet, - title = "More like this", - description = "Show TMDB recommendations at the bottom of detail pages.", + title = stringResource(Res.string.settings_tmdb_module_more_like_this), + description = stringResource(Res.string.settings_tmdb_module_more_like_this_description), checked = settings.useMoreLikeThis, enabled = enrichmentControlsEnabled, onCheckedChange = TmdbSettingsRepository::setUseMoreLikeThis, @@ -184,8 +222,8 @@ internal fun LazyListScope.tmdbSettingsContent( SettingsGroupDivider(isTablet = isTablet) TmdbToggleRow( isTablet = isTablet, - title = "Collections", - description = "Show franchise and collection rails for movies when TMDB provides them.", + title = stringResource(Res.string.settings_tmdb_module_collections), + description = stringResource(Res.string.settings_tmdb_module_collections_description), checked = settings.useCollections, enabled = enrichmentControlsEnabled, onCheckedChange = TmdbSettingsRepository::setUseCollections, @@ -213,13 +251,13 @@ private fun TmdbApiKeyRow( ) { Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { Text( - text = "Personal API key", + text = stringResource(Res.string.settings_tmdb_personal_api_key), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Medium, ) Text( - text = "Enter your TMDB v3 API key.", + text = stringResource(Res.string.settings_tmdb_enter_api_key), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -234,7 +272,7 @@ private fun TmdbApiKeyRow( }, modifier = Modifier.fillMaxWidth(), singleLine = true, - label = { Text("TMDB API key") }, + label = { Text(stringResource(Res.string.settings_tmdb_api_key_label)) }, colors = OutlinedTextFieldDefaults.colors( focusedBorderColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.75f), unfocusedBorderColor = MaterialTheme.colorScheme.outlineVariant.copy(alpha = 0.42f), @@ -252,7 +290,7 @@ private fun TmdbApiKeyRow( }, enabled = normalizedDraft != value, ) { - Text("Save Key") + Text(stringResource(Res.string.action_save)) } } } @@ -278,13 +316,13 @@ private fun TmdbLanguageRow( ) { Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { Text( - text = "Preferred language", + text = stringResource(Res.string.settings_tmdb_preferred_language), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Medium, ) Text( - text = "Set the TMDB language code used for localized metadata, for example `en`, `en-US`, or `pt-BR`.", + text = stringResource(Res.string.settings_tmdb_preferred_language_description), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -298,7 +336,7 @@ private fun TmdbLanguageRow( enabled = enabled, modifier = Modifier.fillMaxWidth(), singleLine = true, - label = { Text("Language code") }, + label = { Text(stringResource(Res.string.settings_tmdb_language_code_label)) }, colors = OutlinedTextFieldDefaults.colors( focusedBorderColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.75f), unfocusedBorderColor = MaterialTheme.colorScheme.outlineVariant.copy(alpha = 0.42f), @@ -316,7 +354,7 @@ private fun TmdbLanguageRow( }, enabled = enabled && normalizedDraft != value, ) { - Text("Save Language") + Text(stringResource(Res.string.action_save)) } } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/TraktSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/TraktSettingsPage.kt index b57ce371..82130875 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/TraktSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/TraktSettingsPage.kt @@ -24,6 +24,25 @@ import com.nuvio.app.features.trakt.TraktBrandAsset import com.nuvio.app.features.trakt.TraktAuthUiState import com.nuvio.app.features.trakt.TraktConnectionMode import com.nuvio.app.features.trakt.traktBrandPainter +import nuvio.composeapp.generated.resources.Res +import nuvio.composeapp.generated.resources.action_cancel +import nuvio.composeapp.generated.resources.settings_trakt_approval_redirect +import nuvio.composeapp.generated.resources.settings_trakt_authentication +import nuvio.composeapp.generated.resources.settings_trakt_comments +import nuvio.composeapp.generated.resources.settings_trakt_comments_description +import nuvio.composeapp.generated.resources.settings_trakt_connect +import nuvio.composeapp.generated.resources.settings_trakt_connected_as +import nuvio.composeapp.generated.resources.settings_trakt_default_user +import nuvio.composeapp.generated.resources.settings_trakt_disconnect +import nuvio.composeapp.generated.resources.settings_trakt_failed_open_browser +import nuvio.composeapp.generated.resources.settings_trakt_features +import nuvio.composeapp.generated.resources.settings_trakt_finish_sign_in +import nuvio.composeapp.generated.resources.settings_trakt_intro_description +import nuvio.composeapp.generated.resources.settings_trakt_missing_credentials +import nuvio.composeapp.generated.resources.settings_trakt_open_login +import nuvio.composeapp.generated.resources.settings_trakt_save_actions_description +import nuvio.composeapp.generated.resources.settings_trakt_sign_in_description +import org.jetbrains.compose.resources.stringResource internal fun LazyListScope.traktSettingsContent( isTablet: Boolean, @@ -39,7 +58,7 @@ internal fun LazyListScope.traktSettingsContent( item { SettingsSection( - title = "AUTHENTICATION", + title = stringResource(Res.string.settings_trakt_authentication), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { @@ -54,13 +73,13 @@ internal fun LazyListScope.traktSettingsContent( if (uiState.mode == TraktConnectionMode.CONNECTED) { item { SettingsSection( - title = "FEATURES", + title = stringResource(Res.string.settings_trakt_features), isTablet = isTablet, ) { SettingsGroup(isTablet = isTablet) { SettingsSwitchRow( - title = "Comments", - description = "Show Trakt comments on movie and show details", + title = stringResource(Res.string.settings_trakt_comments), + description = stringResource(Res.string.settings_trakt_comments_description), checked = commentsEnabled, isTablet = isTablet, onCheckedChange = onCommentsEnabledChange, @@ -92,12 +111,12 @@ private fun TraktBrandIntro( ) { androidx.compose.foundation.Image( painter = traktBrandPainter(TraktBrandAsset.Glyph), - contentDescription = "Trakt", + contentDescription = null, modifier = Modifier.size(if (isTablet) 84.dp else 72.dp), contentScale = ContentScale.Fit, ) Text( - text = "Track what you watch, save to watchlist or custom lists, and keep your library synced with Trakt.", + text = stringResource(Res.string.settings_trakt_intro_description), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -113,6 +132,7 @@ private fun TraktConnectionCard( val uriHandler = LocalUriHandler.current val horizontalPadding = if (isTablet) 20.dp else 16.dp val verticalPadding = if (isTablet) 18.dp else 16.dp + val failedOpenBrowserMessage = stringResource(Res.string.settings_trakt_failed_open_browser) Column( modifier = Modifier @@ -123,13 +143,16 @@ private fun TraktConnectionCard( when (uiState.mode) { TraktConnectionMode.CONNECTED -> { Text( - text = "Connected as ${uiState.username ?: "Trakt user"}", + text = stringResource( + Res.string.settings_trakt_connected_as, + uiState.username ?: stringResource(Res.string.settings_trakt_default_user), + ), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Medium, ) Text( - text = "Your Save actions can now target Trakt watchlist and personal lists.", + text = stringResource(Res.string.settings_trakt_save_actions_description), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -148,20 +171,20 @@ private fun TraktConnectionCard( modifier = Modifier.size(18.dp), ) } else { - Text("Disconnect") + Text(stringResource(Res.string.settings_trakt_disconnect)) } } } TraktConnectionMode.AWAITING_APPROVAL -> { Text( - text = "Finish Trakt sign in in your browser", + text = stringResource(Res.string.settings_trakt_finish_sign_in), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Medium, ) Text( - text = "After approval, you will be redirected back automatically.", + text = stringResource(Res.string.settings_trakt_approval_redirect), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -173,13 +196,13 @@ private fun TraktConnectionCard( runCatching { uriHandler.openUri(authUrl) } .onFailure { TraktAuthRepository.onAuthLaunchFailed( - it.message ?: "Failed to open browser", + it.message ?: failedOpenBrowserMessage, ) } }, enabled = !uiState.isLoading, ) { - Text("Open Trakt Login") + Text(stringResource(Res.string.settings_trakt_open_login)) } Button( onClick = TraktAuthRepository::onCancelAuthorization, @@ -189,13 +212,13 @@ private fun TraktConnectionCard( contentColor = MaterialTheme.colorScheme.onSurface, ), ) { - Text("Cancel") + Text(stringResource(Res.string.action_cancel)) } } TraktConnectionMode.DISCONNECTED -> { Text( - text = "Sign in with Trakt to enable list-based saving and Trakt library mode.", + text = stringResource(Res.string.settings_trakt_sign_in_description), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -205,7 +228,7 @@ private fun TraktConnectionCard( runCatching { uriHandler.openUri(authUrl) } .onFailure { TraktAuthRepository.onAuthLaunchFailed( - it.message ?: "Failed to open browser", + it.message ?: failedOpenBrowserMessage, ) } }, @@ -218,12 +241,12 @@ private fun TraktConnectionCard( modifier = Modifier.size(18.dp), ) } else { - Text("Connect Trakt") + Text(stringResource(Res.string.settings_trakt_connect)) } } if (!uiState.credentialsConfigured) { Text( - text = "Missing Trakt credentials in local.properties (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET).", + text = stringResource(Res.string.settings_trakt_missing_credentials), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.error, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamModels.kt index 8933ae87..545f71fd 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamModels.kt @@ -1,5 +1,9 @@ package com.nuvio.app.features.streams +import kotlinx.coroutines.runBlocking +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString + data class StreamItem( val name: String? = null, val description: String? = null, @@ -13,7 +17,7 @@ data class StreamItem( val behaviorHints: StreamBehaviorHints = StreamBehaviorHints(), ) { val streamLabel: String - get() = name ?: "Stream" + get() = name ?: runBlocking { getString(Res.string.stream_default_name) } val streamSubtitle: String? get() = description diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsRepository.kt index d9516513..98d6e7e3 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsRepository.kt @@ -23,6 +23,8 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString import kotlinx.coroutines.launch object StreamsRepository { @@ -313,7 +315,7 @@ object StreamsRepository { StreamLoadCompletion.PluginScraper( addonId = providerGroup.addonId, streams = emptyList(), - error = error.message ?: "Failed to load ${scraper.name}", + error = error.message ?: getString(Res.string.streams_failed_to_load_scraper, scraper.name), ) }, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsScreen.kt index 3dcffda4..fdf38d55 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsScreen.kt @@ -71,6 +71,7 @@ import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.text.AnnotatedString +import com.nuvio.app.core.i18n.localizedByteUnit import com.nuvio.app.core.ui.NuvioBackButton import com.nuvio.app.core.ui.NuvioBottomSheetActionRow import com.nuvio.app.core.ui.NuvioBottomSheetDivider @@ -87,6 +88,8 @@ import com.nuvio.app.features.watchprogress.WatchProgressRepository import kotlinx.coroutines.launch import kotlin.math.round import kotlin.math.roundToInt +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource // --------------------------------------------------------------------------- // Streams Screen @@ -124,6 +127,8 @@ fun StreamsScreen( } val isEpisode = seasonNumber != null && episodeNumber != null val clipboardManager = LocalClipboardManager.current + val streamLinkCopiedText = stringResource(Res.string.streams_link_copied) + val noDirectStreamLinkText = stringResource(Res.string.streams_no_direct_link) var streamActionsTarget by remember(videoId) { mutableStateOf(null) } var preferredFilterApplied by remember(videoId) { mutableStateOf(false) } val storedProgress = if (startFromBeginning) { @@ -257,7 +262,7 @@ fun StreamsScreen( ) { Icon( imageVector = Icons.Rounded.Refresh, - contentDescription = "Refresh streams", + contentDescription = stringResource(Res.string.streams_refresh), tint = MaterialTheme.colorScheme.onBackground, modifier = Modifier.size(20.dp), ) @@ -295,7 +300,7 @@ fun StreamsScreen( strokeWidth = 2.5.dp, ) Text( - text = "Finding source...", + text = stringResource(Res.string.streams_finding_source), style = MaterialTheme.typography.bodyMedium, color = Color.White.copy(alpha = 0.8f), ) @@ -310,9 +315,9 @@ fun StreamsScreen( val directUrl = stream.directPlaybackUrl if (!directUrl.isNullOrBlank()) { clipboardManager.setText(AnnotatedString(directUrl)) - NuvioToastController.show("Stream link copied") + NuvioToastController.show(streamLinkCopiedText) } else { - NuvioToastController.show("No direct stream link available") + NuvioToastController.show(noDirectStreamLinkText) } }, onDownload = { stream -> @@ -331,7 +336,7 @@ fun StreamsScreen( episodeThumbnail = episodeThumbnail, stream = stream, ) - NuvioToastController.show(result.toastMessage) + NuvioToastController.show(result.toastMessage()) }, ) } @@ -446,8 +451,14 @@ internal fun ResumeBanner( modifier: Modifier = Modifier, ) { val resumeText = when { - progressFraction != null && progressFraction > 0f -> "Resume from ${(progressFraction * 100f).roundToInt()}%" - positionMs != null && positionMs > 0L -> "Resume from ${positionMs.toPlaybackClock()}" + progressFraction != null && progressFraction > 0f -> stringResource( + Res.string.streams_resume_from_percent, + (progressFraction * 100f).roundToInt(), + ) + positionMs != null && positionMs > 0L -> stringResource( + Res.string.streams_resume_from_time, + positionMs.toPlaybackClock(), + ) else -> null } ?: return @@ -576,7 +587,7 @@ private fun EpisodeHeroBlock( ) { // Episode label Text( - text = "S${seasonNumber} E${episodeNumber}", + text = stringResource(Res.string.streams_episode_badge, seasonNumber, episodeNumber), style = MaterialTheme.typography.labelMedium.copy( fontSize = 14.sp, fontWeight = FontWeight.Bold, @@ -634,7 +645,7 @@ internal fun ProviderFilterRow( ) { // "All" chip FilterChip( - label = "All", + label = stringResource(Res.string.collections_tab_all), isSelected = selectedFilter == null, onClick = { onFilterSelected(null) }, ) @@ -888,7 +899,7 @@ private fun StreamSectionHeader( ) Spacer(modifier = Modifier.width(6.dp)) Text( - text = "Fetching…", + text = stringResource(Res.string.streams_fetching), style = MaterialTheme.typography.labelSmall.copy(fontSize = 12.sp), color = MaterialTheme.colorScheme.primary, ) @@ -1036,7 +1047,7 @@ private fun StreamActionsSheet( NuvioBottomSheetDivider() NuvioBottomSheetActionRow( icon = Icons.Rounded.ContentCopy, - title = "Copy stream link", + title = stringResource(Res.string.streams_copy_link), onClick = { onCopyLink(stream) coroutineScope.launch { @@ -1047,7 +1058,7 @@ private fun StreamActionsSheet( NuvioBottomSheetDivider() NuvioBottomSheetActionRow( icon = Icons.Rounded.Download, - title = "Download file", + title = stringResource(Res.string.streams_download_file), onClick = { onDownload(stream) coroutineScope.launch { @@ -1065,10 +1076,10 @@ private fun StreamFileSizeBadge(stream: StreamItem) { val gib = bytes.toDouble() / (1024.0 * 1024.0 * 1024.0) val sizeLabel = if (gib >= 1.0) { val roundedGiB = round(gib * 10.0) / 10.0 - "$roundedGiB GB" + "$roundedGiB ${localizedByteUnit("GB")}" } else { val mib = bytes.toDouble() / (1024.0 * 1024.0) - "${round(mib).toInt()} MB" + "${round(mib).toInt()} ${localizedByteUnit("MB")}" } Box( @@ -1078,7 +1089,7 @@ private fun StreamFileSizeBadge(stream: StreamItem) { .padding(horizontal = 8.dp, vertical = 3.dp), ) { Text( - text = "SIZE $sizeLabel", + text = stringResource(Res.string.streams_size, sizeLabel), style = MaterialTheme.typography.labelSmall.copy( fontSize = 11.sp, fontWeight = FontWeight.SemiBold, @@ -1129,7 +1140,7 @@ private fun LoadingStateBlock(modifier: Modifier = Modifier) { modifier = Modifier.size(32.dp), ) Text( - text = "Finding streams…", + text = stringResource(Res.string.streams_finding_streams), style = MaterialTheme.typography.bodySmall.copy( fontSize = 12.sp, fontWeight = FontWeight.Medium, @@ -1149,23 +1160,23 @@ private fun EmptyStateBlock( when (reason) { StreamsEmptyStateReason.NoAddonsInstalled -> { - title = "No addons installed" - message = "Install an addon first to load streams for this title." + title = stringResource(Res.string.compose_search_empty_no_active_addons_title) + message = stringResource(Res.string.streams_empty_no_addons_message) } StreamsEmptyStateReason.NoCompatibleAddons -> { - title = "No stream addon available" - message = "Your installed addons do not provide streams for this type of title." + title = stringResource(Res.string.streams_empty_no_stream_addon_title) + message = stringResource(Res.string.streams_empty_no_stream_addon_message) } StreamsEmptyStateReason.StreamFetchFailed -> { - title = "Could not load streams" - message = "The installed stream addons failed to return a valid stream response." + title = stringResource(Res.string.streams_empty_load_failed_title) + message = stringResource(Res.string.streams_empty_load_failed_message) } StreamsEmptyStateReason.NoStreamsFound, null -> { - title = "No streams found" - message = "None of your installed addons returned streams for this title." + title = stringResource(Res.string.compose_player_no_streams_found) + message = stringResource(Res.string.streams_empty_no_streams_message) } } @@ -1216,7 +1227,7 @@ private fun FooterLoadingBlock(modifier: Modifier = Modifier) { ) Spacer(modifier = Modifier.width(8.dp)) Text( - text = "Checking more addons…", + text = stringResource(Res.string.streams_checking_more_addons), style = MaterialTheme.typography.bodySmall.copy( fontSize = 12.sp, fontWeight = FontWeight.Medium, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsTabletLayout.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsTabletLayout.kt index a7410f7f..3f33ce98 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsTabletLayout.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsTabletLayout.kt @@ -45,6 +45,8 @@ import com.nuvio.app.isIos import dev.chrisbanes.haze.hazeEffect import dev.chrisbanes.haze.hazeSource import dev.chrisbanes.haze.rememberHazeState +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable internal fun TabletStreamsLayout( @@ -250,7 +252,7 @@ private fun TabletMovieInfoPanel( ) } else { Text( - text = "No metadata available", + text = stringResource(Res.string.streams_no_metadata), style = MaterialTheme.typography.bodyLarge.copy( fontSize = 16.sp, fontStyle = FontStyle.Italic, @@ -309,7 +311,12 @@ private fun TabletEpisodeInfoPanel( Spacer(modifier = Modifier.height(12.dp)) Text( - text = "S${seasonNumber}E${episodeNumber} - ${episodeTitle?.takeIf { it.isNotBlank() } ?: "Episode"}", + text = stringResource( + Res.string.streams_episode_title_with_name, + seasonNumber, + episodeNumber, + episodeTitle?.takeIf { it.isNotBlank() } ?: stringResource(Res.string.streams_episode_fallback_title), + ), style = MaterialTheme.typography.bodyLarge.copy( fontSize = 16.sp, lineHeight = 24.sp, @@ -340,7 +347,7 @@ private fun ActiveScrapersStatusBlock( .padding(horizontal = 16.dp, vertical = 8.dp), ) { Text( - text = "Active scrapers", + text = stringResource(Res.string.streams_active_scrapers), style = MaterialTheme.typography.labelSmall.copy( fontSize = 12.sp, fontWeight = FontWeight.Medium, @@ -375,4 +382,3 @@ private fun ActiveScrapersStatusBlock( } } } - diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/tmdb/TmdbMetadataService.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/tmdb/TmdbMetadataService.kt index b59f9ad1..f398257f 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/tmdb/TmdbMetadataService.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/tmdb/TmdbMetadataService.kt @@ -14,10 +14,13 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString object TmdbMetadataService { private val log = Logger.withTag("TmdbMetadata") @@ -94,7 +97,7 @@ object TmdbMetadataService { val detail = PersonDetail( tmdbId = person.id ?: personId, - name = person.name ?: "Unknown", + name = person.name ?: runBlocking { getString(Res.string.generic_unknown) }, biography = biography, birthday = person.birthday?.takeIf { it.isNotBlank() }, deathday = person.deathday?.takeIf { it.isNotBlank() }, @@ -324,7 +327,7 @@ object TmdbMetadataService { header = header ?: TmdbEntityHeader( id = entityId, kind = entityKind, - name = fallbackName?.takeIf { it.isNotBlank() } ?: "Unknown", + name = fallbackName?.takeIf { it.isNotBlank() } ?: runBlocking { getString(Res.string.generic_unknown) }, logo = null, originCountry = null, secondaryLabel = null, @@ -439,7 +442,7 @@ object TmdbMetadataService { kind = entityKind, name = it.name?.takeIf { n -> n.isNotBlank() } ?: fallbackName?.takeIf { n -> n.isNotBlank() } - ?: "Unknown", + ?: runBlocking { getString(Res.string.generic_unknown) }, logo = buildImageUrl(it.logoPath, "w500"), originCountry = it.originCountry?.takeIf { c -> c.isNotBlank() }, secondaryLabel = it.headquarters?.takeIf { h -> h.isNotBlank() }, @@ -455,7 +458,7 @@ object TmdbMetadataService { kind = entityKind, name = it.name?.takeIf { n -> n.isNotBlank() } ?: fallbackName?.takeIf { n -> n.isNotBlank() } - ?: "Unknown", + ?: runBlocking { getString(Res.string.generic_unknown) }, logo = buildImageUrl(it.logoPath, "w500"), originCountry = it.originCountry?.takeIf { c -> c.isNotBlank() }, secondaryLabel = it.headquarters?.takeIf { h -> h.isNotBlank() }, @@ -1073,7 +1076,13 @@ object TmdbMetadataService { allVideos += videos.map { video -> video.toMetaTrailer( seasonNumber = seasonNumber, - displayName = "Season $seasonNumber - ${video.name}", + displayName = runBlocking { + getString( + Res.string.trailer_season_label, + seasonNumber, + video.name.orEmpty(), + ) + }, ) } } @@ -1087,7 +1096,9 @@ object TmdbMetadataService { trailer.site.equals("YouTube", ignoreCase = true) && trailer.key.isNotBlank() } .forEach { trailer -> - byCategory.getOrPut(trailer.type.ifBlank { "Trailer" }) { mutableListOf() } + byCategory.getOrPut( + trailer.type.ifBlank { runBlocking { getString(Res.string.generic_trailer) } }, + ) { mutableListOf() } .add(trailer) } @@ -1108,7 +1119,10 @@ object TmdbMetadataService { val sortedCategories = byCategory.keys.sortedWith( compareBy { category -> when { - category.equals("Trailer", ignoreCase = true) -> 0 + category.equals( + runBlocking { getString(Res.string.generic_trailer) }, + ignoreCase = true, + ) -> 0 byCategory[category].orEmpty().any { it.official } -> 1 else -> 2 } @@ -1231,7 +1245,7 @@ private fun buildPeople( val name = creator.name?.trim()?.takeIf(String::isNotBlank) ?: return@mapNotNull null MetaPerson( name = name, - role = "Creator", + role = runBlocking { getString(Res.string.person_role_creator) }, photo = buildImageUrl(creator.profilePath, "w500"), tmdbId = creator.id, ) @@ -1246,7 +1260,7 @@ private fun buildPeople( val name = crew.name?.trim()?.takeIf(String::isNotBlank) ?: return@mapNotNull null MetaPerson( name = name, - role = "Director", + role = runBlocking { getString(Res.string.person_role_director) }, photo = buildImageUrl(crew.profilePath, "w500"), tmdbId = crew.id, ) @@ -1261,7 +1275,7 @@ private fun buildPeople( val name = crew.name?.trim()?.takeIf(String::isNotBlank) ?: return@mapNotNull null MetaPerson( name = name, - role = "Writer", + role = runBlocking { getString(Res.string.person_role_writer) }, photo = buildImageUrl(crew.profilePath, "w500"), tmdbId = crew.id, ) @@ -1469,7 +1483,7 @@ private fun TmdbVideoResult.toMetaTrailer( displayName: String?, ): MetaTrailer { val videoKey = key?.trim().orEmpty() - val videoName = name?.trim().takeUnless { it.isNullOrBlank() } ?: "Trailer" + val videoName = name?.trim().takeUnless { it.isNullOrBlank() } ?: runBlocking { getString(Res.string.generic_trailer) } val trailerId = id?.trim().takeUnless { it.isNullOrBlank() } ?: videoKey return MetaTrailer( id = trailerId, @@ -1477,7 +1491,7 @@ private fun TmdbVideoResult.toMetaTrailer( name = videoName, site = site?.trim().takeUnless { it.isNullOrBlank() } ?: "YouTube", size = size, - type = type?.trim().takeUnless { it.isNullOrBlank() } ?: "Trailer", + type = type?.trim().takeUnless { it.isNullOrBlank() } ?: runBlocking { getString(Res.string.generic_trailer) }, official = official == true, publishedAt = publishedAt, seasonNumber = seasonNumber, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktAuthRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktAuthRepository.kt index db61d844..3fed8022 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktAuthRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktAuthRepository.kt @@ -19,6 +19,10 @@ import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import kotlin.random.Random +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString +import org.jetbrains.compose.resources.StringResource +import kotlinx.coroutines.runBlocking object TraktAuthRepository { private const val BASE_URL = "https://api.trakt.tv" @@ -67,7 +71,7 @@ object TraktAuthRepository { fun onConnectRequested(): String? { ensureLoaded() if (!hasRequiredCredentials()) { - publish(errorMessage = "Missing Trakt credentials") + publish(errorMessage = localizedString(Res.string.trakt_missing_credentials)) return null } @@ -78,7 +82,7 @@ object TraktAuthRepository { ) persist() publish( - statusMessage = "Complete Trakt sign in in your browser", + statusMessage = localizedString(Res.string.trakt_complete_sign_in_browser), errorMessage = null, ) @@ -183,7 +187,7 @@ object TraktAuthRepository { persist() publish( isLoading = false, - errorMessage = "Invalid Trakt callback", + errorMessage = localizedString(Res.string.trakt_invalid_callback), ) return } @@ -191,7 +195,7 @@ object TraktAuthRepository { val errorCode = parsedUrl.parameters["error"] if (!errorCode.isNullOrBlank()) { val errorDescription = parsedUrl.parameters["error_description"] - ?: "Authorization denied" + ?: localizedString(Res.string.trakt_authorization_denied) clearPendingAuthorization() persist() publish( @@ -207,7 +211,7 @@ object TraktAuthRepository { persist() publish( isLoading = false, - errorMessage = "Trakt did not return an authorization code", + errorMessage = localizedString(Res.string.trakt_missing_auth_code), ) return } @@ -219,7 +223,7 @@ object TraktAuthRepository { persist() publish( isLoading = false, - errorMessage = "Invalid Trakt callback state", + errorMessage = localizedString(Res.string.trakt_invalid_callback_state), ) return } @@ -251,7 +255,7 @@ object TraktAuthRepository { if (response == null) { clearPendingAuthorization() persist() - publish(isLoading = false, errorMessage = "Failed to complete Trakt sign in") + publish(isLoading = false, errorMessage = localizedString(Res.string.trakt_sign_in_complete_failed)) return } @@ -262,7 +266,7 @@ object TraktAuthRepository { if (parsed == null) { clearPendingAuthorization() persist() - publish(isLoading = false, errorMessage = "Invalid Trakt token response") + publish(isLoading = false, errorMessage = localizedString(Res.string.trakt_invalid_token_response)) return } @@ -490,3 +494,4 @@ private data class TraktUserDto( private data class TraktUserIdsDto( val slug: String? = null, ) + private fun localizedString(resource: StringResource): String = runBlocking { getString(resource) } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktCommentsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktCommentsRepository.kt index 33536361..378b8ef3 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktCommentsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktCommentsRepository.kt @@ -4,9 +4,12 @@ import co.touchlab.kermit.Logger import com.nuvio.app.features.addons.httpGetTextWithHeaders import com.nuvio.app.features.addons.httpRequestRaw import com.nuvio.app.features.details.MetaDetails +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.serialization.json.Json +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString private const val COMMENTS_SORT = "likes" private const val COMMENTS_LIMIT = 100 @@ -224,7 +227,7 @@ private fun toReviewModel(dto: TraktCommentDto): TraktCommentReview { val authorDisplayName = dto.user?.name ?.takeIf { it.isNotBlank() } ?: dto.user?.username?.takeIf { it.isNotBlank() } - ?: "Trakt user" + ?: runBlocking { getString(Res.string.trakt_user_fallback) } return TraktCommentReview( id = dto.id, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktLibraryRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktLibraryRepository.kt index c2100bc8..4e2468e8 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktLibraryRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktLibraryRepository.kt @@ -23,6 +23,8 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withLock +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString import kotlinx.coroutines.sync.withPermit import kotlinx.coroutines.selects.select import kotlinx.coroutines.withContext @@ -182,7 +184,7 @@ object TraktLibraryRepository { _uiState.value = current.copy( isLoading = false, hasLoaded = true, - errorMessage = "Failed to load Trakt library", + errorMessage = getString(Res.string.trakt_library_load_failed), ) return } @@ -487,7 +489,7 @@ object TraktLibraryRepository { val watchlistTabs = listOf( TraktListTab( key = WATCHLIST_KEY, - title = "Watchlist", + title = getString(Res.string.trakt_watchlist), type = TraktListType.WATCHLIST, ), ) @@ -629,7 +631,7 @@ object TraktLibraryRepository { val traktId = list.ids?.trakt ?: return@mapNotNull null TraktListTab( key = "$PERSONAL_LIST_PREFIX$traktId", - title = list.name?.ifBlank { null } ?: "List $traktId", + title = list.name?.ifBlank { null } ?: getString(Res.string.trakt_list_fallback_title, traktId), type = TraktListType.PERSONAL, traktListId = traktId, slug = list.ids.slug, @@ -934,4 +936,3 @@ private data class TraktListShowRequestItemDto( val year: Int? = null, val ids: TraktIdsDto? = null, ) - diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktProgressRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktProgressRepository.kt index b75022a6..6d10a78c 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktProgressRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktProgressRepository.kt @@ -23,6 +23,8 @@ import kotlinx.coroutines.withContext import kotlinx.coroutines.withTimeoutOrNull import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json @@ -93,7 +95,10 @@ object TraktProgressRepository { }.getOrNull() if (playbackEntries == null) { - _uiState.value = _uiState.value.copy(isLoading = false, errorMessage = "Failed to load Trakt progress") + _uiState.value = _uiState.value.copy( + isLoading = false, + errorMessage = getString(Res.string.trakt_progress_load_failed), + ) return } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/updater/AppUpdater.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/updater/AppUpdater.kt index 302e860e..44ce4441 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/updater/AppUpdater.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/updater/AppUpdater.kt @@ -36,6 +36,7 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.nuvio.app.core.build.AppFeaturePolicy import com.nuvio.app.core.build.AppVersionConfig +import com.nuvio.app.core.i18n.localizedByteUnit import com.nuvio.app.core.ui.NuvioToastController import com.nuvio.app.features.addons.httpRequestRaw import kotlinx.coroutines.CoroutineScope @@ -48,6 +49,9 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json +import nuvio.composeapp.generated.resources.* +import org.jetbrains.compose.resources.getString +import org.jetbrains.compose.resources.stringResource private const val gitHubOwner = "NuvioMedia" private const val gitHubRepo = "NuvioMobile" @@ -232,7 +236,9 @@ class AppUpdaterController internal constructor( fun checkForUpdates(force: Boolean, showNoUpdateFeedback: Boolean) { if (!AppFeaturePolicy.inAppUpdaterEnabled || !AppUpdaterPlatform.isSupported) { if (showNoUpdateFeedback) { - NuvioToastController.show("In-app updates are not available on this build.") + scope.launch { + NuvioToastController.show(getString(Res.string.updates_not_available)) + } } return } @@ -269,7 +275,7 @@ class AppUpdaterController internal constructor( } if (showNoUpdateFeedback && !remoteNewer) { - NuvioToastController.show("You're using the latest version.") + NuvioToastController.show(getString(Res.string.updates_latest_version)) } }.onFailure { error -> _uiState.update { state -> @@ -283,7 +289,7 @@ class AppUpdaterController internal constructor( showDialog = force && error !is NoChannelReleaseException, showUnknownSourcesDialog = false, errorMessage = if (force && error !is NoChannelReleaseException) { - error.message ?: "Update check failed" + error.message ?: getString(Res.string.updates_check_failed) } else { null }, @@ -291,7 +297,7 @@ class AppUpdaterController internal constructor( } if (showNoUpdateFeedback || error is NoChannelReleaseException) { - NuvioToastController.show(error.message ?: "Update check failed") + NuvioToastController.show(error.message ?: getString(Res.string.updates_check_failed)) } } } @@ -351,7 +357,7 @@ class AppUpdaterController internal constructor( isDownloading = false, downloadProgress = null, downloadedApkPath = null, - errorMessage = error.message ?: "Download failed", + errorMessage = error.message ?: getString(Res.string.updates_download_failed), showDialog = true, ) } @@ -369,11 +375,14 @@ class AppUpdaterController internal constructor( AppUpdaterPlatform.installDownloadedApk(apkPath).onSuccess { _uiState.update { state -> state.copy(showUnknownSourcesDialog = false) } }.onFailure { error -> - _uiState.update { state -> - state.copy( - errorMessage = error.message ?: "Unable to start installation", - showDialog = true, - ) + scope.launch { + val fallbackMessage = error.message ?: getString(Res.string.updates_install_failed) + _uiState.update { state -> + state.copy( + errorMessage = fallbackMessage, + showDialog = true, + ) + } } } } @@ -437,9 +446,9 @@ fun AppUpdaterHost( Column(verticalArrangement = Arrangement.spacedBy(6.dp)) { Text( text = when { - state.showUnknownSourcesDialog -> "Allow installs to continue" - state.isUpdateAvailable -> state.update?.title ?: "Update available" - else -> "Update status" + state.showUnknownSourcesDialog -> stringResource(Res.string.updates_title_allow_installs) + state.isUpdateAvailable -> state.update?.title ?: stringResource(Res.string.updates_title_available) + else -> stringResource(Res.string.updates_title_status) }, style = MaterialTheme.typography.headlineSmall, color = MaterialTheme.colorScheme.onSurface, @@ -449,10 +458,10 @@ fun AppUpdaterHost( ) Text( text = when { - state.showUnknownSourcesDialog -> "Enable app installs for Nuvio, then come back and continue." - state.isDownloading -> "Downloading update..." - state.isUpdateAvailable -> "A new version is ready to install." - else -> "No updates found." + state.showUnknownSourcesDialog -> stringResource(Res.string.updates_message_allow_installs) + state.isDownloading -> stringResource(Res.string.updates_message_downloading) + state.isUpdateAvailable -> stringResource(Res.string.updates_message_ready) + else -> stringResource(Res.string.updates_message_no_updates) }, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, @@ -492,7 +501,7 @@ fun AppUpdaterHost( fontWeight = FontWeight.SemiBold, ) val assetLine = update.assetSizeBytes?.let(::formatFileSize)?.let { size -> - "$size • ${update.assetName}" + stringResource(Res.string.updates_asset_line, size, update.assetName) } ?: update.assetName Text( text = assetLine, @@ -510,9 +519,12 @@ fun AppUpdaterHost( ) Text( text = if (state.downloadProgress != null) { - "Downloading ${((state.downloadProgress ?: 0f) * 100).toInt().coerceIn(0, 100)}%" + stringResource( + Res.string.updates_downloading_progress, + ((state.downloadProgress ?: 0f) * 100).toInt().coerceIn(0, 100), + ) } else { - "Preparing download" + stringResource(Res.string.updates_preparing_download) }, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, @@ -523,7 +535,7 @@ fun AppUpdaterHost( if (update.notes.isNotBlank()) { Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { Text( - text = "Release notes", + text = stringResource(Res.string.updates_release_notes), style = MaterialTheme.typography.titleSmall, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Medium, @@ -567,10 +579,10 @@ fun AppUpdaterHost( ) { Text( when { - state.showUnknownSourcesDialog -> "Continue" - state.downloadedApkPath != null -> "Install" - state.isDownloading -> "Downloading" - else -> "Update" + state.showUnknownSourcesDialog -> stringResource(Res.string.action_continue) + state.downloadedApkPath != null -> stringResource(Res.string.action_install) + state.isDownloading -> stringResource(Res.string.updates_message_downloading) + else -> stringResource(Res.string.action_update) }, ) } @@ -586,7 +598,7 @@ fun AppUpdaterHost( modifier = Modifier.weight(1f), onClick = controller::ignoreThisVersion, ) { - Text("Ignore") + Text(stringResource(Res.string.action_ignore)) } OutlinedButton( @@ -594,7 +606,13 @@ fun AppUpdaterHost( onClick = controller::dismissDialog, enabled = !state.isDownloading, ) { - Text(if (state.isDownloading) "Downloading" else "Later") + Text( + if (state.isDownloading) { + stringResource(Res.string.updates_message_downloading) + } else { + stringResource(Res.string.action_later) + }, + ) } } } else { @@ -603,7 +621,13 @@ fun AppUpdaterHost( onClick = controller::dismissDialog, enabled = !state.isDownloading, ) { - Text(if (state.isDownloading) "Downloading" else "Later") + Text( + if (state.isDownloading) { + stringResource(Res.string.updates_message_downloading) + } else { + stringResource(Res.string.action_later) + }, + ) } } } @@ -613,7 +637,7 @@ fun AppUpdaterHost( } private fun formatFileSize(sizeBytes: Long): String { - if (sizeBytes <= 0L) return "0 B" + if (sizeBytes <= 0L) return "0 ${localizedByteUnit("B")}" val units = listOf("B", "KB", "MB", "GB") var value = sizeBytes.toDouble() var unitIndex = 0 @@ -626,5 +650,5 @@ private fun formatFileSize(sizeBytes: Long): String { } else { ((value * 10).toInt() / 10.0).toString() } - return "$roundedValue ${units[unitIndex]}" -} \ No newline at end of file + return "$roundedValue ${localizedByteUnit(units[unitIndex])}" +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/domain/SeriesContinuity.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/domain/SeriesContinuity.kt index 8d117ba6..359eec29 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/domain/SeriesContinuity.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/domain/SeriesContinuity.kt @@ -1,5 +1,9 @@ package com.nuvio.app.features.watching.domain +import com.nuvio.app.core.i18n.localizedPlayLabel +import com.nuvio.app.core.i18n.localizedResumeLabel +import com.nuvio.app.core.i18n.localizedUpNextLabel + const val DefaultContinueWatchingLimit = 20 fun resumeProgressForSeries( @@ -130,25 +134,13 @@ fun buildPlaybackVideoId( } fun playLabel(seasonNumber: Int?, episodeNumber: Int?): String = - if (seasonNumber != null && episodeNumber != null) { - "Play S${seasonNumber}E${episodeNumber}" - } else { - "Play" - } + localizedPlayLabel(seasonNumber = seasonNumber, episodeNumber = episodeNumber) fun upNextLabel(seasonNumber: Int?, episodeNumber: Int?): String = - if (seasonNumber != null && episodeNumber != null) { - "Up Next S${seasonNumber}E${episodeNumber}" - } else { - "Up Next" - } + localizedUpNextLabel(seasonNumber = seasonNumber, episodeNumber = episodeNumber) fun resumeLabel(seasonNumber: Int?, episodeNumber: Int?): String = - if (seasonNumber != null && episodeNumber != null) { - "Resume S${seasonNumber}E${episodeNumber}" - } else { - "Resume" - } + localizedResumeLabel(seasonNumber = seasonNumber, episodeNumber = episodeNumber) private fun WatchingProgressRecord.toResumeAction(): WatchingSeriesPrimaryAction = WatchingSeriesPrimaryAction( diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressModels.kt index 5a678bdc..5f4157b0 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressModels.kt @@ -185,27 +185,12 @@ internal fun WatchProgressEntry.toContinueWatchingItem(): ContinueWatchingItem { ?.takeIf { durationMs <= 0L && it > 0f } ?.let { explicitPercent -> (explicitPercent / 100f).coerceIn(0f, 1f) } - val subtitle = if (normalizedEntry.seasonNumber != null && normalizedEntry.episodeNumber != null) { - buildString { - append("S") - append(normalizedEntry.seasonNumber) - append("E") - append(normalizedEntry.episodeNumber) - normalizedEntry.episodeTitle?.takeIf { it.isNotBlank() }?.let { - append(" • ") - append(it) - } - } - } else { - "Movie" - } - return ContinueWatchingItem( parentMetaId = normalizedEntry.parentMetaId, parentMetaType = normalizedEntry.parentMetaType, videoId = normalizedEntry.videoId, title = normalizedEntry.title, - subtitle = subtitle, + subtitle = normalizedEntry.episodeTitle.orEmpty(), imageUrl = normalizedEntry.episodeThumbnail ?: normalizedEntry.background ?: normalizedEntry.poster, logo = normalizedEntry.logo, poster = normalizedEntry.poster, @@ -228,20 +213,6 @@ internal fun WatchProgressEntry.toContinueWatchingItem(): ContinueWatchingItem { internal fun WatchProgressEntry.toUpNextContinueWatchingItem( nextEpisode: MetaVideo, ): ContinueWatchingItem { - val subtitle = buildString { - append("Up Next") - if (nextEpisode.season != null && nextEpisode.episode != null) { - append(" • S") - append(nextEpisode.season) - append("E") - append(nextEpisode.episode) - } - nextEpisode.title.takeIf { it.isNotBlank() }?.let { - append(" • ") - append(it) - } - } - return ContinueWatchingItem( parentMetaId = parentMetaId, parentMetaType = parentMetaType, @@ -252,7 +223,7 @@ internal fun WatchProgressEntry.toUpNextContinueWatchingItem( fallbackVideoId = nextEpisode.id, ), title = title, - subtitle = subtitle, + subtitle = nextEpisode.title, imageUrl = nextEpisode.thumbnail ?: episodeThumbnail ?: background ?: poster, logo = logo, poster = poster, diff --git a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt index 4b2c78dc..cf91655b 100644 --- a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt +++ b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt @@ -13,7 +13,8 @@ import platform.Foundation.NSUserDefaults actual object ThemeSettingsStorage { private const val selectedThemeKey = "selected_theme" private const val amoledEnabledKey = "amoled_enabled" - private val syncKeys = listOf(selectedThemeKey, amoledEnabledKey) + private const val selectedAppLanguageKey = "selected_app_language" + private val syncKeys = listOf(selectedThemeKey, amoledEnabledKey, selectedAppLanguageKey) actual fun loadSelectedTheme(): String? = NSUserDefaults.standardUserDefaults.stringForKey(ProfileScopedKey.of(selectedThemeKey)) @@ -36,9 +37,19 @@ actual object ThemeSettingsStorage { NSUserDefaults.standardUserDefaults.setBool(enabled, forKey = ProfileScopedKey.of(amoledEnabledKey)) } + actual fun loadSelectedAppLanguage(): String? = + NSUserDefaults.standardUserDefaults.stringForKey(ProfileScopedKey.of(selectedAppLanguageKey)) + + actual fun saveSelectedAppLanguage(languageCode: String) { + NSUserDefaults.standardUserDefaults.setObject(languageCode, forKey = ProfileScopedKey.of(selectedAppLanguageKey)) + } + + actual fun applySelectedAppLanguage(languageCode: String) = Unit + actual fun exportToSyncPayload(): JsonObject = buildJsonObject { loadSelectedTheme()?.let { put(selectedThemeKey, encodeSyncString(it)) } loadAmoledEnabled()?.let { put(amoledEnabledKey, encodeSyncBoolean(it)) } + loadSelectedAppLanguage()?.let { put(selectedAppLanguageKey, encodeSyncString(it)) } } actual fun replaceFromSyncPayload(payload: JsonObject) { @@ -48,5 +59,6 @@ actual object ThemeSettingsStorage { payload.decodeSyncString(selectedThemeKey)?.let(::saveSelectedTheme) payload.decodeSyncBoolean(amoledEnabledKey)?.let(::saveAmoledEnabled) + payload.decodeSyncString(selectedAppLanguageKey)?.let(::saveSelectedAppLanguage) } } From 84a4771f67f131f0d5cebedfaccd1b452adacb33 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sat, 25 Apr 2026 08:01:31 +0530 Subject: [PATCH 020/143] feat: collection preserving to prevent overwriting unsupported fields in blobs --- .../collection/CollectionJsonPreserver.kt | 114 +++++++++++++++++ .../collection/CollectionRepository.kt | 21 +++- .../collection/CollectionSyncService.kt | 2 +- .../app/features/player/PlayerSourcesPanel.kt | 119 ++++++++++++------ 4 files changed, 215 insertions(+), 41 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionJsonPreserver.kt diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionJsonPreserver.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionJsonPreserver.kt new file mode 100644 index 00000000..f7da122a --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionJsonPreserver.kt @@ -0,0 +1,114 @@ +package com.nuvio.app.features.collection + +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.buildJsonArray +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.contentOrNull +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive + +internal object CollectionJsonPreserver { + fun merge( + json: Json, + rawCollectionsJson: JsonElement, + collections: List, + ): JsonArray { + val rawById = rawCollectionsJson.asObjectArrayById() + return buildJsonArray { + collections.forEach { collection -> + add( + mergeCollection( + json = json, + raw = rawById[collection.id], + collection = collection, + ), + ) + } + } + } + + private fun mergeCollection( + json: Json, + raw: JsonObject?, + collection: Collection, + ): JsonObject { + val encoded = json.encodeToJsonElement(Collection.serializer(), collection).jsonObject + val rawFoldersById = raw?.get("folders").asObjectArrayById() + val mergedFolders = buildJsonArray { + collection.folders.forEach { folder -> + add( + mergeFolder( + json = json, + raw = rawFoldersById[folder.id], + folder = folder, + ), + ) + } + } + return mergeObjects(raw, encoded, mapOf("folders" to mergedFolders)) + } + + private fun mergeFolder( + json: Json, + raw: JsonObject?, + folder: CollectionFolder, + ): JsonObject { + val encoded = json.encodeToJsonElement(CollectionFolder.serializer(), folder).jsonObject + val rawSourcesByKey = raw?.get("catalogSources").asObjectArrayByKey(::sourceKey) + val mergedSources = buildJsonArray { + folder.catalogSources.forEach { source -> + val sourceElement = + json.encodeToJsonElement(CollectionCatalogSource.serializer(), source) + add( + mergeSource( + json = json, + raw = rawSourcesByKey[sourceKey(sourceElement)], + source = source, + ), + ) + } + } + return mergeObjects(raw, encoded, mapOf("catalogSources" to mergedSources)) + } + + private fun mergeSource( + json: Json, + raw: JsonObject?, + source: CollectionCatalogSource, + ): JsonObject { + val encoded = json.encodeToJsonElement(CollectionCatalogSource.serializer(), source).jsonObject + return mergeObjects(raw, encoded) + } + + private fun mergeObjects( + raw: JsonObject?, + encoded: JsonObject, + overrides: Map = emptyMap(), + ): JsonObject = buildJsonObject { + raw?.forEach { (key, value) -> put(key, value) } + encoded.forEach { (key, value) -> put(key, overrides[key] ?: value) } + } + + private fun JsonElement?.asObjectArrayById(): Map = + asObjectArrayByKey { obj -> obj["id"]?.jsonPrimitive?.contentOrNull } + + private fun JsonElement?.asObjectArrayByKey(keySelector: (JsonObject) -> String?): Map = + (this as? JsonArray) + ?.mapNotNull { element -> + val obj = element as? JsonObject ?: return@mapNotNull null + keySelector(obj)?.let { key -> key to obj } + } + ?.toMap() + .orEmpty() + + private fun sourceKey(element: JsonElement): String? { + val obj = element as? JsonObject ?: return null + val addonId = obj["addonId"]?.jsonPrimitive?.contentOrNull ?: return null + val type = obj["type"]?.jsonPrimitive?.contentOrNull ?: return null + val catalogId = obj["catalogId"]?.jsonPrimitive?.contentOrNull ?: return null + return "$addonId|$type|$catalogId" + } +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt index 7d9f5abd..860f97d5 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt @@ -10,6 +10,8 @@ import kotlinx.coroutines.runBlocking import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonElement import nuvio.composeapp.generated.resources.Res import nuvio.composeapp.generated.resources.collections_import_error_collection_blank_id import nuvio.composeapp.generated.resources.collections_import_error_collection_blank_title @@ -31,6 +33,7 @@ object CollectionRepository { private val _collections = MutableStateFlow>(emptyList()) val collections: StateFlow> = _collections.asStateFlow() + private var rawCollectionsJson: JsonElement = JsonArray(emptyList()) private var hasLoaded = false @@ -41,6 +44,8 @@ object CollectionRepository { if (payload.isNullOrBlank()) return runCatching { + val parsed = json.parseToJsonElement(payload) + rawCollectionsJson = parsed _collections.value = json.decodeFromString>(payload) }.onFailure { e -> log.e(e) { "Failed to load collections from storage" } @@ -50,11 +55,13 @@ object CollectionRepository { fun onProfileChanged() { hasLoaded = false _collections.value = emptyList() + rawCollectionsJson = JsonArray(emptyList()) } fun clearLocalState() { hasLoaded = false _collections.value = emptyList() + rawCollectionsJson = JsonArray(emptyList()) } fun getCollection(id: String): Collection? = @@ -81,6 +88,7 @@ object CollectionRepository { } fun setCollections(collections: List) { + ensureLoaded() _collections.value = collections persist() } @@ -106,11 +114,12 @@ object CollectionRepository { fun exportToJson(): String { ensureLoaded() - return json.encodeToString(_collections.value) + return mergedCollectionsJson().toString() } fun importFromJson(jsonString: String): Result> { return runCatching { + rawCollectionsJson = json.parseToJsonElement(jsonString) val imported = json.decodeFromString>(jsonString) _collections.value = imported persist() @@ -228,7 +237,8 @@ object CollectionRepository { } } - internal fun applyFromRemote(collections: List) { + internal fun applyFromRemote(collections: List, rawJson: JsonElement) { + rawCollectionsJson = rawJson _collections.value = collections persist() } @@ -239,9 +249,14 @@ object CollectionRepository { private fun persist() { runCatching { - CollectionStorage.savePayload(json.encodeToString(_collections.value)) + CollectionStorage.savePayload(mergedCollectionsJson().toString()) }.onFailure { e -> log.e(e) { "Failed to persist collections" } } } + + private fun mergedCollectionsJson(): JsonArray = + CollectionJsonPreserver.merge(json, rawCollectionsJson, _collections.value).also { + rawCollectionsJson = it + } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionSyncService.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionSyncService.kt index aced9be6..1ec14547 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionSyncService.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionSyncService.kt @@ -80,7 +80,7 @@ object CollectionSyncService { if (remoteCollections != null) { isSyncingFromRemote = true - CollectionRepository.applyFromRemote(remoteCollections) + CollectionRepository.applyFromRemote(remoteCollections, blob.collectionsJson) isSyncingFromRemote = false log.i { "pullFromServer — applied ${remoteCollections.size} collections from remote" } } else { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSourcesPanel.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSourcesPanel.kt index 9d54dfd1..9e64a911 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSourcesPanel.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSourcesPanel.kt @@ -22,14 +22,14 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.rounded.Check import androidx.compose.material.icons.rounded.Refresh import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Icon @@ -40,14 +40,17 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.nuvio.app.core.i18n.localizedByteUnit import com.nuvio.app.features.streams.StreamItem import com.nuvio.app.features.streams.StreamsUiState +import kotlin.math.round import nuvio.composeapp.generated.resources.* import org.jetbrains.compose.resources.stringResource @@ -230,24 +233,32 @@ private fun SourceStreamRow( onClick: () -> Unit, ) { val colorScheme = MaterialTheme.colorScheme + val cardShape = RoundedCornerShape(12.dp) Row( modifier = Modifier .fillMaxWidth() - .clip(RoundedCornerShape(12.dp)) + .heightIn(min = 68.dp) + .shadow( + elevation = 2.dp, + shape = cardShape, + ambientColor = Color.Black.copy(alpha = 0.04f), + spotColor = Color.Black.copy(alpha = 0.04f), + ) + .clip(cardShape) .background( - if (isCurrent) colorScheme.primaryContainer.copy(alpha = 0.55f) else Color.Transparent, + if (isCurrent) colorScheme.primaryContainer.copy(alpha = 0.4f) else Color.White.copy(alpha = 0.05f), ) .then( if (isCurrent) { - Modifier.border(1.dp, colorScheme.primary.copy(alpha = 0.45f), RoundedCornerShape(12.dp)) + Modifier.border(1.dp, colorScheme.primary.copy(alpha = 0.45f), cardShape) } else { Modifier }, ) .clickable(onClick = onClick) - .padding(horizontal = 16.dp, vertical = 12.dp), - verticalAlignment = Alignment.CenterVertically, + .padding(14.dp), + verticalAlignment = Alignment.Top, horizontalArrangement = Arrangement.spacedBy(12.dp), ) { Column(modifier = Modifier.weight(1f)) { @@ -258,11 +269,13 @@ private fun SourceStreamRow( Text( text = stream.streamLabel, color = colorScheme.onSurface, - fontSize = 14.sp, - fontWeight = FontWeight.Medium, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - modifier = Modifier.weight(1f, fill = false), + style = MaterialTheme.typography.bodyMedium.copy( + fontSize = 14.sp, + fontWeight = FontWeight.Bold, + lineHeight = 20.sp, + letterSpacing = 0.1.sp, + ), + modifier = Modifier.weight(1f), ) if (isCurrent) { Box( @@ -280,34 +293,66 @@ private fun SourceStreamRow( } } } - stream.streamSubtitle?.let { subtitle -> - if (subtitle != stream.streamLabel) { - Text( - text = subtitle, - color = colorScheme.onSurfaceVariant, + + val subtitle = stream.streamSubtitle + if (!subtitle.isNullOrBlank() && subtitle != stream.streamLabel) { + Spacer(modifier = Modifier.height(2.dp)) + Text( + text = subtitle, + style = MaterialTheme.typography.bodySmall.copy( fontSize = 12.sp, - maxLines = 2, - overflow = TextOverflow.Ellipsis, - ) - } + lineHeight = 18.sp, + ), + color = colorScheme.onSurfaceVariant, + ) } - Text( - text = stream.addonName, - color = colorScheme.onSurfaceVariant, + + Spacer(modifier = Modifier.height(6.dp)) + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + PlayerStreamFileSizeBadge(stream = stream) + Text( + text = stream.addonName, + color = colorScheme.onSurfaceVariant, + fontSize = 11.sp, + fontStyle = FontStyle.Italic, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + } + } +} + +@Composable +private fun PlayerStreamFileSizeBadge(stream: StreamItem) { + val bytes = stream.behaviorHints.videoSize ?: return + val gib = bytes.toDouble() / (1024.0 * 1024.0 * 1024.0) + val sizeLabel = if (gib >= 1.0) { + val roundedGiB = round(gib * 10.0) / 10.0 + "$roundedGiB ${localizedByteUnit("GB")}" + } else { + val mib = bytes.toDouble() / (1024.0 * 1024.0) + "${round(mib).toInt()} ${localizedByteUnit("MB")}" + } + + Box( + modifier = Modifier + .clip(RoundedCornerShape(12.dp)) + .background(Color(0xFF0A0C0C)) + .padding(horizontal = 8.dp, vertical = 3.dp), + ) { + Text( + text = stringResource(Res.string.streams_size, sizeLabel), + style = MaterialTheme.typography.labelSmall.copy( fontSize = 11.sp, - fontStyle = FontStyle.Italic, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - } - if (isCurrent) { - Icon( - imageVector = Icons.Rounded.Check, - contentDescription = stringResource(Res.string.compose_player_currently_playing), - tint = colorScheme.primary, - modifier = Modifier.size(20.dp), - ) - } + fontWeight = FontWeight.SemiBold, + letterSpacing = 0.2.sp, + ), + color = Color.White, + ) } } From 99d821e7db63feda36bb7c2bc47191abc32a5f51 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sat, 25 Apr 2026 12:14:23 +0530 Subject: [PATCH 021/143] feat: update contributions api --- composeApp/build.gradle.kts | 1 + .../settings/SupportersContributorsPage.kt | 212 ++++-------------- iosApp/Configuration/Version.xcconfig | 4 +- 3 files changed, 42 insertions(+), 175 deletions(-) diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 51f0d145..5136bd9c 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -97,6 +97,7 @@ abstract class GenerateRuntimeConfigsTask : DefaultTask() { |package com.nuvio.app.features.settings | |object CommunityConfig { + | const val CONTRIBUTIONS_URL = "${props.getProperty("CONTRIBUTIONS_URL", "")}" | const val DONATIONS_BASE_URL = "${props.getProperty("DONATIONS_BASE_URL", "")}" | const val DONATIONS_DONATE_URL = "${props.getProperty("DONATIONS_DONATE_URL", "")}" |} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SupportersContributorsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SupportersContributorsPage.kt index ce25497f..3b3f8056 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SupportersContributorsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/SupportersContributorsPage.kt @@ -54,10 +54,7 @@ import com.nuvio.app.core.ui.NuvioScreen import com.nuvio.app.core.ui.NuvioScreenHeader import com.nuvio.app.core.ui.NuvioSurfaceCard import com.nuvio.app.features.addons.httpRequestRaw -import kotlinx.coroutines.async -import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch -import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json @@ -83,12 +80,16 @@ private data class CommunityUiState( ) @Serializable -private data class GitHubContributorDto( - val login: String? = null, - @SerialName("avatar_url") val avatarUrl: String? = null, - @SerialName("html_url") val htmlUrl: String? = null, - val contributions: Int? = null, - val type: String? = null, +private data class ContributionsResponseDto( + val contributors: List = emptyList(), +) + +@Serializable +private data class ContributionDto( + val name: String? = null, + val avatar: String? = null, + val profile: String? = null, + val total: Int? = null, ) @Serializable @@ -108,9 +109,6 @@ internal data class CommunityContributor( val avatarUrl: String?, val profileUrl: String?, val totalContributions: Int, - val mobileContributions: Int, - val tvContributions: Int, - val webContributions: Int, ) internal data class SupporterDonation( @@ -122,39 +120,31 @@ internal data class SupporterDonation( ) private object SupportersContributorsRepository { - private const val gitHubOwner = "nuviomedia" - private const val mobileRepository = "nuviomobile" - private const val tvRepository = "nuviotv" - private const val webRepository = "nuvioweb" - private const val gitHubApiBase = "https://api.github.com" - private val json = Json { ignoreUnknownKeys = true; isLenient = true } suspend fun getContributors(): Result> = runCatching { - coroutineScope { - val mobileDeferred = async { fetchRepoContributors(mobileRepository) } - val tvDeferred = async { fetchRepoContributors(tvRepository) } - val webDeferred = async { fetchRepoContributors(webRepository) } - - val mobileResult = mobileDeferred.await() - val tvResult = tvDeferred.await() - val webResult = webDeferred.await() - - if (mobileResult.isFailure && tvResult.isFailure && webResult.isFailure) { - throw ( - mobileResult.exceptionOrNull() - ?: tvResult.exceptionOrNull() - ?: webResult.exceptionOrNull() - ?: IllegalStateException(getString(Res.string.community_error_unable_load_contributors)) - ) - } - - mergeContributors( - mobileContributors = mobileResult.getOrDefault(emptyList()), - tvContributors = tvResult.getOrDefault(emptyList()), - webContributors = webResult.getOrDefault(emptyList()), - ) + val contributionsUrl = CommunityConfig.CONTRIBUTIONS_URL.trim() + check(contributionsUrl.isNotBlank()) { + getString(Res.string.community_error_unable_load_contributors) } + + val response = httpRequestRaw( + method = "GET", + url = contributionsUrl, + headers = emptyMap(), + body = "", + ) + if (response.status !in 200..299) { + error(getString(Res.string.community_error_contributors_request_failed)) + } + + json.decodeFromString(response.body) + .contributors + .mapNotNull(::normalizeContributor) + .sortedWith( + compareByDescending { it.totalContributions } + .thenBy { it.login.lowercase() }, + ) } suspend fun getSupporters(limit: Int = 200): Result> = runCatching { @@ -194,127 +184,19 @@ private object SupportersContributorsRepository { } } - private suspend fun fetchRepoContributors(repo: String): Result> = runCatching { - val contributors = mutableListOf() - var nextUrl: String? = "$gitHubApiBase/repos/$gitHubOwner/$repo/contributors?per_page=100" - - while (nextUrl != null) { - val response = httpRequestRaw( - method = "GET", - url = nextUrl, - headers = mapOf( - "Accept" to "application/vnd.github+json", - "User-Agent" to "NuvioMobile", - ), - body = "", - ) - if (response.status !in 200..299) { - error(getString(Res.string.community_error_contributors_request_failed)) - } - - contributors += json.decodeFromString>(response.body) - nextUrl = response.headers.entries - .firstOrNull { it.key.equals("link", ignoreCase = true) } - ?.value - ?.let(::parseNextLink) - } - - contributors - } - - private fun mergeContributors( - mobileContributors: List, - tvContributors: List, - webContributors: List, - ): List { - val contributorsByLogin = linkedMapOf() - - mobileContributors.forEach { dto -> - normalizeContributor(dto)?.let { contributor -> - val entry = contributorsByLogin.getOrPut(contributor.login.lowercase()) { - MutableCommunityContributor( - login = contributor.login, - avatarUrl = contributor.avatarUrl, - profileUrl = contributor.htmlUrl, - ) - } - entry.avatarUrl = entry.avatarUrl ?: contributor.avatarUrl - entry.profileUrl = entry.profileUrl ?: contributor.htmlUrl - entry.mobileContributions += contributor.contributions - } - } - - tvContributors.forEach { dto -> - normalizeContributor(dto)?.let { contributor -> - val entry = contributorsByLogin.getOrPut(contributor.login.lowercase()) { - MutableCommunityContributor( - login = contributor.login, - avatarUrl = contributor.avatarUrl, - profileUrl = contributor.htmlUrl, - ) - } - entry.avatarUrl = entry.avatarUrl ?: contributor.avatarUrl - entry.profileUrl = entry.profileUrl ?: contributor.htmlUrl - entry.tvContributions += contributor.contributions - } - } - - webContributors.forEach { dto -> - normalizeContributor(dto)?.let { contributor -> - val entry = contributorsByLogin.getOrPut(contributor.login.lowercase()) { - MutableCommunityContributor( - login = contributor.login, - avatarUrl = contributor.avatarUrl, - profileUrl = contributor.htmlUrl, - ) - } - entry.avatarUrl = entry.avatarUrl ?: contributor.avatarUrl - entry.profileUrl = entry.profileUrl ?: contributor.htmlUrl - entry.webContributions += contributor.contributions - } - } - - return contributorsByLogin.values - .map { contributor -> - CommunityContributor( - login = contributor.login, - avatarUrl = contributor.avatarUrl, - profileUrl = contributor.profileUrl, - totalContributions = contributor.mobileContributions + contributor.tvContributions + contributor.webContributions, - mobileContributions = contributor.mobileContributions, - tvContributions = contributor.tvContributions, - webContributions = contributor.webContributions, - ) - } - .sortedWith( - compareByDescending { it.totalContributions } - .thenBy { it.login.lowercase() }, - ) - } - - private fun normalizeContributor(dto: GitHubContributorDto): NormalizedContributor? { - val login = dto.login?.trim().orEmpty() - val contributions = dto.contributions ?: 0 - val type = dto.type?.trim() + private fun normalizeContributor(dto: ContributionDto): CommunityContributor? { + val login = dto.name?.trim().orEmpty() + val contributions = dto.total ?: 0 if (login.isBlank() || contributions <= 0) return null - if (type != null && !type.equals("User", ignoreCase = true)) return null - return NormalizedContributor( + return CommunityContributor( login = login, - avatarUrl = dto.avatarUrl?.trim()?.takeIf { it.isNotBlank() }, - htmlUrl = dto.htmlUrl?.trim()?.takeIf { it.isNotBlank() }, - contributions = contributions, + avatarUrl = dto.avatar?.trim()?.takeIf { it.isNotBlank() }, + profileUrl = dto.profile?.trim()?.takeIf { it.isNotBlank() }, + totalContributions = contributions, ) } - private fun parseNextLink(linkHeader: String): String? = - linkHeader.split(',') - .map(String::trim) - .firstOrNull { it.contains("rel=\"next\"") } - ?.substringAfter('<') - ?.substringBefore('>') - ?.takeIf { it.isNotBlank() } - private fun supporterSortTimestamp(rawDate: String): Long { val datePart = rawDate.substringBefore('T') val parts = datePart.split('-') @@ -324,22 +206,6 @@ private object SupportersContributorsRepository { val day = parts[2].toLongOrNull() ?: return Long.MIN_VALUE return year * 10_000L + month * 100L + day } - - private data class NormalizedContributor( - val login: String, - val avatarUrl: String?, - val htmlUrl: String?, - val contributions: Int, - ) - - private data class MutableCommunityContributor( - val login: String, - var avatarUrl: String?, - var profileUrl: String?, - var mobileContributions: Int = 0, - var tvContributions: Int = 0, - var webContributions: Int = 0, - ) } @Composable @@ -656,7 +522,7 @@ private fun ContributorsCard( ) { items( items = contributors, - key = { contributor -> contributor.login.lowercase() }, + key = { contributor -> "${contributor.login.lowercase()}-${contributor.profileUrl.orEmpty()}" }, ) { contributor -> ContributorRow( contributor = contributor, diff --git a/iosApp/Configuration/Version.xcconfig b/iosApp/Configuration/Version.xcconfig index a8260160..9f8d477b 100644 --- a/iosApp/Configuration/Version.xcconfig +++ b/iosApp/Configuration/Version.xcconfig @@ -1,3 +1,3 @@ -CURRENT_PROJECT_VERSION=38 -MARKETING_VERSION=0.1.7 +CURRENT_PROJECT_VERSION=40 +MARKETING_VERSION=0.1.9 From 0774e31e9cd90d1c57cce80b20c1670dedb5697d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?HAL=C4=B0L=20=C4=B0BRAH=C4=B0M=20=C3=96ZDEM=C4=B0R?= <94225244+halibiram@users.noreply.github.com> Date: Sat, 25 Apr 2026 13:44:01 +0300 Subject: [PATCH 022/143] Add Turkish language translation --- .../src/androidMain/res/xml/locale_config.xml | 1 + .../composeResources/values-tr/strings.xml | 1044 +++++++++++++++++ .../app/features/settings/AppLanguage.kt | 2 + 3 files changed, 1047 insertions(+) create mode 100644 composeApp/src/commonMain/composeResources/values-tr/strings.xml diff --git a/composeApp/src/androidMain/res/xml/locale_config.xml b/composeApp/src/androidMain/res/xml/locale_config.xml index 98f6f9a3..18506985 100644 --- a/composeApp/src/androidMain/res/xml/locale_config.xml +++ b/composeApp/src/androidMain/res/xml/locale_config.xml @@ -2,4 +2,5 @@ + diff --git a/composeApp/src/commonMain/composeResources/values-tr/strings.xml b/composeApp/src/commonMain/composeResources/values-tr/strings.xml new file mode 100644 index 00000000..c49515aa --- /dev/null +++ b/composeApp/src/commonMain/composeResources/values-tr/strings.xml @@ -0,0 +1,1044 @@ + + Açık teşekkürler ve proje katkıları + Geri + Vazgeç + Kapat + Sil + Tamam + Düzenle + İçe aktar + Sonraki + Tamam + Oynat + Önceki + Kaldır + Sırala + Sıfırla + Devam et + Tekrar dene + Kaydet + Kuruluyor + Eklentiler + Aktif + %1$d katalog + Ayarlanabilir + Yenileniyor + %1$d kaynak + Kullanılamıyor + Eklentiyi ayarla + Eklentiyi sil + Nuvio\'ya katalog, meta veri, yayın veya altyazı yüklemeye başlamak için bir manifest URL\'si ekle. + Henüz eklenti kurulmamış. + Bir eklenti URL\'si gir. + Eklenti URL\'si + Eklentiyi kur + Manifest detayları yükleniyor... + Kurulumdan önce manifest URL\'si doğrulanıyor ve eklenti detayları yükleniyor. + Eklenti kontrol ediliyor + Kurulum olmadı + %1$s doğrulandı ve başarıyla eklendi. + Eklenti kuruldu + Eklentiyi aşağı taşı + Eklentiyi yukarı taşı + Aktif + Eklentiler + Kataloglar + Eklentiyi yenile + Eklenti ekle + Kurulu eklentiler + Özet + %1$d kimlik kuralı + Sürüm %1$s + Seçili + JSON\'u kopyala + %1$d koleksiyon, %2$d klasör + "%1$s" silinsin mi? Bu işlem geri alınamaz. + Koleksiyonu sil + Katalog ekle + Klasör ekle + Tüm türler + Bu klasörde ne görüneceğini belirlemek için kurulu eklentilerinden kataloglar ekle. + Henüz katalog kaynağı yok + Seç + Emoji + Görsel URL\'si + Yok + Kapak + Koleksiyon oluştur + Tamam + Koleksiyonu düzenle + Klasörü düzenle + Klasör kimliğini, görünümünü ve katalog kaynaklarını ana koleksiyon düzenleyiciyle aynı yapıda ayarla. + Başlamak için bir tane ekle. + Henüz klasör yok + Klasörler + Tür filtresi + Sadece kapak görselini göster + Başlığı gizle + Yeni klasör + Bu koleksiyonu ana sayfadaki normal katalogların üstünde göster. Birden fazla sabit koleksiyon, oluşturulma sırasına göre dizilir. + Katalogların üstüne sabitle + Arka plan görseli URL\'si (isteğe bağlı) + Klasör adı + Animasyonlu GIF URL\'si (yalnızca odaktayken oynar) + Koleksiyon adı + Değişiklikleri kaydet + Kaydet + Görünüm + Temel bilgiler + Katalog kaynakları + Bu klasörün toplayacağı eklenti kataloglarını seç. + Katalogları seç + Tür seç + Poster + Kare + Geniş + Tüm katalogları tek sekmede birleştir + "Tümü" sekmesini göster + Varsa statik kapak yerine ayarlanan GIF\'i oynat. + Ayarlanmışsa GIF\'i göster + %1$d kaynak · %2$s + Kart şekli + Satırlar + Sekmeler + Görünüm modu + Kataloglarını düzenlemek için bir tane oluştur. + Henüz koleksiyon yok + %1$d klasör + Hiçbir şey bulunamadı + Klasör bulunamadı + Koleksiyonlar + Koleksiyonları içe aktar + JSON + Koleksiyon JSON\'unu aşağıya yapıştır. + İçe aktar + Yeni koleksiyon + Sabitlendi + Tümü + Koleksiyonların + Tapframe ve arkadaşları tarafından ❤️ ile yapıldı + Sürüm %1$s (%2$s) + Kapalı + Açık + Duraklat + Yenile + Zaten hesabın var mı? + Hesapsız devam et + Hesap oluştur + Hesabın yok mu? + E-posta + veya + Şifre + Kitaplığına ve izleme ilerlemene ulaşmak için giriş yap + Giriş yap + Verilerini cihazlar arasında eşitlemek için kayıt ol + Kayıt ol + Verilerin sadece bu cihazda saklanacak + Her şeyi, her yerde izle + Tekrar hoş geldin + Kitaplık + Trakt kitaplığı + Ana sayfa + Kitaplık + Profil + Ara + Ses parçaları + Ses + Yerleşik + Alt boşluk + Oynatıcıyı kapat + Renk + Şu an oynatılıyor + B%1$d + S%1$dB%2$d + S%1$dB%2$d • %3$s + Bölümler + Yazı boyutu + %1$dsp + Oynatıcı kontrollerini kilitle + Kullanılabilir ses parçası yok + Kullanılabilir bölüm yok + Yayın bulunamadı + Yok + Çerçeve + Bölümler + Kaynaklar + Yayınlar + Oynatma hatası + Oynatılıyor + Altyazıları almak için dokun + Geri dön + Varsayılanlara dön + Doldur + Sığdır + Yakınlaştır + 10 saniye geri sar + -%1$dsn + +%1$dsn + -%1$dsn + +%1$dsn + 10 saniye ileri sar + Kaynaklar + Stil + Altyazı + Altyazılar + Parlaklık %1$d%% + Ses %1$d%% + Sessizde + İndirildi + Yayınlanma + Duyurulacak + Kilidi açmak için dokun + Parça %1$d + Oynatıcı kontrollerinin kilidini aç + Şunu izliyorsun + Profil ekle + Aramayı temizle + Keşfet + Kurulu eklentiler geçerli arama sonucu döndürmedi. + Arama olmadı + Arama yapmadan önce en az bir eklenti kurup doğrula. + Aktif eklenti yok + Aranabilir kataloglar bu arama için sonuç döndürmedi. + Sonuç bulunamadı + Kurulu eklentilerin katalog araması sunmuyor. + Aranabilir katalog yok + Film, dizi ara... + Son aramalar + Son aramayı kaldır + Hakkında + Genel + Hesap + Eklentiler + Görünüm + İçerik & Keşif + İzlemeye devam + Ana ekran + Entegrasyonlar + MDBList puanları + Detay ekranı + Bildirimler + Oynatma + Pluginler + Poster özelleştirme + Ayarlar + Destekçiler & Katkıda Bulunanlar + TMDB zenginleştirme + Trakt + HAKKINDA + Hesabını yönet, çıkış yap veya hesabı sil. + HESAP + Ana sayfa görünümünü ve görsel tercihleri ayarla. + Uygulamanın yeni sürümü var mı kontrol et. + Güncellemeleri kontrol et + Eklentileri ve keşif kaynaklarını yönet. + İndirdiğin film ve bölümleri yönet. + İndirilenler + GENEL + TMDB ve MDBList servislerini bağla. + Bölüm yayın bildirimlerini yönet ve test bildirimi gönder. + Farklı bir profile geç. + Profil değiştir + Trakt\'ı bağla, izleme listelerini eşitle ve içerikleri doğrudan Trakt\'a kaydet. + Trakt listelerin yükleniyor… + Bu içeriğin Trakt\'ta nereye kaydedileceğini seç + Bağış yap + Detaylara git + Kaldır + Baştan başlat + Oynat + %1$d/10 + İnceleme + Spoiler + Henüz Trakt incelemesi yok. + %1$d beğeni + Bu yorum spoiler içeriyor. + Bu yorum spoiler içerdiği için gizlendi. + Yorumlar + Fragman + %1$s (%2$d) + Fragmanlar + Tamamlanmış bölüm yok + Henüz indirme yok + %1$d indirilmiş bölüm + Aktif + Filmler + Diziler + İndirilenleri göster + Tamamlandı • %1$s + İndiriliyor • %1$s + Olmadı + Duraklatıldı • %1$s + İzlendi + %1$d. sezon + Özel bölümler + Kaldığın yerden devam et + Kitaplığa ekle + İzlenmedi olarak işaretle + İzlendi olarak işaretle + Kitaplıktan kaldır + Tümünü gör + Manuel oynat + %1$s logosu + Hesap + Hesabı sil + Bu işlem hesabını ve ilişkili tüm verileri kalıcı olarak siler. + Bu işlem geri alınamaz. Tüm verilerin, profillerin ve eşitleme geçmişin kalıcı olarak silinecek. + Hesap silinsin mi? + E-posta + Giriş yapılmadı + Çıkış yap + Giriş ekranına geri döneceksin. + Çıkış yapılsın mı? + Durum + Anonim + Giriş yapıldı + AMOLED siyah + OLED ekranlar için saf siyah arka planlar kullan. + Uygulama dili + Dil seç + İzlemeye Devam Et rafını göster, gizle ve stilini ayarla. + Uygulama genelindeki poster kartlarının ortak genişliğini ve köşe yuvarlaklığını ayarla. + EKRAN + ANA SAYFA + TEMA + Koleksiyon • %1$s + Görünen ad + Ana ekran satırlarını ayarlamak için ana sayfaya uyumlu katalogları olan bir eklenti kur. + Ana sayfa kataloğu yok + Öne çıkan kaynağı + Gizli + Ana sayfayı odakta tut + %1$s • Sınıra ulaşıldı (en fazla %2$d) + Öne çıkan kaynağı seçilmedi + Öne çıkanlarda değil + Taşımak için koleksiyondaki üste sabitlemeyi kaldır + Sabitlendi + Üste sabitlendi + Sırala + KATALOGLAR + KATALOGLAR & KOLEKSİYONLAR + KOLEKSİYONLAR + ÖNE ÇIKAN + ÖNE ÇIKAN KAYNAKLARI + %1$d / %2$d seçili + Öne çıkanları göster + Ana sayfanın üstünde öne çıkan bir kaydırmalı alan göster. Aşağıdan en fazla 2 kaynak katalog seç. + %1$d / %2$d katalog görünür • %3$d öne çıkan kaynak seçili + Bir kataloğu yalnızca adını değiştirmek veya sıralamak gerektiğinde aç. + Görünür + Oynatıcı, altyazılar ve otomatik oynatma + Kart yuvarlaklığı + POSTER KART STİLİ + Kart genişliği + Özel + Uygulama genelindeki ortak poster kartları için kart genişliğini ve köşe yuvarlaklığını özelleştir. + Etiketleri gizle + Raf posterleri için yatay mod + Canlı önizleme + %1$s (%2$s) + Köşe yuvarlaklığı: %1$ddp + Yükseklik: %1$ddp + Genişlik: %1$ddp + Klasik + Hap + Yuvarlak + Keskin + Hafif + Dengeli + Rahat + Kompakt + Sıkı + Büyük + Standart + Oynatıcıdan çıktıktan sonra uygulamayı açınca kaldığın yerden devam etmen için bir pencere göster. + Açılışta devam et uyarısı + KART STİLİ + AÇILIŞTA + SONRAKİ DAVRANIŞI + GÖRÜNÜRLÜK + Ana ekranda İzlemeye Devam Et rafını göster. + İzlemeye Devam Et\'i göster + Poster + Görsel odaklı poster kartı + Geniş + Bilgi ağırlıklı yatay kart + Açıksa Sonraki, her zaman en ileri izlenen bölümden devam eder. Kapalıysa en son izlenen bölümden ilerler. Önceki bölümleri yeniden izliyorsan işe yarar. + Sonraki en ileri bölümden başlasın + ANA SAYFA + KAYNAKLAR + İçerik kaynaklarını kur, kaldır, yenile ve sırala. + JavaScript scraper depoları kur ve sağlayıcıları içeriden test et. + Ana sayfada hangi katalogların hangi sırayla görüneceğini kontrol et. + Detay bölümlerini kapat ve öne çıkanların altındaki her şeyi yeniden sırala. + Ana sayfada gösterilen klasörlerle özel katalog grupları oluştur. + ENTEGRASYONLAR + Detay sayfalarını TMDB görselleri, ekip bilgileri, bölüm meta verileri ve daha fazlasıyla zenginleştir. + Detay sayfalarına IMDb, Rotten Tomatoes, Metacritic ve diğer dış puanları ekle. + Puanları açmadan önce aşağıya MDBList API anahtarını ekle. + https://mdblist.com/preferences adresinden bir anahtar alıp buraya yapıştır. + API anahtarı + MDBList API anahtarı + MDBList puanlarını aç + IMDb ID\'si varsa meta veri sayfalarında MDBList\'ten gelen dış puanları göster. + API ANAHTARI + PUAN SAĞLAYICILARI + MDBLIST + İşlemler + Oynatma ve kaydetme kontrolleri. + Oyuncular + Ana oyuncu listesi. + Sinematik arka plan + Yayın ekranına benzer şekilde içeriğin arkasında bulanık arka plan. + Koleksiyon + İlgili koleksiyon veya seri alanı. + Yorumlar + Trakt yorumları bölümü. + Detaylar + Süre, durum, yayın tarihi, dil ve ilgili bilgiler. + Bölüm kartları + Meta veri ekranında bölümlerin nasıl gösterileceğini seç. + Yatay + Arka plan tarzı satır kartları + Liste + Detay odaklı alt alta kartlar + Bölümler + Diziler için sezon ve bölüm listesi. + Grup %1$d + Buna benzerler + Öneriler alanı. + Yok + Özet + Konu, puanlar, türler ve ana ekip bilgileri. + Yapım + Stüdyolar ve kanallar. + GÖRÜNÜM + BÖLÜMLER + Sekme grubu %1$d + Sekme düzeni + Bölümleri TV uygulamasındaki gibi sekmelerde grupla. Her sekme grubuna en fazla 3 bölüm ata. + Fragmanlar + Fragman alanı ve oynatma kısayolları. + Nuvio\'da bildirimler şu anda kapalı. + Yeni bölüm bildirimleri + Kaydettiğin bir dizinin yeni bölümü yayınlandığında yerel bildirim planla. + Nuvio için sistem bildirimleri kapalı. Uyarıları ve test bildirimlerini almak için aç. + Bu cihazda şu anda %1$d yayın bildirimi planlı. + UYARILAR + TEST + Test bildirimi gönder + Test bildirimi gönderiliyor... + %1$s için yerel test bildirimi gönder. + Bildirimleri test etmek için önce kitaplığına bir dizi kaydet. + Test bildirimi + Topluluk + Nuvio\'yu Mobile, TV ve Web\'de geliştiren ve destekleyen kişileri gör. + Destekçiler API\'si ayarlı değil. local.properties dosyasına DONATIONS_BASE_URL ekle. + Katkıda bulunanlar + Destekçiler + GitHub\'ı aç + GitHub profili kullanılamıyor + Mesaj eklenmemiş. + Katkıda bulunanlar yükleniyor... + Destekçiler yükleniyor... + Katkıda bulunanlar yüklenemedi + Destekçiler yüklenemedi + Katkıda bulunan bulunamadı. + Destekçi bulunamadı. + Katkıda bulunanlar yüklenemiyor. + Destekçiler yüklenemiyor. + Katkıda bulunanlar şu anda yüklenemedi. + Destekçiler şu anda yüklenemedi. + Toplam %1$d commit + Oca + Şub + Mar + Nis + May + Haz + Tem + Ağu + Eyl + Eki + Kas + Ara + %2$s %1$s %3$s + Tüm eklentiler + Tüm pluginler + İzin verilen eklentiler + İzin verilen pluginler + Anime Skip + AnimeSkip Client ID + AnimeSkip API client ID\'ni gir. anime-skip.com üzerinden alabilirsin. + Geçme zamanları için AnimeSkip\'te de ara (client ID gerekir). + Sonraki bölümü otomatik oynat + Eşik değere ulaşılınca sonraki bölümü otomatik bulup oynat. + Sadece cihaz + Uygulamayı tercih et (FFmpeg) + Cihazı tercih et + Çözücü önceliği + Kapatmak için dışarı dokun + Kaydedip kapatmak için dışarı dokun + %1$d gün + %1$d gün + %1$d saat + %1$d saat + libass\'i aç + ASS/SSA altyazılarını varsayılan işleyici yerine libass ile göster. + Basılı tutma hızı + Hızlandırmak için basılı tut + Oynatıcı yüzeyinde herhangi bir yere uzun basarak oynatma hızını geçici olarak artır. + Geçersiz regex deseni + Son bağlantı önbellek süresi + DV7\'yi HEVC\'ye eşle + Desteklenmeyen cihazlar için Dolby Vision Profile 7\'den HEVC\'ye geri dönüş. + Bitmeden kaç dakika önce + Sonraki bölüm kartını bitişten kaç dakika önce göstereceğini seç. + %1$d dk + Kullanılabilir öğe yok + Ayarlanmadı + Varsayılan + Cihaz dili + Zorunlu + Yok + Binge grubunu tercih et + Otomatik oynatırken mevcut yayınla aynı binge grubundan bir yayın tercih et. + Tercih edilen ses dili + Tercih edilen altyazı dili + Hazır ayarlar + Yayın adı, etiketi, açıklaması, eklentisi ve URL\'siyle eşleşir. + Regex deseni + 4K|2160p|Remux + Herhangi bir 1080p+ + AVC / x264 + BluRay kalitesi + Dolby Atmos / DTS + İngilizce + HDR / Dolby Vision + HEVC / x265 + CAM/TS yok + REMUX/HDR yok + 1080p standart + 4K / Remux + 720p / Daha küçük + WEB kaynakları + Gösterim tipi + Standart (Cues) + Efekt Canvas + Efekt OpenGL + Overlay Canvas + Overlay OpenGL + Son bağlantıyı tekrar kullan + Önbellek hâlâ geçerliyse aynı film/bölüm için son çalışan yayını otomatik oynat. + İkinci ses dili + İkinci altyazı dili + ÇÖZÜCÜ + SONRAKİ BÖLÜM + OYNATICI + GEÇİLECEK BÖLÜMLER + YAYIN OTOMATİK OYNATMA + YAYIN SEÇİMİ + ALTYAZI VE SES + ALTYAZI GÖSTERİMİ + %1$d seçili + Yükleme ekranını göster + Yayın başlarken açılış yükleme katmanını göster. + Intro/Outro/Özeti geç + Algılanan intro, outro ve özet kısımlarında geç butonunu göster. + Kaynak kapsamı + Tüm eklentiler + Tüm kurulu eklentilerden gelen yayınları dikkate al. + Tüm kaynaklar + Hem eklentilerden hem pluginlerden gelen yayınları dikkate al. + Sadece açık pluginler + Yalnızca açık pluginlerden gelen yayınları dikkate al. + Sadece kurulu eklentiler + Yalnızca kurulu eklentilerden gelen yayınları dikkate al. + Yayın seçme modu + İlk uygun yayın + Bulunan ilk yayını otomatik oynat. + Manuel + Her seferinde yayını kendin seç. + Regex eşleşmesi + Regex desenine uyan bir yayını otomatik seç. + Yayın zaman aşımı + Otomatik seçimden önce yayınların ne kadar bekleneceği. + Bitmeden kaç dakika önce + Eşik modu + Bitmeden kaç dakika önce + Yüzde + Eşik yüzdesi + Oynatma bu yüzdeye ulaşınca sonraki bölüm kartını göster. + %1$d%% + Hemen + %1$dsn + Sınırsız + Tunneled oynatma + Daha düşük gecikmeli ses/video senkronu için tunneled oynatmayı aç. + Zenginleştirmeyi açmadan önce aşağıya kendi TMDB API anahtarını ekle. + TMDB API anahtarı + TMDB zenginleştirmeyi aç + TMDB veya IMDb ID\'si varsa detay ekranındaki eklenti meta verilerini TMDB API anahtarınla zenginleştir. + TMDB v3 API anahtarını gir. + Dil kodu + Görseller + Arka plan, poster ve logoyu TMDB görselleriyle değiştir. + Temel bilgiler + TMDB başlığı, konusu, türleri ve puanını kullan. + Koleksiyonlar + TMDB sağlıyorsa filmler için seri ve koleksiyon alanlarını göster. + Ekip bilgileri + TMDB içerik oluşturucuları, yönetmenleri, yazarları ve oyuncu fotoğraflarını kullan. + Detaylar + TMDB yayın bilgisi, süre, yaş derecelendirmesi, durum, ülke ve dil bilgilerini kullan. + Bölümler + Diziler için TMDB bölüm başlıklarını, küçük görselleri, açıklamaları ve süreleri kullan. + Buna benzerler + Detay sayfalarının altında TMDB önerilerini göster. + Kanallar + TV içerikleri için TMDB kanal meta verilerini kullan. + Yapım şirketleri + Detay ekranında TMDB yapım şirketi meta verilerini kullan. + Sezon posterleri + Dizilerde meta veri ekranındaki sezon seçici için TMDB sezon posterlerini kullan. + Fragmanlar + Detay sayfalarında TMDB fragman videolarını çekip göster. + Kişisel API anahtarı + Tercih edilen dil + Yerelleştirilmiş meta veriler için kullanılacak TMDB dil kodunu ayarla; örneğin `en`, `en-US` veya `pt-BR`. + KİMLİK BİLGİLERİ + YERELLEŞTİRME + MODÜLLER + TMDB + Onaydan sonra otomatik olarak geri yönlendirileceksin. + KİMLİK DOĞRULAMA + Yorumlar + Film ve dizi detaylarında Trakt yorumlarını göster + Trakt\'ı bağla + %1$s olarak bağlı + Trakt kullanıcısı + Bağlantıyı kes + Tarayıcı açılamadı + ÖZELLİKLER + Trakt girişini tarayıcında tamamla + Ne izlediğini takip et, izleme listene veya özel listelerine kaydet ve kitaplığını Trakt ile eşitle. + local.properties içinde Trakt bilgileri eksik (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET). + Trakt girişini aç + Kaydet işlemlerin artık Trakt izleme listesine ve kişisel listelere gidebilir. + Liste bazlı kaydetmeyi ve Trakt kitaplığı modunu açmak için Trakt ile giriş yap. + İzleyici puanı + IMDb + Letterboxd + Metacritic + Rotten Tomatoes + TMDB + Trakt + Bilinmiyor + Kehribar + Kızıl + Zümrüt + Okyanus + Gül + Mor + Beyaz + Sonraki bölüm + Kaynak bulunuyor… + %1$s üzerinden %2$d içinde oynatılıyor… + Sonraki bölüm küçük görseli + Yayınlanmadı + Geç + Intro\'yu geç + Outro\'yu geç + Özeti geç + Altyazı bulunamadı + Afrikaanca + Arnavutça + Amharca + Arapça + Ermenice + Azerice + Baskça + Belarusça + Bengalce + Boşnakça + Bulgarca + Birmanca + Katalanca + Çince + Çince (Basitleştirilmiş) + Çince (Geleneksel) + Hırvatça + Çekçe + Danca + Felemenkçe + İngilizce + Estonca + Filipince + Fince + Fransızca + Galiçyaca + Gürcüce + Almanca + Yunanca + Guceratça + İbranice + Hintçe + Macarca + İzlandaca + Endonezce + İrlandaca + İtalyanca + Japonca + Kannada + Kazakça + Khmerce + Korece + Laoca + Letonca + Litvanca + Makedonca + Malayca + Malayalamca + Maltaca + Marathice + Moğolca + Nepalce + Norveççe + Farsça + Lehçe + Portekizce (Portekiz) + Portekizce (Brezilya) + Pencapça + Romence + Rusça + Sırpça + Sinhala + Slovakça + Slovence + İspanyolca + İspanyolca (Latin Amerika) + Svahili + İsveççe + Tamilce + Teluguca + Tayca + Türkçe + Ukraynaca + Urduca + Özbekçe + Vietnamca + Galce + Zuluca + Temizle + Devam et + Yok say + Kur + Sonra + Hayır + Güncelle + Evet + Uygulamadan çıkmak istiyor musun? + Uygulamadan çık + Bu katalog hiçbir öğe döndürmedi. + Başlık bulunamadı + Wi-Fi veya mobil veri bağlantını kontrol edip tekrar dene. + Yönetmen + Yüklenemedi + Buna benzerler + Sezonlar + Bu eklenti dizi için videolar döndürdü ama hiçbirinde sezon veya bölüm numarası yok. + Bu eklenti bu dizi için bölüm meta verisi sağlamadı. + Bölümler bu eklenti tarafından henüz yayınlanmadı. + Cihazın internete bağlı ama Nuvio gerekli sunuculara ulaşamadı. + Daha az göster + Daha fazla göster ▾ + Yazar + Tüm türler + Katalog + %1$s • %2$s + Seçilen katalog keşif öğeleri döndüremedi. + Keşif yüklenemedi + Kurulu eklentiler keşif için ana sayfaya uyumlu katalog sunmuyor. + Keşif kataloğu yok + Seçilen katalog ve filtreler hiçbir öğe döndürmedi. + Başlık bulunamadı + Keşif kataloglarına göz atmadan önce en az bir eklenti kurup doğrula. + Katalog seç + Tür seç + Tip seç + Tip + Öncekileri izlenmedi yap + Öncekileri izlendi yap + %1$s izlenmedi yapılsın + %1$s izlendi yapılsın + İzlenmedi olarak işaretle + İzlendi olarak işaretle + Sıradaki + %%%1$d izlendi + Ana sayfada katalog satırlarını yüklemeden önce en az bir eklenti kurup doğrula. + Kurulu eklentiler şu anda gerekli ek bilgiler olmadan ana sayfaya uyumlu katalog sunmuyor. + Ana sayfa satırı yok + Detayları gör + Oynatma ve kaydetme kontrolleri. + İşlemler + Ana oyuncu listesi. + İlgili koleksiyon veya seri alanı. + Koleksiyon + Trakt yorumları bölümü. + Süre, durum, yayın tarihi, dil ve ilgili bilgiler. + Detaylar + Diziler için sezon ve bölüm listesi. + Öneriler alanı. + Buna benzerler + Konu, puanlar, türler ve ana ekip bilgileri. + Özet + Stüdyolar ve kanallar. + Yapım + Fragman alanı ve oynatma kısayolları. + Tekrar çevrimiçi + Sunuculara ulaşılamıyor + İnternet bağlantısı yok + (%1$d yaşında) + Doğum %1$s%2$s + Ölüm %1$s + Bilinen işi: %1$s + En yeni + %1$s detayları yüklenemedi + Popüler + Bir şeyler ters gitti + Yakında + Sil + Vazgeç + PIN gir + %1$s için PIN gir + PIN\'i mi unuttun? + PIN hatalı + Kilitli. %1$dsn sonra tekrar dene + Katalog yüklenince avatar seçenekleri burada görünecek. + Avatar: %1$s + Avatar seç + Aşağıdan bir avatar seç. + Profil oluştur + "%1$s" için tüm veriler kalıcı olarak silinecek. + Profili sil + Profil ekle + Profili düzenle + Mevcut PIN\'i gir + Yeni PIN\'i gir + Profil %1$d + Avatarlar yükleniyor... + Profilleri yönet + Profil adı + Yeni profil + Ana eklentiler kapalı + Ana eklentiler açık + %1$s için PIN\'i kaldır + PIN kilidini kaldır + Kaydediliyor... + Güvenlik + Bu profile geçmeden önce kilitlenmesini istiyorsan bir PIN ekle. + Bu profil PIN ile korunuyor. + Bu profil için bir avatar seç. + PIN kilidi koy + Adsız profil + Ana eklentileri kullan + Ayrı bir liste yönetmek yerine ana profilin eklenti ayarlarını paylaş. + Kim izliyor? + İndirildi + Devam et + Aktif scraper\'lar + Daha fazla eklenti kontrol ediliyor… + Yayın bağlantısını kopyala + Dosyayı indir + Kurulu yayın eklentileri geçerli bir yayın yanıtı döndüremedi. + Yayınlar yüklenemedi + Bu içerik için yayınları yüklemek üzere önce bir eklenti kur. + Kurulu eklentilerin bu tür içerik için yayın sağlamıyor. + Yayın eklentisi yok + Kurulu eklentilerinin hiçbiri bu içerik için yayın döndürmedi. + S%1$d B%2$d + Bölüm + S%1$dB%2$d - %3$s + Alınıyor… + Kaynak bulunuyor… + Yayınlar bulunuyor… + Yayın bağlantısı kopyalandı + Doğrudan yayın bağlantısı yok + Meta veri yok + Yayınları yenile + %%%1$d konumundan devam et + %1$s konumundan devam et + BOYUT %1$s + Fragmanı kapat + Fragman oynatılamıyor + Trakt listeleri yüklenemedi + Trakt listeleri güncellenemedi + %1$s • %2$s + Güncelleme kontrolü olmadı + İndirme olmadı + İndiriliyor %%%1$d + Kurulum başlatılamadı + En güncel sürümü kullanıyorsun. + Nuvio için uygulama kurulumlarına izin ver, sonra geri gelip devam et. + Güncelleme indiriliyor... + Güncelleme bulunamadı. + Yeni sürüm kurulmaya hazır. + Uygulama içi güncellemeler bu derlemede yok. + İndirme hazırlanıyor + Sürüm notları + Devam etmek için kurulumlara izin ver + Güncelleme var + Güncelleme durumu + Bu eklenti zaten kurulu. + Geçerli bir eklenti URL\'si gir + Manifest yüklenemedi + Nuvio + Hesap silinemedi + Giriş yapılamadı + Çıkış yapılamadı + Kayıt olunamadı + Katalog öğeleri yüklenemiyor. + Sıradaki + Sıradaki • S%1$dB%2$d + %1$s logosu + Yorumlar yüklenemedi + Detaylar hiçbir eklentiden yüklenemedi. + Kanallar + Bu içerik için meta sağlayan eklenti yok. + İndirme olmadı + Canlı indirme ilerlemesini ve kontrolleri gösterir. + İndirilenler + İndirme tamamlandı + %1$s indiriliyor • %2$s + %1$s indiriliyor • %2$s / %3$s + İndirme olmadı + Duraklatıldı %1$s + Kaldır + %1$s kitaplığından kaldırılsın mı? + Kitaplıktan kaldırılsın mı? + Film + Kaydedilen bir dizinin yeni bölümü çıktığında uyarır. + Yeni bölüm bildirimi önizlemesi. + Test bildirimi gönderilemedi. + %1$s için test bildirimi gönderildi. + Bu yayın oynatılamıyor. + Bu profilin PIN\'i değişti. Bu cihazdaki kilidi yenilemek için bir kez bağlan. + PIN kilidi kaldırılamadı. Tekrar dene. + PIN kilidini kaldırmak için internete bağlan. + Bu PIN bu cihazda henüz çevrimdışı doğrulanamaz. Önce bir kez bağlanıp çevrimiçi kilidini aç. + PIN ayarlanamadı. Tekrar dene. + PIN ayarlamak için internete bağlan. + Bu profil ana eklentileri kullanıyor. + %1$s yüklenemedi + Yayın + Gömülü + Yetkilendirme reddedildi + Trakt girişini tarayıcında tamamla + Geçersiz Trakt geri dönüşü + Geçersiz Trakt geri dönüş durumu + Geçersiz Trakt token yanıtı + Trakt kitaplığı yüklenemedi + Liste %1$d + Trakt yetkilendirme kodu döndürmedi + Trakt bilgileri eksik + Trakt ilerlemesi yüklenemedi + Trakt girişi tamamlanamadı + Trakt kullanıcısı + İzleme listesi + Fragman + Bilinmiyor + Eklenti + Kaydedildi + %1$s oynat + %1$s devam et + JSON boş. + %1$d. koleksiyonun kimliği boş. + \'%1$s\' koleksiyonunun başlığı boş. + \'%2$s\' içindeki %1$d. klasörün kimliği boş. + \'%2$s\' içindeki \'%1$s\' klasörünün başlığı boş. + \'%2$s\' klasöründeki %1$d. kaynağın alanları boş. + Geçersiz JSON: %1$s + Eklenti bulunamadı: %1$s + Ocak + Şubat + Mart + Nisan + Mayıs + Haziran + Temmuz + Ağustos + Eylül + Ekim + Kasım + Aralık + Oca + Şub + Mar + Nis + May + Haz + Tem + Ağu + Eyl + Eki + Kas + Ara + Yapım şirketi + Kanal + %1$s yüklenemedi + Popüler + Yeni eklenenler + %1$s • %2$s + En yüksek puanlı + Yaş derecelendirmesi + Film detayları + Orijinal dil + Menşe ülke + Yayın bilgisi + Süre + Posterler + Metin + Dizi detayları + Durum + Videolar + DOSYA + Doğrudan yayın bağlantısı yok + Önceki indirmenin yerine geçti + İndirme başladı + Bu yayın formatı indirme için desteklenmiyor + Boş yanıt gövdesi + İstek HTTP %1$d ile başarısız oldu + İndirme sistemi başlatılmamış + İndirme isteği başarısız oldu + %1$s - %2$s + Detay ekranında Kaydet\'e dokunduktan sonra kaydettiğin içerikler burada görünür. + Kitaplığın boş + Kitaplık yüklenemedi + Diğer + Kitaplık + Trakt\'ı bağla ve içerikleri izleme listene ya da kişisel listelerine kaydet. + Trakt kitaplığın boş + Trakt kitaplığı yüklenemedi + Trakt kitaplığı + Anime + Kanallar + Filmler + Diziler + TV + %1$s şimdi yayında + %1$s • %2$s şimdi yayında + Yeni bölüm şimdi yayında + %1$s şimdi yayında + Yeni bölüm bildirimleri + Oluşturan + Yönetmen + Yazar + İzleyici puanı + Oynatılabilir fragman yayını bulunamadı. + %1$d. sezon - %2$s + B + KB + MB + GB + + diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt index 10bd8606..20d836d6 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt @@ -3,6 +3,7 @@ package com.nuvio.app.features.settings import nuvio.composeapp.generated.resources.Res import nuvio.composeapp.generated.resources.lang_english import nuvio.composeapp.generated.resources.lang_spanish +import nuvio.composeapp.generated.resources.lang_turkish import org.jetbrains.compose.resources.StringResource enum class AppLanguage( @@ -11,6 +12,7 @@ enum class AppLanguage( ) { ENGLISH("en", Res.string.lang_english), SPANISH("es", Res.string.lang_spanish), + TURKISH("tr", Res.string.lang_turkish), ; companion object { From 7fcbde33edfc2ad655c3746bfc4e2be60e9225b3 Mon Sep 17 00:00:00 2001 From: albyalex96 <72573722+albyalex96@users.noreply.github.com> Date: Sat, 25 Apr 2026 15:06:16 +0200 Subject: [PATCH 023/143] Add Italian locale to locale_config.xml --- composeApp/src/androidMain/res/xml/locale_config.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/composeApp/src/androidMain/res/xml/locale_config.xml b/composeApp/src/androidMain/res/xml/locale_config.xml index 18506985..9eb1f870 100644 --- a/composeApp/src/androidMain/res/xml/locale_config.xml +++ b/composeApp/src/androidMain/res/xml/locale_config.xml @@ -3,4 +3,5 @@ + From c3fa4cbca476bb3a2ce7e56d4ea1fc6e99145c05 Mon Sep 17 00:00:00 2001 From: albyalex96 <72573722+albyalex96@users.noreply.github.com> Date: Sat, 25 Apr 2026 15:07:04 +0200 Subject: [PATCH 024/143] Add Italian language support to AppLanguage enum --- .../kotlin/com/nuvio/app/features/settings/AppLanguage.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt index 20d836d6..b3c2532a 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt @@ -4,6 +4,7 @@ import nuvio.composeapp.generated.resources.Res import nuvio.composeapp.generated.resources.lang_english import nuvio.composeapp.generated.resources.lang_spanish import nuvio.composeapp.generated.resources.lang_turkish +import nuvio.composeapp.generated.resources.lang_italian import org.jetbrains.compose.resources.StringResource enum class AppLanguage( @@ -13,6 +14,7 @@ enum class AppLanguage( ENGLISH("en", Res.string.lang_english), SPANISH("es", Res.string.lang_spanish), TURKISH("tr", Res.string.lang_turkish), + ITALIAN("it", Res.string.lang_italian), ; companion object { From 991e0393fb607dd526268981469b6e6481da3693 Mon Sep 17 00:00:00 2001 From: albyalex96 <72573722+albyalex96@users.noreply.github.com> Date: Sat, 25 Apr 2026 15:17:10 +0200 Subject: [PATCH 025/143] Added Italian Strings --- .../composeResources/values-it/strings.xml | 1043 +++++++++++++++++ 1 file changed, 1043 insertions(+) create mode 100644 composeApp/src/commonMain/composeResources/values-it/strings.xml diff --git a/composeApp/src/commonMain/composeResources/values-it/strings.xml b/composeApp/src/commonMain/composeResources/values-it/strings.xml new file mode 100644 index 00000000..5229f4d8 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/values-it/strings.xml @@ -0,0 +1,1043 @@ + + Apri riconoscimenti e crediti progetto + Indietro + Annulla + Chiudi + Cancella + Fatto + Modifica + Importa + Prossimo + OK + Riproduci + Precedente + Rimuovi + Riordina + Reset + Riprendi + Riprova + Salva + Installando + Addons + Attivo + %1$d cataloghi + Configurabile + Aggiornamento + %1$d risorse + Non Disponibile + Configura addon + Cancella addon + Aggiungi un manifest URL per iniziare a caricare cataloghi , metadata, flussi o sottotitoli dentro Nuvio. + Nessun addon installato ancora. + Inserisci l\'URL dell\'addon. + URL Addon + Installa Addon + Caricamento dettagli manifest... + Validazione dell\'URL del manifest e caricamento dei dettagli dell\'addon prima dell\'installazione. + Verifica Addon + Installazione Fallita + %1$s è stato validato e aggiunto con successo. + Addon Installato + Sposta addon giù + Sposta addon su + Attivo + Addon + Cataloghi + Aggiorna addon + Aggiungi Addon + Addon Installati + Panoramica + %1$d regole ID + Versione %1$s + Selezionato + Copia JSON + %1$d collezioni, %2$d cartelle + Eliminare "%1$s"? L\'azione è irreversibile. + Elimina Collezione + Aggiungi Catalogo + Aggiungi Cartella + Tutti i generi + Aggiungi i cataloghi dai tuoi addon installati per definire cosa mostrare in questa cartella. + Ancora nessuna sorgente catalogo + Scegli + Emoji + URL Immagine + Nessuna + Copertina + Crea Collezione + Fatto + Modifica Collezione + Modifica Cartella + Imposta l\'identità della cartella, la presentazione e le sorgenti del catalogo con la stessa struttura dell\'editor principale delle collezioni. + Aggiungine una per iniziare. + Ancora nessuna cartella + Cartelle + Filtro Genere + Mostra solo l\'immagine di copertina + Nascondi Titolo + Nuova Cartella + Mostra questa collezione sopra tutti i normali cataloghi della home. In presenza di multiple collezioni fissate si seguirà l\'ordine di creazione. + Fissa sopra i cataloghi + URL backdrop (opzionale) + Nome cartella + URL GIF animata (riprodotta solo quando a fuoco) + Nome collezione + Salva Modifiche + Salva + Aspetto + Base + Sorgenti Catalogo + Scegli i cataloghi degli addon che questa cartella deve aggregare. + Seleziona Cataloghi + Seleziona genere + Locandina + Quadrato + Orizzontale + Combina tutti i cataloghi in una singola scheda + Mostra scheda \"Tutti\" + Riproduci la GIF configurata al posto della copertina statica quando disponibile. + Mostra GIF se configurata + %1$d sorgenti · %2$s + Forma riquadro + Righe + Schede + Modalità visualizzazione + Creane una per organizzare i tuoi cataloghi. + Ancora nessuna collezione + %1$d cartelle + Nessun elemento trovato + Cartella non trovata + Collezioni + Importa Collezioni + JSON + Incolla qui sotto il JSON delle tue collezioni. + Importa + Nuova Collezione + In primo piano + Tutto + Le tue collezioni + Fatto con ❤️ da Tapframe e amici + Versione %1$s (%2$s) + Off + On + Pausa + Ricarica + Hai già un account? + Continua senza account + Crea account + Non hai un account? + Email + o + Password + Accedi per accedere alla tua libreria e ai tuoi progressi + Accedi + Registrati per sincronizzare i tuoi dati su più dispositivi + Registrati + I tuoi dati verranno salvati solo localmente + Tutto in streaming, ovunque + Bentornato + Libreria + Libreria Trakt + Home + Libreria + Profilo + Cerca + Tracce audio + Audio + Integrato + Offset inferiore + Chiudi player + Colore + In riproduzione + E%1$d + S%1$dE%2$d + S%1$dE%2$d • %3$s + Episodi + Dimensione carattere + %1$dsp + Blocca comandi player + Nessuna traccia audio disponibile + Nessun episodio disponibile + Nessun flusso trovato + Nessuno + Bordo + Episodi + Sorgenti + Flussi + Errore di riproduzione + In riproduzione + Tocca per scaricare i sottotitoli + Torna indietro + Ripristina predefiniti + Riempi + Adatta + Zoom + Indietro di 10 secondi + -%1$ds + +%1$ds + -%1$ds + +%1$ds + Avanti di 10 secondi + Sorgenti + Stile + Sub + Sottotitoli + Luminosità %1$d%% + Volume %1$d%% + Muto + Scaricato + In onda + Da annunciare + Tocca per sbloccare + Traccia %1$d + Sblocca comandi player + Stai guardando + Aggiungi profilo + Cancella ricerca + Scopri + Gli addon installati non hanno restituito risultati di ricerca validi. + Ricerca fallita + Installa e convalida almeno un addon prima di effettuare una ricerca. + Nessun addon attivo + I cataloghi installati non hanno restituito corrispondenze per questa ricerca. + Nessun risultato trovato + I tuoi addon installati non supportano la ricerca nei cataloghi. + Nessun catalogo consultabile + Cerca film, serie TV... + Ricerche recenti + Rimuovi ricerca recente + Info + Generali + Account + Addon + Aspetto + Contenuti e Scoperta + Continua a guardare + Home + Integrazioni + Valutazioni MDBList + Schermata Meta + Notifiche + Riproduzione + Plugin + Personalizzazione Poster + Impostazioni + Sostenitori e Collaboratori + Arricchimento TMDB + Trakt + INFORMAZIONI + Gestisci il tuo account, disconnettiti o eliminalo. + ACCOUNT + Regola la presentazione della home e le preferenze visive. + Controlla se ci sono nuove versioni dell\'app. + Verifica aggiornamenti + Gestisci gli addon e le sorgenti di scoperta. + Gestisci i film e gli episodi scaricati. + Download + GENERALI + Collega i servizi TMDB e MDBList. + Gestisci gli avvisi per l\'uscita di nuovi episodi e invia una notifica di test. + Passa a un profilo diverso. + Cambia profilo + Collega Trakt, sincronizza la lista dei desideri e salva i titoli direttamente su Trakt. + Caricamento liste Trakt… + Scegli dove salvare questo titolo su Trakt + Dona + Vai ai dettagli + Rimuovi + Riproduci dall\'inizio + Riproduci + %1$d/10 + Recensione + Spoiler + Nessuna recensione Trakt ancora disponibile. + %1$d mi piace + Questo commento contiene spoiler. + Questo commento contiene spoiler ed è stato nascosto. + Commenti + Trailer + %1$s (%2$d) + Trailer + Nessun episodio completato + Ancora nessun download + %1$d episodi scaricati + Attivi + Film + Serie TV + Mostra download + Completato • %1$s + Download in corso • %1$s + Fallito + In pausa • %1$s + Visto + Stagione %1$d + Speciali + Riprendi da dove avevi interrotto + Aggiungi alla libreria + Segna come non visto + Segna come visto + Rimuovi dalla libreria + Vedi tutti + Riproduci manualmente + Logo %1$s + Account + Elimina account + Questo eliminerà permanentemente il tuo account e tutti i dati associati. + Questa azione non può essere annullata. Tutti i tuoi dati, profili e la cronologia di sincronizzazione saranno rimossi per sempre. + Eliminare l\'account? + Email + Accesso non effettuato + Disconnetti + Verrai riportato alla schermata di accesso. + Disconnettersi? + Stato + Anonimo + Connesso + Nero AMOLED + Usa sfondi neri assoluti per schermi OLED. + Lingua app + Scegli lingua + Mostra, nascondi e personalizza lo stile della riga \"Continua a guardare\". + Regola la larghezza delle locandine e i preset del raggio degli angoli. + DISPLAY + HOME + TEMA + Collezione • %1$s + Nome visualizzato + Installa un addon con cataloghi compatibili per configurare le righe della Home. + Nessun catalogo home + Sorgente Hero + Nascosto + Mantieni focus sulla Home + %1$s • Limite raggiunto (max %2$d) + Nessuna sorgente Hero selezionata + Non nel carosello Hero + Rimuovi il blocco in alto dalla collezione per spostarla + Fissato + Fissato in alto + Riordina + CATALOGHI + CATALOGHI E COLLEZIONI + COLLEZIONI + HERO (IN PRIMO PIANO) + SORGENTI HERO + %1$d di %2$d selezionati + Mostra Hero + Mostra un carosello in primo piano nella parte superiore della Home. Scegli fino a 2 cataloghi sorgente qui sotto. + %1$d su %2$d cataloghi visibili • %3$d sorgenti hero selezionate + Apri un catalogo solo quando hai bisogno di rinominarlo o riordinarlo. + Visibile + Player, sottotitoli e riproduzione automatica + Raggio angoli + STILE LOCANDINA + Larghezza locandina + Personalizzato + Personalizza la larghezza e il raggio degli angoli delle locandine in tutta l\'app. + Nascondi etichette + Modalità orizzontale per le locandine della riga + Anteprima in tempo reale + %1$s (%2$s) + Raggio angoli: %1$ddp + Altezza: %1$ddp + Larghezza: %1$ddp + Classico + Pillola + Arrotondato + Tagliente + Lieve + Bilanciato + Comodo + Compatto + Denso + Grande + Standard + Mostra un popup per riprendere la visione all\'apertura dell\'app se eri uscito dal player. + Richiesta ripresa all\'avvio + STILE SCHEDA + ALL\'AVVIO + COMPORTAMENTO \"PROSSIMO EPISODIO\" + VISIBILITÀ + Mostra la riga \"Continua a guardare\" nella schermata Home. + Mostra Continua a guardare + Locandina + Scheda focalizzata sulla locandina + Orizzontale + Scheda orizzontale ricca di informazioni + Se abilitato, \"Prossimo episodio\" continua sempre dall\'ultimo episodio visto. Se disabilitato, segue l\'episodio visto più di recente. Utile se riguardi spesso episodi precedenti. + Prossimo episodio dall\'ultimo visto + HOME + SORGENTI + Installa, rimuovi, aggiorna e ordina le tue sorgenti di contenuto. + Installa repository di scraper JavaScript e testa i provider internamente. + Controlla quali cataloghi appaiono in Home e in quale ordine. + Disabilita le sezioni dei dettagli e riordina tutto ciò che sta sotto l\'elemento Hero. + Crea raggruppamenti di cataloghi personalizzati con cartelle mostrate in Home. + INTEGRAZIONI + Migliora le pagine dei dettagli con immagini, crediti, metadati degli episodi di TMDB e altro ancora. + Aggiungi IMDb, Rotten Tomatoes, Metacritic e altre valutazioni esterne alle pagine dei dettagli. + Aggiungi la tua chiave API MDBList qui sotto prima di attivare le valutazioni. + Ottieni una chiave da https://mdblist.com/preferences e incollala qui. + Chiave API + Chiave API MDBList + Abilita valutazioni MDBList + Mostra le valutazioni esterne di MDBList nelle pagine dei metadati quando è disponibile un ID IMDb. + CHIAVE API + FORNITORI VALUTAZIONI + MDBLIST + Azioni + Controlli di riproduzione e salvataggio. + Cast + Elenco del cast principale. + Sfondo cinematografico + Sfondo sfocato dietro il contenuto, simile alla schermata di streaming. + Collezione + Riga dedicata a collezioni o franchise correlati. + Commenti + Sezione commenti di Trakt. + Dettagli + Durata, stato, uscita, lingua e info correlate. + Schede episodi + Scegli come vengono visualizzati gli episodi nella schermata dei metadati. + Orizzontale + Schede a riga in stile sfondo + Elenco + Schede impilate con focus sui dettagli + Episodi + Stagioni ed elenco episodi per le serie. + Gruppo %1$d + Altri titoli simili + Riga dei consigli. + Nessuno + Panoramica + Sinossi, valutazioni, generi e crediti principali. + Produzione + Studi e network. + ASPETTO + SEZIONI + Gruppo schede %1$d + Layout a schede + Raggruppa le sezioni in schede (tab) come nell\'app TV. Assegna fino a 3 sezioni per ogni gruppo. + Trailer + Riga dei trailer e scorciatoie di riproduzione. + Le notifiche sono attualmente disabilitate in Nuvio. + Avvisi uscita episodi + Programma notifiche locali quando è disponibile un nuovo episodio di una serie salvata. + Le notifiche di sistema sono disabilitate per Nuvio. Abilitale per ricevere avvisi e notifiche di test. + %1$d avvisi di uscita sono attualmente programmati su questo dispositivo. + AVVISI + TEST + Invia notifica di test + Invio notifica di test in corso... + Invia una notifica di test locale per %1$s. + Salva prima una serie nella tua libreria per testare le notifiche. + Notifica di test + Community + Scopri le persone che sviluppano e supportano Nuvio su Mobile, TV e Web. + L\'API dei sostenitori non è configurata. Aggiungi DONATIONS_BASE_URL a local.properties. + Collaboratori + Sostenitori + Apri GitHub + Profilo GitHub non disponibile + Nessun messaggio allegato. + Caricamento collaboratori... + Caricamento sostenitori... + Impossibile caricare i collaboratori + Impossibile caricare i sostenitori + Nessun collaboratore trovato. + Nessun sostenitore trovato. + Impossibile caricare i collaboratori. + Impossibile caricare i sostenitori. + Impossibile caricare i collaboratori al momento. + Impossibile caricare i sostenitori al momento. + %1$d commit totali + Gen + Feb + Mar + Apr + Mag + Giu + Lug + Ago + Set + Ott + Nov + Dic + %1$s %2$s, %3$s + Tutti gli addon + Tutti i plugin + Addon consentiti + Plugin consentiti + Anime Skip + ID Client AnimeSkip + Inserisci il tuo ID client API AnimeSkip. Ottienine uno su anime-skip.com. + Cerca anche su AnimeSkip i timestamp per saltare le sigle (richiede ID client). + Riproduzione automatica prossimo episodio + Trova e riproduce automaticamente l\'episodio successivo al raggiungimento della soglia. + Solo dispositivo + Preferisci App (FFmpeg) + Preferisci dispositivo + Priorità decoder + Tocca fuori per chiudere + Tocca fuori per salvare e chiudere + %1$d giorno + %1$d giorni + %1$d ora + %1$d ore + Abilita libass + Usa libass per il rendering dei sottotitoli ASS/SSA invece del renderer predefinito. + Velocità pressione prolungata + Premi per velocizzare + Premi a lungo in un punto qualsiasi del player per aumentare temporaneamente la velocità di riproduzione. + Pattern regex non valido + Durata cache ultimo link + Mappa DV7 su HEVC + Fallback da Dolby Vision Profile 7 a HEVC per i dispositivi non supportati. + Minuti prima della fine + Mostra la scheda dell\'episodio successivo questo numero di minuti prima della fine. + %1$d min + Nessun elemento disponibile + Non impostato + Predefinito + Lingua del dispositivo + Forzati + Nessuno + Preferisci Binge Group + Durante la riproduzione automatica, preferisci un flusso dello stesso \"binge group\" di quello attuale. + Lingua audio preferita + Lingua sottotitoli preferita + Preset + Confronta con nome del flusso, etichetta, descrizione, addon e URL. + Pattern Regex + 4K|2160p|Remux + Qualsiasi 1080p+ + AVC / x264 + Qualità BluRay + Dolby Atmos / DTS + Inglese + HDR / Dolby Vision + HEVC / x265 + No CAM/TS + No REMUX/HDR + 1080p Standard + 4K / Remux + 720p / Dimensioni ridotte + Sorgenti WEB + Tipo di rendering + Standard (Cues) + Effetti Canvas + Effetti OpenGL + Overlay Canvas + Overlay OpenGL + Riusa l\'ultimo link + Riproduci automaticamente l\'ultimo flusso funzionante per lo stesso film/episodio se la cache è ancora valida. + Lingua audio secondaria + Lingua sottotitoli secondaria + DECODER + PROSSIMO EPISODIO + PLAYER + SALTA SEGMENTI + RIPRODUZIONE AUTOMATICA FLUSSO + SELEZIONE FLUSSO + SOTTOTITOLI E AUDIO + RENDERING SOTTOTITOLI + %1$d selezionati + Mostra overlay di caricamento + Mostra una schermata di caricamento all\'avvio della riproduzione di un flusso. + Salta Intro/Outro/Recap + Mostra il pulsante \"salta\" durante i segmenti rilevati di introduzione, chiusura e riassunto. + Ambito sorgente + Tutti gli addon + Considera i flussi da tutti gli addon installati. + Tutte le sorgenti + Considera i flussi sia dagli addon che dai plugin. + Solo plugin abilitati + Considera solo i flussi provenienti dai plugin abilitati. + Solo addon installati + Considera solo i flussi provenienti dagli addon installati. + Modalità selezione flusso + Primo flusso disponibile + Riproduci automaticamente il primo flusso trovato. + Manuale + Seleziona i flussi manualmente ogni volta. + Corrispondenza Regex + Seleziona automaticamente un flusso che corrisponde a un pattern regex. + Timeout del flusso + Quanto attendere i flussi prima della selezione automatica. + Minuti prima della fine + Modalità soglia + Minuti prima della fine + Percentuale + Percentuale di soglia + Mostra la scheda dell\'episodio successivo quando la riproduzione raggiunge questa percentuale. + %1$d%% + Istantaneo + %1$ds + Illimitato + Riproduzione Tunneled + Abilita la riproduzione tunneled per una minore latenza nella sincronizzazione audio/video. + Aggiungi la tua chiave API TMDB qui sotto prima di attivare l\'arricchimento. + Chiave API TMDB + Abilita arricchimento TMDB + Usa la tua chiave API TMDB per arricchire i metadati degli addon nella schermata dei dettagli quando è disponibile un ID TMDB o IMDb. + Inserisci la tua chiave API TMDB v3. + Codice lingua + Immagini + Sostituisci sfondo, locandina e logo con le immagini di TMDB. + Informazioni di base + Usa titolo, sinossi, generi e valutazioni di TMDB. + Collezioni + Mostra le righe di franchise e collezioni per i film quando fornite da TMDB. + Crediti + Usa creatori, registi, sceneggiatori e foto del cast di TMDB. + Dettagli + Usa info su rilascio, durata, classificazione d\'età, stato, paese e lingua di TMDB. + Episodi + Usa titoli, miniature, descrizioni e durate degli episodi di TMDB per le serie. + Altri titoli simili + Mostra i consigli di TMDB in fondo alle pagine dei dettagli. + Network + Usa i metadati dei network di TMDB per i titoli TV. + Case di produzione + Usa i metadati delle case di produzione di TMDB nella schermata dei dettagli. + Locandine stagioni + Usa le locandine delle stagioni di TMDB nel selettore delle stagioni per le serie. + Trailer + Recupera e mostra la sezione dei trailer di TMDB nelle pagine dei dettagli. + Chiave API personale + Lingua preferita + Imposta il codice lingua TMDB usato per i metadati localizzati, ad esempio `it`, `it-IT` o `en-US`. + CREDENZIALI + LOCALIZZAZIONE + MODULI + TMDB + Dopo l\'approvazione, verrai reindirizzato automaticamente. + AUTENTICAZIONE + Commenti + Mostra i commenti di Trakt nei dettagli di film e serie TV. + Connetti Trakt + Connesso come %1$s + Utente Trakt + Disconnetti + Impossibile aprire il browser + FUNZIONALITÀ + Completa l\'accesso a Trakt nel tuo browser + Tieni traccia di ciò che guardi, salva contenuti nella watchlist o in liste personalizzate e mantieni la tua libreria sincronizzata con Trakt. + Credenziali Trakt mancanti in local.properties (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET). + Apri Login Trakt + Le tue azioni di salvataggio possono ora riguardare la watchlist e le liste personali di Trakt. + Accedi con Trakt per abilitare il salvataggio basato su liste e la modalità libreria Trakt. + Punteggio del pubblico + IMDb + Letterboxd + Metacritic + Rotten Tomatoes + TMDB + Trakt + Sconosciuta + Amber + Crimson + Emerald + Ocean + Rose + Violet + White + Prossimo episodio + Ricerca sorgente… + In riproduzione tramite %1$s tra %2$d… + Miniatura prossimo episodio + Non ancora trasmesso + Salta + Salta Intro + Salta Finale + Salta Riassunto + Nessun sottotitolo trovato + Afrikaans + Albanese + Amarico + Arabo + Armeno + Azero + Basco + Bielorusso + Bengalese + Bosniaco + Bulgaro + Birmano + Catalano + Cinese + Cinese (Semplificato) + Cinese (Tradizionale) + Croato + Ceco + Danese + Olandese + Inglese + Estone + Filippino + Finlandese + Francese + Galiziano + Georgiano + Tedesco + Greco + Gujarati + Ebraico + Hindi + Ungherese + Islandese + Indonesiano + Irlandese + Italiano + Giapponese + Kannada + Kazako + Khmer + Coreano + Lao + Lettone + Lituano + Macedone + Malese + Malayalam + Maltese + Marathi + Mongolo + Nepalese + Norvegese + Persiano + Polacco + Portoghese (Portogallo) + Portoghese (Brasile) + Punjabi + Rumeno + Russo + Serbo + Singalese + Slovacco + Sloveno + Spagnolo + Spagnolo (America Latina) + Swahili + Svedese + Tamil + Telugu + Tailandese + Turco + Ucraino + Urdu + Uzbeko + Vietnamita + Gallese + Zulu + Cancella + Continua + Ignora + Installa + Dopo + No + Aggiorna + + Vuoi uscire dall\'app? + Esci dall\'app + Questo catalogo non ha restituito alcun elemento. + Nessun titolo trovato + Controlla la tua connessione Wi-Fi o dati mobili e riprova. + Regista + Caricamento fallito + Altri titoli simili + Stagioni + L\'addon ha restituito i video per questa serie, ma nessuno include numeri di stagione o episodio. + L\'addon non ha fornito metadati sugli episodi per questa serie. + Gli episodi non sono ancora stati pubblicati da questo addon. + Il dispositivo è online, ma Nuvio non è riuscito a raggiungere i server richiesti. + Mostra meno + Mostra altro ▾ + Sceneggiatore + Tutti i generi + Catalogo + %1$s • %2$s + Il catalogo selezionato non è riuscito a restituire elementi per la funzione Scopri. + Impossibile caricare Scopri + Gli addon installati non espongono cataloghi compatibili con Scopri. + Nessun catalogo Scopri + Il catalogo e i filtri selezionati non hanno restituito alcun elemento. + Nessun titolo trovato + Installa e convalida almeno un addon prima di navigare nei cataloghi Scopri. + Seleziona catalogo + Seleziona genere + Seleziona tipo + Tipo + Segna i precedenti come non visti + Segna i precedenti come visti + Segna %1$s come non vista + Segna %1$s come vista + Segna come non visto + Segna come visto + Prossimo episodio + %1$d%% visto + Installa e convalida almeno un addon prima di caricare le righe del catalogo in Home. + Gli addon installati non espongono attualmente cataloghi compatibili con la bacheca senza gli extra richiesti. + Nessuna riga disponibile in Home + Visualizza dettagli + Controlli di riproduzione e salvataggio. + Azioni + Elenco del cast principale. + Riga dedicata a collezioni o franchise correlati. + Collezione + Sezione commenti di Trakt. + Durata, stato, rilascio, lingua e info correlate. + Dettagli + Stagioni ed elenco episodi per le serie. + Riga dei consigli. + Altri titoli simili + Sinossi, valutazioni, generi e crediti principali. + Panoramica + Studi e network. + Produzione + Riga dei trailer e scorciatoie di riproduzione. + Di nuovo online + Impossibile raggiungere i server + Nessuna connessione internet + (età %1$d) + Data di nascita %1$s%2$s + Data di morte %1$s + Celebre per: %1$s + Ultimi lavori + Impossibile caricare i dettagli di %1$s + Popolare + Qualcosa è andato storto + In uscita + Cancella + Annulla + Inserisci PIN + Inserisci PIN per %1$s + PIN dimenticato? + PIN errato + Bloccato. Riprova tra %1$ds + Le opzioni avatar appariranno qui al caricamento del catalogo. + Avatar: %1$s + Scegli un avatar + Scegli un avatar qui sotto. + Crea profilo + Tutti i dati di \"%1$s\" verranno eliminati permanentemente. + Elimina profilo + Aggiungi profilo + Modifica profilo + Inserisci il PIN attuale + Inserisci il nuovo PIN + Profilo %1$d + Caricamento avatar... + Gestisci profili + Nome profilo + Nuovo profilo + Addon principali disattivati + Addon principali attivati + Rimuovi PIN per %1$s + Rimuovi blocco PIN + Salvataggio... + Sicurezza + Aggiungi un PIN se vuoi che questo profilo sia bloccato prima di accedervi. + Questo profilo è protetto da un PIN. + Seleziona un avatar per questo profilo. + Imposta blocco PIN + Profilo senza nome + Usa addon principali + Condividi la configurazione degli addon del profilo principale invece di gestirne una lista separata. + Chi sta guardando? + Scaricato + Riprendi + Scraper attivi + Controllo altri addon… + Copia link del flusso + Scarica file + Gli addon di streaming installati non hanno restituito una risposta valida. + Impossibile caricare i flussi + Installa prima un addon per caricare i flussi di questo titolo. + Gli addon installati non forniscono flussi per questo tipo di titolo. + Nessun addon di streaming disponibile + Nessuno degli addon installati ha restituito flussi per questo titolo. + S%1$d E%2$d + Episodio + S%1$dE%2$d - %3$s + Recupero in corso… + Ricerca sorgente… + Ricerca flussi… + Link del flusso copiato + Nessun link diretto disponibile + Nessun metadato disponibile + Aggiorna flussi + Riprendi dal %1$d%% + Riprendi da %1$s + DIMENSIONE %1$s + Chiudi trailer + Impossibile riprodurre il trailer + Impossibile caricare le liste Trakt + Impossibile aggiornare le liste Trakt + %1$s • %2$s + Controllo aggiornamenti fallito + Download fallito + Download in corso: %1$d%% + Impossibile avviare l\'installazione + Stai utilizzando l\'ultima versione. + Abilita l\'installazione di app per Nuvio, quindi torna qui e continua. + Download aggiornamento in corso... + Nessun aggiornamento trovato. + Una nuova versione è pronta per l\'installazione. + Gli aggiornamenti in-app non sono disponibili in questa versione. + Preparazione del download + Note di rilascio + Consenti installazioni per continuare + Aggiornamento disponibile + Stato aggiornamento + Questo addon è già installato. + Inserisci un URL addon valido + Impossibile caricare il manifest + Nuvio + Eliminazione account fallita + Accesso fallito + Disconnessione fallita + Registrazione fallita + Impossibile caricare gli elementi del catalogo. + Prossimo contenuto + Prossimo • S%1$dE%2$d + Logo di %1$s + Impossibile caricare i commenti + Impossibile caricare i dettagli da alcun addon. + Network + Nessun addon fornisce metadati per questo contenuto. + Download fallito + Mostra i progressi e i controlli dei download in corso. + Download + Download completato + Download di %1$s • %2$s in corso + Download di %1$s • %2$s / %3$s in corso + Download fallito + In pausa %1$s + Rimuovi + Vuoi rimuovere %1$s dalla tua libreria? + Rimuovere dalla libreria? + Film + Avvisi quando viene rilasciato un nuovo episodio di una serie salvata. + Anteprima dell\'avviso di uscita episodio. + Impossibile inviare la notifica di test. + Notifica di test inviata per %1$s. + Impossibile riprodurre questo flusso. + Il PIN di questo profilo è cambiato. Connettiti per aggiornare il blocco su questo dispositivo. + Impossibile rimuovere il blocco PIN. Riprova. + Connettiti a Internet per rimuovere il blocco PIN. + Questo PIN non può ancora essere verificato offline su questo dispositivo. Connettiti e sbloccalo prima online. + Impossibile impostare il PIN. Riprova. + Connettiti a Internet per impostare un PIN. + Questo profilo utilizza gli addon principali. + Caricamento di %1$s fallito + Flusso + Incorporato (Embedded) + Autorizzazione negata + Completa l\'accesso a Trakt nel tuo browser + Callback Trakt non valido + Stato callback Trakt non valido + Risposta token Trakt non valida + Impossibile caricare la libreria Trakt + Lista %1$d + Trakt non ha restituito un codice di autorizzazione + Credenziali Trakt mancanti + Impossibile caricare i progressi di Trakt + Impossibile completare l\'accesso a Trakt + Utente Trakt + Watchlist + Trailer + Sconosciuto + Addon + Salvato + Riproduci %1$s + Riprendi %1$s + Il file JSON è vuoto. + La collezione %1$d ha un ID vuoto. + La collezione \'%1$s\' ha un titolo vuoto. + La cartella %1$d in \'%2$s\' ha un ID vuoto. + La cartella \'%1$s\' in \'%2$s\' ha un titolo vuoto. + La sorgente %1$d nella cartella \'%2$s\' presenta campi vuoti. + JSON non valido: %1$s + Addon non trovato: %1$s + Gennaio + Febbraio + Marzo + Aprile + Maggio + Giugno + Luglio + Agosto + Settembre + Ottobre + Novembre + Dicembre + Gen + Feb + Mar + Apr + Mag + Giu + Lug + Ago + Set + Ott + Nov + Dic + Casa di produzione + Network + Impossibile caricare %1$s + Popolari + Recenti + %1$s • %2$s + I più votati + Certificazione + Dettagli film + Lingua originale + Paese d\'origine + Info rilascio + Durata + Locandine + Testo + Dettagli serie + Stato + Video + FILE + Nessun link diretto disponibile + Download precedente sostituito + Download avviato + Formato flusso non supportato per i download + Corpo della risposta vuoto + Richiesta fallita con HTTP %1$d + Il sistema di download non è inizializzato + Richiesta di download fallita + %1$s - %2$s + I titoli salvati appariranno qui dopo aver toccato Salva nella schermata dei dettagli. + La tua libreria è vuota + Impossibile caricare la libreria + Altro + Libreria + Connetti Trakt e salva i titoli nella tua watchlist o nelle tue liste personali. + La tua libreria Trakt è vuota + Impossibile caricare la libreria Trakt + Libreria Trakt + Anime + Canali + Film + Serie + TV + %1$s è ora disponibile + %1$s • %2$s è ora disponibile + Un nuovo episodio è ora disponibile + %1$s è ora disponibile + Uscite episodi + Creatore + Regista + Sceneggiatore + Punteggio del pubblico + Nessun flusso trailer riproducibile trovato. + Stagione %1$d - %2$s + B + KB + MB + GB + From e360a014ca76c82e7034182bcdc83a53ecc0c985 Mon Sep 17 00:00:00 2001 From: Lliakos Date: Sat, 25 Apr 2026 21:08:47 +0300 Subject: [PATCH 026/143] Add Greek translation for mobile app --- .../composeResources/values-el/strings.xml | 1043 +++++++++++++++++ .../app/features/settings/AppLanguage.kt | 1 + 2 files changed, 1044 insertions(+) create mode 100644 composeApp/src/commonMain/composeResources/values-el/strings.xml diff --git a/composeApp/src/commonMain/composeResources/values-el/strings.xml b/composeApp/src/commonMain/composeResources/values-el/strings.xml new file mode 100644 index 00000000..1e6107a5 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/values-el/strings.xml @@ -0,0 +1,1043 @@ + + Δημόσια αναγνώριση και συντελεστές του έργου + Πίσω + Άκυρο + Κλείσιμο + Διαγραφή + Τέλος + Επεξεργασία + Εισαγωγή + Επόμενο + ΟΚ + Αναπαραγωγή + Προηγούμενο + Αφαίρεση + Αναδιάταξη + Επαναφορά + Συνέχεια + Επανάληψη + Αποθήκευση + Γίνεται εγκατάσταση + Πρόσθετα + Ενεργό + %1$d κατάλογοι + Διαμορφώσιμο + Γίνεται ανανέωση + %1$d πόροι + Μη διαθέσιμο + Διαμόρφωση πρόσθετου + Διαγραφή πρόσθετου + Προσθέστε μια διεύθυνση URL manifest για να ξεκινήσετε τη φόρτωση καταλόγων, μεταδεδομένων, ροών ή υποτίτλων στο Nuvio. + Δεν έχουν εγκατασταθεί πρόσθετα ακόμα. + Εισάγετε μια διεύθυνση URL πρόσθετου. + URL πρόσθετου + Εγκατάσταση πρόσθετου + Φόρτωση λεπτομερειών manifest... + Επικύρωση της διεύθυνσης URL manifest και φόρτωση λεπτομερειών πρόσθετου πριν από την εγκατάσταση. + Έλεγχος πρόσθετου + Αποτυχία εγκατάστασης + Το %1$s επικυρώθηκε και προστέθηκε επιτυχώς. + Το πρόσθετο εγκαταστάθηκε + Μετακίνηση πρόσθετου προς τα κάτω + Μετακίνηση πρόσθετου προς τα πάνω + Ενεργά + Πρόσθετα + Κατάλογοι + Ανανέωση πρόσθετου + Προσθήκη πρόσθετου + Εγκατεστημένα πρόσθετα + Επισκόπηση + %1$d κανόνες αναγνωριστικού + Έκδοση %1$s + Επιλεγμένο + Αντιγραφή JSON + %1$d συλλογή(ές), %2$d φάκελος(οι) + Διαγραφή «%1$s»; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. + Διαγραφή συλλογής + Προσθήκη καταλόγου + Προσθήκη φακέλου + Όλα τα είδη + Προσθέστε καταλόγους από τα εγκατεστημένα πρόσθετα για να ορίσετε τι εμφανίζει αυτός ο φάκελος. + Δεν υπάρχουν πηγές καταλόγου ακόμα + Επιλογή + Emoji + URL εικόνας + Κανένα + Εξώφυλλο + Δημιουργία συλλογής + Τέλος + Επεξεργασία συλλογής + Επεξεργασία φακέλου + Ορίστε την ταυτότητα, την παρουσίαση και τις πηγές καταλόγου του φακέλου με την ίδια δομή με τον κύριο επεξεργαστή συλλογών. + Προσθέστε ένα για να ξεκινήσετε. + Δεν υπάρχουν φάκελοι ακόμα + Φάκελοι + Φίλτρο είδους + Εμφάνιση μόνο της εικόνας εξωφύλλου + Απόκρυψη τίτλου + Νέος φάκελος + Εμφάνιση αυτής της συλλογής πάνω από όλους τους κανονικούς καταλόγους αρχικής. Πολλαπλές καρφιτσωμένες συλλογές ακολουθούν τη σειρά δημιουργίας. + Καρφίτσωμα πάνω από τους καταλόγους + URL φόντου (προαιρετικό) + Όνομα φακέλου + URL κινούμενου GIF (αναπαράγεται μόνο όταν είναι εστιασμένο) + Όνομα συλλογής + Αποθήκευση αλλαγών + Αποθήκευση + Εμφάνιση + Βασικά + Πηγές καταλόγου + Επιλέξτε τους καταλόγους πρόσθετων που θα συγκεντρώνει αυτός ο φάκελος. + Επιλογή καταλόγων + Επιλογή είδους + Αφίσα + Τετράγωνο + Πλατύ + Συνδυασμός όλων των καταλόγων σε μία καρτέλα + Εμφάνιση καρτέλας /«Όλα»/ + Αναπαραγωγή του διαμορφωμένου GIF αντί για το στατικό εξώφυλλο όταν είναι διαθέσιμο. + Εμφάνιση GIF όταν είναι διαμορφωμένο + %1$d πηγή(ές) · %2$s + Σχήμα πλακιδίου + Γραμμές + Καρτέλες + Λειτουργία προβολής + Δημιουργήστε μία για να οργανώσετε τους καταλόγους σας. + Δεν υπάρχουν συλλογές ακόμα + %1$d φάκελος(οι) + Δεν βρέθηκαν στοιχεία + Ο φάκελος δεν βρέθηκε + Συλλογές + Εισαγωγή συλλογών + JSON + Επικολλήστε το JSON συλλογών σας παρακάτω. + Εισαγωγή + Νέα συλλογή + Καρφιτσωμένα + Όλα + Οι συλλογές σας + Φτιαγμένο με ❤️ από την Tapframe και φίλους + Έκδοση %1$s (%2$s) + Απενεργοποίηση + Ενεργοποίηση + Παύση + Επαναφόρτωση + Έχετε ήδη λογαριασμό; + Συνέχεια χωρίς λογαριασμό + Δημιουργία λογαριασμού + Δεν έχετε λογαριασμό; + Email + ή + Κωδικός + Συνδεθείτε για να αποκτήσετε πρόσβαση στη βιβλιοθήκη και την πρόοδό σας + Σύνδεση + Εγγραφείτε για να συγχρονίσετε τα δεδομένα σας σε όλες τις συσκευές + Εγγραφή + Τα δεδομένα σας θα αποθηκευτούν μόνο τοπικά + Ροή παντού, πάντα + Καλώς ορίσατε ξανά + Βιβλιοθήκη + Βιβλιοθήκη Trakt + Αρχική + Βιβλιοθήκη + Προφίλ + Αναζήτηση + Κομμάτια ήχου + Ήχος + Ενσωματωμένο + Κατώτατη μετατόπιση + Κλείσιμο προγράμματος αναπαραγωγής + Χρώμα + Παίζουν τώρα + E%1$d + S%1$dE%2$d + S%1$dE%2$d • %3$s + Επεισόδια + Μέγεθος γραμματοσειράς + %1$dsp + Κλείδωμα ελέγχων αναπαραγωγής + Δεν υπάρχουν διαθέσιμα κομμάτια ήχου + Δεν υπάρχουν διαθέσιμα επεισόδια + Δεν βρέθηκαν ροές + Κανένα + Περίγραμμα + Επεισόδια + Πηγές + Ροές + Σφάλμα αναπαραγωγής + Αναπαραγωγή + Πατήστε για λήψη υποτίτλων + Πίσω + Επαναφορά προεπιλογών + Πλήρωση + Προσαρμογή + Ζουμ + Μετακίνηση 10 δευτερόλεπτα πίσω + -%1$ds + +%1$ds + -%1$ds + +%1$ds + Μετακίνηση 10 δευτερόλεπτα μπροστά + Πηγές + Στυλ + Υπότιτλοι + Υπότιτλοι + Φωτεινότητα %1$d%% + Ένταση ήχου %1$d%% + Σε σίγαση + Κατέβηκε + Προβάλλεται + Προσεχώς + Πατήστε για ξεκλείδωμα + Κομμάτι %1$d + Ξεκλείδωμα ελέγχων αναπαραγωγής + Παρακολουθείτε + Προσθήκη προφίλ + Εκκαθάριση αναζήτησης + Εξερεύνηση + Τα εγκατεστημένα πρόσθετα δεν επέστρεψαν έγκυρα αποτελέσματα αναζήτησης. + Η αναζήτηση απέτυχε + Εγκαταστήστε και επικυρώστε τουλάχιστον ένα πρόσθετο πριν από την αναζήτηση. + Δεν υπάρχουν ενεργά πρόσθετα + Οι εγκατεστημένοι κατάλογοι αναζήτησης δεν επέστρεψαν αποτελέσματα για αυτό το ερώτημα. + Δεν βρέθηκαν αποτελέσματα + Τα εγκατεστημένα πρόσθετα δεν παρέχουν αναζήτηση καταλόγου. + Δεν υπάρχουν κατάλογοι αναζήτησης + Αναζήτηση ταινιών, σειρών... + Πρόσφατες Αναζητήσεις + Αφαίρεση πρόσφατης αναζήτησης + Σχετικά + Γενικά + Λογαριασμός + Πρόσθετα + Εμφάνιση + Περιεχόμενο & Ανακάλυψη + Συνέχεια παρακολούθησης + Αρχική οθόνη + Ενσωματώσεις + Αξιολογήσεις MDBList + Οθόνη μεταδεδομένων + Ειδοποιήσεις + Αναπαραγωγή + Πρόσθετα εφαρμογών + Προσαρμογή αφίσας + Ρυθμίσεις + Υποστηρικτές & Συνεισφέροντες + Εμπλουτισμός TMDB + Trakt + ΣΧΕΤΙΚΑ + Διαχειριστείτε τον λογαριασμό σας, αποσυνδεθείτε ή διαγράψτε τον. + ΛΟΓΑΡΙΑΣΜΟΣ + Προσαρμόστε την παρουσίαση της αρχικής και τις οπτικές προτιμήσεις. + Ελέγξτε για νέες εκδόσεις της εφαρμογής. + Έλεγχος για ενημερώσεις + Διαχείριση πρόσθετων και πηγών ανακάλυψης. + Διαχειριστείτε τις κατεβασμένες ταινίες και επεισόδιά σας. + Λήψεις + ΓΕΝΙΚΑ + Σύνδεση υπηρεσιών TMDB και MDBList. + Διαχείριση ειδοποιήσεων κυκλοφορίας επεισοδίων και αποστολή δοκιμαστικής ειδοποίησης. + Μετάβαση σε διαφορετικό προφίλ. + Εναλλαγή προφίλ + Συνδέστε το Trakt, συγχρονίστε λίστες παρακολούθησης και αποθηκεύστε τίτλους απευθείας στο Trakt. + Φόρτωση λιστών Trakt… + Επιλέξτε πού θα αποθηκευτεί αυτός ο τίτλος στο Trakt + Δωρεά + Μετάβαση στις λεπτομέρειες + Αφαίρεση + Έναρξη από την αρχή + Αναπαραγωγή + %1$d/10 + Κριτική + Spoiler + Δεν υπάρχουν ακόμα κριτικές Trakt. + %1$d μου αρέσει + Αυτό το σχόλιο περιέχει spoilers. + Αυτό το σχόλιο περιέχει spoilers και έχει αποκρυφθεί. + Σχόλια + Τρέιλερ + %1$s (%2$d) + Τρέιλερ + Δεν υπάρχουν ολοκληρωμένα επεισόδια + Δεν υπάρχουν λήψεις ακόμα + %1$d ληφθέν(τα) επεισόδιο(α) + Ενεργές + Ταινίες + Σειρές + Εμφάνιση λήψεων + Ολοκληρώθηκε • %1$s + Γίνεται εγκατάσταση • %1$s + Απέτυχε + Σε παύση • %1$s + Παρακολουθήθηκε + Σεζόν %1$d + Ειδικά + Συνέχεια από εκεί που σταματήσατε + Προσθήκη στη βιβλιοθήκη + Σήμανση ως μη παρακολουθηθέν + Σήμανση ως παρακολουθηθέν + Αφαίρεση από τη βιβλιοθήκη + Προβολή όλων + Χειροκίνητη αναπαραγωγή + Λογότυπο %1$s + Λογαριασμός + Διαγραφή λογαριασμού + Αυτό θα διαγράψει μόνιμα τον λογαριασμό σας και όλα τα σχετικά δεδομένα. + Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Όλα τα δεδομένα, τα προφίλ και το ιστορικό συγχρονισμού σας θα αφαιρεθούν μόνιμα. + Διαγραφή λογαριασμού; + Email + Δεν είστε συνδεδεμένοι + Αποσύνδεση + Θα επιστρέψετε στην οθόνη σύνδεσης. + Αποσύνδεση; + Κατάσταση + Ανώνυμος + Συνδεδεμένος + AMOLED Μαύρο + Χρήση καθαρού μαύρου φόντου για οθόνες OLED. + Γλώσσα εφαρμογής + Επιλογή γλώσσας + Εμφάνιση, απόκρυψη και στυλ της ενότητας Συνέχεια παρακολούθησης. + Ρύθμιση κοινού πλάτους κάρτας αφίσας και προεπιλογών ακτίνας γωνίας. + ΟΘΟΝΗ + ΑΡΧΙΚΗ + ΘΕΜΑ + Συλλογή • %1$s + Εμφανιζόμενο όνομα + Εγκαταστήστε ένα πρόσθετο με καταλόγους συμβατούς με πίνακα για να διαμορφώσετε τις γραμμές αρχικής οθόνης. + Δεν υπάρχουν κατάλογοι αρχικής + Πηγή hero + Κρυφό + Διατήρηση εστίασης στην Αρχική + %1$s • Έφτασε το όριο (μέγιστο %2$d) + Δεν έχουν επιλεγεί πηγές hero + Όχι στο hero + Αφαιρέστε την καρφίτσα στην κορυφή από τη συλλογή για μετακίνηση + Καρφιτσωμένο + Καρφιτσωμένο στην κορυφή + Αναδιάταξη + ΚΑΤΑΛΟΓΟΙ + ΚΑΤΑΛΟΓΟΙ & ΣΥΛΛΟΓΕΣ + ΣΥΛΛΟΓΕΣ + HERO + ΠΗΓΕΣ HERO + %1$d από %2$d επιλεγμένα + Εμφάνιση Hero + Εμφάνιση ενός επιλεγμένου hero carousel στην κορυφή της Αρχικής. Επιλέξτε έως 2 πηγές καταλόγου παρακάτω. + %1$d από %2$d καταλόγους ορατοί • %3$d πηγές hero επιλεγμένες + Ανοίξτε έναν κατάλογο μόνο όταν χρειάζεστε να τον μετονομάσετε ή να τον αναδιατάξετε. + Ορατό + Αναπαραγωγή, υπότιτλοι και αυτόματη εκκίνηση + Ακτίνα κάρτας + ΣΤΥΛ ΚΑΡΤΑΣ ΑΦΙΣΑΣ + Πλάτος κάρτας + Προσαρμοσμένο + Προσαρμόστε το πλάτος κάρτας και την ακτίνα γωνίας για κοινές κάρτες αφίσας στην εφαρμογή. + Απόκρυψη ετικετών + Λειτουργία οριζόντιας προβολής για αφίσες ραφιών + Ζωντανή προεπισκόπηση + %1$s (%2$s) + Ακτίνα γωνίας: %1$ddp + Ύψος: %1$ddp + Πλάτος: %1$ddp + Κλασικό + Χάπι + Στρογγυλεμένο + Αιχμηρό + Διακριτικό + Ισορροπημένο + Άνετο + Συμπαγές + Πυκνό + Μεγάλο + Τυπικό + Εμφάνιση αναδυόμενου παραθύρου για συνέχεια από εκεί που σταματήσατε κατά το άνοιγμα της εφαρμογής μετά από έξοδο από τον player. + Προτροπή συνέχισης κατά την εκκίνηση + ΣΤΥΛ ΚΑΡΤΑΣ + ΚΑΤΑ ΤΗΝ ΕΚΚΙΝΗΣΗ + ΣΥΜΠΕΡΙΦΟΡΑ UP NEXT + ΟΡΑΤΟΤΗΤΑ + Εμφάνιση της ενότητας Συνέχεια παρακολούθησης στην Αρχική οθόνη. + Εμφάνιση συνέχειας παρακολούθησης + Αφίσα + Κάρτα αφίσας με προτεραιότητα στο artwork + Πλατύ + Οριζόντια κάρτα με πλούσιες πληροφορίες + Όταν είναι ενεργοποιημένο, το Up Next συνεχίζει πάντα από το πιο απομακρυσμένο παρακολουθημένο επεισόδιο. Όταν είναι απενεργοποιημένο, ακολουθεί το πιο πρόσφατα παρακολουθηθέν επεισόδιο. Χρήσιμο αν ξαναβλέπετε παλαιότερα επεισόδια. + Up Next από το πιο απομακρυσμένο επεισόδιο + ΑΡΧΙΚΗ + ΠΗΓΕΣ + Εγκατάσταση, αφαίρεση, ανανέωση και ταξινόμηση των πηγών περιεχομένου σας. + Εγκατάσταση αποθετηρίων JavaScript scraper και δοκιμή παρόχων εσωτερικά. + Έλεγχος ποιοι κατάλογοι εμφανίζονται στην Αρχική και με ποια σειρά. + Απενεργοποίηση ενοτήτων λεπτομερειών και αναδιάταξη όλων κάτω από το Hero. + Δημιουργία προσαρμοσμένων ομαδοποιήσεων καταλόγου με φακέλους που εμφανίζονται στην Αρχική. + ΕΝΣΩΜΑΤΩΣΕΙΣ + Εμπλουτίστε σελίδες λεπτομερειών με artwork, credits, μεταδεδομένα επεισοδίων TMDB και περισσότερα. + Προσθέστε αξιολογήσεις IMDb, Rotten Tomatoes, Metacritic και άλλες εξωτερικές αξιολογήσεις στις σελίδες λεπτομερειών. + Προσθέστε πρώτα το κλειδί API MDBList παρακάτω πριν ενεργοποιήσετε τις αξιολογήσεις. + Αποκτήστε κλειδί από το https://mdblist.com/preferences και επικολλήστε το εδώ. + Κλειδί API + Κλειδί API MDBList + Ενεργοποίηση αξιολογήσεων MDBList + Εμφάνιση εξωτερικών αξιολογήσεων από το MDBList σε σελίδες μεταδεδομένων όταν υπάρχει αναγνωριστικό IMDb. + ΚΛΕΙΔΙ API + ΠΑΡΟΧΟΙ ΑΞΙΟΛΟΓΗΣΕΩΝ + MDBLIST + Ενέργειες + Έλεγχοι αναπαραγωγής και αποθήκευσης. + Καστ + Λίστα κύριου καστ. + Κινηματογραφικό φόντο + Θολό φόντο πίσω από το περιεχόμενο, παρόμοιο με την οθόνη ροής. + Συλλογή + Ράγα σχετικής συλλογής ή franchise. + Σχόλια + Ενότητα σχολίων Trakt. + Λεπτομέρειες + Διάρκεια, κατάσταση, κυκλοφορία, γλώσσα και σχετικές πληροφορίες. + Κάρτες επεισοδίων + Επιλέξτε πώς αποδίδονται τα επεισόδια στην οθόνη μεταδεδομένων. + Οριζόντιο + Κάρτες γραμμής στυλ φόντου + Λίστα + Κάρτες με προτεραιότητα στις λεπτομέρειες + Επεισόδια + Σεζόν και λίστα επεισοδίων για σειρές. + Ομάδα %1$d + Περισσότερα σαν αυτό + Ράγα προτάσεων. + Κανένα + Επισκόπηση + Σύνοψη, αξιολογήσεις, είδη και βασικά credits. + Παραγωγή + Στούντιο και δίκτυα. + ΕΜΦΑΝΙΣΗ + ΕΝΟΤΗΤΕΣ + Ομάδα καρτελών %1$d + Διάταξη καρτελών + Ομαδοποίηση ενοτήτων σε καρτέλες όπως η εφαρμογή TV. Αντιστοιχίστε έως 3 ενότητες ανά ομάδα καρτελών. + Τρέιλερ + Ράγα τρέιλερ και συντομεύσεις αναπαραγωγής. + Οι ειδοποιήσεις είναι απενεργοποιημένες αυτή τη στιγμή στο Nuvio. + Ειδοποιήσεις κυκλοφορίας επεισοδίων + Προγραμματισμός τοπικών ειδοποιήσεων όταν ένα νέο επεισόδιο αποθηκευμένης σειράς γίνει διαθέσιμο. + Οι ειδοποιήσεις συστήματος είναι απενεργοποιημένες για το Nuvio. Ενεργοποιήστε τες για να λαμβάνετε ειδοποιήσεις και δοκιμαστικές ειδοποιήσεις. + %1$d ειδοποιήσεις κυκλοφορίας είναι προγραμματισμένες αυτήν τη στιγμή σε αυτήν τη συσκευή. + ΕΙΔΟΠΟΙΗΣΕΙΣ + ΔΟΚΙΜΗ + Αποστολή δοκιμαστικής ειδοποίησης + Αποστολή δοκιμαστικής ειδοποίησης... + Αποστολή τοπικής δοκιμαστικής ειδοποίησης για %1$s. + Αποθηκεύστε πρώτα μια σειρά στη βιβλιοθήκη σας για να δοκιμάσετε τις ειδοποιήσεις. + Δοκιμαστική ειδοποίηση + Κοινότητα + Δείτε τους ανθρώπους που κατασκευάζουν και υποστηρίζουν το Nuvio σε Mobile, TV και Web. + Το API υποστηρικτών δεν έχει διαμορφωθεί. Προσθέστε DONATIONS_BASE_URL στο local.properties. + Συνεισφέροντες + Υποστηρικτές + Άνοιγμα GitHub + Το προφίλ GitHub δεν είναι διαθέσιμο + Δεν επισυνάφθηκε μήνυμα. + Φόρτωση συνεισφερόντων... + Φόρτωση υποστηρικτών... + Δεν ήταν δυνατή η φόρτωση συνεισφερόντων + Δεν ήταν δυνατή η φόρτωση υποστηρικτών + Δεν βρέθηκαν συνεισφέροντες. + Δεν βρέθηκαν υποστηρικτές. + Δεν είναι δυνατή η φόρτωση συνεισφερόντων. + Δεν είναι δυνατή η φόρτωση υποστηρικτών. + Δεν ήταν δυνατή η φόρτωση συνεισφερόντων αυτή τη στιγμή. + Δεν ήταν δυνατή η φόρτωση υποστηρικτών αυτή τη στιγμή. + %1$d commits συνολικά + Ιαν + Φεβ + Μαρ + Απρ + Μάι + Ιουν + Ιουλ + Αυγ + Σεπ + Οκτ + Νοε + Δεκ + %1$s %2$s, %3$s + Όλα τα πρόσθετα + Όλα τα plugins + Επιτρεπόμενα πρόσθετα + Επιτρεπόμενα plugins + Anime Skip + Client ID AnimeSkip + Εισάγετε το client ID API AnimeSkip. Αποκτήστε ένα στο anime-skip.com. + Αναζήτηση επίσης στο AnimeSkip για χρονικές σημάνσεις παράλειψης (απαιτείται client ID). + Αυτόματη αναπαραγωγή επόμενου επεισοδίου + Αυτόματη εύρεση και αναπαραγωγή του επόμενου επεισοδίου όταν φτάνει το κατώφλι. + Μόνο συσκευή + Προτίμηση εφαρμογής (FFmpeg) + Προτίμηση συσκευής + Προτεραιότητα αποκωδικοποιητή + Πατήστε εκτός για κλείσιμο + Πατήστε εκτός για αποθήκευση & κλείσιμο + %1$d ημέρα + %1$d ημέρες + %1$d ώρα + %1$d ώρες + Ενεργοποίηση libass + Χρήση libass για απόδοση υποτίτλων ASS/SSA αντί για τον προεπιλεγμένο αποδότη. + Ταχύτητα κράτησης + Κράτηση για ταχύτητα + Πατήστε παρατεταμένα οπουδήποτε στην επιφάνεια του player για προσωρινή αύξηση ταχύτητας αναπαραγωγής. + Μη έγκυρο μοτίβο regex + Διάρκεια cache τελευταίου συνδέσμου + Χαρτογράφηση DV7 σε HEVC + Εναλλαγή Dolby Vision Profile 7 σε HEVC για μη υποστηριζόμενες συσκευές. + Λεπτά πριν το τέλος + Εμφάνιση κάρτας επόμενου επεισοδίου τόσα λεπτά πριν το τέλος. + %1$d λεπτά + Δεν υπάρχουν διαθέσιμα στοιχεία + Δεν έχει οριστεί + Προεπιλογή + Γλώσσα συσκευής + Αναγκαστικό + Κανένα + Προτίμηση ομάδας binge + Κατά την αυτόματη αναπαραγωγή, προτίμηση ροής από την ίδια ομάδα binge με την τρέχουσα. + Προτιμώμενη γλώσσα ήχου + Προτιμώμενη γλώσσα υποτίτλων + Προεπιλογές + Αντιστοιχίζεται με όνομα ροής, ετικέτα, περιγραφή, πρόσθετο και URL. + Μοτίβο Regex + 4K|2160p|Remux + Οποιοδήποτε 1080p+ + AVC / x264 + Ποιότητα BluRay + Dolby Atmos / DTS + Αγγλικά + HDR / Dolby Vision + HEVC / x265 + Χωρίς CAM/TS + Χωρίς REMUX/HDR + Τυπικό 1080p + 4K / Remux + 720p / Μικρότερο + Πηγές WEB + Τύπος απόδοσης + Τυπικό (Cues) + Effects Canvas + Effects OpenGL + Overlay Canvas + Overlay OpenGL + Επαναχρησιμοποίηση τελευταίου συνδέσμου + Αυτόματη αναπαραγωγή της τελευταίας λειτουργικής ροής για την ίδια ταινία/επεισόδιο όταν η cache είναι ακόμα έγκυρη. + Δευτερεύουσα γλώσσα ήχου + Δευτερεύουσα γλώσσα υποτίτλων + ΑΠΟΚΩΔΙΚΟΠΟΙΗΤΗΣ + ΕΠΟΜΕΝΟ ΕΠΕΙΣΟΔΙΟ + PLAYER + ΠΑΡΑΛΕΙΨΗ ΤΜΗΜΑΤΩΝ + ΑΥΤΟΜΑΤΗ ΑΝΑΠΑΡΑΓΩΓΗ ΡΟΗΣ + ΕΠΙΛΟΓΗ ΡΟΗΣ + ΥΠΟΤΙΤΛΟΙ ΚΑΙ ΗΧΟΣ + ΑΠΟΔΟΣΗ ΥΠΟΤΙΤΛΩΝ + %1$d επιλεγμένα + Εμφάνιση overlay φόρτωσης + Εμφάνιση του αρχικού overlay φόρτωσης ενώ ξεκινά η αναπαραγωγή μιας ροής. + Παράλειψη εισαγωγής/εξόδου/ανακεφαλαίωσης + Εμφάνιση κουμπιού παράλειψης κατά τα εντοπισμένα τμήματα εισαγωγής, εξόδου και ανακεφαλαίωσης. + Εύρος πηγής + Όλα τα πρόσθετα + Εξέταση ροών από όλα τα εγκατεστημένα πρόσθετα. + Όλες οι πηγές + Εξέταση ροών τόσο από πρόσθετα όσο και από plugins. + Μόνο ενεργοποιημένα plugins + Εξέταση ροών μόνο από ενεργοποιημένα plugins. + Μόνο εγκατεστημένα πρόσθετα + Εξέταση ροών μόνο από εγκατεστημένα πρόσθετα. + Λειτουργία επιλογής ροής + Πρώτη διαθέσιμη ροή + Αυτόματη αναπαραγωγή της πρώτης ροής που βρέθηκε. + Χειροκίνητο + Χειροκίνητη επιλογή ροών κάθε φορά. + Αντιστοίχιση Regex + Αυτόματη επιλογή ροής που ταιριάζει με μοτίβο regex. + Χρονικό όριο ροής + Πόσο να αναμένει για ροές πριν από αυτόματη επιλογή. + Λεπτά πριν το τέλος + Λειτουργία κατωφλίου + Λεπτά πριν το τέλος + Ποσοστό + Ποσοστό κατωφλίου + Εμφάνιση κάρτας επόμενου επεισοδίου όταν η αναπαραγωγή φτάσει σε αυτό το ποσοστό. + %1$d%% + Άμεσα + %1$ds + Απεριόριστο + Tunneled αναπαραγωγή + Ενεργοποίηση tunneled αναπαραγωγής για χαμηλότερη καθυστέρηση συγχρονισμού ήχου/βίντεο. + Προσθέστε πρώτα το δικό σας κλειδί API TMDB παρακάτω πριν ενεργοποιήσετε τον εμπλουτισμό. + Κλειδί API TMDB + Ενεργοποίηση εμπλουτισμού TMDB + Χρήση του κλειδιού API TMDB για εμπλουτισμό μεταδεδομένων πρόσθετων στην οθόνη λεπτομερειών όταν υπάρχει αναγνωριστικό TMDB ή IMDb. + Εισάγετε το κλειδί API v3 TMDB. + Κωδικός γλώσσας + Artwork + Αντικατάσταση φόντου, αφίσας και λογότυπου με artwork TMDB. + Βασικές πληροφορίες + Χρήση τίτλου, σύνοψης, ειδών και αξιολόγησης TMDB. + Συλλογές + Εμφάνιση ραγών franchise και συλλογής για ταινίες όταν το TMDB τις παρέχει. + Ευχαριστίες + Χρήση δημιουργών, σκηνοθετών, σεναριογράφων και φωτογραφιών καστ TMDB. + Λεπτομέρειες + Χρήση πληροφοριών κυκλοφορίας, διάρκειας, διαβάθμισης ηλικίας, κατάστασης, χώρας και γλώσσας TMDB. + Επεισόδια + Χρήση τίτλων επεισοδίων, μικρογραφιών, περιγραφών και διάρκειας TMDB για σειρές. + Περισσότερα σαν αυτό + Εμφάνιση προτάσεων TMDB στο κάτω μέρος των σελίδων λεπτομερειών. + Δίκτυα + Χρήση μεταδεδομένων δικτύου TMDB για τηλεοπτικούς τίτλους. + Εταιρείες παραγωγής + Χρήση μεταδεδομένων εταιρείας παραγωγής TMDB στην οθόνη λεπτομερειών. + Αφίσες σεζόν + Χρήση αφισών σεζόν TMDB στον επιλογέα σεζόν της οθόνης μεταδεδομένων για σειρές. + Τρέιλερ + Λήψη και εμφάνιση ενότητας βίντεο τρέιλερ TMDB στις σελίδες λεπτομερειών. + Προσωπικό κλειδί API + Προτιμώμενη γλώσσα + Ορίστε τον κωδικό γλώσσας TMDB που χρησιμοποιείται για τοπικοποιημένα μεταδεδομένα, για παράδειγμα `el`, `el-GR` ή `en-US`. + ΔΙΑΠΙΣΤΕΥΤΗΡΙΑ + ΤΟΠΙΚΟΠΟΙΗΣΗ + ΕΝΟΤΗΤΕΣ + TMDB + Μετά την έγκριση, θα ανακατευθυνθείτε αυτόματα. + ΠΙΣΤΟΠΟΙΗΣΗ + Σχόλια + Εμφάνιση σχολίων Trakt στις λεπτομέρειες ταινίας και σειράς + Σύνδεση Trakt + Συνδεδεμένος ως %1$s + Χρήστης Trakt + Αποσύνδεση + Αποτυχία ανοίγματος προγράμματος περιήγησης + ΛΕΙΤΟΥΡΓΙΕΣ + Ολοκληρώστε τη σύνδεση Trakt στο πρόγραμμα περιήγησής σας + Παρακολουθήστε τι βλέπετε, αποθηκεύστε σε λίστα παρακολούθησης ή προσαρμοσμένες λίστες και διατηρήστε τη βιβλιοθήκη σας συγχρονισμένη με το Trakt. + Λείπουν διαπιστευτήρια Trakt στο local.properties (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET). + Άνοιγμα σύνδεσης Trakt + Οι ενέργειες αποθήκευσης μπορούν τώρα να στοχεύουν στη λίστα παρακολούθησης Trakt και τις προσωπικές λίστες. + Συνδεθείτε με το Trakt για να ενεργοποιήσετε την αποθήκευση βάσει λίστας και τη λειτουργία βιβλιοθήκης Trakt. + Βαθμολογία κοινού + IMDb + Letterboxd + Metacritic + Rotten Tomatoes + TMDB + Trakt + Άγνωστο + Κεχριμπάρι + Κόκκινο + Σμαράγδι + Ωκεανός + Τριαντάφυλλο + Βιολετί + Λευκό + Επόμενο επεισόδιο + Εύρεση πηγής… + Αναπαραγωγή μέσω %1$s σε %2$d… + Μικρογραφία επόμενου επεισοδίου + Δεν έχει προβληθεί + Παράλειψη + Παράλειψη εισαγωγής + Παράλειψη εξόδου + Παράλειψη ανακεφαλαίωσης + Δεν βρέθηκαν υπότιτλοι + Αφρικάανς + Αλβανικά + Αμχαρικά + Αραβικά + Αρμενικά + Αζερικά + Βασκικά + Λευκορωσικά + Βεγγαλικά + Βοσνιακά + Βουλγαρικά + Βιρμανικά + Καταλανικά + Κινεζικά + Κινεζικά (Απλοποιημένα) + Κινεζικά (Παραδοσιακά) + Κροατικά + Τσεχικά + Δανικά + Ολλανδικά + Αγγλικά + Εσθονικά + Φιλιππινέζικα + Φινλανδικά + Γαλλικά + Γαλικιανά + Γεωργιανά + Γερμανικά + Ελληνικά + Γκουτζαρατικά + Εβραϊκά + Ινδικά + Ουγγρικά + Ισλανδικά + Ινδονησιακά + Ιρλανδικά + Ιταλικά + Ιαπωνικά + Κανάντα + Καζακστανικά + Χμερ + Κορεατικά + Λαοτινά + Λετονικά + Λιθουανικά + Μακεδονικά + Μαλαισιανά + Μαλαγιαλάμ + Μαλτέζικα + Μαράθι + Μογγολικά + Νεπαλικά + Νορβηγικά + Περσικά + Πολωνικά + Πορτογαλικά (Πορτογαλία) + Πορτογαλικά (Βραζιλία) + Παντζαμπικά + Ρουμανικά + Ρωσικά + Σερβικά + Σινχαλέζικα + Σλοβακικά + Σλοβενικά + Ισπανικά + Ισπανικά (Λατινική Αμερική) + Σουαχίλι + Σουηδικά + Ταμίλ + Τελούγκου + Ταϊλανδέζικα + Τουρκικά + Ουκρανικά + Ουρντού + Ουζμπεκικά + Βιετναμικά + Ουαλικά + Ζουλού + Εκκαθάριση + Συνέχεια + Αγνόηση + Εγκατάσταση + Αργότερα + Όχι + Ενημέρωση + Ναι + Θέλετε να κλείσετε την εφαρμογή; + Έξοδος από εφαρμογή + Αυτός ο κατάλογος δεν επέστρεψε κανένα στοιχείο. + Δεν βρέθηκαν τίτλοι + Ελέγξτε τη σύνδεση Wi-Fi ή κινητών δεδομένων και δοκιμάστε ξανά. + Σκηνοθέτης + Αποτυχία φόρτωσης + Περισσότερα σαν αυτό + Σεζόν + Αυτό το πρόσθετο επέστρεψε βίντεο για τη σειρά, αλλά κανένα δεν περιελάμβανε αριθμούς σεζόν ή επεισοδίου. + Αυτό το πρόσθετο δεν παρείχε μεταδεδομένα επεισοδίων για αυτή τη σειρά. + Τα επεισόδια δεν έχουν δημοσιευτεί ακόμα από αυτό το πρόσθετο. + Η συσκευή σας είναι συνδεδεμένη στο διαδίκτυο, αλλά το Nuvio δεν μπόρεσε να φτάσει τους απαιτούμενους διακομιστές. + Εμφάνιση λιγότερων + Εμφάνιση περισσότερων ▾ + Σεναριογράφος + Όλα τα είδη + Κατάλογος + %1$s • %2$s + Ο επιλεγμένος κατάλογος δεν κατάφερε να επιστρέψει στοιχεία ανακάλυψης. + Αδυναμία φόρτωσης ανακάλυψης + Τα εγκατεστημένα πρόσθετα δεν παρέχουν καταλόγους συμβατούς με πίνακα για ανακάλυψη. + Δεν υπάρχουν κατάλογοι ανακάλυψης + Ο επιλεγμένος κατάλογος και τα φίλτρα δεν επέστρεψαν κανένα στοιχείο. + Δεν βρέθηκαν τίτλοι + Εγκαταστήστε και επικυρώστε τουλάχιστον ένα πρόσθετο πριν περιηγηθείτε στους καταλόγους ανακάλυψης. + Επιλογή καταλόγου + Επιλογή είδους + Επιλογή τύπου + Τύπος + Σήμανση προηγούμενων ως μη παρακολουθηθέντα + Σήμανση προηγούμενων ως παρακολουθηθέντα + Σήμανση %1$s ως μη παρακολουθηθείσα + Σήμανση %1$s ως παρακολουθηθείσα + Σήμανση ως μη παρακολουθηθέν + Σήμανση ως παρακολουθηθέν + Επόμενο + %1$d%% παρακολουθήθηκε + Εγκαταστήστε και επικυρώστε τουλάχιστον ένα πρόσθετο πριν φορτώσετε γραμμές καταλόγου στην Αρχική. + Τα εγκατεστημένα πρόσθετα δεν παρέχουν αυτή τη στιγμή καταλόγους συμβατούς με πίνακα χωρίς απαιτούμενα extras. + Δεν υπάρχουν διαθέσιμες γραμμές αρχικής + Προβολή λεπτομερειών + Έλεγχοι αναπαραγωγής και αποθήκευσης. + Ενέργειες + Λίστα κύριου καστ. + Ράγα σχετικής συλλογής ή franchise. + Συλλογή + Ενότητα σχολίων Trakt. + Διάρκεια, κατάσταση, κυκλοφορία, γλώσσα και σχετικές πληροφορίες. + Λεπτομέρειες + Σεζόν και λίστα επεισοδίων για σειρές. + Ράγα προτάσεων. + Περισσότερα σαν αυτό + Σύνοψη, αξιολογήσεις, είδη και βασικά credits. + Επισκόπηση + Στούντιο και δίκτυα. + Παραγωγή + Ράγα τρέιλερ και συντομεύσεις αναπαραγωγής. + Πάλι συνδεδεμένο + Αδυναμία σύνδεσης με διακομιστές + Δεν υπάρχει σύνδεση στο διαδίκτυο + (ηλικία %1$d) + Γεννήθηκε %1$s%2$s + Πέθανε %1$s + Γνωστός για: %1$s + Πιο πρόσφατο + Αδυναμία φόρτωσης λεπτομερειών για %1$s + Δημοφιλές + Κάτι πήγε στραβά + Επερχόμενο + Διαγραφή + Άκυρο + Εισάγετε PIN + Εισάγετε PIN για %1$s + Ξεχάσατε το PIN; + Λανθασμένο PIN + Κλειδωμένο. Δοκιμάστε ξανά σε %1$ds + Οι επιλογές avatar θα εμφανιστούν εδώ όταν φορτωθεί ο κατάλογος. + Avatar: %1$s + Επιλέξτε avatar + Επιλέξτε avatar παρακάτω. + Δημιουργία προφίλ + Όλα τα δεδομένα για το «%1$s» θα διαγραφούν μόνιμα. + Διαγραφή προφίλ + Προσθήκη προφίλ + Επεξεργασία προφίλ + Εισάγετε τρέχον PIN + Εισάγετε νέο PIN + Προφίλ %1$d + Φόρτωση avatars... + Διαχείριση προφίλ + Όνομα προφίλ + Νέο προφίλ + Κύρια πρόσθετα απενεργοποιημένα + Κύρια πρόσθετα ενεργοποιημένα + Αφαίρεση PIN για %1$s + Αφαίρεση κλειδώματος PIN + Αποθήκευση... + Ασφάλεια + Προσθέστε PIN αν θέλετε αυτό το προφίλ να κλειδώνεται πριν την εναλλαγή σε αυτό. + Αυτό το προφίλ προστατεύεται με PIN. + Επιλέξτε avatar για αυτό το προφίλ. + Ορισμός κλειδώματος PIN + Προφίλ χωρίς όνομα + Χρήση κύριων πρόσθετων + Κοινή χρήση της ρύθμισης πρόσθετων του κύριου προφίλ αντί για διαχείριση ξεχωριστής λίστας. + Ποιος παρακολουθεί; + Ληφθέν + Συνέχεια + Ενεργά scrapers + Έλεγχος περισσότερων πρόσθετων… + Αντιγραφή συνδέσμου ροής + Λήψη αρχείου + Τα εγκατεστημένα πρόσθετα ροής δεν κατάφεραν να επιστρέψουν έγκυρη απόκριση ροής. + Αδυναμία φόρτωσης ροών + Εγκαταστήστε πρώτα ένα πρόσθετο για να φορτώσετε ροές για αυτόν τον τίτλο. + Τα εγκατεστημένα πρόσθετα δεν παρέχουν ροές για αυτόν τον τύπο τίτλου. + Δεν υπάρχει διαθέσιμο πρόσθετο ροής + Κανένα από τα εγκατεστημένα πρόσθετα δεν επέστρεψε ροές για αυτόν τον τίτλο. + S%1$d E%2$d + Επεισόδιο + S%1$dE%2$d - %3$s + Αναζητά…… + Εύρεση πηγής… + Εύρεση ροών… + Ο σύνδεσμος ροής αντιγράφηκε + Δεν υπάρχει διαθέσιμος άμεσος σύνδεσμος ροής + Δεν υπάρχουν διαθέσιμα μεταδεδομένα + Ανανέωση ροών + Συνέχεια από %1$d%% + Συνέχεια από %1$s + ΜΕΓΕΘΟΣ %1$s + Κλείσιμο τρέιλερ + Αδυναμία αναπαραγωγής τρέιλερ + Αποτυχία φόρτωσης λιστών Trakt + Αποτυχία ενημέρωσης λιστών Trakt + %1$s • %2$s + Ο έλεγχος ενημερώσεων απέτυχε + Η λήψη απέτυχε + Λήψη %1$d%% + Αδυναμία εκκίνησης εγκατάστασης + Χρησιμοποιείτε την τελευταία έκδοση. + Ενεργοποιήστε τις εγκαταστάσεις εφαρμογών για το Nuvio και επιστρέψτε για να συνεχίσετε. + Εγκατάσταση ενημέρωσης... + Δεν βρέθηκαν ενημερώσεις. + Μια νέα έκδοση είναι έτοιμη για εγκατάσταση. + Οι ενημερώσεις εντός εφαρμογής δεν είναι διαθέσιμες σε αυτή την έκδοση. + Προετοιμασία λήψης + Σημειώσεις έκδοσης + Επιτρέψτε τις εγκαταστάσεις για συνέχεια + Διαθέσιμη ενημέρωση + Κατάσταση ενημέρωσης + Αυτό το πρόσθετο είναι ήδη εγκατεστημένο. + Εισάγετε μια έγκυρη διεύθυνση URL πρόσθετου + Αδυναμία φόρτωσης manifest + Nuvio + Η διαγραφή λογαριασμού απέτυχε + Η σύνδεση απέτυχε + Η αποσύνδεση απέτυχε + Η εγγραφή απέτυχε + Αδυναμία φόρτωσης στοιχείων καταλόγου. + Επόμενο + Επόμενο • S%1$dE%2$d + Λογότυπο %1$s + Αποτυχία φόρτωσης σχολίων + Αδυναμία φόρτωσης λεπτομερειών από οποιοδήποτε πρόσθετο. + Δίκτυα + Κανένα πρόσθετο δεν παρέχει μεταδεδομένα για αυτό το περιεχόμενο. + Η λήψη απέτυχε + Εμφανίζει ζωντανή πρόοδο λήψης και ελέγχους. + Λήψεις + Η λήψη ολοκληρώθηκε + Λήψη %1$s • %2$s + Λήψη %1$s • %2$s / %3$s + Η λήψη απέτυχε + Σε παύση %1$s + Αφαίρεση + Αφαίρεση %1$s από τη βιβλιοθήκη σας; + Αφαίρεση από βιβλιοθήκη; + Ταινία + Ειδοποιήσεις όταν κυκλοφορεί νέο επεισόδιο αποθηκευμένης σειράς. + Προεπισκόπηση ειδοποίησης κυκλοφορίας επεισοδίου. + Αποτυχία αποστολής δοκιμαστικής ειδοποίησης. + Η δοκιμαστική ειδοποίηση στάλθηκε για %1$s. + Αδυναμία αναπαραγωγής αυτής της ροής. + Το PIN αυτού του προφίλ άλλαξε. Συνδεθείτε μια φορά για να ανανεώσετε το κλείδωμα σε αυτήν τη συσκευή. + Αδυναμία αφαίρεσης κλειδώματος PIN. Δοκιμάστε ξανά. + Συνδεθείτε στο διαδίκτυο για να αφαιρέσετε το κλείδωμα PIN. + Αυτό το PIN δεν μπορεί να επαληθευτεί εκτός σύνδεσης σε αυτήν τη συσκευή ακόμα. Συνδεθείτε μια φορά και ξεκλειδώστε το online πρώτα. + Αδυναμία ορισμού PIN. Δοκιμάστε ξανά. + Συνδεθείτε στο διαδίκτυο για να ορίσετε PIN. + Αυτό το προφίλ χρησιμοποιεί κύρια πρόσθετα. + Αποτυχία φόρτωσης %1$s + Ροή + Ενσωματωμένο + Η εξουσιοδότηση απορρίφθηκε + Ολοκληρώστε τη σύνδεση Trakt στο πρόγραμμα περιήγησής σας + Μη έγκυρη επιστροφή κλήσης Trakt + Μη έγκυρη κατάσταση επιστροφής κλήσης Trakt + Μη έγκυρη απόκριση token Trakt + Αποτυχία φόρτωσης βιβλιοθήκης Trakt + Λίστα %1$d + Το Trakt δεν επέστρεψε κωδικό εξουσιοδότησης + Λείπουν διαπιστευτήρια Trakt + Αποτυχία φόρτωσης προόδου Trakt + Αποτυχία ολοκλήρωσης σύνδεσης Trakt + Χρήστης Trakt + Λίστα παρακολούθησης + Τρέιλερ + Άγνωστο + Πρόσθετο + Αποθηκεύτηκε + Αναπαραγωγή %1$s + Συνέχεια %1$s + Το JSON είναι κενό. + Η συλλογή %1$d έχει κενό αναγνωριστικό. + Η συλλογή «%1$s» έχει κενό τίτλο. + Ο φάκελος %1$d στο «%2$s» έχει κενό αναγνωριστικό. + Ο φάκελος «%1$s» στο «%2$s» έχει κενό τίτλο. + Η πηγή %1$d στον φάκελο «%2$s» έχει κενά πεδία. + Μη έγκυρο JSON: %1$s + Το πρόσθετο δεν βρέθηκε: %1$s + Ιανουάριος + Φεβρουάριος + Μάρτιος + Απρίλιος + Μάιος + Ιούνιος + Ιούλιος + Αύγουστος + Σεπτέμβριος + Οκτώβριος + Νοέμβριος + Δεκέμβριος + Ιαν + Φεβ + Μαρ + Απρ + Μάι + Ιουν + Ιουλ + Αυγ + Σεπ + Οκτ + Νοε + Δεκ + Εταιρεία παραγωγής + Δίκτυο + Αδυναμία φόρτωσης %1$s + Δημοφιλές + Πρόσφατο + %1$s • %2$s + Κορυφαία αξιολογημένα + Διαβάθμιση + Λεπτομέρειες ταινίας + Πρωτότυπη γλώσσα + Χώρα προέλευσης + Πληροφορίες κυκλοφορίας + Διάρκεια + Αφίσες + Κείμενο + Λεπτομέρειες σειράς + Κατάσταση + Βίντεο + ΑΡΧΕΙΟ + Δεν υπάρχει διαθέσιμος άμεσος σύνδεσμος ροής + Αντικαταστάθηκε προηγούμενη λήψη + Η λήψη ξεκίνησε + Μη υποστηριζόμενη μορφή ροής για λήψεις + Κενό σώμα απόκρισης + Το αίτημα απέτυχε με HTTP %1$d + Το σύστημα λήψης δεν έχει αρχικοποιηθεί + Το αίτημα λήψης απέτυχε + %1$s - %2$s + Οι αποθηκευμένοι τίτλοι θα εμφανιστούν εδώ αφού πατήσετε Αποθήκευση σε μια οθόνη λεπτομερειών. + Η βιβλιοθήκη σας είναι κενή + Αδυναμία φόρτωσης βιβλιοθήκης + Άλλο + Βιβλιοθήκη + Συνδέστε το Trakt και αποθηκεύστε τίτλους στη λίστα παρακολούθησης ή σε προσωπικές λίστες. + Η βιβλιοθήκη Trakt σας είναι κενή + Αδυναμία φόρτωσης βιβλιοθήκης Trakt + Βιβλιοθήκη Trakt + Anime + Κανάλια + Ταινίες + Σειρές + Τηλεόραση + Το %1$s είναι τώρα διαθέσιμο + %1$s • %2$s είναι τώρα διαθέσιμο + Ένα νέο επεισόδιο είναι τώρα διαθέσιμο + Το %1$s είναι τώρα διαθέσιμο + Κυκλοφορίες επεισοδίων + Δημιουργός + Σκηνοθέτης + Σεναριογράφος + Βαθμολογία κοινού + Δεν βρέθηκε αναπαράγωγη ροή τρέιλερ. + Σεζόν %1$d - %2$s + B + KB + MB + GB + \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt index b3c2532a..bfe12abf 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt @@ -5,6 +5,7 @@ import nuvio.composeapp.generated.resources.lang_english import nuvio.composeapp.generated.resources.lang_spanish import nuvio.composeapp.generated.resources.lang_turkish import nuvio.composeapp.generated.resources.lang_italian +import nuvio.composeapp.generated.resources.lang_greek import org.jetbrains.compose.resources.StringResource enum class AppLanguage( From 31c374482aa194bec836ca37612fa03679220aa6 Mon Sep 17 00:00:00 2001 From: Lliakos Date: Sat, 25 Apr 2026 22:03:55 +0300 Subject: [PATCH 027/143] Add Greek translation for mobile app fixed --- composeApp/src/androidMain/res/xml/locale_config.xml | 1 + .../kotlin/com/nuvio/app/features/settings/AppLanguage.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/composeApp/src/androidMain/res/xml/locale_config.xml b/composeApp/src/androidMain/res/xml/locale_config.xml index 9eb1f870..6e8aae61 100644 --- a/composeApp/src/androidMain/res/xml/locale_config.xml +++ b/composeApp/src/androidMain/res/xml/locale_config.xml @@ -4,4 +4,5 @@ + diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt index bfe12abf..9aa30c83 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt @@ -16,6 +16,7 @@ enum class AppLanguage( SPANISH("es", Res.string.lang_spanish), TURKISH("tr", Res.string.lang_turkish), ITALIAN("it", Res.string.lang_italian), + GREEK("el", Res.string.lang_greek), ; companion object { From acf76f30c4e255efd3fe0701e0f661582d6f68bc Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sun, 26 Apr 2026 00:46:54 +0530 Subject: [PATCH 028/143] Add TMDB localization updates --- .../composeResources/values-es/strings.xml | 118 ++++++ .../composeResources/values/strings.xml | 118 ++++++ .../collection/CollectionEditorScreen.kt | 341 ++++++++++++------ 3 files changed, 473 insertions(+), 104 deletions(-) diff --git a/composeApp/src/commonMain/composeResources/values-es/strings.xml b/composeApp/src/commonMain/composeResources/values-es/strings.xml index 421b1531..725a89a0 100644 --- a/composeApp/src/commonMain/composeResources/values-es/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-es/strings.xml @@ -90,6 +90,9 @@ Elige los catálogos del complemento que debe agrupar esta carpeta. Seleccionar catálogos Seleccionar género + %1$d seleccionados + %1$d catálogos + %1$d seleccionados Póster Cuadrado Panorámico @@ -102,6 +105,121 @@ Filas Pestañas Modo de vista + Fuentes de TMDB + Lista pública + Producción + Cadena + Colección + Personalizado + Elige una fuente preparada. Puedes editarla o quitarla después de añadirla. + Pega una URL de lista pública de TMDB o solo el número de la URL. + Busca por nombre de estudio, o pega un ID/URL de compañía de TMDB y añádelo directamente. + Introduce un ID de cadena. Las cadenas comunes están disponibles en ajustes predefinidos y filtros rápidos. + Busca el nombre de una colección de películas o pega el ID de colección de TMDB. + Crea una fila dinámica de TMDB con filtros opcionales. Deja los campos vacíos cuando no necesites ese filtro. + Lista pública de TMDB + ID de cadena + ID de colección + Nombre, ID o URL de compañía de producción + ID o URL de TMDB + https://www.themoviedb.org/list/8504994 o 8504994 + 213 para Netflix, 49 para HBO, 2739 para Disney+ + 10 para Star Wars Collection + Marvel Studios, 420 o URL de compañía + Ejemplos: Marvel Studios, 420 o https://www.themoviedb.org/company/420. + Ejemplo: Star Wars Collection, Harry Potter Collection o una URL de colección. + IDs de ejemplo: Netflix 213, HBO 49, Disney+ 2739. + Ejemplo: https://www.themoviedb.org/list/8504994 o 8504994. + Título visible + Se muestra como nombre de fila/pestaña. Si queda vacío, Nuvio crea uno desde la fuente. + Películas de Marvel, Originales de Netflix, Pixar + Mejores películas de acción, dramas coreanos, animación 2024 + Resultados de búsqueda + Colección de TMDB + Compañía de TMDB %1$d + Colección de TMDB %1$d + Tipo + Películas + Series + Ambos + Orden + Filtros + Deja los campos vacíos cuando no necesites ese filtro. + Géneros rápidos + Idiomas rápidos + Países rápidos + Palabras clave rápidas + Estudios rápidos + Cadenas rápidas + IDs de género + Usa números de género de TMDB. Separa varios con comas para AND, o barras verticales para OR. + Fecha de estreno o emisión desde + Fecha de estreno o emisión hasta + Usa YYYY-MM-DD, por ejemplo 2024-01-01. + Calificación mínima + Calificación máxima + Calificación de TMDB de 0 a 10. Ejemplo: 7.0. + Votos mínimos + Úsalo para evitar títulos poco conocidos con pocos votos. Ejemplo: 100. + Idioma original + Usa códigos de idioma de dos letras, por ejemplo en, ko, ja, hi. + País de origen + Usa códigos de país de dos letras, por ejemplo US, KR, JP, IN. + IDs de palabra clave + Usa números de palabra clave de TMDB. Los chips rápidos rellenan ejemplos comunes. + 9715 para superhéroes + IDs de compañía + Usa IDs de estudio/compañía. Los chips rápidos rellenan ejemplos comunes. + 420 para Marvel Studios + IDs de cadena + Solo para series. Usa IDs de cadena como Netflix 213 o HBO 49. + 213 para Netflix + Año + Usa un año de cuatro dígitos, por ejemplo 2024. + Predefinidos + Buscar + Añadir fuente + Acción + Aventura + Animación + Comedia + Terror + Ciencia ficción + Drama + Crimen + Reality + Inglés + Coreano + Japonés + Hindi + Español + Estados Unidos + Corea + Japón + India + Reino Unido + Superhéroes + Basado en novela + Viaje en el tiempo + Espacio + Marvel + Disney + Pixar + Lucasfilm + Warner Bros. + Netflix + HBO + Disney+ + Prime Video + Hulu + Popular + Mejor valoradas + Reciente + Lista de TMDB + Colección de películas de TMDB + Producción + Cadena + Discover de TMDB Crea una para organizar tus catálogos. Aún no hay colecciones %1$d carpeta(s) diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index 842bef80..7ddc8923 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -90,6 +90,9 @@ Choose the addon catalogs this folder should aggregate. Select Catalogs Select genre + %1$d selected + %1$d catalogs + %1$d selected Poster Square Wide @@ -102,6 +105,121 @@ Rows Tabs View Mode + TMDB Sources + Public List + Production + Network + Collection + Custom + Pick a ready-made source. You can edit or remove it after adding. + Paste a public TMDB list URL or only the number from the URL. + Search by studio name, or paste a TMDB company ID/URL and add it directly. + Enter a network ID. Common networks are available in Presets and quick filters. + Search a movie collection name or paste the collection ID from TMDB. + Build a live TMDB row using optional filters. Leave fields empty when you do not need that filter. + Public TMDB list + Network ID + Collection ID + Production company name, ID, or URL + TMDB ID or URL + https://www.themoviedb.org/list/8504994 or 8504994 + 213 for Netflix, 49 for HBO, 2739 for Disney+ + 10 for Star Wars Collection + Marvel Studios, 420, or company URL + Examples: Marvel Studios, 420, or https://www.themoviedb.org/company/420. + Example: Star Wars Collection, Harry Potter Collection, or a collection URL. + Example IDs: Netflix 213, HBO 49, Disney+ 2739. + Example: https://www.themoviedb.org/list/8504994 or 8504994. + Display title + Shown as the row/tab name. If blank, Nuvio creates one from the source. + Marvel Movies, Netflix Originals, Pixar + Best Action Movies, Korean Dramas, 2024 Animation + Search Results + TMDB Collection + TMDB Company %1$d + TMDB Collection %1$d + Type + Movies + Series + Both + Sort + Filters + Leave fields empty when you do not need that filter. + Quick genres + Quick languages + Quick countries + Quick keywords + Quick studios + Quick networks + Genre IDs + Use TMDB genre numbers. Separate multiple with commas for AND, or pipes for OR. + Release or air date from + Release or air date to + Use YYYY-MM-DD, for example 2024-01-01. + Minimum rating + Maximum rating + TMDB rating from 0 to 10. Example: 7.0. + Minimum votes + Use this to avoid obscure low-vote titles. Example: 100. + Original language + Use two-letter language codes, for example en, ko, ja, hi. + Origin country + Use two-letter country codes, for example US, KR, JP, IN. + Keyword IDs + Use TMDB keyword numbers. Quick chips fill common examples. + 9715 for superhero + Company IDs + Use studio/company IDs. Quick chips fill common examples. + 420 for Marvel Studios + Network IDs + For series only. Use network IDs like Netflix 213 or HBO 49. + 213 for Netflix + Year + Use a four-digit year, for example 2024. + Presets + Search + Add Source + Action + Adventure + Animation + Comedy + Horror + Sci-Fi + Drama + Crime + Reality + English + Korean + Japanese + Hindi + Spanish + United States + Korea + Japan + India + United Kingdom + Superhero + Based on Novel + Time Travel + Space + Marvel + Disney + Pixar + Lucasfilm + Warner Bros. + Netflix + HBO + Disney+ + Prime Video + Hulu + Popular + Top Rated + Recent + TMDB List + TMDB Movie Collection + Production + Network + TMDB Discover Create one to organize your catalogs. No collections yet %1$d folder(s) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt index 15b2a28a..41ee6532 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt @@ -714,7 +714,7 @@ private fun FolderEditorPage( modifier = Modifier.size(18.dp), ) Spacer(modifier = Modifier.width(4.dp)) - Text("TMDB") + Text(stringResource(Res.string.source_tmdb)) } TextButton(onClick = { CollectionEditorRepository.showCatalogPicker() }) { Icon( @@ -829,7 +829,7 @@ private fun CatalogPickerScreen( color = MaterialTheme.colorScheme.onSurfaceVariant, ) Text( - text = "${selectedSources.size} selected", + text = stringResource(Res.string.collections_editor_selected_count, selectedSources.size), style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.primary, @@ -850,7 +850,11 @@ private fun CatalogPickerScreen( } PickerPanel( title = addonName, - subtitle = if (selectedCount > 0) "$selectedCount selected" else "${catalogs.size} catalogs", + subtitle = if (selectedCount > 0) { + stringResource(Res.string.collections_editor_catalog_selected_count, selectedCount) + } else { + stringResource(Res.string.collections_editor_catalog_count, catalogs.size) + }, ) { catalogs.forEachIndexed { index, catalog -> val isSelected = selectedSources.any { @@ -896,6 +900,12 @@ private fun TmdbSourcePickerScreen( TmdbBuilderMode.DISCOVER -> TmdbCollectionSourceType.DISCOVER } val requiresId = sourceType != TmdbCollectionSourceType.DISCOVER + val showMediaControls = state.tmdbBuilderMode == TmdbBuilderMode.PRODUCTION || + state.tmdbBuilderMode == TmdbBuilderMode.DISCOVER + val showSortControls = state.tmdbBuilderMode == TmdbBuilderMode.PRODUCTION || + state.tmdbBuilderMode == TmdbBuilderMode.NETWORK || + state.tmdbBuilderMode == TmdbBuilderMode.DISCOVER + val showFilterControls = state.tmdbBuilderMode == TmdbBuilderMode.DISCOVER PlatformBackHandler(enabled = true) { onBack() @@ -905,7 +915,7 @@ private fun TmdbSourcePickerScreen( NuvioScreen(modifier = Modifier.fillMaxSize()) { stickyHeader { NuvioScreenHeader( - title = "TMDB Sources", + title = stringResource(Res.string.collections_editor_tmdb_sources), onBack = onBack, ) } @@ -957,11 +967,11 @@ private fun TmdbSourcePickerScreen( ) } TmdbLabeledField( - label = "Display title", + label = stringResource(Res.string.collections_editor_tmdb_display_title), value = state.tmdbTitleInput, onValueChange = { CollectionEditorRepository.setTmdbTitleInput(it) }, placeholder = tmdbTitlePlaceholder(state.tmdbBuilderMode), - helper = "Shown as the row/tab name. If blank, Nuvio creates one from the source.", + helper = stringResource(Res.string.collections_editor_tmdb_title_helper), ) if (state.tmdbSearchError != null) { Text( @@ -976,20 +986,25 @@ private fun TmdbSourcePickerScreen( if (state.tmdbBuilderMode == TmdbBuilderMode.PRODUCTION && state.tmdbCompanyResults.isNotEmpty()) { item { - PickerSectionLabel("Search Results") + PickerSectionLabel(stringResource(Res.string.collections_editor_tmdb_search_results)) } itemsIndexed(state.tmdbCompanyResults) { _, result -> - val title = result.name ?: "TMDB Company ${result.id}" + val title = result.name ?: stringResource(Res.string.collections_editor_tmdb_company_fallback, result.id) + val movieSuffix = stringResource(Res.string.collections_editor_tmdb_movies) + val seriesSuffix = stringResource(Res.string.collections_editor_tmdb_series) PickerOptionRow( title = title, - subtitle = listOfNotNull("Production", result.originCountry).joinToString(" • "), + subtitle = listOfNotNull( + stringResource(Res.string.collections_editor_tmdb_subtitle_production), + result.originCountry, + ).joinToString(" • "), selected = false, onClick = { val sources = tmdbSelectedMediaTypes(state).map { mediaType -> CollectionSource( provider = "tmdb", tmdbSourceType = TmdbCollectionSourceType.COMPANY.name, - title = tmdbTitleForMedia(title, mediaType, state.tmdbMediaBoth), + title = tmdbTitleForMedia(title, mediaType, state.tmdbMediaBoth, movieSuffix, seriesSuffix), tmdbId = result.id, mediaType = mediaType.name, sortBy = state.tmdbSortBy, @@ -1004,13 +1019,13 @@ private fun TmdbSourcePickerScreen( if (state.tmdbBuilderMode == TmdbBuilderMode.COLLECTION && state.tmdbCollectionResults.isNotEmpty()) { item { - PickerSectionLabel("Search Results") + PickerSectionLabel(stringResource(Res.string.collections_editor_tmdb_search_results)) } itemsIndexed(state.tmdbCollectionResults) { _, result -> - val title = result.name ?: "TMDB Collection ${result.id}" + val title = result.name ?: stringResource(Res.string.collections_editor_tmdb_collection_fallback, result.id) PickerOptionRow( title = title, - subtitle = "TMDB Movie Collection", + subtitle = stringResource(Res.string.collections_editor_tmdb_collection), selected = false, onClick = { CollectionEditorRepository.addTmdbSource( @@ -1028,11 +1043,10 @@ private fun TmdbSourcePickerScreen( } } - if (sourceType == TmdbCollectionSourceType.COMPANY || sourceType == TmdbCollectionSourceType.DISCOVER) { + if (showMediaControls) { item { PickerPanel( - title = "Media", - subtitle = "Create one source or split it into movie and series feeds.", + title = stringResource(Res.string.collections_editor_tmdb_type), ) { FlowRow( horizontalArrangement = Arrangement.spacedBy(8.dp), @@ -1044,7 +1058,7 @@ private fun TmdbSourcePickerScreen( CollectionEditorRepository.setTmdbMediaBoth(false) CollectionEditorRepository.setTmdbMediaType(TmdbCollectionMediaType.MOVIE) }, - label = { Text("Movies") }, + label = { Text(stringResource(Res.string.collections_editor_tmdb_movies)) }, ) FilterChip( selected = state.tmdbMediaType == TmdbCollectionMediaType.TV && !state.tmdbMediaBoth, @@ -1052,26 +1066,22 @@ private fun TmdbSourcePickerScreen( CollectionEditorRepository.setTmdbMediaBoth(false) CollectionEditorRepository.setTmdbMediaType(TmdbCollectionMediaType.TV) }, - label = { Text("Series") }, + label = { Text(stringResource(Res.string.collections_editor_tmdb_series)) }, ) FilterChip( selected = state.tmdbMediaBoth, onClick = { CollectionEditorRepository.setTmdbMediaBoth(true) }, - label = { Text("Both") }, + label = { Text(stringResource(Res.string.collections_editor_tmdb_both)) }, ) } } } } - if (sourceType == TmdbCollectionSourceType.COMPANY || - sourceType == TmdbCollectionSourceType.NETWORK || - sourceType == TmdbCollectionSourceType.DISCOVER - ) { + if (showSortControls) { item { PickerPanel( - title = "Sort", - subtitle = "Controls the default order TMDB returns.", + title = stringResource(Res.string.collections_editor_tmdb_sort), ) { FlowRow( horizontalArrangement = Arrangement.spacedBy(8.dp), @@ -1096,23 +1106,27 @@ private fun TmdbSourcePickerScreen( } } } + } + if (showFilterControls) { item { PickerPanel( - title = "Filters", - subtitle = "Combine TMDB IDs and date/rating constraints for exact feeds.", + title = stringResource(Res.string.collections_editor_tmdb_filters), + subtitle = stringResource(Res.string.collections_editor_tmdb_filters_helper), ) { Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { TmdbQuickChips( - label = "Quick genres", + label = stringResource(Res.string.collections_editor_tmdb_quick_genres), chips = tmdbGenreQuickChips(state.tmdbMediaType), onSelect = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(withGenres = value) } }, ) TmdbFilterField( + label = stringResource(Res.string.collections_editor_tmdb_genres), + helper = stringResource(Res.string.collections_editor_tmdb_genres_helper), value = state.tmdbFilters.withGenres.orEmpty(), - placeholder = "Genre IDs, comma-separated", + placeholder = if (state.tmdbMediaType == TmdbCollectionMediaType.MOVIE) "28,12" else "18,35", onValueChange = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(withGenres = value.ifBlank { null }) @@ -1120,17 +1134,10 @@ private fun TmdbSourcePickerScreen( }, ) TmdbFilterField( - value = state.tmdbFilters.year?.toString().orEmpty(), - placeholder = "Year", - onValueChange = { value -> - CollectionEditorRepository.updateTmdbFilters { - it.copy(year = value.toIntOrNull()) - } - }, - ) - TmdbFilterField( + label = stringResource(Res.string.collections_editor_tmdb_date_from), + helper = stringResource(Res.string.collections_editor_tmdb_date_helper), value = state.tmdbFilters.releaseDateGte.orEmpty(), - placeholder = "Release from YYYY-MM-DD", + placeholder = "2020-01-01", onValueChange = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(releaseDateGte = value.ifBlank { null }) @@ -1138,8 +1145,10 @@ private fun TmdbSourcePickerScreen( }, ) TmdbFilterField( + label = stringResource(Res.string.collections_editor_tmdb_date_to), + helper = stringResource(Res.string.collections_editor_tmdb_date_helper), value = state.tmdbFilters.releaseDateLte.orEmpty(), - placeholder = "Release until YYYY-MM-DD", + placeholder = "2024-12-31", onValueChange = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(releaseDateLte = value.ifBlank { null }) @@ -1147,8 +1156,10 @@ private fun TmdbSourcePickerScreen( }, ) TmdbFilterField( + label = stringResource(Res.string.collections_editor_tmdb_rating_min), + helper = stringResource(Res.string.collections_editor_tmdb_rating_helper), value = state.tmdbFilters.voteAverageGte?.toString().orEmpty(), - placeholder = "Minimum rating", + placeholder = "7.0", onValueChange = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(voteAverageGte = value.toDoubleOrNull()) @@ -1156,33 +1167,45 @@ private fun TmdbSourcePickerScreen( }, ) TmdbFilterField( - value = state.tmdbFilters.voteCountGte?.toString().orEmpty(), - placeholder = "Minimum vote count", - onValueChange = { value -> - CollectionEditorRepository.updateTmdbFilters { - it.copy(voteCountGte = value.toIntOrNull()) - } - }, - ) - TmdbFilterField( + label = stringResource(Res.string.collections_editor_tmdb_rating_max), + helper = stringResource(Res.string.collections_editor_tmdb_rating_helper), value = state.tmdbFilters.voteAverageLte?.toString().orEmpty(), - placeholder = "Maximum rating", + placeholder = "10", onValueChange = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(voteAverageLte = value.toDoubleOrNull()) } }, ) + TmdbFilterField( + label = stringResource(Res.string.collections_editor_tmdb_votes_min), + helper = stringResource(Res.string.collections_editor_tmdb_votes_helper), + value = state.tmdbFilters.voteCountGte?.toString().orEmpty(), + placeholder = "100", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(voteCountGte = value.toIntOrNull()) + } + }, + ) TmdbQuickChips( - label = "Quick languages", - chips = listOf("English" to "en", "Korean" to "ko", "Japanese" to "ja", "Hindi" to "hi", "Spanish" to "es"), + label = stringResource(Res.string.collections_editor_tmdb_quick_languages), + chips = listOf( + stringResource(Res.string.collections_editor_tmdb_language_english) to "en", + stringResource(Res.string.collections_editor_tmdb_language_korean) to "ko", + stringResource(Res.string.collections_editor_tmdb_language_japanese) to "ja", + stringResource(Res.string.collections_editor_tmdb_language_hindi) to "hi", + stringResource(Res.string.collections_editor_tmdb_language_spanish) to "es", + ), onSelect = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(withOriginalLanguage = value) } }, ) TmdbFilterField( + label = stringResource(Res.string.collections_editor_tmdb_language), + helper = stringResource(Res.string.collections_editor_tmdb_language_helper), value = state.tmdbFilters.withOriginalLanguage.orEmpty(), - placeholder = "Original language, e.g. en", + placeholder = "en, ko, ja, hi", onValueChange = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(withOriginalLanguage = value.ifBlank { null }) @@ -1190,15 +1213,23 @@ private fun TmdbSourcePickerScreen( }, ) TmdbQuickChips( - label = "Quick countries", - chips = listOf("United States" to "US", "Korea" to "KR", "Japan" to "JP", "India" to "IN", "United Kingdom" to "GB"), + label = stringResource(Res.string.collections_editor_tmdb_quick_countries), + chips = listOf( + stringResource(Res.string.collections_editor_tmdb_country_us) to "US", + stringResource(Res.string.collections_editor_tmdb_country_korea) to "KR", + stringResource(Res.string.collections_editor_tmdb_country_japan) to "JP", + stringResource(Res.string.collections_editor_tmdb_country_india) to "IN", + stringResource(Res.string.collections_editor_tmdb_country_uk) to "GB", + ), onSelect = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(withOriginCountry = value) } }, ) TmdbFilterField( + label = stringResource(Res.string.collections_editor_tmdb_country), + helper = stringResource(Res.string.collections_editor_tmdb_country_helper), value = state.tmdbFilters.withOriginCountry.orEmpty(), - placeholder = "Origin country, e.g. US", + placeholder = "US, KR, JP, IN", onValueChange = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(withOriginCountry = value.ifBlank { null }) @@ -1206,15 +1237,22 @@ private fun TmdbSourcePickerScreen( }, ) TmdbQuickChips( - label = "Quick keywords", - chips = listOf("Superhero" to "9715", "Based on Novel" to "818", "Time Travel" to "4379", "Space" to "9882"), + label = stringResource(Res.string.collections_editor_tmdb_quick_keywords), + chips = listOf( + stringResource(Res.string.collections_editor_tmdb_keyword_superhero) to "9715", + stringResource(Res.string.collections_editor_tmdb_keyword_based_on_novel) to "818", + stringResource(Res.string.collections_editor_tmdb_keyword_time_travel) to "4379", + stringResource(Res.string.collections_editor_tmdb_keyword_space) to "9882", + ), onSelect = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(withKeywords = value) } }, ) TmdbFilterField( + label = stringResource(Res.string.collections_editor_tmdb_keywords), + helper = stringResource(Res.string.collections_editor_tmdb_keywords_helper), value = state.tmdbFilters.withKeywords.orEmpty(), - placeholder = "Keyword IDs", + placeholder = stringResource(Res.string.collections_editor_tmdb_keywords_placeholder), onValueChange = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(withKeywords = value.ifBlank { null }) @@ -1222,15 +1260,23 @@ private fun TmdbSourcePickerScreen( }, ) TmdbQuickChips( - label = "Quick companies", - chips = listOf("Marvel" to "420", "Disney" to "2", "Pixar" to "3", "Lucasfilm" to "1", "Warner Bros." to "174"), + label = stringResource(Res.string.collections_editor_tmdb_quick_studios), + chips = listOf( + stringResource(Res.string.collections_editor_tmdb_studio_marvel) to "420", + stringResource(Res.string.collections_editor_tmdb_studio_disney) to "2", + stringResource(Res.string.collections_editor_tmdb_studio_pixar) to "3", + stringResource(Res.string.collections_editor_tmdb_studio_lucasfilm) to "1", + stringResource(Res.string.collections_editor_tmdb_studio_warner) to "174", + ), onSelect = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(withCompanies = value) } }, ) TmdbFilterField( + label = stringResource(Res.string.collections_editor_tmdb_companies), + helper = stringResource(Res.string.collections_editor_tmdb_companies_helper), value = state.tmdbFilters.withCompanies.orEmpty(), - placeholder = "Company IDs, e.g. 420", + placeholder = stringResource(Res.string.collections_editor_tmdb_companies_placeholder), onValueChange = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(withCompanies = value.ifBlank { null }) @@ -1238,28 +1284,47 @@ private fun TmdbSourcePickerScreen( }, ) TmdbQuickChips( - label = "Quick networks", - chips = listOf("Netflix" to "213", "HBO" to "49", "Disney+" to "2739", "Prime Video" to "1024", "Hulu" to "453"), + label = stringResource(Res.string.collections_editor_tmdb_quick_networks), + chips = listOf( + stringResource(Res.string.collections_editor_tmdb_network_netflix) to "213", + stringResource(Res.string.collections_editor_tmdb_network_hbo) to "49", + stringResource(Res.string.collections_editor_tmdb_network_disney_plus) to "2739", + stringResource(Res.string.collections_editor_tmdb_network_prime_video) to "1024", + stringResource(Res.string.collections_editor_tmdb_network_hulu) to "453", + ), onSelect = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(withNetworks = value) } }, ) TmdbFilterField( + label = stringResource(Res.string.collections_editor_tmdb_networks), + helper = stringResource(Res.string.collections_editor_tmdb_networks_helper), value = state.tmdbFilters.withNetworks.orEmpty(), - placeholder = "Network IDs, e.g. 213", + placeholder = stringResource(Res.string.collections_editor_tmdb_networks_placeholder), onValueChange = { value -> CollectionEditorRepository.updateTmdbFilters { it.copy(withNetworks = value.ifBlank { null }) } }, ) + TmdbFilterField( + label = stringResource(Res.string.collections_editor_tmdb_year), + helper = stringResource(Res.string.collections_editor_tmdb_year_helper), + value = state.tmdbFilters.year?.toString().orEmpty(), + placeholder = "2024", + onValueChange = { value -> + CollectionEditorRepository.updateTmdbFilters { + it.copy(year = value.toIntOrNull()) + } + }, + ) } } } } if (state.tmdbBuilderMode == TmdbBuilderMode.PRESETS) item { - PickerSectionLabel("Presets") + PickerSectionLabel(stringResource(Res.string.collections_editor_tmdb_presets)) } if (state.tmdbBuilderMode == TmdbBuilderMode.PRESETS) { itemsIndexed(TmdbCollectionSourceResolver.presets()) { _, preset -> @@ -1313,11 +1378,11 @@ private fun TmdbSourcePickerScreen( modifier = Modifier.size(18.dp), ) Spacer(modifier = Modifier.width(4.dp)) - Text("Search") + Text(stringResource(Res.string.collections_editor_tmdb_search)) } } NuvioPrimaryButton( - text = "Add TMDB source", + text = stringResource(Res.string.collections_editor_add_source), modifier = Modifier.weight(1f), enabled = !requiresId || state.tmdbInput.isNotBlank(), onClick = { CollectionEditorRepository.addTmdbSourceFromInput() }, @@ -1510,23 +1575,24 @@ private fun TmdbQuickChips( } } +@Composable private fun tmdbGenreQuickChips(mediaType: TmdbCollectionMediaType): List> = when (mediaType) { TmdbCollectionMediaType.MOVIE -> listOf( - "Action" to "28", - "Adventure" to "12", - "Animation" to "16", - "Comedy" to "35", - "Horror" to "27", - "Sci-Fi" to "878", + stringResource(Res.string.collections_editor_tmdb_genre_action) to "28", + stringResource(Res.string.collections_editor_tmdb_genre_adventure) to "12", + stringResource(Res.string.collections_editor_tmdb_genre_animation) to "16", + stringResource(Res.string.collections_editor_tmdb_genre_comedy) to "35", + stringResource(Res.string.collections_editor_tmdb_genre_horror) to "27", + stringResource(Res.string.collections_editor_tmdb_genre_scifi) to "878", ) TmdbCollectionMediaType.TV -> listOf( - "Drama" to "18", - "Comedy" to "35", - "Animation" to "16", - "Crime" to "80", - "Sci-Fi" to "10765", - "Reality" to "10764", + stringResource(Res.string.collections_editor_tmdb_genre_drama) to "18", + stringResource(Res.string.collections_editor_tmdb_genre_comedy) to "35", + stringResource(Res.string.collections_editor_tmdb_genre_animation) to "16", + stringResource(Res.string.collections_editor_tmdb_genre_crime) to "80", + stringResource(Res.string.collections_editor_tmdb_genre_scifi) to "10765", + stringResource(Res.string.collections_editor_tmdb_genre_reality) to "10764", ) } @@ -1541,11 +1607,13 @@ private fun tmdbTitleForMedia( title: String, mediaType: TmdbCollectionMediaType, addSuffix: Boolean, + movieSuffix: String, + seriesSuffix: String, ): String { if (!addSuffix) return title val suffix = when (mediaType) { - TmdbCollectionMediaType.MOVIE -> "Movies" - TmdbCollectionMediaType.TV -> "Series" + TmdbCollectionMediaType.MOVIE -> movieSuffix + TmdbCollectionMediaType.TV -> seriesSuffix } return "$title $suffix" } @@ -1687,7 +1755,7 @@ private fun FolderTmdbSourceCard( Row(verticalAlignment = Alignment.CenterVertically) { Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { Text( - text = source.title?.takeIf { it.isNotBlank() } ?: "TMDB", + text = source.title?.takeIf { it.isNotBlank() } ?: stringResource(Res.string.source_tmdb), style = MaterialTheme.typography.bodyLarge, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurface, @@ -1695,7 +1763,7 @@ private fun FolderTmdbSourceCard( overflow = TextOverflow.Ellipsis, ) Text( - text = "TMDB", + text = stringResource(Res.string.source_tmdb), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -1816,41 +1884,106 @@ private fun FolderCatalogSourceCard( } } +@Composable private fun tmdbBuilderModeLabel(mode: TmdbBuilderMode): String = when (mode) { - TmdbBuilderMode.PRESETS -> "Presets" - TmdbBuilderMode.LIST -> "List" - TmdbBuilderMode.COLLECTION -> "Collection" - TmdbBuilderMode.PRODUCTION -> "Production" - TmdbBuilderMode.NETWORK -> "Network" - TmdbBuilderMode.DISCOVER -> "Discover" + TmdbBuilderMode.PRESETS -> stringResource(Res.string.collections_editor_tmdb_presets) + TmdbBuilderMode.LIST -> stringResource(Res.string.collections_editor_tmdb_public_list_mode) + TmdbBuilderMode.PRODUCTION -> stringResource(Res.string.collections_editor_tmdb_production_mode) + TmdbBuilderMode.NETWORK -> stringResource(Res.string.collections_editor_tmdb_network_mode) + TmdbBuilderMode.COLLECTION -> stringResource(Res.string.collections_editor_tmdb_collection_mode) + TmdbBuilderMode.DISCOVER -> stringResource(Res.string.collections_editor_tmdb_custom_mode) } +@Composable +private fun tmdbModeHelpText(mode: TmdbBuilderMode): String = + when (mode) { + TmdbBuilderMode.PRESETS -> stringResource(Res.string.collections_editor_tmdb_help_presets) + TmdbBuilderMode.LIST -> stringResource(Res.string.collections_editor_tmdb_help_list) + TmdbBuilderMode.PRODUCTION -> stringResource(Res.string.collections_editor_tmdb_help_production) + TmdbBuilderMode.NETWORK -> stringResource(Res.string.collections_editor_tmdb_help_network) + TmdbBuilderMode.COLLECTION -> stringResource(Res.string.collections_editor_tmdb_help_collection) + TmdbBuilderMode.DISCOVER -> stringResource(Res.string.collections_editor_tmdb_help_discover) + } + +@Composable +private fun tmdbInputLabel(mode: TmdbBuilderMode): String = + when (mode) { + TmdbBuilderMode.LIST -> stringResource(Res.string.collections_editor_tmdb_public_list) + TmdbBuilderMode.NETWORK -> stringResource(Res.string.collections_editor_tmdb_network_id) + TmdbBuilderMode.COLLECTION -> stringResource(Res.string.collections_editor_tmdb_collection_id) + TmdbBuilderMode.PRODUCTION -> stringResource(Res.string.collections_editor_tmdb_company_search) + else -> stringResource(Res.string.collections_editor_tmdb_id_or_url) + } + +@Composable +private fun tmdbInputPlaceholder(mode: TmdbBuilderMode): String = + when (mode) { + TmdbBuilderMode.LIST -> stringResource(Res.string.collections_editor_tmdb_list_placeholder) + TmdbBuilderMode.NETWORK -> stringResource(Res.string.collections_editor_tmdb_network_placeholder) + TmdbBuilderMode.COLLECTION -> stringResource(Res.string.collections_editor_tmdb_collection_placeholder) + TmdbBuilderMode.PRODUCTION -> stringResource(Res.string.collections_editor_tmdb_company_placeholder) + else -> stringResource(Res.string.collections_editor_tmdb_id_or_url) + } + +@Composable +private fun tmdbInputHelper(mode: TmdbBuilderMode): String = + when (mode) { + TmdbBuilderMode.PRODUCTION -> stringResource(Res.string.collections_editor_tmdb_search_helper) + TmdbBuilderMode.COLLECTION -> stringResource(Res.string.collections_editor_tmdb_collection_helper) + TmdbBuilderMode.NETWORK -> stringResource(Res.string.collections_editor_tmdb_network_helper) + TmdbBuilderMode.LIST -> stringResource(Res.string.collections_editor_tmdb_list_helper) + else -> "" + } + +@Composable +private fun tmdbTitlePlaceholder(mode: TmdbBuilderMode): String = + when (mode) { + TmdbBuilderMode.DISCOVER -> stringResource(Res.string.collections_editor_tmdb_discover_title_placeholder) + else -> stringResource(Res.string.collections_editor_tmdb_title_placeholder) + } + +@Composable private fun tmdbSortLabel(sort: TmdbCollectionSort): String = when (sort) { - TmdbCollectionSort.POPULAR_DESC -> "Popular" - TmdbCollectionSort.VOTE_AVERAGE_DESC -> "Top rated" - TmdbCollectionSort.RELEASE_DATE_DESC -> "Newest movies" - TmdbCollectionSort.FIRST_AIR_DATE_DESC -> "Newest series" + TmdbCollectionSort.POPULAR_DESC -> stringResource(Res.string.collections_editor_tmdb_sort_popular) + TmdbCollectionSort.VOTE_AVERAGE_DESC -> stringResource(Res.string.collections_editor_tmdb_sort_top_rated) + TmdbCollectionSort.RELEASE_DATE_DESC -> stringResource(Res.string.collections_editor_tmdb_sort_recent) + TmdbCollectionSort.FIRST_AIR_DATE_DESC -> stringResource(Res.string.collections_editor_tmdb_sort_recent) } +@Composable private fun tmdbSourceSubtitle(source: CollectionSource): String { val media = when (TmdbCollectionMediaType.fromString(source.mediaType)) { - TmdbCollectionMediaType.MOVIE -> "Movies" - TmdbCollectionMediaType.TV -> "Series" + TmdbCollectionMediaType.MOVIE -> stringResource(Res.string.collections_editor_tmdb_movies) + TmdbCollectionMediaType.TV -> stringResource(Res.string.collections_editor_tmdb_series) } val sort = source.sortBy?.let { value -> - TmdbCollectionSort.entries.firstOrNull { it.value == value }?.let(::tmdbSortLabel) - } ?: "Popular" + TmdbCollectionSort.entries.firstOrNull { it.value == value }?.let { sort -> + tmdbSortLabel(sort) + } + } ?: stringResource(Res.string.collections_editor_tmdb_sort_popular) val sourceType = runCatching { TmdbCollectionSourceType.valueOf(source.tmdbSourceType.orEmpty()) }.getOrDefault(TmdbCollectionSourceType.DISCOVER) return when (sourceType) { - TmdbCollectionSourceType.LIST -> "TMDB List" - TmdbCollectionSourceType.COLLECTION -> "TMDB Movie Collection" - TmdbCollectionSourceType.COMPANY -> listOf("Production", media, sort).joinToString(" • ") - TmdbCollectionSourceType.NETWORK -> listOf("Network", "Series", sort).joinToString(" • ") - TmdbCollectionSourceType.DISCOVER -> listOf("TMDB Discover", media, sort).joinToString(" • ") + TmdbCollectionSourceType.LIST -> stringResource(Res.string.collections_editor_tmdb_subtitle_list) + TmdbCollectionSourceType.COLLECTION -> stringResource(Res.string.collections_editor_tmdb_subtitle_movie_collection) + TmdbCollectionSourceType.COMPANY -> listOf( + stringResource(Res.string.collections_editor_tmdb_subtitle_production), + media, + sort, + ).joinToString(" • ") + TmdbCollectionSourceType.NETWORK -> listOf( + stringResource(Res.string.collections_editor_tmdb_subtitle_network), + stringResource(Res.string.collections_editor_tmdb_series), + sort, + ).joinToString(" • ") + TmdbCollectionSourceType.DISCOVER -> listOf( + stringResource(Res.string.collections_editor_tmdb_subtitle_discover), + media, + sort, + ).joinToString(" • ") } } From 7ef0083a71a938cb7629b36ef5968a3c78fb9c0f Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sun, 26 Apr 2026 00:58:06 +0530 Subject: [PATCH 029/143] Update localization strings to use string formatting --- .../composeResources/values-el/strings.xml | 6 +- .../composeResources/values-es/strings.xml | 4 +- .../composeResources/values-it/strings.xml | 4 +- .../composeResources/values-tr/strings.xml | 5 +- .../composeResources/values/strings.xml | 4 +- .../app/features/player/PlayerOverlays.kt | 160 ++++++++++-------- .../nuvio/app/features/player/PlayerScreen.kt | 11 +- 7 files changed, 113 insertions(+), 81 deletions(-) diff --git a/composeApp/src/commonMain/composeResources/values-el/strings.xml b/composeApp/src/commonMain/composeResources/values-el/strings.xml index 1e6107a5..a3afc52d 100644 --- a/composeApp/src/commonMain/composeResources/values-el/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-el/strings.xml @@ -182,8 +182,8 @@ Στυλ Υπότιτλοι Υπότιτλοι - Φωτεινότητα %1$d%% - Ένταση ήχου %1$d%% + Φωτεινότητα %1$s + Ένταση ήχου %1$s Σε σίγαση Κατέβηκε Προβάλλεται @@ -1040,4 +1040,4 @@ KB MB GB - \ No newline at end of file + diff --git a/composeApp/src/commonMain/composeResources/values-es/strings.xml b/composeApp/src/commonMain/composeResources/values-es/strings.xml index 725a89a0..514e6e3a 100644 --- a/composeApp/src/commonMain/composeResources/values-es/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-es/strings.xml @@ -300,8 +300,8 @@ Estilo Subs Subtítulos - Brillo %1$d%% - Volumen %1$d%% + Brillo %1$s + Volumen %1$s Silenciado Descargado Se emite diff --git a/composeApp/src/commonMain/composeResources/values-it/strings.xml b/composeApp/src/commonMain/composeResources/values-it/strings.xml index 5229f4d8..a2284ea0 100644 --- a/composeApp/src/commonMain/composeResources/values-it/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-it/strings.xml @@ -182,8 +182,8 @@ Stile Sub Sottotitoli - Luminosità %1$d%% - Volume %1$d%% + Luminosità %1$s + Volume %1$s Muto Scaricato In onda diff --git a/composeApp/src/commonMain/composeResources/values-tr/strings.xml b/composeApp/src/commonMain/composeResources/values-tr/strings.xml index c49515aa..9684bfc6 100644 --- a/composeApp/src/commonMain/composeResources/values-tr/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-tr/strings.xml @@ -182,8 +182,8 @@ Stil Altyazı Altyazılar - Parlaklık %1$d%% - Ses %1$d%% + Parlaklık %1$s + Ses %1$s Sessizde İndirildi Yayınlanma @@ -1041,4 +1041,3 @@ MB GB - diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index 7ddc8923..2afb0532 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -300,8 +300,8 @@ Style Subs Subtitles - Brightness %1$d%% - Volume %1$d%% + Brightness %1$s + Volume %1$s Muted Downloaded Airs diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerOverlays.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerOverlays.kt index a9644baa..6a3a8a30 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerOverlays.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerOverlays.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets @@ -288,7 +289,7 @@ internal fun PauseMetadataOverlay( horizontalSafePadding: Dp, modifier: Modifier = Modifier, ) { - Column( + BoxWithConstraints( modifier = modifier .background( Brush.horizontalGradient( @@ -298,80 +299,107 @@ internal fun PauseMetadataOverlay( Color.Transparent, ), ), - ) - .padding( - start = horizontalSafePadding + metrics.horizontalPadding, - end = horizontalSafePadding + metrics.horizontalPadding, - top = 40.dp, - bottom = 120.dp, ), - verticalArrangement = Arrangement.Bottom, ) { - Text( - text = stringResource(Res.string.compose_player_youre_watching), - style = MaterialTheme.nuvioTypeScale.bodyLg, - color = Color(0xFFB8B8B8), - ) - androidx.compose.foundation.layout.Spacer(modifier = Modifier.height(12.dp)) - - if (!logo.isNullOrBlank()) { - AsyncImage( - model = logo, - contentDescription = title, - contentScale = ContentScale.Fit, - alignment = Alignment.BottomStart, - modifier = Modifier.height(96.dp), - ) + val compactHeight = maxHeight < 420.dp + val veryCompactHeight = maxHeight < 340.dp + val topPadding = if (compactHeight) 24.dp else 40.dp + val bottomPadding = when { + veryCompactHeight -> 24.dp + compactHeight -> 40.dp + else -> 120.dp + } + val logoHeight = when { + veryCompactHeight -> 48.dp + compactHeight -> 64.dp + else -> 96.dp + } + val titleFontScale = if (compactHeight) 1.35f else 1.8f + val descriptionStyle = if (compactHeight) { + MaterialTheme.nuvioTypeScale.bodyMd.copy(lineHeight = 20.sp) } else { - Text( - text = title, - style = MaterialTheme.nuvioTypeScale.displayMd.copy( - fontSize = max(metrics.titleSize.value * 1.8f, 32f).sp, - fontWeight = FontWeight.ExtraBold, + MaterialTheme.nuvioTypeScale.bodyLg.copy(lineHeight = 24.sp) + } + val descriptionMaxLines = if (compactHeight) 2 else 3 + val descriptionWidthFraction = if (compactHeight) 0.82f else 0.62f + + Column( + modifier = Modifier + .fillMaxSize() + .padding( + start = horizontalSafePadding + metrics.horizontalPadding, + end = horizontalSafePadding + metrics.horizontalPadding, + top = topPadding, + bottom = bottomPadding, ), - color = Color.White, - maxLines = 2, - overflow = TextOverflow.Ellipsis, - ) - } - - val episodeInfo = if (isEpisode && seasonNumber != null && episodeNumber != null) { - stringResource(Res.string.compose_player_episode_code_full, seasonNumber, episodeNumber) - } else { - providerName - } - - Text( - text = episodeInfo, - style = MaterialTheme.nuvioTypeScale.bodyLg, - color = Color(0xFFCCCCCC), - modifier = Modifier.padding(top = 8.dp), - ) - - if (!episodeTitle.isNullOrBlank()) { + verticalArrangement = Arrangement.Bottom, + ) { Text( - text = episodeTitle, - style = MaterialTheme.nuvioTypeScale.titleLg, - color = Color.White, - maxLines = 2, - overflow = TextOverflow.Ellipsis, - modifier = Modifier.padding(top = 12.dp), + text = stringResource(Res.string.compose_player_youre_watching), + style = MaterialTheme.nuvioTypeScale.bodyLg, + color = Color(0xFFB8B8B8), ) - } + androidx.compose.foundation.layout.Spacer(modifier = Modifier.height(if (compactHeight) 8.dp else 12.dp)) + + if (!logo.isNullOrBlank()) { + AsyncImage( + model = logo, + contentDescription = title, + contentScale = ContentScale.Fit, + alignment = Alignment.BottomStart, + modifier = Modifier.height(logoHeight), + ) + } else { + Text( + text = title, + style = MaterialTheme.nuvioTypeScale.displayMd.copy( + fontSize = max(metrics.titleSize.value * titleFontScale, 32f).sp, + fontWeight = FontWeight.ExtraBold, + ), + color = Color.White, + maxLines = if (compactHeight) 1 else 2, + overflow = TextOverflow.Ellipsis, + ) + } + + val episodeInfo = if (isEpisode && seasonNumber != null && episodeNumber != null) { + stringResource(Res.string.compose_player_episode_code_full, seasonNumber, episodeNumber) + } else { + providerName + } - if (!pauseDescription.isNullOrBlank()) { Text( - text = pauseDescription, - style = MaterialTheme.nuvioTypeScale.bodyLg.copy(lineHeight = 24.sp), - color = Color(0xFFD6D6D6), - softWrap = true, - textAlign = TextAlign.Start, - maxLines = 3, - overflow = TextOverflow.Ellipsis, - modifier = Modifier - .padding(top = 16.dp) - .fillMaxWidth(0.62f), + text = episodeInfo, + style = MaterialTheme.nuvioTypeScale.bodyLg, + color = Color(0xFFCCCCCC), + modifier = Modifier.padding(top = if (compactHeight) 6.dp else 8.dp), ) + + if (!episodeTitle.isNullOrBlank()) { + Text( + text = episodeTitle, + style = MaterialTheme.nuvioTypeScale.titleLg, + color = Color.White, + maxLines = if (compactHeight) 1 else 2, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.padding(top = if (compactHeight) 8.dp else 12.dp), + ) + } + + if (!pauseDescription.isNullOrBlank()) { + Text( + text = pauseDescription, + style = descriptionStyle, + color = Color(0xFFD6D6D6), + softWrap = true, + textAlign = TextAlign.Start, + maxLines = descriptionMaxLines, + overflow = TextOverflow.Ellipsis, + modifier = Modifier + .padding(top = if (compactHeight) 10.dp else 16.dp) + .fillMaxWidth(descriptionWidthFraction), + ) + } } } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt index 6363109d..e862fc29 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt @@ -1,6 +1,7 @@ package com.nuvio.app.features.player import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.background @@ -586,7 +587,7 @@ fun PlayerScreen( showGestureFeedback( GestureFeedbackState( messageRes = Res.string.compose_player_brightness_level, - messageArgs = listOf(percentage), + messageArgs = listOf("$percentage%"), icon = GestureFeedbackIcon.Brightness, ), ) @@ -601,7 +602,7 @@ fun PlayerScreen( } else { Res.string.compose_player_volume_level }, - messageArgs = if (level.isMuted) emptyList() else listOf(percentage), + messageArgs = if (level.isMuted) emptyList() else listOf("$percentage%"), icon = if (level.isMuted) GestureFeedbackIcon.VolumeMuted else GestureFeedbackIcon.Volume, isDanger = level.isMuted, ), @@ -1539,7 +1540,11 @@ fun PlayerScreen( }, ) - if (pausedOverlayVisible && !controlsVisible && !playerControlsLocked) { + AnimatedVisibility( + visible = pausedOverlayVisible && !controlsVisible && !playerControlsLocked, + enter = fadeIn(animationSpec = tween(durationMillis = 220)), + exit = fadeOut(animationSpec = tween(durationMillis = 180)), + ) { PauseMetadataOverlay( title = title, logo = logo, From c4bdfce511795c164f77da9c3b1a7f1c07d0378e Mon Sep 17 00:00:00 2001 From: skoruppa Date: Sun, 26 Apr 2026 02:17:32 +0200 Subject: [PATCH 030/143] Polish Translation --- .../src/androidMain/res/xml/locale_config.xml | 1 + .../composeResources/values-pl/strings.xml | 1161 +++++++++++++++++ .../app/features/settings/AppLanguage.kt | 2 + 3 files changed, 1164 insertions(+) create mode 100644 composeApp/src/commonMain/composeResources/values-pl/strings.xml diff --git a/composeApp/src/androidMain/res/xml/locale_config.xml b/composeApp/src/androidMain/res/xml/locale_config.xml index 6e8aae61..7e330475 100644 --- a/composeApp/src/androidMain/res/xml/locale_config.xml +++ b/composeApp/src/androidMain/res/xml/locale_config.xml @@ -5,4 +5,5 @@ + diff --git a/composeApp/src/commonMain/composeResources/values-pl/strings.xml b/composeApp/src/commonMain/composeResources/values-pl/strings.xml new file mode 100644 index 00000000..81aa7ac8 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/values-pl/strings.xml @@ -0,0 +1,1161 @@ + + Osoby wspierające i współtworzące projekt + Wstecz + Anuluj + Zamknij + Usuń + Gotowe + Edytuj + Importuj + Dalej + OK + Odtwórz + Poprzedni + Usuń + Zmień kolejność + Resetuj + Wznów + Ponów + Zapisz + Instalowanie + Dodatki + Aktywny + %1$d katalogów + Konfigurowalny + Odświeżanie + %1$d zasobów + Niedostępny + Konfiguruj dodatek + Usuń dodatek + Dodaj URL manifestu, aby zacząć ładować katalogi, metadane, strumienie lub napisy do Nuvio. + Brak zainstalowanych dodatków. + Wprowadź URL dodatku. + URL dodatku + Zainstaluj dodatek + Ładowanie szczegółów manifestu... + Walidacja URL manifestu i ładowanie szczegółów dodatku przed instalacją. + Sprawdzanie dodatku + Instalacja nie powiodła się + %1$s został sprawdzony i dodany pomyślnie. + Dodatek zainstalowany + Przesuń dodatek w dół + Przesuń dodatek w górę + Aktywne + Dodatki + Katalogi + Odśwież dodatek + Dodaj dodatek + Zainstalowane dodatki + Przegląd + %1$d reguł id + Wersja %1$s + Wybrano + Kopiuj JSON + %1$d kolekcji, %2$d folderów + Usunąć „%1$s"? Tej operacji nie można cofnąć. + Usuń kolekcję + Dodaj katalog + Dodaj folder + Wszystkie gatunki + Dodaj katalogi z zainstalowanych dodatków, aby określić, co ten folder wyświetla. + Brak źródeł katalogów + Wybierz + Emoji + URL obrazu + Brak + Okładka + Utwórz kolekcję + Gotowe + Edytuj kolekcję + Edytuj folder + Ustaw tożsamość folderu, prezentację i źródła katalogów z tą samą strukturą co główny edytor kolekcji. + Dodaj jeden, aby rozpocząć. + Brak folderów + Foldery + Filtr gatunku + Pokaż tylko obraz okładki + Ukryj tytuł + Nowy folder + Pokaż tę kolekcję nad wszystkimi zwykłymi katalogami. Wiele przypiętych kolekcji zachowuje kolejność tworzenia. + Przypnij nad katalogami + URL obrazu tła (opcjonalnie) + Nazwa folderu + URL animowanego GIF (odtwarzany przy zaznaczeniu) + Nazwa kolekcji + Zapisz zmiany + Zapisz + Wygląd + Podstawy + Źródła katalogów + Wybierz katalogi dodatków, które ten folder ma agregować. + Wybierz katalogi + Wybierz gatunek + %1$d wybranych + %1$d katalogów + %1$d wybranych + Plakat + Kwadrat + Szeroki + Połącz wszystkie katalogi w jednej karcie + Pokaż kartę \"Wszystko\" + Odtwarzaj skonfigurowany GIF zamiast statycznej okładki, gdy jest dostępny. + Pokaż GIF gdy skonfigurowany + %1$d źródeł · %2$s + Kształt kafelka + Wiersze + Karty + Tryb widoku + Źródła TMDB + Lista publiczna + Produkcja + Stacja + Kolekcja + Niestandardowy + Wybierz gotowe źródło. Możesz je edytować lub usunąć po dodaniu. + Wklej publiczny URL listy TMDB lub sam numer z URL. + Wyszukaj po nazwie studia lub wklej ID/URL firmy TMDB i dodaj bezpośrednio. + Wprowadź ID stacji. Popularne stacje są dostępne w szablonach i filtrach. + Wyszukaj nazwę kolekcji filmów lub wklej ID kolekcji z TMDB. + Zbuduj dynamiczny wiersz TMDB z opcjonalnymi filtrami. Zostaw pola puste, gdy nie potrzebujesz danego filtra. + Publiczna lista TMDB + ID stacji + ID kolekcji + Nazwa firmy produkcyjnej, ID lub URL + ID lub URL TMDB + https://www.themoviedb.org/list/8504994 lub 8504994 + 213 dla Netflix, 49 dla HBO, 2739 dla Disney+ + 10 dla kolekcji Star Wars + Marvel Studios, 420 lub URL firmy + Przykłady: Marvel Studios, 420 lub https://www.themoviedb.org/company/420. + Przykład: Star Wars Collection, Harry Potter Collection lub URL kolekcji. + Przykładowe ID: Netflix 213, HBO 49, Disney+ 2739. + Przykład: https://www.themoviedb.org/list/8504994 lub 8504994. + Wyświetlany tytuł + Wyświetlany jako nazwa wiersza/karty. Jeśli pusty, Nuvio utworzy go ze źródła. + Filmy Marvela, Oryginały Netflix, Pixar + Najlepsze filmy akcji, Koreańskie dramy, Animacja 2024 + Wyniki wyszukiwania + Kolekcja TMDB + Firma TMDB %1$d + Kolekcja TMDB %1$d + Typ + Filmy + Seriale + Oba + Sortuj + Filtry + Zostaw pola puste, gdy nie potrzebujesz danego filtra. + Popularne gatunki + Popularne języki + Popularne kraje + Popularne słowa kluczowe + Popularne studia + Popularne stacje + ID gatunków + Użyj numerów gatunków TMDB. Oddziel wiele przecinkami dla AND lub pionowymi kreskami dla OR. + Data premiery lub emisji od + Data premiery lub emisji do + Użyj formatu RRRR-MM-DD, na przykład 2024-01-01. + Minimalna ocena + Maksymalna ocena + Ocena TMDB od 0 do 10. Przykład: 7.0. + Minimalna liczba głosów + Użyj tego, aby uniknąć mało znanych tytułów z małą liczbą głosów. Przykład: 100. + Język oryginalny + Użyj dwuliterowych kodów języków, na przykład en, ko, ja, hi. + Kraj pochodzenia + Użyj dwuliterowych kodów krajów, na przykład US, KR, JP, IN. + ID słów kluczowych + Użyj numerów słów kluczowych TMDB. Gotowe podpowiedzi ułatwiają wybór. + 9715 dla superbohater + ID firm + Użyj ID studiów/firm. Gotowe podpowiedzi ułatwiają wybór. + 420 dla Marvel Studios + ID stacji + Tylko dla seriali. Użyj ID stacji jak Netflix 213 lub HBO 49. + 213 dla Netflix + Rok + Użyj czterocyfrowego roku, na przykład 2024. + Szablony + Szukaj + Dodaj źródło + Akcja + Przygodowy + Animacja + Komedia + Horror + Sci-Fi + Dramat + Kryminał + Reality + Angielski + Koreański + Japoński + Hindi + Hiszpański + Stany Zjednoczone + Korea + Japonia + Indie + Wielka Brytania + Superbohater + Na podstawie powieści + Podróże w czasie + Kosmos + Marvel + Disney + Pixar + Lucasfilm + Warner Bros. + Netflix + HBO + Disney+ + Prime Video + Hulu + Popularne + Najwyżej oceniane + Ostatnie + Lista TMDB + Kolekcja filmów TMDB + Produkcja + Stacja + TMDB Discover + Utwórz jedną, aby uporządkować katalogi. + Brak kolekcji + %1$d folderów + Nie znaleziono elementów + Nie znaleziono folderu + Kolekcje + Importuj kolekcje + JSON + Wklej JSON kolekcji poniżej. + Importuj + Nowa kolekcja + Przypięte + Wszystko + Twoje kolekcje + Stworzone z ❤️ przez Tapframe i przyjaciół + Wersja %1$s (%2$s) + Wył. + Wł. + Pauza + Odśwież + Masz już konto? + Kontynuuj bez konta + Utwórz konto + Nie masz konta? + E-mail + lub + Hasło + Zaloguj się, aby uzyskać dostęp do biblioteki i postępu + Zaloguj się + Zarejestruj się, aby synchronizować dane między urządzeniami + Zarejestruj się + Twoje dane będą przechowywane tylko lokalnie + Streamuj wszystko, wszędzie + Witaj ponownie + Biblioteka + Biblioteka Trakt + Główna + Biblioteka + Profil + Szukaj + Ścieżki audio + Audio + Wbudowane + Przesunięcie dolne + Zamknij odtwarzacz + Kolor + Aktualnie odtwarzane + E%1$d + S%1$dE%2$d + S%1$dE%2$d • %3$s + Odcinki + Rozmiar czcionki + %1$dsp + Zablokuj kontrolki odtwarzacza + Brak dostępnych ścieżek audio + Brak dostępnych odcinków + Nie znaleziono strumieni + Brak + Obrys + Odcinki + Źródła + Strumienie + Błąd odtwarzania + Odtwarzanie + Dotknij, aby pobrać napisy + Wróć + Przywróć domyślne + Wypełnij + Dopasuj + Powiększ + Przewiń wstecz 10 sekund + -%1$ds + +%1$ds + -%1$ds + +%1$ds + Przewiń do przodu 10 sekund + Źródła + Styl + Napisy + Napisy + Jasność %1$s + Głośność %1$s + Wyciszony + Pobrane + Emisja + Do ustalenia + Dotknij, aby odblokować + Ścieżka %1$d + Odblokuj kontrolki odtwarzacza + Oglądasz + Dodaj profil + Wyczyść wyszukiwanie + Odkrywaj + Zainstalowane dodatki nie zwróciły prawidłowych wyników wyszukiwania. + Wyszukiwanie nie powiodło się + Zainstaluj i sprawdź co najmniej jeden dodatek przed wyszukiwaniem. + Brak aktywnych dodatków + Zainstalowane katalogi z możliwością wyszukiwania nie zwróciły wyników dla tego zapytania. + Brak wyników + Zainstalowane dodatki nie udostępniają wyszukiwania katalogów. + Brak katalogów z wyszukiwaniem + Szukaj filmów i seriali... + Ostatnie wyszukiwania + Usuń ostatnie wyszukiwanie + O aplikacji + Ogólne + Konto + Dodatki + Wygląd + Treści i odkrywanie + Kontynuuj oglądanie + Ekran główny + Integracje + Oceny MDBList + Ekran metadanych + Powiadomienia + Odtwarzanie + Wtyczki + Personalizacja plakatów + Ustawienia + Wspierający i współtwórcy + Wzbogacanie TMDB + Trakt + O APLIKACJI + Zarządzaj kontem, wyloguj się lub usuń. + KONTO + Dostosuj prezentację ekranu głównego i preferencje wizualne. + Sprawdź dostępność nowych wersji aplikacji. + Sprawdź aktualizacje + Zarządzaj dodatkami i źródłami odkrywania. + Zarządzaj pobranymi filmami i odcinkami. + Pobrane + OGÓLNE + Połącz usługi TMDB i MDBList. + Zarządzaj alertami o premierach odcinków i wyślij powiadomienie testowe. + Przełącz na inny profil. + Przełącz profil + Połącz Trakt, synchronizuj listy obserwowanych i zapisuj tytuły bezpośrednio w Trakt. + Ładowanie list Trakt… + Wybierz, gdzie zapisać ten tytuł w Trakt + Wesprzyj + Przejdź do szczegółów + Usuń + Zacznij od początku + Odtwórz + %1$d/10 + Recenzja + Spoiler + Brak recenzji Trakt. + %1$d polubień + Ten komentarz zawiera spoilery. + Ten komentarz zawiera spoilery i został ukryty. + Komentarze + Zwiastun + %1$s (%2$d) + Zwiastuny + Brak pobranych odcinków + Brak pobranych plików + %1$d pobranych odcinków + Aktywne + Filmy + Seriale + Pokaż pobrane + Ukończone • %1$s + Pobieranie • %1$s + Niepowodzenie + Wstrzymane • %1$s + Obejrzane + Sezon %1$d + Odcinki specjalne + Kontynuuj od miejsca, w którym skończyłeś + Dodaj do biblioteki + Oznacz jako nieobejrzane + Oznacz jako obejrzane + Usuń z biblioteki + Pokaż wszystko + Odtwórz ręcznie + Logo %1$s + Konto + Usuń konto + Spowoduje to trwałe usunięcie konta i wszystkich powiązanych danych. + Tej operacji nie można cofnąć. Wszystkie dane, profile i historia synchronizacji zostaną trwale usunięte. + Usunąć konto? + E-mail + Niezalogowany + Wyloguj się + Zostaniesz przeniesiony do ekranu logowania. + Wylogować się? + Status + Anonimowy + Zalogowany + AMOLED czarny + Użyj czystego czarnego tła dla ekranów OLED. + Język aplikacji + Wybierz język + Pokaż, ukryj i stylizuj półkę Kontynuuj oglądanie. + Dostosuj szerokość i zaokrąglenie rogów kart plakatów. + WYŚWIETLANIE + EKRAN GŁÓWNY + MOTYW + Kolekcja • %1$s + Wyświetlana nazwa + Zainstaluj dodatek z katalogami kompatybilnymi z tablicą, aby skonfigurować wiersze ekranu głównego. + Brak katalogów ekranu głównego + Źródło hero + Ukryte + Utrzymuj fokus na ekranie głównym + %1$s • Osiągnięto limit (maks. %2$d) + Nie wybrano źródeł hero + Nie w hero + Usuń przypięcie kolekcji, aby ją przenieść + Przypięte + Przypięte na górze + Zmień kolejność + KATALOGI + KATALOGI I KOLEKCJE + KOLEKCJE + HERO + ŹRÓDŁA HERO + %1$d z %2$d wybranych + Pokaż Hero + Wyświetl wyróżnioną karuzelę hero na górze ekranu głównego. Wybierz do 2 katalogów źródłowych poniżej. + %1$d z %2$d katalogów widocznych • %3$d źródeł hero wybranych + Otwórz katalog tylko wtedy, gdy chcesz zmienić jego nazwę lub kolejność. + Widoczne + Odtwarzacz, napisy i automatyczne odtwarzanie + Zaokrąglenie karty + STYL KARTY PLAKATU + Szerokość karty + Niestandardowy + Dostosuj szerokość i zaokrąglenie rogów kart plakatów w całej aplikacji. + Ukryj etykiety + Tryb poziomy dla plakatów na półce + Podgląd na żywo + %1$s (%2$s) + Zaokrąglenie rogów: %1$ddp + Wysokość: %1$ddp + Szerokość: %1$ddp + Klasyczny + Owalny + Zaokrąglony + Ostry + Subtelny + Zrównoważony + Komfortowy + Kompaktowy + Gęsty + Duży + Standardowy + Pokaż okno kontynuowania od miejsca, w którym skończyłeś, po otwarciu aplikacji po wyjściu z odtwarzacza. + Monit o wznowienie przy uruchomieniu + STYL KARTY + PRZY URUCHOMIENIU + ZACHOWANIE NASTĘPNEGO + WIDOCZNOŚĆ + Wyświetl półkę Kontynuuj oglądanie na ekranie głównym. + Pokaż Kontynuuj oglądanie + Plakat + Karta z grafiką na pierwszym planie + Szeroki + Pozioma karta z informacjami + Gdy włączone, Następny zawsze kontynuuje od najdalej obejrzanego odcinka. Gdy wyłączone, kontynuuje od ostatnio obejrzanego. Przydatne przy ponownym oglądaniu wcześniejszych odcinków. + Następny od najdalszego odcinka + EKRAN GŁÓWNY + ŹRÓDŁA + Instaluj, usuwaj, odświeżaj i sortuj źródła treści. + Instaluj repozytoria scraperów JavaScript i testuj dostawców wewnętrznie. + Kontroluj, które katalogi pojawiają się na ekranie głównym i w jakiej kolejności. + Wyłącz sekcje szczegółów i zmień kolejność wszystkiego poniżej Hero. + Twórz niestandardowe grupy katalogów z folderami wyświetlanymi na ekranie głównym. + INTEGRACJE + Wzbogać strony szczegółów grafikami TMDB, obsadą, metadanymi odcinków i nie tylko. + Dodaj oceny IMDb, Rotten Tomatoes, Metacritic i inne zewnętrzne oceny do stron szczegółów. + Dodaj klucz API MDBList poniżej przed włączeniem ocen. + Pobierz klucz z https://mdblist.com/preferences i wklej go tutaj. + Klucz API + Klucz API MDBList + Włącz oceny MDBList + Pokaż zewnętrzne oceny z MDBList na stronach metadanych, gdy dostępne jest ID IMDb. + KLUCZ API + DOSTAWCY OCEN + MDBLIST + Akcje + Kontrolki odtwarzania i zapisywania. + Obsada + Lista głównej obsady. + Kinowe tło + Rozmyte tło za treścią, podobne do ekranu strumieni. + Kolekcja + Powiązana kolekcja lub seria filmów. + Komentarze + Sekcja komentarzy Trakt. + Szczegóły + Czas trwania, status, premiera, język i powiązane informacje. + Karty odcinków + Wybierz sposób wyświetlania odcinków na ekranie metadanych. + Poziomy + Karty w stylu tła w wierszu + Lista + Karty ze szczegółami na pierwszym planie + Odcinki + Sezony i lista odcinków dla seriali. + Grupa %1$d + Podobne + Wiersz rekomendacji. + Brak + Przegląd + Opis, oceny, gatunki i główna obsada. + Produkcja + Studia i stacje. + WYGLĄD + SEKCJE + Grupa kart %1$d + Układ kart + Grupuj sekcje w karty jak w aplikacji TV. Przypisz do 3 sekcji na grupę kart. + Zwiastuny + Wiersz zwiastunów i skróty odtwarzania. + Powiadomienia są obecnie wyłączone w Nuvio. + Alerty o premierach odcinków + Zaplanuj lokalne powiadomienia, gdy nowy odcinek zapisanego serialu stanie się dostępny. + Powiadomienia systemowe są wyłączone dla Nuvio. Włącz je, aby otrzymywać alerty i powiadomienia testowe. + %1$d alertów o premierach jest obecnie zaplanowanych na tym urządzeniu. + ALERTY + TEST + Wyślij powiadomienie testowe + Wysyłanie powiadomienia testowego... + Wyślij lokalne powiadomienie testowe dla %1$s. + Najpierw zapisz serial w bibliotece, aby przetestować powiadomienia. + Powiadomienie testowe + Społeczność + Zobacz osoby budujące i wspierające Nuvio na urządzeniach mobilnych, TV i w sieci. + API wspierających nie jest skonfigurowane. Dodaj DONATIONS_BASE_URL do local.properties. + Współtwórcy + Wspierający + Otwórz GitHub + Profil GitHub niedostępny + Brak dołączonej wiadomości. + Ładowanie współtwórców... + Ładowanie wspierających... + Nie można załadować współtwórców + Nie można załadować wspierających + Nie znaleziono współtwórców. + Nie znaleziono wspierających. + Nie można załadować współtwórców. + Nie można załadować wspierających. + Nie można teraz załadować współtwórców. + Nie można teraz załadować wspierających. + %1$d łącznych commitów + Sty + Lut + Mar + Kwi + Maj + Cze + Lip + Sie + Wrz + Paź + Lis + Gru + %1$s %2$s, %3$s + Wszystkie dodatki + Wszystkie wtyczki + Dozwolone dodatki + Dozwolone wtyczki + Anime Skip + ID klienta AnimeSkip + Wprowadź ID klienta API AnimeSkip. Pobierz je na anime-skip.com. + Wyszukuj również w AnimeSkip znaczniki pomijania (wymaga ID klienta). + Automatyczne odtwarzanie następnego odcinka + Automatycznie znajdź i odtwórz następny odcinek po osiągnięciu progu. + Tylko urządzenie + Preferuj aplikację (FFmpeg) + Preferuj urządzenie + Priorytet dekodera + Dotknij poza oknem, aby zamknąć + Dotknij poza oknem, aby zapisać i zamknąć + %1$d dzień + %1$d dni + %1$d godzina + %1$d godzin + Włącz libass + Użyj libass do renderowania napisów ASS/SSA zamiast domyślnego renderera. + Prędkość przy przytrzymaniu + Przytrzymaj, aby przyspieszyć + Przytrzymaj dowolne miejsce na powierzchni odtwarzacza, aby tymczasowo zwiększyć prędkość odtwarzania. + Nieprawidłowy wzorzec regex + Czas pamięci podręcznej ostatniego linku + Mapuj DV7 na HEVC + Fallback Dolby Vision Profile 7 na HEVC dla nieobsługiwanych urządzeń. + Minuty przed końcem + Pokaż kartę następnego odcinka tyle minut przed końcem. + %1$d min + Brak dostępnych elementów + Nie ustawiono + Domyślny + Język urządzenia + Wymuszone + Brak + Preferuj grupę binge + Przy automatycznym odtwarzaniu preferuj strumień z tej samej grupy binge co bieżący. + Preferowany język audio + Preferowany język napisów + Szablony + Dopasowuje do nazwy strumienia, etykiety, opisu, dodatku i URL. + Wzorzec regex + 4K|2160p|Remux + Dowolne 1080p+ + AVC / x264 + Jakość BluRay + Dolby Atmos / DTS + Angielski + HDR / Dolby Vision + HEVC / x265 + Bez CAM/TS + Bez REMUX/HDR + 1080p Standard + 4K / Remux + 720p / Mniejsze + Źródła WEB + Typ renderowania + Standardowy (Cues) + Effects Canvas + Effects OpenGL + Overlay Canvas + Overlay OpenGL + Użyj ponownie ostatniego linku + Automatycznie odtwórz ostatni działający strumień dla tego samego filmu/odcinka, gdy pamięć podręczna jest nadal ważna. + Drugorzędny język audio + Drugorzędny język napisów + DEKODER + NASTĘPNY ODCINEK + ODTWARZACZ + POMIJANIE SEGMENTÓW + AUTOMATYCZNE ODTWARZANIE STRUMIENIA + WYBÓR STRUMIENIA + NAPISY I AUDIO + RENDEROWANIE NAPISÓW + %1$d wybranych + Pokaż nakładkę ładowania + Pokaż nakładkę ładowania podczas uruchamiania strumienia. + Pomiń intro/outro/podsumowanie + Pokaż przycisk pomijania podczas wykrytych segmentów intro, outro i podsumowania. + Zakres źródeł + Wszystkie dodatki + Uwzględnij strumienie ze wszystkich zainstalowanych dodatków. + Wszystkie źródła + Uwzględnij strumienie zarówno z dodatków, jak i wtyczek. + Tylko włączone wtyczki + Uwzględnij tylko strumienie z włączonych wtyczek. + Tylko zainstalowane dodatki + Uwzględnij tylko strumienie z zainstalowanych dodatków. + Tryb wyboru strumienia + Pierwszy dostępny strumień + Automatycznie odtwórz pierwszy znaleziony strumień. + Ręczny + Wybieraj strumienie ręcznie za każdym razem. + Dopasowanie regex + Automatycznie wybierz strumień pasujący do wzorca regex. + Limit czasu strumienia + Jak długo czekać na strumienie przed automatycznym wyborem. + Minuty przed końcem + Tryb progu + Minuty przed końcem + Procent + Próg procentowy + Pokaż kartę następnego odcinka, gdy odtwarzanie osiągnie ten procent. + %1$d%% + Natychmiast + %1$ds + Bez limitu + Odtwarzanie tunelowane + Włącz odtwarzanie tunelowane dla niższego opóźnienia synchronizacji audio/wideo. + Dodaj własny klucz API TMDB poniżej przed włączeniem wzbogacania. + Klucz API TMDB + Włącz wzbogacanie TMDB + Użyj klucza API TMDB, aby wzbogacić metadane dodatków na ekranie szczegółów, gdy dostępne jest ID TMDB lub IMDb. + Wprowadź klucz API TMDB v3. + Kod języka + Grafiki + Zastąp tło, plakat i logo grafikami TMDB. + Podstawowe informacje + Użyj tytułu, opisu, gatunków i oceny TMDB. + Kolekcje + Pokaż serie i kolekcje filmów, gdy TMDB je udostępnia. + Twórcy + Użyj twórców, reżyserów, scenarzystów i zdjęć obsady z TMDB. + Szczegóły + Użyj informacji o premierze, czasie trwania, kategorii wiekowej, statusie, kraju i języku z TMDB. + Odcinki + Użyj tytułów, miniatur, opisów i czasów trwania odcinków z TMDB dla seriali. + Podobne + Pokaż rekomendacje TMDB na dole stron szczegółów. + Stacje + Użyj metadanych stacji TMDB dla tytułów TV. + Firmy produkcyjne + Użyj metadanych firm produkcyjnych TMDB na ekranie szczegółów. + Plakaty sezonów + Użyj plakatów sezonów TMDB w selektorze sezonów na ekranie metadanych dla seriali. + Zwiastuny + Pobierz i pokaż sekcję zwiastunów TMDB na stronach szczegółów. + Osobisty klucz API + Preferowany język + Ustaw kod języka TMDB używany do zlokalizowanych metadanych, na przykład `en`, `en-US` lub `pt-BR`. + DANE UWIERZYTELNIAJĄCE + LOKALIZACJA + MODUŁY + TMDB + Po zatwierdzeniu zostaniesz automatycznie przekierowany z powrotem. + UWIERZYTELNIANIE + Komentarze + Pokaż komentarze Trakt na stronach filmów i seriali + Połącz Trakt + Połączono jako %1$s + Użytkownik Trakt + Rozłącz + Nie udało się otworzyć przeglądarki + FUNKCJE + Dokończ logowanie Trakt w przeglądarce + Śledź, co oglądasz, zapisuj na liście obserwowanych lub listach niestandardowych i synchronizuj bibliotekę z Trakt. + Brak danych uwierzytelniających Trakt w local.properties (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET). + Otwórz logowanie Trakt + Twoje akcje zapisywania mogą teraz celować w listę obserwowanych i osobiste listy Trakt. + Zaloguj się w Trakt, aby włączyć zapisywanie na listach i tryb biblioteki Trakt. + Ocena widzów + IMDb + Letterboxd + Metacritic + Rotten Tomatoes + TMDB + Trakt + Nieznany + Bursztynowy + Karmazynowy + Szmaragdowy + Oceaniczny + Różowy + Fioletowy + Biały + Następny odcinek + Szukanie źródła… + Odtwarzanie przez %1$s za %2$d… + Miniatura następnego odcinka + Niewyemitowany + Pomiń + Pomiń intro + Pomiń outro + Pomiń podsumowanie + Nie znaleziono napisów + Afrikaans + Albański + Amharski + Arabski + Ormiański + Azerbejdżański + Baskijski + Białoruski + Bengalski + Bośniacki + Bułgarski + Birmański + Kataloński + Chiński + Chiński (uproszczony) + Chiński (tradycyjny) + Chorwacki + Czeski + Duński + Niderlandzki + Angielski + Estoński + Filipiński + Fiński + Francuski + Galicyjski + Gruziński + Niemiecki + Grecki + Gudżaracki + Hebrajski + Hindi + Węgierski + Islandzki + Indonezyjski + Irlandzki + Włoski + Japoński + Kannada + Kazachski + Khmerski + Koreański + Laotański + Łotewski + Litewski + Macedoński + Malajski + Malajalam + Maltański + Marathi + Mongolski + Nepalski + Norweski + Perski + Polski + Portugalski (Portugalia) + Portugalski (Brazylia) + Pendżabski + Rumuński + Rosyjski + Serbski + Syngaleski + Słowacki + Słoweński + Hiszpański + Hiszpański (Ameryka Łacińska) + Suahili + Szwedzki + Tamilski + Telugu + Tajski + Turecki + Ukraiński + Urdu + Uzbecki + Wietnamski + Walijski + Zulu + Wyczyść + Kontynuuj + Ignoruj + Zainstaluj + Później + Nie + Aktualizuj + Tak + Czy chcesz wyjść z aplikacji? + Wyjście z aplikacji + Ten katalog nie zwrócił żadnych elementów. + Nie znaleziono tytułów + Sprawdź połączenie Wi-Fi lub danych mobilnych i spróbuj ponownie. + Reżyser + Nie udało się załadować + Podobne + Sezony + Ten dodatek zwrócił filmy dla serialu, ale żaden nie zawierał numerów sezonów ani odcinków. + Ten dodatek nie dostarczył metadanych odcinków dla tego serialu. + Odcinki nie zostały jeszcze opublikowane przez ten dodatek. + Twoje urządzenie jest online, ale Nuvio nie mogło połączyć się z wymaganymi serwerami. + Pokaż mniej + Pokaż więcej ▾ + Scenarzysta + Wszystkie gatunki + Katalog + %1$s • %2$s + Wybrany katalog nie zwrócił elementów odkrywania. + Nie można załadować odkrywania + Zainstalowane dodatki nie udostępniają katalogów kompatybilnych z tablicą do odkrywania. + Brak katalogów odkrywania + Wybrany katalog i filtry nie zwróciły żadnych elementów. + Nie znaleziono tytułów + Zainstaluj i sprawdź co najmniej jeden dodatek przed przeglądaniem katalogów odkrywania. + Wybierz katalog + Wybierz gatunek + Wybierz typ + Typ + Oznacz poprzednie jako nieobejrzane + Oznacz poprzednie jako obejrzane + Oznacz %1$s jako nieobejrzane + Oznacz %1$s jako obejrzane + Oznacz jako nieobejrzane + Oznacz jako obejrzane + Następny + %1$d%% obejrzane + Zainstaluj i sprawdź co najmniej jeden dodatek przed ładowaniem wierszy katalogów na ekranie głównym. + Zainstalowane dodatki nie udostępniają obecnie katalogów kompatybilnych z tablicą bez wymaganych dodatków. + Brak dostępnych wierszy ekranu głównego + Pokaż szczegóły + Kontrolki odtwarzania i zapisywania. + Akcje + Lista głównej obsady. + Powiązana kolekcja lub seria filmów. + Kolekcja + Sekcja komentarzy Trakt. + Czas trwania, status, premiera, język i powiązane informacje. + Szczegóły + Sezony i lista odcinków dla seriali. + Wiersz rekomendacji. + Podobne + Opis, oceny, gatunki i główna obsada. + Przegląd + Studia i stacje. + Produkcja + Wiersz zwiastunów i skróty odtwarzania. + Ponownie online + Nie można połączyć się z serwerami + Brak połączenia z internetem + (wiek %1$d) + Urodzony %1$s%2$s + Zmarł %1$s + Znany z: %1$s + Najnowsze + Nie można załadować szczegółów dla %1$s + Popularne + Coś poszło nie tak + Nadchodzące + Cofnij + Anuluj + Wprowadź PIN + Wprowadź PIN dla %1$s + Zapomniałeś PIN? + Nieprawidłowy PIN + Zablokowane. Spróbuj ponownie za %1$ds + Opcje awatarów pojawią się tutaj po załadowaniu katalogu. + Awatar: %1$s + Wybierz awatar + Wybierz awatar poniżej. + Utwórz profil + Wszystkie dane profilu „%1$s" zostaną trwale usunięte. + Usuń profil + Dodaj profil + Edytuj profil + Wprowadź aktualny PIN + Wprowadź nowy PIN + Profil %1$d + Ładowanie awatarów... + Zarządzaj profilami + Nazwa profilu + Nowy profil + Główne dodatki wyłączone + Główne dodatki włączone + Usuń PIN dla %1$s + Usuń blokadę PIN + Zapisywanie... + Bezpieczeństwo + Dodaj PIN, jeśli chcesz zablokować ten profil przed przełączeniem. + Ten profil jest chroniony PIN-em. + Wybierz awatar dla tego profilu. + Ustaw blokadę PIN + Profil bez nazwy + Użyj głównych dodatków + Udostępnij konfigurację dodatków głównego profilu zamiast zarządzać osobną listą. + Kto ogląda? + Pobrane + Wznów + Aktywne scrapery + Sprawdzanie kolejnych dodatków… + Kopiuj link strumienia + Pobierz plik + Zainstalowane dodatki strumieni nie zwróciły prawidłowej odpowiedzi. + Nie można załadować strumieni + Najpierw zainstaluj dodatek, aby załadować strumienie dla tego tytułu. + Zainstalowane dodatki nie dostarczają strumieni dla tego typu tytułu. + Brak dodatku strumieni + Żaden z zainstalowanych dodatków nie zwrócił strumieni dla tego tytułu. + S%1$d E%2$d + Odcinek + S%1$dE%2$d - %3$s + Pobieranie… + Szukanie źródła… + Szukanie strumieni… + Link strumienia skopiowany + Brak bezpośredniego linku strumienia + Brak dostępnych metadanych + Odśwież strumienie + Wznów od %1$d%% + Wznów od %1$s + ROZMIAR %1$s + Zamknij zwiastun + Nie można odtworzyć zwiastuna + Nie udało się załadować list Trakt + Nie udało się zaktualizować list Trakt + %1$s • %2$s + Sprawdzanie aktualizacji nie powiodło się + Pobieranie nie powiodło się + Pobieranie %1$d%% + Nie można rozpocząć instalacji + Używasz najnowszej wersji. + Zezwól na instalację aplikacji dla Nuvio, a następnie wróć i kontynuuj. + Pobieranie aktualizacji... + Nie znaleziono aktualizacji. + Nowa wersja jest gotowa do instalacji. + Aktualizacje w aplikacji nie są dostępne w tej wersji. + Przygotowywanie pobierania + Informacje o wydaniu + Zezwól na instalację, aby kontynuować + Dostępna aktualizacja + Status aktualizacji + Ten dodatek jest już zainstalowany. + Wprowadź prawidłowy URL dodatku + Nie można załadować manifestu + Nuvio + Usunięcie konta nie powiodło się + Logowanie nie powiodło się + Wylogowanie nie powiodło się + Rejestracja nie powiodła się + Nie można załadować elementów katalogu. + Następny + Następny • S%1$dE%2$d + Logo %1$s + Nie udało się załadować komentarzy + Nie można załadować szczegółów z żadnego dodatku. + Stacje + Żaden dodatek nie dostarcza metadanych dla tej treści. + Pobieranie nie powiodło się + Pokazuje postęp pobierania na żywo i kontrolki. + Pobrane + Pobieranie zakończone + Pobieranie %1$s • %2$s + Pobieranie %1$s • %2$s / %3$s + Pobieranie nie powiodło się + Wstrzymano %1$s + Usuń + Usunąć %1$s z biblioteki? + Usunąć z biblioteki? + Film + Alerty o premierach nowych odcinków zapisanych seriali. + Podgląd alertu o premierze odcinka. + Nie udało się wysłać powiadomienia testowego. + Wysłano powiadomienie testowe dla %1$s. + Nie można odtworzyć tego strumienia. + PIN tego profilu został zmieniony. Połącz się raz, aby odświeżyć blokadę na tym urządzeniu. + Nie można usunąć blokady PIN. Spróbuj ponownie. + Połącz się z internetem, aby usunąć blokadę PIN. + Tego PIN-u nie można zweryfikować offline na tym urządzeniu. Połącz się raz i odblokuj go online. + Nie można ustawić PIN-u. Spróbuj ponownie. + Połącz się z internetem, aby ustawić PIN. + Ten profil używa głównych dodatków. + Nie udało się załadować %1$s + Strumień + Wbudowane + Autoryzacja odrzucona + Dokończ logowanie Trakt w przeglądarce + Nieprawidłowy callback Trakt + Nieprawidłowy stan callback Trakt + Nieprawidłowa odpowiedź tokenu Trakt + Nie udało się załadować biblioteki Trakt + Lista %1$d + Trakt nie zwrócił kodu autoryzacji + Brak danych uwierzytelniających Trakt + Nie udało się załadować postępu Trakt + Nie udało się dokończyć logowania Trakt + Użytkownik Trakt + Lista obserwowanych + Zwiastun + Nieznany + Dodatek + Zapisano + Odtwórz %1$s + Wznów %1$s + JSON jest pusty. + Kolekcja %1$d ma puste id. + Kolekcja „%1$s" ma pusty tytuł. + Folder %1$d w „%2$s" ma puste id. + Folder „%1$s" w „%2$s" ma pusty tytuł. + Źródło %1$d w folderze „%2$s" ma puste pola. + Nieprawidłowy JSON: %1$s + Nie znaleziono dodatku: %1$s + Styczeń + Luty + Marzec + Kwiecień + Maj + Czerwiec + Lipiec + Sierpień + Wrzesień + Październik + Listopad + Grudzień + Sty + Lut + Mar + Kwi + Maj + Cze + Lip + Sie + Wrz + Paź + Lis + Gru + Firma produkcyjna + Stacja + Nie można załadować %1$s + Popularne + Ostatnie + %1$s • %2$s + Najwyżej oceniane + Kategoria wiekowa + Szczegóły filmu + Język oryginalny + Kraj pochodzenia + Informacje o premierze + Czas trwania + Plakaty + Tekst + Szczegóły serialu + Status + Filmy + PLIK + Brak bezpośredniego linku strumienia + Zastąpiono poprzednie pobieranie + Pobieranie rozpoczęte + Nieobsługiwany format strumienia do pobrania + Pusta treść odpowiedzi + Żądanie nie powiodło się z kodem HTTP %1$d + System pobierania nie jest zainicjalizowany + Żądanie pobierania nie powiodło się + %1$s - %2$s + Zapisane tytuły pojawią się tutaj po naciśnięciu Zapisz na ekranie szczegółów. + Twoja biblioteka jest pusta + Nie można załadować biblioteki + Inne + Biblioteka + Połącz Trakt i zapisuj tytuły na liście obserwowanych lub osobistych listach. + Twoja biblioteka Trakt jest pusta + Nie można załadować biblioteki Trakt + Biblioteka Trakt + Anime + Kanały + Filmy + Seriale + TV + %1$s jest już dostępny + %1$s • %2$s jest już dostępny + Nowy odcinek jest już dostępny + %1$s jest już dostępny + Premiery odcinków + Twórca + Reżyser + Scenarzysta + Ocena widzów + Nie znaleziono odtwarzalnego strumienia zwiastuna. + Sezon %1$d - %2$s + B + KB + MB + GB + \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt index 9aa30c83..a8e8c904 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt @@ -6,6 +6,7 @@ import nuvio.composeapp.generated.resources.lang_spanish import nuvio.composeapp.generated.resources.lang_turkish import nuvio.composeapp.generated.resources.lang_italian import nuvio.composeapp.generated.resources.lang_greek +import nuvio.composeapp.generated.resources.lang_polish import org.jetbrains.compose.resources.StringResource enum class AppLanguage( @@ -17,6 +18,7 @@ enum class AppLanguage( TURKISH("tr", Res.string.lang_turkish), ITALIAN("it", Res.string.lang_italian), GREEK("el", Res.string.lang_greek), + POLISH("pl", Res.string.lang_polish), ; companion object { From 395acd30cb28d688dd3ae9bf4b993fea8e0fd2c6 Mon Sep 17 00:00:00 2001 From: D4rk56 Date: Sun, 26 Apr 2026 18:14:52 +0200 Subject: [PATCH 031/143] Add French language translation --- .../src/androidMain/res/xml/locale_config.xml | 1 + .../composeResources/values-fr/strings.xml | 1162 +++++++++++++++++ .../app/features/settings/AppLanguage.kt | 2 + 3 files changed, 1165 insertions(+) create mode 100644 composeApp/src/commonMain/composeResources/values-fr/strings.xml diff --git a/composeApp/src/androidMain/res/xml/locale_config.xml b/composeApp/src/androidMain/res/xml/locale_config.xml index 6e8aae61..61ea76e1 100644 --- a/composeApp/src/androidMain/res/xml/locale_config.xml +++ b/composeApp/src/androidMain/res/xml/locale_config.xml @@ -1,6 +1,7 @@ + diff --git a/composeApp/src/commonMain/composeResources/values-fr/strings.xml b/composeApp/src/commonMain/composeResources/values-fr/strings.xml new file mode 100644 index 00000000..ded18299 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/values-fr/strings.xml @@ -0,0 +1,1162 @@ + + + Reconnaissance ouverte et crédits du projet + Retour + Annuler + Fermer + Supprimer + Terminé + Modifier + Importer + Suivant + OK + Lire + Précédent + Supprimer + Réorganiser + Réinitialiser + Reprendre + Réessayer + Enregistrer + Installation en cours + Addons + Actif + %1$d catalogues + Configurable + Actualisation + %1$d ressources + Indisponible + Configurer l\'addon + Supprimer l\'addon + Ajoutez une URL de manifeste pour commencer à charger des catalogues, métadonnées, streams ou sous-titres dans Nuvio. + Aucune addons installée. + Veuillez saisir une URL d\'addon. + URL de l\'addon + Installer l\'addon + Chargement des détails du manifeste… + Validation de l\'URL du manifeste et chargement des détails de l\'addon avant installation. + Vérification de l\'addon + Échec de l\'installation + %1$s a été validé et ajouté avec succès. + Addon installée + Déplacer l\'addon vers le bas + Déplacer l\'addon vers le haut + Actif + Addons + Catalogues + Actualiser l\'addon + Ajouter une addon + Addons installées + Aperçu + %1$d règles d\'ID + Version %1$s + Sélectionné + Copier le JSON + %1$d collection(s), %2$d dossier(s) + Supprimer "%1$s" ? Cette action est irréversible. + Supprimer la collection + Ajouter un catalogue + Ajouter un dossier + Tous les genres + Ajoutez des catalogues depuis vos extensions installées pour définir ce qu\'affiche ce dossier. + Aucune source de catalogue + Choisir + Emoji + URL de l\'image + Aucune + Couverture + Créer une collection + Terminé + Modifier la collection + Modifier le dossier + Configurez l\'identité, la présentation et les sources de catalogue du dossier avec la même structure que l\'éditeur principal de collections. + Ajoutez-en un pour commencer. + Aucun dossier + Dossiers + Filtre de genre + Afficher uniquement l\'image de couverture + Masquer le titre + Nouveau dossier + Affiche cette collection au-dessus de tous les catalogues normaux de l\'accueil. Plusieurs collections épinglées suivent l\'ordre de création. + Épingler au-dessus des catalogues + URL de l\'image de fond (facultatif) + Nom du dossier + URL du GIF animé (se lit uniquement au focus) + Nom de la collection + Enregistrer les modifications + Enregistrer + Apparence + Informations de base + Sources de catalogue + Choisissez les catalogues d\'extension que ce dossier doit regrouper. + Sélectionner des catalogues + Sélectionner un genre + %1$d sélectionné(s) + %1$d catalogues + %1$d sélectionné(s) + Affiche + Carré + Large + Combiner tous les catalogues en un seul onglet + Afficher l\'onglet « Tout » + Lire le GIF configuré à la place de la couverture statique lorsqu\'il est disponible. + Afficher le GIF si configuré + %1$d source(s) · %2$s + Forme de la tuile + Lignes + Onglets + Mode d\'affichage + Sources TMDB + Liste publique + Production + Chaîne + Collection + Personnalisé + Choisissez une source prédéfinie. Vous pouvez la modifier ou la supprimer après l\'avoir ajoutée. + Collez une URL de liste publique TMDB ou uniquement le numéro de l\'URL. + Recherchez par nom de studio, ou collez un ID/URL de société TMDB et ajoutez-le directement. + Saisissez un ID de chaîne. Les chaînes courantes sont disponibles dans les préréglages et les filtres rapides. + Recherchez le nom d\'une collection de films ou collez l\'ID de collection TMDB. + Créez une ligne TMDB dynamique avec des filtres optionnels. Laissez les champs vides si vous n\'avez pas besoin de ce filtre. + Liste publique TMDB + ID de chaîne + ID de collection + Nom, ID ou URL de société de production + ID ou URL TMDB + https://www.themoviedb.org/list/8504994 ou 8504994 + 213 pour Netflix, 49 pour HBO, 2739 pour Disney+ + 10 pour Star Wars Collection + Marvel Studios, 420 ou URL de société + Exemples : Marvel Studios, 420 ou https://www.themoviedb.org/company/420. + Exemple : Star Wars Collection, Harry Potter Collection ou une URL de collection. + Exemples d\'ID : Netflix 213, HBO 49, Disney+ 2739. + Exemple : https://www.themoviedb.org/list/8504994 ou 8504994. + Titre affiché + Affiché comme nom de ligne/onglet. Si vide, Nuvio en génère un depuis la source. + Films Marvel, Originaux Netflix, Pixar + Meilleurs films d\'action, drames coréens, animation 2024 + Résultats de recherche + Collection TMDB + Société TMDB %1$d + Collection TMDB %1$d + Type + Films + Séries + Les deux + Tri + Filtres + Laissez les champs vides si vous n\'avez pas besoin de ce filtre. + Genres rapides + Langues rapides + Pays rapides + Mots-clés rapides + Studios rapides + Chaînes rapides + ID de genre + Utilisez des numéros de genre TMDB. Séparez plusieurs valeurs par des virgules pour ET, ou des barres verticales pour OU. + Date de sortie ou de diffusion depuis + Date de sortie ou de diffusion jusqu\'au + Utilisez le format AAAA-MM-JJ, ex. 2024-01-01. + Note minimale + Note maximale + Note TMDB de 0 à 10. Exemple : 7.0. + Votes minimum + Utilisez ceci pour éviter les titres peu connus avec peu de votes. Exemple : 100. + Langue originale + Utilisez des codes de langue à deux lettres, ex. en, ko, ja, hi. + Pays d\'origine + Utilisez des codes de pays à deux lettres, ex. US, KR, JP, IN. + ID de mots-clés + Utilisez des numéros de mots-clés TMDB. Les puces rapides remplissent des exemples courants. + 9715 pour super-héros + ID de société + Utilisez des ID de studio/société. Les puces rapides remplissent des exemples courants. + 420 pour Marvel Studios + ID de chaîne + Pour les séries uniquement. Utilisez des ID de chaîne comme Netflix 213 ou HBO 49. + 213 pour Netflix + Année + Utilisez une année à quatre chiffres, ex. 2024. + Préréglages + Rechercher + Ajouter une source + Action + Aventure + Animation + Comédie + Horreur + Science-fiction + Drame + Crime + Téléréalité + Anglais + Coréen + Japonais + Hindi + Espagnol + États-Unis + Corée + Japon + Inde + Royaume-Uni + Super-héros + Adapté d\'un roman + Voyage dans le temps + Espace + Marvel + Disney + Pixar + Lucasfilm + Warner Bros. + Netflix + HBO + Disney+ + Prime Video + Hulu + Populaire + Mieux notés + Récent + Liste TMDB + Collection de films TMDB + Production + Chaîne + Découverte TMDB + Créez-en une pour organiser vos catalogues. + Aucune collection + %1$d dossier(s) + Aucun élément trouvé + Dossier introuvable + Collections + Importer des collections + JSON + Collez le JSON de vos collections ci-dessous. + Importer + Nouvelle collection + Épinglé + Tout + Vos collections + Fait avec ❤️ par Tapframe et ses amis + Version %1$s (%2$s) + Désactivé + Activé + Pause + Recharger + Vous avez déjà un compte ? + Continuer sans compte + Créer un compte + Pas encore de compte ? + Adresse e-mail + ou + Mot de passe + Connectez-vous pour accéder à votre bibliothèque et votre progression + Se connecter + Inscrivez-vous pour synchroniser vos données entre appareils + S\'inscrire + Vos données seront uniquement stockées localement + Regardez tout, partout + Bon retour + Bibliothèque + Bibliothèque Trakt + Accueil + Bibliothèque + Profil + Rechercher + Pistes audio + Audio + Intégré + Décalage inférieur + Fermer le lecteur + Couleur + En cours de lecture + E%1$d + S%1$dE%2$d + S%1$dE%2$d • %3$s + Épisodes + Taille de police + %1$dsp + Verrouiller les contrôles du lecteur + Aucune piste audio disponible + Aucun épisode disponible + Aucun stream trouvé + Aucun + Contour + Épisodes + Sources + Streams + Erreur de lecture + Lecture en cours + Appuyez pour chercher des sous-titres + Retour + Rétablir les valeurs par défaut + Remplir + Ajuster + Zoom + Reculer de 10 secondes + -%1$ds + +%1$ds + -%1$ds + +%1$ds + Avancer de 10 secondes + Sources + Style + Sous-titres + Sous-titres + Luminosité %1$s + Volume %1$s + Muet + Téléchargé + Diffusé + À confirmer + Appuyez pour déverrouiller + Piste %1$d + Déverrouiller les contrôles du lecteur + Vous regardez + Ajouter un profil + Effacer la recherche + Découvrir + Les extensions installées n\'ont retourné aucun résultat de recherche valide. + La recherche a échoué + Installez et validez au moins une extension avant de rechercher. + Aucune extension active + Les catalogues installés n\'ont retourné aucun résultat pour cette requête. + Aucun résultat trouvé + Vos extensions installées n\'exposent pas de catalogue de recherche. + Aucun catalogue de recherche + Rechercher des films, séries… + Recherches récentes + Supprimer la recherche récente + À propos + Général + Compte + Extensions + Apparence + Contenu et découverte + Continuer à regarder + Écran d\'accueil + Intégrations + Notes MDBList + Écran méta + Notifications + Lecture + Plugins + Personnalisation des affiches + Paramètres + Supporters et contributeurs + Enrichissement TMDB + Trakt + À PROPOS + Gérez votre compte, déconnectez-vous ou supprimez-le. + COMPTE + Ajustez la présentation de l\'accueil et les préférences visuelles. + Rechercher de nouvelles versions de l\'application. + Vérifier les mises à jour + Gérez les extensions et sources de découverte. + Gérez vos films et épisodes téléchargés. + Téléchargements + GÉNÉRAL + Connectez les services TMDB et MDBList. + Gérez les alertes de sortie d\'épisodes et envoyez une notification de test. + Basculer vers un profil différent. + Changer de profil + Connectez Trakt, synchronisez des listes et enregistrez des titres directement dans Trakt. + Chargement de vos listes Trakt… + Choisissez où enregistrer ce titre dans Trakt + Faire un don + Voir les détails + Supprimer + Recommencer depuis le début + Lire + %1$d/10 + Avis + Spoiler + Aucun avis Trakt pour l\'instant. + %1$d j\'aime + Ce commentaire contient des spoilers. + Ce commentaire contient des spoilers et a été masqué. + Commentaires + Bande-annonce + %1$s (%2$d) + Bandes-annonces + Aucun épisode terminé + Aucun téléchargement + %1$d épisode(s) téléchargé(s) + Actifs + Films + Séries + Afficher les téléchargements + Terminé • %1$s + Téléchargement • %1$s + Échoué + En pause • %1$s + Vu + Saison %1$d + Spéciaux + Reprendre où vous en étiez + Ajouter à la bibliothèque + Marquer comme non vu + Marquer comme vu + Retirer de la bibliothèque + Tout voir + Lire manuellement + Logo de %1$s + Compte + Supprimer le compte + Cela supprimera définitivement votre compte et toutes les données associées. + Cette action est irréversible. Toutes vos données, profils et historique de synchronisation seront définitivement supprimés. + Supprimer le compte ? + Adresse e-mail + Non connecté + Se déconnecter + Vous serez redirigé vers l\'écran de connexion. + Se déconnecter ? + Statut + Anonyme + Connecté + Noir AMOLED + Utilise des fonds noirs purs pour les écrans OLED. + Langue de l\'application + Choisir la langue + Afficher, masquer et ajuster le bandeau Continuer à regarder. + Ajustez la largeur partagée des cartes d\'affiches et les rayons des coins. + AFFICHAGE + ACCUEIL + THÈME + Collection • %1$s + Nom affiché + Installez une extension avec des catalogues compatibles avec les tableaux pour configurer les lignes de l\'écran d\'accueil. + Aucun catalogue d\'accueil + Source Hero + Masqué + Garder l\'accueil en focus + %1$s • Limite atteinte (max. %2$d) + Aucune source Hero sélectionnée + Absent du Hero + Retirez l\'épingle de la collection pour la déplacer + Épinglé + Épinglé en haut + Réorganiser + CATALOGUES + CATALOGUES ET COLLECTIONS + COLLECTIONS + HERO + SOURCES HERO + %1$d sur %2$d sélectionnés + Afficher le Hero + Afficher un carrousel Hero en vedette en haut de l\'accueil. Choisissez jusqu\'à 2 catalogues sources ci-dessous. + %1$d sur %2$d catalogues visibles • %3$d sources Hero sélectionnées + Ouvrez un catalogue uniquement si vous avez besoin de le renommer ou de le réorganiser. + Visible + Lecteur, sous-titres et lecture automatique + Rayon de carte + STYLE DE CARTE D\'AFFICHE + Largeur de carte + Personnalisé + Personnalisez la largeur de carte et le rayon des coins pour les cartes d\'affiches partagées dans toute l\'application. + Masquer les étiquettes + Mode paysage pour les affiches dans les rayons + Aperçu en direct + %1$s (%2$s) + Rayon de coin : %1$ddp + Hauteur : %1$ddp + Largeur : %1$ddp + Classique + Pilule + Arrondi + Marqué + Subtil + Équilibré + Confortable + Compact + Dense + Grand + Standard + Afficher une invite pour reprendre là où vous en étiez à l\'ouverture de l\'application après avoir quitté le lecteur. + Invite de reprise au démarrage + STYLE DE CARTE + AU DÉMARRAGE + COMPORTEMENT DE LA SUITE + VISIBILITÉ + Afficher le bandeau Continuer à regarder sur l\'écran d\'accueil. + Afficher Continuer à regarder + Affiche + Carte d\'affiche centrée sur la couverture + Large + Carte horizontale riche en informations + Quand activé, La suite reprend toujours depuis l\'épisode le plus avancé vu. Quand désactivé, suit l\'épisode le plus récemment visionné. Utile si vous revoyez des épisodes précédents. + La suite depuis l\'épisode le plus avancé + ACCUEIL + SOURCES + Installez, supprimez, mettez à jour et ordonnez vos sources de contenu. + Installez des dépôts de scrapers JavaScript et testez des fournisseurs en interne. + Contrôlez quels catalogues apparaissent à l\'accueil et dans quel ordre. + Désactivez des sections de détails et réorganisez tout sous le Hero. + Créez des regroupements de catalogues personnalisés avec des dossiers affichés à l\'accueil. + INTÉGRATIONS + Enrichissez les pages de détails avec de l\'art, des crédits, des métadonnées d\'épisodes et plus depuis TMDB. + Ajoutez des notes externes d\'IMDb, Rotten Tomatoes, Metacritic et d\'autres aux pages de détails. + Ajoutez votre clé API MDBList ci-dessous avant d\'activer les notes. + Obtenez une clé sur https://mdblist.com/preferences et collez-la ici. + Clé API + Clé API MDBList + Activer les notes MDBList + Afficher les notes externes de MDBList sur les pages de métadonnées lorsqu\'un ID IMDb est disponible. + CLÉ API + FOURNISSEURS DE NOTES + MDBLIST + Actions + Contrôles de lecture et de sauvegarde. + Casting + Liste principale du casting. + Fond cinématographique + Fond flou derrière le contenu, similaire à l\'écran de streams. + Collection + Rayon de collection ou de franchise associée. + Commentaires + Section de commentaires Trakt. + Détails + Durée, statut, sortie, langue et informations associées. + Cartes d\'épisodes + Choisissez comment les épisodes sont affichés sur l\'écran de métadonnées. + Horizontal + Cartes en ligne style fond + Liste + Cartes empilées centrées sur les détails + Épisodes + Saisons et liste d\'épisodes pour les séries. + Groupe %1$d + Plus comme ceci + Rayon de recommandations. + Aucun + Résumé + Synopsis, notes, genres et crédits principaux. + Production + Studios et chaînes. + APPARENCE + SECTIONS + Groupe d\'onglets %1$d + Disposition des onglets + Regroupez les sections en onglets comme dans l\'application TV. Assignez jusqu\'à 3 sections par groupe d\'onglets. + Bandes-annonces + Rayon de bandes-annonces et raccourcis de lecture. + Les notifications sont actuellement désactivées dans Nuvio. + Alertes de sortie d\'épisodes + Programmez des notifications locales lorsqu\'un nouvel épisode d\'une série sauvegardée est disponible. + Les notifications système sont désactivées pour Nuvio. Activez-les pour recevoir des alertes et des notifications de test. + Il y a actuellement %1$d alertes de sortie programmées sur cet appareil. + ALERTES + TEST + Envoyer une notification de test + Envoi de la notification de test… + Envoyer une notification locale de test pour %1$s. + Sauvegardez d\'abord une série dans votre bibliothèque pour tester les notifications. + Notification de test + Communauté + Découvrez les personnes qui construisent et soutiennent Nuvio sur Mobile, TV et Web. + L\'API des supporters n\'est pas configurée. Ajoutez DONATIONS_BASE_URL dans local.properties. + Contributeurs + Supporters + Ouvrir GitHub + Profil GitHub indisponible + Aucun message joint. + Chargement des contributeurs… + Chargement des supporters… + Impossible de charger les contributeurs + Impossible de charger les supporters + Aucun contributeur trouvé. + Aucun supporter trouvé. + Impossible de charger les contributeurs. + Impossible de charger les supporters. + Impossible de charger les contributeurs pour le moment. + Impossible de charger les supporters pour le moment. + %1$d commits au total + Jan + Fév + Mar + Avr + Mai + Jun + Jul + Aoû + Sep + Oct + Nov + Déc + %1$s %2$s %3$s + Toutes les extensions + Tous les plugins + Extensions autorisées + Plugins autorisés + Anime Skip + ID client AnimeSkip + Saisissez votre ID client API AnimeSkip. Obtenez-en un sur anime-skip.com. + Rechercher également des marqueurs de saut sur AnimeSkip (nécessite un ID client). + Lecture automatique de l\'épisode suivant + Rechercher et lire automatiquement l\'épisode suivant lorsque le seuil est atteint. + Appareil uniquement + Préférer l\'application (FFmpeg) + Préférer l\'appareil + Priorité du décodeur + Appuyez en dehors pour fermer + Appuyez en dehors pour enregistrer et fermer + %1$d jour + %1$d jours + %1$d heure + %1$d heures + Activer libass + Utiliser libass pour afficher les sous-titres ASS/SSA à la place du moteur par défaut. + Vitesse au maintien + Maintenir pour accélérer + Maintenez appuyé n\'importe où sur la surface du lecteur pour augmenter temporairement la vitesse. + Modèle regex invalide + Durée du cache du dernier lien + Mapper DV7 vers HEVC + Utiliser Dolby Vision Profil 7 vers HEVC comme alternative pour les appareils non compatibles. + Minutes avant la fin + Afficher la carte de l\'épisode suivant ce nombre de minutes avant la fin. + %1$d min + Aucun élément disponible + Non défini + Par défaut + Langue de l\'appareil + Forcé + Aucun + Préférer le groupe binge + Lors de la lecture automatique, préférer un stream du même groupe binge que le stream actuel. + Langue audio préférée + Langue des sous-titres préférée + Préréglages + Correspond au nom du stream, à l\'étiquette, à la description, à l\'extension et à l\'URL. + Modèle regex + 4K|2160p|Remux + N\'importe quel 1080p+ + AVC / x264 + Qualité BluRay + Dolby Atmos / DTS + Anglais + HDR / Dolby Vision + HEVC / x265 + Sans CAM/TS + Sans REMUX/HDR + 1080p standard + 4K / Remux + 720p / plus petit + Sources WEB + Type de rendu + Standard (Cues) + Canvas avec effets + OpenGL avec effets + Canvas superposé + OpenGL superposé + Réutiliser le dernier lien + Lire automatiquement votre dernier stream fonctionnel pour ce même film/épisode lorsque le cache est encore valide. + Langue audio secondaire + Langue des sous-titres secondaire + DÉCODEUR + ÉPISODE SUIVANT + LECTEUR + PASSER LES SEGMENTS + LECTURE AUTOMATIQUE DES STREAMS + SÉLECTION DU STREAM + SOUS-TITRES ET AUDIO + RENDU DES SOUS-TITRES + %1$d sélectionné(s) + Afficher la superposition de chargement + Afficher la superposition de chargement initiale pendant le démarrage d\'un stream. + Passer l\'intro/outro/récap + Afficher un bouton de saut lors des segments d\'intro, d\'outro et de récapitulatif détectés. + Périmètre des sources + Toutes les extensions + Considérer les streams de toutes les extensions installées. + Toutes les sources + Considérer les streams des extensions et des plugins. + Plugins activés uniquement + Considérer uniquement les streams des plugins activés. + Extensions installées uniquement + Considérer uniquement les streams des extensions installées. + Mode de sélection du stream + Premier stream disponible + Lire automatiquement le premier stream trouvé. + Manuel + Sélectionner les streams manuellement à chaque fois. + Correspondance regex + Sélectionner automatiquement un stream correspondant à un modèle regex. + Délai d\'expiration du stream + Combien de temps attendre les streams avant la sélection automatique. + Minutes avant la fin + Mode de seuil + Minutes avant la fin + Pourcentage + Pourcentage de seuil + Afficher la carte de l\'épisode suivant lorsque la lecture atteint ce pourcentage. + %1$d%% + Instantané + %1$ds + Illimité + Lecture tunnelisée + Active la lecture tunnelisée pour une latence réduite dans la synchronisation audio/vidéo. + Ajoutez votre propre clé API TMDB ci-dessous avant d\'activer l\'enrichissement. + Clé API TMDB + Activer l\'enrichissement TMDB + Utiliser votre clé API TMDB pour enrichir les métadonnées de l\'extension sur l\'écran de détails lorsqu\'un ID TMDB ou IMDb est disponible. + Saisissez votre clé API v3 TMDB. + Code de langue + Visuels + Remplacer le fond, l\'affiche et le logo par les visuels TMDB. + Informations de base + Utiliser le titre, le synopsis, les genres et la note de TMDB. + Collections + Afficher des rayons de franchise et de collection pour les films lorsque TMDB les fournit. + Crédits + Utiliser les créateurs, réalisateurs, scénaristes et photos du casting de TMDB. + Détails + Utiliser les informations de sortie, durée, classification, statut, pays et langue de TMDB. + Épisodes + Utiliser les titres, miniatures, descriptions et durées des épisodes de TMDB pour les séries. + Plus comme ceci + Afficher les recommandations TMDB en bas des pages de détails. + Chaînes + Utiliser les métadonnées des chaînes TMDB pour les titres TV. + Sociétés de production + Utiliser les métadonnées des sociétés de production TMDB sur l\'écran de détails. + Affiches de saison + Utiliser les affiches de saison TMDB dans le sélecteur de saisons de l\'écran de métadonnées pour les séries. + Bandes-annonces + Récupérer et afficher la section des bandes-annonces TMDB sur les pages de détails. + Clé API personnelle + Langue préférée + Configurez le code de langue TMDB utilisé pour les métadonnées localisées, ex. `en`, `en-US` ou `pt-BR`. + IDENTIFIANTS + LOCALISATION + MODULES + TMDB + Après approbation, vous serez redirigé automatiquement. + AUTHENTIFICATION + Commentaires + Afficher les commentaires Trakt dans les détails des films et séries + Connecter Trakt + Connecté en tant que %1$s + Utilisateur Trakt + Déconnecter + Impossible d\'ouvrir le navigateur + FONCTIONNALITÉS + Terminez la connexion Trakt dans votre navigateur + Suivez ce que vous regardez, enregistrez dans votre liste ou vos listes personnalisées et gardez votre bibliothèque synchronisée avec Trakt. + Identifiants Trakt manquants dans local.properties (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET). + Ouvrir la connexion Trakt + Vos actions d\'enregistrement peuvent maintenant cibler la watchlist Trakt et vos listes personnelles. + Connectez-vous avec Trakt pour activer la sauvegarde basée sur les listes et le mode bibliothèque Trakt. + Score du public + IMDb + Letterboxd + Metacritic + Rotten Tomatoes + TMDB + Trakt + Inconnu + Ambre + Cramoisi + Émeraude + Océan + Rose + Violet + Blanc + Épisode suivant + Recherche de la source… + Lecture via %1$s dans %2$d… + Miniature de l\'épisode suivant + Non diffusé + Passer + Passer l\'intro + Passer l\'outro + Passer le récap + Aucun sous-titre trouvé + Afrikaans + Albanais + Amharique + Arabe + Arménien + Azerbaïdjanais + Basque + Biélorusse + Bengali + Bosnien + Bulgare + Birman + Catalan + Chinois + Chinois (simplifié) + Chinois (traditionnel) + Croate + Tchèque + Danois + Néerlandais + Anglais + Estonien + Filipino + Finnois + Français + Galicien + Géorgien + Allemand + Grec + Gujarati + Hébreu + Hindi + Hongrois + Islandais + Indonésien + Irlandais + Italien + Japonais + Kannada + Kazakh + Khmer + Coréen + Laotien + Letton + Lituanien + Macédonien + Malais + Malayalam + Maltais + Marathi + Mongol + Népalais + Norvégien + Persan + Polonais + Portugais (Portugal) + Portugais (Brésil) + Pendjabi + Roumain + Russe + Serbe + Cingalais + Slovaque + Slovène + Espagnol + Espagnol (Amérique latine) + Swahili + Suédois + Tamoul + Telugu + Thaï + Turc + Ukrainien + Ourdou + Ouzbek + Vietnamien + Gallois + Zoulou + Effacer + Continuer + Ignorer + Installer + Plus tard + Non + Mettre à jour + Oui + Voulez-vous quitter l\'application ? + Quitter l\'application + Ce catalogue n\'a retourné aucun élément. + Aucun titre trouvé + Vérifiez votre connexion Wi‑Fi ou données mobiles et réessayez. + Réalisateur + Échec du chargement + Plus comme ceci + Saisons + Cette extension a retourné des vidéos pour la série, mais aucune n\'incluait de numéros de saison ou d\'épisode. + Cette extension n\'a fourni aucune métadonnée d\'épisode pour cette série. + Cette extension n\'a pas encore publié d\'épisodes. + Votre appareil est en ligne, mais Nuvio n\'a pas pu se connecter aux serveurs nécessaires. + Afficher moins + Afficher plus ▾ + Scénariste + Tous les genres + Catalogue + %1$s • %2$s + Le catalogue sélectionné n\'a retourné aucun élément de découverte. + Impossible de charger Découvrir + Les extensions installées n\'exposent pas de catalogues compatibles avec le tableau pour Découvrir. + Aucun catalogue de découverte + Le catalogue et les filtres sélectionnés n\'ont retourné aucun élément. + Aucun titre trouvé + Installez et validez au moins une extension avant d\'explorer les catalogues dans Découvrir. + Sélectionner un catalogue + Sélectionner un genre + Sélectionner un type + Type + Marquer les précédents comme non vus + Marquer les précédents comme vus + Marquer %1$s comme non vue + Marquer %1$s comme vue + Marquer comme non vu + Marquer comme vu + Suivant + %1$d%% vu + Installez et validez au moins une extension avant de charger des lignes de catalogue à l\'accueil. + Les extensions installées n\'exposent actuellement aucun catalogue compatible avec le tableau sans extras requis. + Aucune ligne d\'accueil disponible + Voir les détails + Contrôles pour lire et enregistrer. + Actions + Liste principale du casting. + Rayon de collection ou de franchise associée. + Collection + Section de commentaires Trakt. + Durée, statut, date de sortie, langue et informations associées. + Détails + Saisons et liste d\'épisodes pour les séries. + Rayon de recommandations. + Plus comme ceci + Synopsis, notes, genres et crédits principaux. + Résumé + Studios et chaînes. + Production + Rayon de bandes-annonces et raccourcis de lecture. + De nouveau en ligne + Impossible d\'atteindre les serveurs + Pas de connexion Internet + (âge %1$d) + Né(e) le %1$s%2$s + Décédé(e) le %1$s + Connu(e) pour : %1$s + Récent + Impossible de charger les détails de %1$s + Populaire + Une erreur est survenue + À venir + Effacer + Annuler + Saisir le code PIN + Saisir le code PIN pour %1$s + Code PIN oublié ? + Code PIN incorrect + Bloqué. Réessayez dans %1$ds + Les options d\'avatar apparaîtront ici une fois le catalogue chargé. + Avatar : %1$s + Choisir un avatar + Choisissez un avatar ci-dessous. + Créer un profil + Toutes les données de "%1$s" seront définitivement supprimées. + Supprimer le profil + Ajouter un profil + Modifier le profil + Saisir le code PIN actuel + Saisir un nouveau code PIN + Profil %1$d + Chargement des avatars… + Gérer les profils + Nom du profil + Nouveau profil + Extensions principales désactivées + Extensions principales activées + Supprimer le code PIN pour %1$s + Supprimer le verrouillage PIN + Enregistrement… + Sécurité + Ajoutez un code PIN si vous souhaitez que ce profil soit verrouillé avant d\'y accéder. + Ce profil est protégé par un code PIN. + Sélectionnez un avatar pour ce profil. + Configurer le verrouillage PIN + Profil sans nom + Utiliser les extensions principales + Partager la configuration des extensions du profil principal plutôt que de gérer une liste séparée. + Qui regarde ? + Téléchargé + Reprendre + Scrapers actifs + Vérification d\'autres extensions… + Copier le lien du stream + Télécharger le fichier + Les extensions de streams installées n\'ont pas retourné de réponse valide. + Impossible de charger les streams + Installez d\'abord une extension pour charger les streams de ce titre. + Vos extensions installées ne fournissent pas de streams pour ce type de titre. + Aucune extension de streams disponible + Aucune de vos extensions installées n\'a retourné de streams pour ce titre. + S%1$d E%2$d + Épisode + S%1$dE%2$d - %3$s + Récupération… + Recherche de la source… + Recherche des streams… + Lien du stream copié + Aucun lien direct du stream disponible + Aucune métadonnée disponible + Actualiser les streams + Reprendre depuis %1$d%% + Reprendre depuis %1$s + TAILLE %1$s + Fermer la bande-annonce + Impossible de lire la bande-annonce + Impossible de charger les listes Trakt + Impossible de mettre à jour les listes Trakt + %1$s • %2$s + Échec de la vérification des mises à jour + Échec du téléchargement + Téléchargement %1$d%% + Impossible de démarrer l\'installation + Vous utilisez la version la plus récente. + Activez l\'installation d\'applications pour Nuvio puis revenez pour continuer. + Téléchargement de la mise à jour… + Aucune mise à jour trouvée. + Une nouvelle version est prête à être installée. + Les mises à jour intégrées ne sont pas disponibles dans cette version. + Préparation du téléchargement + Notes de version + Autoriser les installations pour continuer + Mise à jour disponible + Statut de la mise à jour + Cette extension est déjà installée. + Veuillez saisir une URL d\'extension valide + Impossible de charger le manifeste + Nuvio + Impossible de supprimer le compte + Échec de la connexion + Échec de la déconnexion + Échec de l\'inscription + Impossible de charger les éléments du catalogue. + À suivre + À suivre • S%1$dE%2$d + logo de %1$s + Impossible de charger les commentaires + Impossible de charger les détails depuis aucune extension. + Réseaux + Aucune extension ne fournit de métadonnées pour ce contenu. + Téléchargement échoué + Affiche la progression en direct et les contrôles de téléchargement. + Téléchargements + Téléchargement terminé + Téléchargement de %1$s • %2$s + Téléchargement de %1$s • %2$s / %3$s + Téléchargement échoué + En pause %1$s + Supprimer + Supprimer %1$s de votre bibliothèque ? + Retirer de la bibliothèque ? + Film + Alertes lorsqu\'un nouvel épisode d\'une série sauvegardée est disponible. + Aperçu de l\'alerte de sortie d\'épisode. + Impossible d\'envoyer une notification de test. + Notification de test envoyée pour %1$s. + Impossible de lire ce stream. + Le code PIN de ce profil a changé. Connectez-vous une fois pour mettre à jour le verrouillage sur cet appareil. + Impossible de supprimer le verrouillage PIN. Veuillez réessayer. + Connectez-vous à Internet pour supprimer le verrouillage PIN. + Ce code PIN ne peut pas encore être vérifié hors ligne sur cet appareil. Connectez-vous une fois et déverrouillez-le en ligne d\'abord. + Impossible de définir le code PIN. Veuillez réessayer. + Connectez-vous à Internet pour définir un code PIN. + Ce profil utilise les extensions principales. + Impossible de charger %1$s + Source + Intégré + Autorisation refusée + Terminez la connexion Trakt dans votre navigateur + Callback Trakt invalide + État du callback Trakt invalide + Réponse de jeton Trakt invalide + Impossible de charger la bibliothèque Trakt + Liste %1$d + Trakt n\'a pas retourné de code d\'autorisation + Identifiants Trakt manquants + Impossible de charger la progression Trakt + Impossible de terminer la connexion Trakt + Utilisateur Trakt + Liste de suivi + Bande-annonce + Inconnu + Extension + Enregistré + Lire %1$s + Reprendre %1$s + Le JSON est vide. + La collection %1$d a un ID vide. + La collection \'%1$s\' a un titre vide. + Le dossier %1$d dans \'%2$s\' a un ID vide. + Le dossier \'%1$s\' dans \'%2$s\' a un titre vide. + La source %1$d dans le dossier \'%2$s\' a des champs vides. + JSON invalide : %1$s + Extension introuvable : %1$s + Janvier + Février + Mars + Avril + Mai + Juin + Juillet + Août + Septembre + Octobre + Novembre + Décembre + Jan + Fév + Mar + Avr + Mai + Jun + Jul + Aoû + Sep + Oct + Nov + Déc + Société de production + Chaîne + Impossible de charger %1$s + Populaire + Récent + %1$s • %2$s + Mieux noté + Classification + Détails du film + Langue originale + Pays d\'origine + Informations de sortie + Durée + Affiches + Texte + Détails de la série + Statut + Vidéos + FICHIER + Aucun lien direct du stream disponible + Le téléchargement précédent a été remplacé + Téléchargement démarré + Format de stream non pris en charge pour les téléchargements + Corps de réponse vide + La requête a échoué avec HTTP %1$d + Le système de téléchargement n\'est pas initialisé + La requête de téléchargement a échoué + %1$s - %2$s + Les titres enregistrés apparaîtront ici après avoir appuyé sur Enregistrer dans un écran de détails. + Votre bibliothèque est vide + Impossible de charger la bibliothèque + Autre + Bibliothèque + Connectez Trakt et enregistrez des titres dans votre liste de suivi ou vos listes personnelles. + Votre bibliothèque Trakt est vide + Impossible de charger la bibliothèque Trakt + Bibliothèque Trakt + Anime + Chaînes + Films + Séries + TV + %1$s est maintenant disponible + %1$s • %2$s est maintenant disponible + Un nouvel épisode est maintenant disponible + %1$s est maintenant disponible + Sorties d\'épisodes + Créateur + Réalisateur + Scénariste + Score du public + Aucun stream de bande-annonce lisible trouvé. + Saison %1$d - %2$s + o + Ko + Mo + Go + diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt index 9aa30c83..a7abf997 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt @@ -2,6 +2,7 @@ package com.nuvio.app.features.settings import nuvio.composeapp.generated.resources.Res import nuvio.composeapp.generated.resources.lang_english +import nuvio.composeapp.generated.resources.lang_french import nuvio.composeapp.generated.resources.lang_spanish import nuvio.composeapp.generated.resources.lang_turkish import nuvio.composeapp.generated.resources.lang_italian @@ -13,6 +14,7 @@ enum class AppLanguage( val labelRes: StringResource, ) { ENGLISH("en", Res.string.lang_english), + FRENCH("fr", Res.string.lang_french), SPANISH("es", Res.string.lang_spanish), TURKISH("tr", Res.string.lang_turkish), ITALIAN("it", Res.string.lang_italian), From 2c81082d170bf10b7e685473d322d88ae290ba48 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Mon, 27 Apr 2026 12:57:28 +0530 Subject: [PATCH 032/143] Refactor: CollectionRepository to push changes only on local changes --- .../app/features/collection/CollectionRepository.kt | 12 ++++++++++-- .../app/features/collection/CollectionSyncService.kt | 6 +----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt index 9d57d011..0e9553ae 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt @@ -4,7 +4,10 @@ import co.touchlab.kermit.Logger import com.nuvio.app.features.addons.AddonRepository import com.nuvio.app.features.addons.ManagedAddon import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.runBlocking import kotlinx.serialization.decodeFromString @@ -33,6 +36,8 @@ object CollectionRepository { private val _collections = MutableStateFlow>(emptyList()) val collections: StateFlow> = _collections.asStateFlow() + private val _localChangeEvents = MutableSharedFlow(extraBufferCapacity = 1) + internal val localChangeEvents: SharedFlow = _localChangeEvents.asSharedFlow() private var rawCollectionsJson: JsonElement = JsonArray(emptyList()) private var hasLoaded = false @@ -244,16 +249,19 @@ object CollectionRepository { internal fun applyFromRemote(collections: List, rawJson: JsonElement) { rawCollectionsJson = rawJson _collections.value = collections - persist() + persist(sync = false) } private fun ensureLoaded() { if (!hasLoaded) initialize() } - private fun persist() { + private fun persist(sync: Boolean = true) { runCatching { CollectionStorage.savePayload(mergedCollectionsJson().toString()) + if (sync) { + _localChangeEvents.tryEmit(Unit) + } }.onFailure { e -> log.e(e) { "Failed to persist collections" } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionSyncService.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionSyncService.kt index 1ec14547..de0931ec 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionSyncService.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionSyncService.kt @@ -15,8 +15,6 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.delay import kotlinx.coroutines.flow.debounce -import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.drop import kotlinx.coroutines.launch import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray @@ -125,9 +123,7 @@ object CollectionSyncService { @OptIn(FlowPreview::class) private fun observeLocalChangesAndPush() { observeJob = scope.launch { - CollectionRepository.collections - .drop(1) - .distinctUntilChanged() + CollectionRepository.localChangeEvents .debounce(PUSH_DEBOUNCE_MS) .collect { if (isSyncingFromRemote) return@collect From 097fabafa9129ce36c7c49b5e62ba7582242064c Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Mon, 27 Apr 2026 13:00:12 +0530 Subject: [PATCH 033/143] fix: douvle tap to seek to not show controls --- .../kotlin/com/nuvio/app/features/player/PlayerScreen.kt | 1 - iosApp/Configuration/Version.xcconfig | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt index e862fc29..c3c5dd75 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt @@ -657,7 +657,6 @@ fun PlayerScreen( } } playerController?.seekTo(targetPositionMs) - controlsVisible = true showSeekFeedback(direction, nextState.amountMs) accumulatedSeekResetJob?.cancel() diff --git a/iosApp/Configuration/Version.xcconfig b/iosApp/Configuration/Version.xcconfig index 9f8d477b..d2dd1f20 100644 --- a/iosApp/Configuration/Version.xcconfig +++ b/iosApp/Configuration/Version.xcconfig @@ -1,3 +1,3 @@ -CURRENT_PROJECT_VERSION=40 -MARKETING_VERSION=0.1.9 +CURRENT_PROJECT_VERSION=42 +MARKETING_VERSION=0.1.10 From 1a13b02b1f8f63cb14cd8c2619a740aafe00b174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Costa?= <79596903+affcosta7@users.noreply.github.com> Date: Mon, 27 Apr 2026 11:03:21 +0100 Subject: [PATCH 034/143] Create strings --- .../composeResources/values-pt-rPT/strings | 1161 +++++++++++++++++ 1 file changed, 1161 insertions(+) create mode 100644 composeApp/src/commonMain/composeResources/values-pt-rPT/strings diff --git a/composeApp/src/commonMain/composeResources/values-pt-rPT/strings b/composeApp/src/commonMain/composeResources/values-pt-rPT/strings new file mode 100644 index 00000000..3f0c4cf0 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/values-pt-rPT/strings @@ -0,0 +1,1161 @@ + + Reconhecimento aberto e créditos do projeto + Retroceder + Cancelar + Fechar + Eliminar + Concluído + Editar + Importar + Seguinte + OK + Reproduzir + Anterior + Remover + Reordenar + Repor + Retomar + Tentar novamente + Guardar + A instalar + Addons + Ativo + %1$d catálogos + Configurável + A atualizar + %1$d recursos + Indisponível + Configurar addon + Eliminar addon + Adiciona um URL de manifesto para começares a carregar catálogos, metadados, transmissões ou legendas no Nuvio. + Ainda não existem addons instalados. + Introduz um URL de addon. + URL do Addon + Instalar Addon + A carregar detalhes do manifesto... + A validar o URL do manifesto e a carregar os detalhes do addon antes da instalação. + A verificar Addon + Falha na Instalação + %1$s foi validado e adicionado com sucesso. + Addon Instalado + Mover addon para baixo + Mover addon para cima + Ativos + Addons + Catálogos + Atualizar addon + Adicionar Addon + Addons Instalados + Visão Geral + %1$d regras de ID + Versão %1$s + Selecionado + Copiar JSON + %1$d coleção(ões), %2$d pasta(s) + Eliminar \"%1$s\"? Esta ação não pode ser desfeita. + Eliminar Coleção + Adicionar Catálogo + Adicionar Pasta + Todos os géneros + Adiciona catálogos dos teus addons instalados para definires o que esta pasta mostra. + Ainda não existem fontes de catálogo + Escolher + Emoji + URL da Imagem + Nenhum + Capa + Criar Coleção + Concluído + Editar Coleção + Editar Pasta + Define a identidade da pasta, a apresentação e as fontes de catálogo com a mesma estrutura do editor de coleções principal. + Adiciona uma para começar. + Ainda não existem pastas + Pastas + Filtro de Género + Mostrar apenas a imagem de capa + Ocultar Título + Nova Pasta + Mostrar esta coleção acima de todos os catálogos normais do ecrã inicial. Múltiplas coleções afixadas seguem a ordem de criação. + Afixar Acima dos Catálogos + URL da imagem de fundo (opcional) + Nome da pasta + URL do GIF animado (reproduz apenas quando focado) + Nome da coleção + Guardar Alterações + Guardar + Aparência + Básico + Fontes de Catálogo + Escolhe os catálogos de addons que esta pasta deve agregar. + Selecionar Catálogos + Selecionar género + %1$d selecionados + %1$d catálogos + %1$d selecionados + Poster + Quadrado + Panorâmico + Combinar todos os catálogos num único separador + Mostrar Separador \"Tudo\" + Reproduzir o GIF configurado em vez da capa estática, quando disponível. + Mostrar GIF quando Configurado + %1$d fonte(s) · %2$s + Forma do Cartão + Linhas + Separadores + Modo de Visualização + Fontes TMDB + Lista Pública + Produção + Rede/Canal + Coleção + Personalizado + Escolhe uma fonte predefinida. Podes editar ou remover após adicionar. + Cola o URL de uma lista pública do TMDB ou apenas o número presente no URL. + Pesquisa pelo nome do estúdio ou cola o ID/URL de uma empresa no TMDB para adicionar diretamente. + Introduz um ID de rede. As redes comuns estão disponíveis nas Predefinições e filtros rápidos. + Pesquisa pelo nome de uma coleção de filmes ou cola o ID da coleção do TMDB. + Cria uma linha TMDB dinâmica usando filtros opcionais. Deixa os campos vazios quando não precisares de um filtro. + Lista pública TMDB + ID da Rede + ID da Coleção + Nome da produtora, ID ou URL + ID ou URL do TMDB + https://www.themoviedb.org/list/8504994 ou 8504994 + 213 para Netflix, 49 para HBO, 2739 para Disney+ + 10 para Coleção Star Wars + Marvel Studios, 420 ou URL da empresa + Exemplos: Marvel Studios, 420 ou https://www.themoviedb.org/company/420. + Exemplo: Coleção Star Wars, Coleção Harry Potter ou um URL de coleção. + Exemplos de IDs: Netflix 213, HBO 49, Disney+ 2739. + Exemplo: https://www.themoviedb.org/list/8504994 ou 8504994. + Título a exibir + Exibido como o nome da linha/separador. Se estiver em branco, o Nuvio cria um a partir da fonte. + Filmes Marvel, Originais Netflix, Pixar + Melhores Filmes de Ação, Dramas Coreanos, Animação 2024 + Resultados da Pesquisa + Coleção TMDB + Empresa TMDB %1$d + Coleção TMDB %1$d + Tipo + Filmes + Séries + Ambos + Ordenar + Filtros + Deixa os campos vazios quando não precisares de um filtro. + Géneros rápidos + Idiomas rápidos + Países rápidos + Palavras-chave rápidas + Estúdios rápidos + Redes rápidas + IDs de Género + Usa números de género TMDB. Separa múltiplos com vírgulas para AND, ou barras verticais para OR. + Data de lançamento desde + Data de lançamento até + Usa AAAA-MM-DD, por exemplo 2024-01-01. + Avaliação mínima + Avaliação máxima + Avaliação TMDB de 0 a 10. Exemplo: 7.0. + Mínimo de votos + Usa isto para evitar títulos obscuros com poucos votos. Exemplo: 100. + Idioma original + Usa códigos de idioma de duas letras, por exemplo en, ko, ja, hi. + País de origem + Usa códigos de país de duas letras, por exemplo US, KR, JP, IN. + IDs de Palavras-chave + Usa números de palavras-chave TMDB. Os botões rápidos preenchem exemplos comuns. + 9715 para super-herói + IDs de Empresas + Usa IDs de estúdio/empresa. Os botões rápidos preenchem exemplos comuns. + 420 para Marvel Studios + IDs de Redes + Apenas para séries. Usa IDs de rede como Netflix 213 ou HBO 49. + 213 para Netflix + Ano + Usa um ano com quatro dígitos, por exemplo 2024. + Predefinições + Pesquisar + Adicionar Fonte + Ação + Aventura + Animação + Comédia + Terror + Ficção Científica + Drama + Crime + Reality TV + Inglês + Coreano + Japonês + Hindi + Espanhol + Estados Unidos + Coreia + Japão + Índia + Reino Unido + Super-herói + Baseado em Romance/Livro + Viagem no Tempo + Espaço + Marvel + Disney + Pixar + Lucasfilm + Warner Bros. + Netflix + HBO + Disney+ + Prime Video + Hulu + Popular + Melhor Classificados + Recentes + Lista TMDB + Coleção de Filmes TMDB + Produção + Rede/Canal + Descobrir TMDB + Cria uma para organizares os teus catálogos. + Ainda não existem coleções + %1$d pasta(s) + Nenhum item encontrado + Pasta não encontrada + Coleções + Importar Coleções + JSON + Cola o JSON das tuas coleções abaixo. + Importar + Nova Coleção + Afixado + Tudo + As Tuas Coleções + Feito com ❤️ pela Tapframe e amigos + Versão %1$s (%2$s) + Desligado + Ligado + Pausa + Recarregar + Já tens uma conta? + Continuar Sem Conta + Criar Conta + Não tens uma conta? + E-mail +   ou  + Palavra-passe + Inicia sessão para acederes à tua biblioteca e progresso + Iniciar Sessão + Regista-te para sincronizares os teus dados entre dispositivos + Registar + Os teus dados serão guardados apenas localmente + Transmite tudo, em qualquer lugar + Bem-vindo de volta + Biblioteca + Biblioteca Trakt + Início + Biblioteca + Perfil + Pesquisa + Faixas de Áudio + Áudio + Integrado + Ajuste Inferior + Fechar reprodutor + Cor + A reproduzir + E%1$d + S%1$dE%2$d + S%1$dE%2$d • %3$s + Episódios + Tamanho da Letra + %1$dsp + Bloquear controlos + Nenhuma faixa de áudio disponível + Nenhum episódio disponível + Nenhuma transmissão encontrada + Nenhum + Contorno + Episódios + Fontes + Transmissões + Erro de reprodução + A reproduzir + Toca para obter legendas + Voltar + Repor Predefinições + Preencher + Ajustar + Zoom + Recuar 10 segundos + -%1$ds + +%1$ds + -%1$ds + +%1$ds + Avançar 10 segundos + Fontes + Estilo + Leg. + Legendas + Brilho %1$s + Volume %1$s + Sem som + Transferido + Emitido em + A anunciar + Toca para desbloquear + Faixa %1$d + Desbloquear controlos + Estás a ver + Adicionar Perfil + Limpar pesquisa + Descobrir + Os addons instalados falharam ao devolver resultados de pesquisa válidos. + Falha na pesquisa + Instala e valida pelo menos um addon antes de pesquisares. + Sem addons ativos + Os catálogos pesquisáveis instalados não encontraram correspondências para esta consulta. + Nenhum resultado encontrado + Os teus addons instalados não disponibilizam pesquisa de catálogo. + Sem catálogos pesquisáveis + Pesquisa filmes, séries... + Pesquisas Recentes + Remover pesquisa recente + Sobre + Geral + Conta + Addons + Aparência + Conteúdo e Descoberta + Continuar a Ver + Ecrã Inicial + Integrações + Classificações MDBList + Ecrã de Metadados + Notificações + Reprodução + Plugins + Personalização de Posters + Definições + Apoiantes e Colaboradores + Enriquecimento TMDB + Trakt + SOBRE + Gere a tua conta, termina sessão ou elimina-a. + CONTA + Ajusta a apresentação inicial e preferências visuais. + Verifica se existem novas versões da aplicação. + Procurar atualizações + Gere addons e fontes de descoberta. + Gere os teus filmes e episódios transferidos. + Transferências + GERAL + Liga os serviços TMDB e MDBList. + Gere alertas de lançamento de episódios e envia uma notificação de teste. + Mudar para um perfil diferente. + Mudar de Perfil + Liga o Trakt, sincroniza listas e guarda títulos diretamente no Trakt. + A carregar as tuas listas do Trakt… + Escolhe onde guardar este título no Trakt + Doar + Ver detalhes + Remover + Começar do início + Reproduzir + %1$d/10 + Crítica + Spoiler + Ainda não existem críticas do Trakt disponíveis. + %1$d gostos + Este comentário contém spoilers. + Este comentário contém spoilers e foi ocultado. + Comentários + Trailer + %1$s (%2$d) + Trailers + Sem episódios concluídos + Ainda não existem transferências + %1$d episódio(s) transferido(s) + Ativas + Filmes + Séries + Ver Transferências + Concluída • %1$s + A transferir • %1$s + Falhou + Pausada • %1$s + Visto + Temporada %1$d + Especiais + Continua de onde ficaste + Adicionar à biblioteca + Marcar como não visto + Marcar como visto + Remover da biblioteca + Ver Tudo + Reproduzir manualmente + Logótipo %1$s + Conta + Eliminar Conta + Isto eliminará permanentemente a tua conta e todos os dados associados. + Esta ação não pode ser desfeita. Todos os teus dados, perfis e histórico de sincronização serão removidos permanentemente. + Eliminar Conta? + E-mail + Sessão não iniciada + Terminar Sessão + Serás redirecionado para o ecrã de início de sessão. + Terminar Sessão? + Estado + Anónimo + Sessão Iniciada + Preto AMOLED + Utiliza fundos pretos puros para ecrãs OLED. + Idioma da Aplicação + Escolher Idioma + Mostra, oculta e personaliza o aspeto da secção \"Continuar a Ver\". + Ajusta a largura e o arredondamento dos cantos dos posters. + ECRÃ + INÍCIO + TEMA + Coleção • %1$s + Nome de Exibição + Instala um addon com catálogos compatíveis para configurares as linhas do Ecrã Inicial. + Sem catálogos iniciais + Fonte do destaque (Hero) + Oculto + Manter Início focado + %1$s • Limite atingido (máx. %2$d) + Nenhuma fonte de destaque selecionada + Fora do destaque + Remove a afixação no topo da coleção para a moveres + Afixado + Afixado no topo + Reordenar + CATÁLOGOS + CATÁLOGOS E COLEÇÕES + COLEÇÕES + DESTAQUE (HERO) + FONTES DE DESTAQUE + %1$d de %2$d selecionados + Mostrar Destaque + Exibe um carrossel de destaque no topo do Início. Escolhe até 2 catálogos fonte abaixo. + %1$d de %2$d catálogos visíveis • %3$d fontes de destaque selecionadas + Abre um catálogo apenas quando precisares de o renomear ou reordenar. + Visível + Reprodutor, legendas e reprodução automática + Arredondamento do Cartão + ESTILO DO CARTÃO DO POSTER + Largura do Cartão + Personalizado + Personaliza a largura e o arredondamento dos cantos para os cartões de poster em toda a aplicação. + Ocultar etiquetas + Modo panorâmico para posters em prateleira + Pré-visualização em Tempo Real + %1$s (%2$s) + Raio dos cantos: %1$ddp + Altura: %1$ddp + Largura: %1$ddp + Clássico + Pílula + Arredondado + Afiado + Subtil + Equilibrado + Conforto + Compacto + Denso + Grande + Padrão + Mostra um aviso para continuares de onde ficaste ao abrir a aplicação após saíres do reprodutor. + Aviso de retoma ao iniciar + ESTILO DO CARTÃO + AO INICIAR + COMPORTAMENTO DO SEGUINTE + VISIBILIDADE + Exibe a secção \"Continuar a Ver\" no ecrã Inicial. + Mostrar Continuar a Ver + Poster + Cartão focado na imagem + Panorâmico + Cartão horizontal denso em informação + Quando ativado, o \"Seguinte\" continua sempre a partir do último episódio visto. Quando desativado, segue a partir do episódio visto mais recentemente. Útil se costumas rever episódios anteriores. + Seguinte a partir do último episódio + INÍCIO + FONTES + Instala, remove, atualiza e ordena as tuas fontes de conteúdo. + Instala repositórios de scrapers JavaScript e testa fornecedores internamente. + Controla quais os catálogos que aparecem no Início e por que ordem. + Desativa secções de detalhes e reordena tudo abaixo do Destaque. + Cria agrupamentos de catálogos personalizados com pastas exibidas no Início. + INTEGRAÇÕES + Melhora as páginas de detalhes com imagens TMDB, créditos, metadados de episódios e mais. + Adiciona classificações externas do IMDb, Rotten Tomatoes, Metacritic e outros. + Adiciona a tua chave API do MDBList abaixo antes de ativares as classificações. + Obtém uma chave em https://mdblist.com/preferences e cola-a aqui. + Chave API + Chave API MDBList + Ativar classificações MDBList + Mostra classificações externas do MDBList nas páginas de metadados quando o ID do IMDb estiver disponível. + CHAVE API + FORNECEDORES DE CLASSIFICAÇÃO + MDBLIST + Ações + Controlos de reprodução e gravação. + Elenco + Lista do elenco principal. + Fundo Cinemático + Fundo desfocado atrás do conteúdo, semelhante ao ecrã de transmissão. + Coleção + Linha de coleções ou franchises relacionados. + Comentários + Secção de comentários do Trakt. + Detalhes + Duração, estado, lançamento, idioma e informações relacionadas. + Cartões de Episódio + Escolhe como os episódios são apresentados no ecrã de metadados. + Horizontal + Cartões em linha tipo imagem de fundo + Lista + Cartões empilhados focados nos detalhes + Episódios + Lista de temporadas e episódios para séries. + Grupo %1$d + Mais como este + Linha de recomendações. + Nenhum + Resumo + Sinopse, classificações, géneros e créditos principais. + Produção + Estúdios e redes/canais. + APARÊNCIA + SECÇÕES + Grupo de Separadores %1$d + Esquema em Separadores + Agrupa secções em separadores. Atribui até 3 secções por grupo de separadores. + Trailers + Linha de trailers e atalhos de reprodução. + As notificações estão atualmente desativadas no Nuvio. + Alertas de lançamento de episódios + Agenda notificações locais quando um novo episódio de uma série guardada ficar disponível. + As notificações do sistema estão desativadas para o Nuvio. Ativa-as para receberes alertas. + %1$d alertas de lançamento estão agendados neste dispositivo. + ALERTAS + TESTE + Enviar Notificação de Teste + A enviar notificação de teste... + Enviar uma notificação de teste local para %1$s. + Guarda primeiro uma série na tua biblioteca para testares as notificações. + Notificação de teste + Comunidade + Conhece as pessoas que constroem e apoiam o Nuvio em Mobile, TV e Web. + API de Apoiantes não configurada. + Colaboradores + Apoiantes + Abrir GitHub + Perfil de GitHub indisponível + Sem mensagem anexada. + A carregar colaboradores... + A carregar apoiantes... + Não foi possível carregar os colaboradores + Não foi possível carregar os apoiantes + Nenhum colaborador encontrado. + Nenhum apoiante encontrado. + Incapaz de carregar colaboradores. + Incapaz de carregar apoiantes. + Não foi possível carregar os colaboradores agora. + Não foi possível carregar os apoiantes agora. + %1$d commits no total + Jan + Fev + Mar + Abr + Mai + Jun + Jul + Ago + Set + Out + Nov + Dez + %1$s %2$s, %3$s + Todos os Addons + Todos os Plugins + Addons Permitidos + Plugins Permitidos + Anime Skip + ID de Cliente AnimeSkip + Introduz o teu ID de cliente API do AnimeSkip. + Pesquisar também no AnimeSkip por marcas de tempo para saltar (requer ID de cliente). + Reproduzir Episódio Seguinte Automaticamente + Encontra e reproduz automaticamente o episódio seguinte quando o limite é atingido. + Apenas Dispositivo + Preferir Aplicação (FFmpeg) + Preferir Dispositivo + Prioridade do Descodificador + Toca fora para fechar + Toca fora para guardar e fechar + %1$d dia + %1$d dias + %1$d hora + %1$d horas + Ativar libass + Usa o libass para renderização de legendas ASS/SSA em vez do renderizador padrão. + Velocidade ao Premir + Premir para Acelerar + Prime longamente em qualquer parte do reprodutor para aumentar temporariamente a velocidade. + Padrão regex inválido + Duração do Cache do Último Link + Mapear DV7 para HEVC + Alternativa de Dolby Vision Profile 7 para HEVC em dispositivos não suportados. + Minutos Antes do Fim + Mostra o cartão do próximo episódio estes minutos antes do fim. + %1$d min + Nenhum item disponível + Não definido + Predefinição + Idioma do Dispositivo + Forçadas + Nenhum + Preferir Grupo de Maratona + Ao reproduzir automaticamente, prefere uma transmissão do mesmo grupo que a atual. + Idioma de Áudio Preferido + Idioma de Legendas Preferido + Predefinições + Compara com nome da stream, etiqueta, descrição, addon e URL. + Padrão Regex + 4K|2160p|Remux + Qualquer 1080p+ + AVC / x264 + Qualidade BluRay + Dolby Atmos / DTS + Inglês + HDR / Dolby Vision + HEVC / x265 + Sem CAM/TS + Sem REMUX/HDR + 1080p Padrão + 4K / Remux + 720p / Menor + Fontes WEB + Tipo de Renderização + Padrão (Cues) + Canvas de Efeitos + OpenGL de Efeitos + Canvas de Sobreposição + OpenGL de Sobreposição + Reutilizar Último Link + Reproduz automaticamente a última transmissão funcional para este filme/episódio enquanto o cache for válido. + Idioma de Áudio Secundário + Idioma de Legendas Secundário + DESCODIFICADOR + EPISÓDIO SEGUINTE + REPRODUTOR + SALTAR SEGMENTOS + REPRODUÇÃO AUTOMÁTICA + SELEÇÃO DE TRANSMISSÃO + LEGENDAS E ÁUDIO + RENDERIZAÇÃO DE LEGENDAS + %1$d selecionados + Mostrar Sobreposição de Carga + Mostra a animação de carregamento inicial enquanto uma transmissão começa. + Saltar Intro/Outro/Resumo + Mostra o botão de saltar durante segmentos detetados de intro, final e resumo. + Âmbito da Fonte + Todos os Addons + Considerar transmissões de todos os addons instalados. + Todas as Fontes + Considerar transmissões tanto de addons como de plugins. + Apenas Plugins Ativados + Considerar apenas transmissões de plugins ativados. + Apenas Addons Instalados + Considerar apenas transmissões de addons instalados. + Modo de Seleção de Transmissão + Primeira Disponível + Reproduz automaticamente a primeira transmissão encontrada. + Manual + Selecionar transmissões manualmente de cada vez. + Correspondência Regex + Auto-seleciona uma stream que corresponda a um padrão regex. + Tempo Limite da Transmissão + Quanto tempo esperar por transmissões antes da auto-seleção. + Minutos Antes do Fim + Modo de Limite + Minutos Antes do Fim + Percentagem + Percentagem de Limite + Mostra o cartão do próximo episódio quando a reprodução atinge esta percentagem. + %1$d%% + Instantâneo + %1$ds + Ilimitado + Reprodução Tunelada + Ativa a reprodução tunelada para menor latência na sincronização áudio/vídeo. + Adiciona a tua própria chave API do TMDB abaixo antes de ativares o enriquecimento. + Chave API TMDB + Ativar enriquecimento TMDB + Usa a tua chave API do TMDB para enriquecer metadados no ecrã de detalhes quando um ID TMDB ou IMDb está disponível. + Introduz a tua chave API v3 do TMDB. + Código de idioma + Arte Visual + Substitui fundo, poster e logótipo por arte do TMDB. + Informação básica + Usa título, sinopse, géneros e classificação do TMDB. + Coleções + Mostra linhas de franchises e coleções para filmes quando disponíveis. + Créditos + Usa criadores, realizadores, argumentistas e fotos do elenco do TMDB. + Detalhes + Usa info de lançamento, duração, classificação etária, estado, país e idioma do TMDB. + Episódios + Usa títulos, miniaturas, descrições e durações de episódios do TMDB para séries. + Mais como este + Mostra recomendações do TMDB no fundo das páginas de detalhes. + Redes/Canais + Usa metadados de redes do TMDB para títulos de TV. + Produtoras + Usa metadados de produtoras do TMDB no ecrã de detalhes. + Posters de temporadas + Usa posters de temporadas do TMDB no seletor de temporadas para séries. + Trailers + Procura e exibe a secção de trailers do TMDB nas páginas de detalhes. + Chave API pessoal + Idioma preferido + Define o código de idioma TMDB para metadados localizados (ex: `pt-PT`, `en-US`). + CREDENCIAIS + LOCALIZAÇÃO + MÓDULOS + TMDB + Após aprovação, serás redirecionado de volta automaticamente. + AUTENTICAÇÃO + Comentários + Mostrar comentários do Trakt nos detalhes de filmes e séries + Ligar ao Trakt + Ligado como %1$s + Utilizador Trakt + Desligar + Falha ao abrir o navegador + FUNCIONALIDADES + Conclui o início de sessão do Trakt no teu navegador + Monitoriza o que vês, guarda na lista de interesse ou listas personalizadas e mantém a biblioteca sincronizada. + Faltam credenciais do Trakt em local.properties. + Abrir Login do Trakt + As tuas ações de \"Guardar\" podem agora visar a lista de interesse e listas pessoais do Trakt. + Inicia sessão com o Trakt para ativar gravação baseada em listas e modo de biblioteca Trakt. + Pontuação do Público + IMDb + Letterboxd + Metacritic + Rotten Tomatoes + TMDB + Trakt + Desconhecido + Âmbar + Carmesim + Esmeralda + Oceano + Rosa + Violeta + Branco + Próximo Episódio + A procurar fonte… + A reproduzir via %1$s em %2$d… + Miniatura do próximo episódio + Não emitido + Saltar + Saltar Intro + Saltar Final + Saltar Resumo + Nenhuma legenda encontrada + Africâner + Albanês + Amárico + Árabe + Arménio + Azerbaijano + Basco + Bielorrusso + Bengali + Bósnio + Búlgaro + Birmanês + Catalão + Chinês + Chinês (Simplificado) + Chinês (Tradicional) + Croata + Checo + Dinamarquês + Holandês + Inglês + Estónio + Filipino + Finlandês + Francês + Galego + Georgiano + Alemão + Grego + Gujarati + Hebraico + Hindi + Húngaro + Islandês + Indonésio + Irlandês + Italiano + Japonês + Canarim + Cazaque + Khmer + Coreano + Lao + Letão + Lituano + Macedónio + Malaio + Malaiala + Maltês + Marata + Mongol + Nepalês + Norueguês + Persa + Polaco + Português (Portugal) + Português (Brasil) + Panjabi + Romeno + Russo + Sérvio + Cingalês + Eslovaco + Esloveno + Espanhol + Espanhol (América Latina) + Suaíli + Sueco + Tâmil + Telugo + Tailandês + Turco + Ucraniano + Urdu + Usbeque + Vietnamita + Galês + Zulu + Limpar + Continuar + Ignorar + Instalar + Mais tarde + Não + Atualizar + Sim + Queres sair da aplicação? + Sair da aplicação + Este catálogo não devolveu nenhum item. + Nenhum título encontrado + Verifica a tua ligação Wi-Fi ou dados móveis e tenta novamente. + Realizador + Falha ao carregar + Mais Como Este + Temporadas + Este addon devolveu vídeos, mas nenhum inclui números de temporada ou episódio. + Este addon não forneceu metadados de episódios para esta série. + Os episódios ainda não foram publicados por este addon. + O teu dispositivo está online, mas o Nuvio não conseguiu contactar os servidores necessários. + Mostrar Menos + Mostrar Mais ▾ + Argumentista + Todos os Géneros + Catálogo + %1$s • %2$s + O catálogo selecionado falhou ao devolver itens de descoberta. + Não foi possível carregar descoberta + Os addons instalados não expõem catálogos compatíveis para descoberta. + Sem catálogos de descoberta + O catálogo e filtros selecionados não devolveram nenhuns itens. + Nenhum título encontrado + Instala e valida pelo menos um addon antes de navegar nos catálogos. + Selecionar Catálogo + Selecionar Género + Selecionar Tipo + Tipo + Marcar anteriores como não vistos + Marcar anteriores como vistos + Marcar %1$s como não vista + Marcar %1$s como vista + Marcar como não visto + Marcar como visto + Próximo + %1$d%% visto + Instala e valida pelo menos um addon antes de carregar o Início. + Os addons instalados não expõem catálogos compatíveis de momento. + Nenhuma linha disponível no Início + Ver Detalhes + Controlos de reprodução e gravação. + Ações + Lista do elenco principal. + Linha de coleção ou franchise relacionada. + Coleção + Secção de comentários do Trakt. + Duração, estado, lançamento, idioma e informações relacionadas. + Detalhes + Lista de temporadas e episódios para séries. + Linha de recomendações. + Mais Como Este + Sinopse, classificações, géneros e créditos principais. + Visão Geral + Estúdios e redes/canais. + Produção + Linha de trailers e atalhos de reprodução. + Novamente online + Não é possível contactar os servidores + Sem ligação à internet + (%1$d anos) + Nascimento: %1$s%2$s + Falecimento: %1$s + Conhecido por: %1$s + Mais recente + Não foi possível carregar os detalhes de %1$s + Popular + Algo correu mal + Próximos lançamentos + Apagar + Cancelar + Introduzir PIN + Introduz o PIN para %1$s + Esqueceste-te do PIN? + PIN incorreto + Bloqueado. Tenta novamente em %1$ds + As opções de avatar aparecerão aqui quando o catálogo carregar. + Avatar: %1$s + Escolhe um avatar + Escolhe um avatar abaixo. + Criar Perfil + Todos os dados de \"%1$s\" serão eliminados permanentemente. + Eliminar Perfil + Adicionar Perfil + Editar Perfil + Introduz o PIN atual + Introduz o novo PIN + Perfil %1$d + A carregar avatares... + Gerir Perfis + Nome do perfil + Novo perfil + Addons primários desativados + Addons primários ativados + Remover PIN de %1$s + Remover Bloqueio por PIN + A guardar... + Segurança + Adiciona um PIN se quiseres bloquear este perfil antes de alternares para ele. + Este perfil está protegido com um PIN. + Seleciona um avatar para este perfil. + Definir Bloqueio por PIN + Perfil sem nome + Usar Addons Primários + Partilha a configuração de addons do perfil principal em vez de gerir uma lista separada. + Quem está a ver? + Descarregado + Retomar + Scrapers ativos + A verificar mais addons… + Copiar link da stream + Descarregar ficheiro + Os addons de transmissão instalados falharam ao devolver uma resposta válida. + Não foi possível carregar as transmissões + Instala um addon primeiro para carregar transmissões para este título. + Os teus addons instalados não fornecem transmissões para este tipo de título. + Nenhum addon de transmissão disponível + Nenhum dos teus addons instalados devolveu transmissões para este título. + T%1$d E%2$d + Episódio + T%1$dE%2$d - %3$s + A obter… + A procurar fonte… + A procurar transmissões… + Link da stream copiado + Nenhum link direto disponível + Nenhuns metadados disponíveis + Atualizar transmissões + Retomar de %1$d%% + Retomar de %1$s + TAMANHO %1$s + Fechar trailer + Não é possível reproduzir o trailer + Falha ao carregar listas do Trakt + Falha ao atualizar listas do Trakt + %1$s • %2$s + Falha ao verificar atualizações + Falha no download + A descarregar %1$d%% + Não foi possível iniciar a instalação + Estás a usar a versão mais recente. + Ativa a instalação de aplicações para o Nuvio, depois volta e continua. + A descarregar atualização... + Nenhuma atualização encontrada. + Uma nova versão está pronta para instalar. + As atualizações na aplicação não estão disponíveis nesta versão. + A preparar download + Notas de lançamento + Permitir que a instalação continue + Atualização disponível + Estado da atualização + Esse addon já está instalado. + Introduz um URL de addon válido + Não foi possível carregar o manifesto + Nuvio + Falha ao eliminar conta + Falha ao iniciar sessão + Falha ao terminar sessão + Falha ao criar conta + Não foi possível carregar os itens do catálogo. + A Seguir + A Seguir • T%1$dE%2$d + Logótipo de %1$s + Falha ao carregar comentários + Não foi possível carregar detalhes de nenhum addon. + Redes/Canais + Nenhum addon fornece metadados para este conteúdo. + Falha no download + Mostra o progresso e controlos de downloads em direto. + Downloads + Download concluído + A descarregar %1$s • %2$s + A descarregar %1$s • %2$s / %3$s + Falha no download + Em pausa %1$s + Remover + Remover %1$s da tua biblioteca? + Remover da Biblioteca? + Filme + Alertas para quando um novo episódio de uma série guardada é lançado. + Pré-visualização do alerta de lançamento de episódio. + Falha ao enviar uma notificação de teste. + Notificação de teste enviada para %1$s. + Não é possível reproduzir esta transmissão. + O PIN deste perfil mudou. Liga-te uma vez para atualizar o bloqueio neste dispositivo. + Não foi possível remover o bloqueio por PIN. Tenta novamente. + Liga-te à internet para remover o bloqueio por PIN. + Este PIN ainda não pode ser verificado offline neste dispositivo. Liga-te e desbloqueia-o online primeiro. + Não foi possível definir o PIN. Tenta novamente. + Liga-te à internet para definir um PIN. + Este perfil utiliza addons primários. + Falha ao carregar %1$s + Transmissão + Incorporado + Autorização negada + Conclui o início de sessão do Trakt no teu navegador + Callback do Trakt inválido + Estado de callback do Trakt inválido + Resposta de token do Trakt inválida + Falha ao carregar biblioteca do Trakt + Lista %1$d + O Trakt não devolveu um código de autorização + Faltam credenciais do Trakt + Falha ao carregar progresso do Trakt + Falha ao concluir o início de sessão no Trakt + Utilizador Trakt + Lista de interesse + Trailer + Desconhecido + Addon + Guardado + Reproduzir %1$s + Retomar %1$s + O JSON está vazio. + A coleção %1$d tem um ID em branco. + A coleção \'%1$s\' tem um título em branco. + A pasta %1$d em \'%2$s\' tem um ID em branco. + A pasta \'%1$s\' em \'%2$s\' tem um título em branco. + A fonte %1$d na pasta \'%2$s\' tem campos em branco. + JSON inválido: %1$s + Addon não encontrado: %1$s + Janeiro + Fevereiro + Março + Abril + Maio + Junho + Julho + Agosto + Setembro + Outubro + Novembro + Dezembro + Jan + Fev + Mar + Abr + Mai + Jun + Jul + Ago + Set + Out + Nov + Dez + Produtora + Rede/Canal + Não foi possível carregar %1$s + Popular + Recente + %1$s • %2$s + Melhor Classificados + Certificação + Detalhes do Filme + Idioma Original + País de Origem + Info de Lançamento + Duração + Posters + Texto + Detalhes da Série + Estado + Vídeos + Ficheiro + Nenhum link direto disponível + Download anterior substituído + Download iniciado + Formato de transmissão não suportado para downloads + Corpo da resposta vazio + O pedido falhou com HTTP %1$d + O sistema de downloads não foi inicializado + Pedido de download falhou + %1$s - %2$s + Os títulos guardados aparecerão aqui após tocares em \"Guardar\" no ecrã de detalhes. + A tua biblioteca está vazia + Não foi possível carregar a biblioteca + Outro + Biblioteca + Liga o Trakt e guarda títulos na tua lista de interesse ou listas pessoais. + A tua biblioteca Trakt está vazia + Não foi possível carregar a biblioteca Trakt + Biblioteca Trakt + Anime + Canais + Filmes + Séries + TV + %1$s já está disponível + %1$s • %2$s já está disponível + Um novo episódio já está disponível + %1$s já está disponível + Lançamentos de Episódios + Criador + Realizador + Argumentista + Pontuação do Público + Nenhuma transmissão de trailer reproduzível encontrada. + Temporada %1$d - %2$s + B + KB + MB + GB + From dc2e9177ec91ad2e1c925631ade5d15bfd873381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Costa?= <79596903+affcosta7@users.noreply.github.com> Date: Mon, 27 Apr 2026 11:13:59 +0100 Subject: [PATCH 035/143] Update locale_config.xml --- composeApp/src/androidMain/res/xml/locale_config.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/composeApp/src/androidMain/res/xml/locale_config.xml b/composeApp/src/androidMain/res/xml/locale_config.xml index 6e8aae61..383a5f5d 100644 --- a/composeApp/src/androidMain/res/xml/locale_config.xml +++ b/composeApp/src/androidMain/res/xml/locale_config.xml @@ -2,6 +2,7 @@ + From da525f72ae67c8896f598ef403a93847db1b7eb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Costa?= <79596903+affcosta7@users.noreply.github.com> Date: Mon, 27 Apr 2026 11:15:19 +0100 Subject: [PATCH 036/143] Update AppLanguage.kt --- .../kotlin/com/nuvio/app/features/settings/AppLanguage.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt index 9aa30c83..5af4ce4d 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt @@ -3,6 +3,7 @@ package com.nuvio.app.features.settings import nuvio.composeapp.generated.resources.Res import nuvio.composeapp.generated.resources.lang_english import nuvio.composeapp.generated.resources.lang_spanish +import nuvio.composeapp.generated.resources.lang_portuguese_portugal import nuvio.composeapp.generated.resources.lang_turkish import nuvio.composeapp.generated.resources.lang_italian import nuvio.composeapp.generated.resources.lang_greek From 80d9aaae23a791bdc47935a6c85a71a0c244d04e Mon Sep 17 00:00:00 2001 From: IberianSoldierPC <56433990+IberianSoldierPC@users.noreply.github.com> Date: Mon, 27 Apr 2026 12:36:22 +0200 Subject: [PATCH 037/143] Spanish updated --- .../composeResources/values-es/strings.xml | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/composeApp/src/commonMain/composeResources/values-es/strings.xml b/composeApp/src/commonMain/composeResources/values-es/strings.xml index 514e6e3a..d0706078 100644 --- a/composeApp/src/commonMain/composeResources/values-es/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-es/strings.xml @@ -219,7 +219,7 @@ Colección de películas de TMDB Producción Cadena - Discover de TMDB + Descubrir de TMDB Crea una para organizar tus catálogos. Aún no hay colecciones %1$d carpeta(s) @@ -298,7 +298,7 @@ Avanzar 10 segundos Fuentes Estilo - Subs + Subtítulos Subtítulos Brillo %1$s Volumen %1$s @@ -424,12 +424,12 @@ Nombre visible Instala un complemento con catálogos compatibles con tableros para configurar las filas de la pantalla de inicio. No hay catálogos de inicio - Fuente del Hero + Fuente de Destacado Oculto Mantener Inicio enfocado %1$s • Límite alcanzado (máx. %2$d) - No hay fuentes Hero seleccionadas - No está en Hero + No hay fuentes de Destacado seleccionadas + No está en Destacado Quita fijar arriba de la colección para moverla Fijado Fijado arriba @@ -437,12 +437,12 @@ CATÁLOGOS CATÁLOGOS Y COLECCIONES COLECCIONES - HERO - FUENTES DEL HERO + DESTACADO + FUENTES DE DESTACADO %1$d de %2$d seleccionados - Mostrar Hero - Mostrar un carrusel Hero destacado en la parte superior del inicio. Elige hasta 2 catálogos fuente abajo. - %1$d de %2$d catálogos visibles • %3$d fuentes Hero seleccionadas + Mostrar Destacado + Mostrar un carrusel destacado en la parte superior del inicio. Elige hasta 2 catálogos de origen abajo. + %1$d de %2$d catálogos visibles • %3$d fuentes de Destacado seleccionadas Abre un catálogo solo cuando necesites cambiarle el nombre o reordenarlo. Visible Reproductor, subtítulos y reproducción automática @@ -488,7 +488,7 @@ Instala, elimina, actualiza y ordena tus fuentes de contenido. Instala repositorios de scrapers en JavaScript y prueba proveedores internamente. Controla qué catálogos aparecen en Inicio y en qué orden. - Desactiva secciones de detalles y reordena todo debajo del Hero. + Desactiva secciones de detalles y reordena todo debajo del Destacado. Crea agrupaciones de catálogos personalizadas con carpetas mostradas en Inicio. INTEGRACIONES Mejora las páginas de detalles con arte, créditos, metadatos de episodios y más desde TMDB. @@ -641,7 +641,7 @@ 720p / más pequeño Fuentes WEB Tipo de renderizado - Estándar (Cues) + Estándar (marcas) Canvas con efectos OpenGL con efectos Canvas superpuesto @@ -877,7 +877,7 @@ El catálogo seleccionado no devolvió elementos de descubrimiento. No se pudo cargar Descubrir Los addons instalados no exponen catálogos compatibles con el tablero para Descubrir. - No hay catálogos de descubrir + No hay catálogos de Descubrir El catálogo y los filtros seleccionados no devolvieron ningún elemento. No se encontraron títulos Instala y valida al menos un addon antes de explorar catálogos en Descubrir. @@ -948,8 +948,8 @@ Gestionar perfiles Nombre del perfil Perfil nuevo - Addons principales desactivados - Addons principales activados + Complementos principales desactivados + Complementos principales activados Quitar PIN para %1$s Quitar bloqueo PIN Guardando... @@ -1021,7 +1021,7 @@ logotipo de %1$s No se pudieron cargar los comentarios No se pudieron cargar los detalles desde ningún complemento. - Redes + Cadenas Ningún complemento proporciona metadatos para este contenido. Descarga fallida Muestra el progreso en vivo y los controles de descarga. @@ -1039,7 +1039,7 @@ Vista previa de la alerta de estreno de episodio. No se pudo enviar una notificación de prueba. Notificación de prueba enviada para %1$s. - No se puede reproducir esta transmisión. + No se puede reproducir este stream. El PIN de este perfil cambió. Conéctate una vez para actualizar el bloqueo en este dispositivo. No se pudo quitar el bloqueo por PIN. Inténtalo de nuevo. Conéctate a internet para quitar el bloqueo por PIN. @@ -1107,7 +1107,7 @@ Popular Reciente %1$s • %2$s - Mejor valorado + Mejor valorados Clasificación Detalles de la película Idioma original From 6842cc842c243acd946d64d83dd045dcb5bfd22a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Costa?= <79596903+affcosta7@users.noreply.github.com> Date: Mon, 27 Apr 2026 11:59:27 +0100 Subject: [PATCH 038/143] Update strings --- .../src/commonMain/composeResources/values-pt-rPT/strings | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composeApp/src/commonMain/composeResources/values-pt-rPT/strings b/composeApp/src/commonMain/composeResources/values-pt-rPT/strings index 3f0c4cf0..8c8507e0 100644 --- a/composeApp/src/commonMain/composeResources/values-pt-rPT/strings +++ b/composeApp/src/commonMain/composeResources/values-pt-rPT/strings @@ -661,8 +661,8 @@ %1$d selecionados Mostrar Sobreposição de Carga Mostra a animação de carregamento inicial enquanto uma transmissão começa. - Saltar Intro/Outro/Resumo - Mostra o botão de saltar durante segmentos detetados de intro, final e resumo. + Saltar Introdução/Créditos/Resumo + Mostra o botão de saltar durante segmentos detetados de introdução, créditos e resumo. Âmbito da Fonte Todos os Addons Considerar transmissões de todos os addons instalados. @@ -765,8 +765,8 @@ Miniatura do próximo episódio Não emitido Saltar - Saltar Intro - Saltar Final + Saltar Introdução + Saltar Créditos Saltar Resumo Nenhuma legenda encontrada Africâner From e15a398f3ec577e28c4241490f7f6c9918b9aef7 Mon Sep 17 00:00:00 2001 From: Leonardo Montemurro <221404985+MontesanoDev@users.noreply.github.com> Date: Mon, 27 Apr 2026 15:01:08 +0200 Subject: [PATCH 039/143] fix: make app language key global, not profile-scoped The language preference was stored with a profile-scoped key (selected_app_language_{profileId}), causing it to reset to English on app restart when the active profile was not profile 1. During startup, initialize() reads the key with default activeProfileId=1 before the correct profile is loaded, resulting in a cache miss and fallback to English. App language is a device-level preference, not per-profile, so the key should not be scoped. This also fixes replaceFromSyncPayload to correctly clear both profile-scoped and global keys. --- .../settings/ThemeSettingsStorage.android.kt | 10 ++++++---- .../features/settings/ThemeSettingsStorage.ios.kt | 12 ++++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.android.kt b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.android.kt index 32e659c1..48c3f1a7 100644 --- a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.android.kt +++ b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.android.kt @@ -18,7 +18,8 @@ actual object ThemeSettingsStorage { private const val selectedThemeKey = "selected_theme" private const val amoledEnabledKey = "amoled_enabled" private const val selectedAppLanguageKey = "selected_app_language" - private val syncKeys = listOf(selectedThemeKey, amoledEnabledKey, selectedAppLanguageKey) + private val profileScopedSyncKeys = listOf(selectedThemeKey, amoledEnabledKey) + private val globalSyncKeys = listOf(selectedAppLanguageKey) private var preferences: SharedPreferences? = null @@ -51,12 +52,12 @@ actual object ThemeSettingsStorage { } actual fun loadSelectedAppLanguage(): String? = - preferences?.getString(ProfileScopedKey.of(selectedAppLanguageKey), null) + preferences?.getString(selectedAppLanguageKey, null) actual fun saveSelectedAppLanguage(languageCode: String) { preferences ?.edit() - ?.putString(ProfileScopedKey.of(selectedAppLanguageKey), languageCode) + ?.putString(selectedAppLanguageKey, languageCode) ?.apply() } @@ -74,7 +75,8 @@ actual object ThemeSettingsStorage { actual fun replaceFromSyncPayload(payload: JsonObject) { preferences?.edit()?.apply { - syncKeys.forEach { remove(ProfileScopedKey.of(it)) } + profileScopedSyncKeys.forEach { remove(ProfileScopedKey.of(it)) } + globalSyncKeys.forEach { remove(it) } }?.apply() payload.decodeSyncString(selectedThemeKey)?.let(::saveSelectedTheme) diff --git a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt index cf91655b..7f28fa7b 100644 --- a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt +++ b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt @@ -14,7 +14,8 @@ actual object ThemeSettingsStorage { private const val selectedThemeKey = "selected_theme" private const val amoledEnabledKey = "amoled_enabled" private const val selectedAppLanguageKey = "selected_app_language" - private val syncKeys = listOf(selectedThemeKey, amoledEnabledKey, selectedAppLanguageKey) + private val profileScopedSyncKeys = listOf(selectedThemeKey, amoledEnabledKey) + private val globalSyncKeys = listOf(selectedAppLanguageKey) actual fun loadSelectedTheme(): String? = NSUserDefaults.standardUserDefaults.stringForKey(ProfileScopedKey.of(selectedThemeKey)) @@ -38,10 +39,10 @@ actual object ThemeSettingsStorage { } actual fun loadSelectedAppLanguage(): String? = - NSUserDefaults.standardUserDefaults.stringForKey(ProfileScopedKey.of(selectedAppLanguageKey)) + NSUserDefaults.standardUserDefaults.stringForKey(selectedAppLanguageKey) actual fun saveSelectedAppLanguage(languageCode: String) { - NSUserDefaults.standardUserDefaults.setObject(languageCode, forKey = ProfileScopedKey.of(selectedAppLanguageKey)) + NSUserDefaults.standardUserDefaults.setObject(languageCode, forKey = selectedAppLanguageKey) } actual fun applySelectedAppLanguage(languageCode: String) = Unit @@ -53,9 +54,12 @@ actual object ThemeSettingsStorage { } actual fun replaceFromSyncPayload(payload: JsonObject) { - syncKeys.forEach { key -> + profileScopedSyncKeys.forEach { key -> NSUserDefaults.standardUserDefaults.removeObjectForKey(ProfileScopedKey.of(key)) } + globalSyncKeys.forEach { key -> + NSUserDefaults.standardUserDefaults.removeObjectForKey(key) + } payload.decodeSyncString(selectedThemeKey)?.let(::saveSelectedTheme) payload.decodeSyncBoolean(amoledEnabledKey)?.let(::saveAmoledEnabled) From ee61f2d83cc3343357f07463aa847cd76f36da18 Mon Sep 17 00:00:00 2001 From: Leonardo Montemurro <221404985+MontesanoDev@users.noreply.github.com> Date: Mon, 27 Apr 2026 15:01:23 +0200 Subject: [PATCH 040/143] fix: notify ThemeSettingsRepository when cached profiles are loaded loadCachedProfiles() sets activeProfileIndex but did not notify ThemeSettingsRepository to re-read profile-scoped settings (theme, amoled) from the correct profile key. This ensures theme and other profile-scoped preferences are loaded from the correct profile after the cached profile data is applied. --- .../kotlin/com/nuvio/app/features/profiles/ProfileRepository.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileRepository.kt index b6637490..07a9d9c6 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/profiles/ProfileRepository.kt @@ -70,6 +70,7 @@ object ProfileRepository { val stored = decodeStoredPayload() ?: return false loadedCacheForUserId = stored.userId applyStoredPayload(stored) + ThemeSettingsRepository.onProfileChanged() return _state.value.profiles.isNotEmpty() } From 17cb75a4642789fa5e547cbe36c28d16e48e3047 Mon Sep 17 00:00:00 2001 From: Leonardo Montemurro <221404985+MontesanoDev@users.noreply.github.com> Date: Mon, 27 Apr 2026 15:08:31 +0200 Subject: [PATCH 041/143] fix: migrate language from legacy profile-scoped key to global key On first launch after upgrading, if the new global key is empty, fall back to the legacy profile-scoped key from the previous version. Once found, the value is saved to the global key so future reads avoid the legacy path. --- .../features/settings/ThemeSettingsStorage.android.kt | 9 +++++++-- .../app/features/settings/ThemeSettingsStorage.ios.kt | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.android.kt b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.android.kt index 48c3f1a7..8b1506f0 100644 --- a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.android.kt +++ b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.android.kt @@ -51,8 +51,13 @@ actual object ThemeSettingsStorage { ?.apply() } - actual fun loadSelectedAppLanguage(): String? = - preferences?.getString(selectedAppLanguageKey, null) + actual fun loadSelectedAppLanguage(): String? { + val value = preferences?.getString(selectedAppLanguageKey, null) + if (value != null) return value + val legacy = preferences?.getString(ProfileScopedKey.of(selectedAppLanguageKey), null) + if (legacy != null) saveSelectedAppLanguage(legacy) + return legacy + } actual fun saveSelectedAppLanguage(languageCode: String) { preferences diff --git a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt index 7f28fa7b..f71eaaea 100644 --- a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt +++ b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt @@ -38,8 +38,13 @@ actual object ThemeSettingsStorage { NSUserDefaults.standardUserDefaults.setBool(enabled, forKey = ProfileScopedKey.of(amoledEnabledKey)) } - actual fun loadSelectedAppLanguage(): String? = - NSUserDefaults.standardUserDefaults.stringForKey(selectedAppLanguageKey) + actual fun loadSelectedAppLanguage(): String? { + val value = NSUserDefaults.standardUserDefaults.stringForKey(selectedAppLanguageKey) + if (value != null) return value + val legacy = NSUserDefaults.standardUserDefaults.stringForKey(ProfileScopedKey.of(selectedAppLanguageKey)) + if (legacy != null) saveSelectedAppLanguage(legacy) + return legacy + } actual fun saveSelectedAppLanguage(languageCode: String) { NSUserDefaults.standardUserDefaults.setObject(languageCode, forKey = selectedAppLanguageKey) From c9338640d9112d8e0f642bfc784cb2010db65d8c Mon Sep 17 00:00:00 2001 From: albyalex96 <72573722+albyalex96@users.noreply.github.com> Date: Mon, 27 Apr 2026 17:47:49 +0200 Subject: [PATCH 042/143] Fix escaped characters for italian localization --- .../composeResources/values-it/strings.xml | 90 +++++++++---------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/composeApp/src/commonMain/composeResources/values-it/strings.xml b/composeApp/src/commonMain/composeResources/values-it/strings.xml index a2284ea0..b37c043a 100644 --- a/composeApp/src/commonMain/composeResources/values-it/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-it/strings.xml @@ -29,11 +29,11 @@ Cancella addon Aggiungi un manifest URL per iniziare a caricare cataloghi , metadata, flussi o sottotitoli dentro Nuvio. Nessun addon installato ancora. - Inserisci l\'URL dell\'addon. + Inserisci l'URL dell'addon. URL Addon Installa Addon Caricamento dettagli manifest... - Validazione dell\'URL del manifest e caricamento dei dettagli dell\'addon prima dell\'installazione. + Validazione dell'URL del manifest e caricamento dei dettagli dell'addon prima dell'installazione. Verifica Addon Installazione Fallita %1$s è stato validato e aggiunto con successo. @@ -52,7 +52,7 @@ Selezionato Copia JSON %1$d collezioni, %2$d cartelle - Eliminare "%1$s"? L\'azione è irreversibile. + Eliminare "%1$s"? L'azione è irreversibile. Elimina Collezione Aggiungi Catalogo Aggiungi Cartella @@ -68,15 +68,15 @@ Fatto Modifica Collezione Modifica Cartella - Imposta l\'identità della cartella, la presentazione e le sorgenti del catalogo con la stessa struttura dell\'editor principale delle collezioni. + Imposta l'identità della cartella, la presentazione e le sorgenti del catalogo con la stessa struttura dell'editor principale delle collezioni. Aggiungine una per iniziare. Ancora nessuna cartella Cartelle Filtro Genere - Mostra solo l\'immagine di copertina + Mostra solo l'immagine di copertina Nascondi Titolo Nuova Cartella - Mostra questa collezione sopra tutti i normali cataloghi della home. In presenza di multiple collezioni fissate si seguirà l\'ordine di creazione. + Mostra questa collezione sopra tutti i normali cataloghi della home. In presenza di multiple collezioni fissate si seguirà l'ordine di creazione. Fissa sopra i cataloghi URL backdrop (opzionale) Nome cartella @@ -229,14 +229,14 @@ Gestisci il tuo account, disconnettiti o eliminalo. ACCOUNT Regola la presentazione della home e le preferenze visive. - Controlla se ci sono nuove versioni dell\'app. + Controlla se ci sono nuove versioni dell'app. Verifica aggiornamenti Gestisci gli addon e le sorgenti di scoperta. Gestisci i film e gli episodi scaricati. Download GENERALI Collega i servizi TMDB e MDBList. - Gestisci gli avvisi per l\'uscita di nuovi episodi e invia una notifica di test. + Gestisci gli avvisi per l'uscita di nuovi episodi e invia una notifica di test. Passa a un profilo diverso. Cambia profilo Collega Trakt, sincronizza la lista dei desideri e salva i titoli direttamente su Trakt. @@ -245,7 +245,7 @@ Dona Vai ai dettagli Rimuovi - Riproduci dall\'inizio + Riproduci dall'inizio Riproduci %1$d/10 Recensione @@ -284,7 +284,7 @@ Elimina account Questo eliminerà permanentemente il tuo account e tutti i dati associati. Questa azione non può essere annullata. Tutti i tuoi dati, profili e la cronologia di sincronizzazione saranno rimossi per sempre. - Eliminare l\'account? + Eliminare l'account? Email Accesso non effettuato Disconnetti @@ -332,7 +332,7 @@ STILE LOCANDINA Larghezza locandina Personalizzato - Personalizza la larghezza e il raggio degli angoli delle locandine in tutta l\'app. + Personalizza la larghezza e il raggio degli angoli delle locandine in tutta l'app. Nascondi etichette Modalità orizzontale per le locandine della riga Anteprima in tempo reale @@ -351,10 +351,10 @@ Denso Grande Standard - Mostra un popup per riprendere la visione all\'apertura dell\'app se eri uscito dal player. - Richiesta ripresa all\'avvio + Mostra un popup per riprendere la visione all'apertura dell'app se eri uscito dal player. + Richiesta ripresa all'avvio STILE SCHEDA - ALL\'AVVIO + ALL'AVVIO COMPORTAMENTO \"PROSSIMO EPISODIO\" VISIBILITÀ Mostra la riga \"Continua a guardare\" nella schermata Home. @@ -363,14 +363,14 @@ Scheda focalizzata sulla locandina Orizzontale Scheda orizzontale ricca di informazioni - Se abilitato, \"Prossimo episodio\" continua sempre dall\'ultimo episodio visto. Se disabilitato, segue l\'episodio visto più di recente. Utile se riguardi spesso episodi precedenti. - Prossimo episodio dall\'ultimo visto + Se abilitato, \"Prossimo episodio\" continua sempre dall'ultimo episodio visto. Se disabilitato, segue l'episodio visto più di recente. Utile se riguardi spesso episodi precedenti. + Prossimo episodio dall'ultimo visto HOME SORGENTI Installa, rimuovi, aggiorna e ordina le tue sorgenti di contenuto. Installa repository di scraper JavaScript e testa i provider internamente. Controlla quali cataloghi appaiono in Home e in quale ordine. - Disabilita le sezioni dei dettagli e riordina tutto ciò che sta sotto l\'elemento Hero. + Disabilita le sezioni dei dettagli e riordina tutto ciò che sta sotto l'elemento Hero. Crea raggruppamenti di cataloghi personalizzati con cartelle mostrate in Home. INTEGRAZIONI Migliora le pagine dei dettagli con immagini, crediti, metadati degli episodi di TMDB e altro ancora. @@ -416,7 +416,7 @@ SEZIONI Gruppo schede %1$d Layout a schede - Raggruppa le sezioni in schede (tab) come nell\'app TV. Assegna fino a 3 sezioni per ogni gruppo. + Raggruppa le sezioni in schede (tab) come nell'app TV. Assegna fino a 3 sezioni per ogni gruppo. Trailer Riga dei trailer e scorciatoie di riproduzione. Le notifiche sono attualmente disabilitate in Nuvio. @@ -433,7 +433,7 @@ Notifica di test Community Scopri le persone che sviluppano e supportano Nuvio su Mobile, TV e Web. - L\'API dei sostenitori non è configurata. Aggiungi DONATIONS_BASE_URL a local.properties. + L'API dei sostenitori non è configurata. Aggiungi DONATIONS_BASE_URL a local.properties. Collaboratori Sostenitori Apri GitHub @@ -472,7 +472,7 @@ Inserisci il tuo ID client API AnimeSkip. Ottienine uno su anime-skip.com. Cerca anche su AnimeSkip i timestamp per saltare le sigle (richiede ID client). Riproduzione automatica prossimo episodio - Trova e riproduce automaticamente l\'episodio successivo al raggiungimento della soglia. + Trova e riproduce automaticamente l'episodio successivo al raggiungimento della soglia. Solo dispositivo Preferisci App (FFmpeg) Preferisci dispositivo @@ -493,7 +493,7 @@ Mappa DV7 su HEVC Fallback da Dolby Vision Profile 7 a HEVC per i dispositivi non supportati. Minuti prima della fine - Mostra la scheda dell\'episodio successivo questo numero di minuti prima della fine. + Mostra la scheda dell'episodio successivo questo numero di minuti prima della fine. %1$d min Nessun elemento disponibile Non impostato @@ -528,8 +528,8 @@ Effetti OpenGL Overlay Canvas Overlay OpenGL - Riusa l\'ultimo link - Riproduci automaticamente l\'ultimo flusso funzionante per lo stesso film/episodio se la cache è ancora valida. + Riusa l'ultimo link + Riproduci automaticamente l'ultimo flusso funzionante per lo stesso film/episodio se la cache è ancora valida. Lingua audio secondaria Lingua sottotitoli secondaria DECODER @@ -542,7 +542,7 @@ RENDERING SOTTOTITOLI %1$d selezionati Mostra overlay di caricamento - Mostra una schermata di caricamento all\'avvio della riproduzione di un flusso. + Mostra una schermata di caricamento all'avvio della riproduzione di un flusso. Salta Intro/Outro/Recap Mostra il pulsante \"salta\" durante i segmenti rilevati di introduzione, chiusura e riassunto. Ambito sorgente @@ -568,14 +568,14 @@ Minuti prima della fine Percentuale Percentuale di soglia - Mostra la scheda dell\'episodio successivo quando la riproduzione raggiunge questa percentuale. + Mostra la scheda dell'episodio successivo quando la riproduzione raggiunge questa percentuale. %1$d%% Istantaneo %1$ds Illimitato Riproduzione Tunneled Abilita la riproduzione tunneled per una minore latenza nella sincronizzazione audio/video. - Aggiungi la tua chiave API TMDB qui sotto prima di attivare l\'arricchimento. + Aggiungi la tua chiave API TMDB qui sotto prima di attivare l'arricchimento. Chiave API TMDB Abilita arricchimento TMDB Usa la tua chiave API TMDB per arricchire i metadati degli addon nella schermata dei dettagli quando è disponibile un ID TMDB o IMDb. @@ -590,7 +590,7 @@ Crediti Usa creatori, registi, sceneggiatori e foto del cast di TMDB. Dettagli - Usa info su rilascio, durata, classificazione d\'età, stato, paese e lingua di TMDB. + Usa info su rilascio, durata, classificazione d'età, stato, paese e lingua di TMDB. Episodi Usa titoli, miniature, descrizioni e durate degli episodi di TMDB per le serie. Altri titoli simili @@ -610,7 +610,7 @@ LOCALIZZAZIONE MODULI TMDB - Dopo l\'approvazione, verrai reindirizzato automaticamente. + Dopo l'approvazione, verrai reindirizzato automaticamente. AUTENTICAZIONE Commenti Mostra i commenti di Trakt nei dettagli di film e serie TV. @@ -620,7 +620,7 @@ Disconnetti Impossibile aprire il browser FUNZIONALITÀ - Completa l\'accesso a Trakt nel tuo browser + Completa l'accesso a Trakt nel tuo browser Tieni traccia di ciò che guardi, salva contenuti nella watchlist o in liste personalizzate e mantieni la tua libreria sincronizzata con Trakt. Credenziali Trakt mancanti in local.properties (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET). Apri Login Trakt @@ -737,8 +737,8 @@ No Aggiorna - Vuoi uscire dall\'app? - Esci dall\'app + Vuoi uscire dall'app? + Esci dall'app Questo catalogo non ha restituito alcun elemento. Nessun titolo trovato Controlla la tua connessione Wi-Fi o dati mobili e riprova. @@ -746,8 +746,8 @@ Caricamento fallito Altri titoli simili Stagioni - L\'addon ha restituito i video per questa serie, ma nessuno include numeri di stagione o episodio. - L\'addon non ha fornito metadati sugli episodi per questa serie. + L'addon ha restituito i video per questa serie, ma nessuno include numeri di stagione o episodio. + L'addon non ha fornito metadati sugli episodi per questa serie. Gli episodi non sono ancora stati pubblicati da questo addon. Il dispositivo è online, ma Nuvio non è riuscito a raggiungere i server richiesti. Mostra meno @@ -877,12 +877,12 @@ Controllo aggiornamenti fallito Download fallito Download in corso: %1$d%% - Impossibile avviare l\'installazione - Stai utilizzando l\'ultima versione. - Abilita l\'installazione di app per Nuvio, quindi torna qui e continua. + Impossibile avviare l'installazione + Stai utilizzando l'ultima versione. + Abilita l'installazione di app per Nuvio, quindi torna qui e continua. Download aggiornamento in corso... Nessun aggiornamento trovato. - Una nuova versione è pronta per l\'installazione. + Una nuova versione è pronta per l'installazione. Gli aggiornamenti in-app non sono disponibili in questa versione. Preparazione del download Note di rilascio @@ -918,7 +918,7 @@ Rimuovere dalla libreria? Film Avvisi quando viene rilasciato un nuovo episodio di una serie salvata. - Anteprima dell\'avviso di uscita episodio. + Anteprima dell'avviso di uscita episodio. Impossibile inviare la notifica di test. Notifica di test inviata per %1$s. Impossibile riprodurre questo flusso. @@ -933,7 +933,7 @@ Flusso Incorporato (Embedded) Autorizzazione negata - Completa l\'accesso a Trakt nel tuo browser + Completa l'accesso a Trakt nel tuo browser Callback Trakt non valido Stato callback Trakt non valido Risposta token Trakt non valida @@ -942,7 +942,7 @@ Trakt non ha restituito un codice di autorizzazione Credenziali Trakt mancanti Impossibile caricare i progressi di Trakt - Impossibile completare l\'accesso a Trakt + Impossibile completare l'accesso a Trakt Utente Trakt Watchlist Trailer @@ -953,10 +953,10 @@ Riprendi %1$s Il file JSON è vuoto. La collezione %1$d ha un ID vuoto. - La collezione \'%1$s\' ha un titolo vuoto. - La cartella %1$d in \'%2$s\' ha un ID vuoto. - La cartella \'%1$s\' in \'%2$s\' ha un titolo vuoto. - La sorgente %1$d nella cartella \'%2$s\' presenta campi vuoti. + La collezione '%1$s' ha un titolo vuoto. + La cartella %1$d in '%2$s' ha un ID vuoto. + La cartella '%1$s' in '%2$s' ha un titolo vuoto. + La sorgente %1$d nella cartella '%2$s' presenta campi vuoti. JSON non valido: %1$s Addon non trovato: %1$s Gennaio @@ -993,7 +993,7 @@ Certificazione Dettagli film Lingua originale - Paese d\'origine + Paese d'origine Info rilascio Durata Locandine From e76c6602606707e47e76326df19df93c52f3e01a Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Wed, 29 Apr 2026 01:12:54 +0530 Subject: [PATCH 043/143] fix: double percent sign in cw section --- .../src/commonMain/composeResources/values-el/strings.xml | 2 +- .../src/commonMain/composeResources/values-es/strings.xml | 2 +- .../src/commonMain/composeResources/values-fr/strings.xml | 2 +- .../src/commonMain/composeResources/values-it/strings.xml | 2 +- .../src/commonMain/composeResources/values-pl/strings.xml | 4 ++-- .../composeResources/values-pt-rPT/{strings => strings.xml} | 2 +- .../src/commonMain/composeResources/values-tr/strings.xml | 2 +- composeApp/src/commonMain/composeResources/values/strings.xml | 2 +- .../features/home/components/HomeContinueWatchingSection.kt | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) rename composeApp/src/commonMain/composeResources/values-pt-rPT/{strings => strings.xml} (99%) diff --git a/composeApp/src/commonMain/composeResources/values-el/strings.xml b/composeApp/src/commonMain/composeResources/values-el/strings.xml index a3afc52d..e27e5d30 100644 --- a/composeApp/src/commonMain/composeResources/values-el/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-el/strings.xml @@ -774,7 +774,7 @@ Σήμανση ως μη παρακολουθηθέν Σήμανση ως παρακολουθηθέν Επόμενο - %1$d%% παρακολουθήθηκε + %1$s παρακολουθήθηκε Εγκαταστήστε και επικυρώστε τουλάχιστον ένα πρόσθετο πριν φορτώσετε γραμμές καταλόγου στην Αρχική. Τα εγκατεστημένα πρόσθετα δεν παρέχουν αυτή τη στιγμή καταλόγους συμβατούς με πίνακα χωρίς απαιτούμενα extras. Δεν υπάρχουν διαθέσιμες γραμμές αρχικής diff --git a/composeApp/src/commonMain/composeResources/values-es/strings.xml b/composeApp/src/commonMain/composeResources/values-es/strings.xml index 514e6e3a..718a456e 100644 --- a/composeApp/src/commonMain/composeResources/values-es/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-es/strings.xml @@ -892,7 +892,7 @@ Marcar como no visto Marcar como visto Siguiente - %1$d%% visto + %1$s visto Instala y valida al menos un addon antes de cargar filas de catálogo en Inicio. Los addons instalados no exponen actualmente catálogos compatibles con el tablero sin extras requeridos. No hay filas de inicio disponibles diff --git a/composeApp/src/commonMain/composeResources/values-fr/strings.xml b/composeApp/src/commonMain/composeResources/values-fr/strings.xml index ded18299..d230e824 100644 --- a/composeApp/src/commonMain/composeResources/values-fr/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-fr/strings.xml @@ -893,7 +893,7 @@ Marquer comme non vu Marquer comme vu Suivant - %1$d%% vu + %1$s vu Installez et validez au moins une extension avant de charger des lignes de catalogue à l\'accueil. Les extensions installées n\'exposent actuellement aucun catalogue compatible avec le tableau sans extras requis. Aucune ligne d\'accueil disponible diff --git a/composeApp/src/commonMain/composeResources/values-it/strings.xml b/composeApp/src/commonMain/composeResources/values-it/strings.xml index b37c043a..304508e6 100644 --- a/composeApp/src/commonMain/composeResources/values-it/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-it/strings.xml @@ -774,7 +774,7 @@ Segna come non visto Segna come visto Prossimo episodio - %1$d%% visto + %1$s visto Installa e convalida almeno un addon prima di caricare le righe del catalogo in Home. Gli addon installati non espongono attualmente cataloghi compatibili con la bacheca senza gli extra richiesti. Nessuna riga disponibile in Home diff --git a/composeApp/src/commonMain/composeResources/values-pl/strings.xml b/composeApp/src/commonMain/composeResources/values-pl/strings.xml index 81aa7ac8..c295481c 100644 --- a/composeApp/src/commonMain/composeResources/values-pl/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-pl/strings.xml @@ -892,7 +892,7 @@ Oznacz jako nieobejrzane Oznacz jako obejrzane Następny - %1$d%% obejrzane + %1$s obejrzane Zainstaluj i sprawdź co najmniej jeden dodatek przed ładowaniem wierszy katalogów na ekranie głównym. Zainstalowane dodatki nie udostępniają obecnie katalogów kompatybilnych z tablicą bez wymaganych dodatków. Brak dostępnych wierszy ekranu głównego @@ -1158,4 +1158,4 @@ KB MB GB - \ No newline at end of file + diff --git a/composeApp/src/commonMain/composeResources/values-pt-rPT/strings b/composeApp/src/commonMain/composeResources/values-pt-rPT/strings.xml similarity index 99% rename from composeApp/src/commonMain/composeResources/values-pt-rPT/strings rename to composeApp/src/commonMain/composeResources/values-pt-rPT/strings.xml index 8c8507e0..15c19dda 100644 --- a/composeApp/src/commonMain/composeResources/values-pt-rPT/strings +++ b/composeApp/src/commonMain/composeResources/values-pt-rPT/strings.xml @@ -892,7 +892,7 @@ Marcar como não visto Marcar como visto Próximo - %1$d%% visto + %1$s visto Instala e valida pelo menos um addon antes de carregar o Início. Os addons instalados não expõem catálogos compatíveis de momento. Nenhuma linha disponível no Início diff --git a/composeApp/src/commonMain/composeResources/values-tr/strings.xml b/composeApp/src/commonMain/composeResources/values-tr/strings.xml index 9684bfc6..1304737f 100644 --- a/composeApp/src/commonMain/composeResources/values-tr/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-tr/strings.xml @@ -774,7 +774,7 @@ İzlenmedi olarak işaretle İzlendi olarak işaretle Sıradaki - %%%1$d izlendi + %1$s izlendi Ana sayfada katalog satırlarını yüklemeden önce en az bir eklenti kurup doğrula. Kurulu eklentiler şu anda gerekli ek bilgiler olmadan ana sayfaya uyumlu katalog sunmuyor. Ana sayfa satırı yok diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index 2afb0532..e9879010 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -892,7 +892,7 @@ Mark as unwatched Mark as watched Up next - %1$d%% watched + %1$s watched Install and validate at least one addon before loading catalog rows on Home. Installed addons do not currently expose board-compatible catalogs without required extras. No home rows available diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeContinueWatchingSection.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeContinueWatchingSection.kt index 1fd74b47..b84db29a 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeContinueWatchingSection.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/home/components/HomeContinueWatchingSection.kt @@ -365,7 +365,7 @@ private fun ContinueWatchingWideCard( Text( text = stringResource( Res.string.home_continue_watching_watched, - continueWatchingProgressPercent(item.progressFraction), + "${continueWatchingProgressPercent(item.progressFraction)}%", ), style = MaterialTheme.typography.labelSmall.copy( fontSize = layout.progressLabelSize, From 1b1b885d0e4cea6d7b694849b62a96ed06db7d96 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Wed, 29 Apr 2026 01:13:57 +0530 Subject: [PATCH 044/143] feat: add heroVideoUrl to CollectionFolder data class --- .../kotlin/com/nuvio/app/features/collection/CollectionModels.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt index 5d17161b..208aa03d 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt @@ -133,6 +133,7 @@ data class CollectionFolder( val sources: List = emptyList(), val catalogSources: List = emptyList(), val heroBackdropUrl: String? = null, + val heroVideoUrl: String? = null, val titleLogoUrl: String? = null, ) { val posterShape: PosterShape From 715b74c9424eb81f35edf83b1872e1927351a6bc Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Wed, 29 Apr 2026 01:20:54 +0530 Subject: [PATCH 045/143] fix: patched remaining double literals. --- .../src/commonMain/composeResources/values-el/strings.xml | 6 +++--- .../src/commonMain/composeResources/values-es/strings.xml | 6 +++--- .../src/commonMain/composeResources/values-fr/strings.xml | 6 +++--- .../src/commonMain/composeResources/values-it/strings.xml | 6 +++--- .../src/commonMain/composeResources/values-pl/strings.xml | 6 +++--- .../commonMain/composeResources/values-pt-rPT/strings.xml | 6 +++--- .../src/commonMain/composeResources/values-tr/strings.xml | 6 +++--- .../src/commonMain/composeResources/values/strings.xml | 6 +++--- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/composeApp/src/commonMain/composeResources/values-el/strings.xml b/composeApp/src/commonMain/composeResources/values-el/strings.xml index e27e5d30..841a751c 100644 --- a/composeApp/src/commonMain/composeResources/values-el/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-el/strings.xml @@ -569,7 +569,7 @@ Ποσοστό Ποσοστό κατωφλίου Εμφάνιση κάρτας επόμενου επεισοδίου όταν η αναπαραγωγή φτάσει σε αυτό το ποσοστό. - %1$d%% + %1$d% Άμεσα %1$ds Απεριόριστο @@ -866,7 +866,7 @@ Δεν υπάρχει διαθέσιμος άμεσος σύνδεσμος ροής Δεν υπάρχουν διαθέσιμα μεταδεδομένα Ανανέωση ροών - Συνέχεια από %1$d%% + Συνέχεια από %1$d% Συνέχεια από %1$s ΜΕΓΕΘΟΣ %1$s Κλείσιμο τρέιλερ @@ -876,7 +876,7 @@ %1$s • %2$s Ο έλεγχος ενημερώσεων απέτυχε Η λήψη απέτυχε - Λήψη %1$d%% + Λήψη %1$d% Αδυναμία εκκίνησης εγκατάστασης Χρησιμοποιείτε την τελευταία έκδοση. Ενεργοποιήστε τις εγκαταστάσεις εφαρμογών για το Nuvio και επιστρέψτε για να συνεχίσετε. diff --git a/composeApp/src/commonMain/composeResources/values-es/strings.xml b/composeApp/src/commonMain/composeResources/values-es/strings.xml index 718a456e..cc86a0de 100644 --- a/composeApp/src/commonMain/composeResources/values-es/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-es/strings.xml @@ -687,7 +687,7 @@ Porcentaje Porcentaje de umbral Mostrar la tarjeta del siguiente episodio cuando la reproducción alcance este porcentaje. - %1$d%% + %1$d% Instantáneo %1$ds Ilimitado @@ -984,7 +984,7 @@ No hay enlace directo del stream disponible No hay metadatos disponibles Actualizar streams - Reanudar desde %1$d%% + Reanudar desde %1$d% Reanudar desde %1$s TAMAÑO %1$s Cerrar tráiler @@ -994,7 +994,7 @@ %1$s • %2$s Falló la comprobación de actualizaciones La descarga falló - Descargando %1$d%% + Descargando %1$d% No se pudo iniciar la instalación Estás usando la versión más reciente. Activa la instalación de apps para Nuvio y luego vuelve para continuar. diff --git a/composeApp/src/commonMain/composeResources/values-fr/strings.xml b/composeApp/src/commonMain/composeResources/values-fr/strings.xml index d230e824..58880bec 100644 --- a/composeApp/src/commonMain/composeResources/values-fr/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-fr/strings.xml @@ -688,7 +688,7 @@ Pourcentage Pourcentage de seuil Afficher la carte de l\'épisode suivant lorsque la lecture atteint ce pourcentage. - %1$d%% + %1$d% Instantané %1$ds Illimité @@ -985,7 +985,7 @@ Aucun lien direct du stream disponible Aucune métadonnée disponible Actualiser les streams - Reprendre depuis %1$d%% + Reprendre depuis %1$d% Reprendre depuis %1$s TAILLE %1$s Fermer la bande-annonce @@ -995,7 +995,7 @@ %1$s • %2$s Échec de la vérification des mises à jour Échec du téléchargement - Téléchargement %1$d%% + Téléchargement %1$d% Impossible de démarrer l\'installation Vous utilisez la version la plus récente. Activez l\'installation d\'applications pour Nuvio puis revenez pour continuer. diff --git a/composeApp/src/commonMain/composeResources/values-it/strings.xml b/composeApp/src/commonMain/composeResources/values-it/strings.xml index 304508e6..1e6ce43e 100644 --- a/composeApp/src/commonMain/composeResources/values-it/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-it/strings.xml @@ -569,7 +569,7 @@ Percentuale Percentuale di soglia Mostra la scheda dell'episodio successivo quando la riproduzione raggiunge questa percentuale. - %1$d%% + %1$d% Istantaneo %1$ds Illimitato @@ -866,7 +866,7 @@ Nessun link diretto disponibile Nessun metadato disponibile Aggiorna flussi - Riprendi dal %1$d%% + Riprendi dal %1$d% Riprendi da %1$s DIMENSIONE %1$s Chiudi trailer @@ -876,7 +876,7 @@ %1$s • %2$s Controllo aggiornamenti fallito Download fallito - Download in corso: %1$d%% + Download in corso: %1$d% Impossibile avviare l'installazione Stai utilizzando l'ultima versione. Abilita l'installazione di app per Nuvio, quindi torna qui e continua. diff --git a/composeApp/src/commonMain/composeResources/values-pl/strings.xml b/composeApp/src/commonMain/composeResources/values-pl/strings.xml index c295481c..7200b49f 100644 --- a/composeApp/src/commonMain/composeResources/values-pl/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-pl/strings.xml @@ -687,7 +687,7 @@ Procent Próg procentowy Pokaż kartę następnego odcinka, gdy odtwarzanie osiągnie ten procent. - %1$d%% + %1$d% Natychmiast %1$ds Bez limitu @@ -984,7 +984,7 @@ Brak bezpośredniego linku strumienia Brak dostępnych metadanych Odśwież strumienie - Wznów od %1$d%% + Wznów od %1$d% Wznów od %1$s ROZMIAR %1$s Zamknij zwiastun @@ -994,7 +994,7 @@ %1$s • %2$s Sprawdzanie aktualizacji nie powiodło się Pobieranie nie powiodło się - Pobieranie %1$d%% + Pobieranie %1$d% Nie można rozpocząć instalacji Używasz najnowszej wersji. Zezwól na instalację aplikacji dla Nuvio, a następnie wróć i kontynuuj. diff --git a/composeApp/src/commonMain/composeResources/values-pt-rPT/strings.xml b/composeApp/src/commonMain/composeResources/values-pt-rPT/strings.xml index 15c19dda..9cf50f3c 100644 --- a/composeApp/src/commonMain/composeResources/values-pt-rPT/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-pt-rPT/strings.xml @@ -687,7 +687,7 @@ Percentagem Percentagem de Limite Mostra o cartão do próximo episódio quando a reprodução atinge esta percentagem. - %1$d%% + %1$d% Instantâneo %1$ds Ilimitado @@ -984,7 +984,7 @@ Nenhum link direto disponível Nenhuns metadados disponíveis Atualizar transmissões - Retomar de %1$d%% + Retomar de %1$d% Retomar de %1$s TAMANHO %1$s Fechar trailer @@ -994,7 +994,7 @@ %1$s • %2$s Falha ao verificar atualizações Falha no download - A descarregar %1$d%% + A descarregar %1$d% Não foi possível iniciar a instalação Estás a usar a versão mais recente. Ativa a instalação de aplicações para o Nuvio, depois volta e continua. diff --git a/composeApp/src/commonMain/composeResources/values-tr/strings.xml b/composeApp/src/commonMain/composeResources/values-tr/strings.xml index 1304737f..e3d66b12 100644 --- a/composeApp/src/commonMain/composeResources/values-tr/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-tr/strings.xml @@ -569,7 +569,7 @@ Yüzde Eşik yüzdesi Oynatma bu yüzdeye ulaşınca sonraki bölüm kartını göster. - %1$d%% + %1$d% Hemen %1$dsn Sınırsız @@ -866,7 +866,7 @@ Doğrudan yayın bağlantısı yok Meta veri yok Yayınları yenile - %%%1$d konumundan devam et + %1$d% konumundan devam et %1$s konumundan devam et BOYUT %1$s Fragmanı kapat @@ -876,7 +876,7 @@ %1$s • %2$s Güncelleme kontrolü olmadı İndirme olmadı - İndiriliyor %%%1$d + İndiriliyor %1$d% Kurulum başlatılamadı En güncel sürümü kullanıyorsun. Nuvio için uygulama kurulumlarına izin ver, sonra geri gelip devam et. diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index e9879010..e4f9ff23 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -687,7 +687,7 @@ Percentage Threshold Percentage Show next episode card when playback reaches this percentage. - %1$d%% + %1$d% Instant %1$ds Unlimited @@ -984,7 +984,7 @@ No direct stream link available No metadata available Refresh streams - Resume from %1$d%% + Resume from %1$d% Resume from %1$s SIZE %1$s Close trailer @@ -994,7 +994,7 @@ %1$s • %2$s Update check failed Download failed - Downloading %1$d%% + Downloading %1$d% Unable to start installation You're using the latest version. Enable app installs for Nuvio, then come back and continue. From 1781801ebe8afe391ce91f55c1ccf7685ca570eb Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Wed, 29 Apr 2026 01:24:18 +0530 Subject: [PATCH 046/143] feat: update quick-js --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d5929dc6..ae480b9f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,7 +22,7 @@ ktor = "3.4.1" material3 = "1.11.0-alpha07" androidx-media3 = "1.8.0" supabase = "3.4.1" -quickjsKt = "1.0.1" +quickjsKt = "1.0.5" ksoup = "0.2.6" reorderable = "3.0.0" desugarJdkLibs = "2.1.5" From 2771feab573ae02aaaecdfaadfe3709bf2a355b8 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Wed, 29 Apr 2026 23:37:42 +0530 Subject: [PATCH 047/143] feat: add support for person and director (tmdb) --- .../composeResources/values/strings.xml | 12 ++ .../collection/CollectionEditorRepository.kt | 16 ++ .../collection/CollectionEditorScreen.kt | 29 +++ .../features/collection/CollectionModels.kt | 3 + .../collection/FolderDetailRepository.kt | 6 +- .../TmdbCollectionSourceResolver.kt | 169 +++++++++++++++++- 6 files changed, 232 insertions(+), 3 deletions(-) diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index e4f9ff23..4a014ff0 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -110,29 +110,38 @@ Production Network Collection + Person + Director Custom Pick a ready-made source. You can edit or remove it after adding. Paste a public TMDB list URL or only the number from the URL. Search by studio name, or paste a TMDB company ID/URL and add it directly. Enter a network ID. Common networks are available in Presets and quick filters. Search a movie collection name or paste the collection ID from TMDB. + Enter a TMDB person ID or URL to build a row from cast credits. + Enter a TMDB person ID or URL to build a row from director credits. Build a live TMDB row using optional filters. Leave fields empty when you do not need that filter. Public TMDB list Network ID Collection ID + Person ID Production company name, ID, or URL TMDB ID or URL https://www.themoviedb.org/list/8504994 or 8504994 213 for Netflix, 49 for HBO, 2739 for Disney+ 10 for Star Wars Collection Marvel Studios, 420, or company URL + 31 for Tom Hanks, or person URL Examples: Marvel Studios, 420, or https://www.themoviedb.org/company/420. Example: Star Wars Collection, Harry Potter Collection, or a collection URL. Example IDs: Netflix 213, HBO 49, Disney+ 2739. Example: https://www.themoviedb.org/list/8504994 or 8504994. + Example: https://www.themoviedb.org/person/31-tom-hanks or 31. Display title Shown as the row/tab name. If blank, Nuvio creates one from the source. Marvel Movies, Netflix Originals, Pixar + Tom Hanks Movies, Favorite Actors + Christopher Nolan Movies, Favorite Directors Best Action Movies, Korean Dramas, 2024 Animation Search Results TMDB Collection @@ -212,6 +221,7 @@ Disney+ Prime Video Hulu + Original Popular Top Rated Recent @@ -219,6 +229,8 @@ TMDB Movie Collection Production Network + Person + Director TMDB Discover Create one to organize your catalogs. No collections yet diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt index cbb476c8..f7597072 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt @@ -46,6 +46,8 @@ enum class TmdbBuilderMode { PRODUCTION, NETWORK, COLLECTION, + PERSON, + DIRECTOR, DISCOVER, } @@ -340,9 +342,15 @@ object CollectionEditorRepository { } else { _uiState.value.tmdbMediaType } + val sortBy = when (mode) { + TmdbBuilderMode.LIST, + TmdbBuilderMode.COLLECTION -> TmdbCollectionSort.ORIGINAL.value + else -> TmdbCollectionSort.POPULAR_DESC.value + } _uiState.value = _uiState.value.copy( tmdbBuilderMode = mode, tmdbMediaType = mediaType, + tmdbSortBy = sortBy, tmdbMediaBoth = if ( mode == TmdbBuilderMode.NETWORK || mode == TmdbBuilderMode.LIST || @@ -459,6 +467,8 @@ object CollectionEditorRepository { TmdbBuilderMode.COLLECTION -> TmdbCollectionSourceType.COLLECTION TmdbBuilderMode.PRODUCTION -> TmdbCollectionSourceType.COMPANY TmdbBuilderMode.NETWORK -> TmdbCollectionSourceType.NETWORK + TmdbBuilderMode.PERSON -> TmdbCollectionSourceType.PERSON + TmdbBuilderMode.DIRECTOR -> TmdbCollectionSourceType.DIRECTOR TmdbBuilderMode.DISCOVER -> TmdbCollectionSourceType.DISCOVER } val id = TmdbCollectionSourceResolver.parseTmdbId(state.tmdbInput) @@ -473,6 +483,8 @@ object CollectionEditorRepository { TmdbCollectionSourceType.COLLECTION -> "TMDB Collection ${id ?: ""}".trim() TmdbCollectionSourceType.COMPANY -> "TMDB Production ${id ?: ""}".trim() TmdbCollectionSourceType.NETWORK -> "TMDB Network ${id ?: ""}".trim() + TmdbCollectionSourceType.PERSON -> "TMDB Person ${id ?: ""}".trim() + TmdbCollectionSourceType.DIRECTOR -> "TMDB Director ${id ?: ""}".trim() TmdbCollectionSourceType.DISCOVER -> "TMDB Discover" } } @@ -561,6 +573,8 @@ private val coverMetadataSourceTypes = setOf( TmdbCollectionSourceType.COLLECTION, TmdbCollectionSourceType.COMPANY, TmdbCollectionSourceType.NETWORK, + TmdbCollectionSourceType.PERSON, + TmdbCollectionSourceType.DIRECTOR, ) private fun CollectionCatalogSource.toCollectionSource(): CollectionSource = @@ -591,6 +605,8 @@ private fun selectedMediaTypes( ): List = when (sourceType) { TmdbCollectionSourceType.COMPANY, + TmdbCollectionSourceType.PERSON, + TmdbCollectionSourceType.DIRECTOR, TmdbCollectionSourceType.DISCOVER -> if (state.tmdbMediaBoth) { listOf(TmdbCollectionMediaType.MOVIE, TmdbCollectionMediaType.TV) } else { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt index 41ee6532..1a7bdf04 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt @@ -897,13 +897,19 @@ private fun TmdbSourcePickerScreen( TmdbBuilderMode.COLLECTION -> TmdbCollectionSourceType.COLLECTION TmdbBuilderMode.PRODUCTION -> TmdbCollectionSourceType.COMPANY TmdbBuilderMode.NETWORK -> TmdbCollectionSourceType.NETWORK + TmdbBuilderMode.PERSON -> TmdbCollectionSourceType.PERSON + TmdbBuilderMode.DIRECTOR -> TmdbCollectionSourceType.DIRECTOR TmdbBuilderMode.DISCOVER -> TmdbCollectionSourceType.DISCOVER } val requiresId = sourceType != TmdbCollectionSourceType.DISCOVER val showMediaControls = state.tmdbBuilderMode == TmdbBuilderMode.PRODUCTION || + state.tmdbBuilderMode == TmdbBuilderMode.PERSON || + state.tmdbBuilderMode == TmdbBuilderMode.DIRECTOR || state.tmdbBuilderMode == TmdbBuilderMode.DISCOVER val showSortControls = state.tmdbBuilderMode == TmdbBuilderMode.PRODUCTION || state.tmdbBuilderMode == TmdbBuilderMode.NETWORK || + state.tmdbBuilderMode == TmdbBuilderMode.PERSON || + state.tmdbBuilderMode == TmdbBuilderMode.DIRECTOR || state.tmdbBuilderMode == TmdbBuilderMode.DISCOVER val showFilterControls = state.tmdbBuilderMode == TmdbBuilderMode.DISCOVER @@ -1892,6 +1898,8 @@ private fun tmdbBuilderModeLabel(mode: TmdbBuilderMode): String = TmdbBuilderMode.PRODUCTION -> stringResource(Res.string.collections_editor_tmdb_production_mode) TmdbBuilderMode.NETWORK -> stringResource(Res.string.collections_editor_tmdb_network_mode) TmdbBuilderMode.COLLECTION -> stringResource(Res.string.collections_editor_tmdb_collection_mode) + TmdbBuilderMode.PERSON -> stringResource(Res.string.collections_editor_tmdb_person_mode) + TmdbBuilderMode.DIRECTOR -> stringResource(Res.string.collections_editor_tmdb_director_mode) TmdbBuilderMode.DISCOVER -> stringResource(Res.string.collections_editor_tmdb_custom_mode) } @@ -1903,6 +1911,8 @@ private fun tmdbModeHelpText(mode: TmdbBuilderMode): String = TmdbBuilderMode.PRODUCTION -> stringResource(Res.string.collections_editor_tmdb_help_production) TmdbBuilderMode.NETWORK -> stringResource(Res.string.collections_editor_tmdb_help_network) TmdbBuilderMode.COLLECTION -> stringResource(Res.string.collections_editor_tmdb_help_collection) + TmdbBuilderMode.PERSON -> stringResource(Res.string.collections_editor_tmdb_help_person) + TmdbBuilderMode.DIRECTOR -> stringResource(Res.string.collections_editor_tmdb_help_director) TmdbBuilderMode.DISCOVER -> stringResource(Res.string.collections_editor_tmdb_help_discover) } @@ -1913,6 +1923,8 @@ private fun tmdbInputLabel(mode: TmdbBuilderMode): String = TmdbBuilderMode.NETWORK -> stringResource(Res.string.collections_editor_tmdb_network_id) TmdbBuilderMode.COLLECTION -> stringResource(Res.string.collections_editor_tmdb_collection_id) TmdbBuilderMode.PRODUCTION -> stringResource(Res.string.collections_editor_tmdb_company_search) + TmdbBuilderMode.PERSON, + TmdbBuilderMode.DIRECTOR -> stringResource(Res.string.collections_editor_tmdb_person_id) else -> stringResource(Res.string.collections_editor_tmdb_id_or_url) } @@ -1923,6 +1935,8 @@ private fun tmdbInputPlaceholder(mode: TmdbBuilderMode): String = TmdbBuilderMode.NETWORK -> stringResource(Res.string.collections_editor_tmdb_network_placeholder) TmdbBuilderMode.COLLECTION -> stringResource(Res.string.collections_editor_tmdb_collection_placeholder) TmdbBuilderMode.PRODUCTION -> stringResource(Res.string.collections_editor_tmdb_company_placeholder) + TmdbBuilderMode.PERSON, + TmdbBuilderMode.DIRECTOR -> stringResource(Res.string.collections_editor_tmdb_person_placeholder) else -> stringResource(Res.string.collections_editor_tmdb_id_or_url) } @@ -1933,6 +1947,8 @@ private fun tmdbInputHelper(mode: TmdbBuilderMode): String = TmdbBuilderMode.COLLECTION -> stringResource(Res.string.collections_editor_tmdb_collection_helper) TmdbBuilderMode.NETWORK -> stringResource(Res.string.collections_editor_tmdb_network_helper) TmdbBuilderMode.LIST -> stringResource(Res.string.collections_editor_tmdb_list_helper) + TmdbBuilderMode.PERSON, + TmdbBuilderMode.DIRECTOR -> stringResource(Res.string.collections_editor_tmdb_person_helper) else -> "" } @@ -1940,12 +1956,15 @@ private fun tmdbInputHelper(mode: TmdbBuilderMode): String = private fun tmdbTitlePlaceholder(mode: TmdbBuilderMode): String = when (mode) { TmdbBuilderMode.DISCOVER -> stringResource(Res.string.collections_editor_tmdb_discover_title_placeholder) + TmdbBuilderMode.PERSON -> stringResource(Res.string.collections_editor_tmdb_person_title_placeholder) + TmdbBuilderMode.DIRECTOR -> stringResource(Res.string.collections_editor_tmdb_director_title_placeholder) else -> stringResource(Res.string.collections_editor_tmdb_title_placeholder) } @Composable private fun tmdbSortLabel(sort: TmdbCollectionSort): String = when (sort) { + TmdbCollectionSort.ORIGINAL -> stringResource(Res.string.collections_editor_tmdb_sort_original) TmdbCollectionSort.POPULAR_DESC -> stringResource(Res.string.collections_editor_tmdb_sort_popular) TmdbCollectionSort.VOTE_AVERAGE_DESC -> stringResource(Res.string.collections_editor_tmdb_sort_top_rated) TmdbCollectionSort.RELEASE_DATE_DESC -> stringResource(Res.string.collections_editor_tmdb_sort_recent) @@ -1979,6 +1998,16 @@ private fun tmdbSourceSubtitle(source: CollectionSource): String { stringResource(Res.string.collections_editor_tmdb_series), sort, ).joinToString(" • ") + TmdbCollectionSourceType.PERSON -> listOf( + stringResource(Res.string.collections_editor_tmdb_subtitle_person), + media, + sort, + ).joinToString(" • ") + TmdbCollectionSourceType.DIRECTOR -> listOf( + stringResource(Res.string.collections_editor_tmdb_subtitle_director), + media, + sort, + ).joinToString(" • ") TmdbCollectionSourceType.DISCOVER -> listOf( stringResource(Res.string.collections_editor_tmdb_subtitle_discover), media, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt index 208aa03d..f0780ad2 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt @@ -69,6 +69,8 @@ enum class TmdbCollectionSourceType { COMPANY, NETWORK, DISCOVER, + PERSON, + DIRECTOR, } @Serializable @@ -86,6 +88,7 @@ enum class TmdbCollectionMediaType(val value: String) { } enum class TmdbCollectionSort(val value: String) { + ORIGINAL("original"), POPULAR_DESC("popularity.desc"), VOTE_AVERAGE_DESC("vote_average.desc"), RELEASE_DATE_DESC("primary_release_date.desc"), diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt index e853eeba..decff7a5 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt @@ -140,7 +140,11 @@ object FolderDetailRepository { source = source, type = type, catalogId = tmdbCatalogId(source), - supportsPagination = source.tmdbSourceType != TmdbCollectionSourceType.COLLECTION.name, + supportsPagination = source.tmdbSourceType !in setOf( + TmdbCollectionSourceType.COLLECTION.name, + TmdbCollectionSourceType.PERSON.name, + TmdbCollectionSourceType.DIRECTOR.name, + ), isLoading = true, ), ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/TmdbCollectionSourceResolver.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/TmdbCollectionSourceResolver.kt index ee25fa48..3f37d3d8 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/TmdbCollectionSourceResolver.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/TmdbCollectionSourceResolver.kt @@ -29,6 +29,8 @@ object TmdbCollectionSourceResolver { when (sourceType) { TmdbCollectionSourceType.LIST -> resolveList(source, apiKey, language, page) TmdbCollectionSourceType.COLLECTION -> resolveCollection(source, apiKey, language) + TmdbCollectionSourceType.PERSON, + TmdbCollectionSourceType.DIRECTOR -> resolvePersonCredits(source, apiKey, language) TmdbCollectionSourceType.COMPANY, TmdbCollectionSourceType.NETWORK, TmdbCollectionSourceType.DISCOVER -> resolveDiscover(source, apiKey, language, page) @@ -85,6 +87,19 @@ object TmdbCollectionSourceResolver { ) } + TmdbCollectionSourceType.PERSON, + TmdbCollectionSourceType.DIRECTOR -> { + val body = fetch( + endpoint = "person/$id", + apiKey = apiKey, + query = mapOf("language" to language), + ) ?: error("TMDB person not found") + TmdbSourceImportMetadata( + title = body.name?.takeIf { it.isNotBlank() }, + coverImageUrl = imageUrl(body.profilePath, "w500"), + ) + } + TmdbCollectionSourceType.DISCOVER -> TmdbSourceImportMetadata(title = "TMDB Discover") } } @@ -153,7 +168,7 @@ object TmdbCollectionSourceResolver { fun parseTmdbId(input: String): Int? { val trimmed = input.trim() trimmed.toIntOrNull()?.let { return it } - return Regex("""(?:list|collection|company|network)/(\d+)""") + return Regex("""(?:list|collection|company|network|person)/(\d+)""") .find(trimmed) ?.groupValues ?.getOrNull(1) @@ -193,6 +208,7 @@ object TmdbCollectionSourceResolver { ) ?: error("TMDB list not found") val items = body.items.orEmpty() .mapNotNull { it.toPreview() } + .sortedFor(source.sortBy) .distinctBy { "${it.type}:${it.id}" } return CatalogPage( items = items, @@ -213,12 +229,35 @@ object TmdbCollectionSourceResolver { query = mapOf("language" to language), ) ?: error("TMDB collection not found") val items = body.parts.orEmpty() - .sortedBy { it.releaseDate ?: "9999" } .mapNotNull { it.toPreview(TmdbCollectionMediaType.MOVIE) } + .sortedFor(source.sortBy) .distinctBy { it.id } return CatalogPage(items = items, rawItemCount = items.size, nextSkip = null) } + private suspend fun resolvePersonCredits( + source: CollectionSource, + apiKey: String, + language: String, + ): CatalogPage { + val id = source.tmdbId ?: error("Missing TMDB person ID") + val mediaType = source.tmdbMediaType() + val body = fetch( + endpoint = "person/$id/combined_credits", + apiKey = apiKey, + query = mapOf("language" to language), + ) ?: error("TMDB person credits not found") + val items = when (source.tmdbType()) { + TmdbCollectionSourceType.DIRECTOR -> body.crew.orEmpty() + .filter { it.job.equals("Director", ignoreCase = true) } + .mapNotNull { it.toPreview(mediaType) } + else -> body.cast.orEmpty().mapNotNull { it.toPreview(mediaType) } + } + .distinctBy { "${it.type}:${it.id}" } + .sortedFor(source.sortBy) + return CatalogPage(items = items, rawItemCount = items.size, nextSkip = null) + } + private suspend fun resolveDiscover( source: CollectionSource, apiKey: String, @@ -312,6 +351,21 @@ object TmdbCollectionSourceResolver { }.getOrNull() } + private fun List.sortedFor(sortBy: String?): List = + when (sortBy) { + TmdbCollectionSort.ORIGINAL.value -> this + TmdbCollectionSort.VOTE_AVERAGE_DESC.value -> sortedWith( + compareByDescending { it.imdbRating?.toDoubleOrNull() ?: -1.0 } + .thenByDescending { it.rawReleaseDate ?: it.releaseInfo.orEmpty() }, + ) + TmdbCollectionSort.RELEASE_DATE_DESC.value, + TmdbCollectionSort.FIRST_AIR_DATE_DESC.value -> sortedByDescending { it.rawReleaseDate ?: it.releaseInfo.orEmpty() } + TmdbCollectionSort.POPULAR_DESC.value, + null, + "" -> this + else -> this + } + private fun TmdbListItem.toPreview(): MetaPreview? { val media = mediaType?.lowercase() val contentType = if (media == "tv") TmdbCollectionMediaType.TV else TmdbCollectionMediaType.MOVIE @@ -362,6 +416,62 @@ object TmdbCollectionSourceResolver { ) } + private fun TmdbPersonCreditCast.toPreview(mediaType: TmdbCollectionMediaType): MetaPreview? { + if (!matchesMediaType(mediaType, this.mediaType)) return null + val title = title?.takeIf { it.isNotBlank() } + ?: name?.takeIf { it.isNotBlank() } + ?: originalTitle?.takeIf { it.isNotBlank() } + ?: originalName?.takeIf { it.isNotBlank() } + ?: return null + return MetaPreview( + id = "tmdb:$id", + type = if (mediaType == TmdbCollectionMediaType.TV) "series" else "movie", + name = title, + poster = imageUrl(posterPath, "w500") ?: imageUrl(backdropPath, "w780"), + banner = imageUrl(backdropPath, "w1280"), + posterShape = PosterShape.Poster, + description = overview?.takeIf { it.isNotBlank() }, + releaseInfo = when (mediaType) { + TmdbCollectionMediaType.MOVIE -> releaseDate?.take(4) + TmdbCollectionMediaType.TV -> firstAirDate?.take(4) + }, + rawReleaseDate = when (mediaType) { + TmdbCollectionMediaType.MOVIE -> releaseDate + TmdbCollectionMediaType.TV -> firstAirDate + }, + popularity = popularity, + imdbRating = voteAverage?.let { ((it * 10).roundToInt() / 10.0).toString() }, + ) + } + + private fun TmdbPersonCreditCrew.toPreview(mediaType: TmdbCollectionMediaType): MetaPreview? { + if (!matchesMediaType(mediaType, this.mediaType)) return null + val title = title?.takeIf { it.isNotBlank() } + ?: name?.takeIf { it.isNotBlank() } + ?: originalTitle?.takeIf { it.isNotBlank() } + ?: originalName?.takeIf { it.isNotBlank() } + ?: return null + return MetaPreview( + id = "tmdb:$id", + type = if (mediaType == TmdbCollectionMediaType.TV) "series" else "movie", + name = title, + poster = imageUrl(posterPath, "w500") ?: imageUrl(backdropPath, "w780"), + banner = imageUrl(backdropPath, "w1280"), + posterShape = PosterShape.Poster, + description = overview?.takeIf { it.isNotBlank() }, + releaseInfo = when (mediaType) { + TmdbCollectionMediaType.MOVIE -> releaseDate?.take(4) + TmdbCollectionMediaType.TV -> firstAirDate?.take(4) + }, + rawReleaseDate = when (mediaType) { + TmdbCollectionMediaType.MOVIE -> releaseDate + TmdbCollectionMediaType.TV -> firstAirDate + }, + popularity = popularity, + imdbRating = voteAverage?.let { ((it * 10).roundToInt() / 10.0).toString() }, + ) + } + private fun CollectionSource.tmdbType(): TmdbCollectionSourceType = tmdbSourceType ?.let { raw -> runCatching { TmdbCollectionSourceType.valueOf(raw.uppercase()) }.getOrNull() } @@ -370,6 +480,12 @@ object TmdbCollectionSourceResolver { private fun CollectionSource.tmdbMediaType(): TmdbCollectionMediaType = TmdbCollectionMediaType.fromString(mediaType) + private fun matchesMediaType(expected: TmdbCollectionMediaType, actual: String?): Boolean = + when (expected) { + TmdbCollectionMediaType.MOVIE -> actual == "movie" + TmdbCollectionMediaType.TV -> actual == "tv" + } + private fun company(title: String, id: Int) = CollectionSource( provider = "tmdb", tmdbSourceType = TmdbCollectionSourceType.COMPANY.name, @@ -391,6 +507,7 @@ object TmdbCollectionSourceResolver { private fun movieSort(sortBy: String?): String = when (sortBy) { TmdbCollectionSort.FIRST_AIR_DATE_DESC.value -> TmdbCollectionSort.RELEASE_DATE_DESC.value + TmdbCollectionSort.ORIGINAL.value -> TmdbCollectionSort.POPULAR_DESC.value null, "" -> TmdbCollectionSort.POPULAR_DESC.value else -> sortBy } @@ -398,6 +515,7 @@ object TmdbCollectionSourceResolver { private fun tvSort(sortBy: String?): String = when (sortBy) { TmdbCollectionSort.RELEASE_DATE_DESC.value -> TmdbCollectionSort.FIRST_AIR_DATE_DESC.value + TmdbCollectionSort.ORIGINAL.value -> TmdbCollectionSort.POPULAR_DESC.value null, "" -> TmdbCollectionSort.POPULAR_DESC.value else -> sortBy } @@ -449,6 +567,12 @@ private data class TmdbNetworkResponse( @SerialName("logo_path") val logoPath: String? = null, ) +@Serializable +private data class TmdbPersonResponse( + val name: String? = null, + @SerialName("profile_path") val profilePath: String? = null, +) + @Serializable data class TmdbCompanySearchResult( val id: Int, @@ -496,6 +620,47 @@ private data class TmdbGenreItem( val name: String, ) +@Serializable +private data class TmdbPersonCreditsResponse( + val cast: List? = null, + val crew: List? = null, +) + +@Serializable +private data class TmdbPersonCreditCast( + val id: Int, + @SerialName("media_type") val mediaType: String? = null, + val title: String? = null, + val name: String? = null, + @SerialName("original_title") val originalTitle: String? = null, + @SerialName("original_name") val originalName: String? = null, + val overview: String? = null, + @SerialName("poster_path") val posterPath: String? = null, + @SerialName("backdrop_path") val backdropPath: String? = null, + @SerialName("release_date") val releaseDate: String? = null, + @SerialName("first_air_date") val firstAirDate: String? = null, + @SerialName("vote_average") val voteAverage: Double? = null, + val popularity: Double? = null, +) + +@Serializable +private data class TmdbPersonCreditCrew( + val id: Int, + @SerialName("media_type") val mediaType: String? = null, + val title: String? = null, + val name: String? = null, + @SerialName("original_title") val originalTitle: String? = null, + @SerialName("original_name") val originalName: String? = null, + val overview: String? = null, + @SerialName("poster_path") val posterPath: String? = null, + @SerialName("backdrop_path") val backdropPath: String? = null, + @SerialName("release_date") val releaseDate: String? = null, + @SerialName("first_air_date") val firstAirDate: String? = null, + val job: String? = null, + @SerialName("vote_average") val voteAverage: Double? = null, + val popularity: Double? = null, +) + @Serializable private data class TmdbListItem( val id: Int, From d031f22012055317d1c20fcb74ece4d355224d73 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Wed, 29 Apr 2026 23:48:11 +0530 Subject: [PATCH 048/143] fix: implement catalog resolution logic for folders --- .../collection/CollectionCatalogResolver.kt | 43 +++++++++++++++++++ .../collection/CollectionEditorScreen.kt | 10 +---- .../collection/FolderDetailRepository.kt | 11 +++-- 3 files changed, 50 insertions(+), 14 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionCatalogResolver.kt diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionCatalogResolver.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionCatalogResolver.kt new file mode 100644 index 00000000..cad93b34 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionCatalogResolver.kt @@ -0,0 +1,43 @@ +package com.nuvio.app.features.collection + +import com.nuvio.app.features.addons.AddonCatalog +import com.nuvio.app.features.addons.ManagedAddon + +internal data class ResolvedCollectionCatalog( + val addon: ManagedAddon, + val catalog: AddonCatalog, +) + +internal fun List.findCollectionCatalog( + source: CollectionCatalogSource, +): ResolvedCollectionCatalog? { + val declaredAddon = firstOrNull { it.manifest?.id == source.addonId } + val declaredCatalog = declaredAddon?.manifest?.catalogs?.findSourceCatalog(source) + if (declaredAddon != null && declaredCatalog != null) { + return ResolvedCollectionCatalog(addon = declaredAddon, catalog = declaredCatalog) + } + + return firstNotNullOfOrNull { addon -> + val catalog = addon.manifest?.catalogs?.find { + it.id == source.catalogId && it.type == source.type + } ?: return@firstNotNullOfOrNull null + ResolvedCollectionCatalog(addon = addon, catalog = catalog) + } +} + +internal fun List.findAvailableCatalog( + source: CollectionCatalogSource, +): AvailableCatalog? { + val declaredCatalogs = filter { it.addonId == source.addonId } + return declaredCatalogs.findSourceCatalog(source) + ?: firstOrNull { it.catalogId == source.catalogId && it.type == source.type } +} + +private fun List.findSourceCatalog(source: CollectionCatalogSource): AddonCatalog? = + find { it.id == source.catalogId && it.type == source.type } + ?: find { it.id == source.catalogId.substringBefore(",") && it.type == source.type } + +private fun List.findSourceCatalog(source: CollectionCatalogSource): AvailableCatalog? = + find { it.catalogId == source.catalogId && it.type == source.type } + ?: find { it.catalogId == source.catalogId.substringBefore(",") && it.type == source.type } + diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt index 1a7bdf04..a47e36ab 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt @@ -111,9 +111,7 @@ fun CollectionEditorScreen( val genrePickerSource = genrePickerIndex?.let { editingFolder.resolvedSources.getOrNull(it) } val genrePickerCatalogSource = genrePickerSource?.addonCatalogSource() val genrePickerCatalog = genrePickerCatalogSource?.let { source -> - state.availableCatalogs.find { - it.addonId == source.addonId && it.type == source.type && it.catalogId == source.catalogId - } + state.availableCatalogs.findAvailableCatalog(source) } FolderEditorPage( @@ -757,11 +755,7 @@ private fun FolderEditorPage( } else if (addonSource != null) { FolderCatalogSourceCard( source = addonSource, - matchingCatalog = state.availableCatalogs.find { - it.addonId == addonSource.addonId && - it.type == addonSource.type && - it.catalogId == addonSource.catalogId - }, + matchingCatalog = state.availableCatalogs.findAvailableCatalog(addonSource), onRemove = { CollectionEditorRepository.removeCatalogSource(index) }, onOpenGenrePicker = { CollectionEditorRepository.showGenrePicker(index) }, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt index decff7a5..36698b25 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt @@ -150,10 +150,9 @@ object FolderDetailRepository { ) } else { val catalogSource = source.addonCatalogSource() ?: return@forEach - val addon = addons.find { it.manifest?.id == catalogSource.addonId } - val catalog = addon?.manifest?.catalogs?.find { - it.id == catalogSource.catalogId && it.type == catalogSource.type - } + val resolvedCatalog = addons.findCollectionCatalog(catalogSource) + val addon = resolvedCatalog?.addon + val catalog = resolvedCatalog?.catalog val label = catalog?.name ?: catalogSource.catalogId val typeLabel = localizedMediaTypeLabel(catalogSource.type) val genreSuffix = if (catalogSource.genre != null) " · ${catalogSource.genre}" else "" @@ -188,8 +187,8 @@ object FolderDetailRepository { sources.forEachIndexed { sourceIndex, source -> val tabIndex = if (showAll) sourceIndex + 1 else sourceIndex val catalogSource = source.addonCatalogSource() - val addon = catalogSource?.let { value -> addons.find { it.manifest?.id == value.addonId } } - if (!source.isTmdb && addon == null) { + val resolvedCatalog = catalogSource?.let { addons.findCollectionCatalog(it) } + if (!source.isTmdb && resolvedCatalog == null) { updateTab(tabIndex) { it.copy( isLoading = false, From 2fcae7605942575f9f2620f83116ecbdbec41d12 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 30 Apr 2026 13:55:49 +0530 Subject: [PATCH 049/143] fix: update quickjs dependency by using forked aar. --- composeApp/build.gradle.kts | 2 +- composeApp/libs/lib-decoder-iamf-release.aar | Bin 408633 -> 0 bytes .../libs/quickjs-kt-android-1.0.5-nuvio.aar | Bin 0 -> 1730643 bytes mediamp | 1 - vendor/mpv-kt-upstream | 1 - 5 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 composeApp/libs/lib-decoder-iamf-release.aar create mode 100644 composeApp/libs/quickjs-kt-android-1.0.5-nuvio.aar delete mode 160000 mediamp delete mode 160000 vendor/mpv-kt-upstream diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 5136bd9c..73a97208 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -272,7 +272,7 @@ kotlin { afterEvaluate { dependencies { - add("fullImplementation", libs.quickjs.kt) + add("fullImplementation", files("libs/quickjs-kt-android-1.0.5-nuvio.aar")) add("fullImplementation", libs.ksoup) } } diff --git a/composeApp/libs/lib-decoder-iamf-release.aar b/composeApp/libs/lib-decoder-iamf-release.aar deleted file mode 100644 index 741d9e3f2b8931623267e36641bedc7b1a15680b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 408633 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"~0wM{4U{H~F5>O}5pf;k;4BkTkQPN|4jNqi_ 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
@5j{Gi=ZTx9bRY+F)f82s=7-{W9!5ph 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%0DM~|yPkJ91(u{|boPKAn?D+w8MH9B%m)JN^C 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

#zV4~0Z+hAJ+&$*b-ieb_Fk@4EC_Y&RX=F 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±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 z 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� zNpbz9>G2Di#FYzb4*-5A7{}ElS^=&5Anb`A}te_-`kJcGy}ctIMkfbVrg?<=<>-l zi)y{CS_@i#T1H4su0s4>=5dEZG#J-)%;(AZmVQzc5f z>#?P!R9J_D3F*_b>gY`KU9--iemz0z?eZCL zi5aN5>Kvr*W6Dco?Y1R)`rBAayP6{0v6N~lMRz1t@@I+PKhu8qCVuZ8{k=Z%dwrsO z;&)NvcU^s&U;DOu>|1#3ThY4FZ@9v6AH7eAz#phPVk!*RUHbNe zn00+g#Wo>#Kb$kQEy%et17cjJ-GUOB*?^vNl(4Y@L_V(f#4Z_6O6R8cS;# zOM8ASt#vHzrLnZOu{3RWi`CtoA%1gpH0dJzuG4-y?jVju=UQHVc|FE@c>HBeQpz1I z5!Bhk?wICBdwT19fWem-*-lN8+!`%~Q#dMJc1f;Y4VRN(L#1WY5koEDxaErJ-z0aL z@R7nf-&RP6#Z#krW?MXrXE{(eP)=Z@j4sK;`oFtuO`>d?!p*4iuz*<^g|jwPY8naX zLjd3E(fhXsWp&Ml-7I>*C`qFv_s4XR)PF{I8J~;q_=}|DXWrSskw3$KroV?RyFZEg4 z(C<0P#rSfIq`#fvBJZL{uB2c%J5SYsZ10n^6hqOnpyjXVcK~anwL{IbF3H-a}w(7BV1ARInkx2K| z=D4IOjT7n4r6qONw#^m0XwK80$x}zj%J8I}>a@mMBpKnLX`N}2O`Q{5OMeS&l+O`o|3__a|N6^+cEQd#~ z@Ru!d(WG6)>bfQ+)-^Avt!fcQT!&ei#D&o3{GxY*SEvzrK9kSKw36mTNk$>we1Xik z@7%+C%wi3-*gunh6Z^WyMT_9u)>wCsR(@WhJVr`SZ81D$^Rv^?bAk0~+`TDdyBAbr zkXhS4lT$}@d@k(8f{T0ci+!%^)dM?D^Pl$$xC7%_SC}} zjIAGu-#>C8zJ`s(Z?(kY|BPLTpP3wsA3k#-ex*GYH#4z#&K*cEZD|LZ#A=P|nH}y$ zM{dBEA@SKdrZ0v0p!^2lGFJJys8i1@&_@pHekA;Iadt3ED3R_h`#SVR{ldK~>vkl{ zA|Ev9*F~Kivw(xLw+g>l%#D>z7bgj%;O~*g?n@4BuVW$q7U8izYpNl%LMh>ioivB# zYhpwsJlo!o@M-X1dlOx|q&X3pfNO47(rioguITe#_GhG+NUh$E_2_HpDK8r#Nq|}M z#seLdHpnEs7kSS}r29DH;D(HHd7n|2bd2!2S!7_Vmzlq6aWZP_7`;-Xx2LBm`<~8K zi#Hw7MHvgDdYmMAZJ7+VbB|HF&p>7yhOFny`wY;=O;ezi*|&FDqed$;XVqeCs+{B7DpL8Ask+hw)>Z-T6l_ zss+ICJfQBb{#Vw7L1q~z-KQrr^g}6Mm-p#)mSZGeH=FB9i5gRwE1z_qI?8!GR5~y* z%2@TCI*DPHxEuRca%X$61(JV8wE;&R8UsMv1&TLe?f*?p?XX-DN4+1-e>mDzkvjK) zZNocCuMK0hZuV=DT5J6VRYxi;Pafv$7`s>T*-)-(JAigoq6K-nWI6#(43is{-?-rN zbJXU%3uyU8(t8orv$bfj<2y;ifd+gfsY{`wdf*&|J%v-td&sQk6+PgJlN(%0=G1D5 zV@v^^J$KXex|3^INn~^-_6;kQnyINJ3QEf9z_h)yDpWE z#tuMT?bZvZjj!56iF#TpSdoe@QKLoj#fjLIPR(QWhJJa@1&jfuJK<2R>ZJp?Zen8H zJ{?=PCq_Q*X;AGMa;wHuX7|R5DO9s*09?17eSt`KDK0-l`9y?)KdK%_>>|74kkIHD z7h+n>LPs5mFt##5*OETwr5q*w=y9dNCCmTVmo8Qbj{R8H`!iQPTKeEx>UJ70i2~2T z9bY8)p6uE@PBn3!lH-TS8XyCO$zFY#s!zW{+MFwAO+dNC&FWjS=>8la0bJ+ z#ekvz!@k(?_K#skRj~|lhhR|q4$Bu_J5|hvSUbsOMb)y)el*O^hw}52s3PwjHmJRB zi;Vi=pIAi-H4LryaleO^{1v-L)gd+_?q92LfACWF8D_Sz`-;goDyB(1^f+mdS)_#c zx{`#Yfc}ywDQv)%@VUQ8s)D&40w&-A0q@JR&|7AL8sL3ZIg^9qsji3%vPJq(#`XVO z!HMJGlM!w3$=BI-X9HDo{DP4d*YS0A@V)bb4tAvkaCe`)HpX9aThZ21f?3(1ztzy! z_0wW;>whl9=jX)YHbJ9B9&Ep#uC6+vT-`c_ZmdZ8gC)wDed?>93he~WcU&<6Px1~> zj)&lXayLqESjv?wSGcS9LLW)O>+XAlrV?i1*P%}!uhBj81cMR8_^O=#*%%+pt(17o z-Q9}KIgRdGw^Au|<_OHZ9M232u$~#HXNs#mx!wNyq`KGLx?qO-R+cSp6G(Aw@ZUn? z>>Gn-VF2&~lXktZzlU+6pPJ>=l)DUe;x>R>H-=!0HXQHUJria#A%=H}?Z64n>}LOp z6hy5B0FTSwsr}%+>Kau>il>2+v*iJ~aw8m-Zo? zk$SrRha(UD6!-uB_7pmCiRlmH0UqV3wgGH&mcYD-w#-ZJYTM@W65%WP zPlHu{W{1;b0@~nO>4wv#6#!>=Emk$V!*EHDI(6^U`$(V``pJO*q{!Au>M$OXop^=D zRHn!Tx5)%2jSDb*L#6lCMUtfteT;RKd-0Wo0Hp-KUIF;QpJ;ehtDEa=5s2h+wMV_x zwot9WOQhoYXcC(qwV)pyiMXtR$@fm)_NSUR$_aa*-QwFv^=VURC~Rm%3}}KATiy4tP6xM*i8_sl zrxs9OWyfAUZLeEMJIW0aFN0KPZLdD^Fv+W93fWBu>+yAKu~O8)&S5tgDPXGEm5OQh zRL@NwxK%8B_uHN{eYr}tF051S_MKA&=E|uaX2C#6<8FDt zY~uhn$UP{}#5FKbGVPBEZ}OR{H+jxsJ!*2;fLUEgDQ}@bMOe~k@qevUHwCKCDP`qi!>g`=>KShwZwr^ zuaqI~Ty5Zf7je`ENWNH(GQHdB9cQQBkRBl^u7OFeJNtAxtn=ftjwr8x%f$`p&(A4$ z4Gho!b0iIJLTw;_$S}YHwUib~ValU~C9~Ke{aO1E+|NE8Qya(~GDPw2Ri7g+(wE~h zm3v=lsH{BClzp9uE*kD4Cfcp!kkPmMz3SV2h3zgs+QWWDn(M{`-oGEPT1#b$ zpE&La633mvwl&>KCSjaL>LPz}4YLLu9Mo58A5)b{@mmx#+PJg~;+x3KAo_xRbdcR? zju1xI>~oieM&m@?EPi**dj`?ZVDk6mt{-%$8t8rUZG)o`lDL-qOLRbLX<34sxK?_z zA6w~9w9=PorBLK}o$8~2aXPMhF2-JWX*o*EsTH>)#;YPxcI@>;r`$2;fOpj7T;u!#qYXJqlF%Uo3N#7D&3y2 zkGH6@nftvNExcqibQn@Q3BLm9>yxT|JlYwtf9aFY4Wk8HGSF-dA=E4YzG)U=T4dB$P)cSq${|%#D=0UH4R;m6-Qz32Yuz;T6?W_;|KI&{& z(NPbrK(Vy-%l;9x5%_LjW?}gi#V})aQ1iQt{)Ai0HXLyzJj@jV4VI$r75YNGf?iE8 z*4B7{$CTUp{@I}IIzuYyGodooA8VidzeK(F?0KF7&|~ zmMc{Y220D7Z}@&lN}Qe6(--SSE~z(N`ESp+Tf}vmqFlO0p(C1~;jiR5L%PI_^~yUv z|N0R}vXg;kPKm|m->T7S9L=g?UY?dXA*^o#O0|S11_6@*2i@^XYt+o>i_(rTSDfo{ zP=kFAJt03Gi#v2(rK>USG$Vc~Kd5B-nWz8T!#g5D_A(y9F$t-*Yo+<8Us}zP7vR5V zwRScSw?9NbS2Bzzl-lOo^3fyHcDM^Lh5{m7=ew=%VUNBUy={2!Hf@~gFb1bPQbNoX zxAiTlLAsa|N52Dq{Y3UL$3`^BWsXmW>M+BLCr)p7v@jrUxq~9agNZ&*mIfOk!D)SNfy1edg_F1=gDrM0@6E8Vzkt z5~G8A>#L!}zL0(5nGiTe*Rb(yJWdx)^TnawV6~5s00+=D)-2hH{0wCzZm!i3=zxIvjK<4jXzEI@DwIywd|% zq=4D+tf=~0!RXSiU%AJk)&NHXx4)qj?%<&TBO%4sfHjj86w!y(@(+oJ6px|1oh7{+PH2e^l?mA1}EF7(aWNnUSU%Z&C7U z*dgQjS>?-=JdZJAHrQtwk0wR#*S#O*jXx5GTyx5A_AsSODz@Z=LMNd2G?7G_nB@wW zgAu{GPl-Q>{Dx~8$BaSyA%V(-A_~fYNKaw!)}ury%9B--UjOOqO6LD zS5RgL&h#gKL0}x#5Zh8jUlvAnT$vrld`?tXP-N!KqGd(;qioA^I+|~%C*ZcdrbaB* zw;;Z~t|jM^ScOjdg9Nrd6gCyA9{d1?>4Ca=?#s^rFMk22RpS|$9i4OwMLX-Fm)Vvt zW_n)6Ikb7enZL|+p7gHt(h``YCcX=k8+W%!~odRCHN!3 z`-~y<7QHa>ULKe20rZe*j5222>4)`pm1`}A9nkxoewUxXEYLRjQIA=4(f`Va<5=E4 zdJA|>O3|tQv#Ih4qI&e2IEenmKR=z8gp}iWaa8llf_z)9saPM}ynj@?NiSM*FX})M z{+-h#34QWhE8X0Csa}#A9~?(>f&=bJIcpd0v+XlSj3dMGn4Q9##E-2lPv-?pTt=cDw*S}2iIiSj& zs%MVh_O`MoM>*HzHWF{b>EU+Bk+?fE$)wI3={_ksr7`k~#`8cjw5HtWhsZ#A+>Iv%Zmr$GY z8fjm@Rb*ybx-pUxlRiPQInyeb3dZ@MJL&GPL#=|NqSZtA230<=t6fh&u4<;n=^8hY z?K`3PyxAf1OVxehpD#u3$;-nYn=fdmqespd=4f`yhnK)ro=#GCX46Ty&o-c_fuAy| zzC8;YtEC&A)zaKKq_36$q~O{B&#`^LPD&p+Z5056=a7ia#!Hg3rksm3vMUts-hTjQ zsqVAYb0=Pd+m?2O6ig9GKEs=L9}b&c4!RU@N7CbQ`T3ZEHd60?gZ=M4Xq&J&hJCsl zaTEq>a&Ch=b&cfg_fv#3&^vQj;am3&H4On*`^yibQ8%-_jlZ<0V7c-+{;A5|$r7g->xBkEq zWl|1ik-T457NL@H&kdr<^tx@!-X*gos38@5qZunfra$}#BSh8-Z zV6JwoW`P?KLn&D=ioaOW7G+r+{dMOLFWyw~(fN-So3;bJ(O#Cbg))w|0D4KdZVEd? z-@Qt)+end}%0Yw3I2LysTlB)MiKPCiL}frreC05}7PSJ+O4Dv=R)cj5?Pag)U}cy+Fna)H zX|Jo*EvVbQS{YdOuG@@SKU1lrrZ9}!88pt}IsdiJ84&O7{{BBcpJC3Nv(J94z4zK{ z?Y-7_k+E1pnh!^nC55EURPH|wxwEeYT&zoRu<-VT_k$MJMDGAz9Yx#rrOG2~CJgWd zmoICM9W?)Y3iZ)f(xQH`Yh20NLd?%aF~5b-!h{7MEY))gh%DxV+W+Z&Tn(N_9%-B) z!LuRFem*|0oPEKV@h>Ok=^SZmCr|TWwKmrp_ea(Y`#0aAq%c2v`LyW;2{@gcQLHIt6p1Yt{QPAV#>UW>AY()F#7WLbm zyU%XvZ4`GJ9dd`sG3USpuSG#rfJ%!b-`wB_5y)hEj8>bCR@b=t1Zyj|f z!+R0;6^a21`8w!i@f5pP{iKHkET*L`b35M5V1toSpLD#D5jAdUx1g?=SE7`f?inD4c+f&W>JCnj%!Y{ukbEfTkX207UaFP9h2+Y^Je;B!_c-&cq+nVqcIk(dRT0b&V8GkBK@6E(Py%`_w&B6VMwSTgKk&@20ULXmLq=OaC#bKmrYuJiVU7R>FBtv2DbxbcblUo?B1 zF>;1%vg{zrur7VYoc!C-=F^q|n{ZFCvl8vVZ73n(Qmi+HKzO3*h+z`$ylUl=^ zEZXmEe|NPtz*_QyBqAxuli83)0In&Fov9FiNypd3{8UrBg_t&51Cb=68lDrenr}N^ z!B@{~zg-fZ-P_($dQ~@3Du*HdKUZDYvA=Xr`*Nb+(_;d_Le&1}iVp%rC=U|zij+Jk zI|u6LZT( zywS~0v2>g7j_77rN4#`6QGDs%d}n*Z-5&%5y_80AcH8>94<{`Tyv~kFa0M9N*`8kp zbuhzIq2%0`t8w3bD%9e!)^|s~ls^<&HydU8aCz70*4yy87}k&0;Q|Y%ZJDdq6 zZJxVb0W&wdZL{#aP|#M*A(}8y#VR(Iocm|RlBA*zdqGqClc{$HIE*Ztm)}u;J;{K# zCw-N$IzJNL89HpJ;A)GFo!kCDxu14aEZ8vevUba=ruJ8u+hJ6|JB|+ngjoYL6ZbRe z`dR9fkpZ)1PC$sbq(yjfUdQ5P>Ws2bidv;MdH#k0=bew{U@$Q93*j#g??4xT7$@aE^lHM%9{_aAZG8kIax>D5Z1gL#M49XDGLv5$e#N z8rN2sQ{&h=oKbki;MMbZ#o^VPL*K<~xcYF0QhH`D$imHj(K(yO0_=x-3qKu++;hlNx1H-+y(+-6?4c5cxFTif%he=x zhGPE>Bq7&>BUeE?b~ds!YCE$d>ZzHExy@2Dq}DR`e2nrE%^>*gxRkS{@0K&{y4trCO`{Q8!2fDMS`*R*EP7q_O8< zPe`|MQ=+w4kk$~3lMAQ5w%fo6U%R&_)Q{(TaWT6Ct$gBjEt0P$x;1o*`lM!}MpRD2 z2b2%vxA?wa%m}SCX%UQhKF+B4hDATt?o8#~ zR!C)zi&8rutaa!r9@`+(_A`W*(E+9 zyV%D_;?o$t!dz|M?vh=ja98N^{X&iiX#@gX-NQ&zsbOty*vrk3#gWs{18S~l$6bPj zUh>{Wvc>jAhqg)xFs$p8W8TgN(VpdVC(M;^Qv{~i`B0n4hy`P0#v%D$4TxkUXctNP z6`nNH2q)(EDCCwj3C5H#LGUrQ?=-82+XT|fCUysraR*k_jMNw6JsLRu(}9A|b)oJ1 z$U#v=&7kja@)F~F!w4h9YF(M3KF~$a|^*Hux8X3vc#+bit z;h}F|%s1qWzx{sC1BE3_+StW9Xuyyv7GXEC00UJ1xp%Z~RpEMyR6QYIJDP zhX)J2Mclr8nnrV}DE|fWT><%5xN|A7VP4a5x6~6E5V(0o=KcKkD5${|nvG(qI|Gs8 zC%$GsV`HREVQZqtMikvzM-njFi#H+S?y^jl4~k-#UUz`azh?jS15efQlKwa5K?6C); zYS=dzTdIN9F0E_j*guES00ZjcKGcw7j>PE^knQelx|R0ZR!q}*-p2!&ex~q#rC}-j zt`-!^{>lXFyLA6nKYjAhhF zWVUg8mGhjZbi0Rzc|R)!^)uADj3^bXa$D%fmWG>&;vgmGnr?U4Q3gD9`o?H+l{_6zS&)uJH_1Q`C$vJF+=o$q z&1uE5nO0G>pqX$O?P%x1XmjW`)AnW}&7q%b_Uf#Jaf|xnk;c23De+}@uVki9D-{BS zC9s}cQFhu_UrucOnEXwCvI%`jr_dsbtGTs#xQy3BWh2_G!;NvPaw%&spj&lJN7Esx z{G_@s#K`yrqc{!Vis?A0dBuqN-;aYT0fpv<+zke1>G{ZYS-$g_rOp0fkvLYlEU4AJ zoDb1ZO}=CqzZ1P|R=f`>&!w0#j_Xjvt{bglVaCLsQXl9Q>yihovVZW-P)?l^cHkaJ zbSJTY;%(NFJ(U#gMPeWy4kQyjAKL}_Y&fMZ?zPCQ9&=P0xX*4ltA5{S28~Yw85OiF z<=xKbF`nHFo_s!?C!=Q=d&@#ClT++7*M3)Z(FFd;kO^k5bpr35B~P1>(0K8L>Anps zzk2Vo@{*4G3qkg~B#(crk~Hr+!uG=rI83hXuC?Uu96-pTIC%Ke4E z`!a!EqvhlvW4bkHHh&agg};DCF>K$4awf2sTjIXmnN<+wo3BlFLf#;~y&5F5C_R>&sPh8E3_Phm+Q;CTUz&N4cbj2*BZN8Su>fhzoyL>g zLp`AnruN&E3$!e3(au+6bUTb}m$0vjvODsCH*KP-`iQoDSF@kpTGA0(^#SN+hytB- z_{uqXw4|eNHPW}bkC#i~H(p=TXIPJ2K4|S*6t*3kp==G5QrttW0ov^$dGxs2)kW+l zybsb{nwdn{(+@JXN@wi3{IxbO##E0mjr!py&2F7vl<14FFYw{1CG`?%G5tv!D=ok{ zQjVeJ`v&4`7&9K$vD9@%r+qmxrl05~X@8<*0(*ei>@*SOuxm;>I&S~6UEmP2dci42 zWc~nV^`=3X)hPEyHTn{a_-}c7{Nz@3SIC?xc$te%wzA9{Mf-dpg>7Bml1CRqFA^n1 z`-_g(dlqUrA8Y9txri&gkR#30h!hF@NOUk$uP8g^Yi@ZI`lIZlp3t#iPiXQ~V@{#H z?Yf5HG=u&pPM`xg(57B-3Nusj<&@*u$=v@yO|5cA0Uu&kiYp@D9V1PZdswqA4QDDQud5_(dN>m^dLpS_8%zE!u+%QYl_r#mJN+DAA+7iC$YdpMpCJKG1ge_)}P34#%92AQ^nMS=YL9 z!_k*p)B_=@0F;b*Uan5GdxBf370Y7f^S-U z=80x+MY7o&q3eJx>MN){PZ^=dZ8qAAahvg^?4-J-=ZltGe${zP{(9goi;|OkQ7?Vp zV5Nx^{j6BU8LHlezLDtn#)v1>TSDv`sT3p?X4-(H!oxh{4uBS8pKWD>7Hf?VM*pyFC9DZTv){Z3 zcdV8*7+%%lkqwEngM=gHbCVGT`=n~^sYtpTG%RkP!Bc@7r@giu5q0~0m7l4P*Z@vI zvA=Ahi;KxvgU7{HkEvlCPURU-H62~o?3d7&Y!Z}aUNZ8zs=ERNq-tg?8K2M?Mc0_v z1H;nesa3X@$5UUG^A=>rK8+5ES<>1(lI`l9c_W1ZB@VPH1<%J%isBh z_09gFJJH7MN-vJ8OB=+%SA^J7Xo1@fbZzV=_5z<+6Jw7(h)*m#riGup3r{XTaIx32 z!%i(P_NX_6DunDGAdO|r^JtHR`05y6nthJj%x`K@*Mp37vG)?1QU^~eRyGKA5zqG{ z>YE`Q|CDJnd9GDe`Xc21XM)7T6Y^X@{aqvWDRjgE^qBdk=uMv;^ucSO78iArv2it) zLA+cF$MKq>e9+pTDy4Hh$ONxX=81cf5l4MpJ;em=<$0HGqiaSP zzYcmP(iv191*;cH@U3#^C?wzMZTOw6z4u^k8;M!y!xmzUpZed)brlCO3Ilp{lNFpo zwcBJ&a|5Qa&LP>}Rpp!D_q9Gpxyy~dEAK)+R~=;C^C*+cmKo7I7f?>g1pcs4myMla zo7@?CoX%XGue5euBpY`x8g#e0Yoa{ZHua!xn>r7kc)PGgW8i7BV>6UL%7>^!rS5R8 z*A72u#Cy_DGgh!l8>}1?eMU=;tG=Fa)Ori<|C!~%ExcaS5x^f|>5qOhXRI9ptQ`Wj zg>wQ=;gtEHr(#6bRN$1y)i-(&yYYC-A<&fvuQf*7Ic1t=M6y7C`s3>69^6y^wuR`? zrkuJgKBjM7IKK^$VqFi;?6v1I-f`-7>90fDaeCV6h_wYWp>aP7(%#Zz9>4Zn;yasK z4BKoE{i-->z%qNGX1%t>eZbF@pSPfYJt#8$dpbG#o{pF)Hj4HMUID%Zd#QJBGVb9p z?9ISWS<65);;p@ENJCp}j|W>n7ith4zJC_(7wS=@nv_i*gNu^0k9qpz72h7-8=0Em zKx>cZou_h^tU9wbl4QWTe>bewryN-}g%n)n!d+{S5blP);Xq0drWRrxFp?FH2Ai@M zw4WR0k~V)uV!*^Y11D}D8YIpuKrV7BY^8uW%2JA4iLC^2#j3Xv+m7u#??GV7L5ztP z8chzgmWkT$?2qyFTu8kZW;5;sj|V9tM@Ad00SeUjsIQ06{sQ-ik_YXxjnGFXQskui zU}ucHE=->x;kP!zTk-nn%Yr_8s(Y!9h=csO5WX$7*ADViGVHadD_@=wDDJ{V>#fMt zTh!kQhu(_PHijJry_V1z8;oE^`ug|YhWmsG(|nACwglnbw;hw@&iMF%h2#g?R#}6@ zH9tt$AwG-~XG99dINA-cPR;dV1mQ{a&6erPu{M$cz2c&1|9AJ@0Ub#fduKKFi4moD zpl6Ws%ndE`sW8zDW%JK*P%>N1zCq+^Kn?W#7}Z-z`)Oe9Hp)4!Mt1Mg?SSum2dxMg zd%O>6IS1r7vD7%J7Nl62-C?8;sDJ80tG7SB(|nqZY(8yHI&>0c=gTPLfEtvJZNV9r zqamiqrSD+Pn4E?IoTI^bLX&fNvM#${-ur1(rfB_qZimHG7%+ z>zLubmG1p93BHX9Bt3RgjVm8f(uFk%rl6IXu9Tj3yO+7eLf}2Fj~8akE8SNlh?D9A z1u@J%lAa}d;muN#?meK1P4Hecyu}e|^isw#QHw3RJo(16qnW*aCizy}n{zSg)h=bf zRYuE8%zpvl15RRfOjnY_<&;7CWo1mdgN8AwOE$s0|3zCNYy>I7nETf1C7Shbhqb7R z!~dt*pB$e3Q@qSrBXTr(x<}21xp0X-+MARgD$kF1a`s=9{Ud(1j8Ukq)&27uBT}0- z3DvI!Ylz8C+UGooNJ?f>Mb?nnTqRjfnosk3&n*KE;F0^&O$n!ao$MkPanF)($%bxA z>Qe)ADO#`5$zI%HF*wa*mFL$6a`xd$V|73ar#+zujt=GlxpbS+?i6hIRK4Bv+gOe$ zJ3YdB{}5(Y`H8?r-&~GjgP9;MX3Y0dl{7PWXT0g5Lla{Q77~ zTU*5kfe5xN;2*>V?^-8F@Lbw;6z5fn7o^@2u`w~o5a?rR4*dpZSt*^S{Qb9YfNrnr zsbU7DiWrn?y2AP)m38w`VWOaOl)SA&U|vU6N4-Vlg;dBk?%Jy(;I3FL!fc;Q`+Kx> z9iHuQQzqnOR-pYMt2FdY8tCtWbw+<5BcG9cb|3i%_BVq(&8d9rnbT$go`M#<*8^1;U8~MxWE?xcrqUN4b;YIK3eJ)bJ>7rz~Z>LnXwy))kLYTTn4%B@7Wu(viguGSuN(;tz7yd1_d(=Qg_gG7tZSTPPG7rArm-mAdS$MR6G{bit+7#f4$Q7q@V8o`Jx>DEI z3lHFE$ZtleXu8tTCQ<_0D~z*MFwV%bfPY}^U|{W7FHcjvzg>-5eO)+T%wHeVznp$+ zz%qaF;a^U_G4N}_LA1-kbXbS0PvwN8#833jme1RLDr^6HZTAI!IsJ5!ft+XLIUGuO zYM_MZ{t^bopyvl-&}Yg2msKrJ#xij}ha;1QBh}yazeKA4M%Q|+wf7EM&11u>x!jf< zWH`kCxt^kTMRDV|phsOhI?FZ5$Jp-xX_eSl9eA(n!5~SgRK_q{yP5n0zk7yZ6r&sV zm$V&OWxPcchAA6qb8wsTBb+c6k~=Y?V!qo%MF(5GflOCMv~jhJ#MW&^q-4mc%DF7U zrP;{cCmFj_FK6ZfrW)Vv(^}tKuD{6xcYF%oJ>_R=SbON)^0)CUtSLB#aMc(o1@{K_ z_c-2Tt1~HA!{l+*IEKSE?=@WQm(C_(2%cfm6iE4TPgR3Sx0PjU`|al0EnE$;A3QSo zWDbl)C&)>YdP&-Zlg3;yX2P2H`e(uRGAaBd&TTvs-(zj?w5^a~q&-1~!BjiShMaUl zdDD7u)Ia>TvD!~>QO^+I(MNS2jpJeMxtzcKa@ra>_k@!kQ*Y}01Y{d~+jJ!zK4amN z()LI8^8YR`^xGrnP2kD$lRcrWdwN2D&oJW6J_?%rrs6nS6<&QKs^|OJtNT~on0WLxyzjOof9 z{#S#K5)L@}R^9KGy*GBm`>>h}_ulH-C}+|5ffh_i$PdV?ZkO??*?a5g`(?DZeAwkw z?)ESe_Y7N&h(FAmm|q0scbA@DYJ$mh2mTGid=e?4rX5z@ywhent>xBa!A7KoExIS2ge%+SFeZO)ovs{d{UD7eSG?L2`T{0g&y>yK5od-Gm*NwoU;#dJ$a+L%Wptm1 z_M^ht%X4)q_I2SY@nP>lU9KPDvzO-sS2!=#TS2O~>pO^TYHS~|e~$6orLXjSO)_Gt z7E!n^CDOm+L>MFQ;#M)0CuJ!-K|cgz&&iB(u<22{nfC8GU87kaI0Ss{kQU|K6%=AX z${io?WzrlvDjj*INBs!2*U{m)nC^9hV_Gg-hcPWvX`1|D@Qs+o%^wE;7PHd(Vel>e z|C=#RW#u}tO<>!P;tril*WWS6&5&cXFHz5N);i<#ker>i4$lnc0cBQoO*-bGSeq!C z08&>3;eEpRghq@YUg(Y7VbrY+kp}QKQgB&SJdEez~0}J`c=M<$#9mPpgE{ z&wP!$5J!m{eeDQa?fSBjrC6faxWGlm@dxk}lU3IAJSV#`l0f8PjkkUuKi^d!m_NqZ z{x^?l)0~LHk^CkH$izLWpi}lskB6FStWZ~??C>z-V-H6Ld1iSsNUu{p${5pH@{ThV zT9I8)tff>i)0lB%sB#cyu#`{B57vw&)`G4zGW+49~(1vAHtm#o-?(xtf8D|JQHCgm4=zSAvZAL#bKmj7%BIEoB zoxA^SoFTKJ4+RPOL|QI8%KK#&xxoWm`Ad*SzSP8ukuozr;V@qVQZtNh(E+1I5(AYS zlk=FXu1xh=WMdv5Q>(jjWwGX{D)pj|Z=!C)Ak-Qd+NL97jRkpA`3ZHY7Exo>pPFCj zw@DIfQfS2U`1CT}4rfT1!^Zl=8iT|3`vwV;MUEZN1?IwcKVOA*0AG!(jTyvOjosyG z%A=>JDK+qU7CukI=c&_ww146NzAKJ0_M9K8_s}a~En(98R}&{)s97f*@H5j+xXH8K zy5CZy4=t$DbdAig0s*be8h+u0xEjpM6bdQX@S^r8FHfw74wY zFD>_ioiwg?^1rVWk4#fiPOqawaHS_4tX&C>!h|?q<{T%i*eBFiLs-tcgY>|+2K2yR z)h(gdTAGEF8RVMx<>m|4!czl6lf~peK}92q`r-oh`py?d= zzUZilz5zUZqrQ_;3VdE+*w+lN6h z22mK%);9lC?h;FYV^IDT89#oT-_ybA=f8n)xceS960?xa`f z^m?nuoGJN`f=g(oj68Q*7gzgAW|o()dpR@JyDc-Jv8mvT7`u$+)sMdG)syK3>vcZVn63bRP^A^LkPODY6H@Y^p%Od3{ond%eqR#YUl#7`Yr}oL z1fCT3T_p?l=X}@?!}e`%i8Z`I>#!}o>f>E3l#csckS`gkr{bSV+;7yYSAC$%L^tYE zUJSJDLs)jh*Kmqvq&lYNYG~EE82XHrF?|Y-30>29L*Jt=QN&1Ntl&7oTzD_= zFb-xO@Tl+nWWJMfwO0Tg-|rMqriD4lWPIf(72&hbC!uxR+H)Omx3>Hz-@$qCNPRS2 zPp{IfL!9kQrn&lQ`lFwzz!TUXwW#{0b}qtH-Cw6gdM#j_T0kFTX43OJfQBvWu!CY3 zdv;h`L`<~TY&RbHh7$MUu=wEGF zbOnr&SG06Fr2)q*^bB*6&-?;XcGdn09Xm&+cf+`~b)sjCkh#K(+zIrR zy(IG79YCkox{%kJ>Tm{*-M@`m!xoLPWeKp7nd;V231-OliUYY_qS3tf&Xu%tr5T2z8jX1j)-@j-E zr2iKkuG`HSazezBpLN@1q~e`W!jzu3>8mtJ-}N*!5c}CBxlw?H9nD@Wv zLQ13*oo>24+I_w12`F_h{bwMGK?_)zv9{0sh~Ov~c62c2Fz@I0?|^=}qs8>X%4Bn0 zl<(b6-tivD!@>~>-eO^_G8vGzIsv^(CgD{Q;tL75^Kf?{g5&r79o`^Wz`Z4#!Z7Sq z^mv^U0g{@4t&0ltLQ$_f_6oM`tM0dcwhtT<&n0%$iUy7(dkGBrB_Nps2PZG43L5s5@KhN+wwzB8_hv{6{$eACB#nY^De_XuvwJRl=E3K3_yA=Hu?q*vKp*^Puh@_T_b!9a z9Qc&N2hXLbvbvVC;yq`}@y;p3%>MKH^8e@YI0r zOQcWyqO*FrbPMvc8S5$uo`*BjWVHve$(7V~AZ>58)pFHeBjR|bbjwX%#Dngx99>IN zecD)gv^L4fD+0r3UhO-mc`Kp=pPE*>?(jD287$PY9$l+$`Y$hb#TxsjMxzy z$@62&65Bq|STd$|z9u;(_fInXlAKhkWm5TpYdm9!>E-25&o(hm+ND0z&28Z+>f?Jo z4;)PpNbo_=KeSjPWB{d{P5h!pb4FP?#z?Fzk9B@kP^$Ys6X47a&?!k^4{B_V%`TJo zFz^CI`9AB*J_^_5m2xhyhjZANw(2qo`suG8haC}{@N@%DluxLahPW-n{=GN0-bSW1av;*V%?q_Ui8W0~997zU{T`tR7q4Ph!k9iMfL z^iG93A`SF9T8qmc(fhho%cvmPtGtkQ772V|zSI4T>r(F&_Y~#+*}wblkdJ5yq*Tj+ zJ{$caSPU{b6X^!inHyJG6H%#o}U31cN%$RL9Rzn zI>M;0q$J(v(-P{Pl-O>7v9h*n^ozv4(wj<`Xj7aA{N|yR%ZP2;vU%DR^2st@l9!E? zZ=e}8T4t3z21}V*=xnPj!!n2@uX?HlpN@VJ#vbRSt!hRuj=bqK-&=<%1oID!v~?9; zH=QL`c@@%LnuL4zE$V|X*XMcpGRe(txus=mRg;N7pr4Z|4{KXaBDK>fyy@_^FwbYg zO3X|{lwT|1cbri3wB$L6fPuQw=bB~U{&;QpzIs#7(G%Jl%@eC0sTQ#$t-DLhfmb!* zIErG7xr8GK#t(9U8P^vjV;tCIV+5I=H%qZ}IW0T;3x~d2EKndu_t|LnbGB4BGigj? zYFSD_lb_fa$a|_Hok4yZt=qs?l%Jok^ZQ3BdxiT=*HCY47>!?|jIB$3y0gAP&~c^5 z(Tvm<^seo11kyn2Y!Pt}{~km5LM0e;TxK#m?;Z7=^-y)|SYT>yPUu{EYaNY+E^>!B@g zoL(`6Cv-?ZUL#NE6pt9N3A&d@Y@_pp`3hVe9nXNI1w{Lf#Q3ymBNJ3V=5u@F<#v9o!?{yif2Gs zS3TA$6TjNj8*7X>N(OlX9#{8|qHyfR(M`G~ZDC{HR88H}EtPvg;<4)c>jt84p_VYFtc;O(ZCF&HCSGba z;x5cyUtdY1YsP@CPVAR>(Z_{|p4MvSG{{s2D&`6G<}NnV>_xj&w5j^o!%dv(W4EVJ zOm|G0uBSVpF6!z}@iz~mMWVGWxr!)n>*)R?{=iBXZEEsE=4|RKqLdC!ra-})G)Y&2SDD7`mZHeLo;bQT`vE(=Oi>i$B6t@J=0eEw7_LX?Y}ydi|?Yr|NY*t~P>3lB83pm|AVJ`f~T0 zhIpO&2VuQrau7irX7D4clAHYOt74;ld8BN#=BO%b7=<$xt`2KhzH!=resA9t_T9rX z^f&tO48yP@CXK6i;wdZXv2|=*nz>q{tLgPv_u=UM;aC6C!_wm9ghq2_ z>>qfg9#{X;XUyzh)m44ym1?CJZ%o{2*b`UP=gslJC^5ftPa#Ri@hEJHseQb)K$p?D zo6sB1y2Y&f6j^<77hsw8TSy*PFYO~4*=6Q5lWeZ3+C`)()LxbbvohrZPti;$8P80n zDlY_B`v@P=eNFx>8TN)z7-knQ>4@Yw%|gsJ|IUb79+isNNg8cwm-hsqcQn)h*1*j{D(5pAsXqt0=q(95!5r-3_SqYD+>Ejs zdb}bMo2+tO=(}9MJHPxkCBQvezOSI5Z5_LD(Q%ZFqZW^jf;DTYmg899o;J?pon-jW zFzvqKGD&$iuz4-h=qbl_4Wo?-Eazox7{Aag!^%aRApMbi)bWhiQ|QCZq#$nmF||8{ zNaJLJbU?!OA|KK2)5tQ#S%jWlOw+@z+u$0#I36xQSqO4TLwShx#eta3#mTyF*G6i1cO4vc zneQUHl`f*qT5YH}DTSK{Clmwd*_a*F?!YG19y30&hkM@=WYPE;2$tNjT31 z(TClo^J{yLIfJCd%7}It1Kid)-Kc1YP&kI90Dm2N4{%ws9=WW&KN|gmI1U@N`2X;o zK&~3<{-VX`I}^R9IPN7xP3-r~<3V?>aas3yt0vfo`1Wa1wH|TQ`xEFxTvnowk+`vW zWh5QX%qQ4dLFAQ98#H47!NX*3OV~p{#+(xpt5)Hgw}z`BxwvY-=GCCm$eVceIc*)|Jk75=CrZbSU@ZNx+}< zlYsjJ(E`p6wC^+goY2BAsxdksFow4iVjdRu>MP^e`&&F{2}?Fo#?JaET}tnV5=I_C zNv(lq<1W@pk^&{HCN?ai^pxY~+gQ;=|flpZlh;?=aT-kdaFkWBad2;i|J)uRs5sL=> zdrA7GO}P@<6+{6CRC*C1FkMHg!)P+dOHh_IBG9y|Lq0~V_*C5a$rOC%IoNyqx-i~1 z;>9D%V5?fyhu3dEZ19Fk^mo{f95)tbj{vKFuR6SIQ3KAdJOAyh>4w9%$Zj`k%g7hd z*7C)Ke}JZE+CNG6p*yB-?@N>O+ejp$E0nYyUVU6G)#QdsYIUF|Nzws4&$coTQuK7l zQx^W_c3a@Lu5BsAxv0>%U;G=9A~iFKlg;T!$Dwk$+f32+29bLvcN%rT-{ydmV2tl^ zogfpNFZ3MF(>;fetJicH{;=4V%jjfkSThRne1Xm{=5{eM-bXqb$ownz7_?~yzIk8q zaC%eSn!+1j)X^Q>OM!Eu{4My(b%cGiGcIZKt>NWow21m=G|}UBU*k0SR--pZeo5QD zd(85)npnNcz53qGMKz6^X;i}Bfo5a&->AoSJElhWHESTJ96t*7rzSSzAUdE@4d=V|7OKa>GczRBy z*Xnf7Q%;>>ZT%4eNE(~L2SiffX0wKQ7iyx!W`mYcpI^rMhSM=LLgr9=x;mt0hRm6N z^Ttq^FE%kKiaVh;M}2JeP9Im3ZDUf7sm>m>_^NL~{Mb_Zi^})i_+r6;T{|1z&&2N( z24t?Lo{%@hk#Fv?<|LU58yAo~W%kELN$HG3K1F0%e2QxL;f0WwNoI{4YSye- zx01Ab3t1bCa|fF>!n;Y2b;M?V?I)+O^@%i6*5eD!4}tt`&MW{qAK%Bf=TbIMMJz$l zf~dV7_am;u`>@??rp*VV$l)mCYe?Wr;Xa^ioVQfVli*FDww~XLkh%`?`@&BajqqNr ziP5gERJq&`*kgjU%?k;tDe24fw4VQhEdWhc3W+uF?>@x5oTu3!_ zMgB0K;?u4J@(!d>L)-I$uMTt`L6`%q8Qv)nV8RH){gEwvxO zyiGY}m6`15!QM@?i$#PqaW=sPRiq7tBcn zS|m9!g3t8deY>FdBM;||Db+HqQ+MqEPKkFm(2gS|3KMa8(HPx6V}2MT7q6!dM0&%0 zNVHPIb~komJ*qtTo7b^WEwy>d8-ca50QAy(t;?e@)rgDUtR>fD&0-EW1*IrNTboOV zxS46DE^@A*jpv}(r>AvAorUo=aXhBsK~hLrqS+i=7x{f$!92|-F*&JSeESowv%W(O z^R#q{xj0^ybt{nL>gm1$d9Woi*6eMJ3MDbNt!PCVJ6Xm$ydH>P*iCE>*8jS$)&{5( zk6u1F9sKpjBfenmhQv(s}w!u|w zVf3g6sRj7_MpLPlWu0Gi?LO4qxgra*$`bZr>Z`OA$JJVjGbyn+NPwmkT7W2TOs=h96QqWgWVU%T-Aqnq*~$Hv zYFUK8=9;5?BRzSBA~3#f|8k}%-1BxyUx@u zlRB*+A5j|e82dr_; z9V3fS4qHQP<}Lh-Xw#No#??gBu67qYF^3^Xm~oLhw=mxSDzRvQQ{ekK#z+RP*}BsS z>)wt|W7KariN9X%tU5^=AGsU%+lJ6N?k@FxZB0YDySxGB69a1!OHyGpI)8P39xVNJA>%t9{-Tpf#Za}(%y%e;az#A6Ty16+x$M|3q5Z56-${|- zKiU4CCCt-B2U0x6;Y56>Ts+UKgF2>Nz)ikvSf_ImjPeNbPwWVpq(lWO_4&NriR&E6 zEN)~AoEWPsOs}|INTJwH!$;YW>Twsw0(2_CI9r9O3MnF~Hu@T@SfEvGA~sdMzSFtu zH5cO}5~3;e<5b}ei?J{LC{XR5;$d4Jr8?qUbt1+1rEwHJ7W&V#UmN6SYM{R*Hi(%+ zyh3J@FQGxSkMs)m3?Iq3v0Ok4v`U%24u6uFoh2yi)t`KPS&i1Lia+J|^& zyJpH#_z7B+Sf7XWL=z}$&+(180LAT~ZVNDp9#j9`J^a7;ePzMZ*Sd)`5AuXGOk}t{ zSLEmHvx(V3&_nD{6wCSwn>f6qaxvHeiyT;ibs(8f3`>t#=6T6p{Cdu>M z49q|H&9i|A_0?ExB-xO*Vw9K3;v0v$$+%%&XHk;R4I0)=jnw_MJv6D#mEvn>>jR&q zy4tQ>zy^tHRewm-@m=(dgIsLeK=);8qc4cji2JO0%G_2Qy*u^Md%7jS zCX8GST%Fs8cx%Pv*A^ljYZ(b`Ti?!w_h1*!h5DM2XBxTjPx&;y>8&6aZ4Nxfehhqa zfyR#qZT8NRwqvWK58n;k7bL)W3!N*FqnlC-m{}b@l9hmdmNH3Y0*^7w+x%3LF*+dd z<^%J!3}=5@cs`cGZ)OUY{TpJ?E#PVwv@rtpzT34uw zwM)=2-U$m5jHyddXSa#MqQ*4H3Ex3Ga;}R9ZY8j{wekF&6z-%)$iNlSZ&RH7ND7)L zu0WGVQ$BF%Fs|&XHWOO#Nc{6ciGdIJl8bG$78v`^QeL4w>HGgF;T>3Mmegtv;XwZI&k`D_?;Y6)m;Wgr}6u^+Oi8hR!HMN z{@N3w5BBfnj94jvR#i)J=lm&p(c`NgKl^x55%ST4jYTxGaPkw0gHa-TT+I1~7mvE9f7 zK4qk3uida$OYrQ~;_7WTOl!ahhZ%pKt)*HSm0(q|nONVk=2)Q6oYg{k$-tk()T&C*8tLWLBDe(ycJ=QcL~pdZ&)| z#|QIRX}O*Ds@r;TFG^KS-55K=ID5K%J>t;9SQ_9#q}sA(T7wn$BXa6onwJ2-m*nbB zVkOl^?4Fg>Z2M8I?qlfMO!Gmjj+W(IN|Z}Tgq+`QCiQ{&F&N31l||aD9_%zCOEMRD z3*lbj6h%7o>=}-%fKM)b*4oVn4TMNh&#huMyewY zDElnP&SNTFtC}<2$5t}qKvr`Skm9zNl^!+)t&yf+RD>Q~I(_R(jCqebHVIT(aA%G2 zj<9EX%gdR}$iui79Z5xuDSQ7Tu4FGWodu0tMSB+MQCCuPo0|#bbNIGPOC=1H;9iD2 zoohU#OHEChxD`H4jQoj4n&g$t#p_+49gdcZlSwsOGlxc{EP&=XP=wXu1zO?LSCRHwhdj-vk_?36187ycf@BLh4=J z9^K~gLQLK)dQ@!+8D|~m*I-`9!o{=UcSFuWxPcGWdo}CU5j2KY(nDH(=|v5Pv?fO} zol0}*_SrYdjx`hQOMQ7X+crgc@ib2zbc%B9)K8k#idaRzCP{@P$cpoULy0t>8oJ|4 zo~bm2njod?6p`##VjkmtmzG>wytZ&n;e)hdO}2fEcOpox^?2p8ud%;p*GstN^mrZZ zvM?EKDyAq$PI($Iw$T*j;HgCoM0(3r)yT|{DmaPAtdz6VTsSfFf4uO1!^LwE6X@Q; zAJrAzc$G_kRIlqsj}zeMr&wAHGx2A2a*qk}pX0T|-M{E}GpVe8*ynxkCrxphX+-c8 zdB|n*F2vmz7)>kOY74%3RGrmzNZaY)-aDlIodAWTgob8+lpgZ|^T60mKk1(GhNhAz z5B_E3FuLp2V4OKh9x|s`UoVcSk)gqN0s_!jkvoeOa7yNd3ya^eU|^IM`XPM^>`8L@fg&> z;pf73^y}!%;(n~eMakFtyj7d&B>Q6E9=L;ar57oLC704`5FJ`^YrGy^_Hr-#cByWG zokP#6i@On*Z1@H8@S(8v@lmy_7x9b=yzF-L7ZFXdxa(~$Ma(Yc1IUlbxIMfxpX)xq zGjAnF)#hFeErW%L^t3PeJzUkTgHA6kdKqYw1pK0xlS}C&+ex*v&zwfaUWmnrh)af@ z@)RXGP)IMMXIjiagNdyi>EAD1lq`7jbP45{THA}5p^37NBbUloJ0;^3b(3y&gRym+ z{n0mY*+X>8?vzGjSDKM2ok@|)8T*64f7p6tX3)p2NrbpxLxJ{_?MWBN2}4^`t_8xkxPg=&Ec7-21iNsS16Vp^=_mi^gn z&}OomnLN2HAMP-LPuMHV4ndDHI_84kC)Jc{Gs;NdTTEQ*%PZ9@WUDIjHfz zfsXiv-)y?B?duA(ju_!J>Q&d-tc~>u6m?{b*-Gpm`Ggv&A+Gi?j0>XNq1)5_Np998 z4^q?7z}ho?2emj5FIZ`;-0Y8ITDUn9h z3WKDX`0yy+={L7m!~N-q!0B0G$j={?t%8~0Pn2j9=`IUc_M z@&)%(dqDaiE8Rw%HS28U{l{T;oex2{`(_`72II#?`IN|D)?m;G3$lhwpnY&Dteh=}MDsqy-`D z1r^dzE(I4VxKu?gxTV$6ip+@1j49{{IL@TVk`|P@%@m!HR&)fBX>l8LhQCQE4zvvf z7eX4u1d;dJrp*Z+i&3|6`H#8P2c>(+QJ@`(wuAo6eYy~* z<4gyoIz8}~_PicapeS4%v_F1S$|ko{T@$^v65tyVcfpxI(6yFsk?tpZ1LR?qJNVF1 z=|O$Hbx*sR9+VzrZF1A})1R?=dyYyI2xrRciTgWYx9dkGlm3N_H*H)=vb)b#U!r%d zyA^uSa{;1{-8s)zNy)}MkVak)qpkjjcC3#U;wdxg=VNQt`kJ<*{!DJ2_0MkIHr|k7 zE1R!wmY_w*gmhpxs<_7&We9yZI9oDIm9a|2fOQrL1J3w!aYqw>70UA0!O!@ zU+XQmP1uXI*Z*c=t?bu;cIqaZwh?6wm=S}59-!ci!Zf7^b=?5Z>PORGvR${gu1fpz z%>a3&jhmsYuBv9Grld?>V?EPz)Ss5mVq+KKDXYZ2dK2v1G_;L8B?con%A;@dFd7|D zp!D!{zVS62{IXKP`<4x#a7~iJpPs^zS3((OxcwAqPlxk$>l5L~(XVCNEbOX>eM@RS ztdVzX+_BZs-P$<>5Hyf{MNy|ePydlWZ$>KY+<5wMP~cvqTtL5^FHY#(BDFFPhXeMn z{1Y#;-o?HCzL$#^ib?PtyI}kbb}a7UIyhFib3cRr8mYN9!^W8=-#@nc!5#v;SD_Bp z+y+#&Qc_#?)Zm&KVF$m7{xqSj_O)~q?3%?v%Oh>DkCkrkL!pP{T^zhm;q8(fmQ64o z*S;?48IUKxf*$fIXU3kEN>Am2L>OCd)p?db3@cR4nVau7*K*U&HDhkfJbK z2llDR6U9}qPpaL`5Bq%B4rj{hVX~p|!y0AinOK*9O8%ct$CDc{Vk_U_pORGU?fMl6 zd{{Hx`(e!%IJb^Ax&E)$#*<2d(l3&8(NS-)yucRQ3{ zEoHEFMq;EGYNjy0^+5?ed{d%!GpIF-ZPbs-uY===V|N1T_LJgGdoR0IH%G`fJRz$*0=dzHe8C@EQ>gZ#7;0@ZG1+un7fJ)@bAE*vVTr#GlCs^| zIq|DuWpSzt?V1(su60vQ**~*vHnG_!O4-b^?rTvYnUEqEMk#VCw45*7cD3%;*AmkS zmtf<^YhB#pUbcOSf=v5O!M|%rgfN%A#8QBvH z7sk*GCn=Dj5DVOB^KzvPX$PJ;&Mg$JWKn58lb*4VU`D^@P5h{Gc@6=Uw>_AAEY=ZkYdF zE-oLj#~-Cu^WtEPV2omsl@EO;?a>qC-9P58fcfiJ-uIQX-SC<8ArVS)TwnQ1@&yA| zFe1MyT9EhC{=+8zOHTO;E05&0Y`qaN`xbU(m$rafal*&`TZn}|U*%3gN_Uivd>0H_K6!{IQ?1ce|ln>F0X>#0Ow{N zQ1Hnh9lpmRM)!g&E5}ZLuMTy+8i1VJpO*}{;S4df1>*Tf1F<~bWc@3^aZd#V4xUTx z`{kJV6}Fg=LLEyN_XQsTt~sb3T48e~DBX&Xp0iMlEPh11?So2^?!wrsr09sB=VwZ3 z`lL**M0>2(mbipBw^UaHr-GK4f3%)GEO;$&rk@@-?~6vfU%VDp^|J~EoT(8XS>A!U zjM20Ip8DlBYxb+vv3c4XKadjji_eq0;hRC|yFqyP#}mek^0k@Vc+0t)>hHESF5#!V zTHPe+^$w`Hq`um=H2byc`Ww4}>qJ}Z@4_DdPg(&_e}ktI_Vg+|O<+$i!P7+cz9)w~vQMejl*TaG}%zr78_{=dC38 zdU$%d%~qC;&f0xA z-h1Gk3V_~6{XyRdgihII2oZn~j1~ySWX21t)!lF+4Kyb3nd)&H3Emfed>!^z98Q&H z=$~8-^?5F+iV=bdg1YYp6&F-R;Qt694<{%AeYBY3g@ z=Ki02g|f9c9DRWM4>cqbfQh=&x$)|4k2h39~htpx2^) zgKZWaiJ}9$fmmY9N4h}t7T};N*q67UOohQj z;jR9NI4mW4N4JP4IM*w~b*^hPRIkD~KEP*^qHd{_SZ_6z&$AhT>;D9J{BPXs`waE; zKU#n2fwR__I!ZGjL^0Xl{S`FUctre8+I9*d7?E%nx3K3P=^v*|)C1r4`(TBjRHu~T zGqI;bQoB!oR3M%OLy<*CWE`{x^Eh!@IF}6+cR;(Hc^YSbA*l^m&1NsHdvj3d3I2OxpNTZu#I+Ba)use)7Nth&IZ;`fchwj z6!(yESl?vnh8_D|#s+JPEz^Z|*4JR~=E@sSg0%a0*liaEvfKP9;{{6wi)-+2k=(|N z6p(&BJqp;#hzIVFzVjWEN?9+x1L$qWnPNdAJtj>fKvCFxm;4@R#g8zea`x^scvlW( z$1%D7m}Ie7=qoUz4+h@Iz_Hl?`YD%O*&i-B}@Ps04tFl)zi78+;l5~YaMhplvpKSoabcxtijX|r6o-NFr$ zaHn4|bETv&7UT&7nU}3~CE1opX7lq_%sYm+R~Fm6?4MYkj=BZt^NRVlmP+beB^^U$ z`D2X7SYyrJV9n`-R_Ev2em{?!b;`D)dY)vi69OGVvE^pTXt=GKN=72*;E`{4j8vU> zK`b7&?X9+Xe2QXcyTYiY3&|Sm;4wLBK|s!NYyQ?(ZNonP&nMeZB3^#1BKKnSYTjXZ zx=SLhb!{!{I%0HPBN*s^Q4FMmy+;gM@5uYlqVF~Eo-=SeiKB|eI|_>*M(VJ~>AZ9K zWf|c{PD{#Zv^zEApjU{yzhxbXv2@{G*bf^Ru=R_|F(r>P<-c82gJ)kn60_abx{He`gE2bC3{Go$; zk4a{Lbn21TkbSYC6Z3BIE^Ua@#(L$P$r=5;(_V84rWyT?z2;i9GFQ*E&p&b)Ysl97 z9QoL-^r{vbY&ffiew0+JqPvE3s$o{shu`u!EAdV$wYK<)S#3!R2`l>~mNmEThq)yw zayD3#T~?s7YpW9sl{XgKkbb-*)v&*fQVIO^+q%TFL+Ht8pb5~fW;oy*Tpf;}|BQkb zRTSpPXCj7iDrvR#)`?L_=>bxcZAfiaNsq9)hO>i2!!~;Y5aH=f{aIz;j ztZAO+2SPTBl&7!E_TG)LaYn~~Lw}s~(;=770Q^1EIBZnF$-XKqpWbhL zUq8_8yYEYZsJ|3g{Cs&O$J7?)qye4Ci;gcI#@G5davZ6p8?4zExsA439BZaDs|Nq3 zNdo`{j0SU7yg`cYIWuAv6OD&))DQInwle{?dur&UukJncLbMm_JK>F=OWI(~ZO?;t z?}m2M+w1lpc*j7|zNAaMcRwk@688q51`Mlljg&gA`DbAB+!z{kANOJDF0pdxJV>Hk z{x;z6>e~h2?i#Yos@DO&>=LW@>)%@g^GmDHQnX2s*Mf5-cxq685G;~xZQQ85tY~kb z2PmHYzLJz>b6(;sBb-w;Dqp!F2YF<@B_cMq_rba7J|vJ=;onDxgs7ii3|&Wwfs{<` zDz4pNH6NZxZ_K<|GCloQ;9Ebm#&jY+0g7cv+86I#p8Xf=acNTGj3tT3T~58aMY7zi=~r zGGKhG`M@i1=DZq*wf}Intr^ZQjQYauR=_P7&p|n^hMT)|-j$Y{r2M+as^_CM&1B%Y zfuonHO)2dapJ6$V#pt>T^14+f=8UY{s~=*F1=y8*QYI;h@h}c+wYm=DEf9mc&Rb*H zt6-T>&R=kh4DFecJ zOP_+Mdxa9=sA?)V<=*)L7@xXY>s41*W}`;nKzm*GK}k*Ij9aKHHtkg|MC}mvn#+1U z2ygK#Y5($%a^GuU{mm6MbY!QQKmvO&VrwG>ob!syvH{7~a?^wFoFR=S8}80=9xli! z7pu{B;e_~O*sxncK~B=YZ?RqFwn%JyQ3>$4Qf+?`#v-*}BtN*X}6&tC+ zxF^}2xMoHQtL9699#4olgY7;X?dj$Fd?0BarJigd>Y#Ubn%s{yiOKIFY8)pTs{zWC*=tQQ9r?L0M`>ztDx9* zqfv%!rlT}xf^B;6sQ_n)3u!r)ktxVUTK4Xjw4}I}oF^+l@-tZatOTUN6@1?fiR$vW zkcRsQa6Y&$hlW?TDS=LBI{$Z>U+OHH#VEz};J1O7Bn?r8vbh(4AH(*47zRGlG}kTc z#1;+?@0Viri1jAZe*kyt+$X>PF!~;-ky8FPTW^Yfd;79FSLqM#mEXVmi#l`kRnc#o zE~{hFt6|))`BWhbhhLu^CZ;C0Ds&b5^#}O%BK%5czaAS#8vmzV9BZeJ{d#uSet>|- zpPUTbQ}cotZPVglm8z<}e4Hw9K%)&T;z*2vY6A6Yb>L%;G*q=GmiLMu4Pc!1`*$gJ zmggy9|GeABv0QNG>g;x9Kts$c%n$0@lmRvO$coSdnzm3z+uf5NpGxy;FhUp?^m3TL zkVD@*wCKy72V84%^)=P!s%Q7$jf}aL1T;Dmy%nH*6^!#Sw+vXB*=XP`!UetA(%U)umZa4$bK?r**W*LPbdwv`PZNsOK;PQMeI&6AWasDMRR7y; zevmWG!JgHNg9_bOQbDtcY6Cis1c!zWM%U`-Q1d=*;Gjlu;tty>@oW!#IaIMP6INTD zhdWIdQtNPbB#3cANl-2DeU-6|Aftk8%ys-YPrtle3#IvBkW-hh2YJ=}AoGly|4Gko zq@hiynI9UeYLhjKbH(@GHZa{HC!7$k9Qwzpe=-R+rz`jXXG)EZm}pG&d-2_fviKX< zSN`~XybEfaZ-trh0X0D{#Iow|dknT!cjK+m3#XK!at_D-7l6taZe{4&C}i)4-ybnO zQcaryF!Ptd6PoYc>pF@wg<_3~0OdBQQ4y_iJ=ECAYLMdhTv+Els8e_Ej!|`Ry|%jl z3V0;t3xRZeK4Pb_mTs>Qc8+AttfD;;r~lsGG`!nygfSVLt|YmDi^v3)|L zfu0fPK-)go8q~>cx{-3`a><~pVz)Tl(8EDqZEL%fGvshD=Ul?{h@|F(xHz1-%WSW3ViP?5QLJgz0c@;o=Xjob7axDZ* zsh`PBH`pGje%9*i(S{~ys+c|70VvtQZc>gyA7(-Vc2ZBUp90p8iL|+xMVo0nlaJ#< zIm}YzyP*b?ic&8vfqNey`ib z+GO(b5g1LWLWaf@?CayZ47Ss4Ur1L)M{+{KkxV0V&p)^e=bV6&KFoOL7!yE zqnXO;PT3_xO3!|c-}MrlAB=D>+h0~!9@TYN4pa0+6;;9=y6UemBJ#q&_~ds>hj;rrKNiT!k4J36RP?%vSjwaBJ72a8gITurNCkSe z4f8^yglp=r2QC$@FiFr6HtdaIb6gH{O#g-NLl5(PmtIs#0+CUt=}crKPhe)+zhzt>_-Cm z^GCAo?9ae&+*J`58pDm)Dw^m7TSVMFP`U3VX-r-0q?p51%-+l^E*~&>WqQ#uaCEPN zJ?$H4-ODs{lBpRuhM;FK*d~mVakro`P_%pN6(0;6SO$e&@qUcpQ55Ga{~0F|&ouJW zg3Ui5zW*?+EbeomwH{_MLO-j8^V2)`NJ@S3EWS9o^CQ6Cc~o1!8$p zBs3oKt5@s}oO~L+loD_iGozV+v#y7Fyi(3|72D1SVhPH!TD>ZiN|ZZs)i|`_%s(f7 z6IL=iyt(I}+-0i85rD-1bV0kV)*_WuBSrBJK8|@Y4+!M(`fy~%0oi5;tw(26#O}Og zJz5AWq6EIA%&psL0H~7z?>>)TmtHnMrt=DR$LSR}_D}Ivpx++JZimt9<3a|4QtgsV z>-<@V3l}99artoSluwi^TFAIRc9^K@Mbx6eE_?2rSUjj=w)2>?b{3qL{(+-yX_wh7 zn`$t#-3jr&eq|9E7w1g+nf(!4!TM>zf1Pc%S%6#q-iMsBGRo-=N;0SGMOxV*knLB8 zBhNh%j{G<-5?R$Q&)WfKdQwGvblwS$QhF84dqcl%ZyYZTIU0d1##PERGY`QU9CRUEK91gnw@0(^o)EjGy)d_In9EG?YKiyCUn^nnAs)aMCD!7li2A2`evtLB3!Z`V zadid1b0msCo`}b!x;CYe6bQ~)qhewis3MA2R(;REOeS9MS~-?80?iL>S?Pw$pt56rUvj#X3ikU=@!otN%0g{`f4>FQt)Mx;>p)S3gMhPEhwnR0$o!9k9|-D z_^uG+^+m*Nz_abZgR4lZMLi>C-uu>bZiC^Nq|i494w9Gwat@>n&N@JX71eV7NS)hY zW7#7u7qcK3n|&(dOFqo0aV>3PrzeJ;o)hA-sO8u()*!6F3Fo5$eU(~ zAKzT9waZc}%9?8Xh@=Vp^+oLgX;(2{R+Qk=fr5^f;fKY;5m|dS#!H-5b%!d!Jz8%h z=Zi;)9_HCjf_wJFdifBs7(h1W8e=Z=XKCF(Ex6~*-}eb*1^nBvZ$zKEhL%=rqp=rt z=uJ`{a5ZyX-G08VBdcoulEbQij-VGRdL`e#-0UKo;zA0|71xrYr!L-_DFSvbMKV;5 z+?r*wTQh76Z_TRO&Xy$N?J^-X82KxY$o9D^ZzbaemPxDk%6DoL%kP}ub(k1*-oK?I zFM_zQSkmw9@Db-9movZA%e0TOZgpDl+B4lzO-VP?l$;PZFj<~)*>I+2zCnkK?ooECg0&}=g?{X*-0^vt=WVK^b)71a>H zm-fZK#dV9Nq$I8jqk62d#&&*RqB>@>T|P@<$g6JMUsI#cTxX5x+*xyjWH6j933Q+H zZ9W}GnlcqkTQX&s7!1|2zNB^k*@g0+P*75fR4VpxK8>SGr3q2JoXS%TR4cEtGP`*N z-k-PbAFXx$NvxN1TAM?@S8M$&b|~;>ji~KO>|I)`ni}s;sx=15wM%XJK~nao`O40B z+w@b8B`DlUAlah#sDA$xDO<0|%d7SRe-ZQQC%_?M%p8ycc#M{V5m0~WKSr33cx>+t zwW`S)cVaExsxL&(U*19(<#9<-r`5LoaBj^VoOiO6qVGtE zZEpl@xEKD_Tiq_jqAKPiBYUNPjj=r1|8Y8+47w?=!(O!+@ zDK-IbauY!AmgC|Dpr$bnydfu(7P|0;>$-CtPsD}v8dCV>g~$_&gEMs=zml(#6c0G8 zdEM&9g>7Zo?*-Bp$GKyglns2qLX>O9dLt84j>a@{<(ygRh+mcFZLp5%j%m^cw&XwX z}T}5{?dKi-2b|@Ug)`w1hyEFqCU{?-HSEP z_!KS2VP_+J4K>`wEP=`*?JxKZT@)`^`aFIGH-ggH>UP1PU#4z9 zoZTFnr{X5fy>Qj8ZJELjZt6bk)8}XGx@H!v%GDT4p1U%+dU4+kiHrNnICVLeo-5AZ zHL_B#hv)c|MehQh8F*hHZOg-v-~DsM$5=rZSBz*LaDTknPl{NSHsdp16^(PoQTaBH zZ24B4At{Ts%sXUNl+UY+`lj9MMIL|{gq`T|fp19gG3nR+*p7?K!kA5Jt_Ls!E01)Y z1n-jMeerAlZO27xSZG8Y^;C~XQakp{$DG#|TG56%g#hO~fO(qU&eFQMQqj#B_RN?4 ztoH;|%Jg>Ss8|yVNBpvkDJ;%w!l>Rf7kkr%1@A~5;1h}zqi#ERkU(Ug;%UKZKWXoN zPayBUdr6mbWyMIwM1_MGP`3I;Y>X(2Z+ESyWwtdGB}c$G3%E(MsI#48@f6k*$AW{q zNl^?Hw%pPt{JoOhELTbMr6R)35S)9gKlQ|K&$t*d?Nao&nC_lv{`li!>tGLyp_;ug zpQ5EG;rNzfdQ9vB$)abpPuj#(IAh2uCVQ)Bk60mP{35IDrB89p*YG0KDBA_QOu zA3wbg=Dw?SDDuv3rVqD~kUrjO6GB|93-I+=NgxL#(xKl!M@lB-{8Q!c{#3R2CpX5F z+cZDaJx9tm@a*lf#eHr*U^fUMKDIe@OI`C%kC{*UTG@?Z6_Zp_+zQ7x%%><7y({uh zh*O6J;4hWM8g}=u@Sa|mR4V(+qOB%R(MLkb_>U8!N{$z?xS{pFg-V*`lxL%Fm}k2+ zCy~XDUd}Qeo)8s-$Q!=yW4yAV$rmj}pvOxka~0y-B-~ z-*R01D{yrx2WD8Y*~-W&*YyhlbF1P)>DsuES@(E(Ov5z`(Y|v%T?CL+G;{z?p9463 zrj$}`m>75TuOW?kPe_q4?Pw)kX7q^0NQ_f2sr8jK*84R3ZYEk&LHl1rWhB#-)~VQy zHp?C{E;1f)TE;Qu`PG(IfUV#%({8bHux>ZmQbqMfeV$@lg7>eXhfv9H&3^=$=|Pm(|ukPB>Xik_|R#zZ@(2LmsO19R;|j;a5q1Y3fQ)Q!;_1?MgJMn@76ePx_Is~+)IJt zD)JsLXK^wXctp*<>!LLH&3=rps%g4*lpUxXO=D^>_6Il@rd94ElA#%G8Zi!Tr;8MR zlwhFB24RzWbIfMdMvpi@LQD!rjVoGaLA6U8(kn2=D4S;yzSkpP;(i16?KCN^vM&3! zD`I=KSERY(uE=#wx?+ZVQXxifFk|)}%^2_PSLj@KT#?~gc15v!k2Ry4pHZ`~aM=~! zhYB^`+gZsh_WqH*#%1x|m4(ZUN@@W}9~eqvG1cxUjPoul)Inc*{T;;qcuFYw*OK z;mBy;eVk z)7u0i^1Ax{a__kV0bl$bG9UH|%VYAON?vUPtacLgltzv= zJX&Mi%0kQsj&1e#D+{rV!FfWOFlMwKwU`>CdoA;vp}bJdIEgKm3r!2z|mBP zX|DzF$&8`#-w;Ep14}QKmfKVmxZx=nXY-THCj&fR+1*xCVM80ZAJ^2?IHakBs4SuH z*I1aJ0gwlZjhzplEH2G5%AXvjO62dzW}R!kMPI zGXO40u2g4Rjm5Ue){#X@ECafrCHU@|l{FissfHw&)7xuE-T^=15tjdra5T>0*v%PW zmVm_)U{-uSU*LhWi?dS}Cp(JWfx49d~<)N!x|JJ$?S}UA$@T`RZLf zuCV4IA8#&of6J`Zp_Rd-%zMQyIrLLN>Jf^P9oR1CP1zogQIo5&j;c#AkV5Q1$9kCK zJt`IGd4M}#AZxefk>N>*0p4Ft^$mKr5=sgNd0biE&!atV9ArC9!xxnJ;+&4QU(W2# zA!V`7p@sUfo8!@2R#WPg+W|c8jc-WVp6J9CJLFH-q`#HwTpZ;2*v$!BiS3ZIs<}C! zB8U80n+{0@tq9vphq0ZlER6D~G)5w!9Tm*3L(rx;j!~U+0)@VfpZPqJrJ0-1aV})XacH+72E!O|+3j&n zq$I_qUu|i#fSled4oBjeIEog%E9&*Y8;_w=gXS}d+e^zQQ{EisNNrjo%_7xpeBg8b z7Tbchgr454-%Yf<}i`h8^Er>n<-Xy7Em8&xQkY6=rx@%-@FTv=)fGzNT zoCNbR;-VAvw&mwk3e4!J!<=V+a-U+;*W!|JE6d{grJXY@!MDmQS*{CSX`%St%DzKQ zrRB%{_M}FIm+9uU_@=*2n51&+n&P)5InlrKgt#lxvKKXvNsXgp%s^{@(=}OW{5HiF z((tty9F+UqY{xIefDnuY=@;8rN)=na7FA*G%f#gICzg3&ek8QbUYV_Rr8HXTS@Fw$ zW${z41d3mkl!Nh*qQu=el4R&ZyNxuQ5FdynH8$@ZGs>U}aVfT~f1c$V$YUJE*W%;ALzuh%WVnsx5x^{C{37|wgM-9~ z{U4993ZJCzft zT<>?ME}fBMbOOy{84j?OPob5hM!A&Ed5mHmZ0D|vt&EIh0+oBa;b(27I6m_Id?a&D zEk19zu+!+cmBC<&Jm1Dce#O0B@mmRTJuy|ZD+?>y`2yj)(Vov~J1vw8J`_RQiFf|4 zEF|N227}PI7+;O#B|w|de%T?vP&DNtEMso)ihF>|e)^}fe+UM?;BuTQFb`J53y2|u z-_^Y>kdn9Md#iQ8BcgsK#_Y6??Q|pMEzWc&HfB?|6l-rd9jkC!b2^dsXS(;ms{h8_ z=~p`$RWTz~VY+oQN=(zdCZNb)i{@cv0U3u;Mp-1F=Y;VwZj5%q<@JhP5e3FO13vQ` zaXV03)Pk#BCYEazc7Dql@y7worHy;GXB6!^(rc>0GJyBPU;6BHO6^FFOcRsjJz{%! zG`rB~J*byEHHGT4(R1BS6F>)g%N1>4W zyczQVjJw8bs!{Ij_@R=dQT60(=KoOE|D`t3sN9Tx5ZAfLrTD^$$jz%9lZ<$Bw@7uD z&+#6`*5l%&h@9ht3w95;?8WkO>8GVfSY$8LsInOs%YHK4+~)BsFX>;5s;zO(_)(mE zY4o0IYOvOivdl(FMZfo%;8eXWU6Neh_N{qCAe~FYkuP4C^#Jv)SA4H{{=cnjfa~+d zJq*y1VR4Ov*@2qNLWHcfYCHRw*Y9zl^NWK@9oxS__lGRbID?J@pmY1n2%Q`%!{;kM z|L!5FrCIhCIrYqFIE{B;mLrm{0KRUv-rPb$YE>n@s^O5-(L8x8V!@jt%HkY{nvQM2 zd?}cTD4hs~Y(`h*{<9EIsB;}c!5BDM0-VfDkZH3&L~S?nRR0}PBDbnBv9?}{T(Z7$io8d@z$h}-_-2k`&T0Z;D9!W{Ew_<$iBvToSW3l*x z^JkXbJ9l5oS9R-n#l?J8#lYvJ6U>%XVVl#SZ_}6)O}U5Xw3N{ed0g<@$iX&%IkQVo zanE7tc)5?&lX;YacI1UA^T6gy@22vUfaUu(B){44*xV`1`mx z4058fI1!+h*>DMJh;x*>OE61&X$*b#8}ts(-uk`x`ymzMwlaa+`Z=_T=JJ{~-;~n( zjReO1@epUua-?q6xk~A8;SHAMf_sLLdMG@cK?Ar2AnGlpzhmX!8tRzWk&xj)EFj}z z^hdvli=RCqjvYon?yv1RjYw?{`4g@Y3KF;EI>tKXau^AR3w{~qi%IZX`}0gYe0YtL zUgbo7{)pY+3Cwlq73f|*4bGcKpx8()(sz&SLzJK#N*POSGi8r$Ri(jpo z(>U3o3b?r|8&bV<-Xg|h;sW;N^EKIxJYC)&r(NEkP%@{{3QtyelFLp8>NdMEw`qh9 zcSwrXitMb$*$&Jv*l5Q%0^Q=BVT1?f9l0Gx-grXH2+RKX-;1AyW2tH~M{^y#OF7{- z_q$(PY!-5}TaHE}Lq=ZH<6_#7j?USMHMw93<9n(-8Nk_i{B!bioLn$(NFO5B8$y`> zmE;!y{r_-DICA^>NMuT|Bf!(8XpteH{DWDs9}N(UBBsLAjj^^lGuo*wzHs4pcVqn3 zNvS&y0uQBVe?CJ``JGl;e_F%gdX1+eD;Bf)gt%x3@iZ~yG|IFLcL-9*@w;yLn#a6} zbs^ucomxRH6l6Ja9kaf^RIl{w+0L|=Fi+&UdP9r-hf2HJtc4oIZ^?UZ?Br)S zCOb0#6JKc{f&Y*Nwo00^@k-jy>?ld-^)8+ z^_mfs5&uW4mUz`U! zX8vGzlw-!R$y{?KaOjf(Q)M|YgXlVnGs^`&R{omB_(v>_7Dw~gOkj*DC&e}fi?lVx zjY$oBaokolopLyJ2UqCvCr^?0C6vAOd$AH`{5%zkV_o|~$^;U8vL5I8y|`)+&sKju zeuWmtV?S9<^Qc0OHF4`n@jdyh)+af+=`GeyciKxHf83Ltmop?eGGI0X6xJz$eW*4m>X2>}0^4KCMrLvwOdb<>_!@574>>dy{+OA3rJDSx>F?W1Uzk zr*R&YqbSHQz*?LcYmIdZj**&t!%6WTR&P_iFfo(aHW=G88b|6d3Ie_HtY*fDB*N;R z6c@0XkJV>6$++~U>}?jvTu$KqytS^ z>J=tpo~vZowJ}Fb;I7m*9+K?MNI$v$FE=C_ zk!mh;aYn8hDJGYApxWp#?95@~h7qgsX%>!Io#M=GQaHvqaVH=0D`OC5YG^B^l?%=r zR8d1qulT2MO4IE$9mb#C&@CnnkV%%Hras$=doic6_$?2d5v2*vSWsCXx8wbQhUlDi z0e@X;Ph6-)w}>_Zr&k5i<{LxlO;t2|8`e87E*Z*oUPI-*P68^;Y$rzTSUW#*!TfeQ zP}*bSBg{*n5MYq+*x{2;e3@6KDH*^8UruXt8cTL9q7^nd3)Fe>p&|4%m>5poQ4f1? zrq|rU1&hL2Om?1ZGdsCili@^@8pN-?;&aRnKq$J(fx4n!r(Pa^>Th*kq3AWrWCZo4 za#;@Cy(Jg?@iF-^VV^${7*{2aUVie-_^sGfP`KB=2! zdhQjcMbcS&S(mjpk7hx8MUm{NW+45dW&ppY!?*NkJjIO5>P@8?@J$;T%d`fX!#Pc( zM>2L>uNWS_#(6?Aq>Q%pyOmzsy8n#gc}2S%1!PKa$r*&v?|u0H1n&rc^;_S_Q;b)} z-v~veI(0{l4_9{$-nN)00rakLM8vdx{zVr0h>_$!QO*Th29X-dBXQ z??aLlu9^YQt(*rt`2^F`VM)P^CK(T*!}=*)UV_ z%zEJE^bOKfy+&mTnd`A7l9=K|&7+Q$ll7FA;G%kBFfuJA=fx+3Bh%R>rVo>GsE_Ra znLaYhVcLsuIy*4?B#sBms)mytxlXGs#fjN{^yk;rp)8UFwA^6+Jo7P`HWO=iN@F7Q z&bfJ0B5<1NdRbp7+FA6psKzn~d1vBqw%ePf%W?vl<%2O;yl=uWsZL^Z3J3V##917Wh4%MBjRkqgdA>G!wHbXaSZKm z=lX~d%kmA;vKP5!A^n87o|O`I#riIb^R^RxpT{t5McdoB>%ww>Mt*CL?{^^cCHo_h z1%XK93i!8TW;pUvVL0+?lPn81fK>fSR2J4d&_Y#XUTcl%>|nPE9`R84=95`YysaXI z(YyA|UyF7L@iWr3+4YYwPRRgkk9Ssz%^vanNDSS;zUJ1;aedB+^y0hJdJ~f+Nbscy zXV$q)BXWeA1UE4sr5unW^1OIcKb2}W!;aZTf?p2DQ9Bg?*JQGL(_>=Gu%^iXZ66a~ z8^&Au+u`ZuVg96vNggElPy{6p^(e_hZV^Vg4kVA?9T!is2vUda%WIMU(rlLb1hi#c zIe;T=x7&eg#8DwX7WS*wA>;Sh=*dD2LoDFp^6*HzIL;@B1&Wf&Av?xLjh*~^m&YH= zcsm2*)Q*e#Vfp6wjQHX37dapc6sz2|UMuGQvc5C0=G@}GB^kP=@sw<2_O}L^LqV%w z0r;EteqvhMg_>Q=O}Nm7Sz{E@*~u&55yfF0jo-;LZ%G|+HCJ|d{PFo}C)!w&pdvCN zJ8*82m+qY$Z25j3W@ckDgDfwwJU={02#;Q}Ck7coh;9EO9ql5f(q|7KTxZh}$i{3r zF3yU`QlQQmw+&X-ai1^sSEDnH2MF&RjAN8fdpNeqGRM_IMtJzQdx@^zioInf89=k2jD5`=3U?40_cVt^mJ z*DXC3uGx!9&j zUR{%dYPTKoCvm(%)1co8d(4d37&CL}Zzdc4;&lUL9Q5l@HRxS@O9}OM+-jK0?C?F} z=R@+|Laz@`7;}DL>#&0L9>312dRfiZOdsWsVwt7JQu+=pq7wklz2ZLxifJL8MsKEx zm&LB_VX#s4z5Xin zfY6X}Db5=%v+`aT&4@lZ_}?Gkd|+;nX&%42YSih-&w$gBeul@)1=bO18YO8aQG@)9 z(sXrp4M@=_L6b?c46S;Zf3xNzSw}pwO3H@g;!cpDQyD(zJPyI3KU>59T0y|<#9dQ1o?N_g;f-?{q)NHGwdGIta zc)zcT9u+qXkF0ExkF+m>v*0KTNB-O(T+DM`l^x?+9i>h9B}F54StrHX zA)e8S7&q$Z5fcjI?)Bbk&~79QtI0YK#TJjaEi7xJ1y)kqw8Sgln_SX#a|TkxGn*`? ztG@5NxO8~+Uc^M!iA{2K9qts3C054 z$>g7p=Eks+o!MDX4)(=ldB3K^{z_*t=rY-Eo!|eaFY9MHkr5Bg>d*W|^f|;`SM-nh zRosRCB)QB=Lbkp`9}~R8AzQs-+K{PDp7SyBib3Gke>vZ+@_bjrd<(m@Ko^l3jv16& zIVL6zYIXoWFo|cDNQZptmu|ll{rHv=s%Y?ty@Pg^RpLq-4>kG+Fpt04I{NA@| zj%+LN2H?RH(w-O@3l=!4vemBFqqy&ViCMmD#+~#?A36{R;x5IEu2raiwS#mXRxq7o zdP6*5LghHr;=&rlvR#o+iZbxVRx22r89p4rg;QzjrUCKW0TzRzIL#6F|EUYI-lDZ$ z#8~#z)!ZXdoRtD|duVV3Gx8uG>tGCV?lD`H}sG4GRvQu;XiHJg=4?!9N>Yc@-{iEaut=t+oOFcSYJ5$&wR-* zdZemm!_Jg#$JlW6tco~WMaI(kV{ zg!XaS!$4OWo`iB4jt^mHr*2n{^Z1h|r!z@lY!t(0_8x+Mo2ZOu)3?p1%jiDZO0TE) z)Ai8G$;eWQBeT#C>0N*u+vsbwg(?}AP99}@7soJb4!gU(iq53>LEVod@6tK25697L zC>=kF-m9aft@Lgv-6OsoK{+~k)OqP`#}Yl_E0K(-L^~3zPqr4!*w!Py7%6aeUgoC1GWb$9sJg=+kub;O3v;8F~$;VDutc(r@6$@ zC$S1M)l20Le)CCsT-=Sh_CjOpGqz!rZIFHE9}^e%rvoNR-F^-3YYS4)d-@UPN`O4n zgArsjOmt;9l_1HTwkK^P21T@GE3*R;Ui65X0Ugbb(%+nZln^`Z9)EUaT+`0Xx)9;; zzJE_UXN38*r_$`r=wq#Qrf#=cavIe0;@$ct;B=jG*6#@PUeOUl6Sl`WpS5l}-0amh zRZ;ymBb<}vj01k%9^b@p1czK`!gk!JF!qIBu{F$11Kvl2vuv=(I;$;}eHuc7|F&mr z%iM``J|mu#aC~cEe3?nulfFSs6E?0JyApV&={@SrTw&rCQUon)6QSP>;7Q2MXGE@F zSxjC0n^#iVTQI&!?(wmUJ)a@ya*nYYf=F9VM zsXnekOdFk>CXD^JGAn)D~TzH zdlke?^HDP@sp#c-lFckna*z1gP$^Zl24&mTvJI^%bn+rQj7ZNtQJzcjo>H?BwFgQL z_wojI6A!J=^N4RqN|x2&N|$^$-z%PtNNvg%&KSL^*JDYtpjW&$f+Z`mv)c=U3c{Q6 zqBV|+e~XM^c0s-36D)f`syFpA404oVknu3il|#@nvxK;k4vEi(u|>^gkv!4gj9Dbs zPY!<4N7@V431n`1IP!<*;NiT`*KDPWbKSzSqJ|B9={h!bN zo=Z}6ObC+e@9OJ)ROgNqCm-E1KhdK%uU+=MHNnMA*)qT1t?_P|uYz}GDanl4bMUQ% zJirt^weQE=K*>=Ua1Dya^=;8M%WlYg6mW^AI~$&rt{RXpNAX6!}VUh4e~wx!RH9 zlrtd{ZBCQktlG#sbRjP0y7~6tS9bLOTmrn%k7C)tYMX2wy7CUrJ3~q}=t8`MK`LD8GQjRlNm6ffc*m8bxvEPPZUaqeBzdXZp7XvMG82s{>F5{pS9Fr% za(9}f)z1U&y1>{YHcF3sQySGxvPRB8>%19G!BpeAs^ormDV<|nf;Kqzh?pNCre$5q zm+Wk0^QZ~d{H+Mu5qbRS`EpEPk2pLe6sujz;zwMvt{@`r2RXjhtqx%p2)%utHwJjT zc`&c_{ik=|3G>O+zY;R@nv&F`Bw*)N+qi(0!#7Qs7gRtGUo%=^aqECKWLUD>bs<5k zrw7|qjq9vwo!Lz#yO&62{oXbU;RAMJu{qlKmxOH#vn*L<1Hw7Wfbb*2A;ycnBUEn# zzVb(LOMfZM9wU~%KfIPA{+cUVc4c_+PArYhM(GTQ>BB;Cp9^z%jLhcd;n#dw%;o~* zy+JuP<7$N5!W6V49G~NeapmkZ0S~nqXvkT&W+z%y%!A)A!0%J;A5P(V%d2}0jAKbZ zF=#K#+MtW_2ggs7_B7a!Zr}ypUW;*N71UmfF*&%>EiA?3d6nC-W9F;_3yc*l#X60-JERcnYT>J z_hQ!6cvo!59Q$^N6Ji4&#~+szmQ7Zc=h-|p_|*01&;mKWLn7XVHJ{hcYI}a&?J+$^ z1n>G9%yGt5*HJy-RJ3_XrCQ3-)Qaqjo{ctu-=`Rz$VP$|3&vejxrvk5&|*N*URJx) zs&k^r(63=2+5Lt5We?yt`SJ{8u_fg02uC}3XfE6e>kYoj70y|gw(`o zjqh}=n`F|VM_DsQk5Rh1QA6G)6p%ucFU@q4(JNjUR2BdoEJVI9*17CwewK03^+-G2 z?I*j@KN5CF9p=2&yciL^VZ>@62fO$QMmJ{=3ci3Ij{4Ax88K&Ul=7&7@{9o)C5Pe8 z=LW{p+05?#z(sD-46F9!z+NBAwa`WkOom`|%p)!h^VAIcFCa$3Jmbt=uA@1M_Db7b zeHNm2nSrMKKFoVL1NKe~jXtz#BnHj4+fV~*MqbQ}oLDQ!eM35`-HGi*#9PC%j!m22 zjrl_y=#zcJ#T$A)YHe-~o)1{gkyzBUEwKLkLhz}lWIY?+#IM8?dJs4R^uy-@yoMO~ zH#OVVoaVG6dIW^kA%DzdkN7OJw%|Qzk@&g~|No%xK3K;*_=ow;WxoRj-CVJOI$l{_ zz8pOccfLr84WwL~+EHjL>;H>(ve8t-ZN3!SRj5Y^#bE3JPLs=lcHlIxrl}J5z@76+@bC8AiI#Kk+m}t$x&N?Q72-9^C#LsmCl{Y#4N|nYh#d{*HKdsBP2V3kODchl>^SplzJw((dHOtHylbD#8m3U=N zD$y3r@UECR)pg&*7~b7^1N|H2JfC6Qbddy z5=QGc^V*WQ!>@(P_?Qy@=xd>wywbZnbPHe5e*cxpAyvZN$1p>(GEGr@%3V)+ucnB2 z)kPk^z^${EbjLK!Zrc+`TdZ^Qjam7M(+ueKQT!%uny(;2+2*QhIB1HGXLs`UHLOU`LWlgEtS(v>emm8Y#hR zShPC5KHET_D8Jy#g)brB`uUm1vY9p}Alf94pBu$R@JwT=ZcH167i3Qmb8ykw*hLtx z@riP`&qV(x{&@(?A0L(H&_FKz*JKw+A;?$Dwc*HtY4Yxy|&((;)=~A zMpC4gxF@xf082o$ztrvAun8Ib$g$9^FI4~0zjcpY-D%W_Wd(5FXdf$4e@WYjDLZC-jYT~u&{=#wdxKd z?p3>k>v$92-nx#Q*H^dxq<`4pGO*Zl9}UMdjD+_9noTKy<%|O;fBg^SFKxQIAu$l6 zQ`3sTcXh2lk=!{w>lbQ(FY6I|BcFQfY7W#Uwyj^MQ64?gR@B{eePDw5~u0#lf9owrq-9d+!ZQEW)IG242x<=j7mq}7>$$Nqbxz0flpMUg;+WX zeh%|^lxfb1TJ3;!z9J7JYH8I?|ML@lQb5aBgovPLnT1}b(`dYnn-O1K1QHU;5gNR6 z%+F)d88Sd(zP=0Nld5OlH2=6;)tD6`7QoVK-c9nVXtuWs*3sZ6<4{LU*{uj*>c<|t zgsC4xO*Y<#L@~AsG4>Z3NG0Mz>exS>zKKkUV(fI9$27kl@$WE$q^`@e7i*mOmDF?t zPl)kvjc!@b^ZzTQkBmesigjlFELu@q^c>%JM%9Qj_}A&Rl;oqvx+g?bqin$NPNxp< zbYSF!lpw7ktj#VT<}$dAhQwhQ>*wxxIQyrb5=axA>rb9QAEfMPuB$|lU=o2pA~k67 z_UUkQuFOy9nLH8Gh*{r(lh04YoFUmH*fEIG!AS1A2QKCo!3;K{cwkUjoa{n*td!;% zyTzXdTy2+2aotfVu3P*IiyxqDTs8`WsiHIQ3)I;#TeO9skK@vcxR62(>!HEik7im% z!y*|}P<3gHNy%u9kXN87GOZ}c_vTFidNm=}WtcGeFlJ>g=pzI@6-!+I^YcIxs=8;_ zyt$j?y%R`TJj?yK&6@o|HBbh!$h)dQ;eDup_uf}PyekVz=`tAq<^jCJM$2m$?*QI2 zId|3BxJI;?skiR!S>UZ;UX8a?vMDG!2l1CV$e-a^WT$R%!N9k^$b_*+<$l!Vid83k zEHZTW<2Jcppc{_>-FbuyY%+3d{s%aI5tN*nM*?MJ#g97*6l*^7y$ke4(J7Cjc3_`R zrZt<4rSN+N8`X8Y7`-Vt5t* z*`j_?)u417l1yHJ;*ACt7bDJ-=}Zrh*evHY0iw)y>H}&L=g4td0cF@R=sT=lu>Q_JUy;K*;rAA64@ci+_B2_FW?6>F?C0X>7lOUlF1y`_&L*?-rq?k z-rMzIK;V7{zpA_652!iAjuinN|332&deI)YV|PHMy&tvju@3^)Yzt_~%7BJh?_h=v zV#;oBpd0AXtOo;14j}&jIC~TLsH*D^{Jz<@WF`wqNCLdcItc^@aA8rIEIa~O35W`6 zYfxJ!(Q4Gn52~#ba6!~MpyDKvrP|sAl_bzs(PH9KMQwBj639Yi{Iz8=goFu1-%Dna z`JZ#&n=F98|Nry<_=zNMx$oX{&ppe%=X{TBvxLd@K0QNMG(E>{;gF{{!%Y0V%di(Q zccNV12^pq&Nvnl<1i5vsJ$^zS@r9{yjX`Njy&OML=p;`^bxQ9-t)L7U_I3lEm}`~} z5ar*YPme*Lj(5G}jiUTZOwqM6XF3N@2X+g%gYt~SfVDIknsdPDT{Pb*E0_C@-#()A z8eH@(6^%ln@15qq1^=eJ6~7|J)-k&2dy{%~ni%9l_>57H zFM?VZUi`I$_y02W2gNlSOXc?dA@QVDr6ZZVH+An;km50Q*#Q$V?MEqwrLAAV< z$-CVx%e%)Twl&_;2LhfpeC<$!9l#>0QCbJ@7@>KCG7|W}5jlYXdZuB#3!ZwO<`)X! z830G`cd%f&P^tTO#SWB~UHoGsBpus)9emjdZ>K9H1d!7dPcXafd9S99rMQi!_=i9T zu5Ml9#w!6neN+P@u&Mvls$^GqFaJW(h{7A`YcBNlemC}Be!5c-SJsrl-VC0O1 z)Tb}NC>t5b+efzNPsRLy39*mjB!Zu(tiG9hv1cnmJV~sc{2l*!m{_iF1sVAm*vKx# zg;9ECEb%H?Vpdu#9<}TJ0Y>xW;Enal-Eb9m-_0!7#eXBkkB(zs;z{%ER0p3Oigm?J z+M!v^#ZgY26DT?_vnbvDK9No*`N3c^)j7cf%CY>^9}ci(H$yw051l_ln*Q*JoH#1P zT()N#q6QXdRhSdGeF|6ABbTLe6Cx_iN!~euivJJ$ATdQ`W`rgy0&3Zd(2^B*VYY}X zWpP+VGuuSFQo-F+9J5!6C~BFaZOL*cG5+S&4*r2rj3QK4t2k~Y+PJuSA1@-W`uVvb z2Y0Jrih7g)j`K2S+7pxu{joMLH=8a*+%A&YG-^E`)3i@XsvHZL>%0<$^ z?u6fU&Xs5z=~{#ghu&pvMBKd&zFAG`QJjigXn5I4#GG}MdK>fk>LE5Syz zJt!x?Q-;EWzZUn~*U`#`^DM;OaAZn3$qTygm-gCo$Lc2IO4=Llm9Fofbp7S9V!%Z1 zw&zIokt-&(Ss}G)w=1em19GF{IM)0~;GE0maXogtvY@HrNS$4*Qel#CS#~#U<+c_Z zxC9A#G1Xa4PuiKlHAA?!*y>2!qvo=9%k1*mcs8_olE-ZZ$vCY+(S(?0UHr{WN4?6O z>nLY-3+o&meA+N(r8rjpuze(dhukJ?4zlFoMmcx5Y;7dWxMcVKPWKK?N^qz#l=DU)b zxPVEe3S3K~oxeUbpi=E#HQ2KnJcPm2)l88EIMp>&+!#=2dV17KPeLHp$aGg%M3cL6vp{r=UBql4N`o*3?V&UYkbn^cJeUar>f&3%vl)5QS zj1Gx|dniq&gSEPLpXCtsD%0YsEYQl?patl;27dc5je8xBDYMW#m=0b}_eGMb>L$=& zszifdP#U!OH6J|cUUl{>#=@Q8-x~&bYWXe54CN-Y6V*xVP%otwcoV62%P68oudmXYN=3HmRk@jY&H~=USWA}ndrEwWmyCJlABEmN6GP8&JNfrR z*n4bm5%OB!e*a78yl)Mxs{?j9SpxbY2W*a?T?mH%DG!BD#D~JR(ICa1 zdWGWtMKGh|oOV`>S1NT1ljE9%soXfNb} zul?`V|G0O9Om9}JJw|Fvb@JL!w3lSJ``Tz+Z5Qu{=ajAI-3qWo&hstduYKZgN5h}_ z<^=Bcdw(e>`{CznZ!nzjOHr2n5p-UAaZ+6b=c$ZpJn+{>P~*K+=>WRk3*2DUcKc`F zi1;Gi{#m!p+mljK>>8oQV#Qmu;*3ztSE~V|Q0Dc(| zjMZ+1(iz{TajoEV@W#X(Q`rtRizg6r6Gz|pj_-iyoeCAS9u3bLuGo6fSnHqQ)5_>J zHOrVkxoDFqoCWk5@jl`>Ho_AnV^28XiNZ^s*oQrYCydo-+vUS^vH&B)XGC0leC7{A z>VB9VW=oG%)-Gt+8N1pAgSEw<%p}*+y4~rEBpU)fwm*l`I0e`oQzm6GcF_#S4*t7g zapxA-$8v76eSuv4&F}|cUuBTVwtlt zP3a-i9xK<)*8`8ObqCbfc~k)_F;Tx2EaA3pe>@{b`Rc2qYP$J-qPONk-@MzOAl=hd zYid%xMwd;&v=Vl)HwXA`zW4nf98b=6H*7NvIx6x#IbIdKWoSzPOF`@D_Qy)^8mgnA z-QSGXHkw@chRg#pnThrot8Eu#<``S!59G<|9ulxJrkrFq3CKZDC3s9=8Jy?Mqgah; z9gK82tpUtd87Amh5!-Bb;GOg0)4EZH?E^bv+r4sf9sHa(hr*3Xq40_gqHm0HZN&t+ zcAq5IMuNn08^|?`1FhI6pA&=eU+FFIdz@>@q-xVtb}Z}SZ6B`mqD4++o1>jS8yc5w z_EnO^g^(u*I{JmJXhOMHr-79=ObWUf8T1Pa!ax2JYO*a&b=FJPAXfK zlB|1q$n7Jn+ou7#b(YG>uM$JyMWvz)dktu~ehgPXfv#qx;T<&p@fnA4H)6k~J}z`Bi(;mPh<|M@^ama?5aAp2IYF*5ZcnI-ARX3 zU^~PaX97pYzA@t4az6^VCna7@lCaVeT*fgT ziuDwOmy$^Nwi|q7nv?cwH(CXj<8HCtzl8qln;j_VCrzK-B`43o&#qs{Npy0grq>p( ztk_f+sprMf97PhS!FcDudyW`Nf6L)+e^$OcFLzJ3;B=(Yc@U)~NNy`zn!Bq7uD8H* zE%02j>()v2gJ>l$@T+3}QR4+0?A{Viy#w{Q>GgL0v0!A5ngb4ps0SXWXN002_?_?@ zufiG4sqk$0<9KImZHs@(-RkNVp|l}!C(hQrPModSj}=(8(L|9A($nZ%B@Qd971C@? z&hW;WDiKt9oV$b*pPe&&v~iJLQ>WxgsNTjpir2O-aBJwSO_yd((PV@fOLJ@LN`SJ% zL5o*eRje?yY809_8lfb-LXsMtLI&u1@ToGByi*Tkgj#|ZwRWKSdW$Ne4pSy9-8CDz5Q8Iq?bjC zF>dEy38#4-oE0RBgci59n}0D_Nv|x1H~%z**^sfGD@7;+zl04GH@Abghp}FTY67*y z$TT{pt+NA1&pCiTx5Ll(DWUMTJ4BiN0p>dUv;uHpq2{HR;V;G=K>AB6VRriSWQ*aCrDC*BuRgN zPK=oB=u$|yLoop7BRUvQxkoR2<%U21XL!`V9CN2B}Z4qAz=m zdJ<1tq5X;@vjak}iW>m^`YY&f0sK6q3Wfi7y_|^s&Y95fUrGHg5roFc{bsM&?|YjP zuF!8I^qbo7R&`bUgxL{$)6g3kQI1g2I6kIS7}J?nwOcKXXx3;q%u=@x)&cbW0Q7e| z{A~Iz7+$j;W6S0BPd6C2^{MhE&$f9v3FRbhjwS!zzdLMpbVI#`%4qh>e zRacY^fg>ltI>wlj!*-JSLeDIM`fUjMeBQkyAd_9q8Jgr~8TT1*=NaGCfnfN_AE|#u zV*@d7&n5M+Yb5jg!c3OKGp+3$c~y)xA=-vU>C8!nb^%`hik{OLD`ip+_B&zQ1;uh= z(KM|Zbd=?1ij|S@$@8N}8wop)?)xqlaSq|?e)|4-N96q%;C&`WdjH|&XBlnLgf?16 ziP_c2N+)Tu`xHCy>NY_}GY9k@idvu{=2Zc?ez%vf8t~%5llN+WAnRNF>NN!u+WN~V zIV7va=kW|}{Q3r(eJRfpTLDja%_eW8ch`r}LKJ&PXz!LzXz};ZyTE0=TPQ3aBxQ)M z1AYR<*HKc=$92H_h?*S`DIEK{9mD`(P_@F{HkZ> zc(L9Y%8c%irdm}cM%;)RPf3yUj37Hth8A+-j#C7ige}v-NZR?YLJ3#Q?4A$z{y`C7 z#K=O@bPCq!2f%wmR4Bak*f{?!7{kPlb73_FKmP(`T9Nf^{EM-G&`>ISWirOW#ch{cvl4&L!}VY{Luiz#FUf*!PqodrxG~x&$nG+0vO57xoW9T(h>r=sT3qn2|yL5o*z@%&D%^ z!rF|97~s>SvEAf1aw_b%8qq2rr05jl>9b--2Y+mIE37or4)7H2Q%mbjjCqk~?*HE6 zLL6E;Lqwh~gZKRWl(5PxqVkq-vh;R-*HEQ|yhHI27{ypC&wWqKw{wWJ3u|?4i$8{W znKQW-bBr^tmh7CzVS9so`Ut)k&yc{<%D8HhYYQx^jHzz%>loZ6KR7^au~iQb5Mttz zk9R{Gc>&v%&e78f>dY&>%j_0`f`+A2W)r%CqIOWp35%LeF2kos$rDOQ5Bc zA@THlD`#;5}?Y_L{tB3XA z%Vad@Tn6V{DT2cQenys8TrF*UX~P;Zs$WoNP#Jrof37@T^!7t>!ms9 zmqu7(yWb6oXw+AlKT}OR$U3pAz={8UzE)0#{lTzvE!tnIDrP=2kS1hFpxo+{n~zCxEtL(cejI&R#Ti_m{uq9E3YW^Q3fKw? z&N6Z`kj}hWU_I8mt*Rgos|z^rl*8ig7G^b*bfByEl%KrzmjMkE1K+n@&@s@vhcW(O zVG-6`%0H`RuzJmME#^xRD)m01=ShhmsV$ynwZU`BFKaM(aewQ7h9lMRM1(DxwXH|L zDxdE3lE4bVcBrs?3q60Hb-Ytx+3}o}cHTUc=1qjYXgwW*#`NxOY;#NFfw7KZFMM+J`=>G|y`NrGN7q)Q3@}Zkl#ayz6E%vVjwgC~aGfbA! zcYHPf3Wk4S2!%HrBK6Owa4X7;oP)D)Q-Okgd_r&`R@y54L!))G{qO?&3BM{msZl7_LYH2R?sAafAFqu|?zQzh*M+Fm`4>Nk3 zpfDB+8slO62W5q&#i`DM#ie(ZzF%rPK0U9tX?iAGrW|1OiZpyzHmo1UX#O>vYnh7s zaA2B|v_Es`7l#;jHAjZ^0i3J6fVB_kUvi`%(LF^_7@UWpuWXxN!6Y}za~QYGzM}DV z?#}}nMIZmv@T~%Csw?FL*7j@re|?~_tFWCf{fhg)1mE2zaRSS=@@GQ4FJ?d^Q@K~9 zGEK5FW}a+A#j=WJTkJQd?lj(gaqpvBODmQ|{LOock*9%=mu@OTu3mbUQ4{;#0`xx< zT&vEOGAoW92d-X*8Cg#BehYxB*E;Sx+x%OVyPaA@9XvNoEVsj7WaC@#!UX|yarKj`&0=<~=+ou};`{R8j?oMKd>T)+ z#NC{NlDH^x=+{ zBN9OtFb>1t8^?RuIJ&N}8G3o?*Ep`0;uO6(LDue;aEeayw}fBweRrdrd@T!wAArpuC&Hn((&1jNWVeI1u4s&T> z&H}F{+S>UVMG2 z$`f0j*66kqi@KG-*Eevd_`a}65sZVwh%b!wBI$Uh{0kZh_e5_r&7#1#FESIOz6?## zy)p*h5iyr4IeRe+)~*UhAfhgqQ53Dcn4W7~_jW-utJAMAq281YFtQc!cUqIq&dk%5w)jn^ z8xD7ZG!RdgB3GkLOr60+oKY^s;Hm71(L~oOoibJhJ!tXAJ|_AQ>X5NU0d}W|I~K|R zKh=aaP*3uj(W|*%9gdMuCry{!9U6gtrQ+|*=`4_c-WRjIPLT8FcoMl|+jbPp^eif0aj5bBnbuU0;Z~OEZDv;5QR<%L zw+2-?)7?tWTDFZdNtj20##LwQ7?RcOmn9%F!9qKtW2;MG+FLe zg8n_lzc-3rA!^`!QSNTFg51reSW*L$$Ja-91u<%*e8lGyE83!-T2ZDmqwaTbQ;T4= zV*Rsx6Rg<$vuecCAZP`kl$_3y%;j1QwFa<4_FV29Ul|4}v1>pRm=DQ%9ZJn+#JQ?K zy+PV8*P0u<`Ln~;!?y^g86>C21FJk!>$Q|E=UC8kn6Gw@7s5;?W41_DbtAF64P()E z>rxle6_8=MdTa$)-P2stIYXW1UBq3&h;J$-S2KYrL&S1*D@a1%Vgu_)MqlaL&S@@L zHrkyS)qu$3h}tYKf3ZidpmB45>E^#277_lg^h6_J-~U?uEB zJs?)=EvC=D>FxF#Zhf9pSL0`Cu@e`aE=ZaqZ?-|Cp=!t4pLVt{-zj?N^l zGL(YrhGS~f+%_qzX?*>#WheRDDW)Ip4J;m|63qhRP=D@b#IbqD$9RXgMM!mGPh?`B z1+woj$Gmot|9nL3Pmx=N(f5`@56Dzv!dJQN-t86 zfh#Z$4xbh=_|(S@lSbbaG)mW_Ctd&cCvo>q@*fAq%#;fU#!tDH@Vy7{oD2Kd82rzf zW1JlPmvP+5Ulfn$jIgxgRE8zhb8Y#_#uV2yE^5GP(Ba;Cx~3N9&V>892g1ZMqjlKM zWFtq5++5U2Wpiet#GwbVDto5MRXmA97fSeld4bj*@p&-^NiU65H+lYpSEkHOlmhMv zmcmz3r07ZB7W~Y|((EbOYhix#2z((&=}}3M_$vLEV4vu!G47SgQX}80#8^!xaEE}L z63yhf)vk&UQ(PF!hg|z&Pdbsaz`LsG349w8j5TU0j`h+R8XXo_8Tj%vJ_PxeQGMZI zvWXX|@~jW$KKm&jX&Nn*lYNDex!B5WES{LZp0bG-TVrnl48H1UD@apB@)I@s9(kExQbWW`K2QYkR9R^Z}@QaW6TCc zY%9LV9|e7Ofv)?W5C88~pUKTFT+89g|BCyVle9|~$;LcRT-{-Q_K<^{?5}r8{`yH? zHH^~#DCgnc;AU|jdPtVo3$iP~heE{5WHFg*eUB8#NlC%@`T1#~R1rBpUzfUA(k9oU zHlg?q^FWe3<($UF)|%=Ny)F8Hq)#@GK;H<@c-wCeMf;(>ViWSePX9Yt2bQS3-I${>` z%k$qeSz>;I3?$>Hxbvx3H4p;aS-#fswgN~&{ax!>^oC*A6c4tU`#s4rR5NT;ofr=Q^Ah;wsMuHB(=;N^p*HdR@%9~o7aaHn zTVR{RQvQs$TPSjvT)JI)uoO|Jt*AsQ7jpV)q^+ElI~i8tj31K@U~^08vhDnL;Qz#@ zGnScMIx|`|$a~0xH0y-gILL!B6SYqIl$YWEX}Ucu7r%2ZH_8XX*hX_BuDzMkPF(gW zlr&!o>0Z@kvGgbTBLbP7(3bASOp8&ThZ#3D%GuBTnuaNoM2(*$vHmPP*mx<8j!S#K zPYynXRwm6)e#%Q&ea$>h>x>eu8?Z8g>W44#vBToi54*K{Dq&5El={G-GuKWSb^fGL zkMHf^xGCl<_|IaNBgWONz`6=TiF1^HD2(y>bLo{)-X3-|qD0B1@fx7IK=ME8sn|psC){r~`jMKaUw3BWbwE zzcExvB@K?z=|LTmC}r0g_Kcrn;OTBSjNB}vlHRZU+>$-oj${>mx7T&lX$&fh^JPjb2~ zji{GOI9*kkmkq^9vlx5HEdGLygE1G<+*pijdNC+||1*!+SA$pVm3HsBGh&Oa{5?YC z+IweWuLECr@wl#it9V?~UN33dg{Wy8FuwgN)U=N2plRdlFv8aKZp3pVfd#|FVrjjS z)I7oKM&a8#NhZd9Iyo6=AhZ>!uDu%ju3WPMbb&7@qE1f%uj!nGQ9{+cPBZ0@yKf$u=G9lR(t9t$8WUyu7a-H|&EwqVC*k--y3z%_3`B3w)%w2PNnB#{N4!86j;sAMOPbYq9kx&~$CgFaoZyus(bdTVlkta9ZV%D3?l7#HaecFdm)DDW>ICl(h0Y`|l#?wB#(DL3 z6L=N(7@TyEpbdb@pbr|OoT`zGd*!NhoA-na;I_13($g8(yX&6yYGSNy> zt`Yfk4dqnKFn)DdloQCKyCoj=jEFpX`%m!bp#MSX#GPhDZdSZ{lK)*8E1(&6fIXh| zYj2BRmo3IdVCD-6aKj>x-sIM~qU!Y3E8%T}E5dyPlD)Bn#!jLAQ0!sY__}cfhEe{@ z;jOTi60aEbfVww7gptwH-N{$Xxy2c=hIB6RyZY*ghQGic8i|}N$1@*$uFMH>A&C<{ z0PUJ>pqwyqz74*^=^<*Vz_FUO3L{{~n19=t|QzPnoF zgXbC?TxGFXojg*rT+t+ePBKfi2If)}PqEej`2C}*oNL^OrY6f#w3B{QuF&7CH+#|I zG!4WWquX^Xtl)~IBHKCZOrv)}Ik9xQ-6CS6ez8|ohm}-!0T;!!cK50DgZ-uYfqv7l zW1zuty6=vZ!Tt^O@0hl`DAwmm9`pigYaK?JtdgpOkqmiO{N63z(|xPQ-q3bpzV*z& zkLMae1Dx*Of;F$a4+Y3dcyrNxEXlxeEQ-{vc;zI2$0)|?%5xNMRUSq=#P6NwU9x;O z7r%FNQLfiU<7!Xx)gvUMxzS2F&^F=i>qZqcHpl3W->aHE#ciYLKPUMuBPAd$uJT%! zV~d-Ml-}9P@n6P^=OBm?l@h%Cw6F!ElW) z7_Nn%SLQ{qx)j{!a%;OeVrvkRPWht$6f8*(pyTg0=6v8wT$uNSsrF>Jzb!{^SsoL8-HyVe7HkFGErjvP&(0j z0sTLWz6vQ}K)Ta>P4+FHg)0#>(*mWKflKhJ>7ac}Bc2Ijeu43Dn_tB+xitUQT@Knt zWAckTiDY&cYb(8xr%1r4xff6Fq?)|1RUk6U)d~ z1-E9e_+3Om!7o2(KTwe14$vH9+3`j@%e}v>qD=g2ZW;a+kp60RbhSyW;n-}|EKYfb|t4olv^6(A@h{mt(=5#Vc zc-JiDIAhGk+{P6^fBZVB*4p9PGCY~oG*v7+%g4igZ6m41tK%8k3;$m-v`_Hg2v^F` z2K!(5sSNFf|35Oc*QesS>f#)DbF9xKaQ*ujs}N~-u{b-GXP;BFr+*<_; z-7quSYq^c~$IC>DEGnBg9}9(`bp3-#*YkwO%cbYbCtf!TLFxJjldew@%I%1E?_Bm) z!51FvSxlpaJIl`x!S_k|1l|?nVRq2`nDM<_Ti^wUd)p3fK3LSxIyxk3VWlu!)x`3I zr`w;rabonvG_KvRqIf!(jdawn+BlvI!Iri0{|e(9x&a1bIKW<3G+{L?Vz~!bB~ds< z^n#~>LhybAO6m`3)C_RE9%~fN2d%fA+X|emA*#1ahgx*Wbho3dH$OLE#+a7X`6D>$vu%OS$8oRF|Tv z8T!UZlEL66Ssp*h279RVw$kX*n@R_HbFjW(A$QR;u|`k?^Jiw@vvX{jTi6F2unX*z zKM|5ftI%!)3D06~&9-Iuy=|Z|-ifsa0*2K*Hie72TtJiOi=!l~IuS;Fk@tmU9LB_2%6l5ofBuJ~&96(Bv4%Pk zZ4Rq9;f&K6zV(G3FU;^rFluaun*;xH7^*+NS6}7>{`vspxxy*LGyt2HJhNg zZla%{hY|LTwEC0Mk$)H!o~U^QZ4I7vh_XjB!GCMxPmZ8ZQ{l$Bx|S7Z>VUK#5>4}X z@19_@-bv2_Z-!?+9J$r2;w<)i9x!r@)lz!(-3!>X2gLXP5EOkK1I<=ECGFg`OJ|vF z{O*xszU$wJe*5mBZ*{SC%z#FfYcE9n;(58HD>&ud)bEVDnH%J96&zghfX=Avxb!>{ z`>=T=wwB2*l(d!1K5<<4kBIhxmFxGsPj_M1GLof8hZUCCENm;yy}wy_!75|#zh9mS zo@An~j>(qdj(!PJ0Dcq?ckv5?`mvdqe16!*FB-X$C)dW$9!YfRC&-*68WS}$u>EYr z{+3G^yZEmm2kgb{2<~DfcUN&dwe>a?twx zw?Fai863*qYdxJ{@jjRA%Aa=(?V33rQ@Q;RMn22Z6;2zAb>U9%r^2F-oaZi%pdv2o z*of};IdvK zL!u-ZqB*PV{hHh&EM^&Vp@(xM&%|lA5f?|55=vO~Q=Yj4# zZUVg@mS?DP;+!r1DXR?<_H8_TA<>ET)#Ypw)`Zio_R6?o@Vy84mx9Dx+W1q?UFThb z73R~6IkIDbzb}M)B|2!;$xVEAJD23l_7aw)Pjx=XDqhxegvKLbhOo(eg8v$PeI1v$ zBi?CpcT9>x$M=hYPA6y##&pIO_}qct?)ICu%QKLUiu7*(yiAe}Yb+soM{*r#u}5Vr zldgghD&`hr9n4*`k>`E`-}_DM&Mto2P)d!OGe|R?e93%17o4(NHOuHps7ayG>=yf- z+#C*Roj*ONRAvD>D0N*^ya_ev!^9k4AR%uqEY){*(0%I};K#J_zYH$sWL|NO5?>c< z@y3nS;>9Q9s$u?vNi|b1saquWV`*@P#BtLv>EVK4JlzY5AB)lMptXYIp}pK-@@3K8 zA}6BkN(s)D+O%HMX0)^y5Ia`&w}ZxgxA9EyD%Y2jR@Qp%YH4NN*%O&9k|E9)&J`KL z%9ARXC7it+;BUwAU|7bfSv|*?6?EoF5mpv&@h8penMQYc zzjY8cu3F}doMo~T;^4@pF8*nu+s~#OxG1=Cj6V=k&5C}71k{x;EXVlDZvS*yi$6;S zS zg0s1zIK~p^*}OchR+*+u-&`cV#iX_I?eG-hWKs%b4)27iU=Ud$4w!JNcbqQH~AsUk{_qpz&6UCkOxc-DwnA z^3;E^H^>3+2JwUxf2$2*CN}=|W)Pnd>31_%!1aS3`1HScE%Ehk|CF2K&XA@BnR4>B znvlET=Rlg6+v}vbfui&_g49;KZ=@NKC-^l(m=UJ+BC7Ej{>@PbJx4KmmT|XmMpxk_ zd15B2#d8C-{Xi`fTJ(V)Svp3CF$-agCTcm{hL!fvw(sOq!dMMiSBteh&1D*^0z8zo z^pE{%pyM>@V#E_;7T*!yj=VWKs;@zm$t&3$WavsUOKtohSa?^m?s^1Oo@m9rIzbM- zM0d1N3bhN*(YWaF;8XSDuJRK8$$H#Zo(Xrq6gK&OJ3~&sY6*t984;{3$5@J|BM1LTN`ODKdtyolsBE~JR8+{eFEq%r!DXn=%wd4 ztf-17$nq@oZ4?<;tp+sH6wpe)!Thi2DbaOIrpjrHcz*DsSl!9rFlww(j_IW6OFX0{ zf_4wcCrZ;4ux!_ISEEMK>VG&bHH>P#)-bzka-3qd4ilkTKC-uCQ|KD(;bSL4GJ8j`4 z*Y%Um%~x|Gwpeb!+9%@>UE@JIYc#^ftl5G1Vi?z{;qb%|v9oXTYWJvVv@_zkFwPi| zJT{oKtA|8i;+#9ig~$Me#Ziyzg2p6EB4*0&Gr{N9S64iHy)oG~0D)%zjRo)EYeIM*qaUAQ3&zjB-V*P=0CL$x08>D$za#8qZ>!VP zpFTbIOb5t9JX=}D{fs;0lS6M4=-$BiX^>jNB5CDMk1}3-;!5(O75x7xmz^-pgttB$ z6(dA`I|&o=(R%R|w3Yws=mTI|tVxlRH@*yp(^5p5ig?7`!V`{2TywjG;yhN@9DI@| zgm%Ajy=Fk8R&lsj`og#Pgt1N!R-@^$cE9F>@uxfa+96G&DwFa4z7a-|73*?b67LZw z%|UB#w|`o!EFf1gEHnG4pOBk8f4twxc@UkH&dOrYXdR&Uwai^-iyv0+dZ74$n>H0` zcKp6*RY1oSH>o%)mm9E9bcVUyasHJsO0m}*>NKqE_agAIHeE!AZ9-g{f$a`W%^%ol zRb-~ePt5C@idgj5bv0>C33le1gi>5N+G=$czN6UH!T*WY6n(H;y$4$A(R$&no+L_} z?`Yo2H}HQvC1+ZRImH{vub9tah6UzVkTg8|;tHm7PxLbKNF8r6`*l3?Rh{-?kK9J1 z2DU7s=qb)1+IT;&M~#0w_KpM&31U|7lEK1yc{<6) zoeT0Pj0S9beGMWnE6gi6^qo8TeL>vELX3nc&clBhHhXoH&%%S5_1ZCH;TiSFYtFfv4pyY=vU!VK`*@Kiau{YWtUuf||_&s4G2p^8f_ruF+I%oB7W<8`it zT++%XjV$2uIYlI|F8`SZteWTcThbMrT#_EXVNv3k+#+{~`H^z!Pc9g*4s7q>A0I|3 zL@|>q9e>;25WBovxT;xPAKD#q^C>_1M!AE4)uH+ZESPA;j;-dX0h0m7H@!vBG=I;Z z4{0aW{L?i!fFiTclBVA$$jOZfk$s9=m#er$R~5*|ogB7qfL1{d--eOQ#AM|z@L{m0 z44jyYY~{qAxAUWxL(7-L7xmDC+hp0Bi>zRQlXRHzr{KNETlrY(V`!LEPyA)4@K$;% z)e5psg^@U#+oj6Upk=KVSY0}>q%^msdZW0x%dy?fMNGQbs*mnR>6mDbD({$ElziVz zkbG9)#+yU`^!@ZVi$a=OnR#oP4C4{aR*JmxJ-;rbt#L?}g8Gv7W`-`0I>+lXLWW5@ zthTYbX}N*l`bkq7(D-b;oR}Fx@Q@ZyC0=acmRAD3Nrw2I0p=3*3s8LBm>-po7|s~s z+{t$jiQ|=dRA8qkdv!E}9d~>%UhyliFCAkVcJdxdEB|d!m1p#D;Ab0LGbhPbsdC5G z+(4E;eI=8Tz8vgs7IRgJh4!F8(=?UC+_qMJc2Jy05z8+}#LUhnS>us6-*zT?HMLvK z=%0ucxk-GOzjIW(TP5L=eRLeO_ykZ2!u^*(Ix9p6Eq)r&xENas0-KigW2b*ixfU?RnQBX-P&L>t=z zR>#^13cuzKZzWfnx{bqljfIxG-Ct0YPVjYyXO`&(G%}K{$U5#%V?On#ZN$t(%=(FD zWNdUD#=k2~7H({}nR}tfO*;9{1!Ij$%0Qc#YhVFxJvux&8^uC*a9jC*3|}6zhR-() zCrZ~NHm2+pUjNhZOWn_No~UTixf|Wi?O76x-PLN82V%%fA3KI{wIAW{W7|*nQ~l2BxBe_uWI&^ z!SZ?q*t7}Yxo>M?*eI`vASb?g^9bU?uCIRt`nm=&eS~ez#EehqocdbK$UNGFJ0}+8 zSd_ad0k9;*J${|*d9I{UjNwqhxaV`aooPU=%wb(MqQop2%&XUfR~_Tg*W%ai09ha4 zw}t5W07Z8-fPR}DQq5X2m{i~9Pl8?EZts{Msis%URqH ziUZxCamMaoyeJVO-~2GB+iL>3M0EJZBG4G6p)F&5dnbr_zWCfx_tv zu%$s=rQozKkO{vObC2hOl$l%VzRccj;}t>F*=Wo3@g_mmP;mrnfGRk(OS}6@&p%DE zv_xN`5A(o4YGJKU@yy8yR?n}Cb?)$@Nt%_Dr~j9~Y831T57nDm zqwAhYb=J+&-bPMfQGX?H;NC-4&T4k^yC`DpQ;u%`)HoPdEXH|kEsfNGYxXN*#X2n= z^qdYOv*Oio#0ahlT+3Z)nQUG@}rTL{zZY!;A_^j}O&qh(( z+V~d*YZ*NOtySROaXRjhX!e7jo`}20a*$Pud27HTw2G0(iLmMtJNWWZJS8w*QTsk1 zBwl83q1-AJuB?^U3SuPX!;>QD%ImFVSicwazi^N5%5PpPT)rbi^}i5LTUgT-E8nrLfCLs+>gs5g z-+)Gc=#S>1Z@0G#3X?L2T=;qA>7JOt45EVn@<=YTka7DJ5+^0vnQIeEnVe_snkLzt zR5!*KL_eq+&=Ae92+M(t{oGF~lDrN(-f=aemQ|)56%=d_e<65O(Cqusi+A+iV(9k` zVf-Dq5o`F;r;cvG9mYpTqdB~z;56kJTd8?aZYHxz{IZQUzwD2;z=w_wkY@_CM09jl zaN{Wd^e|=wgNA37AdjO4EIOFoeZ_eGHQxX{vTB%ER=San6q);y)2Vdu$u@f*lte7IL0CbLLjuS4wb+dkFobsq7Q0;t9UpRHBq0*}3^az{q{I2|p+=F>9~`~nF) zKZM_ZO#1f2W8W_Ks%q&IFbiU@!R8&>0(QR6sO`ACr|Dr`Et4UhRca=jRpJxJ`S`FG zPb(GcxIPa`G#oF;qYS4H`bv}*jeFv(WKZfRtsNM+UqCvTr3k`lQeJn0w{$vVS=n9; z+7_t-@7pkYl>}}Ueu{42(3+a^s%-^N4t{&U=$bx3T7aZDr+A)`^mf|0N;{LIb?-PF z=?liLkwB*KZy)lX!VKRt;kQX(nb1M6i95J>bFNV(N$%i&{E!raiVD=Sx3gXeE0pI}2ZemRA;& z%;%)F7VSj-RHV1kD&35d1+69f1$dD(phTq#ISUG03%2LFoh zT>!nLmZXkq(zgO5SK8M(&i`lRr?A|P^Cw24C!JT*c#o|)fqA`GI zgM+&c>{d-Q?)`5nVzNd2OhZ|$OEJKzP>#3y$&_0KE34{lCOM^rcEbLwRBkRU)x67= zVr=CfdbSeW`%~VD_}(#;CnKm;3c9bUhdw?va!;AKa?;8s?g$>||7Yai(w#Rhxl=y! zsI=PV*(cxm`N+S^rFY6F-zgcvf6bg&Pgn0!O`r?KHmL;de>MTeZ&OENW3!ekxGbcC z7Cg>uk&_h8C>OO}5jSl!uqdVUn-a2J*qQ-eYVvZ#b>_hKfcMgl`iYXBA#6U*zZ9a{ zI?oTXQH)ag56+wvrSjb=oY7#Y(|6R5I2wv7&4fJ+r8IkM!DrtM^JRj5{u1l?s<2KA z+8MZmxYDk!X67qBTKm`A7SCinQJ9I8iT(l!FpSKi>r%4zQjA~RaTwQD4j1MZjn44a z+CSc~`S7Hb_#nvl^k{G7sf(iq?_>+6mCp!?_g)NPM#Y%zvZ@96=d^H@mSl=lyU}@D zWH^ZqO$(61CudIOEKN_EKW&r+NP%|1BsaZFvI{Q6&e9z| z^>fBMUr4lV%DQ){rYSEgJj>OT#r5C9Tzk0Syaz^TjvBD(3-{{a^g&*#m3BFuj&U6o=+@%NvD^9Dma}4cwFI{~~*1JW>2n%ns@RVFT)6l+Q>AX`+ZzaQ66&6`< zKJ&)`E7R{$z}pH-=5cs;2Rv=c%drI%Tk})pR(&rcM;q?DpT9L=RciC}@ckI^``60m zsHE@X$c|3UPnPBUsmbbOavc{AY-v7ULJI4c0RzF^6`4yvz-VkkFY3Um&7#PDrM3&6 zibAJ;Ku)wyW*~_$@P8H~`#`c4rLBA!(dkqKq?{&2(3b4v*gSHMecVnc(S9@I3pDP+S?*5 z*r)H+>cI2LPKI#O)(8MlL^>R!Bmn1OI>IT`dgUPvYb>UYBhYs#2 zm`1a_J{*u4uXCFOJsU6Rn}I(1HwHFD-!=S)i^((J8Q36)=NBD2*mW>@=7Oeo23W&g z!!KNXx!~V!<{G)xF#8)AGmfNNnB_p8A{HDI2{;`2IS;!_avn!ok$nRjm@f||=RjKv znh*ZWQsIfJG0c3w$uNJ@_uAJDu9YAqIA=v_k#ldcF)d!un!t(=O!p&=iDl4@Utn16 zfJ|oGsdM6Y@GIRwH~em{7w_-j@EW|qkTl9KtZ~QQJO46ZRcUAI+Dn%voFcsr!pu|m z+MqvH5;z{^)fH_o&~@kK8F$J(I6Dtj+6oGtpqHG)tK(7x86klXnPpMKC}i-i_?O@| z?%cs~H7ob5;RerKX?!H0sr+>@$wDbulxh;LF|9xJ3<$qux`M{$VR7d{m=(E5TXx}> z2SILm%y%+YlH>Q7yfL#eZc8zsQK$wO#EQ#~on675^w4p`-0QuSMHL+B{hW0BqZX00 zh9Om{pnh`j?E{v)mAkl?SGjY5JC&6>m#Rurq=6rG)zJc5Ammt9tc2ApQu%?N2$kyw z7@+ULGuZy39Bje3Gs&|$m3xip)vMj9B#WdU`T3s*tP1U{dF}TA51w?$d$-D&Yh<&P zy@hg+4f1|ZwpVVEcd1;O!-cP{_idU!!;*hoMNhmIaQDu6zlmIUpkf~Ud#`o5kFYC{ z%BGG(mK;qJW6jAyOd5e$Bb-((ndvifXF(yu;YA#Z>(5dw5s;n-OV`zdWokcFj z@~5VyRV2rJ>Y;#Ejk#4amy%jXlhIAYES%%~nxPwA?_7c>@-u4bS_1F%`Z$XzqB?d;fi0$hOaEYf-XpSFK2 zog@D{_(ry*LuPd0SGk>wa+0t3UDQEQKdFP5oX1YxOLHeU=ep&E2N)LjiEb6rtgD5z z3TEDi1xK3*tIGYs!&Qm1l9Z$LEPFfp>zKl+g-;I7q32Jt>I>_v`w6>RP%I|>rbTf{ z8Y^a;EwFsrNAwpx*4ov;mz}~&*G)f`nosvFOerp8`b|2a|6_ecf2lr_9hTU2y6>v7 zTrpGok$$fp+DR!nXT9U*b8}}F+RAOog({D!-;_+Uqqy^D@XnfZ))bQU#gBoFBptEy zmKSX7l`#^A*~1jWj4?DVOCp&k&mgV9Py}jOu1GBd<%I?BT+Ry-ogMx$=N-`ewZ%Kh zKoZOqt~mLy)rBo19jA&}Tamo2j|piGhr_4yJC$;B_OVd7BrGH7&!C@_*Qa`ZZ{LjP z4cy*7wnmBnf1700Pdy1#3-o(|62&P2v0`#IW*5d)o`$1^R|JjE6CSJ&(O21B)t8_x*WnX352Ql{mNL72AbhSKLc0*utFd$LhnY&Yu0vy#p8rypXd5 zes%U>^4|P|KOC*NZ-6kSA9hvb!@p$aolPdV|4`r_8Tw?Fz?!qR3yqIJYl$E9%4G1q ze5a=1?AAwWOkV}n>5e4ES=h_yZ5Q%O@f+Cws==d=V9f*k%2j6@lJD!4YZ`tyy3r2z z$jnr3U6YDieJ(|R^SR`imOv^Uo0UU~i*MpMfYvF+O#v7cnYFHI8MFnXdfO5(oMoyV zNwy2uJo4?2KRlA(t7jZZ$^E9>4bXQccVXAcA4}v*f6Q6dd|~>{|GMx}wl1iif7jXV z8=?ORaJ>kz&EMPDeBq^xRcGfXt~z^2{$|0?F6bX^zVIg4Im``v3*gB(`0bjD$-jjD zmfrY8(OMz1^r@-&y=OLhlek_r!{jLk7-eeHT#n`T7xZ~7f!~7$O_H7NTMBc;-Er)k zCgtw_eKQ07cR!xr|L4cWxhuFo+)q+A!~EUT|JLG){y*yfr~l16PWRoA($XiJS=#@{ zl;8CKSwFXbU(M;h#VZ5-U&1`!OXn2sFNU9#B6lJ1DsgQ(wEEms;0jsK>Av}TT-Sf? zFRj5RYq2)6^{@RK=wHPkU&ik|6d?KIcR$4SxA_pLsm5 zv|aofIoEvNMDowg#Xdf7IiJKR8jhUPNIM|o{4P*_zv?y9|HIq6$3<0j599lsxiZ`a zMMOoN0fYe*1}{mPIgEHjtwdA9vKpD%-s{VphbJN@={!cVw$F0D5SKbObajso|)wda5Hykl8Hw#V%p`;32FIdk>F(b zkQSwypLnRcx8;CHY+Zimp#1V;P6Oiut*GJmyOKhc4x-!ddN6dhW4~)y=mSpZH3Dlh zhz|OVhe&Kt3sK}R?y@iEPVC(vZz-08Rnd|m{}gPbtEV))riBE6b*1Dc%Fm9dWDSwk zFy4Vuk!G2#gR>Qe?^;_T1M7>TbX=B4EwE#iNz*P{`l?zS1vk#HU`Y+Cr!m(a4O6w8 zdhYQUxu>_f?@+Wa&Q$MmjSUTIIMgE7BD89-ZY#LRYLgkU!WAH_<*CJEhDAC9TyiCe zp}07zNXq*ygOH)2_w5$Y0N4sVKy3sw#ykePE9}C%;*lZ&S$2zz4&aF zhY{>y3}AGi??I1@>3KhL1RpQ(SG(>`j#$*voc{>S;4k_rVkArr=ax`?vH8Sbkj5b~=@f;5k8LZF_rtpos742In{TlM>6BDIjtPg``kZx&s`Z3 zxWj*rI}-ZY*zT_|=x1vNU|&4_Pi^1>e;UV5Gfgm!ouG1tfzCn-Yqc?eeg^ckGNeL0r9z72EtF|t)kH`4%)v9X$L(Bfb-J{6VK)d3&Hvm_t^)ded7ULT z;9Iiax|6NR;ac2EQCo>8QpfUVfg0zo#B{fQ#3%aJsq}8U0X>?|_%n5E;pGr^LYL)m zl;|y7KOW=m2g{+`2Wm88G}-)8iwtdtXlgqoqV2G-2VVnkH^Dk*U>J;N)hGK>pSq{qf6%ko*e6GDtQF^Ap6`Q~Q>#n0;@T9hUJ-g{Lq$g&*dX#xJidK4j}Pe> z-h+;p-Sd4C9YZM{yUzCa{#ok9EzR+Q;mT!qj*sYNx2>f~_>yL%#krTKXCXL`&uVuA)ann?8FTz_7vkK{>g1dl0z zvq@wK@O2T1lO%PKB&l&!Qj;Y~wMUZJzNKCAiFYvQxX6kE!1A?Aemkh(2wd9UQ4B{RNrHyg1nZ~da^G`vK%o0 z?7bwwHVLt1fBo=^HZXvfIP&hL9(`J%tTg1dRe4;kkkea_3&6h9?ykMf{=|Mx>YsjW zWyxIl`>eHF|M=Ih-UB?QWR`Mk0gqspE&wqZP%`vAxe%&4bWJv7XUB2@c)89Lz*78l zbieuWX4#8H+;K7725Gd3ADRZNH1DcT;}}C?{aNu#TR_Wq0W~h7QEvJ0O3JHqxigd+ z2|$nEJiDsUs{~?Kah2a-5aKTFxSF}4`4Y>hU1~M8Xsb!A75@6W7)|3T7I@p6pG(h8 z1v@^xGBA)y>0eKVo^6)T98?W36Iq$hy}6?ok8(C(J<;{;mRqJes>d2gIFES-lxqKr zhEWwvb$7aHM98a(7hd`6@Ak2{Ob+x*bFn1SCDE~9=PN+JnVIrUx8xvz(rIgFT2*MN zd{dVk%=cJmy9-!9`L-Qf1^eQKnSVih069pzO%4V+qWpG$yzus4=dO%OlB~2;XczNo zyFhzXxN1oPOHHywlO#I|tU5@Sbeo1u`2Rse9&c7M%1vQ9I*+bTfX$*d!%$g%Lq}yh4nby7Q!*QM7pXp0yJQXD4lML zcMPsnxdKR-A@Y=blXTzKFYXUIh@pQi(i=|&096OzcpB*5t$RWpAwc)xnRw0&YNfmS zp7JUal5j^4dTG%7(@DaU?tu3H$rsH@w@1AFey%KTGQH_aSQ#(OzFJ6c2Mgp@Ltik` zgJ;Ij8xKpQ9mQn!Dfe3)g%EqNDVXkZKIJ|p;tt=hd+ZsmpnHa=LS5g9o141m{KQ`@ z`DT^J7rNQw`}itLDs~RL!oCXJlFMCcrp%mr(z&V+r%4#*thj1=HP3(EJux@T%G@d4 zd~?$MzIg6R9NG(XG&i`*dZ1sCAWJ`>ECoLDXC&TB-7QPOk}SnqxWRn?$q4g8Q5j2g zIv!Kr|7T=Uw`A!h9sQD|qxDorCv^KBmlNH0&1$){dqFyvgQHsZRrF2qcexq$yvKJ- zzlCzs+D%|~r=#+$An8Aj_V%rz&{|2PYzE8{x(Dt(s`-tjtK>q>Tg#}Nq*k=%3qpO zW8XF_>V6S_wCFe^^rvQ?Z85V3D}-p}FzR4iPClb@Ib^$9=7*lCo_2Y@dfMe5*fO)i zkp~oB;8k*#s!@C%Se+-_|MJ?lE4g2qhcgF>k&72hf0EMgp=5Q7gM2R@BEN_~5XSgR zb4su8;Z50ch;ZUa?N@rU#lW$`@8U;a;q#jKy|~xJl&X8&KBx2FZGqGS4vze*DdbO< zJl-PNTM8~ShjD3@L0pAd?I?FeGLx(Z&_XWXH|8|%hO@TW)T>t1r5bXYpj{$=4!fWC z8ggpId%~oZM0}6!@t*B}uNBi6#t>1D-e7CRkzud&yWc9EPkd#L)M9YY9olO&}VK zr!jY|Ft^h5ncdi<3^<70EOQugy21*=FwgdO`Stxk$5S56@wPvQ#cHgqg+75qt1TbT zOShb#mw=ohQ>^|wSxj9%GX7Ih#GMm=2zbT6wjW#K6o1e%2?6zW;*SJ)JUoz-8%?4* zi5cs0)`@o!T_wh#N1}t4I&m>z9tvp-j3geyb@CB|tZd6+qH$XuUaqWk{XrPnaxe-W=FHaeh)yb zJt~%v)JhC{0K#^7j*4%SI`JND;2Jge(e^rVBdMV9V2WVjtM;Q1QYU^%LzOgi5#%d{ zd|yJig=7N-Dtg5J8)8>OYz4#`Y3z<3vCl*7ix9g5Vl$}^qe+fBv6QAz(-hMoMUDqg zFdT(&q;bV|36tS~;d?aYum+_10V_!esRarVTpuOyH^s^%Dx4bY^u#E~YKUz;-BqFq zO6*mOR7Z-QvN|lJ#l|u%g^Xs2SzuYsvrP1XW+vt+)KDi5B}RaIfv$h0LO?u^?EQ8e3D1TRHhPdgZmroPEGXap za}S=S0<>pD(81*A9z08>Jlo%K7{ZKCXIK8*gJY?bV-*lrL5z7Ax1&cK^6O)W+d&w* zdn=IgEZkYKzy>LA@hz27`SlLu+hGVtzy6XpE+N-Y+4?k65@CB^{24e$TD~JDD>1~? zrsn(kAlEOMq6(-@7vzlo*`LMNbkm~_i?3<*OU~P)tp~1|6oCPZz%XEs^qG#<2%F8x z-x|)5m|$UpSZ+l)&NQ&bG-n0qw3^lu8yP}kQ}d^QZj9M8c~0*oAGsE(WGS*!>V(MZ z2NDK5v!S*LKyNM9MkZiw#@9wC0D+X|9aU&@Pz(<(s<7H)dn`M7!jay+$g3`mORA zfBB^@zt%T4rj#rr&g{zEX;D*X#K(kZq8ggzJv~mwLMJkO3ZNnvA(= zAUUXeW1yCw#Y}xK==T^wC6kSnB}JTKp(i|Wtwwg>8VNHmHd$FA6z`YsEniFNZ$dBR zY)p{Q;G?CCEH*dP7g%v^sA4PXA7Xd{T6Qc*@_Tml1%z$*(aSXjj4;z)2YrDuj{1nG zmd7y$6PJLPg3k03rXQK3dEtol;5C!%;5D0KE$(q+v#T}H#E@BycM7t@q5eMDGI5ud zMkv3D+)uyOo0iLr){b0h{uSEZdyHZG8F8qNNz~U9-5JrK1zD3ZEk(?$)-S5+L{sWf zE0c7f^-mkEwltz#u^$5q;ubeK5YC=*mF z*?2|D=u=F~K~mj-F{EG-r)~+6PfpQ_@s_VMMx6cJRY`gqNb5%1xl3B%7kM4~ z25V=-iS&Q8OnUD2|9_PIH~Wj+!R`V1?g}H3P}jC1MsGKT2}hTigv)l+y1&^J29xkf5v~|4q<0%mxWSo2 zVitiui^Nm?!iFNixmRTAD`p~;tO!~^H7fY6teIz`GI&T*6_vpB7swk2DnWlgoqF_npClOkzJC*q=#)R>rPf#kyF=)cQ5VhC%G3jig%9 zkC1Qf_xfIj(d#X)aW|~JB(9CSiCn8G?Em3e(PE1zRh5k8`j#r7To|4}PaPXZ_iDi3 zDN$a+@BuDGfL07J?nsKPK9uBk1g%)<&m)9px{owi*hTm2k1j-< zRV^z?{|~U0f(+=Vi#j7SHXVMIEh}VDzI?hElT~cS6}@zLW2yXRf&8W|zoj1#4#j)e z$^-f%=TMSUAU=fZ5=#`egkpgGYT-Y%gxSmgsU_SGp+Pi%z}wFAhzY`u5HI2oQo2{E z#iq)NdMf$_E6Q#7#$aJ8#q5M#+N*q`5#?HvYUGuk>s^90ehxI$b#LJM-W$;qdO8;a zeEYK#Az#5+CPvrw{ve=~BuCX&nEN~a3F0S<{|VwJin}m2aseeToDV4VG+`|2B;;JN zKi9b1aus#wvYhYYvCW@y0;HTpaYvkE^}%I`b!r9+zjn)mjnI-zb=0ytL?&9vFyb0t z_+&iV#)_8ZXd5dFtmS5tFtX6N#H7-mmdX$FYxdA?`RV;@P+2gQot@U5(5s$p=zl(w zds2_>{yVqbi+(+kIv1NZeU-^A0_wfvmD(s;sdGVd0F1adat+Xj3Gu@v5UhJ<5!%VJ zc*Wajp=s=7h&B#vX;b+eV$j!05XJU{NcYj4BIt`^pf4)R3L6-_W)=2erBfh&PPDlj z=ICyi>m>W>j^$vX{mN%@GC$lyDBP!;GAX|w^nQkYl=c_+o}iOP@WmIf!tr-{r>Vu^d)`~C*!*;0X#=E94J20 zgA%lr`-7K8Ow;SZdXGct&FE*b>h|bz{wE31=lo9+GW%~565^K-DF2S|Q7gp2$5;ECyOG0K-36XnHLMr_dGQfipf)*xn_Dx$Bga!!YrsSWe&aU9P=$%2S_8Awv zR^5XO-q!xdKxi;+{~&h^v|G?NSz)Sovcza3Gr|PFnNg^}=I}lHjUh#U?>B;l zCEfk$zCtP16rIF(#V+WMtt`AHHTzQrIJ&}#pI@QTS{`km{wurk-q)SiRVbxNhrHQz zR=;8ct^>BiE2lJz_7CuLmbQ<73MZ45q{XOv!c!M8trBJ^Q1apoyXS&PlZjw<)Pao z`%7EU`UuMTXgY^tI%_vC_DhgVO3CW2y+CT8`xWd5N`2mHGlX~3_icZ`woRKmFX>dgT?iE(sjUW2)seRnV5;waRX}xYG~UWC&^eU#;_`9@hCV zf36UkD;p%y;Z6~ykR<5`yXd}M=4DYL&4BTY>zv1hx z_OH2b;S1l7z&qCU6MToze8uevP{u>_{bk5^FO*UF71jUnh49}8Aya7l(-4vaUlH`{ z6Zm=x%9*Pd;LFl}n0pq!q`c2V+^0=JTa*BS0lue0y^CqPdX7U`GHmanYKdLKGQm$R z)%%pz{?Hw_@ut|`qaB4|JHmOMRhD{s=VjNtBkCZcJK8*s9K}&5&*(x+q!EGQy{?{g zl9i;4zrKDeY9g?Xy8F>(Z6#ZAE^4JY)iHbtS|eDytff~kCNc7i-F(OG5~fR~TI!A- zTI#MIT1p8LG1{Nw5y*jh6s1NDS}T;w%r|t7a8JX`i&db3hEN^!tN0l=l*0R06Y4Q3 zw4yuoU{hDh^W9;n(`u+rV?g&k;?MJLcl-f}J4E%}YobI8pZo1Snb1dJ*!~`2s{xMh z-0Q@xF#4Ta1-e21o%pN5>{ zXnixg%YMGQz7>#S7^Ij$Q%r!bIQZJ8-^oAPvC4&I+zDZacVqhR-1(xE|2TXPgSwI+ zE*IWo;e80!1@8pj$BCa`fE@7FUtIqOo+<;m6Orbd{=gI~_%0e~x?vhw)dkaC{;+^| z-?)J34!PYvDb44*u{XndrSDDfZPGu=BQ%HHfB5c$^kMLJ&gXN7Lfim&{}tZD_hxc~ z;QbW5NA8tUABXoScpnJw-^06ZFXC~?eE{BL;hmv*{j`Pe5PcG~&IAap@a10&+PDMW zzVI!Aw*>Bx`@Ao>^o5I=oEk#QeV=iA08cBtuZQ<)c*isjc>nef3Bosgb?_ESWh5QG zSNK9MDBsfoZt-GH`|FxtuaKk+cpidhofyPKR%UZQy6wIhJdUz80_h-zdz`ejHJiep zAc1SpZ*M9W{x*91z2snqMwEP9oyz&5hX^nIh3UwUj|irTdE~A2>-i=$FJ~BPWOiP4=1x=YrT-+bSHFV zQ=j(3JkpKzv8Ct4g7{mzFQC=XRjVPwkAF%1)Xf{8Lu=2}rw`H&%o5c}(X?NZIi?OG z3H`Y1&e@43?&Y?3w%&Aqzdx{4{hsE7<>ufz&@XDs!}Iz@h`Iv2O#--gGq7}A#&Ywu zdZgwdx6Su=YF0M&ThAocwEAq%-Mcg+vXmKfwmISi^#7K?Qmv>gc|?pWxJ!&MZF02{ zt*b4x-&#}a{=%tTm8&vzRdw$XeZ&|NUS`Z#WhU2l7HUd1a*CEBMPRAD-=)QQi$e`E zM~Fe;2sWskl`xW!Wytt|78xmb{VDqda(r00adDsbYx>JGzBDV&PP^eNC^q+b+tzx$ zu*&sh=)kj8uBOn5+=zxvE~~765@~(kcJ7i)2nl(;VE*SXZ`g46)Vs%w*?|AdX8O3F zIH4Bw7JEOx$rUP_$n{UsoMCjOCarKZ-z2QI1y(XijC1}VBgCf=nW08lW~*|Aghq4m zj;A2(5@8L!PF1-sht6|UxmrRWb5^!9WG3$f+x(-bQ2Lw~708d~X7hn%1yKRBu{Lw$ zKq+RB5xoucH4p5=e;h?pGHL_M?h^ZwBM;{#L{>A#LbJO15i!0XjYl}=MPXWFhB+#H zQ#LmhY@KjV_V%L}F)n-)T>+njvDpx#@{Hy#Rqnm`4Yl{4F6=57OOwjZhzh2q8Z#K9 zioZA46Vn!gMXRk* z!N^B9O~@d4+k2fTPX)=Hr>@RMUkWYX%U4B`788-f7&)6$wH#J7NB-zO(22X|U)Tz5 zw3nSTWH2#DL}EPBtYC)-TdzocB?-G#7qmhBQ4w!zs!dsSb6aL)84 z>Y!1x0lvoozOZLxOCC}`2JqqA26!u^ZwQ}E5M=!_!k#&>8ljqQw@utzkFeqm*$5+0 z-vU(9)-^|u-XtaxrAtdTi3Z&>)=lD2<0jEqAjtx*Wl0=TeF(CkKO)|xGgk(bo+OzW zN5nLU9~m}8IQ*xSwrllwlbCEHdgSR*2&+*gIIF}kat~MwrZ$^p6TC~h`_X<-zPcEntSQgFp?_>Ln=0R zXs+)sIOGoK1glD`p)0p?s=p;@KvDs2lWxX#qGJ+wRWrK4G7@VS7)CvzuagV`&C6)T zQMfX}$nI1ms85lW@08ixLhDcNJsp_)ISVuD9rNY-U!jzM78N-{R~<6LPLd%)rXTmN z)nlUDEsoS4g)$N6dDjR*e0Pg!+IiQ~{qGjtdNEfE@A@@!lZK zS+zcd$Ge1|;3vWFWAxVoc<<5@)B*Y%NWtmV;Qaw3Or$qtKkjWzivA4 zW`d{={Z<@WF~JgOnPV|m*7?`KkBX7HbohfYXyai!;ljGx>*d{5Ymef_JRzVGQDMIJm)FG<9Wi$es{pF@PZ;qR_L zN%fFv9$(&EkI(&x#}{(H$9MV#kM9j9OGwQ2mbJ^Gs)?>(5^-r|4pChb$yp|8cdijh z%^H#6g9K3?R1p4RkZ>vJ@oVxZJA~tx5F{5^`8}75A$Bd~3K0bPR9nX7sPKCVdRea~ zD(guOj+&y0%*u?AS*BRD`%HO`=Jc2vF;f4Qd2qEuBnR$~ssTM2B(mB_yhY@?4P-QI zkCbjhe;$E_|sdo6j z3(_yKkAq*ET@T@Tg;E($7OtXYK34bxJnwZpa=zdzoW~*89xPOIO1&8@wLYHREm@)a z97@h-7GO6dB0X(DE&sXy4i&GM0PC2j7TVuh=BtjCaG2;K)0S(7yv|GR!V_X<2z$ z%)xx&B~otDag6YJ$LYp8&<+C{^MyQ;-Z(W1JzUZ~mZgmFvWTk-VfJqu$H8--Jzw}Y zNomZCdIf5btzFa3Smq|9?|1FuMG*glUAB?YA9lyLe+!(!96#8Q-)zdbM3e9g-=ecgRh0e1?46ICQUXBYl5)n zNfU&PNz=MCp*6yLHcMU!-Bm(_cWs9OuWdY&iuYcm`Vf;ZZG7%rDDiG6<0viTcn=7N z0fh6&BaM=bE`pE=c3Fvp(>}T`HpZ^xmKjLvFuNozcacOW?IkGf3tCzQKvY0J;H4U* zuze8r7Q3?ID9pFtiwXU}rxufnY-ZEYv_bZ<-%p!Q+^$b5G?j&za z(-?-H)LEa4CTkU&Nz6repcg%DhPgB(z@Z!#=1`Q%X=zK_uef`AY?V5CD&R-=xz4BP z8H01~L{Gl(04)>8ciW(bW#mw^{9omk&-moHa{iIH5BL-v#=i$~Im}LeS@ME2T{O&v zuv{YJlj2^5w})sstD;u%dSlS*c=^ z0(}&3mi7TN!b0?s+E%l|(m)kAv_95I&z7 z!;|V+4|#m~!o$o+z;rH?3crsq$?!XeNrK;O#z6B%dUaSQ^@`l@qM~eW9AIRj?Yfko zPjt$%u-kl>5bKm=#v-p!xv9^eB;d?-*Xc@zI!u0 zzON46+6SH4y$`zFy3A-2p0nZ1ExWZ=)Ro}*)AW1I)0So|%iyg^Tw|^|O5HzP&!*w7 z9U~VWeZid|>Tur3i!JSbTe+3EY|QKg(wbqzbKFDmU)Jsa{wsj~OQtFPKbQ!Avbx^8 z!u_vAm#f~6XDtJxV}%ocnX0G;(AJ2i@^r9$Z19fQjBopNTQI-W(Cip%2yh~tYJl^+ z1LalC14Vfly91tw#Gy8yyThZp&6A3>n>tq5`qv{suaggZe3S0+__7YL)Zd$uTa_Qo zO}lY(;VQGLK8kuWJK-LQcLy1x`6Mo!yI*{6u-!c9Y zq&--pu_)_Pb5`d~2kTH{Wrk}koAdGZ7iON^k~Ii@!!gEwgGq@*>v-rrPB=H_p9a2q z7tuTPrb(8|VpW&rQf}3{#xh}!f8}XiOPNTgE@!ntUTw+2GhBQw^j9T{jScQcI>s6U zoWENo54oT#^#GT!$TytF{3Dowj!{N~^EBOeW66uNI>h&;BmJx%?ViuAeO*h*EJt70 zSb{g3^mV0?Sxzj2iB<~Fidr7?WmfXJ#9v!{hXH!JWJ4cFrP32&r%y}0@8T{rW!X8= z5%+hwjuqOjTJmZ|QUW#4!^S7u#gabB=mqGkqXJ3~wG^nAkYZ_p()z;T#g6A*r91YLU zY$y1>t`vCt$d;HwgnHYO6qE3s?X)(atnQCq&-bv0C3Z=`l?qJMo2AvoB9ZRXoT$ZJ#ppO*R|9O}Rv4o(Gm9NcZWta>g{ zT6280!F{4b#i6J66Yhat^rm^j-Oo!>(0g;abtsfvY{y#O1bc!aRiI^mY(zXz9!A+w@`>=fJq`5OC_73d8@=-)(pTAozC`%M zj{b<$LLT*by?ZPAgvM{&2V-*O+AA*N9C0Fqi0vv4CFq1Z&x7j+pKdL;-U+2owF^0< zMHQxlG?8@1XWdp)BhjUDl2`YLn230_;G~pZZO^3Knc|W7GKBKw+jh+L5|p>Z(94ks z;r(d%H#EFpD?%-=MyLtoxB!?w(1`J$(|F6)-*LxPAWEPld)Kfvs6)YSmM==D$zsL8W^E2%Ty}|x>`Al(0w+n{b zucqwc)HLrd?)KcN^lZ#=7zwF``zRHZeky$5fvXB9+~0Oc)L2Jb<6Z4tQo7D@{Q`!J zptU#KB<|jlyawCU%6_^p8y57=~`=R+peKy}ypL}dX z*;Wd%J}m#OEjlhjFB8^y=H=-)TQn2H3Lkc0$txgckKX70P<$d!u2;ec^jr5!9%I$d z%_c@O@USS?+oH``R2Rqj+~uOq8iDO00^7VTrosKQ$X7jfLBi!-ip#@WkkTqala@3$i8#oK0O&-l8E)izX~6HC@y$VbVN+Bk1N%^96)?S=%pLkybDYhxajCBpS>7 zQlbC#f2Z&hBA$7%$4Bw_^(ZYP(qBfBzl``ZW2lw*o4fDLfD2=&rj(cAcj!%=r;}vi zK)WOh``X=qbZLZox7LRmVHVX0tp56iL?{XOaQx5uW}s-;Bk>UTXAG`YaXKrbPeeUw z*K>BDU7D!iBptc3oeUe_R`X?wWl@u?v-06d7Q_0Jl*4af%Ew4s?kQ^^6(asE>5rPAe9CCfY;iq zLsj*O)?PVl^Ja*#y53f1L~jf3i2?~=3ie6&pPIm)v69Tnew8wV!ns;cc%>fw4BCB+ z-je4KjSEQ%-tUQLqSKbusN~g)bF?moJmctB1)SF3bT0s@e;S@vAI2-3FXrgD1t6FG zIv(XMv~-!_K9Gt~NHZJK4uIzjc-{@q`+WZb2~|+IlRAu5r>TT~2NG%$8IblcNOKpY z-3re%c;@KwJcUeXX~(`d7D9*lP>yf9$HCJE&mr(!4NpBhbN#7n+wq=&1WqQHI&@qJ z#P;%`Jj;YM`W*oBH3&jgJ_#ckJPYCJyUFOsTS>~Yw!&?eJof3r%8#IzNrafzn>xtrjkc|b=y;-(L0WBl#bgA;q^CfwZmQQJ=>w$-wtoO&)$?E{Hxs%4S3U= zVsE9u_jkO8UZB5dB>T>R>%vGHAqs1BX+JDlpn}}7NiubAyv8K1bsY%rva@cpe z?#LuC+P$~6=0)@v2%~kdntr05{DKddLv#^T`=hGH1 zF<2e3aUr}dIp`EKo`Er48uzVxZHJO0L0UuZnX{tYM)+Oa*=9LgVvem-mQAiqkJ{N1 zF)hd`TQ6V3wwQ>rFr4=#N1TzBF&T_8fz`205ysOWI?_TX`RhaXyCLNt!`^_!$o<(nl zIbCzRGP-K0F6;MSx0=Ta7n>1ZcH;?mV7oHmvLjzu$~Mja*n%@16AlvH?@hr|@SOXL z8Q0vKJSUqB+%fDIpv)iXIYu41^{>}AEQx@z(f*w*>HBZVrbd2#lNro?<>x1}=`9X9 zIv9UT;;gE-B(55Bn0Ie+brL<%q0`rhY8w-sZqetlmMU`%j;2aXt(T##j@I10cyO}z zjAdAW6SpCh1l!!?07qj$R}#^y-6CF^150a2gI1Iaynh?o z9j*x0v}(x;Gii0$NU5sCz*o7VLnEuJT=AhY=dLJK$$i`)2%8%!IySkCOhCd+fLq~^ z=32B+`gEwx7>YA?X*h}=Y`jyGAUnC0UuAywB<9EajbzL!b3&bB{g}#KAW?x%wv1^p zF(HL=kf(uX;435KImQ^qo1Ia1stjZ+7bHYaB}*^%vdBtQAL{eo zH2d1-ZZlKq8hMi0n93b@w?NM;I7~dFOUsxPrCQh0G_7N`3uoUFjBhka)Cj(f8k5h!h^~NqSkpR~m|G2u(WF|p%Dmoruv>bWjmO>FeOXlq zTXhqjAeTFa`TM$$I?gsTJ!F{m%W%R!$Z+wc*da(IEN`Pvnb7R$wL!IB=28c}b}5GB z3onyMOYc(FLUg~;TAU7?&p*~=8Kwrhj}BFw!O+8wP$*l@<9m%G7~WCtuep;us+w?4 z;XNNhvAsz;x7kzf%^>eH$9sH_quq1ChRWc2oV`NB(#-BK`VSi*oa=Df9HuCZQq z)j2HTy7Md1TJz}TAD?Y<4i$W|?bl7qIU&~9ZCGr*&xc{iT9^t-nUe{Yoi4p`_*+m zf4_4_(=ERYr4>qC;|K}uzMpspjHXFNIE?0JI4g2YmAHxu&+SHz5h}ezh~KZ;BIH6# z)*HBbcSgq;!#L;9q89W{&po3FeoL$%k6bS;Ah@qjSZhnSPM#<_8-bogAp3EyMkTcS z7>GM!L(9H>c?HJ1?wUbj45W1rJ@fE9yN{S;oBpx^l9c%?8o^m3%^C z>Hn_upAe%}wP|<`$@$4`6}L~uQ6ctBUyESl?;AUm2q%k{3^fVMZAQT53vcJ|MzF}v z(b3J?<;GmOD}yywRnT!;1sxgOwVcEnIX$GlOlP8(Ek}>!=ZY}jw;kC$KC5Z|XOzz6p^^IO#hUI|j_|#6 zK3__f<&p^y!M6b!UN5~C6(&@oxm@}<9{%#3eq-s-X%IfYQvX`~~d zrF7*WXn8>%y;I#lT>k=GXQTbsQIJ<5eyYWCM|3>=`(hPwr4-GjwYl~d_~-9ULMo-r zC|dKSVk0LPMo@~Jhj*|0xM;LyM=#7HFs8ELPHflD#d6?MKGe|GF4ZKofAkfWK{}92 z9*>dwD|(4yTU|_q7xx;uHY-?@w2rTfjk(CFyNkw9Siabc)MoyR+DgFW*UHeb3L=P;;dtXe`%GUyYrnBv@zXCKe0*%rc!Am6C927~p z>Yd=XfOC{T7mHAqj9~#*q@@u`JmB3}X{2_&M>NuLfg7F+^fMst3y&0YRaC4u!Z?E! zKK4|=xb!ZD2vJ4jK${d$`BG4fcfq^I{fQ5$#0obdl9c>;=_ofdd zW1D_%=f7Y(_`bYwN6EZ%+dzgywRn+gcq`S%w0&i_q|(@+Ta6(WRxwM%%(JV-T$!ctL) zR7-@=l^s$$oJX0?sp=Zi(<@>80WoC!I)1B%=%CW*E4^l|ZCwAbQCsW9pS!Y-bhz9NW5G~pzZ9S9qDthF%5Y1b>m`{x>kTDfwo4S z`{&L?!}zw+t=Ft19^t{W$>ez={0Xf%68%e#{I(x$`+EsI?*rJ%0}#CI^9mHql@j(8itI8a+bnZwjCi=2+i#%OE|mnbCX1Y-zd&c z`Qv|W$6I&~H(|eNB{mgXi?->5jfmZUXt~*Tkh|C#u{?d&MN)nAQID_B43Dq>D35Q= zOph-F{yw?O<3m2|Ek~J4?%ZJ=3-(JV*e_#&#?Mh4M%hskS9$-tt-b7JAWXw4)>PgW z{*3p(`va@@`Me5$$oCK;FWCvU)GyE~zn5BM>Mzhb#|{fx0~Q>k_;4Z@xJI)MT5ief zDDlufwGN4cW7;KZJV2>&(I#Jyd}f7x;t)=PJCefvtF6MCK=&VL-XXDycYvA@r=fAj zYz2Ag9LgVhP-6vcyVRavpgMUk#Lj@&y;^LWGS9?`QPqmljb^ay>|J_xg(xpGQeQF2 zjk`FhkG|5am!B7rH=XX?oj7C23cOfhy$kfH+>YG&nM(3%+rqrx%H``-ThI%Sx&2Lz zQ~Xp1?VC7p_Ab#0?Hm27ACT;}Q94vP+L)F zmkrhFUek%zPN(~YPPBG9-K*gnd+&1o2au9U{Ky=i`{3?)PHJ~0BFgO5_RlYZ9@49X zQ5}roS;wwD;jU>UvO3(ALY{VnyGD~d2hvF)lzB4uNYXyJ^JyL}q-AZNZbiN@LlnX* z9!J%CP|{MM_l%D6DmjzJeqSOt-AyKbnm9Jf3y;@?bm41}*=i z`_Rq4rSIQ%dv2uPtD3r68gsQ>lKKff@a()3`{u~%hk&kc*l?YQwtN3wj9|Mm(6hua z!azv-W340!3V1*4#J%@u+airLz?Xea#1O4nrO*JfveVg97CPG(UPOysDeQ$7_PLYV zv09SQt5)K`L9ayZlU|AXyS=wK@`LyGp8hF_-|SVC;aJMyyL}+ zPK$DT8c6y9cdYNUNSGNM(=QFa?xtVUxyoo=MzrwKUyzP@CQp%eP>f_wibKN`rFQc& z_k&v%8#cDc$w@I*f26b|=addrS?9K5W--#HH z?~hMdQanqV=X;Z`om(`KA2JDxGjR590~Z0~{8u;}XX1T8|H{)@14~v_qaO!0;kh$+ zRCTS(tu`1PBu)n~{6=-o@Ah(QqCxG%kkd4z4njDAQKA(z*`akMFo}+(#wpJ7oW)hT zoZT)qRPKxr7>02SGbkOEs+iNs26Z)t55m=SLGbQs#MPQ(blpC-Pt!Ah;q|9QuU4Hp#X4o8%%M$X(%PLG{5ne>)2?m#-4xi8_OIo)!h|Dsu$Frp0~gKNJFVI@B`i;rCmo zP9#EAp%$b{boSy24G$;@=H)Rsr#}T?Qdi?`RSvI;lTLf?v1#6gQ9Kj)0g1L)>0NVy z>>BK+kBhnrkGm5r$eE5Ju3xFTvPL8oM1M?NP;y8dS+UzC3q?$1JvkPpX1lgI_GZ$yz*}u&$8FNfDl2k#?AVrQf_X^wW3Scll?h2lEd3tY6*)h># zJo1&^Sue`T!(3!EbKSHs%V>cT0cPE+Im2A=aY+*<7M0 z0@`@@(YA05wC-ehn*$VQgva5_?37ll3kos*{hQaD0!y(^*zGa#0F^NjXRZzDmo<8T zRSPic5RN2(gYDSuQiH@Ie)o4Wx`#QW2GObB0SW*-iggA9d}IJYxB5^KqfBMl6a!Sy*CMfSF>H~dPo`Q-0f0?5~0Jy+uy~^-yG~u5FWd(sur)Vvb$I1AWtn;cS|;`4 zDuTPsSAirH^5t|z_`+6Qj=W@;L0-K9Bm{33ZP;qCF0RD&QAVisV45dj{EM8#+ayN$ zZxKiMv@hLg!7IX=> zu=c?nt3)02k)7_r?K(O_P_^UwALxI0;%LAp;ws;8fNHx(M|;8>BF-Png~#X$eD7__ zcXgcngH%Xy!XuS&0aDC?XQRJtm#Cz8$-H>$O$3j>%022vWvToFUDYl67_1vBCCCnm z0GSKnKPBQiey4knh^v(_u58}}EdpZ>i;@Ifvgx>?AZ6dub2)8Wk6g6)d)8N*qH~Nu zLB%>Em?_2fZpF5RHDTIuTcLH4dhtgs(^5nIYK^O{7YnjTi%p5`PSLW0n60mvhdWi) zY7$9=8GoSp6`#aUt;y`^ra*ahiAfF1kPIo)xei@4(1 z>3&?qI&9Pn*MSBdw;kJmcfMI-J)Wlpy|-6eqgQ-rvho*>&=tG}cl1rmMMgL5LKwCg z=OO3`+W$bEJM#kOoJ#izOr-l=#<%^srAs3`L?!Fatr7=u{eD^7@U5EC6g@HMICZrF z$A97maRFmfEvmKTs>{s%151yIrTQc87a;F3@ogr@8F_IN)HjaDR^)YG^>s;+*X{Kg ztnv?Rl_&>ZccTw^=XIa;NxU2C$IR=#kUE#03fJpj!Sms0aC>9^bZq3)Z}! zO6{&KD33Edk(Cl3Jic-(XejNx$53BHRnIaGGpNoGUHQDOecU(Q-+EBfu`%`Hf-FYJ z_NX}Q#gB<>@lB?+MqzSVJ4vxLZ?7zHeIPl+lLVrcVGE7}<8xmNGdG4Wk(zmEASZ8D@eocZBk~p2!DZZzVEMpQ9xX5a{ z_a#!#{px;@(r46`IG}7Irv%;Oru()AL#{$Hp*A4j?=^;~=1t_WwX+FZphd@99L3?rqZ0-AA7XnTCQTBLu}JAiSBxb=p{i$ne|mOSb0WfOuO?+lU7s**;LJ^rwKOm zr6$|X!h9w%yxw1Sx^i&P zR_nJuFWb;Zs@iC_ZZ_jCQlJ}Hp1<)@DI^9gh)Ikf-!0W>OpsTz#u7-0JKFXVY`Oi; zNOkuC3%*#3v;sL~nN%6x9&{)AE^W&H*cC3@oxR!IpS$jS9He4D|4}}Z5LF+YPhwzX zrJ5neTeg~IPPS#G>SgPoN@m2X=2mAAUu`8RV(m(EUq`L@qh+=@x&UYKZZuqN`Y5-t zQoNe?dB&jzix(@N>9$+Xwc{WS~)Kl^7>&9 zcS`s&!UNFHKjUCtV51Q?b+s~@5!$I<00}bT-fFOpiJrr=r->YLX4>T}?X=4#nF;hh zj_03-5{A`MKC+u#tPFiWZ0{(#rdje(04sRe{u%6W&9hjNbid?I>a``jL4u&uodo%V zYo`yBIX_wuPjttgLLtx}zaI4!ZR0tvRjI3w86g^eKM z4n>;@_x+%3Von9*%ml6fpN_5&Qhg7MEhGDReA=-dU-4*NFGicQZfTNFy^@Z4&D*t?i3sC;xR>c`2(^2=_AJ%7AMyRuo+Yol$cwwVyzV?N z?#1%DpY%%M&(m8tiLly-RulU7_qylomG-hbp(newn|&bN&3?>%{HAnQskEEjHrQ^~ zolTGW4rH_W|9U_BX?mLZpLevMckc%a=|>p96_b-Nj{l>NG%o+Hf~=KuvNdv-TJ=Vz zd<%L=$6W@}7#%fbMhVfqE@}yHWlMCqOv&BWG08y<5v~V9d!02TC!9@4UgStgHVGTh zAGdKFKQ}qDVQjL&F)lgN@lf&r#~XZv>t*tgBf|9}84AA-5nR`;qH>xku3=_?EFs?9RWoV|;#Aga}$UROovpe?^LxRI% zc*KeQZ-cw69nTu-=A#|;J=k|MV5Da;Bsmb8d(K$mzG>>pXE5j-6L^iw#`H-D_t!EY zx~A30hM9Xi1NmvfQjH$Q{RyE#FyenWG_rcPYiX#`(U_~w;OFDG>Xa{X&)wDt*HRMX z)a49=QOYDkZ>J>(tPTw^;D{nlL-?;i9&5#*3a|T7Pj*!m==bqA#%&AaF_o(+!Zn+m zb>cacS<17`>;qA}R3h#op47d|os?o+K_z;+nI>ogUY%H6tp=-5(_f?43!nalGw=6t zp_Si*=4VO~`wR2E?s$)XM*fbB+dOz1xrua)rWby`3NR{v0(si8h9w`r$r24`x2`d( ztG#aZ9@|dYWb9RsiBb=)c6|Q-J#6^~<8hX)@ zrO&8K zu0uyxY>6j|-XUoPOGhA{ZivJ4%*Vy3a_Qv1bZ+D!7%LXqaBM!H zID+B|BfWPSVG*7rbbVIb=UpOvY6~beRh|{I%XJ*y!uLI$r(aRrbp}uEz_{J6=~TAv zh7oXHF~ZT?A=R(zz%w9TcN9D)!!xoYq73EwNk4qr4&2KW;27YV25r(Ko$b>eQJI9l zY!VH8?UF9^w0A+#>CWu9r9ovKeK(R44c;`bT%rr#)O&NEFJvWXUB60K0FA|((%p0i z`|CEDfwWF89-zlvBqJCjBPS`$Kz%}E6^*}CgymhOtHtp^SA^_gM?e`P7@?#-B}9lS zRsp90R>ma!+a^Jp=ak_4q8(drr@N#57Hm7)b=Et%W9|&kcpkrNXxSHv%B?0rN06Hz z+q$Ie#m=GrHKTWI5g+1y-wIn#N-k-aDEWN5M9F9U^&M>Y>;HD#%?tXUh7)0F=VqSO zGr}OsvFf6KrVh*ctqt{52I8h(f# z$9oIZnFMtuq$7oADSB0N%KB*55;`@h=zaz65y%>65R66+^9F|WXP zJ6gn}p2<$U%{_8U#M@r+2tDyu0d?cMjZ@L1SaZ!8zjn|@saT5?#hW@<6Q1)k#@D1` zg1f1jceHPM#g#$S+qgrInj5t?7j>p&X|c+7rbLbcx*Mo97xx}D(GKj-8?@CQtQcpL z){JitSmj;EevYt?De=nhZgOBxhB`2&{u3HG#R&CoBR|4W1hAe5iWS3Z7o;~4^CJ5# zAi4S*Y1Rc+Vr)3-UU76#{>%^l!pn7X`_yUw+dBP&i6Ai`J+P{03GxAB8%B8`D2_or z<=SB>>zHJyx65OEM4E5QrQ^KBFKghNtn!^^$m7pYE-bdnV{QzMd3I>b&jw`a85Qgu z^FIRem@k(isBW~$zED=wjVY)bqZVGH8yEYRHtIXVyl~Whtrk2YEwJ^oAtjZL6uQ3{ z>*hkVct2n&PpLuu_h!)|dtc2bQ{t@v%3MB`Ij{Iy0AqG2*@(mLACo=mZa*>4Ipy{S>|Si=73k+snyBr+dKQ|k=CgD5zBlDxo4DJ zo)v8tS>o=eJ2gLV-^wFb6MYNJBtxCy@AtYDSGj$mdxP^IU{$T*WnA(CsLKX7%fGS% zi0zHCFN8(QV-$y1Ob?j)oP1)5@lfJ%2WqdO)eSq58lxTIXb~#=LX)JTJxBjIlLPnZ zh>+nP)F`)e*)LPT1QaNBM6AQQMA#z97F3*@$>#WxGj(QM*_fosd_LW`JS`sb=JHSO zG?h1IsB2(cm@QozW=^qQNa{3|tGixgNH(5o&yn;xW_%(19m;2b#P#QOq52|%dp9a)nd1bZAhWpN^#aHQBcv^M8J{D{N*FR*z zKGmrgR>J?4oxS(%gwHXHz@D8R>kayK-r(iw-rz~KH`tTq4R*rXiC>BL9HO^yo3xVu z60CCd={9LOtk#nzyi$~ChbM88qfJ_R^<72ioig-}=q&ruK0Yl@@XGe_r{i!9o5aO& z5kN)OO?G}py?@N*O5qW&lJ4Fow!3y1U|dG|@qS<;l(^w-*GlFp-9{nZB6xFX7aTo; zVAk7@ck6KFG2C$}ErH}HS|i|F45Mzudkc?)wwQC**M>y}14`2!{T&jc{a#!X04U6*5e3DOr*q6v*Q`rXVp}Ap z5FjQTa*~|n)`nd%+-Ld-=*Le!xgWnvv>z;3@6@w_bXAh6ru`Qh3M*z{oYop?am6d; z!N>x~Esc$mSy$N2-nR~DnW$0arZp>aZ*;)Ax&?Q?xYG`4IZuY>&w94l#woh0*ndbF zy1k80aD%wvjq|0X^0$k|*qKRg$LmX&yy(+0OR@*uE-7cfRitd5XeJ{@+LOjIlmB!u zqe;en(|>j3^Zj-Xm^~R`aZXzEBRN;>Jx(0|8RaT2olE9^>Aab-7Dc!Jg1N2I4@(95sgiLH z)78SvHX%QZGBd`=KQ}!d`RBUFh)v6>Gdjf0ppBF0ZAm$1qnR0(V^X$}GQ5572Uz_e z&vZC{kqVerXE+y-BAg3oPQswRxqzC*8=7$^BpSH<7DXB2{@P&{@VW^i1KzCNeQq&l5*4Tl{x;cmyA^!|g0&A@2^-x+?) z4sqFeT}=RIh>HPkI|1`_a%h)JzQqRb=P0@uk*ImRwKIQctMucXS*BM^5nW#~ z2c;HLVrtkguUBRNg?)?%mc^20v^6dO#b)VR?k1G)9{b&S1&+J3uqNIp!$jqC z?VTFdRy6BW42?T$qH$+Y>olRbvot=KH}OPNDDF(luPJ)sRMfhwQ9`3IO2~Y9b5?Ks znTE!n?Xo9#grljVt#Sm^x1k8AX0c!J+6bt0D@Ofbybs3x7zmq%IyKczc%Cf65~@2L_!QOuE zd^|Mwn58ZJ<0Y{!r3PtQ)EyH|^G{ipq%-fVbrTcrLBzBnHuIq0?*y*x_ZG{FJmrZr zn(<^ZiQ>b!8VeUpSK5u-A@LO0LsRW?Y+!aMHgFG&QEZ>sz@ack{X?;VN?Y6$17VZ~ zo>Kf}lyHQ`4!sYs561~c(ikq)QML}L8|CMln2qmV?K4~Vy%_Y_n#Sr(Q0L!HHT+KU zTRFBa9!kgiEg+#P&~2(bjRUh4OyIs1*LZa1B5pK%d(|_PUm`3c=N8qPi0)vg@|}a7 zsuu?GDg$eeGz_z+@RPVZ@^Ee;0=sS2Lhb443Q;pcCHxBcDr{ z^$b8c?KE(Q#dE$3^s~cv1f(c*bLwB>u1M(Kyzqb37M6@p@&@ZCd4tbJdV|%^vt-P3 zc%Bo%S*Wj3T^TV%+LLD*V8l;}OM+yWj%(O&E+0`Q@3<)Jb4R2#Pag4y9V3ekp*8cc zP@ZXhBhF<(@v>L92j}S3FrvTO4Q4%1k@22zu9_t8xmGn4mq&7~QrcW{9oyOp^RT%w zzFO;=&ajS8!6F#R>jZ{*c;qn0$M7qcZv~zI61R?flbhOKD@9m#ySVu5_T8=-@gwZJ zUHjul!r#y1+hGP|bd6F3nUl-f$YrNRo%^$WaxSjOI{~7OEHto=cK{;8MaGZQYaNZS9`@DC9-hq%f<9de zkdx5c&E^LOp#@%>VG-vgL3dREv6GtMRWez!g#{sY!j7hrWj zvRCkOZ(p$7ZY&h4EdRT$c>wEshgSC>k91*dOx-VH2GC_n&x`f{yVh8!Rqv?7NWW-i zSgp&zB~arkr8;vitQxWA0I2yk-l!XWhx32KkEGrN zE9(EhT2Mg?O1c`JV4q+Z=fHd?IBTahlM(TbCKnq&Ip*uN`iJ8bCE<-x>polj3#VNT%Vam5t><^xF|z5N~HoD z&E?~nqayl`^QA&W^u_aq&#>fRgg4ms6t4GP<))VJ1C0^Ww$GIvKghn%bzQu&d5vT? zGQ(pWgV6h$-{+bfpVqw3g*gk?&}h_tjzm{Md{ld)D_@alA3JKOgB=>r;sRoU)RJo15A~R|=0w+6M&(e=#J*?vOvMj;d`!et-L<{CNAc{K59Q{EYme_Wk*4`{(&L zI@s%q=q`vy)C4B+$@;C?4ITGJNg!4h28GpBSs#5Gy&m7FtQ#V7EQz+b3*o6-8_L~#tV*n(wUJ&$oz64&1Q-xKyj6r z!!vTNhx+mr3g4{46O|*9w$>wBePE+6i*=<(p+B=qbNEVdSwtuU)YerCjkyk_=UQ6N zuv$m;_z8M0sHfERh$bJN%Xq}Qe7$?KpIy5*TPt(HjXwEvhVKm?bKWu;%uuJ9tPP5f z_+&fho)=UcV@Rd@s~&N*FOr@%cmd1s4y#9;=)-dsk2uUHzkA&G5MOIH7}SnaT=Yd% zG-}gqM`Jq4$mJt957~pKAs#UnN{@$mCxg=d*%#!VJWhM^_zNZZ#Lj=N#Rw^KGeVdL@TN4*h0-UzGFAp3%g=+~ z4zE&QF}R7I=@$x0=DQup0cX8Gb4YCsA5l#+ibDO_Pe$`nT?VR)_mUy0)NPrRxX_mf1;ir|Ra?2ywZtF^UY^Qs}-YZ|i9NyP^ zCG2+seBzbM=JzQZb4}T&LuCpYK-Hnn~u}@GSyx z$bxbT@75jozMr?&yhI=~NY;Mf-PWoRhIG4pc74N2JmvUTmCP-7QQrArmCS#?d!`Fy zDtb-21GQ%629hyh0&$rJR{ev+|`ZBIx(QdJ$T= z&!eLehtC8C^F)`+$(&~e-J5cZ2nqYq$0(PJhIKV+xF^xy+?)%mX;{~KNPeL}0Nd*U z&J+*!;6B=eD=X#9`$6LoDanF4L?0^Gy6%YR7qW?2pxb$~N1RPd|F#k(Uq|h!L3WI( ziQ%=b=NWY~&a#ZuV zjiRtDT@|Xw@u*8xRvb4z)P4+wv3VuUb1V$^<4kosQz*P=`9(@&h(X=@3#=S+_WUA| z1od4v81P=d%sr7?b*S}(1u!4(hn|1s)|cV=LxQJQzy0VwMDIrah3<$d5ssd~`u3=W zWHA}LL+2o%u^C3V-ro*X+T&8h$2wHos2mHIeZTMzWqN}{2780WPET-#(i=pdB4bFa zzUc1djR$;vdE=?8lJ~M(mZX2WlWiI8li7KyNno+bvWu*|b|JR$Onw*)|r3}@}#XRpmFm{KKEbvUK!)TS_1 zhdOj-lA$mAPF(4MnS<)SQNVHWz=xB35nL+W%N=RfnVE4T>0U103jCe8Du^D-Eijfd z0Mnop%lD4W%RW3&2mLR}V>8W-qmpzrpWu|9UEAM3d)_Q#M8_uq=XQ&QWLtQ^Oi!|I zO`Cfcld&tO@bVc;OAfhw(egQzFk1KLtmqkB|D|q!mZ9RF4rY>$Q^Bl!p6c9Zs%RvH z5aBDz8`C~5FRgih-WdDdyz7BBNLM06S#cZ-g-EL&@Oxj{FQrkA*(u2sUr*x*JmNc2 z?`S>Y{om66j)Zf-FW%YbN9D!ZC*^(bK>t3E`1DoCFGyH&;(4GdJTJfc{8{OX5Vt-l zQ5lI^dVkJ&9F_RHdMSC%izS|>z0*|5qy841mlW{pZW!-{)K2qN%2MhJud=4pBy zmFp#P9`!Uc32AhlB|({w^(neK)V>Z;+VwFVT^|*C4;lWOCC8ZT|oSk`f0hv!=YG#KRkB< zR&Mb;m4s)guY+6M9hCWi@fPKkhWMZq_~0hW2WWPSzPJ zM)JobMmu>Nt_|h;v*%o7$Q1i7DMDKS5dEOD1~l&l+&|Acd2aGwa8}KUxQcWBRh-v{ zaDF6&^P8SYSu9@+txd~fGrl-CDlY*zr_q5vCT{UgD23SF7ToG$s87Mvs8i=hWqo{3 z$Bl;Pvw~;NBQGb|5#}_SCD1KS3DueqjvR<`i!+1FIfOVe^zJ&^-(BZlgPDo%coqJ( zgLO`(-)&grz?h&KE6RXd>`%+N#pIxj|8Q>`jnMLonbd|oWW{-;P$;x62N+EqL?6o` z|D-jK0Nd*F$1-O;Bs|yJ*ShXz<=8yUw6b(2_oU;) z4tb5WmRbrnE6z@s5x$gqb23qH{Epc+{o-#lm+%J`u*=OkppPDqp6QVB-V>1V{+CDQ z>wfkThB*7(hJS{5djQ4kJ}dIJ8&B-BU=^M9nm(3t(gDiR^Fta|Nz2}3E!E?@R|D7^ zjG=Rjp9aF*{eyjS2jJ*1l^0U`>_3)LfsG1^llL74`V8-2vKf7ACsC11w(MwU#!#?( z?>*AVKKYx-c!zWxfHM6%_)vzW;~>u(!}E@;vblLmfY|Z~zjJO@6n`nN*YhgtYTT$> zTukpiO|a_BBe~_yPXN|s=mm~uy(JNPH#&f;W4D+e=wts;%D!vq)oG(Zr`6CIvmI76 zL9wH06F~Zje-pEt@uWHZ36^}rdx9>Q6TeRP1|v6-JVWa*ol}{}KP^wO+nhVbe zm3q7_Q0DYFn3M5#W4km=kLR^0B^YH)40BDrTK^FB2R@8*fv$#++?e9Tp7|-|ZI)Uy zW}Mn=pL& z`v8<0gYu90MWYh<4l`Q1U6RcG>!73_KHv8DO49p&r%wGb4W_ufEbn@)+!Z~e>%Yo~K{8gFnLJbPX34Mq&}21ne_65NSVa)Y=O?!+Ll%&HeOQX6FC zNYhB}TbeVTZI9%XFe@d4g_6;1G&4q{32m3*(60?ZH%)6K@C#znK-ake@sLDxc*Yqt z;_0<~Ui&7r!k5@Mk|Xb!B-${;xn|9D`$=h-mdzkTNv0ZLt4$@KWis3<;MgausM|wU z60E(q2E%p|U{PQ+MYLg#UfE7^dC*Q;XbnT_h2@h}IZ@PGsxi`-sN= z2N_<#6~ec;A6no$<6@#UK)-&JPFiSRYeEe^rj_XDaHTvxkNg>)7idjw&4~GTu&RL; z^#?nZOmv+|Pj4Zq&~Xc4{vSv6<7G=8*WMX-yV+bw3c+qec+2gnp>uy-pL2ht!4gkQ zeJxKeX}6VLx$@Mv-H|HkQepJ%|29TXEh_9L%;77-V|%7z77~otCOJ!lC|rN^kEzG( zXs=y}C&k@LG90K=!bPn+BD!(M+|_77+(^bkPR7n7cKLOU3LVkM+v3(RJm9BAyx3MU zbRIYG@7f=J3%0L-_8)J;_7%|nP%<3aSE!qt@09in$zyC#vi|&|u+>4$^*J4RDX5eu<`UJbhyRWX%_lx7N zS)-dkKWki!220Pg-@qYHKjO7C$&&Y~dqL9)iIC?E8PxykqBrQ2I+B+g0k32NDsVMMrl-}Pm9&YM&nKIaYR^Kir5kk%;g z9L?H?FtWKLQb|MHT9&S-wLBS7%i&3aMU9!X)mLE{NG%tJB8mgtpP7wZlI!|tjRR&A z55LCBv)n`vjml|Et}$}sId2oG6{zb_}e6*mv4H6L%$TR@jb66D^oCE*I7)6AUUl?yP=Qh4>8k zco2_NKJUidSwu+Lhq)^I+xmkg^|^%SNCQ5`a>+TQyUHSaKrtCD-3B%Rtd?gj?NXtI z(WPyTd6UTiuBZiV553ETx#Al)(yhFz^vb1wR&j@~1phfVJ^CUOnYQ5z&uZ5Zskrtt zS0O3AI5z>YXQoZP7{xF-g~F_=Xh9qE6SsT>-cJ6$Yl>p0r^+=mD&b-rQz%TRioVD) zY|aqJKIrQrdvZ1Axv|sxkPna|^PF@dXsyZBiY07UB~f%)$aM2-MVP5S!u$c=Id7?i zGJ?a;tMa4Yia)_*&|6l~(oC$aTY-zrVj7MvX=_R03a&_@{j?a7&kj8Kpepc=sbbn-R+^ zGNQr0tUvDwrqEs7*;OQ?T{6_Rcd7@La7d#VTRPD9ThL&sb!4cEyB~G1(a0sN_lizm zYz;BAclNs-SI4t1Mw9P3#t`91t&ZVRY{=!0cZ}GXyp9=~TCIK&1b%{%uE-U82QQTu*4OGvw4l#cORL{27m~RBCXLdwyFj6?Q zZzIt1#$H)Mz516F-7yb-FO@z9t(Ua<0L^;&x-^2;>9;YjgXHR3wNlIwO;l8F#0h5T zn}z*)(pD4-`zn_W!uX5bm4{s##hXP+$AQZ&?3(F?LVe{A+!ii&LpK+dvFP%U1g0XM zPp(-u$jD^?oqxdl9Bf-amjCd@Zjes^Ua4eY4n&Ieuj@N1nJ_9h`@*BrW9?s!XY;$Y zM(!rSc`)>$2|fo%Y`)TgdH+1(L(*XW;;flmQuVXNMED6KCxjE$NSeXQBQB6+J)<6q zcS;c96JHgS90%6fW_J_CS=Xy!p5PTYD;7B?HKjSg(`GwBFheNwQn59Y*HwBHb z;+Di0;By#!RtDwgZ_w;flK3qC7Fb_JdD7-WbH#n{o|^|xm(WtN8~ozx;BcPg6uQ2# zBK0ybc781p;;5GX+KOW#i3_0gEcl!sM80y%=VbW%#n0co>@|y$EHOQrx0=+G44GiYxx3*CGzx8>$ zF3>I+Eq8E9n@>ne!Wh4WzesPrgwU}KoU{6EoMbR^8iypVrFQcn3(aIGobaVJHp84P ziHibkbu?%(Bd3D-tJrJgis0$(fmr^##w}b7%(P?NAdT?srhpzOH5Jk zXtDLxphvePdxJ#C02ntz`5OYrktdu7xG0dfi7>By0oKJn4c>!=e|MtRzSW+*KBA`5{If(3%$6A4 zo6^GxFGcoi9baab-b!FyT5^lIdWLIpO7*OPIb4fWtuNrd5g%};)EtoBV)&g%O;wZSI0N-Msf zX&diT>pbdA zsea8VmnoxVp7x@=l{A<_PZ!ar55v>jo!IsPJj0`F$sQwmc{DBkm$Vy_lU*_nC z{Js2IEcNAAj6CnoA>PmJnm8wKV)K)MAE4VWWFDJqJQc7jXNiuK2Bj^pDt-w*oWYbfLLfjv`W2aB$7z|?fK9a%TY+zeJKlW#On18QN^+thG= zk>ruwF)`Plv>EC5#rFF12Y`M%&LgEG_yUka{B~G;Bp~zeW_Z8hJZVmY^+I-=CwMH% z8(b0R4Q6P(!5?px_Yr24M{vJL>CB5oj00ExFM3hcoV|DF>R^Uue%)gI03&xn zEb$(e(x*CM+z#sZiJt|#oqQw9$=;nwj-w%qZK|2%#I|a2e!{2<$rr}=Wt=rQ6GMH)#Jj=i|I`QCCS4fS_@Mh(I*QE+o0V)NZ|jYoX3(KbMd~NmC)l@ z&fZB_rK?zVZ~1$RU%N1y5ZqPCx*`sNRo6f4qqY!N35(wDr9Cb8)=FkAqc3v5rWsy# z=s_~Pr86d_r8D(GgUNJXf@zuqPjMyju-9Ogse^oV!G!USPX*+R43fCp8_vkE5A^Qe zWn_@Vyz_2Mp?PuvkOf&Mk!M|3Qohfym=Wkbb&*{_)C z<4atzYkIlAaVM-{k4gJX5@?7vNGv0uB3m}8*b29Ug%)(o02gRQ}x)PBnpLXYC!%U>%_rYAg(Yv77qFEm78 z{+jJEu>MV;UXr+C+b_Q1A^K6=$oX;{jZ=!KiRiOysDd6064?Kw&0)!vQkG0DcSvb^ zlFPO_q?nP4#)=sZ(C_IIYy5h+#y)E}jsF>a0O)i;N*j42P{+SFri&$Zi6Pnn^D|7v zMR+n|gttt^jMi4GndK5(w_&s-NwH7JfmK`%-jASNtZPK+&;nf)O_p5|Gqv1=4AiFw zB{_qKr4Zz)`PF|@pS5XKz)|S2hCFp|IdaumdILe2udawa(u+HpOcl54fr$G|_qBBP zyR}8S-lhXP?`ijOurCiu0vWOs�b!;817kt-J1*X#79wv-MX`{r8DW|Mt{h5;uBE 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%0ASoJ$uTfF8Aj#kx0BhYqzsIpT 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

HezVk+%Lx=_}hu2cXS* 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

PF_~2%ZWkAf>U)<^Z(ZPJt#fh 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 *=F2_8i_ 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
e(L0RBoXHIF`yH_^5I$Jlf2jFOuu`(C`%`Y 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ŷlOA5aRCMo6J3Y%v>296 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�`0`;-Re@`8K-Dy{Da!PmY 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

EwLv_N?W>tWXBqw;pS-5V84DG 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

X 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 ghQaNs=O&})FLOyeG`$LBc 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

Fr^u;w_psXn`>7rL zmSwN6SaG$)5+_UHUPXZA$0WJ(oa>?HK%(rj_$A4xrXX8#7-N8cr!zMZ5Y0PPglj5W)zmq$yH9?y@In z!5za>Ykc&k0CI~O(wNtso`9N@jGvB^DXUlzM?#n9&E&eV5>R8x~iO_6U{k})|{e) zwwzKZH)m|O>Ko;NSue%Ak*-SrEj&Z3vR_U4C~|^r9ZECN%g53FE+M&o$#%Kr`ap`j zY!0k!MMhXvmH3wW1c9+n3Xk5b_}+6w9z~p@b^5PBdbRE}yUpK6b*DMT5gi1Q5kH{F zv77O%kIyefg00M~z@T@RRN#utAz=^WYXFC1g5+bHI=Srhzm%@eJtwv;?8=W{aZbEdd(_*Q_Rh|s(07}-D2DRj=8P;@{YNIztpEq zzrmm$`jhW4WUyc(xOifNja>O{9lw5g+mH^yMmAV@un}BXEZ7Kzll{L38+q9h8*GHF zR~5U74L0)e`1Zj@@U!;8Mv8yJ6{XB{UPjLI@w-{jiKiC(&?&!T6q=Q3OiA-()|&T# zJn9HhZn<{lNcj8uiW}kY5Mj+X#C%#n)j}s-_%%WZt-)!js-UG_%HGdjnGb)*3Bhvq zJYER0RLd>52|*X?;s1>jGc$w|FD<+1cBXb>hm`O#2&i*i(GP64wfU}E~L_)`q zx|4*>ZfAe5@rg($t8{otacy>BNIJQGju6^!F|BIauN#{U9upE|!davqvBRd&Mq-~M z=lBPU|Cr-7LnD^J-^r!(oEctYPox_`Gb9jz?%2G^%${FA+}}+sm#M?NKsp{ku*a?6 z;6*XPeJ+yVQO-!}1L>qdzD>7>uZAI8g_1_R^x^`<4fVePe{c7{41bsV*Gtx10`R_z zNz`A%MufK*(lGG6!>!)!v`20?0qH3(%g94+=d=Wp#2w#stP9foWzf)7l6qshgkeW^pY}6M|OwdWLcVLlT^=!%ggs7x^Z3>+ZO9hIH-* zavbJS_9_Qp#ie&RC}J^LJ;44iiMJ0<#UO6#)uMddMy8z$%lK`uW#k~@0LGzxPi0le zXDOehEe+|Sh;cx?#H0KWI_(!3$KCfvjG<@S8!?8Sx87*G^otVu^fZ2M*{X%%)5u_c zuzEoo)AnXjj~ENj{ckYAT2f1CMWPM|RR6w%QFJI5^EIMpr~;&j6HpExM31G$rLv~T z`MN*6!IOzgv7{T8q`ncu#x3xGP7Gr+_oK1F03it4bz&(0A=K?FLJ;lQVcp3E%%2m5b>`~~aB_~z;}4kDO1l;wFp4~)!d4kGyaBJ{=zsM01;OH7A+#tV zu3I5=LqZJJe|e34N&DqVcxZ$B?TQYXPV(zysBxfKrp;)|l3-A>)UeO#$8^Vqn65QP zb6m=XF0<6&Ie0bVB8n80Ae6k7%0%qc)t|=5=bQTKee8q-O{4VrKe!yd8pf z!v+DeJt&I&fcIRrZkNz;kRNr};oUf)=N2#|9D=%01iWvJF?0R=*Qjdu;m!^NzT`Cu zV2E#WgOv3 z8=LS6(b>!YYs`e-{MVQX_x{xsGcMX0Gu@;98gre0aI{VnEHix(w^G_@iECC!`C;a+nT}|Nen#pBC5Hmp1WCeL&1l04d#*E_8S7SyYziL7_4K4GVd%%R> zXXPZZz8fbAIQWM4H<&K61BNP- z8EnK0tQ?#fME|c)vf!L>N(iOH%9=#EBByILvPjTei3_?Yw6hTGO~(;Wv&hg7StVr) zzAm*V>nPB~Lbo1G!1=h4xK!3dQWN42qJfF|%>lFrJ35=Uyb`_RkN1b};B>nH-;H~P zc$^U2!110=^Z!Z=-qZQRb@RE^#kbBJ>2HU@P+2XRI>@WlmUaVydo zUi5Aq7f6939Hn+;S8i+2&cLsT!>kUoG!KMfzZ(`sAtp_LNo4GiPuQLP*hG0yqk#=m z2xcV3Oj!TAHdY;c2WRg^jOw+yrzmWuGdTGr0vJ*L0P*b`FKXl4w{?l*+kuBT&koFv z^6T7}qWn5#dk21f-%C+`JvF__z#(0xPXQWZEb#RVmh_i6*ELYAql-K(-6UMP{%8I> zQvuFL--qy~w*Ggt_VTFio6l+0mp2;v+b!(Y-AH1Qrnn-!#3N?f8HL1n-siM=-U~w# z2dAM+=p;vbfBUjY8P4VuYw09xj-8DB{zWdyfHp;?|A3Lx> zT_-RY0a^7T10=!DrL18>a0tbygWCNQ*$Hd`2w(nue8*z7LXRu3$2}X^F`*gv-c`bw z;{zmRv=5t)X>p^Zs%&7SN)Ltbpm$@Eh@_l>opSwo!w5^C%MF=}M_~kDoG=?YmVUHo zAXC)dweWE8&O}o^-+DRl#iN!s8H|yZ5X7WlL|(t7wUHMlm!!3%?88NVic2SF`HV18 zVMwf~&@EO}sD8oZG>>oTKzV0hAj*T6M|z{}7Un=-7mK;F7dpqB+xA~EH~j@XM0Ps? z!Wvr}b8XL8*#a&9nWk6y8!Es3p>am~f4iIw7L)AY?tk0=YWH8FdFX7@pRIr1Zj(Fy z-?m`N0YQi$+UsEotM~W0oB3rC8_Bc_#uIx@#3;2OMv4% z(;VeOP?U>BJL4JC2rS!A5w^x0{IQOo)s1t$y2t595!^}038-J&~`_i6gp|! zb5VsY-qRN`FyML8?_VNb85tc#W$-zsnx#fd7Cy(0^UgjOBjnQ!`$Fe1Ab?jaruV|L z@GBZesqKOcDqW(2L9(?spW`RPZJyv5)E!#Nu*7s}JR38g&(37?+0fe7uv=-=!d9-Q zp3pEUHM`pJIm2LCLcO7HW51W|s{@wbO7KE2D+wj}J`8`cm8jPGDIOw@99k{qA0jtd z?foBYd<)>N?FT9AdrEcYX?-C%c#MOF^FAWOKu)hFL%)Ufb@*TA%q@GY*@(E%N6=;- zycS^5Wl&`Q3?S;uzPO{8H2Y z-=CklNtH)!Xvxex;u@U>lOylyh36I*GAkk%VV;v(8vPTG#+yZMoS}S%Aro4)W=fsF z2*#fi`fjPf-5&t5-5sh}GA>8hOws&${Dn-`%J8$Ye3mE%x=0q~oh(6R3j3H0_PZ$r9gj38Z0=<(Zp0%_ze{eM z68MToloP9{6~kb`4C%1A;D0!vF^%b0ybE(T(`p@h$f)q;*Gy9V1FT+kf;LZRLI)A- zqb-bGcS-d!>+iSB`a4OPonejXOUE;WQ0>I}JY0_@Yc)iho&1Y2Ztk)(Rz*$vl6}%bbiPNnQ0!l#F^Q zKy%Q5ceyTmy8lkEyt~&l*EdMv>luZAw_>PIUC$`| z-vHWW&w_9Um9Ggna^=En>=yr(UU?t%{c}L~8oRu5Wv|Q%uj@$QFOdv+#VpL(PD?j+ z;y-b*AB07)Cd?OsiG5fjzpyn}%4l)_lCJVrMv6%kY-u;l9HYM!2crDGm6xDo^>1ar zgpsSw43Hl!{4(-s_%Vtb-Dq35Uv9YHzejF((7!XX)jUy^l+V0MtxvtTzyq=eCS>!t zg3jmQ-xV$l1&b-x@O(m4R?}NNp{P7+_bH7hfzTG+-NRllh3!2=mAr2he-8&=p>2mVe0eIfQdnq7Z+HvkC=ajAutv{g z2ovL+gb6!L`R5*$`qP)2oC6hWHEap@kx91d{5ON%6=s;0Y-)GXQ z|1mq}tfK|>rQ$wpSL7OeKp4Yr)lq6W@P z{12hmvV7{eXz)QHp?&bdo^8!sj4{@YeQhmS<6BC{+=+N&)i-X@96=t2JS_YtD~~|< zhn0Qs{3zfOcc7CnItTtv?`LDDL}(^$nGK7MiCwn`u7I}09k(OjAI$v;FNYV&%m9Sp z2!&ubv`_|53#Ax#(5sxmC}TMw*|}ZSLO5(8i9@1DV=Zlw#`Xz(wGp&oUZP60R^*ow6WtX5Liq|L2BBJDR>U=N-d!(6jxA?k6WT)Hwsf> z$$aB8<1nVDvN(+1gqY}yWL|oS;U$@;yP@HCO<=>PwD3|)>^X;aum?t^+S?X}jV_jM z#R`JEdMjFz2%H|4MP2Z0#-UUrtms&)Kh7K$SZko4J<=l@=WQW{gxeb%-K_*`V?f}Q zt>j}xQ~wBxPmvMsc2N`8q_E-LPXUTz@uvU8hc7&M45iHo zSTW+4!!49QNVl~6nd8RHGGC|Bs5!7-vlGLWi&IhW7B<`M7?tZ{cwq2TT&^^?a#rj9 zA|*BolF>LO5M?0?L>W&%ZILJ${RB+^e+q zo$v^TSQS-)>R$}ig|%-We(94|pK?K)0iWnkStwmukR-4NGJHz@5TCMaq)%CtB`FWg z%KR>}7*=+qyIh~-?Ih_$0NqH(}#i(GBe<4w?+}UVE4$`eq_!Vs;QmPI5%w|CW z4R$XIS=EKoJ@_vNI)5L<>hGA-!ProjKN6bo+5ARcQ5n>;-**`EpDaHaoL& zHd}#aCJSqrhd^_l5PXWbPBR|7@RRrAX4KjPPfb>RS=LFy7I#)6x+j2mI73)_4Kca~ zhY(yuG=-w%hy)C>jJjma4|4r&0d#G;_t!cj(godSHsQ>l1(g0Mw@GTTnMDAO@%{<$ zH&+N@b|#UWO(RL-c69!NsiXX>6iOj7tUXY4DIszZ6|;x757a{EoM}oqQz=%NVm?L@ zUCo9Mh`89w5P=uP($O%P#zMSBQSy>CiV`7oX9Dgxz{~N}IR%p{X9R&ot)k#xn~61_ zW%jVGtBL!gil2h2b|Kl-&%&c!tATeONG-UgS9T38A-ayhD%j z33W#x60j6y{&sfK`ga>UsD|EgPtmUBy@P(9@G}3|s@ZGXV3p#>*sM);=kI1DuQ~!12AGZQDo?8K5{x> z2rT98qDBJ{d6a`5^EbUgeke*`LxfzXP2%_`W5YogpyQ zqprvhWn(hM{q+RyVwpxjO0YXUD2OB^w55V_M6V359FGxTl7-Mdp6S7@+MUpze;{51 zzR82>2oDNQ5@XgL&AK9&z6 zpmHQo+=zn8^o5Q1r!BTyb(NLm&hSvFKF|7@6GIH)0B^&@9z&v zc6N5=&6_vxy_tE3r!5(VplK8(V8YV^O2ol(Fe!iDe1WBsUwpKOb%lY)vr3QAE}y=z#}!c13bI7aT>8i4H%%YVSz{E6BGh0Ow-wA{pv z6E@P1Q!e=j!H-ds(UG)V4BVC~)!i(t*&)?s!N{x?nFoap-vUI>uoa@5T*?~7eXO3% zrS2APMZpVkZ=!7Yp4EH^_v1NXwF_BZy#?$QCz2eO@A>;dJi_|(9iXOvQQOjf<_Cuy zk}kx}M7<$3%iFTWH~Dg&O-*HprUiAe9*O*cZJGgNXg+AoKO@)tn?8TRZsV6m49?g@ zz-)sK&-PnRsdfMc7eNUJ3bl;|7kLVgSkWS9CB?%eFzyF15XNo*^VS4x475`V(vjfb z%2~yeMo#T$`2yHHi?a*oGSPqWBcfIgY5rb z2e`3;5AZ+uBhQ9WW2M^uWSTAbpKhRC4lZ7x&)uT5KaPWSAAp79V)I5AP`3jU+Jxr^ zYH!Sr(ROc~X@q>%2^tr4y(mMf?drh@y524&lzYMK#dG7SAA>&guv9w`Z!<=ETX6pE zy+W$rv(QHO6jJ>`PcNx{uXprjQebTG*&|!vvwl!#(bZD@`<@i3ey8^)45eiXC6MQb zyhFL?Ksa1c+d0$;8%V$g+QXMiUZpeM_a4#Dc$GKz#2JD&j{ubbW5CxqSy0JR)0U#gB72OD!yFBo%h-+ zLao;FbZXfp^e-;5O55{rsynRh3`6S3hx8nO~iPFde*@OE_!%dw- z(dQ&0;Qvzm4Rv94X1Gbb5U1Eo8U!@#bjZp<1s-fHQs<&Ov{aml!V=8hL@sbGg{9}| zBC^#}ZyE^GK`{Yfx@G}b;&$D_j$5(gVU5}!U72gU3M*M-{iWI#!qPWbWAkDg3k*%i z>^`LAF}pK8MBGI{t9pX4p77Tj_+?6&(_9fg<_^pPrSFa`)K<2k9Z-Fex3#P2v$bp8 zxqk@0cbGvCnzZg!+OX`m^1JAy|8jeT?XE?zJf@+}ZLW+onTkgkv)$Bjr& z$J6GipNY|p@<<7CRT63?TPolk%eq;&$)@`(5!z$d&JU-pFbg6h6@Xomj)OhX@XuNwH z1AYdh$-)pGa$`tTcQ)1?NM>Z5XhcI_3BFcsFg~;>e@^zq;Z%IrL-18I^Jm7~I`?Io z-A`?GQyl+ZRzdk`0gt_*y}KKHdVpQc{+ZZftCe3fgVdtHiy8p>x$4Iuy1nd?A9|Z0gi%cndAB=AEzqCW%yqTb` z7PX-WmZ|s8gW(4~m}}(}O*tro7h56Wyv8yu zBl@c5@xbgxLOOgSBcw-DBdl9VpJy<1Z8@)b^P@hOGCxYxrPzT-3?gkOJgAg6HZU)p zvE@k6477~Dml>**<)o5X2KqV=(h(tq*21G6;f5TI%9T)6 zMX5=VP_A^yzm=j1(jut=G&=N+5dm{?IfvAzNY95p^8H~Je}ybtlX<%oezll~@N8Lc zP&FRAfg!QFj`T4n+r^PZSy=GnQM;0GJ;N_)1e@j>@bb=Fk|gTuCKe&_q8Kc+HAuDb z6mmxxe1KnT0K)3HKn#7zk%66-)^WSYu;=paNHEHsbM>)b{TPU{n0FjM_3^ z{nok0)qlKIWZeca3MR9N2uz(!;bh+M4uXw!8g8sxkUu>64(%@HyT?|XGiD)Y{1`{( zbK7j*krX`!(@Cof$cRZgySOFv;JpSK>t_<=-N{_wVsITiH^)QRwPu*U&`@+fTU~xN zC{*y6XBPZ#;MP1ai+Uc)d(K9u5Ih?4ms1`XPjY_Fukvm+!$Rr>ox|spyNdojfp+J= ziYx&jMms)Ahsz()Nw?rXMCUDQ_)UGc(z^9nyuuTQnM2C)_sZq;o0NNBE&ZlLTmO^s zxJUG| zuq_TEU?q9xK7!9qJ}Pf`+j48cek?h6->!_p5C-Lq+2Js19k{1i5wo!O!&{Y|+Qekg ztiqu75g_L2K+G@z;hl(POS3XTzc>)Wt$3vioh5&A%9TvRIZv^Fc8O9$&CE=^J2Dy! z2;5-6EuU0|!00mE2AcK_#N~o< z^bq-cP(VvKuFLdsrSNe%gbjJ-X1YAmg(2-*uW`9-Og8X*AI})_GB2cKp%?aY`Jb#$ zbcKz60!QoP71&4{Jpkep7sFv@1Ahh|mtMs99s`)4p;R|m@O42-sw)uuJxC&S8?53@ zLTOzE(IR>tme%bcT0}Eh*q?WcgIW%49>e7>*{`LEjF{{7`3@r$?b3L|_XaD?`#qYo zfHD@!Ron1boq}m$yCn(3>Ga0m@v9p@dhMqfp32kV0v^K=l zpgS4B+xy_B)>#H$uM0DqY21FP#=Xroei51owUrupI5;{@d37dm=0I@%RO(Y7@H0K^vIx;jty>{Nr7(A z4NRFj(;&?|&eX-{neTasvDZ9(2&^+^!#a9~CmktFGRXEHW<+-Tp&POB;WLdZ@wy~K z3uAc;>AY|_H9LdMlA*U!vtcxiyN$d8Goq=-FlIi;U_LJ8w;5dXXFDdmEY6~6H=tJz zT1dBup0@n*&eH;ZAc1@PVi)9@o;iaZ*-&F+X0Tk!AeGctYbg%X4T293Ug=J9AJl;v zE9;TNJ z%WFDwEZZ-EWgZ{!9_(tM?@J79wZq;y&s_QV2RfE}cGvhwahYfCj{f*sU|FAyE43q!BmeyAT0tnXD z#>!@6|39$sO_eKPL*lYfTue<>1F`C+_|(slSI%y-#9(4IVq2k!)kZYMsQt5^eA4`a zg(0{%snrjmusK8h48+^~W849iViTU;!EcS?nIEBFVmS%=?}M7Jo7omhDn^fk$IONe z6EU&A4>d!2^VI(j((Cn*fj9p2U^C6yF4gRu=6K`L2MvsOB|NAZe?_!lsBk4uKL0E8 z$Dr6}xU+$cMm$fLss4JNHA3;ycUNdfRsK<@puOGa38VMC0eD);?$=rRcZ08?Lq5jR zjwAK2c#!d&6LDPkKd!bt#mw24*Mvg@MDCquHt|ENp;ijt5Lio=f`LbCO}fj7QusS; zptD#Y^l#T`+v?x$gVMHf>_+On-|;@-yo=Yy}8 zOygX@ObRgX+Pjo4v=>2#-W$;HZGh2DdjC{|WGSDjOO`cXg(G3x=;bSsm&IS{V&`UY zV-P{%zoxKp(anG|1<8J1bmsKyj@MDw*OOiN zQbzhKIqBb^lRlNGEf_&8`&=W4FDG2&(k{xV$u9VF$jszylZ>OZ9ag<38NdEvN<>zA zw`&J6sk^;ho18I|HH}+V`NsNj^lgOsTKTwxL92?JqU&&9e-X1u$%41)ls^o! zJ&y>uWM#i#;`IEBqfmoS&|{;qKb?nM0hsRvjy6a+7khdVvb8Gc_Zoc(~#xApjk z=g%TgY`>YoNoaf+i|p=VA=q8Hes<1NNo7Ip zoW~`v;paT-I5PGfV#tUx{2v-jn}}xrhP_#9efR3CL$a&#>&^w~C~--sJ~x@cN_&!) zAHloUXPKb+5ZD#Q8f8vo2TX>8!BdkNiVpG!dT8FO+%egpfA7J=hfmLhd4~4M(84pu z7T)14tZXoF^EQ*4;pU@%VPstuB5ROXZC8CcL;&9$)M(jy57085oTy)(z^?>!?vUyS zc)CdSg9ZON82tx3LLK2F|9TjuT2BoOeHDKH2){q5C`&V|=PyRY09RBq8G(Iwkr5aG z)xhchem0zP45#-26e_NF;!Jubpm8t;bzmdEDME9S4^HI!iV zMZi@X6|e-4-_V}3>3x;Y_9!mWz%Bl2X1w7F%;^_SgwfFIg=Kr;H@sjigl$rNB5WN< z8`*{DE4{cjf>x6NBveffbM^bE3t$9%!S6~sw31rC#{uzP+pTaMD z3I4C*o9We0y<*Z|=(-w>glvaxgm$SzrrEdym+EU~#)T7|@;X}yt%O=(O!+yd(5-xuQ&_kgcA`$fr8wo) zHZ+IKmm9>2QyHT4Tdk1F9sSx^Y#3TGm1m1C#Isp-n5>AKEq0WAcaSwr+0)!1asp!Q zkXt^6KB6PgN7ShdSj>bBx;X(K!zw1UN1coaAS_U}a)h;GAQ9$DZjCe5n%lw_rz_iG zu~ZGtWFHRBiZ?|%qw|pH{`Qx$b&(Lqg7!}kYaBMTMPI}m?J0};DpFbsZIhu}VKFmZ z2Gupi7MuaJ(%VLc!D&>C3hZ&^W`Kd>^&wc3b)00O`PT%eyqwU5bc~pcMjvKOHX`k* z+Zoa(npr?4!H?&9DjDzurtt_p$KCQtc5an-kx_F)&CIJcAW^|ivl%pOtgbwvAUU%G z7d!|lq}F{ixjsZuBd#h!epdwiZksK_@cwy()Yog!V~26O+q;;KvE*4Xllu@{?bC1BzfIx$V`WHF(DQzFGHSG8kd5^4XJ z){d#FXu0i>`-L*}P4y@Lz*C6NHNDkzUo)_KJ0PQq0l7WYRaU;H+hnti&tL1q;jLV^ zvFWy6@6r9Xw;dL+{8vyd=lhy(I(#27)ov!c`Pb+ac`-J%d7v}qvevxg-GMpj%P3!V znZwpO1+;+uW%Q`b_y?If6+=z5QRSPXOqYDbEr%%KTMZh%RD=9raglZW{Q^bIxHC=p z8h$T>mdhk;G$sYO;AdBh&Ex?mzKACvc^L6FRq}Qf$p-=e@Z9H?Pf+NoCcvrxKO08boW1^2-fXfG^&i?ytRa6NYjA#Btu=WsYfnB1 z4W?m(30*N=!Za9h!>7V(hwVxz^!8MKzL%`MaD6SNOg1N&7r*i&TZs=c=lg!NMQF>E zqwIUb`b7?h!vlQdgi}637v0LYZ?l`Z>v)S4LgJwh^`6q1BMm~b#$oG(W@ZTDeb*WQ z*mVyoUy>FcY%D{f6R}&ZEZsw1&}pVk=x6m2#t0T1lqDq-+Rs<8l{>JNh4)aCKv2%v z^oxRSV+PuQgxVzfnSmU027NYMOG36?sj^=rWMja?G&2`4BxyuxzZC^&A-bl3sxTf? zPJ&>OY7culp#hyAEyHjm%kSZ1^&C;VQ^IK&0m5I57rMo41wP*PBJQ(us?kXAGP#2J zOPb84EcBNY7B4pQ$Y67Mt9|d$F?bk_pIP7Y1pft^2sQ*K9v$Fh1lQ5C(pO;Y^A!pg z&nme9l*ul1=0Qv)nYi%`3&ilzlWg{8UL=eupV-*6kdAxZ-JtlRWN|U=pYi+|-)Kh` ze#Y{HF()BZ!e$TKzy|4f>4)*`fq38N>;dYu;B`pJ-^7ZQ-vw-&WTxFpV^HUjv1WfX zBpl!!fb0hkKV4)^jhAlXNB9hTHN15z&pDOzea;~jFCKELH9Lw0-Ye80R+e0fKypEM z?3T~I!7Tq7X^hb7v3W>S$l1$IFqE$k;qB@)iu_S_7e&zl32O&#A}V#*>1&I8;`>6UcIU zhlwc;R%g+pEWm0BMS6$LlT-)lNNJq*p1Z#n{ehuZa|_p61ph?ZH}_ua$h}_hRpYtD zZC3co`<;4g9KT}4JTi5OK-~5@ogEmldO#P6Y^YW`&2`~p#5J=7|5czmB?DrJGi_z; zX&KG-d>e+^_a$qL&k2nBN_jW@?IiDn^;ej4C{!d$6>$`I`!isrK!{m7`3+pdI8Q2@ z5>h~M!^-Ze|9uyc0*Z*)GhwrWE0npoq%iN51afr2iO!d+0AZeX7i2-<~lKxgz@{LJL zs^G?1DP^-FvstOYS;06QcIMiG3=^j2apTlDK7grtfKAN@G&N{au20SIxCkaP;xtUW za;J`oX)^#5Dfosi?&Ujir2}`eH|}S#2~H?ApNARL>Yo6re{b>KIJIfAu)+Okiu_r{ zX^Yg@VovLiCqOI0E1<`&wW4{!+=Sd3!S^cs{uqsH9NC}e)_7B~e!O(tocpKXFQat# zmPegZc}mGKp=9r)W!6v^G3ZJlB%>#zd{UIZ876ip|djp5CQ6f^}TB!-$`bWh{g43jAZqv?9*iisQ&RJsb{=WZH!@*uH*C zO;~BgSflT?1eV?Mgj}g)PN!A~a!{MCr1X5F9L9igJJAL0v~t&Hpc{WLls%Nd*^!>( z?SwLNtcGU{3?v5gD=@9)lErkL1T2J>@G|p%BNi5x;F5HrnhbRErO7}ipPMuaSUQGN z0Ar^0`ziKZdT0^s)aAp8d;zezVKMWolbN5(GZq6z?PC~5DQLuvV|04E_>ck9S47Hx zeTa!VBSNqZ=Gy|`_{u%4bT<3*Xj1O*L+gGr4I$N0eY2Jl2g}ztfirrmWdgl<8kd`L6Uy$r7z89IYKb~#ITmkvP2$^+csgx{Rp^~A zeNr44Wn~VDaSR;ah6L^f!f9s*(}ni4AXsI~6Bx8)B6MPu0mSb{aS$7oS00Q7F+2)S zMWz7{3*+RG=J4=w~P$u%W1K-d*N`99fs{zn*By4`ICCKW=OUS@Lr4cT%&jzz&{zP z*!?FZA@a0U5A#x@-KPsl8_Y6!F2^tTaalfy<{#dLvKaUD6yOk^-oiemBmH{{^`Uju zfYp@?Z0uJn_J{<`?JdSb&&vJ03pz&cSQt@NLMvFZ5j=WoOURdK4nXT48yKA`r&+5d zmYKxq3~b0`Ay72uT&5*vD|8MZm-1XC6a@XWqWJ2={D7cT&sg&5Ii?t86zZDcHYk#| z*^s50JYx|qI@9&u!GI)ty~%eN6tHpp;d*?y?GC0SmY8@CtC@zu2CrC1T%W%d)r8rO>YVc;<7w)*cxrBF7!!SC6BU0%fL9B`1`3&TyJ5XexxKkn^Pl~f zST$Olc)n_y(({Dd4T`F8J0YJk*?79@$gdsA>d-@IqygVYMlx}c3DkL`US-cn1Grm9 zYFilp19&(6q1N;9kqp&OQE#ID^)mK>z5%F6V#G=s_Jboe4f~Ce2Ea$N2W1&!|H@(u z%fkm?4PtYx9U(Qa$X8{BXALl3uETh2auke%M&k0LfK}eBusWXHDar_t2_NGAtGmZG zB3y|z*KHv=kq67$;S8*z3^27k{|k_PnnQ3@xB_`L+F>8Z%a>^_coLZJK*Lsdv3uWV z-mPKwftU%Uf|Vt`4`mzK{qz0!{+$Lcc^Z`!mGxBhWjypQTpeeML}0pqvMYC;4RaiN zqoOWR&X2}n{Ll-Jx!C=O&qltLH{gL+DeOgDj{ldDQ2xoe>vbU{f43`hB&fF3j?GvLguIVkPj?=0FINGtOn@`#{v+Bd^D z@q~v1PH9K2^oZpKk2TQts(s#*p-iWoW^+Q#%LB<3YDekVMW_5Tkh0P-7f(&SmXe}` z#;EH;Dj5opafTn zC=W@Eo{Lc*YHmX$cUKK-=Jx5EJ^!1D0y7m@JMHMqI<$}ZJjv$hEi-X5{KKi%5x z&Tk)vc|1QmWzoth52d)OkaSGig-BkD6hbJu+0(VeYi9B@12_*NI4KXwV8a$x6!b)tBF5Ny9SJ$ke7{)!>oc%|*0@hHaCAlzCWoKY`Dn{>m+mj~M^%s1f3`HBw z1(>ACj(q{S_ZhLWCcFi`)CTxn#$fbw|qu<3rHV7!GkJSuy-Q*m7$?LYQiiO zm!E2@F7%4UtuWHae!M<=et8^asI$7wAahRRWpaRu99X1?m6k-4JKlqz{N!fuee3Fx zRq_s?5JTZGqvdO=(6c*SGjj~acoON>P{eD)xCQx6X=i#U2d8p=aeWxy^N&tf@{g`I zd|+Obh93X|@Cv*d*Y^n6*G37LRBszf>1cG@R(=f7G6yL)Je3EJ6P7%%s}5#X(1XVn zSa&i%Rt!mrjyBqrjy==|UC28)>FEZ%&mpla6|hK)rxi3!gjbidV3XRCM|bufo?SWL z%ij>Qjhg#@u}+}9$nP@?Los~q?adNBAZ42c|Iq0p<#AsZLSqB|~d8uNs;A^S2x3Kg@v?zKspj;?JDRkn(RH{-TZmu3i^^)XiY8ZpB)LM` zn<>@J6a1xwRSyOA&N-x|beFj-brC8C}IrLAA z%(_Io!F;d3W+WAI$09tg9udA9lSd>A{>C^0CqE~QAuB9^C4^)9%V-aAQt8n$Vo&Y4 zw&~2EPXIHy>KA2lRg@}97hf0r63r-Rp!?dB9|i6whA=+@Wn@0l@w>W4y47LONdM!A z;1wflk9^zU8TA-{iA)<{e3zxZ_20uRr(XBG$PJMG`3@e~6EL?hlQ!)58waC_o?(qb zq9^e9Tbi{#L)WJlS^aRM!QD%KiWQd2w*gg1oc`~wGOfXDdVL9{M_jkgVh zZfBr@1Ac^?sL$82?c8q-8a9U~QI zDDyYfhgG~^L%&17z8!(sI>^X2QX06uWfnPEXuK|e72|b%G+yUO)UtEmoY)+Td$gLf zILuPtbP+j|BJ7Qu9oDIrU7%y_1%hu1H!q5LrOhA)Qbx_rGh_@vB^4nbE;eI)=R2x55}r) zhL{WKuM?AWQcj;#<#qt<{iO^Vw^Q@LvNzkO5Bhw+EV|d#yw_9*^}55NZTy7|e;}%= zZ!r+B${!-oEPE}QLaT0xFb)h6KIJvtl=RKl4JM;6@OpFvHL<^Cg;f#59YDzJ({X5%Al-0}T(^#)pi7hWQvgS|@eW zYX-d53}_y&&tEE;h1r1$m=U%2ztZgVJvYFB+D8W%P%8~+j(Dp!{ht<$j$Y;E2t|Ty z{q|*jpqIaD7-;KD4D^#rIe*7RkFxY-T9!>mxiK%S`S`xc^U&lF{pU4vM)B*$OPo=d z^a1jWpRsV}UJ6bNX^)$np$H40M28Eo}*acx-G(1Y!2s+GPWjr-50ow5U!{_rbjeK`LxIm z@Xv05_B?;F%3RVXfTZ`fB`NQ1$*23SmngM$np9^IB#duXaV&mQoA#Go{)NKLc$2Zm zOZP?#W$}iln$gl1xqggmZ|6(gzQ@x}$Hs>@;#FlwssMZO#+O*cuD>2&U*l|;Zzg?ufi8Wf=4$#SD$uDf7-aYe_DYNb?Vlzi zXg9J==k=iCIC9T=o|9@{_hJ@>QUB038MpSl7!I}O6IuTP`4Z_#4PLg?0hL1)c2}BYfS%^g#4+qpmoK=+L{H(o6XM=Nx$9R++ z#?3`>tB-U^6=$A?^1F7E1|C9`j&siOq&S4dVKDq`GT8@2YqnBCdZ|s=LSYg8CyXEe!WO_OYZ7SM^Qa}9TFLq?)(Xk>-0N#z+j*;!PoIr?;zHuFFb&VbBgFl_KzKt1i{WP6;UlaaiWx7dKX2`jp?U)=@YaQ17V;Jb?tSMcX2a12%}mR}ho zq~yoG}@Tr>GvC1KWI*+*0Yl@ zev%d^FvT?3=lx(!Smk+vn2;I!fua9>W|n;(w&o@Z1cb-M($Pk#cD3NgEXqV`|DBKy zzZxN=N6b1QHT+D3RId@zfE)iCA;mL7TK6B;7Jl&9jSR+XQIMVzt1D9kUq^yB^%cR7 zkv*Zz%0j$r6MFZJhQXaOFhiw;ABucq(kE)%&kTXjAp((B@qo{RdHa<1#&%va878S8 zZ|6}HLwHq5zc_BR$92rm45H`J@b@ag--DAbnm>fbz>J)ET$688vUn=1&=3yM-eU|R z^aKcXmp8a#8YXVF|{v3u}cQ!(@yo{ZHGV4=#Y%8BT&RcmzpwNZ(G(x6q<_l&G~ zRpb9(~Ii zHg3|9=RIM7W2O;~fA-WjaHF5Vs0R8Rt5YsH_1L94gb~p6@jyT)VUCn5XT_P6JK@hA zAQ%Hneegl<(h~T)@VcPWEC+lvR{`|$bQT@J{7ynvLiY1`6>d4`ta2R0@UfDtH2f*7GW-g>`2R4)ED!|5FcWd#9huSVOZyUT;(Q^>h;1$j6>m!ah z$ME{4)Z5D#Px_Uk=rif56ww*6Mk%eFb#7x1q129<8sRt^rm1NnqQk z$seH9f)uLvxU%sTa^EVO!!LTOydCA!&Whs+uJ}27M2 z66o_R7Qsvw){>O@qhV8MzLq6hWT{?I81?{O@$v$?L=pVih7>T$*d8qHWe>bnk$c#f zZ4ghw&UdT_N?5kbFU*)vjOhnmy=kHpJ}CHVNgWFB6?~`7EWY-#9!%iWvS*kRJjXls zIxGFzj91s5ESmixTAp7J8xHwczI+r9=2!fBfnAVqptcucUP5$c#m2AWjsJ^v`#w9Y zH{{g-?#Ze$Q;y>9+}`Q9A`Xs(G{L4`>dq3ar)%g!-60EghfLHRYzWj#-1zHi zvleGRUD@>u17?6eQl;->q%`yZr6CKHhD^k*Ez&x+R0@~~Ekf*hS|aAWv(#-S!<6jq z#`4wSwSDL&N(Tz{7NRRRdctd+7x2y>GwGdgepGv%p)BgA58OE@df;z%(~ne_y~u)l z_wcsGH=lQ7mjY!CDC2X=Lj|ztwhz}9-IPpNbUm@+vmU6>1;ag-^86eb#ab-~)Z)!| zhvs8Lc=z&lYH~joU{`(0g%@Cogj19You6>=sS-qUWp?N$NSSBLB*QThI z?10*#WriaR=KSpr+@!pcO`G8~gQIp-{!a4z;!c_0Ymp{W4n4ejRLMMe6m*PZ9ssz>Ct&1M8KHEg(*`*S`kjAwdiso-xx`pKAd zsXpG@mEW$^mnFS`&%Hv^)__Rlj8y@Q7gx-*Nx_(3C&{(z^S%3vr} z%P9{1@O0Q`Bg+^KLtZ?VZ8JRZ`-2H=FbG`u04~pmxZ<*aohKNBVk`6X6|w3$&>{y@ zR;u>PAL4n2Fr`pXXbh{}8p9D_CqKu4ZO?L8JuY#2pEq37iVHhk46D@*#@+G=seYuV zvqRn~$_J$Sfu1yZKc)A(MU-kU^L9o9p-?`WXBLoB+ZI}29-k`ZFh~2Lq9re~aW2eo z23EX@TZ%)DT*pBR3m)eT?{MZG@Se&!Bwa8|hZ4oWZIj(H&-gyY1iPHa83s~CzAY$r z0DXaEnw+0IWZJ?}EVtf}$!sZET=7FDM3&O<=%qB->X0+#v6lRtQw~zkqi7v8>dBxG z^+u&UIC}yJ#%Z*o!YsMok#!ew2~=X&A=!WaZTSTN~|Vz4w&-EQlpX&x+Oqjxwk}NuIVRE|OSq z44~!q3GxwVAnjZ@P9DFCrePu6xZEq|Ok&!%gEhTs#R%fy@pG5>65Ac;8) z2JW9M27ET2v^oO~oe!U9S0plXRxMkJm#r0%LJZPcCS&2d=V?p9FJ=8$^z?bMAHZiH z4|Clk)EJc=8Km~uNSb$tJku&qNkNklc~Gj8?Btj_KPatoP$uS=$&d$SMDHOkltITJ zvU%!Y%?H;`0&SWt4{Z}Nm!ZxyD^=gBuT3P2ZNay~#8gWmo`uj$hfjKoQsY589Zomy z6@}GRVsOZCsWx*?suLHhnRepBD-|;zU?wnsNG;vAbiv=otXm5S{yWWDc;w+`?K*uM z1xa8hz2et+()%qxEeQ5`1EjIKD9#AQ_Jc4!`+AJPin#mrYQ}UY#_89rRJI$n55f!hoP2M=p^HyeKS$7{TAI| zH+p-czEv1&A!Jl%&9j+0i`Y~DX*_8<{Q|?u2s6vyjyo2uo!~l~kN#h6E200F6Z$D) z20L3)7Cz2nb0e&*dVtjqu*wMBhzMZfX68ZsEMYWfuM?AvGGfFKA~$zrw7#?<`P<@V~Y?7rO|Bm?EL zOd9+%PVGASldq{jrf5srJpo`fL&3;+;s*2DN674~#BD1!OAgz#IKt$3=%F2$WQQ0Z+YUcIaJHN~a_{7W5XgVX!hg8#&|*_P*U2 zO!6eFTrK?w=5c>9iK5N`fB+eIyI@1!+-cR~C<(i5om>mjA-j zYT!0>3;#|A#?Iub$t2vU`NULA`vs!JJ1~@t!es(7 z@6oX5Nq6NQ#tnr~Q12274m-2!+1XsDf5egV-Rg4bH%rB-IJ+2eMa948*Q0)4b7W&O)n;MRf? z)iW2P{ed2Pa(`U(MH7=?{ni>aD0kpRL?{M=^Bp3NzKKlok4@%u zxQPv=>eTQA7KV4{_n&4CT%NY z6vr1yain~Kq&xL9zo1wY{TOS(i*eG-0&~)VYo~O;{n>om1m(Tez_E%p zY@+Q`wI{*LedK3@9UK2|kXBOdzr zG`f$i1=I(|LN*Cyj}qn<7Ha{)+_veS+nl)-g718D?cD>Cb;%wRdovlmBc?mE_c^6{ zv#{iA`k>G@VUlb~28j`eaVsW=a;UXWn`_Mq(Cvwat`mcfC6p+;p6=|lD~Wd*tRq0@ zd5J)X48HVl(KD;L8fE|hJ!bufgcZ17--O{9bM}I~MQsSSt%>&PDvP&^z2tL?y(|xQ z`A;Aa!AD?&yB&W`k_!{#cq2}9ZaU|b%F~>=f6U(+azp`m_1^;6Tn!-iC$hF4A&|D21S$T9H3s@g(WBVBXw|$7s)kuIo)<*Zy zf%UO2wvTpy+egBs`dAm;$9e~I2%=C*==*OHRxId9)=sXXDoQr)4)!oRmi0D^!iFQx zV8Y`rGIM(>KWOV&dI4jm3o9_?UFik1Wf4}QD@jnoq-JDxae-%7??=h#k8c@$=XewI z0NjL(U!>o_w!iPsVmLgHZqKm6@Rt`SamMQiOtd*LypKCD-ZnxEjtaB31|#h9b4x0z4{>a_fw`fdUYZ16j< zWfqnoH3SF42-Ae6^C@aftL^;_3DU&C-R9B@VM2%}4Mx-ifTIoqV5<>;yDx7R07H%2 zVrrCSnAK1kBA;Te`Fdm0kPGYR_ZReg7wvA&VywGBzM11i-AE~*THRxWIX|!f_<%P- zT$bOWj3Qs+HOv{@X|5)Apv-jO{gz=Y=tkDwLD8nx(lOT>)O&)1fGzm(m$Tw$i=5G> z%F)JR(KuCbdV=g}W0j}1N#VoFYTx|8$0KKj8cw;wnf)#E$r7}>4mq!bQ`%`k!kr9C z6DIdXuAAi!_TDE3ZcC9r%Rb`F{>CZQ#=Fr~O;~a!je#&h?wziGig8;&&=!ze+IBoC zuxXLqTig8B+i$$7)9;V{81*~b#!x>zVhqypQk_fi-GFHo>aGy{ouT4~ zf2uZozA!*oDzv3wJ}k|s6wm#pzA!U-qa5_80y;3ZCTmyu{$?^?RKIM4w1M=B`%uBR ztBnCv+>2;Sv>ylZl{T?JdTb8*W=m_s2TAk+0wDNPT1Kq`<%k$9xn4+XhGDI(`JNV_ zd_=it4;m`8K_bgHQ?wWiP~;3|RA3|W;1t*!qz>~}(_DLQbIa9%!6`ro*6cmQ0(}Fc zLDMyRI!pC&9zm+Ncsr4V1_2#vr_1V)m4234k~Mk=kFY|M-VdBrgX!)@UDSrc#3E+! zUVJmg(r&`Y+TO&l^cLGQIYFkDeT{k|8@PH1Wx25NL38kqu!d$?)hXc%mL|@3l{xbH z!oN&1*N;AcZ($25>P@s<#2 zVx9r0*_hQL;5DOvCf!}?EaMhCl-ll9-zJ&`n43?pMI{-l24|P90HvnhD({jKYv=~Rl#d74^Zi%MH8Eu;3 zwdC^(UyfJ4g^iOsO`wxCtqp8aNxUUiw6u+Bt0`ySpW4hoZ^51-`l#-gx=yRCd!}L- zzMnAN99^u(V`?O6f%yi(U)w5nq!R~5kF-1nI_Ud^x|-70jpymxj&B(?cAO@-hZt$& z>fY?Ed17l5_uJTFjC_RO2i( z8XAQ$8iEl-|fLp#0_DUcBaVP+K;) zp}txDZ?Wc-*2*ZouHZY-GD7T~4C@6mzYt_o@d@J|Bk8MOS&VFOvS9(5*tmRCQz8wv zH>{r2L<7S`jzX~OXsKYS>U=#6pZ7F;-Yt>wZ@md43-YM-KkcLvfL@eqxD?wbEkfZS;gY$MYq^KTqJFPfu=Ms|7v6?Fh~?voN~`HQ9)r z@?NCe+M8{_Z5siCgoo+HPxZcK_E`$6H_hgB$bUA)-q@RISR*tHzTS@lI+Q&L@XGJ9 zAqJ9Txm+fE7v33RwGY8}>fPi&OtUw|0KS>QF$i8^ENE25op`x&Qu*^{dXptejbV?~ zA+O_M<9pj;q=I^k(u)3uFV!C{u@J4ujpe%^xBNT4yEdi<@V+7Hsup?&*dca+M|ItD zqeoqQ69q-*Oe z*3va{ToNB4$5P}*C5_3Vu)0zwOXE`VT+aydr=%Eyg#BHmMpJI7;wg+1np@$$6R=+8 zv*E=z5m~f|$NMLIrHt;!1wGejb|~$03CuD2yOBhighC#$+{{BcjF z8?Q{dgf85JCFJvUyFf9s{$3Zp&_maSeVCJqbD*-UB>jL<%}8pN>^|%pJ&<==G&2yU zD*%I62F|MwvxPRzR=5=%`_y;Mu?yyIXjLt)0q~o=a5U-ewwUgKM*mPB1}?u9*SUII zGp&dFu$_x^v|#|95v(pxd6XTN<+`!eJ6rHmGG}lGvk{y6qM9!b zBV|9+oe7C+$vC!oZa$mU@x5t@aPt`nk>xWjA$BBv`b4AS2WvCv$W|vLG&^@Sy`#VW zpt-OA!094UfKw*@X>LNvAM{3+GR1q%C8)K{by)8YAlOhM{r|hG=qp%Hw^N{d*bu`y zd!Npmi#F2+y}&G&vil?a$H2%Q-4V2#9kOGfRW2L|o2bz#!C6n?O~D+w zs^)7)Fz;rmF-};Dw@v2y(j6su`cu#JGPHuM5-oTZUHS>WkUQ{^7bP~UP)ATx7*oMf zmSaw+_afgvf8Gjq8z`!jZK4%?b#7S0jm-pR}t9I8pRVZl$S zrYCL3ui=Hv_O6rP&VB-60ntN{{(L`5b zPoszPmS)7ofu7N9a!Y(O4V@+JBws$^=s(exDl8wTLTd-&HM3*m4waBjJ3Nl=DWjFS zT_Ol4InD8AG2kuS3_5!EBwQA_E`%dkC#`v8Jzx(1HJw9t(Gvj+)?OV$`W~t_0EQStp&S=22!~Sk) zG!A7U);M(EDu`g0Dvx&49$?4)AE+>jL2qZQGWkMb#2yEkO`a0`|^UB_$XR4Z>` z!FzRvDoUnf*pj@*+A zE!iiT2~&8F_mqZTF*w|uTd|EuOAYIL>pq6gGRi5XQ>V zdTE2eL;U%8h@W;79^#{PPrE5xfpFwj%zs_$JCr~jM&bsuxZh6sNO*)b=X;C>OxIX} zbp(hpE;zg@rb~FAjf^t{e~YEmUht?8Fxu{5@=*rQmJgcyCEFtjv13OStP-?p+JpI!Gq8evfYRm(e8m*@`L;|z+@s?g!h?ern^a`WYj4*8TTw^CUC7SM0#Dryke z<$)P>;m|TWNEHGVoB0TfUMAvl$v@ujIw8akr?0$X1Wk8-G!!3 zQOUQ$N)CL- z)kW8f$Fc=KMug$Hhf(v;3bx;am5yLp@(*aT$K`4({A|2F1oEiZgtcyn9@eW^wm>h# zsZ$=svcL~$|9BI5?Ec9-GVTaBqI*obG_Tm?X$uP`68*Tu{a8xexSfF|3CA^U!Lon z;d0naczreS9+*Lvkq^8rKm#4e*_$REC9|;TA227 zXV6jt|4NrRQ>rU0-VP;uEoIJ>z)G@X8fliFWM)jx)&aXUw7W?t)?xBzqI}4O0l{Do z8|^k*<*@ajO~*R37#tLkYU5|N5T$ynCmxuwE8r)1_6DW_Jg3}pnvE0!q3m-LyL9LQ zRR}^Ar_CMAD-#1rj@$!+5Ba)OI~IdTT90}s0UNQpa)+dPrnmyFSz!CoR^Wf5=mqY1 z+0nu5`{4Z~xd)vYz$VyAp&|m5kMy)dJ_P6-CZBc5-%c?r6<6q4P76V+K`*Vq!&d(( zL7oI73SE!(s<`=3ewbDlCgs8%NVA24+;lbRL1XEYa)_=WqzjFn%jg#8uyUk-I8sC2 z4J|)i?vRg_{9(3Mc&}g~gb6BTRt5vbSQF4Vl0_8iFG>q0m^}T&z`yY%7$Ia4Oj!e4 zC>>MVi;ZFCnDZWG_oAwyzW!5l?}E=AAa(Yd(6)7rk2vHuLjwrG^OTtrKfj23N&ti4 z33U=nYjI=mX#qdb=HA;3_1Dx07`#Wpr=~Qm*h1Z!YJ~UWHce|Jsyi^j zB3m>t!hn3akGQ-Mp1@f&<*x$+1P~i*-J_=1+G&IdA@8pgH z4itHq+pMf7Z9XLO^kUk8QLJFhD_yKGE+{T5NO{xZ?U-T_%L-Bg63Il28$vQslnYwx zGK6JGmcPSL*JDj6!$*u5p=_+t6ad6q@l+9`U~q9YGa5zXnk;z2*z5_27Khv;E=Fik zhYTr%Cy-h#+Z!;GA1JWqW50kIK~6xi)eXhgIFtxoCZT`=*|bdLtFmxX9p!LhBI{`s zB)1}~*k~4|+C~p^o;a*r+lR{nc_v*rQ7ierUp-fn#DIMoN{o-&GdaO(#$h`kvCtn4 z(=R#_(0RoH4BwHvibRetE`dC@1pje5nUIkG4ufww<0dP3HgQ9PDX6ZLadjn=t1AIb zU0J26D~t7I@hxLT zH9$UjppOh7U8Lmzrb0Z5w_~J@`1}?lZ`%{YbN@#PK!@pvmDA4~B#ys*J;f}@saCs0 z$;RTCUM8sBYWbJQs!MCP5u9%Air~SRFN)OKnlLRebrjGlQXxeORb!;--WAq4n??F5kJBwTvx^^m=pKQ+ax`YiW$x>aXImug0Ci~Us zEM_gOLk~jl^$du0W`l}gDXDgpro?SReOTOdFH)o6C|92~Go6G*=`$)6j>nLxUJ1ZI zmSQOrQ^WvyZUBU$yoM3B*gAsB@|I0UFq@qY1J?W(|6;LN@B&Hgp3HH1eat8Ks_)Wa zFYI+Hj>fs-DL}n*GvK@gLbLy1Q!np^jU#eVO!^yoP?QxSi1+c>H6WoH zhoVh>$;@?jOnpa6f2XsJVfwT<$01Y2(C*UR@ZV8!6ACDPWj-AzzBsU)tpHh7f2DMw zyRjEq#6C|yqdrYsCovx{X_m*ixyZQt3-z{%Lqo#EZiqCL*s{lapz_E8@-8~E7Q z_i%=!J`#?wsknQM{HzRtHm zGtKgcY*mbG%|8`3z={*)9isFz5a>?vU`UjHF;^&-7$JZb^41Y}KoEkpE>UQRQaltn z>Vn|})8u9DM^VIR-FL!#xtEkS*nCd8aklW_CSN{?bM?t-ZLW5qJ&y-B^QX}@WC_~` zCJIY`BHPMVFD4uIfu)VK`AaEnWQ_YoN<8VO=p03#R$KOfO4~cm$XiP+P1oFb^$iQ9 zbkdrRu$rGs%u zPZcLENK+L`ymZu@FKifp2GqY_geGJ~Ob8Gp-Z4VFUHRg79YreM53x8o`NnbiFaMLV zY04e<<~R`OUqK6Si;^-f_+8X+tip zr**ek%awRxL%AbpDHo;kaZON|FCSArvZB*k=(Y&3cf|l({I~e~X%$I4;zF+sY5Rb*zbY2#$aL2J|8GmmH?X!}K7-qesg zsNx<2TZ-pd_Uj#E>S!iH|K<{TIuxjTekU^kntOa+{X3gYiXGc(4BHp0CrO=(@uZ=pHCjuLg!Gnn zj5fCPcqoGBH{p%Cs?h-VDDC?k&S)nfZC(+MbfLE95BK4NnLiZa!+G8ks_yEEMv7Na z4F&2krY5p3&W(aj?`PW`s-=(X8+@a(H>41$pYjhU;={-MVK%CuXaTkz6LKmqkK!PI zdY*lWS88eruiO%=EW(E03K{V9AeOA-C6pz59G2|kC6o`~cKr1u{_3lP*avI%=j*ng z4hTiy>wxcaS=!z0bFm}|OSbdcld$BkLbNQw&>Wv;#6teByk5@ZBD6$|2kc3t_@4|S##RR2i)cZ(he&$hm}KuQ~t&&?X+s` z1+t`uu;80OTa^1j!E)pt7lNpFxr?fSY31b%7B=+W>@Zj3i#AP zedfq*@C+(#Kq!U9*O=Mi5XI^SK`B=Jo}Qn3(bI|jPR;Lk!qZ0VcgB-aamot+3w|`n zamb6(3WN>wH^+-o)df)sUoI@gR1U+7^0p2$|0IS_3=%d@gU;Fw!an7K4E0KQJxJI9 zg*eVMmwZJ2!fpP-Fw_)xa28O`IvS?~<2Q%Hp4M*pPciq5;5&lX;l=X9=}@2^ga_WT z4gXJo9-whYP7AppQ~l8JR(;)A6{{p*l}96`86j)r{YL(NIz~a9lj4vIQYmzrA%y30 znsRTdvvd~{l^%jcY27g@--lba*yK-O{}#kWih=uTT=GSC@VZLU(078Kn34o)peJZ5 ztwa9mXz^Gwc%s9;}&XQyv;xA9k4k1f_QQ zh%g2P-5nn*Lb;GQp4*^C|jPVD~d1$_lJvAkkkwSHP$^^C-m?JQm*t8_r(v zp%vp|I_1O8?9ZH1WBlx?uE0&Qr8NsiKHQ2XD$`tnBq!{^T=E!D<9b+KMTuIpYDAHx zA}rz5>+>sC6=3FBQ|J^)xUe!{1TdeQnG2MBT3L&a_w&a}<)slQ*%%<9l^CT6zi9!b zp*6JlrG*n=`+^}H@mgJ~_b$rD3*2Gw%eyEbA)ANsd2z?(Mb7rtPmN)jibE5m`q`d= zQvDq7=z#PktLVmx#QaOBA{K{k3P^j{>+8_UC*df}B$b3Z1*8M)O*{M$<%d#09}-bV z-_Y;RhbjKVC4Y(0YlmN_LkwW1H*(#z2t(ppAqbMz) z(?AOMN`h6v!4b6zR`f+hNTe#VrBSXi>WtztqobpaZ9~u6ptLvSnj)DxLD|9CJuC zmu!A`uoN1bBl_zz3)lJAb&2XaO1!1i56m#7ktf10F;Bn?lM&&ea&yp8Wdr;jd(`M= zFE5kViIo0YlGP+9yIA_M8TFswQuK64GvYy4E4ug3bO)D`iLhP_jr|M;wZc_0$a@B? z1+3;FF*puQvfle$!K?aX%*eXfT9@$g#Jnilk(A425EB&NBzulDdd@02iCQVa#q=r3XoN6?X z)XINMsl7&Gp2XKLrG33FHUb8-HD-sOpU2LDpBrOC;O9@Vf$+0FW`&>M#CpQdov|$V zxmRn+JYk*0_9cS*avJ`&PTwJ1FXcUW zEhdY>M|s97?-+5$lZdGs^CV`udU$xrCz!2jenH7|n7qn6L>}27Pie>sInDB;_?%4N z%k(Ydf7iK#k5-Xr_0^m?wwjr_o6J`r2*^mp~~4uzk0 z`AWwJU8BuTwZ`dh@9F!ylhTm6<&E;O*m;ved80)&B7E$CpZLlNe^()}PC`$|a-5`4 zyW~sYN?+tuvl?#XAf*{sgS1%k^TH8g@DJjQW;m%?qnt}xX>>5mRveqx60?>}8D)k| z^VemIC0{Mr0YhlL%NNH_eZP<_RD%TrSXMYE@GCq6InKp(AH>dg3ZK@wN{;#dkf5Y3 zX_T}&@#U+@Ut*kWl*$eXpHVxdiAP^dYiCUw*+0g~-o;WBWW-7m?=MMvKjqkD-aik% zcj?&;ICpT~T;pVP$^VQ_5aWr$@+I&Gl~ch_(CMUHfS=sTOx4EM%K2-A#>>Em7N}Yo zEA5%P;p3^-fi@w^4PxP@`|mDuG?r0`Ye(aR$A+Bd*y&u{9u{7zF@HEoH;R1o|q@fgXA3G-EiPpnTe8t_n%EEtS4kWd|{b9AqyxE z!R`yrgbV1-wq}-CZ(~M_DsR993CgSE+tk=R1oME*EPT@6$-wd6vt1?Yd=t@b5bVDM zFSiZeYvIlFjy0<;xiK~hs36OUU%TYIC1t@0wz8551q(+ZE|yoeuxXVoVyDB4TMyxj z2>OFgFB;!wOy@^MFY=|(PKxV%v1au06p;H8job$q>@D{+?` z%@p>QMnm@`XlOS`dF)|~q_X6+VH3wd%Y6;NS#}klx>Znk{ z3I1Y{NU;JTcfnZdW+r<5urHR&4M(gT-QK~fEBu{U@$3Sd7-_O$j?@JOV@*QfXWnBe zHYftmla_Q~5)Y^FTv%$s+i9^&-X;7od|VPPTwf^)3nQZ7YH&t&Wg?orROm|-CsH|$ zAdJbmvPUVJwLZcPsTwA!>-pFAq=C_>m23Fu0{1Ykj3|3P2bMVdr{x`LqHTX$3+_Yy z+`+*sLszSEAHQl|)CcKUnKG%3FcbN>j%;l)#a+u>N6;F&N|k{)&5O-{;0zi zt!`isR%H;qjB81lF05cREakME!A{E|Nd}GPfJgp9*>e>JdmI6pLR#__o#Oa^0FToF zW@kBe9f&ZI{WdYTHjMy_i2xO4;RkK1R}t$jTo&`Fpqb^NalkbDXf}#O1WkHL4bL4OJ^)%Y*F$`-69*{_-BrFWW z#q1HJh%*u$;`Hxs#mFBUhV>*yR1YTr2ceH_X88}Q)N+o zupA&sR{9^vLA-q|!x5&KOnZo{H0nZ62k z`^|xWAF)zMxR{07cjVBOm_%*xsyMF2l65_R56F#T$!1>r0hdmxfJ$X( z6B7`TlON*Og@SYV+pTO4L$qpC?%87N(Ca|?84aElonvVRJ3a)HtH<-%GcA`;>2-)D4ftmn z`|}*s=#Mw6?ojrpHeTgrgIkU(Be&ya5rIXZ&#+w}M?B`9XYre_4YW5D1fsg=ULb&S zDOe=Im7}bzffLXO#PM<@qMVJOBP_=vH{6h%?6{Sd=Nr!B78H~wSkbO_ILFyRB2G&gpXH+#&!8yGv;06 zmS1PF%knei7SLZ+9RJZO6Rt%PWA!rWX1)bwc^Z_>$)!aaVYGKH7GTU_Danz3;exD+ z?#X50epQrKUXnM8xLwDUg2oPFSLj4q%LKCK=tr2lB*e_;w6l9)Ta_`Nwv#-vpJw4)?Av+p%|D31Rq+( zFAS}Q60k=#I>xMt8`|0^^QSWgySTdsuO}#Dikva|N+9*y3DUSGX=g$H%J9u&d-!}} z32_P7#&^5IY!jmYq})1}wG6`AL-YmX6tkxQr=aI)J+&4XW(8#36+Os&0yoqoJ1z|6 z^8QpiC(_V5nYES}7KYwZ%-N;cJ zPy~g(`_9luk~Fty2=VBFCgF**scKm>a>{$mZ_l#f)EG zHdxR;s3^)iZcmFKvH&m?TwE-U{PxnLFGW%puO&2QT%raA8ZuU=@jBv)pns92n&} zCzHQskv;f(e|rw&3i|AX>i=Z1>4n*TNSN}TNvSwloPyMX;Jn3LRIS%U)h|(0O_>_j zK_Mx%o(Uk!9zwi=T8}3c_rqP%>5&f$ftkR8ISX?YRB#&5KbVHJCL-8wj$t3rPNkEZ z;rdDQr8}L#Ib4|y0 zUiU2-#*O_M#f3V!w@7C}ExOz-f2j=n6Y|$BP8ceGTc!%SU$Yh^^df1^p^RTne8jMR zO`P)67E)HQ%HSe7ikl~DVpO2XElA-=(-8muR+MkyOkp4L3HgYa3-rZ^0eM|R8ue-d z7EA@CQzl(Ka32yTEYxvq1qoL^fzbr+f(jZg;v=UCavXLp`Zg7jj?iIthaT6sJI<|K zgkxSI;&Q|D9(j`zY{cq=TY+qScTiL|&@QJ9Oqh{a;{)cDEv2Vo`RSjr?FS-EAunW# z0un3M+QsY~X^dtTF&a=&^>;k-ul_X!EWLc77~0iYNKXu7E{(G4m23EMf00-Rh)KXv z|1WY57F+7Yj3tbBxaFTyILELxNMNsUZv-D(mMv)YzXW92vynhNQcUX%{s?+ z>i1{+!doGh`VSpaFo`_dDYb@xnK_cT;8anB| zSET5^7wMLwL!kJ2aEFeF@(*r#tMbDb+_LXPIR=M`SyPPXu4)H~4sZgH-3S&>1vQGZuq3jywwP3w&=1d(SQJ1^(26zredMB&p4NGSfVC0`Ac@r00oR#hD$b7vj zhf4~+T(luaJCI=Hma;(e!kbX+$QS*!77}sGTE(EpbaHiBH=Dr;rJIPZ$`@ZFb@@Te zn&7XsdP-V+AL26S>lZFleVak`t#?L_fa-gol?SoS>_+uX80Rh_GWc2f_P?lye4|xE z0VUieN8z#92ofjGb_UBBA$Uv%6ALz^l$W561d1^(1uXnXzP-R2e5Zlp4hp7d*iL0@ zi`k@MmHda{IImCLFq`uIKQ(hN+Ab`#{_9|2lpFqo629+jv~G~OLo;!p`2CYI>EBdc z`Z}iWp29ZtTrnFs^xdD2c?#aFdx)(!Fx}YBF%dN^vBwk~Ohk;t{~!+CESe+23t>>t zg%{UVZ}R>LP1C+nl}`VnoDAQ^&gO~P7O&kIoLDNBMCQSeCl-s5-C58ZCdsqFk>W$2 zQecf;i1p>Hy1_{q`(`I`%uCRia~f@*$#AXbpJHySN405~znMUUE400Zjg=dtJ<;Vn zsX68N%<5(oM;amSOpJ zPsx5E6w*Yh1Iny1Y%+E-$>vj=GnoMn7S!d>`R2psEriXx*9q*x;+^FTPAJ7x zTsGfLQgA{sbR$&vAk>U#A;ao@aH>miUKwhRB#$hRFns|UwnTr#DykcN-%BBnIm(MQ z?jF!W31rAH1d7;=BB*`);WC1Ty%&&yn=J<2oV%1!Z*;2uR@Hl>$gE{jNt16UN&jNd zX%&M~J}fuw0WuW{R4xg4ibaAOb__;qhR`%fqtP06vxa~CCpGNb7PCll6SY8Z&;=)i z(A4eZVyT2o5Xnxn*uit+g5A;0@DXuCWcM(h>tQ_i=Ob0Z_DeF5gN!G43|#IHmq52- z%VseX{*WU3v)pEdvirlUR#?EXR(%D%{o&#r+aEI{iE5+oM<&3}h?JoY-#}6-DDcSh z+=46Y1f|}IT0D!H^`bO66E(t_AW{PBD^Fv6jPEJ?D$$C(2l!rZQQk&2+2~Cem)zDO zEWL(m%R!5YJ4|?TY$vl#DYwFf5gh@4DLsElIzX&mDjIIdGmu^|Rmu5>c9ekPa=drb zI9Y}w92@0XZ)U=;+(ss6<>nGjx}AZ{q!*oiC!gmYOvuLE`eubx%$`L6mq=X*}$FyRO%)hY=Jv^**oVcjX~mCufE{Ie z$Sr$fH8i$%fZqZ!hA6-=p*{+6=$-%J|)7{x#wg;3qbnnkuXi%iyW<;dG)ObR^3 zMNLZjXA{jkkT3r`L~jU}*Ccw&N?d8=&VMbOk@u6ofY?$B^MjYU7($m{1QH@wPN z{Ke3Lw^FcU#=k;ts-tozW(7z9t$9!X&xt(<>OeqOU5<8qiN zwrM24;X5-HoR9t=tHi1ePJyGbDj{I3!%r%la$T&yF0RZ%p9Ae<1q}qI2`a>|iueK9 zb^|X{9R#xD%`B(_>30pjiD}a1Fa7a66lhE5pCN_@+_M$IXL)al=FRGEa%ZtZkSI$R zMc-r-)nXQbKw}SL9`!JNexWG;$r7yQ#gxZc#rkpijGd?~9oDOt!-`Cng7b@!=v7Tc z_#Zp4k5Qub=8Og+{0I^L1|-0+M)ezz>Jtn3k4w>H@HGjHQ4;rym{D;Nfe9YxBjJXG zK%?+PbtaQd?CxAI(~OHiWF#*@xg17e8VxrfLQrAm=>^5jt^&8kcOfonkR-0}+^hf* zl8Vyu65}wxLbEm&O!aaynNX@yN}ns4&I8#pyHGsQb(@n8l9&FBFmP#CGdZy@y*CWFD_ zeUri95jLe6JiO>Yz-ob-g=rR3{+01>x2byVa_H!JZK``RNNslKvEl`h%jK}v%cnc`Q?ZO_cq zA;ghG$H*gx2;^K_-{^c|_8rZTPWL2%DM1p*5Lh{(j^BX;g({2Na zJZK5sr^-c`Dn$NaQD5c&u2ZUp0oiA2FGX3hlif6!r@9?X!pWO)54?I6CzQmLpJCAs z@-E=i$9`j0Zq&6EKDWOpkw0BR=N`|xcRsRV zXt@Y&hEDm2lv{^pt}yX?2dN;E?6feZf$}LU*h6N9o2Ip^dixP zM*e9bQo0h$HcUxK{7wr=jhwG@7`aZ&{mN*wVa@GP<`%Y*j8yvj)_i=S=7h$JDWTrcOu#Z?>QkrsVj3gF#$8h8bkzwV;G#INb>PEE9>lSWWeCQ(;}DL6cY$& z4ZGUJFN@zbl`3e7ETY(DX)pu7?ulQs6T+FOa*drqU}%HoLs3jsryML^Y-n4|P%{(nR9?*PcVLa608yFnB2RE^fd{r3quI!Wa7cOQZRU4nz||=Q zRkZ39{F%H~3-cBC1-J-Iz|vQBaoVcFljp#b&d-QII@6FR3-kF9JI)8kOT z+6Hu?m{PKC&Mqj26I*1)d$EXsAE-)IEVOf3#a)nZu)fWqCC2lBvI%8rr#~D!J%N2r zq(GBLxcabIAJGa2&5=re@Lnm&U%Ab@p~bOpnt?%o{-(uu71c_|g#jV+kVkG+7Cp=E z-8YdHhbDt?TN4O-KZ}WQw>-P4S#>jDRtw04yDo1d?V>39JXcxhd=~MA==}=b&oo@x z0l2QFVWTZSdN39)k7MNKkew6HX_Z_4MQqvXHt$7wN@N3-M`{oXZLrDp&mmF}>NSg)uhi4!%RX8yig@r#7R^d>Kum+Y(rVXSn|w0gM=*A<65J zipr%K^^Qh&NvmeSWd8U%Sj%G|yMySCiaRMncq%n%9WQ$-z}eT7a6xg2f(~DbSW(X| zDUI(x&-uP~d1>;)E2;8>lZmX_>?$w|7sJ55*2Y{C+sIg7kYZpbM~R&|N(gB>x_~a9 z#fCvFWDC-eNaUiz9+>zXy=%;t`u8s(Nk>< zjz$K;e8z&1B;I`yS&(;xW{g$4KkulK=bej4vuK1?irYHju5y>WmW(SCa)$P zb9MpZ(jLCl1AFYD{1nJIKovGICd!m}W$j|7EDljguSVnCmmawz$%bk34G`rW22-+T z1^;qa$_=rDv-sg|xh56*r_nabwlYg$tgL*3<8HPmRJ;XfK~lM?e8k`A1~|hV1pW0P zO1n`?0z#Xz`Jc$zy_IWqD|xr{T&mOaapkU|2&CMX!jv}=Q@(<7_UtD01RXd#Qd#o? zyqQ3|gPlQ1inw#}f^)^-c&iwkl#i^qJPC+}pNMie)=$?U%P}s1K6W#oCgU$aufzQZ zy2Q|fD#6UGJ>1`r z;cv|p0`HkMI~H``6vg2!+bo9iJPfRee&$>koSl~G(7_Un?_4Z}Fsfs*qY3r^)xJ_; zd957brV27ttcNk}233j6yhSu9P{t6IcF$yfn6@#_dCbI|!>`c(zEi+7+}F84%@IzN z1ViT9P*7vQ%u)P*$_V-3$O%prNc&Bjj^u5d3S>i1JWRTKB%DHC) zBg-V+79GCkW4P;!(Uuda0sa-e5!16l1LR61TZ*vs`c73%G$%Ycp_3(QA%(O022dD4MBb{3jQySTVl)Sb9jgy-NkcrM{iaSz=UjS&a^ZMqtc zZ>6AI$%Wb!eFvHCXWyr~GPyA*#gnPjJZ5x^*%OYj(&vcTUh=yJYUhjajT_W zs;^}uLnjob=Ne&Vtk}j_amIpS#CthEM#mCx3LFE7**~GBdiFDn1Rg@HroT%S0_g1L z&ag$y8CFHkFoMGq+`gpt;RwkbWYS-#S&oPzR$3We0@sf*T5fRfU!S3P4}^JLu`?<>2W6dgwYUNnA*F@ zVA~8mhy7MlzrH-Or9zXwcVn4w8=qp$3x~kYp|-z|Y5VI*(U-#pRexV*ilZ*cGg%5( ziRP6|a;Pr-&fFb(Je7Eglt-2si6=inJekXhc#3`(@l>3FvUxPlIZr;33-Kp-o{;@W zE~66Uf>1!Zuk{`INvaRyZ_22@(7pXAQIsdpSaloLF}8Vd^n8~%Tz7bo?a>YD$@Yja zBzC?>yRM@>>L-QD(76Um_@Z}t_otZNlEEqaBu8|UOc?elg8P($P(O|BiV>Wy9Nv+7 zq{}cis@5rgk$$WXKXQ_tx%27&#m>~7PCJ9CN6P|DaQT%5_6dKFP)z{mn&Bo?F)f>2 za3Jy!k~-Dm2xGFVz(XXSpP+q0)O;n}R+U0u6sr;Ajpe|w&=Zvd!+YE+RDX`%7^;{c z)|aAyY^pEKGx7P@NsdBi=@VEE+R-Ein!F>>!6RUneykax{Mx%sjSa@^CBeyA7+SUn zZhidHu|;{kv_oay4&AsKXc7gf0aM>alp#+4uGWO7e9Xi)HFQ;%Kb|p{9Ap$V44Pn` z$=i$L(3NvcR0GI{e-u^{B?bP?*+xl|5V%ogJlsk=d}Kj4KD0aY+fGF~6Y^Qr2b=P4 zZ`{wXlgOl02&|@yHT3|CL7$0*HZA@$-u~Mus-q{0^Ho`9-!zx-afOv`M&@8*Zj@53 zd;|#3w<6&huyUfd{YbJVpyss zcsKT-DA!7B5|<@=_mE<{n4knh#nkWwI4B(5`S3+RRSuFs&Sa)1BVdIi)?XgTLjuVe z7_(tZwHT~8bp0tH3b(_XvLfZKcgwrngh@zG6Qc3pwBQ}>GNm;pDXMuX7xuPu)kG8B z=RL_!{clC*>=IAx}$zkhT>@= zJO{5qo6;CyEEY@7$hC&=cM~>6`EUOHyYRi&#S>6b!KOq@%A50;Qbew!Cf`_NGtL!c z9ez{BM;@3Oy93z5)yB8^1CP=JRU$8(;6__Xq7|i#cY#@Q(iRm_3hEb#0C{{c((R-C zVA#pE|8^I1?c0ne<5?=61X9`~{o!OR!$NK2OWB&0tY>nmzcphn2riR~)dsY$Vc4j7 zgQzw*ngy#Fb1K;cYlhI*j80se&^JR=>*RWZfcV!PgXhGOuDRPz5#}`LBw3DBur}dilKSPM?_(E9p}W;o6wS{|3G5OF6PTlSfF-WHvS$yr>6aCIL(+h?0ECi(P250p@fd z5T+fda)|P_=z~B`^r!9)x1~dEaFFVkz5_(G6S|T)`Q=@llW*?}^lC@Oyl7K8iEO1L zOv%=oa*R$Y!oz~mjwYvIHQ_x^n14)s={=Y1O_&?*-Q{E>=;{27An{GHOYtsX`B_>x z8u+q>NGr9R>g);A&wm~x26mgH*-)Dac7$7g(U6?Pp7WS3=!lZpw;N1eIjguqr=u-} z{7}5NqJ_aC!kuq72~VKY$SeWqZu~DRAI>DY7pcLnh3>iVW0XC0roP8>!8| zm~lzeO1!5zVNe#(^qWy#fT6?&!tb%Zl4j)c$cWfb;SM+=srBwL3lL0jEymFG;)91- zG>f6$8CbmqWQ(FzHWQcD&=iH%=8Jm9K{8onF?r9%gvzYmO0>|-u+Q*EGqfHZM43W% zYTpahZ;{AenUBGo-hx&!(Cl>>q@MF==T>stL8(|WIcr`n-$~3wQm-tqwy7RCKMLB& zj!9#N7x;#ur3_l1TbcwMz67_I0f&{L0tN8K&f*|&E4QZIdpB}*9NDs|X0Fh!w-H!n zx=NWabvn|eON_pOy&Og+J7$_78azU6ev4{p{@v`dSVS0;8a!3o-SXZjo^fq0KtL^w z36J1aA+6OX9NC|Z?8@Q}6^tM*gPow#(Mt4-i*_u{y)nKI@L?>h2CI32;oCEC{O*!_ zQrEB;R)glLe(rk>m%|d>z%8=YXjuD=v7eH?4_{!M9=|PbSjuMjQU{x1$@ji*jaLnV zdF5#IE&94P+86b%tG`I)7alStO4xkL-GYIT$QrCPFAx-;Kab?F%7h4h(Ss+secpP6 z_<&WD3*l5oF-xiO(%8_KE)BG-uV8+m9G@Mdt@lxJVKH>sANMyW!d(A-W*g(5(d-O< z!*rRLhqefrft`it^9#pU#&4J_*bQ^JcEenRH;ki^K%67dIBKyZV4Qi9ydck_K{$Vm z4NHe+zPNy2D(`F72L{jl1}+t8NvD3Hpz0{K)ao~iM{w0@Hwt02$sS@Cf8$0GwHsx` zm3VaEI$;aN%wx+oGx?oZ!XX^mFL5|7@+POhHODs@-7Y#YNJGECqxX=zq=_~0@U0HY zu$_JdiF$nYg1r=71A~l>BMZzKhS+{CSHsC(r%ddHu_1>OHVhD`W20#&*&MMW6wPhH zf!IJFY@k1D0Io^6MrxHzXd?z&P>Y)KZwuo)dbX)$@)1w&fn-_5H^AMUoTA*=m|}6K zocHp^?sRhIY*MDq*Fs}78+$@C-{@~wDZm853DXPmy*<%94*L^}m7`0wn28H0=D33z zaBeF6=K+>8wg49;#NlaVKtq+tzJy^&Fn^YVxdm5cYI^^0gC1a`gmjd#qKf%Ux8gah z&BgopJGXq4=~K+NMBx<&#H6T{KKk3rQ@Lc>PXc<9t1YlJo6y&8GV0@MCEdF*LaM_3 zR&4T;4ZAe3g)nnM^&`}`SqM*2Kh*(zFBOfJ58AwT;LTI^( z`9S#?$WY2L%&*U9;>{mn`MtLz_>^UfWiAAm7ShRL;IK~N>25Hq<2a(p&YrK-QL8)* zS3@+tK8Iau$1)fzf{W`mmC6xo4Ql;xt~w4oB3|lDajP&-U%Q*VD>|D zv`!AX?6%24x81J$5e?_GF*Sk61uD_^?it*`RrBXlE9waxs)=cZaevJcSWNMjjGg3Wr=K zRn`E>?46J1BIQ(F#gXdhZ3c0-7zB2T#*2$;qv3HT+(`09Ey2=6 zABtiaEU4>12tdM;;Ko}-Dm)=PaS_?OCV`Z3oayVE;Xb!uK_c`9;?_7@nFlYJtK&j6 zM;L?cY1Aw-YSvAXsl;qO1u=g^GHBHW=rEwzR1_@G|0S9gAuvy6Hi>f4d?NZVcP0^F z+!oD*St_rt>o(4yj=)6Sgc-a%hdjfgyqPgJxShD8NR&TU20ffG2;2fvl_dW}7wst! z4Q3HcMU%nBnBa9@f@;oqH!H0nV)302F4y` z*qJ}a3=5hK!<&)~;|p8Gk~-fvq8Vhu8h7T*f^tvE7Y|>m?Fh>tg^^9Vu=`W9Ozh*tXs%7WHNdRLMr%yDtrUCxqtF!P%X#?tua(0&!aP z?e{Z$Sqp|BRYt#Lmwdu&DBIVitG9r@<=Ba*FECk|PzKV7UBy))* z^MV2m#YC)VxAKgSv7&eBluiXL*psh4W=lMFH-GFA6VpY3=yv%#GZz%W^LG3_p6M-s z_ifs{*2KFGde=wi*vgFFg<(qCCKZ0+F4^T4+`A;W|6dGG3iZ!o@us$Q!pG}ccK932 zGNPwBED2ll{1@J{-pRiMcD1}St~z!m7sl`n)&WaKD>NoV+^!5-ld|+xWtbDaHr?Ai zN6EhnSAR2)8lBF~0-!jo!(08S``eMEV4yt+vJtxr&J$+v2Sz!wpdt}Df`68?um@n4 z)l>>hu$Gz7>Ry4K=AQVc75^+J$R0F>V2M=a^ zr5@Q`4yTdJPIU{;!0cSFHv_3L%U5Xu z(M`@$irul|otUq@F&_s1DHEWCW&6-VwN_)NLiGjdIVjs!mYR4D%D8e2S0U?Hh zD1SIAo3OULl)GMJ@$pGnr5H95ZW51tjHhOJqo7?&yo&eH*(p-3U`W6ETq`Wh&`#(D zW*S%A0lbii5fH>=FjS!+p2%!{_m*l~jco`TET#o)CT>|&xPIK03q zd{U-&av6w?Sqbvw;AS$r!ZDNnr-NHW!Qy&_MLVvJCQOu( zs~AojpDx-85ovdJned4xC$Xz&kKDbwoo9%PO#-%*#r$kDqpoKutq=d@ETKVvFQzsZmtQn><{8n77` zCfA%zb#K#?9H7@;xolh~L2XfND*^IccqOdicds^M^bXp8ayWG4WUl<)&2eL*P3v!Z zimgeWVq@+`rRqboN#5k&g*p3t+0h5*w5uz}GDQ|-->9vWIYj(x?F2XlYJx#e5PpoNH6WR9~syRJg2Co z{wp$$=4cawT0>>o{?<<6(N8(T^*314A*JINN}w(up=_hd#rxo@UDRbL^5j2Ukwn|m z98LZQEufCyXXdFWF~rCnJjefFo=K?w3q1CVQ@A(h7vbJsmBP`6N}+gAqfm_~PY|DS zkhvBKg`nSL3WcR0lIm4{|CZ1MRbvhfM9qp+)iW?z{Y z1cm=P{?t_Vl&`>9KhZ+rT@U)>8S`_|L<2fqY_vaa@tsjA3ipI#Bgnlp-irMxx4h7y z%C)gex%>{o!#ZW(Ad)9O{6$zu(>vPeXsQ%OL@?ad5r*Fygy+JAwSgwz0QBQInn3p% zGd{mmc)3=1F;e(t(!DUvCs0|ribS=fUGIa~EXw+5ad)U}v9k2mPHi}NmNDp9sQw3Kc6-Ur@RylFHNr>rgo3cTNeKi6 zd)Z>1SWpsN8->EMSI{ahd)|kYSRn=jY`MxnN#YAw)=*#e6jy(rX8`xIrx>`s?3EN? zJC2)8f4PZ7->uN_Vo*eviNUFF^6)p`D+UFir-bG{#d8b`u}xi} zJ@S6~BNxIW{&u)xnql9AW%&r2H52;!rp4~y?a;&8a+(PVr%vv*{s#qPF*Wrgw)ib# z=%Xrnk^;EJJ6X!p`Q+{oRZ*yd9GC_F@<_ta9Qa)hOk;#rfnuta{$iSem7XQtAV@n+ z8bUB&r{|e&86=8?^a=k3a`;I3nv1ZS>L#T{o` zM{347hO2#G+KiQ9N8(1~Y1t<9QYzw-_4(!`i>dO_I|&_%eDYn)|E_wo@t(d1o$#3TB=b&_7+hZi?d0_(+piO2TQ?*Ly=xdugPwY@ z31s!RVct95Z)S%dHMdK;;_7Oa^)A*gH4l23tV+4{_`Cd_Q5n0AXH&*W3@-!5^h_8o z1}yNMAuNwnH~0oYH#uvYNd!_hcE(jQZ^bOi^JX61y5mMFso}wfrde2yF+clIyG~5hbLIYQ_Qd^+b^YHz7#B_5C!O})K2U} z3eJK5%AwDL%1@^!R6y^2AQ(ErfhL$$WLF43do2nd$5Hfko96J%RUE`#pDKX^mzpQ2|GxGSAXpLafVFoNyBZ!6FNq}mmF^me% zX;*C9Nf%DZ5NHNHwS|gVaPe5m7vqxg{bMz{9pUI()3Hc2`z(Wh_AGpM9p7c&>F}-6 zZxEfeLO8U-$2&-niCu`*Q_h094O-2&dsn-*-F?_U+4Q7iCv7^bOoUb0K$wSp@dW2s z2;_QRLP|e0kop-JX!5#X5yOT>gpUfLv$s~Ug~Wq9r(Ih}M`P>)TuQ#IXP|^WFDI4* zD{@ZCIvQ5nqLmm5U6%J$qS@1-+1LkZUK%&%U`cn;;40+1gFXujlsT7p_uZ62J$639 z!GlvV>7DZR^%?+yblR_(mNJp<4IfBGQ!!LPxf)j5DTh)2#$r}1c?xTqly{EF0m0HG zM_fS7BbEOB+Ef=1=SWz&*{phQ(lnoXABIF=D`Ae9YLaE>{wRCE;i6|LK z(_w&7Em;)KhqAi=@8&Ze`no`DW$fqwXAe&7!OD9mL}4a@Tau4TL+f=ikNn)O z%1uPQ(HAiBTi<`CTEWw--&z5Ie%I;Y5kmDJG8mMDEaIUlXy1j=M40lVs1}0NosLFq z(Mdr&L3jp%tWD8>n@@5;7yK00AWFb%B2DBFLKC=)@rwHiw>=$=AF~mYggMt($(jW$ z4%ZggB2<4vTwGLzj^OY+wpbL^CYQ-sS0IPzu&$ibEdZxLu%V#$yK-%3(E zNCwF0-KK|dVkxXvGlo~PWbB!gWt&u#VE+PTab}xJGmnmCO0V|C9q>gIRet61ms8W% zrjl+235*q>%udw#CZm~&-)T&fydVQob00^QjD#I{4{))ZJ31JoW-C_TMF8I13?93w z=cH5#s{5T*aSYR*-`f^fS){YPjT}AgJgtfy3vo@?-w|1uECw3Lit?YkI+Cj92-T}N z6DLe*5hx7PO-!`oPND`OaG5!g`tA^O51vEjO(wWivl?eLE6paubNEz8?=~8vh**n-JUih4QS;}jbcVzcdPtuqOY?L{x#TDGKJm1O2#X>|@OOGiGAg7tUHSCR zlsN|mqB)Baf*|8X%gWir@{J%?Eiyk}`TR#Tue2~6+ftNhk{Pb>WIm7bVk@rv6<&yD zk!9?%$KKN{_17K+F@9)we#1qYCVwmT)Jd6FS%QM!$Z~Z^xfGsuGw?I)E+Pa~U%v#c z5H;Rs@4yyW=7Id~G7pe@S^0scn0}QQX0`r@lZn21da&cl%Rit%-K4o2lAH?_zI;$y zb#2F(a#ATdJqzu{ z>QdvTD5p_M3RxC-J@SC+933cow;l6*{( zH!Ista1O}X!+T7`V(*md@37n?yoMuQ@Hlp=e~x8aa9Aa6Lf|g6iBaT{HFhhUr_pa~ zF3gO>akf6G*AQaB$x5CS%SDne&75B1;&1FC#}@V}YI#j`AY!LecNk37)1531qTE&5 z31?+Nft?o0VBzY^-MX|C%Cq0aRc5xliQLx46&0S8RIM5rt?HfdaP%^~c}{zQp98ve z@KWwBZl;1`j@G&5M&(`~VP9_zG9|N@i`8l=LXE39a=oQ#*A#3p%8e$ zjT}|3KL<~amIOpOb3f=PN^C%K0(GBN^B>RRW(#HN^Jde^F(%z781K=pM(>``rY5tQ;t+=V`J0{7<;8TkbGMn0mPwE=nl-q=(+>1@2OWuT3smOaqf z$QC};cgB3Z3mYQ^?TTF1#!7Nx z!FjsN`xjuzI=zrt{?2wTjFy4^hY7l`0MR`|s75rrRB~9TM#2vU--o6{PF42fFOIN3 zZeEBsqmN^Ka3h97E3spaaIE|kQRt`dKnrsJ0=(IVq_A`@@*hxs{U)y0uGH;MiOLwi z-NPsFvVUwr%UoMZ^H#kY2uM_aW?kS+mxp72O-@%X#Y07Z=_nQ$NA?<;s%%o8D79g62 z`UKG!ks91+jYLzsJ)X>IN_~YW(Gj_bNhztY#rx~IOpi>aUKzcdo8EEulH8$OKb~9P zn70}RA47}kXt#WjC(>#;6xT04l@>aQD_bRo2B&B3+wobrqmJtXsVUdJ^#g%#X1vji zLdcf~;=E36%mDNid%)~fmja<%7sC9X!4v)!S*Qpq35bcEgVh7^TvmMc9IJxRrO zl!`sUD$odL5rl|WGC?(8Fmv56f$w?w28ss0h-JW_tD!p;)wPXVbEBUdjV;Q% z84MnTsW~XI>R6NabWrljndl5+(TeP;+!7W$13xH-Z%gsp71sSUAeIq_8@Zf>`9^ii$wpr z%oM(Qr6Zgo9kH+p6So=|@<$0z#(2Co^&j1aNV$!FN!9#7x$~qNi!rc&OR0vKSdqg& zv=BAUETe206q$(bg#TV2S5JXQcw=ik?IIqE5=ZWS3=^f|CdoIl6!anJm2A;bId{)eY8E;&e60d`aHv1VI)0{4;Ooy6>62*d7{pXNe8|B4P} z**}!8;N@6TGss9*U!r`Og(e@nHt|6e-F84*{Y?mGD8*}(B(Nf8$rI3ro&o>-EC%}^ z9a*%n4;>&S4y|=E`yAQT8-9Sh@g>}^v;S;1p@}5fG!kfB=yA%8QV`ulmNetVOgE2V zcaOo^B6FQ;qvQ`;4K@vfTUwICu?gu-B-;@#HrDfD`L4A(-%v@`Lm?pALqbLy|NF9te?l(#raAGyHZge&G+RA zpG?hKvd3g4m(-S(>QPlaSIiPV*^;|~wxd!m&+@lttYA4T`Kv?_q`}jEaEE2A+nzkXn$86DVHsUuQmL1i z^iru$9pWo<8^(&YS-faV4LpXsA%|VVU}s=Au%JSjaCIb#Vg%w*8d!Rz5seQHt`tW1 zYV37fxNu5=6+YQK&vIOtzM)dEN8qpQYwv7Ug{5~v+s6fK?_Xy%tAs>ZijfqR!hwcg zgaeI~l?s1QfLLH0Jv=;2bP%0rW+9;Yi45PGL90%AVIyjRCU5HdKPdFu$+xNmvZ^-Vta~-7`im zk<4GEfs#j?bWn1`LB5TdzI?5!bL#fMzWn$QNBcG7)_gY|wq|Ip9CqiT9%nTOHE1%I zf7UF|u)MGCkDsKBGCWFPQ50>437<^P!HYFMdj3dhg|-fo@LI#X0x>wD2(6Pj&8360 zd?4@Cln3X`V(>WY+BjikYnV!wFMkfrCbTNVZg<*WZoj$44Oc|or_5k@Tv_*dyBgT(6v}cOTVh`*#~(|NPpL`@kA+CtzUyfY~{WR!lO53(H7y!i7D2@dq92qn{Uk7klF;vi)` zrUYCs@1@(Fr98l7W8#c)Ss~FZUzMe1vbsHFJQ&n-jUP+?I;*>c zYAE6$G0ss4OhvaF#byQHUrb4@pISyX*n=x^`IY7CiPd`NBD^4%xIU~!k*HTC#v&U- zf0n~hjMG6d>t8i^+`^r3JVwJu*4LU<)+c>lxiijym}e#F6PnCUVy_o9Su`&={fn|p z3&*suL|z!F(el zM@y!*?`Ybo+e_vkUhR7VsaY9nrbj-I^44)OZ_`^pD^F?QfNiVvqTlma=8i5R+-*+z z2$2%95|>OtPrP@Y)-mh44z56f;AZ`;iUEg|gAHUK%n}8M-JQM z&A?Y+e6O3h7;_QG&!NfGWtVx;*{n-C$49X47<7Fac1cqGUoMRud+ zt5{Ol4{)apd3ui#Yh*c!rm^PLtnDo^U;=fZIB@dX{ zh`5RGKG1}tw=*HsT~LmKtMC{mDgZGx`-1mSD4jy$YOk9?T&+H;tt-7;-VfIh1w^5G zsF^{Brg7QsFJoE6WUiUrWz+B$lu>4l?&sIG$T4`FEXy^r6skw#QhY2*k=>TuXr(NQ zlmQm?0wC3C7MJ`pORtvu74kCXU&9-Vg+9*#9$W!xK{;L``SqnmOzA2uX377l5Ug0b zxI*dxdKZa`ElBF)ij0vNgbUajyOWOXuoN5H8HpvV6bhk5#ST{(tQq{u6@bY7*TIHA zdWYtG@@!|WGDeal*<9bJgHr&4drRG4~6eq zlcRJPK#n4l(*bg5xV@%K-snM_!LOXuQPv$av4gUN%`7PPPUaW{nivMFv$=BHPce!% zw1|Cscc{@ba_D%y{1-T0P0TrQ`&RvUl~aMU9BRlDyvIV!y9YUE)Z}>H2%&;$F-KIe`W^{N?pD@1dI((Cd{k24F3u(*`w3^oj#@|o^Z z-g0*&utV2p<7vjU#EzZZ0UXc9$!l!ys#T^*9y(p zFiQhlR4~juuPD+@Sqz3RBL9gV>k<6}K|?ev=!ld%{4Ac508u`~i^v>$dL+)$UNCNz zna%RC+2{luSElb^vgQV?45!v`<&;*3WhnfaIZ()Zym(TF!B8s%u=-?M2|bOuiQfe`7Cxl{)mGDp;bx9^8v3GETY| z>m>t~`!e|A>!sKE!e(Zoa-`LqqlJ}9zMzGbgmGU8Pp^yY$t0+_D~;Tr`9EA+hVx=s z3R9N1Wh{3l1u}Tb!8+xwZETf($Y6nCv^ME6<~Bo&`G8MRO<1pQB3~B6YQ7;FC>8CS z(ednBH>{FQeLtFiKlS}TWe7XQq%wpg>Puq?1cS4zO=1YgP0V}Gm;wPU(tue=oSWCg z)$SPtP#0UoTPJdon)ujpz^6zg>A01VLxz|hS0BA$^u)@b)dcfL#A&b~*v5*{Su zd^hOg^|*bxhxN2-sTp(Fu)M6UH7_K3VH|GQwG4f~&(Re99)6=g*@w|DOa_V*mYzrM zn;#Q|moiu3$!}XV*LIuo=hbjGH?&gB4A0L}Ob{aF+w2aNMeMy$ORlEjizT%-HeKTm zhDYDarfZq{Uq*@54Pe^urJ?KPA3Snr?0my6VGx~iKfIS{8Zltl1oPY%rtU_5f^2k> zQ?{%kPk#{zB2N(NC$T5OlM50#)2k@x0bMi7%kWC{R*eRtPvdKA^>EH1h6BrN0sOGe zTE%xYiup*DJdl%>i4Sy>QxJrK)beicn>dJX0X`nwQYoK||G25nGypp!4nCe_5 z*H-CA2^n;tiITN4Zm15|jWJ-MW(@dl1!}h4=PmpZ)uY_+>5R3dr!FM4>JE;?vtbb; zH#yB~a4s}kw0%&b-@`U^KLZn)%?rvI)_^n)v|(h7??`A}_tD|2gZa*ek!&!tD9277 z<;XLECMCs_1lO0umoX2q4JE`1d8e4WRZBpmmtB@WBp!k}-k9jDRa#|rEwx-*$iAyI z_B}@{@Uxf`QMZ-O(iE(b_3R!wm^Bo*`Z%6T{(C$OcMfsq38uKD>`9| z&PMfyZCDHE+-Pgk8d9b@xxwihZnI&6$7P-5I)pu|eu^pLKiu5RgWj&F2Y%7nfvoID zqGRM6_HKw-ck(h~9`$itE68R`_ctRE4}d4|=(yxxq9Z$v^AK6dO`wISAFE0urE+e6 zH|k(dcvGv3q-jzvIKyc79Y6xZ31iWOL)?mY3{{v78x08mqulim1DIEgs`5`-QkJ*> z&9SVyu!crGT3m2542O-bVVnF^wIR>N z)LM=CIKt7NO;oA&JRF`&-mTX+$1GuGfqia43Ogf*hdBNFS~)_K;0Bn`P#bAd7T-4V zs3DV`b%3mrSJ0{Io;L76#XmSnD1uYo9=o2{ZaQF8qd?-jpM1dalxL=tJVeThno`#9jO$MFsukWVd6Z-i zLTr;DZuHCZit-1!yOiadXhqZFJ^SKn%&xtS!7QeeJlQswk+evLZYpVpUIh(JRidi>E&5l7pxxvOocq)iu% z`MszqDpPz2XH^Wm5aA&?W0_8=$-L0)9458E8JmuPvpy)x!_{Ua{f&hrkj-` zMeRBLIlMN1e2+0UH+?{5{km)LxbhJ`DBofwQ3uv6AO3)Kn`mcgYq|OSbTL?z?!tTE zJ;W+ZweV#BK2!Q5*JJa+9{zBKQ)X23_(oov(9ViuaRnU+G`g1lq}!#LvY)^|uP13r zu%6=38qkxXk88@vZ(0w&c^5;C96MtbiT%dCanWRd<$DvW=N8Is;_Ae)tvPwlSDPW{ ztM}bFIaYAGcw(>tr`#M3VbQ{#vs0@<;i(?UPW46ZU?rUDecl2m3vl%{C}xbhTzkdS!@PRX(F z-_{Ye`g+mB_(1G&%8@`h6OyV+)!})u*DwJ|dpd#NkPt6ckBjI8wv+X+Qwq&4C<=*Y zTu_Z~Ov$!rpp|S>TEyXL@5EKTfd%U&9pge1NPB$m+enpK33MstUT4pI_BJ7UQP^L} z2;YtIcrMgdfb&J)O!LI00(=czS_oivRNT`-A@FzN0<^C}^`D7*VwBLTT^3>KIwHW& z;g4KlDb|IRBTE|b5L7zRlQY&LJR0c*GF5O5X)VGhVc}!MsMyL|RB=Yu64BhC?kWqY zLiNpLjOPXZ66&gP3kTL3a0>l;QB-QQB!`~+l>Bj9&(@QcrFl+-z$N%fF3%d6NDv?v+S*JNtAjRv$(vLg#rCA?k9Sja@;qskL!2B^qyqVr-slE z^K>M7dk^$z&c;CJ&P*Y2V+OVC9eIjYErwQeSgWyq9#*adD<^|0orSpt^kzu;NB=v@ z8skTDt?C4;E z8Og3xoYCOeB9=rzB$ONV!hTdykxaK_vs=JieiUyrjjSZz0xJ4!hr?H-X}86ic3Y$w zCri7{M%AJlBqv_b#{6ovTC%VF?kp97H_0c4c@we?(7zTgpfSJ%A>Wo`u{=4#0TaD7 zs*e7h9^neoO%}u3yYmtG>PP5I?taV;4yd}2fs zXk8+zKz~a^6|B);!;W#%bUjCrLa`!+2ZOEuhNW#YwdIiQ|7oi`(8vqD8z3kou~xgelZ# zn)o%K_XE5<`{#DzpT#==EJ_AVEX-FHL90%U-Xx9Q*j27?^q=4cq*K4ubjnjdD{SCa zx91SIGM+^sBo03Kq)3}Txn}(cW{R%PLLfA6dBhzWD@p$P%;+wB4cQ0skbD?Pv+&437(@ySVPV)fY?D50Bg95{(ws?2 z-q@aTtj*AW@;!_0&0yTl%8*fbL7}0tJ61)JqS({37aRN`|1nX~1zU@-^t|lUC{*Fe zzS*pIBo;h9${Vl8)o6QG%H$Z>IKj_z$;;Isu|SvZrrY;oZrvE3*)70!ApvZQUnf95 zaK+w?F1>$?QrmJ}f?>YFNjC6O=5I1gV=>eO&pgpB+x)-8Gy9#xeO$dVbstyVD(2%V z&D4?~redlVGE7yQQu10{J=rd9x+p>BxRHnrie5qiy2;1&`leGK*G;c>cU+^L3F=~Z zps+N8>Idxg|Co^%M^~8{W=*KxtijGtHl0JtUC;~G0+_2=1uysji0SzZ(@Bm*)9|Dz zR##^j@5z_UeA}Nf|1a-Jj13fJhg*KYBFavyC|{HRyEYs_uqWT^3v7loB{fVLjJBFi zHaY9?BsR4aEqBQ$|34;n_9O%g;{ryXC*g@isXU`7#aj3;b7~7Wm^I!(>woAKSne`2 znYnE=$8L^j;v%_cm^Q-2z#vTC^HQ#o0eo=$B6<83(sS7SzfIQ4h8~M<))>vaDX|Am zLHEvA$lGCSnY%Eh&wGr_D0U+~1TW3KAnCb`hX)zPMttkY%QQM8_UM>6v>|rINvUY0BUfY4TZuz5Kh)k=?ngRJhoj=S~5!{*%Vs%}jWge~GU8 z73=@rY&I#^-Q1npcLS;j7y7OhgZC6+xo62EZ=`}a-h1_gR{q15WL4}glj2@U*lnvM zujj(lz0Ud`L>{Er#rmOcNI*+de}iu5XvCz&hOAu4<&?3zpvUSCmSH3h>cP_sJG9Kw zM)Or{1qFN_p#&uVa#6zML;@~KEv;akkUzp$zr3)6kF}lwRMGH=`86($TdWMQodW%qr*K4X9G7#rc*eNAJ^Y&v=@0c!YI!}#t ziwl(ZJd_`nhn=CTclzT$2!DxGH+WBTqL6NqsGgR|)Ve5Eh~CJC58GAoc_cS;9V+Tu zTyosG!VI^jGWjE(Tl;Gk2B3WYY)U|x6-%MFvfRJABf&zgZ0tm0W(jBy5iaQSLD zLOixddF4;35e2T3XX=4#vv>dn4YFK4AP#5ptO6iKP|{BwQK^@8N4KK|l!7dw`m)U5 zDD4iH&4jG~CU0i-^%)d7E6w;a5U#S62_MhwV~ypM37^cIY<2oO&huT)V7V?h3Nv$A z?tnY-rj^$_Lw9HTTNeqB{)=(eED+iU;&m)H#WJ00tvCZK+PDh}N*aXF8|)do$vf1E z{vwlU{$+&dl-H^2P}Z$<$upf+cEi8}@Xvf-(gUt#GtJi6L!okW$p#^GH-XW2N1{EK zM8e;2-%6$I9%pqf*{7mpv*ZiY_a*G#~U4h=9T`=)0!pJbuOthE?vuVZI zC~v&UdWY-XB=~z0))iJ9^IF{eBr@X(S#o5_Zt`}Od?`F$hayjZGjlQ>!)AA3vy@K8 zq9Hq02zY|8S=9?yKXk>@vzsYV#%{P9aghSy73ZN&B9!fN39hCnwu#NPVsn_6MF^lz zfiwkp1M9q*R-n(pIdna|?~?bj4TAky--GQ>qlxzCJe=bdi>Zl!;_}yK$~z*va-9Bs ze{kl)%U>>vxW*I|2#-I?7hScQ7A;(|7ZxZJHgQRN1*ZKCjD!)z?tn2zj`Uno7ygE? ziZba5CP(f^>_yU|M{Bz{8kI!8B#aHm{4^^+JdeT{HspFD&M7^1BZy~j->QLW(Ufwk zW}bas!`?GMd#P4o7UidWBzY|}W=b697}Bf`Y6Mv|3S75fZ2fg_=egV)3z} zyQ{nILwDU>_ouu117%lCTId4>p(uhV0t(D97D};i=={$)_fB3d>hJI8gH0wgckVs+ z+;h)4_nhz1*OW?9N57?`u|&t=ul=D9{T-Jq9ZG=lz^~R7j9+c@j96F1iy*Z4 zz36Gs4eBm8YYhjE*uVw=JGhjSp4)(9J3qL&@VK>&-a zxF~!owPF{tyZVqWUB-t`WmN3K^{7tM*WS8aE@G~hozwPM#=ez_%uUrvp?d=RZxTv8Pu^Go=O?Gy@YwZ=~nP~quCd~J}2I442# z7#IQ5L*$4p8`%=cmUDuXpQ7Fg>!WNMKOp_&=C%kj9;}vYOwnuw5%k7Bpz-eC*r~@- zQQh*$V%frL`z8P{jAkffu_wpCmJ|7Um`v;8F$`s>nUlD=^{V6)T?%&$AfzE$3MUL~ zDVS*~j9O-*%wqUwjmx7p5M>E98P>tuRXQXWu7g_qE%>;}(O!pbc<*skoWKuw_E>ef z-P5jls=$P7yFP8L&pb`owD>BEIskZX@iI%rd0GV7TU^xs3F(yVp3C?=!y}!BucZ>G zC;iyxGicsxwMF)J-@hYbDK69uxtSmC$mf5h%eQ+Z0+>jUKclfMM7;3nC2KHpLB8*% z-n6}-){xXc7R5=ZoND}GwE>e$Fm8ix$l05{nVPDvtOLa z1MwH<^@IE!KHp`Is^v*~qW*j7?X9PDRFH&u`#Hn^ z=wsh7OzG5mP2moN9(b+TXebtgo7YjA%uCObS!^yszyXt$l89Nj)|}6~wOea=#ThX; z(dE8VH2d!INn%MCBcJCwBCMy};_tlNH>zqz65MsgWVkE5dN5|@woCgM zmC(Bx2t784Df}QQ`lAlPL4^n$TCDhPKN)l_B4$V20up5=NTBJkiOkHc40&x>nJXVt zU6f~A@3gR5+RRO>=p9fpf9?eKT@Tbcu(K7>yxD?s@PHK+sN`)}ZT*V0Sj``=trSk!96hfU7( zdTocl%edm58e6D_C{)wiIH+}6`&~{Ne?$zV;{X#%m^a=djpM?ZN$WiR_Ig-i>1 z=1dGE>BB%0&F$fK=)5@@tR_JON*vSAxhuY!Aj-q_6y~UU!c!~BE&mxfqdrx*)*c46} zmxU>SFf<0bFUeh=h?&cc`^1gRBHL0JIvhh$9h?ZEub>{`?@n5g(c%!s)U}}NP95#< z1~Q_ERfmb_S!ky+^atee?@;-uG}eJD`YKP9fojHG$x-;OepDww!GO{TQSMqEC5r2c zHqASb&g_$YBi=`zvo)%d(Fa*ep+3wpyDzm%Q?CM08Voo%XH|j)q<;Fzn_Hv!bdnp~KPRAh} zlt^CnKCFTkN8CKPqEq)Wl3-s`G0`*fC;uYqnt6=E=swAdzL%t=m~sGPh`tF!dW;Pz z2CpB76idC|+#eGe;ru;NZ%br)s=aJ_Yz;U;-&%odpAQ?cauy@&%m3=uJzKG4RaT$| zaPN#CXUbQSewZnr{l75fuiuVk$~l~3$-Z3FD`Pn51yfgF%)r<2B=I! z+NQe`QJh?e;GeJGbp@JymvF?JWUqx){LrY{ zBj`0H=v@_vk8@juF*OR-EE7x4l8F9Vs+MXv+dO++^<4k^Tk-y-sH;=gL4Y_bu1xrr-#>+ zc=|VbO$jg;f0@rxq?4(j1nnPKl@!&Lc<~Xtu1&bE$Mke+Qkb^#K!a~2maeN35BfX5 zT!Ab0?nOGt<;LH3vO0Yi*!hl5r=ZPl88u7{JWBdy4G@*w+x|lsXhgf=FBP#2>|%Yu zpi6l3akN8lw5dJ;M++CBSs0T#7`pJx0zTlEf6WIREt(Ng_<6!ff<+~wUN3q2FqNcT zFmvnI##%{eG6$NcA$K>2xsIrUuu$~!LL6Y_#p zbYU=-^L5*se05Ay4!~uQAAR{?xc4)Trul@x@`Gm2TwIt-T)h!kYJ1nHB`TPK3d3}d zji{4@s8G3vQGunLdvX0W2^(fHKP6HEB?eF-_r{>-I&+}GJMYF|=5;JjSg!77F0Lso zbsngTPTv6|5Ys7(5S%8YEW~e5^^3)GLX{(cCvU>~7TTl7$*Sf0;JE8Bhs0tKp8ArO zJM>o9x$YM-ADxQ5~HV2|cAL@eg`%qo=@J1pu0+*X|t_gmq*#YT%dlboWfZ;_NZ zf2f80p%ur_Ggq-Q>J7yfrwvlGD$b)zaoGr*Ml;yAD_7F|&T;$eEJgP7LO?;!-)QMn zoa4_d-^A`48{4wFh5c3rzp3MauV24gUs~6`#GDRh4q*Eu+#w_)tlxKiB1pJL+K#o( zdV#ef1|hd|i^X2~XG^5S$sj_qVd-WO8Zko?royX=y!bpi4XBG3_3(g!-x}C-7vj|| zyU%GwRjZAjNsF!dt1t6R0(MoP9Q1@e`Z9^$EtBg*;^`&Uq~2 z)b_=r3w>87MjWCBIi7iqMJ~$b^1ru{NP88%WWOs+;N&c4pSp%cet5{a7&ng3TqJ$3 zTuferKFtG7p4N_Q(mNprG5bP$|2-AB_bYVX4;CtL%x}Vo`(JI|;p_K4x#4a!8S6n! zxePry(vFIwd{f*Ji#~0c$7vImeG^b zc_Zp5boy9?&CS^HNq^8mtm7dZe`o}Mf}IV^w5Ed=q$b$LgCmvC0@*}9nvm!85dS1h~{*I(o3)P3*n5|^M zBU)UICdUV;MPs3Eu$E`V5;+@4d@&xxrCHR0kyg}kcqVs)1xU@(fi6(#xJ3@EN$?k# zeVLKc4}%cE6re)$F5k5d>9pvtF*C4s;E4`TFxi1& zUP+pf2Nl)q>ehfql=hEboJjlg$n}5xA=-PskD}Mbew^Ne%lo3Y%y=-C z-mgxMtE?`sA9PMH?chsia^|2~z|YS=YUt50ne_*ul7G9pQwysjNb_Xgp84u+lT>xaa9s7N}lE_#o(cZ11Zv+QQ+fJ4~4YL-RnsW@)vAP?GpgTZ%I#R*g* zDm40bS=Hl4d)?|GQV-nhU15P+&(W=Li??5?qs}?Ya$b|Z*6O5gd)=yk0H*-g5X}?g zNaD}vT+*&0R2@DBlEk0W$>%NSw21jERQ8ap)p2t%ms2_o_U>z~ky;?ERDf?j6|BGn zz`mymk+jb~&LOHr9`w&P#KFCy;C4JtRnnBTMh2e0#s#9mk)u#`qEU-Xu0WgjF&Km+ z?-Z&ZlVNwsB=52RT$1oK28g<(kD<$8ZWd)BXXg{RgWTQB)L5)%Nos69y8JLjC(9)r zS-HAYnAbqCr2er8$uzG4eFVGk%JRD~Z45>{S)GR`J_g1NN zCzfwAB)sT>Z{}xyOZ*YhCPN@3W*t+i^)qO_dZ#FpD}b1FmwayqN79;7$cef^GW1b za0t#YTpowu(yONO0I6i})f6uk!)4=On80I2(kJraQ&?uK6X98DjFjA_Tmmn0j)j(y zqs9fOrbU)_C>DUvaM?cwjxWzZ>Es*>3 zID%t!z?*E2_OBh^^R99FEG*Hc*BSs7b7*M%Is!{gV|yb|WV{H7Gps zM_4zpFmumQa4pMncoptf*5cWc_>10!?Di(|+Y+8bIM)jM1V^hMf$TIg#$`5i9caz( z#UQ`876r4Z5(A}EV3bH~dcbk2McGg!9VU=3MRq->KaY|Tqu-ccOR9BLXy1}_>cn`W zc9G#Q9OoGlC*gTHZ8*wDFHe$iVZ0hgv|fkRmUWDMA@B|vUtl-0ep9~07nnFp#?{_v zYC7)eHuUKUrhQ0Sq1A^Uk3&jr0+h6XE2HXD5 zz```LqE7&-V-jg70b3=?63STZ9ismkso?nod$b_bUiXsP^3 zep27ABRU*-h|DK^dKm72X5Pg7B(@53rAB2JKN^5p%mtB(jaqyQ5Nd>IjZdk|FerVA zN6Mq1^dO~rJZfPJQhF3Rl3^wMZ-t77(XsMp60_Vs)Mw3|Q>QG#_jb0^BGy&)C4~4c zPg6VD%WzFE;ee57Fq-&+V@Xz6s%`RjoslR}Du_u+a;Asy8FYMei?Yl}ChQV&?#v>WV8~p%Xm!iHgn2Jyu2_HFDczNZbl!4I$G*zv#NLQxii&eRf5n+&{s?p62i_FF;@|VOI+^;^>+M3>J6mf zA%qB0FL*)fm8g%$k!%!^jJFpP9gOW>PPbdq~jz=SnA~mlRHZ8NL|G(iYSr` zbwzT19mBh$#SWiQ1EwS8^P2AlSD?u|B!XBhAG0vsVtcZoH=HpB9&kA0t^Q7p>6?Q8 z9-7uy*zSlYW0eeU4hw|D9gaC+MJ*O8HPZ!8$SMi2jvXGcl>v&{ua0&`YeJ>^(ipVi zh)BQSmL*3y9wFt92fji6WEju9kfIpmSa`9=FYIjw!v#PD`8gSqW#b}VQZ5@CLSpuH zBJ{|jAFZtASwuKm5frVcZh-_50)tFELkZyskt<^12+`MaE#<|0u8bk|owTWi1g9sD zS&K^(2Mu$+2-dMJ?suTlj3Y>;Pj#G01iXEZsYReCHljfW6I6^EElU-42VHn_4YLtG zoFh~|ZPZmrpvWr%<$n;I8o|5$mtzjHJP{|DC8^JJV}j!%gHZV){q!aa(gaZnO6{B0 z{iH`7#_k;EtSR&PKl*gLSh--)k-SB%ThK=hv8w(b8T?a7St#1_x0EY3z;K8u- zj&_U+5=c2?bMRPMv;AM(r;WdkakRZkOrJd)ibJ!)nI;WpU(s15ct z)p0rEM*Eq}u$iks(qIY}dm*MU@e_`jCNVPgm>)E-s+;u9Vk&0?H-i0tQ+!z1-iIUUOtB^?@y8ddY>=c-RJI!c9%vbJTZyd zPwcnw%&2n=HdnqKo>2xPE+a8A?5l;!{oSlu-7f?@%Z>H`KE4+Hh{Z?gQ1^5fY#8+; zd#3{JWXBAN`+cGOVn=seokpL@c2J!K`wyn=xq~+YUlqmf{ljpZEImMa(aay*(KeLe zw!WnoNM4~3SdpY355@YfKcti1$4$Uq!=%={^TLK3jrxLoKihz(-sI_rm)x9X3;DZ} zg}@HtSF(c5RQav~Ys3^%^y3}Z>xzim2bBF2McC|=CR?e5QJ<+zczdIK^p~+&O%E7( zG9lIzMPzE+?t>XtdCvN7T747Y2Es1F8Npbdx2UD#E?BH4cG#4&-Dz)f3e%dX15#sM?zw|L3#+_Qdl0#Ew}Z;HKSOCc#U^PF_a}71;=<7e8d$jt zIsnBYX)`p*99tv}Yf2mLMz>Fk@+i5|R-tz!HCghO zyMCmY_HXXe6NC)&NR3ep`U@j;yHujsz+d&5_Y>Cx;fdcSxZ2k90upjQyhvFE-vW)n z$yTRyylj}TNwg@Z&ttaYaksP$E)&-%U&AF~GyJv}eR6*vk!U%%*g^Btt=-WBH#%u| zOJ6Bg+Q+;I?6Jb+lvM&oa!%iVCX`M!GGAOrpT=ZT2&XhwQU~zH$GUe-;wE!R+$N2 zm*lz|23?9Yz zcvuihJDG4tfkVIkvWtW6le_kU2U)M(iM+)R^ka<07N;Ck;zHpC0vSf>C|_TSr}lMI{*0Nb8$*R=SqLEX z1I*ztXVpVkeY$*zqsj%0F&(CB7{*nkS{%}LItz13C*;PjI?%A%r%uNJi|H1$C%lJ1 zM~clx^nsbNy$9yl^RNX&HRzWvI;?&te59Yl_%TmURNurl3%~3jfek$_BzD3&tA(fr z98 zeZmF|H-%PgP0rw|H=P(>k`E^2M0@?}RS0!#@D6tXV`5<8&&jXEg9r0Vozg0YMfEv2 z+s=&p)wyn!(W1_0p@nxkrOvq6!d#wfeS)R^eiDr?q-LiLQt_n}UpR^jz#e(%P3#;R zwJuTHj`g?$h^C;9fnVc-4725?*<|p}kAH>wPK1iXgr`sOqBkhP&_;++K?cV7BirOh zZ`0-E{@J8~sMCMabN1VQIA1b8r??n_6Pgnvpx?M8Q9p1=yFBQ4NK_6UYwqT7sI;_3 za~NkcEhySWF{!1%)uy5TnjgvJ%Q8eF9LL2)IHnomA{=w^P$wHx4)D-g{zWm6qNJ7p z4y*cC{N9KOt0h$KxRKYiz-rxsOIyOf6@NY z(onR1X&i0~ugH2zPFuh^ZR<#Etr1$|+1Tw{ufr>$nMAHgl~#*<`(Mu?t+wRS$s(iG zP`c}cJT}Y74_kq#CiW<6r;L4((`FHf9YTY~#OK#b4ZvKPoHao)_D!Or&Xc`rsB5y@ z!~z$IlD*P<>v0$V_GdH2_ z!0O1Nu}<{YSzNY*F3eS&CTuc|P*XsBn&!I#jdWqya5ZI`uzA>my#2m@Zmq^+Kj3S$ zg?@>NcQ;3KT`*GCjk2;^u3LCc`+(y3!LCJ!K5t>H7X%#=?>}lF^kuAT_})_83$kn& zP}gkI!;!DLzmv72-ezl35$fJMhntxL_C^qtyi-9+ps%BD>wU;zjq;-ZAzA$+=1$uD zP7T8e1SwKbRmY^f-P)!pWm*DmXO=_yoc1?7RRUvgI+&F?UwH?Ejx_2{6R@j=BI|`s zg`m&4r1RSdj{*nTkEi4-J)~THM?b4cFtLt15~8tyVjuNNV?vc>4WbZD@RjK(M30Ds;G4`U z&wGOR8l1t0GEp7K;IU;G-e=z~_%YZedK}4PV^7G#@4yA-v1SC*rJ_uRDL4hUJmD$C zKczs_cKP3EwY+FxscsW+iOv0}Q)72WivPx^hgf_MV@Y8;Yl^2Ew^rj~XLyX!arv8@ zpkRG&niG8xL32C*)sdCe{LXN*~3MFdL6HPoj+^ z)sd!+sg;2Sbdvv!ilXCKPwt@Uxk*p^$7Dh@X@Y|PeA22brIYTe6G4lHmi~ICpo8aA%D=xR1-X*OUr3!y9hFYTgGZ>qXls1ZE;jr^2QEstO&s?2)Ec zhQXdP7(T(38p2?&IV&6|*tY`=`^_FE4EB$ZR1AatK%B&;v^sPeq;HF3vTWb=ppCKu zv$1tQS)jr+T)hWbLk2_h8a>RoS@Q_a!#q{*u=-CqXOPjrIwDnz;gb_9jv{nMMOP2- z+zPv}v6|(w84QO%6z%mG`m0|stQB*@h30*}{*l*A71P6*i59M@==!+{8W;oO^Iuox z?qQ**dyk6Yo~f9jwMRh&D&sD({R=Ut1s|!d!DvH5PpTJQLJ<3~cfh)O&_LEqZo}wA zQ#f8u4#FV>L&J6v{YHJ^W{7AO)dYu{Sff)`mW(dbI!+#hv>`dTttYnC`uqf5TS{o|b>e;nR@!ETreYJSjbKkoz7lpUrqMRXaiB4%X z%}*-*9(u9^5o50`o=*w({h97P6iYl4kY|)pOBVUa`rFQLyM9 z{9L|wzy%Wh<2!L12E`wezo^5M$6zw%JqsU%{LP?yy@#s0tqt}DS1q&k1?RpCq&l|u zPdEW9Bfg41{#s&;RIf!0xCZ%+&$@MdTwgy{kaIBQ$#09pVvnK z&9?||4}?f96kPStuprh;R7IClkrEF?6Axw+9{<@htv{iD<36R zJ*GLTmTIDZ)yKI8?{TS1{h9tE!&(K`6p*+Q17tlV)iZ*tw&jaC=fwa6Gka{MyQ)~* z$^wErl2(nAK6lwdGsb$i6}Y7{MaDB8X_pv2RZx_3W~StUi(1HIuk#%egR5Zn+dmhL zU^Br-Ft=z+b_g>Y9saJQRhNlCGl#Z=bqkotD@!fvI9P4R4J;zhg89jpQbi7T)s05B zquX~aGmGh`6vSG3u&V&9Kez#UEPPNa`kSX#i5+>LfRcGFh-`ez9scSbPY@WfZNIxN zj5GoZb?=cPsoK4_%iX@m7AgwV3mZXqZgHnqd!&78lC}d6)6@JNCSP`-v3!`cn^eqI z+j0%Qi!hN9VMR}?CegpkC~P^NEc*8)0|k=xeJC4Oti4uvAzWn={GpGh&}yqfb;y%* z2;~1nF}+#D?X#9f>E5bux9*%aSWCFrDJP3Cgs*V~Gp$uKnC{+XTr-*@g1V(IMM-4> z2+={aW}p?`0fI%8zVb-lkaZY$D8LyLZ9~-!H(vxQO5EWxN>bk#0;9uPl4bD+%hAPw z}d1jD$B{u+5hRTb?EjkmT6n0DXo@8e`$hxqYvj@h+K88CBK-`G-X5S&VeYfyp zwZCI@q42v}RO&9ODmF^<%y4g=rN&)VXyH;F1T;HfRN8{w2_`FO7PKAk-9w_X8~H`S zGT4%eaZk!BlD;pJ&VwLWbwyEdAqJ7>QY|R6qs?heu^{jYUyE{bYqzG}5dq@3=9z8+ z67`7Ec4v?<^}c4dHOFz4K7JsnSoV9nVqjcpZ^1kf`OLHMcx)W8Q|eUvaa@E3+H|8{ z5zH2hL-f!Us_#?d;Bi62#4ung{y4WNnClKMfl(G`q4(q^U$m~2_g-l`)qQ7C(^43t z>a6c#{hDovr*KNHFJSJ0(ZKw|ru`0D;VMRt?D$!(N$)B4v@gdy`+Hnr0t3B6GX5-jJxuxyE?T9VWHQ9px1Fk zbxD}51pT!`ad@)b&wT&Cay}KTP{#6g^ULMe`kaJ+=Xug>gC!-U$UB1>ERppDM z?RwflmlT%smLXZ|n7iT8Ymls3SsswpDQxPXObT^4^l;gbm;{G{dAvFF{%b6wC*q-* zgzzSprAvd;aS0gtWyyt=AXw~*)-L5i?551nLjjK+b=Ba|~TX=Mft&OQ1R~ow`b+vymsWfzbLQ-i~ zOcHN)Oj7BLB%?w36mE(WS3Po=URGJ2*qs8gjznBS~WNjQL`4+QOg>WN5QkH6uf`f8jfWUMd>g%&RDb zDXy{-)*aP)onJ@NR1QpoN79=-k{XFUG$$Nr!iw~!`@1@PmuSiASUk;4(@!%y_-W>G znAH8>@=2XLr|-2{TttWwR1N75238FzUkGeO{UG>ozN0P`2T>Gg5-Krx2#h{VA1mY$ zC#Z)$@hV)0ElsH0MjuSxv2M@}T^Ngi6`@f{BzOUNWDZPoor_i4s&g4k29`A`RNh8` z1LurFfEiF%76sRsi9}ex0`um8e(yAKJ6@vHA-Ka|o^SBxAR-3RscS@U zIw@9)g|A}FdVjMg_*e(0OP!;c-dX49NahsvxkyLBfFOr7K+TOGJ9c9AtVs2zRF-&! z9wE>Nsa|dRHsxK6#Hzy^462MaL#r|o-RWffXZ7KsPR2@sS#DlS$=?(s_G@)`LGcA3y&e#gIn;xPr>70Oq{AbY|ss*=<4H1Ux(y7 zrjntwU_i7`)==OK1%bMCyAypg2gICkps`TcSStn^;15iEyKkC1IGvq6;+DhD9?5_p z08tLlsV!p}~qOq5<%^?dnhl=W*-5~N)#J#eu5#<}2%Ll*aA# z0zR2Z`L?fpL%OF>ITv%!%1lOIx)_{qrm~&TB?PHbs(J`ZOuks@(3Ei)FPi* zYMv&bdc>j1f3}ICD~Z8n77%AyoMlm^{J^V2ZaMKdxg*tQvmNZC{;5R>EH%dHh_Nax z#ff9-zRUd`X}+0m|GB9vsvT`#;_}`54N_@uhqzY_G>L+1zdGs%ql~Vaf}v%Ot;Ag` zfe5gNgb$~>?b`(ZgBb4(*78($xCuLtN=D|LOohMPDJ?RA+Ml%4?UYVxJHS8-dOw2A z(pzs9wXkU4;X9?~vuOWIvDwJ$g=a3(SmY7!!rPO9HQRyOFq1*=Ub8-u<7kcV1x7hV zBf-ql-Q=;AYB56MyE~W!`k~R?JQ;(mR#{=TVNu_PZZ&qU4yvYBY*sK1#a&m6lMe=- zvJ$8K)2_G;w@BJXZfN;aeb?2o3uEd+;zCj%qCyCPChxEaHryZ`8}9OV&`b`5%I;*y zZ`e8Up6=Krg$s@0xk>RwDiqjJi=^W)%Y7Bs_`#;8PaPtsf zwZm?FH445VTA@F2bi;kC-w zJ%ks*u#kQIOZ_WTFZQK+f_LXrNEFt0VeCi67ht3wtib(%LH?Sy`)w9HlpBs4q_EkQ zYL|VZu#PGnQfCL30BM1w$zaKpWLo9lwS&MYLRtD>BCA2DoQi9>Ns=SAu-roVwm_3d za32$;an^9tF#oX*WN@W(k31DANCdAr8j&geCn+5$3yM$n{>g^t~vZ7dB5%1y-p& z)TV*$wAidhAjb0bP0)Kc1|fq;&-X|REhG*VaqkIHnh$%zl5DBWDi!C7Rj?VNb}dbV zxwME97BiWig@usvT?k?3NnUO#lDt@4y^VH&_|iBq^DiFl&>UM?Vj=>rv@iWUhSfeo zP!`Y-J<4Ra=RO5~5LSk@5ftISL885YQJhVR6AeJ#w9-)nh zj+cpfsPuM`bXYzSib^odW%%9@lk>_QC3GTC#1f_rvvs^aUTp9c1FujYxt$!*$Q4Cl z@@=&m-ooqA%db*_ z_mNsnuh+6t^m{_=5aCI57xso3qt#A$cd!k$T+LHd`apnKqr>OyygIhhdqQc;HB<`u z?^jc?;6CMsuUtCQr_A^X{k!R>^l$vtJPJ$7iY;jmT~#`80fo*cs6n{|3$Y!g`lnQ8 zI$o2`jytri{U_fZ5O$UhZPiCH7GVrVpW{B0!{W5t<-i{!g&2Kax|7-P(=as&Wfq96 zs=-^^yBInI2!x~LHtc-BSnRl|Shln>QH>g5tdpSEX{!+U3Ry2*PB?C5BC?$yX1z+o z+0M?hKui|SME*U6B1fcNwl5tX9D@Gf0q74N#DYLh!jg~=UWLwM8M7MCgH<_|^50T@ zY0^pMd=HCXVK1r{B}E?n4;B!Su4x=j(GHuG@M2g$!p$~__T9oO)s=fF9qs)ytq5zt z^yN)15dD}&M5Peil8d1{$QQMs9aUx~ua`mCET;Oysx4IN@9Zx;AHu*Lvh8bd2F9QO zwAcH9nWpEXup1h*;0mjzBjP|Ktg!0v$zlGZ9W}+$E_uisd`4{y7#y3(=1rjdgC-ii zf><)mgeYh^RGNM;KKRvNBM*Yc2#-=>`kLUNzF!t$#xWnaK-V5U z*UBB7^Pq1ktI)Db-uM@OcRV_o5D2kB>&MNyFUehU15L#cjK%oAOLN<2<$DJqNX+?G zP5nK5xYX39sT)18gSze8R|wDpAkL-kk~H|bdOpT`9@l%~x*mG+q&v6*1FDnw8PxTk z>2{-5Oxxvk=nN}KL$_95b$Nfx?lj`T?rWzpaq`L{={^f+CDN4?rU+g74`Ev%NUS{j zG&8G%2f+@zBr&RPKGoLxv=@joxmthWmRgBJWZziQ385z=an8KA!x%<&aNP{H0amw$ zp@1C;0PLh8HNqz8@6ddO4$gbmxKYS(Xku?3CL2PBPV0wVq&;cR(_zgez?a@L7?X2a zy_|*)ocOJ8l!$lo^c&d&Knsw^32!>cO3NG@s#%pGsS#= zd3YpVk}BG3%F{6}`7Esde~>c1cBR?i`;AzVMEk60JRsV`Ya}sP&ViqkmtsK$`7bK8 zat^nbH`PR)0OOPsyy@9=GB`?IwQl2)21GjS6pT41k-O!O z5g?E@wE*;tKtp*tlb6Z9Id14Y8gLFG%N_9etoGJuYWB~kL`@Y+1<=1WZxz{iL3&>eBwx}rrbd(+EThn zpFSdnl@VUt{eN*JX2kEoh!xTss`|f<&@T3!-V!%f9wwCQz`hRV_WB#vp0giw2u0tC zB`{BQ9tre^Q>d#nD!8m4&w{~WJ#vS3OFn{QnN`?;Qf8mRk|J*V^n8lw^a!p_Aw^^{#H_V(Q!HOnWuktm7 z1XX5^OE7-hh(lWB?@U@X5sXC#SXRMBAlK)^%2Hq^vQfkq`@55cz&;~Od|JqYQbgq2 z;nB~$S*LX&DYUdzQATRSQaZsZ(?-kJcgp*&?_|eed!!vz4l294NMuRR1gpj$k>|dM z_ie|_#t&JXRYxjf0<0y2d?Z%0u44JO^vp>QLt_fd|N0Yym`>qIdGp2K3v?f-<_KRj zJaRqqLNL8{xIy=@J8+HYZ^4_E2$jE1Vy}8T=2e|;X+MVR&pV^(ouu^300JmsN8ptd zTUb(!@g2K`jbVIS8R>!&54jSYyRl+H6-)DWOCX0u%wZu^GJ@`5e)(5yvCadu-WD;E zV44&G2*jh93Fz9$q6Xv%xt)X(c95X0@ccDbX*ROGu8@QHUH2yCm{wvzXdS1>c2F5k z$W*t%Yr|@`2=6L02pbk9v2dGWJc>X!L3)_j1+R%>y3;xzm3Kn%mfqw^+-ydx5wiRJ zKgJY$zJ~3@Ybl{Wu*blX^ck7|OE>};*)OqNd_6xO|Eptg5C(o3bH|YrOEES65A=a2 z?!RqFNZjYtEkPfP#J>zwO8z0e+17_$fMz5jUC++${wHpgaM13i@_i`QL^J}zy$$G+HFMnn?=J9}7acL7b9lEzNnl4unQf%gqM zockhW5vGJ!UHw8A9)-b+Kw=KK2BGEXl$;!uHL1t?iIt|WD~~qeqQt{Za10^*7Ho@jHij@v9V0G5|b+W z;QqHemJCE2gk8;7u0k#PqHhhoVQL(G)TNbn;(<1Z*IYM0)nQA@Jwb~Fu(=fzF6X+z zp2DKC@UjkfFoRcuF>tpIs16jwpWw4o$g4^|yQl6W=gajlqb#_($@fm8*EgYRfHTHp zTJTeS-3zR7RZ!lP&w+R)J1`S<_}OAFpnh{h@K$k;ErJG*IOtUEiw#M{>k z-I{`PK>2BpZ5Kh5(6ZTkit0YQq5Z#{YGt(@s}IKP-)krKt+9YD_dK~Mn&T}wSMZVE zNJ3N=Nj~)(QYd+N#WZNmDh3)JOYs<$vdNC%4TYf6ExRHT5+u+59Xj6=JteyoFMQm> zf@Ip1d*KWG-NKLuk+0r4lE_yeta^dqQp^uf<@*GxY{#sf51NQ7ML>*an>bb8{Gv6A ze*3^x+`dgLAt3}Xh|ZIKxHkx`16aSX51a)=ACwz^9W}47Kz9@KJ+X5+crZ6ognir9 z%=wpsaN%n?Kr}J;Ty!FykPXy%--8}ZEjT}Q6x`r3HkJL-L2}Q&ec5c6u-RixWezoy zl^-v(>)MTc@VKVSci(l9q{C-P+mChbKdvz_Otl=yb7OZ5d1`<>$`O={$Yt%ip`@S) zu%H>3C5P6~I=eL1Ryhn4?2@33Zsjj@RG_sBPYgzXe_S?`@QhK@(P#+`ct8%k4v!k- z&0q6HlpQ;*7n4f`bR#X9pYGCv`eHv{P_NkH7St_sim?gc#IsIe^YT2x^|nULXxLaSHLw#3P%&yi#W)Z?nyd~D7F#23s2XxZeZk#OIfv9|XxLWhbL_~e z$EQzHk4Iw{d5^#TocH*T`B6_44?n^#28**JuL{$vcJNo}i*XIbHmN(}v{~8^(8_8} zjM>M12$j`-dX%P`MsaSoMzX+`;DL_b=@NqeEsI?v3vnF(voRWs=DV4pQ34A+#`24$ z({d^elm#}kcndsLs=E4}u2vpg_U|i!Q?e+J`09iE^sBF2sW%+A8IqD3s7xXk14#FZ zZR_Iq!q|7LtkYYo1(GW7;=b!DWJi8H-n2`0u~NDbai9Go18|KBetH9&&V|U^9c%CImMm3 zi&)(l23-xxjN>J`>ruAmT6=o0xg$LcyoL|ux0k^vnVxeSXhn#ggbTY^WKJG0!rC}7 zhKUZPkP3ObQD4m!?RDi=))~E2_oB!Rc2u99`6uES<(9haU;99Jo0jcPc3AKz%UBm& z4qukQm!tA`2SMN?iYcZGZ1@9B1c8r(>e3N8;zRxgGubV;KXHNK#t&aOMi`1VdGd|? zcn|Y2Nk?%RJ2-ANDEruwTW<-PsgFItSwcFhZZUHW!gVJ}HkU)IV|tIhOL%G#O0liX zLB#~B@WeCcdsF%G^ARd5zvfzGmQsqc?cf)NNDT)k=C5LQvRgVQpBhenI$p;iqz;5> zXIrR4Iv^`x7{pd*5T)HD@zEbN1!YB*2u#;`(TaSSyIH_h?j>TCX>HIOHnG^cmWyH! z_{E$stG20{$VZ-DpO7-w$Jt)CzgzQ-bxUorqUlnm?U9XroR|+|!p!Y_yPdL^X~gIW zJvX-R-8NeY+=6Sluf#N0aAs5wapGAjf_6}gpzI-tw?!WI9P_5ECnI|xB)MkZ0%9Hr1`%F;D>g0u8iC5C z%ncOURqs0k)&>9FE=F$LuGf`zf*JXSGT0G%ln z%0tSL^Xxn{OZgm+q3xf6xb%Kzh)-dBgM1(#c{nUvYy1-8pqS_slKT(W^n++&-4H@_ ztaVb9zVsz}Jo7!lhhYD>-OPhjq%Y(feoJvU15lY`S=mRqyN?wRz{jl=qL7=kY80py z77^>Sz+8!OGM&K2rI31Y#2qM-c*o1=5-A|V9X2DY|3r_YYPn`>@M}p93f6Q9u3C)F z6r6{gC=#6Z8sBiBiq&7AgfYtj3^_%d35`(h|HgS%9B>ek|i$TE-MP5$BfSmi{R;W0z!hYRR`* zo%Y)pz;}TVuwdxV7i8jK03rq^#Xc@PGrmU;L8KxGLu{MbZboLIEbcKF68ty2!E$ndZYBhtA$Es-9jNK3 zaXj8R zimEpHgLlG(3s{B(cG?hPWaX|HFw!l2g6OogBV%b6%*Bg!(HxGOvpZQ(7AhrUomh^m zDG+iBvt%*~op!}3Oj8h6=PD8rrIU(Mv8?y%0@P&421F-Fvpactfn)D6cgbh+FZC{~ zj|D>IJ_N{f_&+mXv=!W4m603C(8LYn(J8zGJfM)y(P862aT^KMjG>4a>-gO;n?H=3 z?;#X^h!WT2+n5+{=m0(7dED-2>`YLQ7s2ermxaZc4!=@@pnkMJ@AmfGu8X_*xRg@z(I#F^J`>$&~?Xnq`S>- z#PpwL5v3WJ#-9nF;g^*#y$kZ;FKBM3gOsHEkvwHE%CY@a8L$I(vnhS}2lGg59cTF_ zd+}UE%|Kn^3q?Q=@pB&~P8{3E5{;XM6r-WTlkv3)irQI+@QC58u!hc&=3?cH&tOF+ zdxufL2CB(#KTB%aMSKZeovcG(qt13krp84Uvf5DiP1=s-rJkru;+rRz_JV&5osbUR z^>3W?fhwg;?mZ4VFmS@8`w@91GYlV}rH>hOJXtK3poCAx;OO!Km;ywEL$~hq)DBq3 zYs>~A@H)Imxs~H(lF+d@r0-@_O?=%z`zebp=D9U9sf5pV2WU*m{=?_oRUWHG06e9_ zl901hC>YuQyWh8I_+jud_+V=&6&|_l_EvLg3TMOKB z7Jj~_8T9Fv_Qtkqqc_DNd8**Y)8Cg0*Jieu@tPSF0EaZU$^_4xiFtN(!l$3Xzn!SuSJH`+LnV0Z47`B)UERa7tr9(sIFgsXiMqa9X&`9$X z7)Bsf(+iO#79-O-=s?N7UGQudf6Y+!Fsfg8t63)@#b0nbUZP_J)=?Y=cR-otv-Jil z9%RuP{GDmSQj!9j? zZ@R*h;95B2mcCRc;0l@bZij|R@r)JJOQ;?%T#Ij}SK9nSo;H6pK|IMH)PW4|!2g}C zONgegi`A;0?MtgF*R`r|W3;MIcWS(NK#W#}8}DLX!$&%a%j%tOU9bAFY616|`%TN@33NdQ~CC8%{{rcZO5GOPvE@Ku^n`HAb|nXTIUu z)wT~~6uc+0qCH8>6`?SR^p4(9-;(SIK2#`C9Zg|lwJXpj{60*+&kx5@OXfYk>6j{s zyT>U>!Azt{?%*~2tqt<~Yf)J5!$aLCK15nkKAcI|RAzAmiwf;Kq5Dq3)2gP>^XSV1 zL2cq0DzyLKX3gf+*z+spD15(U&w`# zQaP+d1jUr~De+~F6jq2fc%I?mU-5Rw4?u*@Mo(q9CSgB^^>8kJF;IYY!WsBwPU#~` z5P|^S_z(-r>?oe-`Vb6 zjY#-YO&HebVn+;!g++Bz-!@Xb4Q!>}dHznb5XgetS{#DKWk7hn2`QsqY1Q5~3Qrs{ zkYlm`J1;Y^JmE=nFtv!nxOyx@EDB@D{RJ&o*Ao=oPX93@IUJyE-w-^>M@1nY1PDv# zEjFuZbXD37THK0Mf6ry!On=WXA+QmIAIh-hR%JbW3@$NA=c~#QpQ!`Xv31K)1w8HV zNfP{DqP+>?z=N8F6XD8>q|f4g!zbj4GqCzCPU!=%NDy2Q>t`~aIq75o@9;P%Tba<2 zS(sPh@4QHOY5>zFZ~AMD2c{B@T#)20`(B~4301w|tO8oc?vlM?RmL8t^o67S3%9Wm z&!$a#gv#eo?i+VFrG3VIzV8$axneI@Hu1Q!Y;g*et$99Nn60eE;suyjs63N|=cy9j zJS2B{QZbPLha!(2QodRc#{Cy{lj09}- z&&7=1ZhDS|*F^^3q+nHg?EJe%)_Gz5`!o!yX${SWkPPd$=#5uV<2Mwr0f{jK5;kXw z?bX^Ej5)i@7&D&Z%6ud1bFoqHv+yBy+Pg-X!hgCt`qNf6o>92)f@=yu=m-I-e~a($ zkKNfEg4er^pTxY~A#BPN?7LYWedN`O@|7Vvp)jM-2@TZfO>Qy7(rb1My-Mw-+1~pi z#A;U1p@qbH%AgbLuo0Kwg55x`v%-QMNHgE!l@CC}-g~2TS{KvPvoP`Ngb6!*Nsmv7 zbo8Wpjl;NCy%IO-@vgi>?vj1N=4N+Ex5uc--*46V6XSmeIP*FjQb3Iu5jsuO1Ucm|$A)FT!@&R0bjVLmPi zD}oq4GF1#89V4di;Bc0=rfh$yRU_0+GqLN0mE)ZDR_|!(6s@z8&yZ-+Nk{u3w{ah* z*8&f!PjFtBkvq8EC-n{x3+09ThtWHu6cF2jKCw?Z!g$Cqf{Xl*>jM z9gw1)EuC=t7ou?oXjQa$O!aI6{=w#3Y5^+B>T}dmh_zHF1P=A+E#YKDS`*`1L(Yw* z#EJ!agU1NGAfe6meYd$Tu1%O_(>lc29iX?>L_ysSW4+>rzjM$NBXz?TJ>-8|H6HIn z`D1jFeKFWra%UZF=;)++XMZIAqkpGHBt@`qwF_SSGtu5Gyae`i#t_loDZCWU4ikgl z{vV1g@LFu4^%<$_GSbNEsrI$hz#2=HLbk>lVQZSObwFNyjj$;dzivtsHsM!TpZtao z(}WM{hRt-t<}_h5ehuQc-~c=gnIs6WgoIbC^LEz+hg=||4ex~eUJCj58`}5Rh{03> z+kg+$gc#F?82p9u!DHyif}g~ghoA?9CBKHsN+82t5te~r4+Fy<8KXn$BEx2GY}I0b zSK+A!Vzb@Q{rDyXKVnN>pqZU7v}(Oyy0Z7(z>c@}fAt00gF`Dz;r|UZLn}w%f>|+? zR9ut{D+VBP@4QC%Tn)?LNSLq`m(hS>KxrWBr%LrOuUKLCHz63b-gk-%jC^^F4x;cq z!por=kUOa{!v)S0;9n~Iy3!3DVqLiuUq6H?+t8;BTL}8Wq>vF?fY!?ES*%o_9fA8{ zwZYqP?&v+R1_k(+irrZ0DUG~o1dTK@==zvJ?}!YVz3KvkrlHZx;PEIZcuTIX%!xWCXDRw+vstXSw78GrY*>LsL6k=a!(XAeh%sO*iiLOJzlUIVF%;X>i1?K)(1C~te9$(Lbka@kMdb^lj} zNOj&z5+nGTIkU8*LyKf|U6Pp5#qOC2_as#F7)TaHTrrP>n|N&FC77#}URK5{zsf{&(i23sMsT4jm5uRPYms>u6{%1@G@M>u2JqBVZRU;?>r6{q$ z#%MNP@Rof4%3OmtQw&a{*tDQw>@EdnppdIWcKSRUp-+~LVN zqyB~Cu~Gj-=`8Ob8i0RJq5j#RTPGWN|C0Y1#p5}YmJq@i>D>P%ka1f)j7~2A9qgEo z_3B|FJbL<|TX(snT?~Vz1U<3V-!b>RgKQBz#fSmkK|Ax-N1}ng*I<@8m~UQ;CgD~w z$Km;1f3n#&hEx}P-I{|dpzuNdXz%P#3n=l?{4qLVj78)@Bn^`l!!E_(qxqDYhGo;< z4aKCJzLeUjsc)bo5*G4juoF9iWmeJNwH#Br?t3xj&SOAuvO*m|UD5ctrzF*5ucL&$ zsc@hAro&%*(&6vvCp<-^){}3sz)u-3w`nsCuytZT^|4?^KZmr-A?&IQ zIR)1lbrD>Ub_hE_OLXli1q}*iD+QwnoAH;@aJ89!^9UcdsMjW3bPAhW&~=&7Pn33v z*r*7NA~pZMlq&Ct(q1*+DQue953$dcEqD$NEqo+=gwG$K+)v`oz(L^7vtf0Z|C^5Z zl&&W!WHFLd$$&ag?py(fBA3=hle4Cm)bsyL3%)j6rL~r~eF`t1VBm2`7WrEP#UTN$tm>a|Z4n@P!s43ufu4^(B^lO>je@^1?Ky67;hp_{ zrQaDe!JTP+uB>Cv!^(Qg;je?0rNPR=kQctP4!uMxYb&iR7^YQfFAdibkM)#Fll!T~ z6tZMFi}s6^0_6#Yn0%cI9d(k+PHGp0PiWEfi1^r0))roaOL!%1Jv6Y+)Q{!D-+{h2 z*V`~*Yu`rpnFYI%1BkFBpVSwkgs~<#8;tB<*jrY#+Cu)vat*$wpxY`M_rN^b&j_!^ zmE0+2XiSN&Y_ZfKSPbw_v*UvE&B zqW|T5n$KoyfLmbf&hX*nbQuH9p8A$KMYg|)P7%`+qH(u&7|BzhAg}vZS)IwgTPc8z z$FxO#F}ORuQ9$f+E0)yDrYge$1B)ij$NLKs?=NHb=OHg-t9M+u;b({sy_i_9*fk8Y zV=wUKUbyjJGT!}|+D@_&oOv!GLR6+v3hve6EioJWYX)GquQ)ptxZ4jY&vAplKp|8~ z)NNqHFKrh7)ld1o{u>yp3W2|27uFj=C&+JU7TzA{YgKae%fe>7Zfn6u2l~EO3gUmr ziTp4^|3M5IK@Icdv^0zO%UQ+Cof-wr9wD5s+#UBuv;M}n^j-;@(Y2vmr$6OrJJjqH zLiuV5eO+&$y7$o*vUv-5Zsx?-8SC+%Pebfwn|}F4{msrN^BuybTBRm( z;i-J(9sNrwd{aF-DdC;{giRskrMNcJd7G*$hDPZ+jbK>n1FS6=Q5asfxmLZEXCpQv zx%#OyqA&PYKPjYMtIrfYq2|)ppg|oOOKY1>YxN@f-SbpFG>G;4{Na;y7K!2y7Dw(2 zvEie_R?z6MQ|T}g)dc2lNW%I=aRG%6sWwh}i$1R>{fsDaY>MJ&bt-o1k@g@}V^Fu~ zCC{X49>h<&TXg`-4D7+!dp!6*(IHB^)eVjhako{Uj2%>Zgn=l_@b!Oyd^(K(JNS=C z{5%7r+LpL27RHMilrpx1{ zEX$$_sg=yVy6v#5VIs!-iL``gD^yUbuf`@{t7(bwx~yKe*1q(iUJc%G55wH%d5G-1 z6>X0@W594fRy#CxX2O#@ucEHlB2vURNu&%E6ffdaW>rjh;L8$vRX-k&bx^fN9`#-a z!pFHOs)=5UMbe4*GZkME!Af@NM=Dg4#A%)E??^&ONuzfl^lAciWj*xdNwfMP zeZj1@>{960+w>KC319v!|LJcq`(OPH-Ok@-#cTDwYpG<&%P8_XnocpAT!9D&@9#9N z82H{0^aA|3epwnrvNglD)@c@ANKnXqDX4?j$d~`k&{zGGKts9H5iB&rizZ{uifhm| z>oEHY@T39@O7+j!i!PD5=&0-8{6wqfy-bu&$kYEGbuaraTA6&HoTD#rHmXzz@a^H!O0kGNxN?;t&7s={!3|3UaN?!Vxp~)0;$MQ zf6f$L8ov8rSxih8gLAUQ;ElPyOJXQJADQ`n8}Zl_b!5yhs0qr?+(o~P!odBxJQr#X zLeCUL6uejOpqaWBtB4(pOWmT9>r{LiE6I~phzwP+4Tl+<&CF}AXlqEd%SG2ok@Vfl z96TucZAGgFUzTNZg4ZvnoXeCJk1*~qq6w{i5A7R+_c8H55y_{Q;|Mvh7~ER1YD!Qt z8sy*ql_Ug`0%hSsF=$3MneSZ)cifM6JpET(@6*wAUg!z_VLu*j0n?epoSiz#mZ4Cz zebr?C+|8x9Ph3WLtY_ll!WB7oBLvXps{+$m~2Dh!la*&$*?O!S7jdoK+^eVt$ zuv79^a9Mo+llD2^y#DgGY|Q0sS3pLKVHxb1t~AkDE#6-(1FyQ1Z#K9k_?NfMegC$? zX#!kvncb4hEKV`(`0b=s7mF!|U);Nm#qc3oJECKN@Zeo6z)q||a&|oI5MI~@R9#~5 zUdqw|fnbXmsG$*$#Yz$H9x0p#56ffzLQz=qO)->qRetMD2XY_AW6m`AApaoUx6+(~ z-nubt-s8jjaTXk!$?D1Z#$8v3K<~;@w8_T5t}igA+0u3s?^6&jwB6)VWE|?MA$FuH z<3W#}`X~g_jI58CVBr(+OdL5FS$U0`Pa36OUI7}LNR=J_AA8>cA63!yy=f5Y2Bd@{ z1PK_BlF%d+Ng#o{uz^seYN#SoA|wb%2_!+5H5d>Z&+{l)cx*3VL+lBGgd)8PDn)@C zLYK0DaKAZacJJL}cX^C{@B6)<`x7VkKjloHGiPSb!K5I7`rvTGE!8%7z5}Yp#5O4N zy!nmXu-vGlC<6Z%rqFr&LQ!`=zs>fL5^U`fY}11kd-V?%LW2bT6P)OcDPurMfyk4n zcEvtb^uC@-YD>l5L9sm}n&T0375{>+WF!DJ0-)WG4pva71P!d^MHkHxe_nx`Mc=`z zx0r*1T%!NAKWaR&dcdo2Z}89Uwy^-Y#wgS4q9ksgT&kV5o1tReV3}{)%aK z_zW$zW4zd|+rC$92k?1-)gBQGZ!6<7x2BlKrQfV8YDhS>Q_V$I;np+12%j~k24>`- zl4$j_YpnRS*ENTR4<6h%u)rvwfU3Pgr9yn9e9(yvk@2QnCh%&W6*aPBKjJ&~Jztm^s9nyJ=@nXJM!1tZ81k7m< zS8~g-QmS|`aF2I1@V$3RAY7`1gOIWq+vYFYGU{kyLk%A<_@`C`g#lu3TIeqj+G=#A zt;V1=0zHSf&hNryqw#C-Kn7N-2fmXv)!?d_unyvL)A$(BW)+=pUNC?XsP7ClP1I-M zI@oR=TtyELKpbZU;YBAg@%xD2THiLV(%TPh{kV9``W%?a8oHLy}c==4e?_pw|9|6 zp^0SQ_@zhP^a#Q`NqW2?fTGK~`)MeOImM!w&gM)|f6pZ{XY9a^a62JuvMAN$Fl+Sr zlq74`vtbr67!T_9rRWfLe>-xZ$SL7C1%L!z{R$CgA8R2usS`efC3JP~35SMPQ%`IC zgF)NH+oJkVpbbL%NcZ4xoq#KPb0gFm|8m@W{mQN`tJx*Ek<|dz-Wh8kwViCw<`%R7 zpO7^-G{HVDEFt>$lyK0N9dT!B1uP35G8{+%b>l@RTu%;S)91FoGqpTqpF)u0D3Kl2 z8Av-`%ybH5p*3Zpnbkfn5)^7R1nV|n#-e|^r7Sf^Da4bdM5RA z4m=JEffJWdNG;4-VK(sfpc7IsqaD*7T1vZghXZ5{Jp!HfIRZ+~Cug%_j>zV7&f9h| zCg*KCm1ZCZ&Pu4$8QzPB!prfHlqyg!C_+o^9IJH;Eqd5u?-fWikV)~|=2V~1MQL!5 ztWE)kr8L;4loRFeABfSdw!vbmOcwQg3-6x#S#647L=q!nMM+XB!u8M8_OV)z(4tlr zd!PS^!lQv!+YGTcjuDIqJdu9Xs6e?#D5)QL`7T{qn`RT!RmNStsxNu=GKo6aIH_!N zgvD-xqXcQ=DP^kozazC7>aw=S+)LfZfR>VPUC%IfUf@PAs^;vPLDDh_1XA4wVS@dc zFiUzt=$CYymJoe6iQp1WJf%WHR|Ka5!C#(Yg(S6@^@Hl2k3@BnjBWU)PduD(KpG=NSMn26evTAZl8R@({ng9MYwP1v%@Qto?Tx{WQ1 zDzstG@{!>}^o}@C-6rPNYT*{!RSPb$Eo#F-a6Z(@@|?`0=GSwBb5RCQ*N3Fu8n%$U zcN*Ftf=$@PP%3L13mVB%BU=HpR)*|lxfRsH_+2V!(Od$Y)lSCk0JOiW`jL{=Taj#d z6B46t=de(k2i($w;7OdF?wp-fQNFXo^)62q^fic*?xIsh6$e(^_Bd!*D=4Mfk2c~_ z>FIf}4id@@h`nnG9< zYiKYC)$IMnyjek7Pge&|#oh_gQ)?2H%mR}v3tp*>LtQ&sc5;vtmPNE^1tQ&$gaC#> zdB5m8sjFQv!epnZp9!c~8zB~`s0PHCw6;Q&Lh*lRkE7;X5B~4iZ>Rlw1|d>$BErkQhe4}f0#?`@5)BL zPz&8SEOpdY?EpM!hH74!9AuIf#}ni5Pf;K=7XuRuwgd+Oh5F595LDHAfox+!&_nT} z$0Wzw&RKGQ4UGNHpJsWnB92$=)gnZbMFh)sR%<77CEQRSuFkz@L$TgtHTE9o00E6A zV2M2XT(wzxsYt)S3f*?F__yrFieM8vBZq zCiRsd=FQ!@hHL*W7W~_&8qi&S$d5>^biRLGUDf-hVEWp*jzBG-IuYh>b)oQbo%i4) z6L=Ev`}Yofy=$*27l&Lm<|b-Y#OJc8Cw0{>w<{tcsa37EOC%)?l~Pjm^X2aLfY3}i zW`1ILqI>3fPR~N7@~(O+0rK8O-Y2)%er4+4CqT{zii{_?@*RiyMja7UKdBqOvR~bpeR<2}+KZ(rK|@a^C|^C1~wlg7Ng=#{E>2 z^sTC&Rpm+LhKZCxg;?=1ul;L$*Dtz-;8wAJwWt1}K4OKkpq}AiY3Q3yDFmz006iZS z1?>~T4~np?FK>gF8*mBa(MY&@YDGB{C3wCU#)%QQ0wTRIF7p9_$HE>j!KCD#2(xB& z@)PrlAL@)2Ja>|c`on?hii)?$(#AoHU2vvaN_)jV<&x5Iiuz1nCA~let0!Wa%RL>a zr00jKmzF{mh{>ctG*OqLrX<=bTp&j4cThd*8_PiSGy{A=2?el(A>Yu9H$GUg_fVDG z5NDY|TocLfnuF2E3~KP! zU~a})UkpbwSbK;#Rkh!Ccnb=rN1_uZ*zOjUMN zqJDvBTt~4l8?gnv#Afi$9rJVe0NehEHDJybXs_mq{c+JZ9#@~~POX#&+Jj{)^?yOv zN{)Y(LC2qDlccNy@t8|rmA>4i!SyGSgaPY%No*zbI zR`Lr1!>Pc>q$S)0kUbQt&$mYd=W*`hp2C45Pwt&$hUg(Hxrd0+lDffoLo6ZYD#~$lm6+Wi<-GPh?C0iez&D>8)#uj3_0Lq%J+VhbTkZ2MSv$^CpLs$Q z|5Z_fZ0Lc4EeCqC2kyZ%L?r5kis*&SWN_+@^RhUE=#h%9N5+2VhpWg8(IrLFb`i(k zM|8~-Vmt+!725!_@Td$jP0=@FRSVj}v4ML1IlD|LjnO8A$UO8kQNEQ4V9E+L5f4z! zztbdAbU%ei6(I($6s#g$)dl-WEAPNPP^>-sH{-DZ?^LTzj4h!6Zhzq|2jpDG{{wq=XT~~iZKe2-2 zn|*sinqrT(W=&cbyWS7FR+O`A^(moC&0P#RPH+__x+t8wQX4z_U|FJJ{~@N&L_=3{ z&TjE0nBD|o=k%5!TI71ZUn~mH%$ZXmzjm2zb;uTnd>s7^6jQWFW)cpgm!N-`mmC4@ zntNS!VtZ*g^a?q0Q3$h+2JA8QdN|KMf>GNTs~r@BSPEZ0i!co0O%xHvE<}uMWQ@2d zeu*)_f?@%(i~;t`0N;dBzn0-%5EDbBoEVbD6mZoX5x>qHk&t6{SwsBzzw#gB$ zwi7GDoh!5=$Ps>7%_)FoDpR2*jNy+MFy?O24!@OZ+y#?VR+(Cc3f{ zkT&N9Q=B>8L5UCi%{}qan7Ej>V5&<$7bdz}HXMq^0aILbe^d@E90l?3;>!T?UkU!O z6M)LKf0M*>j{P&5eXhjWPFU@jU8_9{va1ekgR5p3u9~OSPriWp8O3k*cOtlL>@Us0 zP6*SMl+B%%(-!sA&%!VS&t%X6?9_8NM!y6d-JBT#@0ZcWPW(Dn7$9a0tL&dNOBFf z%o*5J`4|aee8DmBwooH(I-NMSs;fcaVvv2StRDq!pq->zG0xRuMW9h_$5HJ*b3d@q zZ9_B|H6)^9hW)4z&v*?hQ9os)v;=h4i?Pwn$+z`DzAdZGPcR(|{!M*7Q^&N4;6)8+ zrXI9VvTXt^&bXl+5gZt{W(5}1_UPJ3l)<}7sGk=_uTBoZN=Ayn)|%Qqj%)^o!7(-* z#3}{(&=1t+>_IAHpm~mDNV|hD`X{Y%Xf8cP7JH}gsPnjSaZUg|N|*rFXXwh=DO_@= zQ!-^SI|=4rOaOyR82ILpxMpF*o{CU%0tbnXl71&Lb%89Fx^_QgO)!A_(oi!&BUFe2 zyGJ@HR0NA|`@zW^s8_{ME~*Q*3B#yX@IDwb2I}H#ng;4X>KQcTg^&Rj(qh=Cz@fPW zN}*1k!R=9u+5Jh(mUOpUOkk`4cOAC{ry%ALF$Kcg`goDAgouoslqk3m5@~J%3M`ro z5L>AxV3DE8nDAtClMlnwUy1rU$d!?DIstukGf!NJ%W`DaJwNA zeac2@@L1vs$Q|2=JZd@C(Z^vOC`iW+WC*KI1QNv|ewt%nUtl;MXdgs^M?9N2&ZiCU zmZh~){COr+w~kqDm+_3kpeqn9JX9@i*Fl}V;D3Hys`GVq`Rs!KurA-9k9BFaCnrN) zJza)Qve1^ISj&qW!YHYl2F{n74{wWUN=uwUhbAc%sg<ltJSEfhmb_vo2UEfMLvXVo;~my)haSxiPhFti3F1nlZz8s_Y7J zD9@p>HX=9=d{FS#cvaEuf?`F3#md85` z+Bd*^Z>zoSED<^(^Li?*6g{WmT_-M2R`u`aU(>i)Vh+u!u0029M5Xnk5w_Z{<0*Sk zO(-gvL$C)`b&+!}>|*O5j5jmdR-+=MHWt*Lc~wu%P<#0z)xu$LBer@uT$d^ZOu)b> zrwCeOEaAV0dn5VYFc(Q>tXGnAiDb-UNV4yA9m#G+lATH>xhMchKB6O8<4Lb1?<11g z$w+eeEFHSB4r$W_u;MKu7W? z?-lzfk$jX!$q{{zZDu6dsAQ5{u{CuhZ!Yvo^4wq~*>^IMT+&}hGIxl9mv4>Hk$nGA1If1@^;XI(9ZAa=uOvqi$bOlDEANlGa4>L0Y1RkJgclFp_NGm1I$W7s*B5N#^uNlHHy~l7*vmB)=J8 zAh~{kHQBl2eG}{xl@HdZdozY$M53uOwUQNY1u;B^gL0%~?ot?R*`{Dn^p! zy^{R8uZv_k?UA|Nq#jRNnU+S&&L``-cIyJ@})j5lFPj>UK5Dqr!$b`d_Bom5{-PU zSCUP2Bb~MB&*CqlJDu6%4SBAjl7cluD6S1)BavbE+>+&&qR{#418=KBOlwx z8%e8<PC{4y^?&@ z>LU53caoEcWSP-Oa-g2%`w2!qHo+UoMmmx$y_3Av3rRLgMUpr572Cx~vb|T5ANO*R z{JN)ClFt#z^}~^*ZML3|wHobP}_ zSCXrGBFXIok>m;e2H|cmBOlw#8_6L$lB2zoY(XS{?2aTi^w#sSMv~8aC3(T(BDvMO zL?q9GB>yV~NnX8l@`J>3N zhvE_$)_hz~GpqV*#5g)dhHqw&n1C1pr^s+XPo2oHPtOudm==g7ET_0iSd{9ugg^Jd z5-y_Ud6-@RQ)DsDua*)?UP4XQZCmI_zU^H!5uhN+i8Q4*?5dw%jU;D!CHYkk-74ap zWHy!3J{3tm^Q3-$HIl6Cm87C0`K@Pfz@80S~T8_5IRT_k&XC;5JN zBsqa*o~7gU^Q)0$d#@xX=t%bT&QNwCk}Ibp$wy=K^J@>|{My4C$s6%5l7}XHCHZ|k zlKgTZlKkKa{rsvUNkg!0ew-g20LbIb(l;Nv{tgFN8fJ>cy; z;Eg@tH9X*DO2XkGXi&wjesDBZiJZ#hn8^ttrwTb$$+?f5YUETWrv^DS$q6N=7CE)a zsY6a(a_%Rm9y#^N2_vTgIS-K2keqOG8j;hOoCnE?Ag2jAP04wPoMz-SC#MBDEy;-_ zCyJa_gbR?$}Ii1OQgq$wq#E=t9PFHfekrPKwJUQLT z=|PS{j)k0_~QR5M9r#mQ;Ry9kg1t7G(S}IlW_x8JXH#M5-x_E;paUN z_S7!21RC3P* zs7*#tuFwE=v*Gj+s-%nHCi9X+KYE`Q5p@&|%(${+`$4sSCog(~4?RYM48ha0I?L%j zi5+xIXa(vV*-I_!;W_!_8Eg5UzwxjUeu_kfzIClz=}h&SoLXr|hInM0$iZ`Q2N|L7|^DBkSW)T=|F z&(82uj}E1a%+SDh)k?#m{>GY6t<7_Ep`Y}_=$@4oez_b7(hEe;Qi?VhH^NK%!9aA+ zQU~0KRkNI{c62XZiLL$#oBG#-%+hwn!LVX?vl=={VL<*khE^&V9kW74(CDm(5g76aRQi82e{q|D_JsX9mQ}8OQza2XB zoq*J?tYy?19_hCwJtsgJ?NGlMLKio)s;_GY=@;>U6;aP@ltD3=}D8571R^ts7tePB*uvj+CE`4zR-vtEb@@msjQM- z5U55tGt{a_@eCz^>I4<^6M=S~@({bGh)`5Pq35D^mO01*m=!Pa+A&-0VVY22iADWE zKP;oWi7`&3U>PaMAIt{GlBQO3S2|SY9~2}J^oP_#WyQK6l@xmU7@_{W0xSE*)TXiM zA4>u1I@`&ux2+N3-OZfJd#`&z7a3f2?k(!LyO!`r-y(>F%azr(RW;*l zsY6lcW79P-i3s~GHXo?K6ys2HK5%HZ&G>esuAz@tmVNw|diWI)#$Csc;o0YYdM2k9 zyv?)KA!}Bp&l9B>#EPR`9R!akebAa%5-pL~1d&)_b$COPRq1Cjw-uJ7zrRirf8V)_ ze@}Ww{C%1JE)y&MK4sLHWD$$W_^4aV=b-kiGUESbimKux17v3!p}xD62X)p6Z9jl2 zw!>&8)ZJ(%T>E(pTTy*s9zIrbCS}W2`{hFA3IrYotq?PP=J^?e)9?7Dt`e4%5`TiHmX)pc`Pl*TcDU%Sp!NcVRI%D|7KCBUVf&pi4;?8n zrecUXsDI)WvdMB=wPRf9it5#)@W`ivVz*@nI9G7nMldK9zRpkT(mTNt2DPs%=9Y65 zQ%2F2ZUM7=Y>-=h&=oTK-e~BxJAsA8jW}^0k~a@QHD`oaJ=M??8eOXX8Pu=9a|kd& zww$ja+TRThB))DA<^Yw?B>aR?q`sh=sA@xCjUMwkf* z^!_njJ}}V)cXds%#nj^&3c1ysF%O?Me9wghbC3K|%3+dEmlgZFlH^me9H?I?M>_zv z{+@T1+{D2e?bj7I7DA;?FoxK%uUH7h7$Tu~8jX!1rW|k&Va|}3LG2r4E8M_ZMg24d zM>UQ01zm7y|2YJzt}u#hh@N|#QED906*!I~SY!lQEie8|q3q4VjY*63y^)w9;^TFw56vrNm&1WXD@ccJDj(TMx-;h5;dsROY2UOjH2 zbX)EN+jDoglkGgI>tv!a_vzoY%Zs#mPDHG+PMtbv4VM*tZ~h&U83UZz8TGyA=?Pje zbR{72`7sTFNXp3~E@AUyZnQ;^x?&HtO0pXExtYnLx;uPS!uHo?5 z-@Ho)EmZR1@ zFW-zg-;|38DNSRw&2b$khS#;&E}EYo1y+%2#(wHoRMjmk=tcoulBU!u21QuVCqXH2 z1uJM00=YtF+97&~g$U7F^c1*w;If$o`m2*QL!NtwP0YBp;FD6=gNcrZwHyshDVF@H$nC5RquZ73FM|n`NGwSA^BzpQCGMUx+KrFC5r`0tGgLEX=oY4|Z zrgT1-M1IRS%2k59bR_s$hEoF(zP}5>V;Jrqgm88zf)f~y7DFvItyB0gb7q6GhI#^J z37`;#n&6^Z^c-n4Qfvp{g?O`gketmdi$gm9SaN zIK0I^5hkMUziY_&<1MNs~fYnpih zs0tQLQuT@r(UjsI^MbE%`akiTdD!mX%%}H4KimbjGbP(aR76%KGu?sZPH{!O5GrFEB8lcjHF$+}f}EKy_$C-C)%Lrk!S{uuZfjbx ze!R(vz);?RLmB$=MfJW+7Nv@r?m&FzuPL3th5<-oQAC*os$sjPbqa$Sp7q0%_7Li! z>fKW!K1m%zQ+J6x7{)MdHs>Ryfobd$tDX<+q3!>(xH#Dtq zZcqth)L6E|y0Sf-;a0XNUD=>u-R*%Z^`!w@E6w!S+%=F6MTT9Wl8Jt|ZsCmCe)O{GKD`_uSar69I;nNcmNl@h^O4JPb1ay}x^B zZ(BlR4Dferj4wh&+{?ZTtvU41GsJIvXd=~zad*R=mZz%jiL*cJL;g7?VR<0fw zyVBbGX*!$wfO8&m8KH$@UojRt=RYWR_mi^NscAlo90^56)-kJkl~G^;L<5a}k;vkT zEr>b<7vr`M;N5T0C$FG*P(4uuoe3wyW6Q**rVP#=Ct=Qg__q7>|4e@Io_EgVwo+bJ zvHDZ}XjvqRK=EGEN1NW&3@(#(c&7M?*@jWffhtvc{FE$)Ceq}jUPQ+!26dzh#0qdpM7Y7zPH`x8Nxi5mU>IbD5QVfgB z7MrThS_`UF4j7i)SX(}b`e{Q}Q@0@_uH>w`X921>^q%Vv7Z{Z0QJtjLNho*Kxno#l z+%c#Fx`>dvQv$J-?HOvdbrrkXo`3ogL89j)f-lDim(B@tW4xaeta`-luupLck&LI& z*b(5sD06RWAClilX~e3HPI*_iy#{dr=;3y0&AULd2%U7|f>RK|`YB@1k(xN#?LdmP zzt;(eI7Jl2?bzWI?zG)WvI$UHs$P7SBo`r&-Cz)BVr)1H6YX$TZiHdX{07x@-Wddj zc?9^AY+|z%KHLI{#PjEj5(&_RtaiSH8-dvLn`O)yFT18coH2q)7_sQTglIosVr|ursX9byja-N%F+!#<9 z>L4+Q{=8bP-N|isdKEj$PQ_hmUj_~jycL1Uk)S*FHR`;nnxko~^X5}2Ad%g1ziyl7 z6pcY&aa%;V8DSz_Qz&P8xd9K_shfUTkeF`_GG=Q@L4-%m?as{2+fKa}HO_={7ak8E zi}@o77?JujQ5Bp*s{Ja+t;uXKl6FhqoBxgCo%0~VYYzv&iLPy!XpLl7$If?N-UE;E zE{_7@8}Z@>^!Zl{HM9p+;Ng@RO1TlvV0UCdrfy$-=b}k#;9e z`$HV(q$}7N2$W;1$6+qO(;Y#koWIc4 ztN!31_6GD!;#LUHsV}QH50i%->j_6-Fj!D+BbF4@o>r(HJnT|!CbDMK@0Joi!yO1^ z!J+M1thSl!K){Jy5rg#ud>mK;5hGABrB-pJ5F*Fm^SBOJZ4FrE)=U_I{*94UqY>E7 z!3QGy*j6OSxdc;+qp)JQ7=`8+W@4>hl*LnziAk|=j2{}B3&v5a4-cc(750;79r`_~ ztE8eTi>4`TGYDm(?&t9r)#)PgJ<#amg@%X9C7=)wDQrK2&^XjbUe3Xm zm&N|UsQvDDPy)3VrCFOnhp8?P4ik&@1!P}G%jFrhex9aL2%dNj$}kAJG}VdzQ=pD+ zr$5lY{fdVy7st?tekUEVxkM_`hk(uYs8HZ>EhEtXpK_?tm z*9ceSIFK`rXHjjiBnRy6l@f``3bR7jz&d-gjlRy>K8D5Ra<=F5mYY!2!2NFZWwBil znF)8b9`_nCu40OH@L;Erhq&lF=FASL$+1#k>@|(7$>Csx6C7GIt!ObA?lY-r2cS+4 z7hm#qx?n^XKhjznvw-tvI>;>?H^QM6J0QWMkYY>$Zg*iB5bGIos797R``o$et}3_} zmSA%U3;~+dQr|e?&JJAP?2{cBm|Hvu=4Sn8;E@r&h%@Tg=sfIB%Hsn!WI6IRzSAZ? zp30|4v`}1B%}-OmGcLh*VO5>MT}ko?d48}AUf^CjF+2u_cCs@H_81)pY+w`=Bcp(Y zISWhq(SaTDFO4Z_|704=Iu){RgW@>W? zP2g}Bp+K;SrWiKZazefHHq0GhyG30*+NCIV3@rMmomwhgtJq-UDtFq$qDQQQXcKOY z8LrlY6P6frW*_Ds#tRN!XI}~yAgF?{1hDpUE)2_2Slb_${D>P<8{$qwx7V#I4>mER z`pq=gihRM_ifp@3SjF#NQ+?vzQfvIIsd#??zAaX=S47fr2e$^A7f&Zb(+9WQ<&s;0Dn5p$@pQ%g3N&OA#P znG3+_+<1vS6mOv%q*c;7T6Hm1FahKQ@g0DR>ed#z8^Iu>aWsd{P$^5}nG?no8(3e{ z@)j$_RBR^{n;#h_h6*4Cx%zp&?0TRiWtehuJgII=cH5qYrdC6{EpQn$%w;rEo!#7N z9$u_j`^Z=vT_ghihTxqrn(^g*50O~mCK$e%T1rEB1*M*BX2R>; z)uOhhb*j)JH84N0LQ6%<1%dGew?_hEYq%XR=pps2O8NMtON@zwpeOgj8?g58j!kz2 zr1pn#a~-cz`~aipvoUy!6R$_NEgvqT;cZN??e@dFv@&KMO{u`vr20MqGn>Qx_Ny(| zN(QeKQmRezRk%cLg^lVq=-*;i&PDq_W9SBWR#14eYg$6)b&EMZA0;#?LqK3t1ST5b zBKY2Bw9Y`YUsnTL(1P|O-24-hV3-B$J!oj%FA^=AY3e`T*R-guP!x0A4xkN+T-EoR z(JnF+-rKjnrb&IpC^kBx?!i|9d(g}^uc@v}->;13OW(~8_H1x9~6+sS`t}XjW`iU<#lE((O(;f-jzMZ?b;D#`lj4yUJdoWd{>04;}c(zfpC2YG)`! zd+Om%D~A@l*=nCpf>rKcV&I|ivGIo6fE3Byqp{O^O!V1cVW3YN|V%Ey?7W!E=P-HGaw^d^i9qRYa z2F}r4u%YF393I}xya3KmjYh~*tC6K|;~h11PGfhwYeq%YS+RG;sxvhiZ!YeqOqw9HE(c!o-P$y>u$WBQ13&laGSla*R`M2%e)iE3pUGWcFmmmE8hH6 z-R!PO2I7`F<41>B0zgEzJjbZ>+MEf-BVrciL%s~r3txhpr|DX-`6aRSIH8!oyxc`W zPQzrnG*5}%V_udUoSV{86f`)ce|)BvItwhN5leD`?=D_KBetn{q%l{dSJc}*>rLp= zsvGU^;XtKWYPm-p+7-090_i8h z0h{#Zx|h&3LyH^Jr*US;?a&0Y0@Dh{o1=3O`yMFYdv zDScR;x(=t~bHUr_uUC?i`pq2w%wr;c^j#N+cT0Wiqyuj4Tit7?g1;0H5Dm9#I&mA# z!avagj=SMzu*gEsRhm|K^o~CDvPUrW*6ykQm!H?vQ?G+XdreE}SiGP^hLLzatL^Cf zSx5KAIJm>DZd)ly7gi-MR(*P!&U}`_rZ*hw>7BH#1?z0bQo3+vCz!x8vRI4!#hQ{7 z0c%RgY1qC&V;oUeFBh znY9Ubt;6OQLVxG8;InGzSkYmE#kX46z};{N?m=kw(bQS1`EXEE%Y6>f@z19}r`b3L zmRZ5fD$ZFHcG<^uOGu;g*PPwvin8 zzS}GdFY%_HiWrLL}u z5`0%z72V;o;PIhjwfh;nYD6TwxI4$;T)p+prH0<>OzxDP$8hVbzx*WoD#@@#^84F} zjyGtj%X%T;>b3pUS6{+8_ZQ?$CW4?+G~m}P(}ZrjMa+0==u)#p zPiwZw^qX|62?o~f5iqDz#Hh#`9zKR6AK`WGCf*1TD;3*i+Bz3{+(os{8+>=?qIzo$ zKXbdNj#|sp57_r*E9NCkKQZYYP564poRQ#OYGhXGI9o`AgsS4;Rxwym*-||GiSEp zs|OKQI{f&V&!LXNgc-?_|8BqWq!?`r-`q4HgH4cM4h|gPr^ZY4ChAuWf+?VBak&u&9Gf%8K{b zthUYS`%`f$#A8AXg#83f;N@PwsyWk2z*e|OQVyDgPFO(l!jlk3bDk>5WSsY_?D!G{ zmI9FdVo!^(4>V=Ji7(T`yyUm@}V3X$2fM zW6M-T$xsSihWRGYp^?@AvDJzD7w^DtsB1rh9e5ensi9boVw^j0gJCNe&}gyA{leZ` zHQjf%CCIQtl&qi+8@Xhy+u$T>-eRfLMDDFvmTLhSZJ%3S zbR}~Z`CKbpUvPhM>&&eM^q(9gY14OuVfw6H1Lb+X>uHyxOhp=CXw-GS%oVU(vj! z23&#bxGt>*d4;Xa4z0hExi>{H%7@f7^>JY=5@V`u+jd}_OO#{PQVk>JxeY~l)|~0b zZ?|vbQ|=Uhx)x}EGDOKdkM~l{8H;d=8>@l{wnHpFY!rPX_jsU~D}#bzxvV8-lOU5( z{;R3m2064in;NTawnT4wW~Y)Buae--KGp$gg|jrQy(y(ue3a<*g5X8CFrXD!(l>`# zJI+z3o=4HV+O!%;z(Xwd77E<__@jAh_vhv5<@=m@ni~uqVxW@ML#8%Gq;@_f8lO~w zUm0lJBLAoyL3Y{$ir+=JXsd0)s3P5>qwXR#B+(i!ncF9eraGT8RTekgSzLIkpRyUI z4Q(mNfn5dr^*=0Fu)bj5RCN|?5M2M7D%Q>EVeU0~POQAK1>JF2S_-=3u(V{&jZ}ZW z53RvfTL!oN)rXgX6oZt>j9yFgf>HX@yDHsMzi}02I}zpb5)?MQdYJ*Y@O!~qbogL6 zDlK2xq2)Qh9xX4vT%BCNb>V$)Lo3L##RPL%vG)rG_{?F$rU#(=mo-^Yikb1kUgHMvxtK~3j`s3uM z&6vTT1Fms81D>af@J#lbNFCWm?qoxlY=(>Mn0Cd;-l~jbpKy}>$M*j*n3?^UnMlmcuT;6O+A%Zcj2f`+bB5+srZx1pG7fw`LY&iewSHgBpn7{5GWc+i zCZ8l|YW;r$b6DA8?;V_A?;c7vk2TjLg7sTqW3H{wA%`xvtzSpZyX34S=T&mD$yr2B z8amTwh=0lA-+1vaN&Fiu{w0ckiue~J{?|*q{|h@KjdVbne7k0)kn&qrPTG8Ep%c0IY{h z8zca4oA{s+B>-RcacG50O{gq^R;p#9af5sEWa| z_goaUG1P{}gw5%p@PuNQ@w5>6O}s*jkDc&ZiWN4AJDoStU?+B#T1M<2E6Qs$cs=xj zAr!o)##2`ML!&=nqh`Bf$(kopogE&g=2xJO8`c_zPl4Jh5bvF<7s@khM@m61$BCt^ zV!X|vj(DETLWk1x2G?C9=k-<>7U8@O6q|doY;5`&KUf>X)R7ff0u1+M@E$#E{zBsM zOhb37SGeg8otT`zsuk4&!wpx&AHbGHUb;#%>tanVc&0`8FwS@^2x@0i9!L|*u-}GN zCN$>UB(*`t@SjliAQ?O)8!F#<%gA}jPF^yCy_i_~pCHvw9u0YFO8S1-* zT!DHPim!T1Sa?&)Geb%whpF4j$x}Ddvxu!qFTCB@kD}Y6`rNd4)|B2Tv za?Fc9#%l>TMrm0!!Xc=kM===~7RvNUH9K{6IvPnx=rZ$3rN+fGZI4S#GXk8=Gy*5t&>B?19C0 z+R{XL#WrF?Le{w8czDc(_bEjBaWFvWa&;a- z>!S9;)_u{J{B-3omMJdWVX;*UmlrYQ?S8?hrf&+dMo(Il`T;B-u^ar6rJuA8B{8CW z_LqP@yg5l&6gx;gnU5L+Lx{ObpYx$zrmG0`64w*z zW6nxZUm;5LvD7_^eZ+>sOD4m*5Wm};`LrMQz3g*>3w*A)cR%tT)R=Fb!2Z~vV6HGa z!ypTQNcU5uH*SkA+s@6;kNiF{2~MlFo8KwoNV^nXrKQM?(ynyihQ?;ci`vOb&C%5# z)g8zYw~9JjvsqtfC7Z5hxuaUwf?S9?568sVY@3-&KE4$EC0Vc)tg1Nk8%33Qho1anN zHsR@Y?U>K}X4V8AxcW6`z!4D8A5W*%5kbZ5T$@qk6TfydLT^@Rqu$Ju|E~2*q@4UU2l18Eml%@7t-&9n4BH{AmoimnFD-GX0o44FXLHt z-&$ZxpgWZ@XFf+y-lEPIE{9vo-tW?E=7mw57iL>;MO1wuJ?6lCINpg9ANRRs$Yiu$zDOf1WW$I)ung)E-}4nf0L za}&cuGICNo(hWv>GH(S96gleQ4s=)-N%x}#5;Tu59q~P*NOf*!+S{yMA!Vk-3gZzT z%1lwx28S|uU~9+zZ(z&tGTFRYuy8Jm7c5<}sF<0*UWJ?5zm~nGNgL}?f%p&=*wh+$ z9l|NZE{dkgLBlON2BR^lwMCC;{0F~750*>{po&9CRiDCYQW;@|Gr8++sZj*Np}3v+$g zy+ePzY`L+=V!Lg*vCrbS&r)Tp)%^ArKTGb-E(u~HX(0aFV{Nj_TI*-U{NXk~Wlv$O zwlQ_9$XQA>NQ}kMOb*Udq7P1MuGk!?&G?FP<1*~B4?&=wa8-1h42MNZEr8?D)#?jY5z;{(FKYs6p@B6U) z_`MCjt6}-^dn0^T$MWO%m+)N!%a7k5!*@+AKYqUt-=SE399;=iQrq`-#+)cEhf=95 zZBiUEae~UqQj^M8R+>~+HaZWe2u_7QQ7SDeO@58OMk*^U6~qBEQ=VCxIdBn;%mEOU zi(KH(`>*9%xb&RMIh%dH{eAl!&W4B<%nSdu(I@nAG;Q3$mw97tqE_)SD@{{lKta?r z<>rbqG)*gwcyq6zG$2!lK>n}GQi4~brprE%sHJJE1nO34Mv&Q*hSI#$HKjRddZuNI zIGUcZ`aJka`G4~bJT8|gw87Y1&71rb4=wFLGWU|yDwgWSY&K&in>DUY>d;lahe395 z@H`x3sRN)aI2Z&6VI()zJs8CD11@NO{DBES0FmB^na?JTXsf^Js&2yw4KOGP4jRBg zD|<20AHbzIvNZn|Xsdg5D<`yhzqPs2?6{fixcO`=e52GKi0}g<{DA>KV89>XWj3ba z8`Clx!!sJyDrF2SJ9Ac+)EusoANf#4|3W3L@9Ce?<_WZUnkNahc_M8LpdB}^jrpyO z8P!fx4<#u+dcEr5amg$eT%Gw))XaJgCt;QBH2JhMaqD`4VgnsXA|Yngf95y7U~wVZ zWEOW$(Kf&fS3-LvS)<%=mA`V@Gb?N-Rz*ZZB4_0Rh2kF^cG2JkWm&J9>!MCW|NaGv z)e4zRB;xT{ERx1|ao3r6DAlW$wyM zsqC9JL@@kAs6zbq%)-s;hOmc~9X2ff*`w+##+15kOjq_x^nuur_6ie>mZ)E{;PM>m zylgyfgU~aJrz9H`2qoje=)RsnDC$uNuZ|^}(Fb?4l2y!csfhX#i5`uX1*utB6`ndX zbiEoN&x!)b^f zY@_~xDCSO+yhvbp2Uq2z`q`&))O=Fsq-~Pmc@<)xD)S5OoKo#d3O}m)VwHs(=S3(o z7L>e?JRn^;E9G+~S&u~BYWoQxwU@>Kn z`bsAa4nPtbkGt_S0n0i-=Psadk}NcEw?s5IWTig9`Oig2xG7-~%W#H|>(xw2^;DA1 z5H$BGL#X4l187xDJ1cmFnx%jiNDImn)S-VUD#2Gjk*Z`wRp~Mu{PEEc=B5-#V5pd1 z)kVtF%5z}d@7F}pi>#o3NYRRAq%;NMo#x6R(WI2NHf~9#vD_PAzLs*5l3U`hdQ?`&rW`LwytWB2`aui1T8Z+CVhDzrd_C!(x z;o)0J-t>AEg2n>RBIr{S6RPV-)i*13WN+XC6TBdjh3kZjX`GzbXt0~Zh0ztPvGDW6 zzPkbqWjyWA}AADDCWo z#hF=;Virb84YxGri|QZZbvj$pkKu%?9%V76H!8o*bUgCsN(M0^XBFZF??8ty0Sr!^ z$cL*-(GW?(S3iTR!~WkG7(p{`j*t7@tbPtxuSTeZ1duKRl;QLmupXX4ojHj?%tUfk zswk!Ux#H=gF`ULl#>0O~CKP_Zn5NGq>lU2!6vu@E_aZbGo#7p~^u+c?7UjizCf6H?Ln9A!W70RO?7iO8-t0 z^EYi?69uw(oGM5}YRBH>@lzqNXrP8Qpri&*BHNDX&okP1iTL5(x9b=1Gqu2hgVD7G z;q5mrCakOT@+QWFvL4UI?Cg1ymG{Bn^O-RED%Jk!`)iJ^4^544F^Zk7J^Wa?$?Le= z-%l(9>r-hn4_=Wj%~LBvw;og7l+lq1DvR6y9#ff(g3C#YuevKd8cuEFbimg0zfZo5 z@uCmqO;(TX@83C{lG5NoqzyGJ{bE%B#h+nYB+}P;U0p-ff`~hU@ z%&jM3m9`d^OTK?R_H4`4z`Jvn^ZRBj!tPx5M0lP)`8Rm$mJXuSQD@8f(YLRon;wUl zmH&L7a%vzIPQ7HlC1d1MJ2rnW!Z+n-sSfq;*d_g|H*7jd2nw2cYvvqL^6*=PpWErr z78Y%x<=1^uW`9^ds0ulM+x_(CmTo~H+WW&;OJR?bC$`e(bkmRS^(VUF)QeVj{^ujh z=l8$Zwd)*=upa$rpc$p4*iDPm{MivBaB{~VgSKR`M6y(Ni>_$pM~QzyvZqrK%% zUWfVSA9;}w@@_PhkNASjdEC)DeIw_D87XXS=@au#lfGOwu^edQZ;pDVE< z!5cy99MA82oV>w}StMDZvXBm_D)jrk;8PQaM)t|kCQT68Y|nMYKfgl0o6n`_1s zoui39u1ui)@rOk(^B6F%6R2{S4`%|V8OXloK(LZo1$p)^jpdu111@RH36&O&&IJY!F64jHZC=S=SZ9zcABr7r|}w&XjoPXvJTf|nWhFqk zGH)k58J;rcuwr+BtIg=m_-%T8XK%=oBN#AOxs!Qq;N0VUDqrk`qI*|xQAfCx@cLlh zbx~@(4>BG-;1hHDgA5=#kx8i3cGCi~mO?Wc(q-UJ*c z)6Kq#kBBDxP;$grH*}sP)K+zbgL%;=b@sT^VU74%Augm0D1)bK81W6uQh!0Ns#O9n z-xY0h;S`L@kpIA%_ZjaZpxLNzOQ>~=U8Zs>Xmi{Z?Y}6zU*ZQ>_JdA%9n(cC2^*jI zx~2%kDK?~x_55m^xX<{`5BaPnJFhE}OCF0z#R|0+Cy?t1xrN5~3EF!WAwE-79u#3B z{*BoxPnn1Xj(D1So>q6#?PaoHkyMQLcC${oq5|qej!s$SrQK~y0_{Dw4rZ9LqyH)%;#(){V5z&}~FonReriObab8yf@0TjG7bMBTDK z>G#B)pO}SR*DM%Y=71<~0jK&5X^?scht|NBdh~HOad?rZCxt~etWS7Lfyh;bFL}*- zIYxLXAasqCytym+q%fp^;&WY@*Cl%^=xAJjQ`+$xMuJ|@~>t+)AnO;)Xdq=;J-U!!j z)5F2ZPDyI&n0QZ;;Xj?msTdA5$;ac?v|ebSGXLul_E^?Ui9X$f)HObkdk!7)OCE15 zP>;^`yfM7>Sq|;^<@6Ip9doVh1dS>5;~%NSZOMw6{NI4MU9_Stx-;<$;^k_BYaITk zn|-r|^kgOWIYso|oaj;^Uc<>70uTEN9a+|m=ytUx@*yqg!lF3ILmDo=(VNH{AmUEJtk?w!S{Q zFQ#5waDvh?_i>}Zt%EX-J)?oWcE-!&e#Mf=m-H!$lZ(^J@@6Zy|A3Wo=$}u5k+n_B zIKHmLLdj-Mn|meX&VQ3dbFFNujbx!u5*!5whCh-u4(jU~^$DD&70-peHy4s6qS|^s zg^~HaHni2%UbUR-L7^V^oAHcR_1MHU*Ooo2=i;3-I~_LE6ZJ3+0+70#2{%6H58yoJ zxuF!ssmN*L%HxE)5epsGUN2mG2dXG(hfhq_1lnLDPfU{2tm#d)VJ>lw1ddU(3UR`( zIN==P;%31f^~!phwSZ;~}NX0Qtq3MjH@!o)^S#tJTo?_$-v(!YQ# z8${!j=Us_zr22GiWcR_KUjuaq@6Ba|YF`$fyuHhP7;xa5N6xwuq%C-1ZJvKe)R@I80Q=B;XYK}00W99ae z8Nzq=OQ`=0&Uoi{B(c6z0$cYhsWC)%n#7}go$?ArbfTW1&Hpl8PCNn0B7>@Y1zy(l z58O=%kJoRmfBw{FZC$?QBjkWWVhjK&6xB)6nFOIU@H0dXJy|$ zjz#Wz^_ecA1qF@_tbI$X%a$lmni>x{4*q1ik!TR(KAe~KyY4pfSO-4DP&<*SEYUzt z*TplNQe9QH0bEOCGdQappQYfK-X|8B^7d->4T57S;}BAZ z8V{PQXyL!0FecAGSD&aT$?FM6soN>)yl;2z_$2J=@xJ>i_RH&dR)z-R&xOd(b;*xx z9OoqALrJ9}WXa|(E;`idjMEso|7_`JJQNZHtQPdy#7Q^t&rxX4x)ftNO&y7?-=Bmg z?=>xmHR-w3fe*b9t!zp3VNBgmzT$?yDtSghoctJ#x_jf$OA;rheRhR8v0~zqTUB)y z{E>sAJ?J)fn3Kj@fg<$8t%sswX+!P=gc0jNZ}}H&baZ-Lf{&+c`S_t1>=`Vl$C~<- zJ-%kS;^1nsI&1Z1TH=)i+u?70*631+AXc7UDtXA<YvG=~?kX-Mq7j>aRhg0*@r@|N{D|01*V~V~!odb!>&%L&^ZOTGKTB`;mEut%kqtW$Y->6ehsGS!jrOO;5WEC4w&_vMBX!^6)@!ei zA>QcmBJCcBkIKcmx7AxXiIL6b3lr|R9HBcW;wX6;&8+UfI2tgNr7&~n#G z=;7@?uHLA`WrJva0$<&$X%RZG49+YlZZL8AG|7pPAIE zJX9{r;w_hrkNt@!qV8I^3;XURhq?~64)X4MLyw+tW;RgD?N>(rA=`7tq1wu?PnyQR zoPi*NCUq+xcZwjf%I}cgrP?r5Yx!ffb~3l2wOEBQ~>&hfuSXAZsS zkc&=j3ST2=L%5DKoW|EA_}`Vh3e^zd7BHx0mUY6o9nn^Pt~l;Lv}Z z+C5u5PT`&+9A4Jc<`ElBNZHvW^icT-;D=U6R(cS>fEPJq%y-$6I2)QA%8@M3$;XZ* zq}`E()r(4nX5rRxDMjL93hbK$q|aO@|M)zHqqf^tJKBsm4*hW!5Fh#ra_W&+Wt$h= zn5Wl2sxDRtQG04O@Po%tC;d*k^F3^8+|VkQM@ZQchN~)QuMsP%*GUlPrFrv#*b~r7 zseHnk)dDtc;3#PvJe|DG&N8X|e6N#6duwdjf0M$!7+PDlVk0GvvWDPMRoa5TeKVic z#&>dOzJK(3C`NN?>C)$_GV-Pq^+)WQ9zmndHcbCV7Olyc7{8~w{5SN;;{>odAAS;A zDmdtUx5}Eu0o!cRg%ZH^R|HC_qIjJk1f(?~1gd{;OT4Fw$0?`$N;}p{Z!gyrQW${5 zeq>$;9~TX!aK3*iQ>}hU=2}xHc7uX?=41@i4>P2WPxpz+>y7>6;{HHpe%J+#e?l_U9h3f=tey8QJeO1RxFJdQ&;<9E`LKcOKCZmL6D zsK`*BT6$nlvH%rbJ$?YnseDL+G>>_>r=CkeM!*5XHEqmDJ+Bnz8aH^3z6>HAEc0l&?OcQO}QS4ii6( z&z^*S`sN2S7Z!2)5`Dr@kO^m^cvWP{1ECG6Fv0sJ?{vN3aMM`&!Y)p;YA?8)qj7^$ zNzB6vvLpa$&a4mxN1pam`8Tad0)vVdVVdWp>txLzDVRAlzdMrq!iJ;>FyqR{IUp%P z1&aq)QAl1n@hhmb*Azvu6BJ=a|6J>SIlf)w&jrohxu-HHaGh{BVyq+I0i~w9#oi78 z^}1rv0=nyPZV#^mEc}p9AItD<2IntFsuS%_5Pq$mrboVXhtFudoEu%w3_k(&o#v!J zUnMv(7?qfHu??JgnvVo#>pYlZ_1jeY;|G?Gs}YNnn(!mHleV6++VR(4P3AXi-((jw zp?rJl1}4AEy82h=NcHrS%+~#RQc)Q*|K=>n=TVT5iUMGk*Kk2j_^q>8E$5 zTX|9_z4G*9%-o@rlt;vgtY_y}QgIVOA$n@vNvIxOwTv*q|Avdzqw5m;;*;#X-~^i0 z`n%;T)#2jH4tpx+zF!8o)ZAlBq0{2%E{{1ODbaiK5)*;Z#{g?bs1A4OY^8reH6m#s zuYi$ZBd`b2fO8+)435^SAE>lOG*)GMZA$=BlJ&)M##LwvpyhIJh0L%5(Q!K5(3K@) zFACclVGW_&HOjL$g&|@gdM(idOb0sYOIZ5y5B7udJ1E6kkuER8S<=2v z*b0zx{207UUFb$ii%3UpP3VNTV0384SJ!Z}x%$IP{N_w0eet}k#>^~iJ>v5RB-k`} zrq0d;JsmURuoBlccyGo}cf6{xdSWkWpE3B>`7FSf#rcAnLxt7!3!3i=4=fhWT@BBZ zDQ|pLFUpv-1ITe9Gn2@}hQvAK8jQI-U7IlfehpWdu@+D3EY#d~W(4(26)<-A44JJ} z32wI3?DC#8Q6UFu!V8&sta|_U>a1V!@m4DRUS5e#+|Qy>tTw_x)r;6;-@eu{N8|sC z20YByi#?MHs}a?P#Nl)0%V(#oFDK&Q&!q9T8*di!x(Bl!fI;Y|hY|6!0D zBZP~E%1zijRsu$H+)o=b6Y(}i{2hqdN*z-W;lxSm8W#Mkh-fVt#jb;uCB=yq#8ty3 zsRxYFc)Ns)xIGUWYt*+*hRW{WG5P!t4o&vBr)ZbXh z>S9Hd4s&Q<#xO5>@UXUO{?v7$ywwY!MTS;P9V?$(P3&Ge61|e83)+M)W;E&4`8SGK zl_)CxJD{%1K@IGr8jybN8i{CjbG3(tN(*`U8Rv9xRKko;2%NBTrddi$6%VJGvk>E7 z^f8x~OX#n+{y8u9rQb`8_&a%eT%WbI^qd#bvi{#wKOfN??mF}C<&Ixg5RI7Ac25^a zIn|HzTaW}QiV-ki3YE%2Fu%6O%XEX(8yO`?3m#WW$K_}yfg?JP2 z89<2L>JQcdle}|!YU>JNVN4Eg)+S*Z=am}=;YLvQD_H|RQ}*4 zAb_>HOHpO7$FhNziBAJ^M(3OXJ)5N6m7#L{{x6)hs!OUdb&dQcYM_~_gR!enC{SW2 zmS+b~A0e?z7_Q0m0so4BuQ+B*q^%_(z%brzdAddYpG*%7FV~9YHIdbU#*?z*9JTBMPEDQbtR2ug@fk5DySm}6DZvZO5`WwsX+WIKSdGl%=`a^t zjHClajU-stIC4BM=LHaCfIZxmW|+tWtJN<8|QGi z&uI9~3P~$K&O?0kom>V4urb;g#Gp0{CfyrF{@0ACKiN**PP7DXkjuy7wZSC~g$Ro5 z*D|1|#IZ}^q8_xGaK=4KjL;%ljamh$j*6=qt8DY+%Q;hP0hXB-8441|9T$!!MYEc- z`k1>GO}34}nOgGx%Tu9&$M1TK$}U69z}UyBcIUP!yxokHJ7&5>|pL;N9*j z-$`*`E;fgtJyRdmlmn5k#;7|&#ORb;HE;Zl2%|ej{8Tt&Vv_&l-&a|1=-el%-Ad0+F775>||}cb&Sb0gQ~r^BW%~+2X0> zYuGR4oE#c`WmIwU<6PcC{_Rj>@FvzghSiKYvI5HVXw1?Q5 zjnsSv(^O?KSz51xjK#$wr!GYjNsnPbx}kg#cz@{r-B-N%Mu+`o@H+x5QoOO!v1_W{ z0D5iJsi@RrF6`{Fcem3-%NF`JpK3Ops5_-6X!jGZ;JHt&kmZULTO{ynT}i+IW4jN4 z$R^3Jol8?%LIvtuW7WZ=kz3-Sl<>hGn#2}}%;bJx=PQRPUAZ?(LN^_rD#mk{HJtUh) z$Bh4Kz!3v0lsMmPwed_+qfDE$XlAm;-;&VcqJc&KC4L>Y^7VPRpLwW(6s|6EdK+}n z#Y>Et+66iH4zT;C_EgM$uVT}48ph7QZT4!cnhdV!yYNCQtx;a_A+DqeZFhk#NDYjp zmw3|sp|e3%>6jq0(7_Xkv)x*uba%?d`d$Uq|NHHgi@3JUe>-y-Ara$;96&VUeq$^8 zM8`~t>%a0PcV#5!MXvSpKp#gz|E#O0h6X4COHk{)(U4$Hd`G>RfGQUOax z5vn_xjWXmC%rZI20D6ACU&S*J9daZ({~5~^r*T)S7K4tu{~}HxN0NxCI;_#iksqqN zngUs$cDCfrc>u7e5a`$^tPW=MzzCI}ZVVi2Ot0{^fOz4HV-#{faTx!9(f-gG4d}gY z@RR6)kKl{j+%LC01N!B!NcW>u#;TFI-)ZaU#niQ`&&AfXf9>bBMapn#IvmCu*)npG zWUWPPwrfG^F!V9Au|FjEp(P-b%7o7L+Gwop{OWTWd~wKi!l~+@8pseb?tR6x|JkT zY|m>nqbTeRrwJjp9sA7l*gSGxn)kG?85Hy*M^3n5f*(q2!RaD%L@NJ;UarOfrWL~R zqDG`{OkIzWcm=zEde#`c%PSXfh`Mer%Ht&~0@%Soee6SRO&FPP?$X25ZfrP_uKckR zuu677FGJ2?a?(WGY&#BE6g8&($ntPd)->X@Vtm_K?6l#$|H9hY#XsfmU$w2q4CEo| z{UtRC8YX4Ia_ABsx78)C`YN1T^ni`g5hgiZ2QsJjR&c#g#nNhc0+AXCW7=yL1evYY zQ}|6_IvV5jF$Poe3*v)h4S6`533o)x_KgIv1GC{;LZ!$VK;|%-k~+0n)m9RB(E~kF zEn@Uq*98smu0-36i9NxntO9O6)EnSxpDXoyYeZ08Ye^s8yo4~bZls>+1ygN6F~a<# z4S$UX8;a#xR@r?yQlBs7*SdIo5s>6;uf@7(lF(a2*W)E@NFg zT0k;J>(=WM7r&=h7!x~-AO3Gnj}BAWf_mce#>`DCyC$xRV4_L~=89>>W}%wfGVvQF zX-O1+-(6)nPS8gy+(vf370v-tD+}S=G5;&(2xxNxI(&4cn1OKWVv#g=1x>wc>5oI3 z6H=CIB1a)`%(nn%N6+*9QF(KVZybZ;ZbHbv8pXwJ-QfE z(pQ?TuDOij228N2iG@-*u@m6tAPR&F4&cc_S@b8InJRpcHkDYDQ}g06RE^161v)?2 zP26C@W8@)b9NLrWl#8Kv@Irw#qs0mEf>$M%T!xT9uxO<`jP11|6pEWDkbe9<#qLv{ zT|lJ4SdTTtdNBbbu1p_A)WgB1Eh7&7Q7~fP@ew~}u|A?C@wmFP`wyK5u zOL5i`Oi!=2eW@eDP*4M2mf32hQxI8cCCinmyd?Z}!th3oQTAC_AaYqOqKAO_j6JZ= zEQhB@K>uu}cdOE@w?RcO++w#9FHTb&VWC03oj6!tDd%^c>GJI>ywg`GKL*~#OYLucGdfi zVhq$;7`>K>iI3m5BZo@BRr}VFU}(~ck!Sr~TIgrK3B$-&i(Yd3dF{zQf%WMfI;Dm~)aVsDorU6mnd^GRI|^gXx>&w~^I zB1fvCA=zX=*`$&b?=r^~5@zH_Gjl~n#Lx2$mB2Bqd)xQrV%^7!>D-BnflZ?7GQD*B z1fNkg(Wo6kQKc*a-Rr&Lwl9!$WOUCqavj?$N1FbD1Y?Q4M+h&6E&y?PQlHl{wt~48 zqF==stA;JCV^$(9$_O+kjX=tPiFX2%UfxRy;~Jd@x6@MTqqse7xvY;Al;YlX0GCVG zy^MwpFK8#ck50};yw636WZuTmy&KjH*Xd*0%<<{bf1`cnb^wo*Ps~v%tikP{=(!m< zqo{XRM#JA^=@Qx+c31Ms6WRAhUBIqEGj>fx@VH-|!rqJtMT`*8?XQ6>rW4b2G%yFg zfcUdS?xzpU&b2U3HY_Ey;R=vK=|UrSh&g+?_|Xi5$n4*I6zS@7ijFWanH@I@Ou;bjRr?%s%aw*T-D>IozM+D3R3PnDA{?OFE+eAV9SbfD9j! zkl;(QxiCSrRvgAoCmhx%u0YXc3JcJx&0Hw^nHqghJ-enW^+hEh%8}M*t^sM5bTel6 zi5B_bj7OtWuHc8PWeyn1SfVyjCb(5mFQ2QqZ>usT9>kSlzRHcDZShf6KT~Wa4vHnh zgo{q%uh&|NYDM<|1Y$2_`VgZ9bqW3r)jS8OBTTW{3ly<6u6$A4Lv@NOg1*2=Csrm5 z!)7(IP*dNA7qbXll2_Q5!!W=YLoP04A4;%iOS*b!8c;6}BCPs4u21ZA9XVIVl>ieL z3Z=}vML+~)b(gev6CM*E1y3~tBQ>LuScxy~vOtt%kn{*6hi9$CR&1GX4&G|E?jR8B zkT4u0F$Gl?g-CM1g(8arHR=ZH{d&iFedLzK7*me9am zJOopVQ@=Ujk>a80HBp`OrsCIW+o(DS7;`A>7mBCF9QSW|_P?|njS5VG3{@!$5$~Zc zj@z|B%TZ^oN_gL_)+am&ycaG-BgO4h3t`eLT1bn0jZ;tdXU!?h9Ky`{YQo2m++lFD zW(B&V|4{WQM)y$fv$skwizL&cSGOB#BX)$uzr0Qb|w=`@cb%Af-XM- z8z&wU^?7_<56r+`N7WFkusTbyQf#kYh1MgW!1cgIZUUPwryfBHvl*}$-!HgECn63?q zcuQ2kfH8C#O7=I|<2*X7OBhWzM#tMFL#Yd40twHS>xtGd6mJpb~Bp*LZ0M z`h@4wu9DCQ0T+PBg;ww!sJWRD=IX_Af++#AZ%OxWHWIrHn8&Ec;Q%?!sVn2xO(zQs z5jH|^MpwhZsZUPSX9odUghm3dj<4@EPXVw;W~y>o7bQC23QM}Fig`nI8hExzUfzh& z6{?6B@M!#|q+mbO;nQ9tew8e3=0+6VOBE;1OY;yZobjG0dNglpsfJso4*{V-bgG9m zNekQ@AFEcf)h1oUkJo@pb>;uXiHq@3ut_eprGRlG zT^~o#O0b91^3+D@QC{F$aI&G0RigTOX~XO@WkEIT9ZXYs8qp?MW2Q&%C8HQH^zuRP zGL*=}PQMaOK~1RFi)D@Jn3N^;KZ@{w&%J$efcn$B8(KHMAGS?p)S4C)VxS@0cDsee z8-j#7qrwDnK*`E3)w|Ogcb5__EdzxB0S(Cj-kfF;FpH~}AZ-g5cBW73FrjrLpm%A@ ziJt!<<~_OV?F`Yc5c7*x-_5uwq9(Z~@GLb~MZ0r5%XOJE>ylXfVj$D*(#+0Hytcs_ z&>YOY_A8yGHegu^ueorxYRL5?(_cxK%39JhnC*xq7Kn5+d0~1IZrB4DV$1!YxW>#} zscJAdzA{}M^AG=`HqjqE9zX9i3{#EY{MML0)MpG-SGsZct6?CI?M)ZuvW&Wv3(?|X z?g-(cn9(TAR>Q~E!>6wjSdTQ?ivJ#9VSaoO4g+!gdWZK;vpR^pyg#x)pSC;(Zu@u= z#zz}^<PiKZ5FVkgNo~zn7`K z+%(rW6Mt^Ft_g2yJuGoY{UX(!I5wTEP2rXgZ3-luvlxSxzh~v(ptbGNk8d6{#({sM z2H2cjmclau+O%V}?(l;1XYFyW4sRlGM6je4&IvHWkm> zGZZxdCR<7zaQ6S^&~*$>q#M>Rujo561!H1}Td8w7XrQ4ny?(jYFv71W1G5OK)$N?E z1}qxW?f)`ht;FtJGC3>>Huy;>?)(T}cA@!GTjX`?075AZ(!F%OtjThpHn?zL# zLue+wr5`!3kEcERLR5Ny`oQy;*vK`*`(vh)c)Czv{4h5Y1$s8e4=)9ei(%{!EUE!7 z(?rsaXKl`=6LQm;>=5yORL$Rg-FM+=9bx2aJ5{3CSOdHk<2*ekGY7@(nAYWO*;_I9 z!^v9>-ZMd4O?Zm+LG7BXbbo8Sflwt8sR-Ic1C&UpTn3@zD;ZN$79=C#IWZGJ1AV}t z$$VUi7Ryek;onz$9UqVoF?$L}FHqft_h2ob(ws}7MOTG$(ca>7x&>0EK*45UZi0&X z&=vIp{0J-1Thto_ecq;-WUobis%wHh%pg0?yJhqN8>cH&I+y}*6OCwJTWL1DIaiY& z56@-kcCn(>+92_Ph7`@TtiRNPdG3JLp9$oY2_@^uzE0Qu6qo%U_OR?_W9cw(a8XM- z6se=y^7TaKWWg;(XwX+^_Q02bd(&%e#d2WKK6M9LRK8h}{!d(;jTm7b?~G)kQS=VPv8|3mQQ}rhk`A=9h^58+Hlo%dwT&Qh z8E?TD;KC-AE_k#kE_s6_#gb>~C%M(0rqBB_0?SLQ!Fz%(mIy;8tu-(gaY~cqX>hJI z5XDJWgIkLlcJ2Q>yk4xej2b_nUcM{&WrfFgNM*P{x zcc80SZb>&_HjZ2ZYK}ne;!J1aMsRx(W)btph+2=-J%Y>8wCXiItG2{w5gxT(XzV*o z*q|91R|gj(dDduA6hia@&sdW5>+4!EFkb7(u^vrZo;|d(2w^xpFrwS2h#;72Mi#>k zJPaj^eTr~8=>8GoM(jIqyZB5I$uQ~_SOZL1@*MN#<0Ju%+;`wsaj-Lb8G+gA+h}zd z+8`d-qzQZtmKucJUPLlw{&H*AU1_D{;H99E#gsDC%ccHM@I#CM%F zq!5QL#A7shf8mjtwCz|$i4VcdOXE!Zg$Ig6Fy^%zDhcqy5~B+VN;@Gg zOmyi+^X}ilUR!Y^DLdu>QG}l2anJAHu9>$jX-pdquL4#vs7!> z$8kn|RXLz$sydo)&W*kUtd0=e@%Ot&kHqsvs@a(LpeNwuc^k49hdZm*fRau}oDPxI z8lEi@-Kifq*CLFlhk-YH_C}c!Keo1IlTJ$v#34oPSQu$wq%WKL<>(XwT2zG8muU`A zAS|yDZnS3RVK*I~GgjSiEd|=XxGLgcpq)pE+_;ejDBrnF!m(R8KhpKWiRvS3xbs}B zWO#k$E<)gsHp`XDF}s#HAZr~E*mcG4>k)0V5kY&>oR>{Xy)uXPw-a6VD6Ced!o)O9 zwy*{XMp%lBnV&~I0o-B2CQ!WzZ9^#aZmAK@)wqp)ST>t)@$0&u2zD{Rr!HISLzc3U zdNFlMdLvFdM&0GOw_7&!qVP|GeD5oDHo}D1_q`=A>BT*(hD>{jpFKz%l!>bgqzmn= zJQ03N!u&*oF;izn2T@0}gE4lgr7uzbWwpv;rZAdqp~xl?oF#}8cpn`~R9J1tbOOIQY2@qE zZXm#FiI8`hweqFyO7-fm!mK?toKFmIi;S+0H9TFJauHMzUO+ce?F;bjOEtEP2Sq?N!P~hr8eR-eUx+`<{8vadWxEU5g{pHmvPKvlMU-98AF&updW7FK0*-iKx(HZ7e zzqHx+B$)0-*k;1oc!js38SytC+ajh#gKw-=sU{@M71EOCF}BWrLb)}QWPZ}RL{R(D9Gp>Xm@jg(Rsj}`tsI6aq_^$T1cTn@J(HGv2o*Y&#ZJ?ePqd!KchLFh6 z{i=K1Jca?zq-)~Dd*8hOHuTgfkWKeEHXl-QulX^GG&JT%Hai%C^b(8)AKxoa zWL$Yu-f8>mjCq5*T{_Eww(srt^$Ra)UM|;ne!Lhe?_6`t{Ne9YVKX{Bqa)Yw-5n2u zp6ozYdG{X<8LK#z^w>ITZN?2-H`KL%mX^8gtk}WWrrX_g2>!rBz2iG6tKVjMH9jjwsYUh^G zuauqDIk92nc7*r6+)w*2930;G%lyf8S|NV(HAF()h8w%L8~9G?@85l2^69CG%bVDM z?sMj}`&ZxW+~9d|Zg7oWQey1-@nzRf@4vQinv{NU_p+TX9xpKs6#v-k!W=?MLgF?a5Bv z@*QmX+V;1>-E2Fj?$NS!yACWp;8NhYe79SO_uUO;pLe#w_jGmC7Qg(xZJSB=guh_B zpPv=1^_+Ri(f^gKyJda*n=Itk#|bBovF*Kki(Fm=7u|DwfD20;tAFW;Q2q51uQ!KKHQp=17%{3p+Sd-i}`CUX_-$$5@WU;9ekTnNhhd*7cZ zqn&Lz*MIJ-ecFu;-=7Ao`$>4+Z27b|o8X|ge|f`m+u(w4pPmKV_`=NPgg8H)c@^yTk_A(|7e{#N&NWRGU#da(N#|eo|;`~ z-{rV+`Hf}&mX!n@+$aD1?n$ZDkV|=4KwxS39R7A+eWJA?w}0g67ofoUktgF)AZk3whqncsoM zqe1ry+U&abpEaxeVQ3S6-ZJjD+mi!Hgx~+Wc+dMgP&W7}Xw~iRsPeE7vS`lmTH)oU zD?6@Og{^*Y|1J4F&GyNjmPNhCj~lj8Rvow>nlkm{@ZA*2)?D8UW&4hGuP-1J_R+6i ze{qN@ynNKx@!;Em_t)uP(kQkzj&WyyTi;)b#-!hWUcV@I{lr57EaupulB&c4wey>3 za`Eyv_YCvGnEycc-i*httM}PJfW$|Q_Lk%rU4JgL|MmoY_563>-NNfX)>Q@kcDQR~ z_7rg-qTF`XFxKKuV94e=|yPZCUj2eIHjE(>M zLlEOmvuvOaM&YrVFA#b{tJ?h@W0!@+6 zY)*R(xgWcOe5}|WcKvhgo5_twa3O13-ac6?dN*d_FtJm5?bOvXxj?X3cw}*1a6AxVOfAsCK#pc@wXqzLhON#cMKKDa%*+eY@?pX>!6>lhZ4V??17g#Rr^HJ^L%! z&13QZHFnlfaXjhX$K73m+u-g5hu|^{5C(S`2r@V%B)9|!3^QnO8wPg|A^0G{Nr>Pc zl3)oE;PTtMyYIWZ_uO-fXNY9bQ^GaIbR|oQA(XvF3ojBEB<33 zvt7PAt5nC%Rf~6XCk_PdUQRdRC;GDDl_L`Fr~Z_Br2=j!+w(C+$CAYDz{_+JrG*sT zY2kcg$W3HX1|F#f9VXk2n@LOQOnr1A>m(zVND=gB@L=OFH4va-r6W)~lwh%7t}0(F zhjVS}Yr@oREC&3lxFL>za3I&ipoC}k(Mzr?-AVJ>L1qQ%)W+x1tq^3I97syGj1XvF zny*VupG&AY7HChChNQXdTd+A>fmNhoeagityP}fB(<8{Xs8>7k5?pn&^+*-nbFX|l z(Fx&$DT^2;Nogd7`^;QXPGT#$BJ zpT$XXuBFBF)`OKP^f7QHcE4#`R*}c#dPR>k5IastZS!=nZ1ZdY#BYB_}MR=SlTUr$}rkaQ=!E+B9hVjSCE|RbU*R7BgB3 z?}xR!mSec}`*TzeXV(+VnIf>nC#T%Y-@ypluC9Q{XUN&A{*xDD?jSVx0FE~A+3WUF zK*uee5L|yBV6pfka~DSq3%n#yN`gP@K4ZJLYDSa*+xga83DV zr-&cAhEKJeX`)e|=9x8>jLoX$O-+Ap7J%Grls}b#!<^CXVd8`!eF>yEfTh}gwJ|Kk z9I{VfdV?tmW3haYg}##FvT&`CO}au7oh&%NviL~y!%UD~1*vbKPYhO|?oHyvz8Qv# zS*rGc0v|8wGj>({sqxxxqB%Z)M61CkY@;iyxKAhFnw+JHmo?&zO5!Cx2=g-EmX_CI zNe#+dX!W!4Psta(HhW$As0^or%+!2AIA)UTiy!c4g+Qf$@LtC32&!q6a)@yH@0UQ**~69FwrwaN2$!$Yv8CL-Ew^67uj$d>JFfuAi_ z>1mVxI<(e}ABdk>li_zpjM~0uY8DSE3&{pS_3Ti2bA;N`MuM$F-0o;_V~TX2M7_NZ zVr~koG94b-rK9Xt*FDo0Ge3m#paf#WewD!hvz1nEasqXEDR(y0Vt(%JQC1OAyB3Tjn_44e4YmLt68?MfEO5 zLEH0{b3b`$G_A`hkpgD|si{{DPH_g}L>RvjAQNjB3}L7kPY7p`i6~WfpaKT80UyJ| zxV3IY!YO~x9+a=tC#q@kTSHI>l$091$6oKP}|wY`TMb4NjNrdc!-a6b!Zy7Sos5b64y?#HZJ_xOab|FBK#M^7EysrLwBEkxa3z3|3O zj#+_jU4xmMuTN*=njVXJR-KJJ4;Tg3EryueAC?!wqzn#xnx_Hr8WXr;)|J(`aoh%& z=PSfu*ElL5B}rL%E`!Ykb<_Eq79+ll#csHA!UTZqZN(zjb8lEk}nJv&1>-~)J{Dk~R z1@C?`sYOE+J9n0qF=xwS`Uu9`_Z&e5KgHoY)Jih36HyN7s9t0gkOe2!DqTmEgk4D% zc3x+o`OrRxO_&jDU`;5)!tS-_G4K(4t(9JeiQt8c^-qmW_=C_vvRXUEGjm+i(ejYG zgQWo_Jz}z5cd&|uSBn&fzbwgBw@HmWz^q+5sNjtHiQ9;8aLSL%!1mWs@j#y$XzBOb zg^smksbr(pq_<@f1DSS~3HkBzgk(SL0M}C{lm%}GKQkC*ct7k1zdWE_=+w@V30FI~ z`Ro}o=PJJjJW<0Rb;tnS@-1DtqyWlN9|*zijZrumBaETB0^W20mlO#&t97)i4V&@U zl#NuYw@8Vbrm%?c1W!$DzNsXcL|(U%%%)kz4APw-u^8@kHlP~APPaJe7UslLmmCdGZ zjYdUp=>IGu>2uH`sr8b{R{TVa^#=qi!8nE=2sQ}TB{1J?G-*bX+h6AuzwsGr$JT!`U|07-SmVHJ z#h?PXIA#%@Exo)+aihd3G}-iodHVx)QtmQ$T9$LoIk0 z%D1GaC#}I6OYubwbu+juOqdsGj*jh} zdRFV@1vn1m10jyVDCupt#ZKOrALz*ie~-!U`vH&4H0U#h<%KO;1deU%QmMNO@;y7; zJH)C{Q&|InU`VEtJ#l}f1JiEi$vO& z>QHRBtLCx>ry`ens$Q`s_M$+a@aW) zK7JQ7no4Hw!zl@ux=RFvS85{6LKbW&=G$DEAczEQz0x|9DQVItq9jj3&K?Pct-DYq zk_>I2ic=D$a2FRtmoUpWN4?5-34(*$&?8BGvI_~@5ki>)ZUXd$KZW0cGY;p_q>9X+cPr=RR6i}@UHG6l4Ue-c~K?SsEen{g|>SuI=L_-ePrIF6ucEXe*+p*k#7`#Gc-4uz4 zGXXft*;lj}p^!XUE5h%+dN*chqyuCIAOYBsEuE36hsM9*q6;z62k=@F&;>7`@>>?? zU8(}*xu?WOy=Q!lascX=p9t(_Jo(~^gI$rU858nziYCs9m*wRq0t1}PHS&T;>Ak%; zwTvc#^5}81GX;(SDq3M@9@8#6K7kB9e#zV%PXr5t8IeLWorLakgjn2*65YLg{}{3)xRgRXYa@82N}YZp)T4 zEmBO9#J%=L72sM=?AP{MB;#d$HHs~bp7YyulXBjUZ!W8LAAfC9rA3KD_+Phhtn!D}=GW5fte=t_T>vuaYo}T!5-$yT^_0l}z zJs#xcxH%iUOVf)L7?xD&oOhqmdJNFMR$nYLzV*&G`jHB{BzZ zndlNqU9LMxz#AXNYK~}ppy7Ip_G_OBK&Hy$ETW=d9z@*{))S4}7}VqkGSz09$%`m{ zb!;Fn*)Dic|*s^*i=QwxO9$ zZDIWVde((cdyA{lBsE!JkboxM%Oj#Wo$Po_?H%>+Y3uO`3J6jl&;F-rCWe}aowi%+ z>{7rQ?lv2uI;%dMiBB`P(oK=}k+dL?o1@#U@*oR)O|Rlj)c<@h(o59J=O(wq-zJ3+N{%WBA~ zGQNvF6ftj^8SlE*XU>C+fpkHWH~VH`bMQ#hkI#wi;vx~dcG?v$u3{ z((~9b5dSESSi;Op*i`t~w1SltrurUHZ$SrfowX454Yw-jG=T>&N#{(Ui*NOe3=l6K z6oatSGv=YIFLQhop;nLtXT!Kk}{M| zw=cg9C%fKfV`+tURiM=A*w&DK>+7ZZid>Wa(%_-O>6Ce8qX^B}dc8IoIJF`}Jp73u z#4*~g(Z-9`Rk#YRwVEhhn4ZNK)|z4wd!Jjz*Jq_O7o1$KMdb|3WtP|5r-DX@mLjEO z8)&sHd~_|}%cQ(n+R?Y0VI>LiH$nHFzj|R~X!L1jLDgHNhFExWV8dTv+2OsTfvUD~ zEtk!Q;c`4}IN&%r;!}-;lZNii!l2fjxB=_HJ8Rcd21t$)XC|Bxk?@hhT6j})QqhZE zijJ}5+-a!dz%`+0uU%t1O=c5wIFZZ8RZ6dq)C==~)(M0)Tvu~8(HR+7cdTEx#Fm#` zvu5U2JuXr(#4YC89<5WT*+*s>uPz8U3=`gtW(7610We7SPBCX9+%SeWPkabsoNwau zgBIqN(d_bm^Ll>H?Joz6A1Sr2C{B!Lun47QO-zIZCVha@L=B3+Cz=Uwp)IWp2H@AO zwQ&D2;=a&I^=z0LWJDg-HYAo*9vdtQwp+}9SX77%!>vG{k5-N_Ef1CluXzB<+#uAW z%e;97!8X;i26Y!SN})WQ(V4ph1F{*Pf^DNe)7Gnq8{13vq5l|K?Vrc}c~JVkq;3oB zX$p|}h4-GuCgD8|``4i2mhfY6?G}$OV46R0Uj|yLcN9QXlN7Zl*1@7^pR+(aY`vHe zCsyqEJmXc_=UH&4Oz_WO=ZDFYZyh$&$Q~QLLc%HZutbN?H>n0Gl{r81KpFPH z5aLJ|Ovb5LwPg|vDw!dhJ59cPmL1xFpBz*oVHr6=ghq3IDa?m-O;v_d-wd;L)?gc? z&gg8X?zl6D{n@5=H03;I4W5mIky?uK5)|74rp`F=9HhgjWfB;mowV@jWBQL=nJU2h z$T`41go`(Yk%chAbt^BhZoxaCcm*u-Y6HH+`=)YU<1%>_eo)#~wiZXZZAZ%VV$s#v zTtyO67Pjy7>I}y~uINHMw{| zgB3zx|1N>@8_IX$6;y#_E1yz8TIj1c`7W+)n;gp^i9?7zFg5xsF@N7Fm8rHoK#F#> z&QJJ6fWba|YXnm6G-Fa@_)a{gytRjk_=C-JnEr$xN$sCq7M_IH-5CR=(xl&Q)Gtr1 zimC~wE0`6dc<9)y;ZZ(MX#Dlt1w3PnqAavj zeKbzn>DjUZ2S90L!!#Hh;9Nk<6hy60E56)(5WpO8#F^@~6h4wN)tZ}|Hg%bM?0_O# zyn}>5OE}*xJnq>8Q85Z^-U+-M2rA$X4%2-jfPr3@b(7gj}dG0*=5M@nK+v_p*LeO zu1vV3hrXk(Tz$YcRds9k3vkLFGc>Fr7C}8QZra_0a2(-hs$$F$%uB+pDcT1j4L0oJ zHRT%yZMOH72GDq?<#7PhVXiIGN0FK*{*Dm-q@Z41dC{X_^hf7{!ZH?0jUUHiyhK?T zX~CPBhY=Oj(E6IQ?$Ufu*dxURX7eqMUndluy)Tmzm8hnN;q(bztvhFaks&WHjTAUQ z>|FzY8At$WW4Uq6`A{fjz5&HHABRbl<=z#g#vw=3`hc#j)`2*MzZvX`PynrEu zmc(gKEFEOdMQ@Eq>j3>cIUY7l)>Ye0$XN8tJUFqgBaiBo!KeJoD?{ z#3^_WFu|vJZ@`m+di=AwQ#o@SAVAzl!a8xNXB%i#P@M#|)I3+sqma=;g}v8BsF?MU zPMGXB1eLDW115|4`siVGG&&kKN~4{S(>BR6H<_>)r${aYFB?=aT&yobm%L43jvWjg z*XME`ydjNE*o+gV4E1j_<=3lx?Ms)rU7I;;p==o9L}gCA2V+hvCJ%NaG$4O6L6pgC z!M0SsQQA$0>nJu>1q;(&xz7u0HLfM<8JLfD$xS23PGB64lP@t;B$0kEk+>#8w>}mk zO9~7n<*Q0jp8N5QhCPTN{VAiq`6~I>uj@0z{J->0F=-ekBCXM{*>b7kZg*_VLE-}a z0H6axbIZmCA?f2aeiY*?FKPz8MzQ^1l!=_lDH$(u_JZm9BaR<(bBN3xtt-pv3GI<;FBR3gvd*XQPzXKI#WJKa~q zfeJ2KH>za6;A38w4krvumr4A|p{_0q^;DgU<0o~IL^u=M+aV%C!-#=QJ&jw4c9~MA zI$rF=?KT3O!iLWN{CX2{`AEBURn1hD#bbqCR&PC9V?kM1{BrE&bawC;O_UlP-fG-Z zV8*+N`)J}qC_27*PRd(DSW5UJ+WA~svrbcnHSCJY;&gM@b*t(ROG2Rd2i;FpC~&fFh-f0#Xjqnfg>$ z1IBWjMq@SdCl`bgfu-OP3(@?qI1O(J(Hh%L^X$DWS>$t>DOoQm7rPk4Oq*TZ%X7LW z1XmhCyGTa*VkLkbudMdT1i1+g|B1lu%~^p;o+9T zQ|2^XTFp`!()YQ@F+CO|j>ex!PAf`3H;p?b?OoU@Q(zt5RyV@SJ5GscKtTos! zjme3T6A-UxsQXT_97H>zfb$^Z3AzdmnkXuIE&sSnn? zO>QCc|K<3&eLY^}^{l95z1_>ryZ~WOmR{8t;^a->1!XlkZAG=9T;F*1pxU^Zo~SOGc6=wLDd-&!|MdCpMA-FBy^;PF4Aq zqQp38j8Y7pv3XOCgqRALqy&mIo>1jF<}^6ht}u&1`HADf;jR^xJ3({dnvlk?(}Rm> z?;>-r((3K@ovkgl{%?W`G*g+>F0s)#btM*GG`=oEp*U$IpI%XRi(`q#e;*=v%1}bA zaq6%~Ml$uhq)W&^7B_+)t0Q(B;ZPO39-DZgrrE_V@RYc6^99+GIzJ9QSa(RC&gq6o z+$T=1LA}=O{`Vh>O<>|VU`UQe;h1lzi(28FcSxREW=}scm`5{$N+F2bd*&6zwsvDL zfvHg}fK9!Ym}4%+WL>rK2EYA!O*ZU)zX48@aVmDxp48!kpzlo2pW8jL6MQcy*K?$4i%(EUwMk zYA{?&!{`UGJ!%dooHw^c2RD0cIF9J%w}lG&C-B$MA5i0&MA~7CkmyDkr5c9j8&iU! z25;cGAJwe7Ppi24dZHR8JR=J>iviFPG+M}L-z?ss7ucgY^fR}{(%03>g@^LxF|6gW ztcFfy8lfZxEDw0b=p{D)upsDM^haa^>?jS+spGwv8b}E5gUGdHF!1BfZzM_Dy+l5= zST#;B;_`gOlxy;IVnJg!Er?aIfss`f!1#ewF&=+RIkK8;pc@(^QE##RR-&9 z+|BokZ1|cTFVimH^yC$t3Sasxof}#Fsj!`Tev~ZRE|l<*Uu*C!UdC$=^^a_kfE=ll$#kFTS)(sNnOyyADYmyYo2y-ADI)$YN(V zZs|r=Kj)5@BV|)`75(R1QxgB`aIy+%*v5rdhpY;D9^13$BK>YdY?FVCP6Jx* zZqR2`L2Q1U%buRX`=%a*beyPAAIslW2_HE=bYef= zF|kEV$7Vm?$T44tN$>ch+1)41dn!Mye;55hGCtSX?m%}xm)wx$x&_wU9$nP<-+iUq zy$Gly329PZ=6%=RaAzGMb>jcf_J_c2+UN4-yZZT)`n&u;WW%eRJGXxtyt4N$Nbkxo z@TZTIZtt*7^f9q$uxT(b2naARFx2iV1_svOS_}-_zuUh|dDLGmP$V!k@ZXVr-9hcl z`T#_>Ze4B~&# z_qIH0|Gsthb_@t`4G@7iLjN6XT6d-YOIIc)1_sH$fEi?17=BP+_aH~8%m1V~{XUzU z|29gzefJYY~uXW4F$%L8V&^(2E@lx^nWAB{)GViop6Lck&zM( zmUH|MHbUog<&FyvBfXXsgZZEAU-M}3AFQ{hlYfw>vlk>lB*6E76G8FMf&P-6CPnZ! z+4mw`9i2RdgJu6yhB$BeXVZLKjMijA43>Y=f5~|BKhXbYA%CsU|1N(C(VHRtn~+dB zng5uF1sshsT}M0&_Bj#^+J8Xzwmb^@|55*E$Nz6h{^j_)IL$vC+sjD(hwtI+PNatf l9)^hvDF(y8_-2&&7x3TQ Date: Thu, 30 Apr 2026 10:41:51 +0200 Subject: [PATCH 050/143] Trakt Episode Mapping for Trakt Anime --- .../details/SeriesPlaybackResolver.kt | 36 +- .../trakt/TraktEpisodeMappingService.kt | 492 ++++++++++++++++++ .../features/trakt/TraktProgressRepository.kt | 30 +- .../watching/domain/SeriesContinuity.kt | 24 +- .../watching/domain/WatchingPolicies.kt | 6 +- .../watching/sync/TraktWatchedSyncAdapter.kt | 187 ++++++- 6 files changed, 756 insertions(+), 19 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktEpisodeMappingService.kt diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/SeriesPlaybackResolver.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/SeriesPlaybackResolver.kt index 3c3374fa..bf4b6744 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/SeriesPlaybackResolver.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/SeriesPlaybackResolver.kt @@ -85,19 +85,35 @@ internal fun MetaDetails.nextReleasedEpisodeAfter( seasonNumber = seasonNumber, episodeNumber = episodeNumber, ) - val candidates = sortedEpisodes - .dropWhile { episode -> - buildPlaybackVideoId( - content = WatchingContentRef(type = type, id = id), - seasonNumber = episode.season, - episodeNumber = episode.episode, - fallbackVideoId = episode.id, - ) != watchedVideoId + var watchedIndex = sortedEpisodes.indexOfFirst { episode -> + buildPlaybackVideoId( + content = WatchingContentRef(type = type, id = id), + seasonNumber = episode.season, + episodeNumber = episode.episode, + fallbackVideoId = episode.id, + ) == watchedVideoId + } + + // Fallback: if the seed wasn't found by season+episode (anime with absolute + // numbering on Trakt vs multi-season on addon), try global index matching. + if (watchedIndex < 0 && seasonNumber != null && episodeNumber != null) { + val addonSeasons = sortedEpisodes.mapTo(mutableSetOf()) { it.season } + if (seasonNumber == 1 && addonSeasons.size > 1 && episodeNumber > 0) { + val globalIndex = episodeNumber - 1 + if (globalIndex in sortedEpisodes.indices) { + watchedIndex = globalIndex + } } - .drop(1) + } + + if (watchedIndex < 0) return null + + val watchedEpisodeSeason = sortedEpisodes[watchedIndex].season + val candidates = sortedEpisodes + .drop(watchedIndex + 1) .filter { episode -> shouldSurfaceNextEpisode( - watchedSeasonNumber = seasonNumber, + watchedSeasonNumber = watchedEpisodeSeason, candidateSeasonNumber = episode.season, todayIsoDate = todayIsoDate, releasedDate = episode.released, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktEpisodeMappingService.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktEpisodeMappingService.kt new file mode 100644 index 00000000..aeef2ce9 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktEpisodeMappingService.kt @@ -0,0 +1,492 @@ +package com.nuvio.app.features.trakt + +import co.touchlab.kermit.Logger +import com.nuvio.app.features.addons.httpGetTextWithHeaders +import com.nuvio.app.features.details.MetaDetailsRepository +import com.nuvio.app.features.details.MetaVideo +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withTimeoutOrNull +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json + +private const val BASE_URL = "https://api.trakt.tv" + +/** + * Handles episode number remapping between addon metadata (which may use multi-season + * numbering for anime) and Trakt (which often uses absolute/single-season numbering). + * + * Example: An addon lists "Attack on Titan" as S1E1–S1E25, S2E1–S2E12, etc. + * Trakt may list it as S1E1–S1E87 (absolute numbering). + * + * This service detects the mismatch and provides bidirectional mapping. + */ +object TraktEpisodeMappingService { + private val log = Logger.withTag("TraktEpMapSvc") + private val json = Json { ignoreUnknownKeys = true } + + private val cacheMutex = Mutex() + private val mappingCache = mutableMapOf() + private val reverseMappingCache = mutableMapOf() + private val addonEpisodesCache = mutableMapOf>() + private val traktEpisodesCache = mutableMapOf>() + // In-flight dedup: prevents multiple concurrent coroutines from fetching + // the same show's addon episodes simultaneously. + private val addonEpisodesInFlight = mutableMapOf>>() + + // ── Public API ──────────────────────────────────────────────────────── + + /** + * Resolves the Trakt-side season/episode for a given addon season/episode. + * Used when pushing watched status TO Trakt (forward mapping: addon → Trakt). + * + * Returns null if no remapping is needed (same structure) or if mapping fails. + */ + suspend fun resolveEpisodeMapping( + contentId: String?, + contentType: String?, + videoId: String?, + season: Int?, + episode: Int?, + ): EpisodeMappingEntry? { + val key = cacheKey(contentId, contentType, videoId, season, episode) ?: return null + cacheMutex.withLock { + mappingCache[key]?.let { return it } + } + + val requestedSeason = season ?: return null + val requestedEpisode = episode ?: return null + val resolvedContentId = contentId?.takeIf { it.isNotBlank() } ?: return null + val resolvedContentType = contentType?.takeIf { it.isNotBlank() } ?: return null + + val addonEpisodes = getAddonEpisodes(resolvedContentId, resolvedContentType) + if (addonEpisodes.isEmpty()) return null + + val showLookupId = resolveShowLookupId(contentId = resolvedContentId, videoId = videoId) ?: return null + val traktEpisodes = getTraktEpisodes(showLookupId) + if (traktEpisodes.isEmpty()) return null + + if (hasSameSeasonStructure(addonEpisodes, traktEpisodes)) { + return null + } + + val mapped = remapEpisodeByTitleOrIndex( + requestedSeason = requestedSeason, + requestedEpisode = requestedEpisode, + requestedVideoId = videoId, + requestedTitle = null, + addonEpisodes = addonEpisodes, + traktEpisodes = traktEpisodes, + ) ?: return null + + cacheMutex.withLock { + mappingCache[key] = mapped + } + return mapped + } + + /** + * Resolves the addon-side season/episode for a given Trakt season/episode. + * Used when reading progress FROM Trakt to find the correct addon episode + * (reverse mapping: Trakt → addon). + * + * Returns null if no remapping is needed or if mapping fails. + */ + suspend fun resolveAddonEpisodeMapping( + contentId: String?, + contentType: String?, + season: Int?, + episode: Int?, + episodeTitle: String? = null, + ): EpisodeMappingEntry? { + val requestedSeason = season ?: return null + val requestedEpisode = episode ?: return null + val resolvedContentId = contentId?.takeIf { it.isNotBlank() } ?: return null + val resolvedContentType = contentType?.takeIf { it.isNotBlank() } ?: return null + + val reverseKey = reverseCacheKey( + contentId = resolvedContentId, + contentType = resolvedContentType, + season = requestedSeason, + episode = requestedEpisode, + title = episodeTitle, + ) + cacheMutex.withLock { + reverseMappingCache[reverseKey]?.let { return it } + } + + val addonEpisodes = getAddonEpisodes(resolvedContentId, resolvedContentType) + if (addonEpisodes.isEmpty()) return null + + val showLookupId = resolveShowLookupId(contentId = resolvedContentId, videoId = null) ?: return null + val traktEpisodes = getTraktEpisodes(showLookupId) + if (traktEpisodes.isEmpty()) return null + + val addonHasEpisode = addonEpisodes.any { + it.season == requestedSeason && it.episode == requestedEpisode + } + if (addonHasEpisode && hasSameSeasonStructure(addonEpisodes, traktEpisodes)) { + return null + } + + val mapped = reverseRemapEpisodeByTitleOrIndex( + requestedSeason = requestedSeason, + requestedEpisode = requestedEpisode, + requestedTitle = episodeTitle, + addonEpisodes = addonEpisodes, + traktEpisodes = traktEpisodes, + ) ?: return null + + cacheMutex.withLock { + reverseMappingCache[reverseKey] = mapped + } + return mapped + } + + suspend fun getCachedEpisodeMapping( + contentId: String?, + contentType: String?, + videoId: String?, + season: Int?, + episode: Int?, + ): EpisodeMappingEntry? { + val key = cacheKey(contentId, contentType, videoId, season, episode) ?: return null + return cacheMutex.withLock { mappingCache[key] } + } + + suspend fun prefetchEpisodeMapping( + contentId: String?, + contentType: String?, + videoId: String?, + season: Int?, + episode: Int?, + ): EpisodeMappingEntry? { + return resolveEpisodeMapping(contentId, contentType, videoId, season, episode) + } + + fun clearCache() { + mappingCache.clear() + reverseMappingCache.clear() + addonEpisodesCache.clear() + traktEpisodesCache.clear() + } + + // ── Season structure comparison ─────────────────────────────────────── + + private fun hasSameSeasonStructure( + addonEpisodes: List, + traktEpisodes: List, + ): Boolean { + val addonSeasons = addonEpisodes.mapTo(mutableSetOf()) { it.season } + val traktSeasons = traktEpisodes.mapTo(mutableSetOf()) { it.season } + return addonSeasons == traktSeasons + } + + // ── Forward mapping: addon → Trakt ────────────────────────────────── + + private fun remapEpisodeByTitleOrIndex( + requestedSeason: Int, + requestedEpisode: Int, + requestedVideoId: String?, + requestedTitle: String?, + addonEpisodes: List, + traktEpisodes: List, + ): EpisodeMappingEntry? { + // Find the addon episode entry + val addonEntry = addonEpisodes.firstOrNull { + it.season == requestedSeason && it.episode == requestedEpisode + } ?: if (!requestedVideoId.isNullOrBlank()) { + addonEpisodes.firstOrNull { it.videoId == requestedVideoId } + } else null + ?: return null + + // Try title match first + val titleToMatch = addonEntry.title?.takeIf { it.isNotBlank() } ?: requestedTitle + if (!titleToMatch.isNullOrBlank()) { + val titleMatch = traktEpisodes.firstOrNull { target -> + !target.title.isNullOrBlank() && + normalizeTitle(target.title) == normalizeTitle(titleToMatch) + } + if (titleMatch != null) { + return titleMatch + } + } + + // Fallback: global index mapping + val addonIndex = addonEpisodes.indexOf(addonEntry) + if (addonIndex < 0 || addonIndex >= traktEpisodes.size) return null + + return traktEpisodes[addonIndex] + } + + // ── Reverse mapping: Trakt → addon ────────────────────────────────── + + private fun reverseRemapEpisodeByTitleOrIndex( + requestedSeason: Int, + requestedEpisode: Int, + requestedTitle: String?, + addonEpisodes: List, + traktEpisodes: List, + ): EpisodeMappingEntry? { + // Find the Trakt episode entry + val traktEntry = traktEpisodes.firstOrNull { + it.season == requestedSeason && it.episode == requestedEpisode + } ?: return null + + // Try title match first + val titleToMatch = traktEntry.title?.takeIf { it.isNotBlank() } ?: requestedTitle + if (!titleToMatch.isNullOrBlank()) { + val titleMatch = addonEpisodes.firstOrNull { target -> + !target.title.isNullOrBlank() && + normalizeTitle(target.title) == normalizeTitle(titleToMatch) + } + if (titleMatch != null) { + return titleMatch + } + } + + // Fallback: global index mapping + val traktIndex = traktEpisodes.indexOf(traktEntry) + if (traktIndex < 0 || traktIndex >= addonEpisodes.size) return null + + return addonEpisodes[traktIndex] + } + + // ── Addon episodes fetching (with dedup) ─────────────────────────── + + private suspend fun getAddonEpisodes( + contentId: String, + contentType: String, + ): List { + val cacheKey = addonEpisodesCacheKey(contentId, contentType) + + // Fast path: cache hit + cacheMutex.withLock { + addonEpisodesCache[cacheKey]?.let { return it } + } + + // Dedup: if another coroutine is already fetching this show, await its result. + val existingDeferred = cacheMutex.withLock { addonEpisodesInFlight[cacheKey] } + if (existingDeferred != null) { + return try { existingDeferred.await() } catch (_: Exception) { emptyList() } + } + + // Register ourselves as the in-flight fetcher. + val deferred = CompletableDeferred>() + val weOwn = cacheMutex.withLock { + // Double-check: cache or another flight may have appeared while we waited. + addonEpisodesCache[cacheKey]?.let { return it } + if (addonEpisodesInFlight.containsKey(cacheKey)) { + false + } else { + addonEpisodesInFlight[cacheKey] = deferred + true + } + } + if (!weOwn) { + val other = cacheMutex.withLock { addonEpisodesInFlight[cacheKey] } + return try { other?.await() ?: emptyList() } catch (_: Exception) { emptyList() } + } + + return try { + val addonEpisodes = fetchAddonEpisodes(contentId, contentType) + if (addonEpisodes.isNotEmpty()) { + cacheMutex.withLock { addonEpisodesCache[cacheKey] = addonEpisodes } + } + deferred.complete(addonEpisodes) + addonEpisodes + } catch (e: Exception) { + if (e is CancellationException) throw e + deferred.completeExceptionally(e) + emptyList() + } finally { + cacheMutex.withLock { addonEpisodesInFlight.remove(cacheKey) } + } + } + + private suspend fun fetchAddonEpisodes( + contentId: String, + contentType: String, + ): List { + val typeCandidates = buildList { + val normalized = contentType.lowercase() + if (normalized.isNotBlank()) add(normalized) + if (normalized in listOf("series", "tv")) { + add("series") + add("tv") + } + }.distinct() + if (typeCandidates.isEmpty()) return emptyList() + + val idCandidates = buildList { + add(contentId) + if (contentId.startsWith("tmdb:")) add(contentId.substringAfter(':')) + if (contentId.startsWith("trakt:")) add(contentId.substringAfter(':')) + }.distinct() + + for (type in typeCandidates) { + for (candidateId in idCandidates) { + val meta = withTimeoutOrNull(3_500L) { + MetaDetailsRepository.fetch(type = type, id = candidateId) + } ?: continue + val episodes = meta.videos.toEpisodeMappingEntries() + if (episodes.isNotEmpty()) return episodes + } + } + return emptyList() + } + + // ── Trakt episodes fetching ───────────────────────────────────────── + + private suspend fun getTraktEpisodes(showLookupId: String): List { + cacheMutex.withLock { + traktEpisodesCache[showLookupId]?.let { return it } + } + + val headers = TraktAuthRepository.authorizedHeaders() ?: return emptyList() + + // Trakt API: GET /shows/{id}/seasons?extended=episodes + val url = "$BASE_URL/shows/$showLookupId/seasons?extended=episodes" + val payload = runCatching { + httpGetTextWithHeaders(url = url, headers = headers) + }.onFailure { e -> + if (e is CancellationException) throw e + log.w { "getTraktEpisodes: seasons request failed id=$showLookupId: ${e.message}" } + }.getOrNull() ?: return emptyList() + + val traktEpisodes = parseTraktSeasonsPayload(payload) + if (traktEpisodes.isNotEmpty()) { + cacheMutex.withLock { + traktEpisodesCache[showLookupId] = traktEpisodes + } + } + return traktEpisodes + } + + private fun parseTraktSeasonsPayload(payload: String): List { + val seasons = runCatching { + json.decodeFromString>(payload) + }.getOrNull() ?: return emptyList() + + return seasons + .asSequence() + .filter { (it.number ?: 0) > 0 } // Skip specials (season 0) + .sortedBy { it.number } + .flatMap { seasonDto -> + seasonDto.episodes.orEmpty().asSequence().mapNotNull { episodeDto -> + val seasonNumber = episodeDto.season ?: seasonDto.number ?: return@mapNotNull null + val episodeNumber = episodeDto.number ?: return@mapNotNull null + EpisodeMappingEntry( + season = seasonNumber, + episode = episodeNumber, + title = episodeDto.title, + ) + } + } + .toList() + } + + // ── Helpers ─────────────────────────────────────────────────────────── + + private fun resolveShowLookupId(contentId: String?, videoId: String?): String? { + val contentIds = parseTraktContentIds(contentId) + if (contentIds.hasAnyId()) { + return when { + !contentIds.imdb.isNullOrBlank() -> contentIds.imdb + contentIds.trakt != null -> contentIds.trakt.toString() + contentIds.tmdb != null -> contentIds.tmdb.toString() + else -> null + } + } + + val videoIds = parseTraktContentIds(videoId) + return when { + !videoIds.imdb.isNullOrBlank() -> videoIds.imdb + videoIds.trakt != null -> videoIds.trakt.toString() + videoIds.tmdb != null -> videoIds.tmdb.toString() + else -> null + } + } + + private fun TraktExternalIds.hasAnyId(): Boolean = + !imdb.isNullOrBlank() || trakt != null || tmdb != null + + private fun cacheKey( + contentId: String?, + contentType: String?, + videoId: String?, + season: Int?, + episode: Int?, + ): String? { + val resolvedContentId = contentId?.trim()?.takeIf { it.isNotBlank() } ?: return null + val resolvedContentType = contentType?.trim()?.lowercase()?.takeIf { it.isNotBlank() } ?: return null + val resolvedSeason = season ?: return null + val resolvedEpisode = episode ?: return null + val resolvedVideoId = videoId?.trim().orEmpty() + return "$resolvedContentType|$resolvedContentId|$resolvedVideoId|$resolvedSeason|$resolvedEpisode" + } + + private fun reverseCacheKey( + contentId: String, + contentType: String, + season: Int, + episode: Int, + title: String?, + ): String { + val normalizedTitle = title?.trim()?.lowercase().orEmpty() + return "reverse|${contentType.trim().lowercase()}|${contentId.trim()}|$season|$episode|$normalizedTitle" + } + + private fun addonEpisodesCacheKey(contentId: String, contentType: String): String { + return "${contentType.trim().lowercase()}|${contentId.trim()}" + } + + private fun List.toEpisodeMappingEntries(): List { + return asSequence() + .mapNotNull { video -> + val season = video.season ?: return@mapNotNull null + val episode = video.episode ?: return@mapNotNull null + if (season <= 0) return@mapNotNull null + EpisodeMappingEntry( + season = season, + episode = episode, + title = video.title.takeIf { it.isNotBlank() }, + videoId = video.id.takeIf { it.isNotBlank() }, + ) + } + .distinctBy { it.videoId ?: "${it.season}:${it.episode}" } + .sortedWith(compareBy(EpisodeMappingEntry::season, EpisodeMappingEntry::episode)) + .toList() + } + + private fun normalizeTitle(title: String?): String = + title.orEmpty().trim().lowercase() + .replace(Regex("[^a-z0-9]"), "") +} + +// ── Data classes ──────────────────────────────────────────────────────── + +data class EpisodeMappingEntry( + val season: Int, + val episode: Int, + val title: String? = null, + val videoId: String? = null, +) + +// ── Trakt API DTOs for seasons endpoint ───────────────────────────────── + +@Serializable +private data class TraktSeasonDto( + @SerialName("number") val number: Int? = null, + @SerialName("episodes") val episodes: List? = null, +) + +@Serializable +private data class TraktSeasonEpisodeDto( + @SerialName("number") val number: Int? = null, + @SerialName("season") val season: Int? = null, + @SerialName("title") val title: String? = null, +) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktProgressRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktProgressRepository.kt index 6d10a78c..6ca02f0b 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktProgressRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktProgressRepository.kt @@ -434,9 +434,31 @@ object TraktProgressRepository { entries.map { entry -> val meta = metadataByContent[entry.parentMetaType to entry.parentMetaId] ?: return@map entry - val episode = if (entry.seasonNumber != null && entry.episodeNumber != null) { - meta.videos.firstOrNull { video -> - video.season == entry.seasonNumber && video.episode == entry.episodeNumber + var resolvedSeason = entry.seasonNumber + var resolvedEpisode = entry.episodeNumber + + val episode = if (resolvedSeason != null && resolvedEpisode != null) { + // Try direct match first + val directMatch = meta.videos.firstOrNull { video -> + video.season == resolvedSeason && video.episode == resolvedEpisode + } + if (directMatch != null) { + directMatch + } else { + // Fallback: reverse-remap from Trakt numbering to addon numbering + val addonSeasons = meta.videos.mapTo(mutableSetOf()) { it.season } + if (resolvedSeason == 1 && addonSeasons.size > 1 && resolvedEpisode!! > 0) { + val sorted = meta.videos + .filter { it.season != null && it.episode != null } + .sortedWith(compareBy({ it.season }, { it.episode })) + val globalIndex = resolvedEpisode!! - 1 + if (globalIndex in sorted.indices) { + val remapped = sorted[globalIndex] + resolvedSeason = remapped.season + resolvedEpisode = remapped.episode + remapped + } else null + } else null } } else { null @@ -447,6 +469,8 @@ object TraktProgressRepository { logo = entry.logo ?: meta.logo, poster = entry.poster ?: meta.poster, background = entry.background ?: meta.background, + seasonNumber = resolvedSeason ?: entry.seasonNumber, + episodeNumber = resolvedEpisode ?: entry.episodeNumber, episodeTitle = entry.episodeTitle ?: episode?.title, episodeThumbnail = entry.episodeThumbnail ?: episode?.thumbnail, pauseDescription = entry.pauseDescription diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/domain/SeriesContinuity.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/domain/SeriesContinuity.kt index 359eec29..59c074ee 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/domain/SeriesContinuity.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/domain/SeriesContinuity.kt @@ -46,12 +46,30 @@ fun nextReleasedEpisodeAfter( compareBy({ normalizeSeasonNumber(it.seasonNumber) }, { it.episodeNumber ?: 0 }), ) val watchedVideoId = buildPlaybackVideoId(content, seasonNumber, episodeNumber) + var watchedIndex = sortedEpisodes.indexOfFirst { episode -> + buildPlaybackVideoId(content, episode.seasonNumber, episode.episodeNumber, episode.videoId) == watchedVideoId + } + + // Fallback: if the seed wasn't found by season+episode (anime with absolute + // numbering on Trakt vs multi-season on addon), try global index matching. + if (watchedIndex < 0 && seasonNumber != null && episodeNumber != null) { + val addonSeasons = sortedEpisodes.mapTo(mutableSetOf()) { it.seasonNumber } + if (seasonNumber == 1 && addonSeasons.size > 1 && episodeNumber > 0) { + val globalIndex = episodeNumber - 1 + if (globalIndex in sortedEpisodes.indices) { + watchedIndex = globalIndex + } + } + } + + if (watchedIndex < 0) return null + + val watchedEpisodeSeason = sortedEpisodes[watchedIndex].seasonNumber val candidates = sortedEpisodes - .dropWhile { episode -> buildPlaybackVideoId(content, episode.seasonNumber, episode.episodeNumber, episode.videoId) != watchedVideoId } - .drop(1) + .drop(watchedIndex + 1) .filter { episode -> shouldSurfaceNextEpisode( - watchedSeasonNumber = seasonNumber, + watchedSeasonNumber = watchedEpisodeSeason, candidateSeasonNumber = episode.seasonNumber, todayIsoDate = todayIsoDate, releasedDate = episode.releasedDate, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/domain/WatchingPolicies.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/domain/WatchingPolicies.kt index 237f9dcf..27c6fcd1 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/domain/WatchingPolicies.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/domain/WatchingPolicies.kt @@ -166,7 +166,11 @@ fun latestCompletedSeriesEpisode( { it.markedAtEpochMs }, ) } else { - compareBy { it.markedAtEpochMs } + compareBy( + { it.markedAtEpochMs }, + { normalizeSeasonNumber(it.seasonNumber) }, + { it.episodeNumber }, + ) } val allMarkers = buildList { progressRecords diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/sync/TraktWatchedSyncAdapter.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/sync/TraktWatchedSyncAdapter.kt index 714dbcf7..162daa99 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/sync/TraktWatchedSyncAdapter.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/sync/TraktWatchedSyncAdapter.kt @@ -4,6 +4,7 @@ import co.touchlab.kermit.Logger import com.nuvio.app.features.addons.httpGetTextWithHeaders import com.nuvio.app.features.addons.httpPostJsonWithHeaders import com.nuvio.app.features.trakt.TraktAuthRepository +import com.nuvio.app.features.trakt.TraktEpisodeMappingService import com.nuvio.app.features.watched.WatchedItem import kotlinx.coroutines.CancellationException import kotlinx.coroutines.async @@ -92,7 +93,30 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { } } - return result + // Apply reverse mapping for anime: if Trakt uses absolute numbering (S1E1..S1EN) + // but addon uses multi-season, remap pulled episodes to addon numbering. + val remappedResult = mutableListOf() + for (item in result) { + if (item.season == null || item.episode == null || item.type != "series") { + remappedResult += item + continue + } + val mapped = runCatching { + TraktEpisodeMappingService.resolveAddonEpisodeMapping( + contentId = item.id, + contentType = item.type, + season = item.season, + episode = item.episode, + ) + }.getOrNull() + if (mapped != null && (mapped.season != item.season || mapped.episode != item.episode)) { + remappedResult += item.copy(season = mapped.season, episode = mapped.episode) + } else { + remappedResult += item + } + } + + return remappedResult } // ── push (add to history) ─────────────────────────────────────────── @@ -178,7 +202,7 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { ), ) - runCatching { + val responseText = runCatching { httpPostJsonWithHeaders( url = "$BASE_URL/sync/history", body = body, @@ -187,6 +211,101 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { }.onFailure { e -> if (e is CancellationException) throw e log.w { "Failed to push watched items to Trakt: ${e.message}" } + }.getOrNull() + + // Retry with remapped numbering for episodes that Trakt didn't recognize + // (anime with different season structures between addon and Trakt). + if (responseText != null && shows.isNotEmpty()) { + val episodeItems = items.filter { + it.season != null && it.episode != null && + it.type.trim().lowercase() !in listOf("movie", "film") + } + if (episodeItems.isNotEmpty()) { + retryWithRemappedEpisodes(headers, episodeItems) + } + } + } + + private suspend fun retryWithRemappedEpisodes( + headers: Map, + items: Collection, + ) { + val remappedShows = mutableListOf() + + for (item in items) { + val season = item.season ?: continue + val episode = item.episode ?: continue + val mapped = TraktEpisodeMappingService.resolveEpisodeMapping( + contentId = item.id, + contentType = item.type, + videoId = null, + season = season, + episode = episode, + ) ?: continue + if (mapped.season == season && mapped.episode == episode) continue + + val ids = parseIds(item.id) ?: continue + val existing = remappedShows.firstOrNull { it.ids == ids } + if (existing != null) { + val seasonDto = existing.seasons?.firstOrNull { it.number == mapped.season } + if (seasonDto != null) { + (seasonDto.episodes as? MutableList)?.add( + TraktHistoryEpisodeRequestDto( + number = mapped.episode, + watchedAt = if (item.markedAtEpochMs > 0) epochMsToIso(item.markedAtEpochMs) else null, + ), + ) + } else { + (existing.seasons as? MutableList)?.add( + TraktHistorySeasonRequestDto( + number = mapped.season, + episodes = mutableListOf( + TraktHistoryEpisodeRequestDto( + number = mapped.episode, + watchedAt = if (item.markedAtEpochMs > 0) epochMsToIso(item.markedAtEpochMs) else null, + ), + ), + ), + ) + } + } else { + remappedShows += TraktHistoryShowRequestDto( + title = item.name.takeIf { it.isNotBlank() }, + year = parseYear(item.releaseInfo), + ids = ids, + seasons = mutableListOf( + TraktHistorySeasonRequestDto( + number = mapped.season, + episodes = mutableListOf( + TraktHistoryEpisodeRequestDto( + number = mapped.episode, + watchedAt = if (item.markedAtEpochMs > 0) epochMsToIso(item.markedAtEpochMs) else null, + ), + ), + ), + ), + ) + } + } + + if (remappedShows.isEmpty()) return + + val retryBody = json.encodeToString( + TraktHistoryAddRequestDto( + movies = null, + shows = remappedShows, + ), + ) + + runCatching { + httpPostJsonWithHeaders( + url = "$BASE_URL/sync/history", + body = retryBody, + headers = headers, + ) + }.onFailure { e -> + if (e is CancellationException) throw e + log.w { "Failed to push remapped episodes to Trakt: ${e.message}" } } } @@ -251,6 +370,70 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { if (e is CancellationException) throw e log.w { "Failed to remove watched items from Trakt: ${e.message}" } } + + // Retry removal with remapped numbering for anime cases + val episodeItems = items.filter { + it.season != null && it.episode != null && + it.type.trim().lowercase() !in listOf("movie", "film") + } + if (episodeItems.isNotEmpty()) { + retryDeleteWithRemappedEpisodes(headers, episodeItems) + } + } + + private suspend fun retryDeleteWithRemappedEpisodes( + headers: Map, + items: Collection, + ) { + val remappedShowDtos = mutableListOf() + + for (item in items) { + val season = item.season ?: continue + val episode = item.episode ?: continue + val mapped = TraktEpisodeMappingService.resolveEpisodeMapping( + contentId = item.id, + contentType = item.type, + videoId = null, + season = season, + episode = episode, + ) ?: continue + if (mapped.season == season && mapped.episode == episode) continue + + val ids = parseIds(item.id) ?: continue + remappedShowDtos += TraktHistoryShowRequestDto( + title = item.name.takeIf { it.isNotBlank() }, + year = parseYear(item.releaseInfo), + ids = ids, + seasons = listOf( + TraktHistorySeasonRequestDto( + number = mapped.season, + episodes = listOf( + TraktHistoryEpisodeRequestDto(number = mapped.episode), + ), + ), + ), + ) + } + + if (remappedShowDtos.isEmpty()) return + + val retryBody = json.encodeToString( + TraktHistoryRemoveRequestDto( + movies = null, + shows = remappedShowDtos, + ), + ) + + runCatching { + httpPostJsonWithHeaders( + url = "$BASE_URL/sync/history/remove", + body = retryBody, + headers = headers, + ) + }.onFailure { e -> + if (e is CancellationException) throw e + log.w { "Failed to remove remapped episodes from Trakt: ${e.message}" } + } } // ── helpers ───────────────────────────────────────────────────────── From 263dd8db70b083ca6b1a21e234d0e4c367accd3c Mon Sep 17 00:00:00 2001 From: skoruppa Date: Thu, 30 Apr 2026 11:26:24 +0200 Subject: [PATCH 051/143] nullable receiver in TraktEpisodeMappingService --- .../nuvio/app/features/trakt/TraktEpisodeMappingService.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktEpisodeMappingService.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktEpisodeMappingService.kt index aeef2ce9..50fa7baf 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktEpisodeMappingService.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktEpisodeMappingService.kt @@ -198,10 +198,9 @@ object TraktEpisodeMappingService { // Find the addon episode entry val addonEntry = addonEpisodes.firstOrNull { it.season == requestedSeason && it.episode == requestedEpisode - } ?: if (!requestedVideoId.isNullOrBlank()) { - addonEpisodes.firstOrNull { it.videoId == requestedVideoId } - } else null - ?: return null + } ?: addonEpisodes.firstOrNull { + !requestedVideoId.isNullOrBlank() && it.videoId == requestedVideoId + } ?: return null // Try title match first val titleToMatch = addonEntry.title?.takeIf { it.isNotBlank() } ?: requestedTitle From 2c1993c996bf4136650e461e1f1e4fa606fc7f4e Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 30 Apr 2026 15:05:28 +0530 Subject: [PATCH 052/143] fix: ajdust tmdb metadata handling for collections --- .../features/details/MetaDetailsRepository.kt | 157 ++++++++++++------ .../app/features/tmdb/TmdbMetadataService.kt | 63 +++++++ .../features/tmdb/TmdbMetadataServiceTest.kt | 41 +++++ .../xcshareddata/xcschemes/iosApp.xcscheme | 80 +++++++++ 4 files changed, 294 insertions(+), 47 deletions(-) create mode 100644 iosApp/iosApp.xcodeproj/xcshareddata/xcschemes/iosApp.xcscheme diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsRepository.kt index 61f4ba86..12e42ded 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/MetaDetailsRepository.kt @@ -8,6 +8,7 @@ import com.nuvio.app.features.addons.httpGetText import com.nuvio.app.features.mdblist.MdbListMetadataService import com.nuvio.app.features.mdblist.MdbListSettingsRepository import com.nuvio.app.features.tmdb.TmdbMetadataService +import com.nuvio.app.features.tmdb.TmdbService import com.nuvio.app.features.tmdb.TmdbSettingsRepository import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope @@ -101,17 +102,22 @@ object MetaDetailsRepository { _uiState.value = MetaDetailsUiState(isLoading = true) scope.launch { - val manifests = AddonRepository.uiState.value.addons - .mapNotNull { it.manifest } - .filter { manifest -> - manifest.resources.any { resource -> - resource.name == "meta" && - resource.types.contains(type) && - (resource.idPrefixes.isEmpty() || resource.idPrefixes.any { id.startsWith(it) }) - } - } + val metaLookupId = resolveMetaLookupId(itemId = id, itemType = type) + val manifests = findMetaManifests(type = type, id = metaLookupId) if (manifests.isEmpty()) { + val tmdbMeta = tryFetchTmdbFallbackMeta(type = type, id = id) + if (tmdbMeta != null) { + publishLoadedMeta( + requestKey = requestKey, + meta = tmdbMeta, + fallbackItemId = id, + mdbListSettings = mdbListSettings, + metaScreenSettingsFingerprint = metaScreenSettingsFingerprint, + ) + return@launch + } + log.w { "No addon provides meta for type=$type id=$id" } _uiState.value = MetaDetailsUiState( errorMessage = getString(Res.string.details_no_addon_meta), @@ -122,42 +128,32 @@ object MetaDetailsRepository { for (manifest in manifests) { val result = withContext(Dispatchers.Default) { - tryFetchMeta(manifest, type, id, includeMdbList = false) + tryFetchMeta(manifest, type, metaLookupId, includeMdbList = false) } if (result != null) { - var cachedEntry = CachedMetaEntry(baseMeta = result) - cachedMetaByRequestKey[requestKey] = cachedEntry - - if (!shouldFetchMdbListOnMetaScreen(result, id, mdbListSettings)) { - _uiState.value = MetaDetailsUiState(meta = result) - activeRequestKey = requestKey - return@launch - } - - _uiState.value = MetaDetailsUiState( - isLoading = true, + publishLoadedMeta( + requestKey = requestKey, meta = result, - ) - val enrichedMeta = withContext(Dispatchers.Default) { - enrichForMetaScreen( - requestKey = requestKey, - meta = result, - fallbackItemId = id, - settings = mdbListSettings, - settingsFingerprint = metaScreenSettingsFingerprint, - ) - } - cachedEntry = cachedEntry.copy( - metaScreenMeta = enrichedMeta, + fallbackItemId = metaLookupId, + mdbListSettings = mdbListSettings, metaScreenSettingsFingerprint = metaScreenSettingsFingerprint, ) - cachedMetaByRequestKey[requestKey] = cachedEntry - _uiState.value = MetaDetailsUiState(meta = enrichedMeta) - activeRequestKey = requestKey return@launch } } + val tmdbMeta = tryFetchTmdbFallbackMeta(type = type, id = id) + if (tmdbMeta != null) { + publishLoadedMeta( + requestKey = requestKey, + meta = tmdbMeta, + fallbackItemId = id, + mdbListSettings = mdbListSettings, + metaScreenSettingsFingerprint = metaScreenSettingsFingerprint, + ) + return@launch + } + _uiState.value = MetaDetailsUiState( errorMessage = getString(Res.string.details_load_failed_all_addons), ) @@ -187,19 +183,12 @@ object MetaDetailsRepository { val requestKey = "$type:$id" cachedMetaByRequestKey[requestKey]?.let { return it.baseMeta } - val manifests = AddonRepository.uiState.value.addons - .mapNotNull { it.manifest } - .filter { manifest -> - manifest.resources.any { resource -> - resource.name == "meta" && - resource.types.contains(type) && - (resource.idPrefixes.isEmpty() || resource.idPrefixes.any { id.startsWith(it) }) - } - } + val metaLookupId = resolveMetaLookupId(itemId = id, itemType = type) + val manifests = findMetaManifests(type = type, id = metaLookupId) for (manifest in manifests) { val result = withTimeoutOrNull(FETCH_TIMEOUT_MS) { - tryFetchMeta(manifest, type, id, includeMdbList = false) + tryFetchMeta(manifest, type, metaLookupId, includeMdbList = false) } if (result != null) { cachedMetaByRequestKey[requestKey] = CachedMetaEntry(baseMeta = result) @@ -207,7 +196,9 @@ object MetaDetailsRepository { } } - return null + return tryFetchTmdbFallbackMeta(type = type, id = id)?.also { result -> + cachedMetaByRequestKey[requestKey] = CachedMetaEntry(baseMeta = result) + } } private const val FETCH_TIMEOUT_MS = 5_000L @@ -265,6 +256,78 @@ object MetaDetailsRepository { } } + private fun findMetaManifests(type: String, id: String): List = + AddonRepository.uiState.value.addons + .mapNotNull { it.manifest } + .filter { manifest -> + manifest.resources.any { resource -> + resource.name == "meta" && + resource.types.contains(type) && + (resource.idPrefixes.isEmpty() || resource.idPrefixes.any { id.startsWith(it) }) + } + } + + private suspend fun resolveMetaLookupId(itemId: String, itemType: String): String { + val tmdbId = itemId + .takeIf { it.startsWith("tmdb:", ignoreCase = true) } + ?.substringAfter(':') + ?.substringBefore(':') + ?.toIntOrNull() + ?: return itemId + + return withTimeoutOrNull(FETCH_TIMEOUT_MS) { + TmdbService.tmdbToImdb(tmdbId = tmdbId, mediaType = itemType) + } + ?.takeIf { it.isNotBlank() } + ?: itemId + } + + private suspend fun tryFetchTmdbFallbackMeta(type: String, id: String): MetaDetails? = + withTimeoutOrNull(TMDB_ENRICH_TIMEOUT_MS) { + TmdbMetadataService.fetchStandaloneMeta( + type = type, + id = id, + settings = TmdbSettingsRepository.snapshot(), + ) + } + + private suspend fun publishLoadedMeta( + requestKey: String, + meta: MetaDetails, + fallbackItemId: String, + mdbListSettings: com.nuvio.app.features.mdblist.MdbListSettings, + metaScreenSettingsFingerprint: String, + ) { + val cachedEntry = CachedMetaEntry(baseMeta = meta) + cachedMetaByRequestKey[requestKey] = cachedEntry + + if (!shouldFetchMdbListOnMetaScreen(meta, fallbackItemId, mdbListSettings)) { + _uiState.value = MetaDetailsUiState(meta = meta) + activeRequestKey = requestKey + return + } + + _uiState.value = MetaDetailsUiState( + isLoading = true, + meta = meta, + ) + val enrichedMeta = withContext(Dispatchers.Default) { + enrichForMetaScreen( + requestKey = requestKey, + meta = meta, + fallbackItemId = fallbackItemId, + settings = mdbListSettings, + settingsFingerprint = metaScreenSettingsFingerprint, + ) + } + cachedMetaByRequestKey[requestKey] = cachedEntry.copy( + metaScreenMeta = enrichedMeta, + metaScreenSettingsFingerprint = metaScreenSettingsFingerprint, + ) + _uiState.value = MetaDetailsUiState(meta = enrichedMeta) + activeRequestKey = requestKey + } + private suspend fun enrichForMetaScreen( requestKey: String, meta: MetaDetails, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/tmdb/TmdbMetadataService.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/tmdb/TmdbMetadataService.kt index f398257f..823125a6 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/tmdb/TmdbMetadataService.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/tmdb/TmdbMetadataService.kt @@ -638,6 +638,69 @@ object TmdbMetadataService { ) } + suspend fun fetchStandaloneMeta( + type: String, + id: String, + settings: TmdbSettings, + ): MetaDetails? { + if (!settings.hasApiKey) return null + + val tmdbId = id + .takeIf { it.startsWith("tmdb:", ignoreCase = true) } + ?.substringAfter(':') + ?.substringBefore(':') + ?.toIntOrNull() + ?: return null + val tmdbType = normalizeMetaType(type) + val enrichment = fetchEnrichment( + tmdbId = tmdbId.toString(), + mediaType = tmdbType, + language = settings.language, + settings = settings, + ) ?: return null + + return buildStandaloneMeta( + type = type, + id = id, + tmdbId = tmdbId, + enrichment = enrichment, + ) + } + + internal fun buildStandaloneMeta( + type: String, + id: String, + tmdbId: Int, + enrichment: TmdbEnrichment, + ): MetaDetails = + MetaDetails( + id = id, + type = type, + name = enrichment.localizedTitle ?: "TMDB $tmdbId", + poster = enrichment.poster, + background = enrichment.backdrop, + logo = enrichment.logo, + description = enrichment.description, + releaseInfo = enrichment.releaseInfo, + lastAirDate = enrichment.lastAirDate, + status = enrichment.status, + imdbRating = enrichment.rating?.formatRating(), + ageRating = enrichment.ageRating, + runtime = enrichment.runtimeMinutes?.formatRuntime(), + genres = enrichment.genres, + director = enrichment.director, + writer = enrichment.writer, + cast = enrichment.people, + productionCompanies = enrichment.productionCompanies, + networks = enrichment.networks, + country = enrichment.countries.takeIf { it.isNotEmpty() }?.joinToString(", "), + language = enrichment.language, + moreLikeThis = enrichment.moreLikeThis, + collectionName = enrichment.collectionName, + collectionItems = enrichment.collectionItems, + trailers = enrichment.trailers, + ) + internal fun applyEnrichment( meta: MetaDetails, enrichment: TmdbEnrichment?, diff --git a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/tmdb/TmdbMetadataServiceTest.kt b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/tmdb/TmdbMetadataServiceTest.kt index d4145c30..22dd5a59 100644 --- a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/tmdb/TmdbMetadataServiceTest.kt +++ b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/tmdb/TmdbMetadataServiceTest.kt @@ -8,6 +8,47 @@ import kotlin.test.Test import kotlin.test.assertEquals class TmdbMetadataServiceTest { + @Test + fun `buildStandaloneMeta maps tmdb enrichment without addon meta`() { + val enrichment = TmdbEnrichment( + localizedTitle = "TMDB Movie", + description = "TMDB description", + genres = listOf("Adventure"), + backdrop = "backdrop", + logo = "logo", + poster = "poster", + people = listOf(MetaPerson(name = "Cast Member", role = "Hero")), + director = listOf("Director"), + writer = listOf("Writer"), + releaseInfo = "2026-01-01", + rating = 8.4, + runtimeMinutes = 105, + ageRating = "PG-13", + status = "Released", + countries = listOf("US", "GB"), + language = "en", + productionCompanies = listOf(MetaCompany(name = "Studio")), + networks = emptyList(), + ) + + val result = TmdbMetadataService.buildStandaloneMeta( + type = "movie", + id = "tmdb:123", + tmdbId = 123, + enrichment = enrichment, + ) + + assertEquals("tmdb:123", result.id) + assertEquals("movie", result.type) + assertEquals("TMDB Movie", result.name) + assertEquals("TMDB description", result.description) + assertEquals("8.4", result.imdbRating) + assertEquals("105m", result.runtime) + assertEquals("US, GB", result.country) + assertEquals(listOf("Cast Member"), result.cast.map { it.name }) + assertEquals(listOf("Studio"), result.productionCompanies.map { it.name }) + } + @Test fun `applyEnrichment replaces enabled metadata groups`() { val base = MetaDetails( diff --git a/iosApp/iosApp.xcodeproj/xcshareddata/xcschemes/iosApp.xcscheme b/iosApp/iosApp.xcodeproj/xcshareddata/xcschemes/iosApp.xcscheme new file mode 100644 index 00000000..e171e6d7 --- /dev/null +++ b/iosApp/iosApp.xcodeproj/xcshareddata/xcschemes/iosApp.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 4fe9c8967a9f13df47a7413e2287f46b85532356 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 30 Apr 2026 15:15:09 +0530 Subject: [PATCH 053/143] bump version --- iosApp/Configuration/Version.xcconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iosApp/Configuration/Version.xcconfig b/iosApp/Configuration/Version.xcconfig index d2dd1f20..29d28954 100644 --- a/iosApp/Configuration/Version.xcconfig +++ b/iosApp/Configuration/Version.xcconfig @@ -1,3 +1,3 @@ -CURRENT_PROJECT_VERSION=42 -MARKETING_VERSION=0.1.10 +CURRENT_PROJECT_VERSION=48 +MARKETING_VERSION=0.1.12 From 0a663560d818db091cc2655f4417e87a7dd02ef6 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 30 Apr 2026 15:56:05 +0530 Subject: [PATCH 054/143] fix: ios downloads --- .../DownloadsPlatformDownloader.ios.kt | 381 ++++++++++++++---- iosApp/iosApp/Info.plist | 5 + .../iosApp/OrientationLockCoordinator.swift | 11 + vendor/quickjs-kt | 1 + 4 files changed, 317 insertions(+), 81 deletions(-) create mode 160000 vendor/quickjs-kt diff --git a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.ios.kt b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.ios.kt index 50cf133b..2ce2b26a 100644 --- a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.ios.kt +++ b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.ios.kt @@ -1,39 +1,52 @@ package com.nuvio.app.features.downloads -import io.ktor.client.HttpClient -import io.ktor.client.engine.darwin.Darwin -import io.ktor.client.plugins.HttpTimeout -import io.ktor.client.request.get -import io.ktor.client.request.header -import io.ktor.client.statement.bodyAsChannel -import io.ktor.http.isSuccess -import io.ktor.utils.io.ByteReadChannel -import io.ktor.utils.io.readAvailable import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.cinterop.addressOf import kotlinx.cinterop.convert import kotlinx.cinterop.usePinned import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.ensureActive import kotlinx.coroutines.launch +import platform.Foundation.NSError +import platform.Foundation.NSDate import platform.Foundation.NSFileManager +import platform.Foundation.NSHTTPURLResponse import platform.Foundation.NSHomeDirectory +import platform.Foundation.NSMutableURLRequest +import platform.Foundation.NSOperationQueue import platform.Foundation.NSURL -import platform.posix.fclose +import platform.Foundation.NSURLRequestReloadIgnoringLocalCacheData +import platform.Foundation.NSURLResponse +import platform.Foundation.NSURLSession +import platform.Foundation.NSURLSessionConfiguration +import platform.Foundation.NSURLSessionDownloadDelegateProtocol +import platform.Foundation.NSURLSessionDownloadTask +import platform.Foundation.NSURLSessionTask +import platform.Foundation.setHTTPMethod +import platform.Foundation.setValue +import platform.Foundation.timeIntervalSince1970 +import platform.darwin.NSObject import platform.posix.fopen +import platform.posix.fclose +import platform.posix.fread import platform.posix.fwrite -private val downloadHttpClient = HttpClient(Darwin) { - install(HttpTimeout) { - requestTimeoutMillis = 60_000 - connectTimeoutMillis = 60_000 - socketTimeoutMillis = 60_000 - } - expectSuccess = false +private const val DOWNLOAD_REQUEST_TIMEOUT_SECONDS = 60.0 +private const val DOWNLOAD_RESOURCE_TIMEOUT_SECONDS = 24.0 * 60.0 * 60.0 +private const val PROGRESS_MIN_INTERVAL_SECONDS = 0.5 +private const val PROGRESS_MIN_BYTE_DELTA = 512L * 1024L + +private val backgroundSessionCompletionHandlers = mutableMapOf Unit>() + +fun handleDownloadsBackgroundEvents( + identifier: String, + completionHandler: () -> Unit, +) { + backgroundSessionCompletionHandlers[identifier] = completionHandler } @OptIn(ExperimentalForeignApi::class) @@ -46,6 +59,7 @@ internal actual object DownloadsPlatformDownloader { ): DownloadsTaskHandle { val job = SupervisorJob() val scope = CoroutineScope(job + Dispatchers.Default) + val handle = IosDownloadsTaskHandle(job) scope.launch { val downloadsDirectory = downloadsDirectoryPath() @@ -55,55 +69,42 @@ internal actual object DownloadsPlatformDownloader { try { var resumeFromBytes = fileSizeOrNull(tempPath)?.coerceAtLeast(0L) ?: 0L - suspend fun performRequest(rangeStart: Long?) = downloadHttpClient.get(request.sourceUrl) { - request.sourceHeaders.forEach { (key, value) -> - header(key, value) - } - if (rangeStart != null && rangeStart > 0L) { - header("Range", "bytes=$rangeStart-") - } - } - var attemptedRangeRequest = resumeFromBytes > 0L - var response = performRequest(if (attemptedRangeRequest) resumeFromBytes else null) + var result = performDownloadRequest( + request = request, + rangeStart = if (attemptedRangeRequest) resumeFromBytes else null, + resumeFromBytes = resumeFromBytes, + tempPath = tempPath, + handle = handle, + onProgress = onProgress, + ) - if (attemptedRangeRequest && response.status.value == 416) { + if (attemptedRangeRequest && result.statusCode == 416) { removePathIfExists(tempPath) resumeFromBytes = 0L attemptedRangeRequest = false - response = performRequest(null) + result = performDownloadRequest( + request = request, + rangeStart = null, + resumeFromBytes = 0L, + tempPath = tempPath, + handle = handle, + onProgress = onProgress, + ) } - if (!response.status.isSuccess()) { - error("Request failed with HTTP ${response.status.value}") - } - - val isPartialResume = attemptedRangeRequest && response.status.value == 206 && resumeFromBytes > 0L - val appendToTemp = isPartialResume - val startingBytes = if (appendToTemp) resumeFromBytes else 0L - - if (!appendToTemp) { - removePathIfExists(tempPath) + if (result.statusCode !in 200..299) { + error("Request failed with HTTP ${result.statusCode}") } + val isPartialResume = attemptedRangeRequest && result.statusCode == 206 && resumeFromBytes > 0L + val startingBytes = if (isPartialResume) resumeFromBytes else 0L val totalBytes = resolveTotalBytes( startingBytes = startingBytes, isPartialResume = isPartialResume, - contentRangeHeader = response.headers["Content-Range"], - contentLength = response.headers["Content-Length"]?.toLongOrNull()?.takeIf { it > 0L }, + contentRangeHeader = result.contentRange, + contentLength = result.contentLength, ) - val channel = response.bodyAsChannel() - val wrote = writeChannelToFile( - channel = channel, - path = tempPath, - append = appendToTemp, - initialDownloadedBytes = startingBytes, - totalBytes = totalBytes, - onProgress = onProgress, - ) - if (!wrote) { - error("Failed to write download file") - } removePathIfExists(destinationPath) val moved = NSFileManager.defaultManager.moveItemAtPath( @@ -118,12 +119,14 @@ internal actual object DownloadsPlatformDownloader { val localFileUri = NSURL.fileURLWithPath(destinationPath).absoluteString ?: "file://$destinationPath" val finalSize = fileSizeOrNull(destinationPath) onSuccess(localFileUri, totalBytes ?: finalSize) + } catch (_: CancellationException) { + handle.cancelNativeTask() } catch (error: Throwable) { onFailure(error.message ?: "Download failed") } } - return IosDownloadsTaskHandle(job) + return handle } actual fun removeFile(localFileUri: String?): Boolean { @@ -141,9 +144,172 @@ internal actual object DownloadsPlatformDownloader { private class IosDownloadsTaskHandle( private val job: Job, ) : DownloadsTaskHandle { + private var task: NSURLSessionDownloadTask? = null + private var session: NSURLSession? = null + + fun attach(task: NSURLSessionDownloadTask, session: NSURLSession) { + this.task = task + this.session = session + } + override fun cancel() { + cancelNativeTask() job.cancel() } + + fun cancelNativeTask() { + task?.cancel() + session?.invalidateAndCancel() + task = null + session = null + } +} + +private data class IosDownloadResult( + val statusCode: Int, + val contentRange: String?, + val contentLength: Long?, +) + +@OptIn(ExperimentalForeignApi::class) +private class IosDownloadDelegate( + private val attemptedRangeRequest: Boolean, + private val resumeFromBytes: Long, + private val tempPath: String, + private val onProgress: (downloadedBytes: Long, totalBytes: Long?) -> Unit, +) : NSObject(), NSURLSessionDownloadDelegateProtocol { + private val completion = CompletableDeferred() + private var result: IosDownloadResult? = null + private var fileError: Throwable? = null + private var lastProgressBytes = -1L + private var lastProgressTimestampSeconds = 0.0 + + suspend fun awaitCompletion(): IosDownloadResult = completion.await() + + override fun URLSession( + session: NSURLSession, + downloadTask: NSURLSessionDownloadTask, + didFinishDownloadingToURL: NSURL, + ) { + val httpResponse = downloadTask.response as? NSHTTPURLResponse + val statusCode = httpResponse?.statusCode?.toInt() ?: 200 + result = IosDownloadResult( + statusCode = statusCode, + contentRange = httpResponse?.valueForHTTPHeaderField("Content-Range"), + contentLength = httpResponse + ?.valueForHTTPHeaderField("Content-Length") + ?.toLongOrNull() + ?.takeIf { it > 0L }, + ) + + if (statusCode !in 200..299) return + + val sourcePath = didFinishDownloadingToURL.path + if (sourcePath.isNullOrBlank()) { + fileError = IllegalStateException("Downloaded file was not available") + return + } + + val isPartialResume = attemptedRangeRequest && statusCode == 206 && resumeFromBytes > 0L + val stored = if (isPartialResume) { + appendFile(sourcePath, tempPath) + } else { + removePathIfExists(tempPath) && + NSFileManager.defaultManager.moveItemAtPath( + srcPath = sourcePath, + toPath = tempPath, + error = null, + ) + } + + if (!stored) { + fileError = IllegalStateException("Failed to store download file") + } + } + + override fun URLSession( + session: NSURLSession, + downloadTask: NSURLSessionDownloadTask, + didWriteData: Long, + totalBytesWritten: Long, + totalBytesExpectedToWrite: Long, + ) { + val statusCode = (downloadTask.response as? NSHTTPURLResponse)?.statusCode?.toInt() + val startingBytes = if (attemptedRangeRequest && statusCode == 206 && resumeFromBytes > 0L) { + resumeFromBytes + } else { + 0L + } + val expectedTotal = totalBytesExpectedToWrite + .takeIf { it > 0L } + ?.let { startingBytes + it } + reportProgress( + downloadedBytes = startingBytes + totalBytesWritten.coerceAtLeast(0L), + totalBytes = expectedTotal, + ) + } + + override fun URLSession( + session: NSURLSession, + task: NSURLSessionTask, + didCompleteWithError: NSError?, + ) { + if (didCompleteWithError != null) { + completion.completeExceptionally( + IllegalStateException(didCompleteWithError.localizedDescription), + ) + return + } + + val error = fileError + if (error != null) { + completion.completeExceptionally(error) + return + } + + completion.complete(result ?: task.response.toDownloadResult()) + } + + override fun URLSessionDidFinishEventsForBackgroundURLSession(session: NSURLSession) { + val identifier = session.configuration.identifier ?: return + backgroundSessionCompletionHandlers.remove(identifier)?.invoke() + } + + private fun reportProgress( + downloadedBytes: Long, + totalBytes: Long?, + ) { + val normalizedDownloadedBytes = downloadedBytes.coerceAtLeast(0L) + val now = NSDate().timeIntervalSince1970 + val byteDelta = normalizedDownloadedBytes - lastProgressBytes + val timeDelta = now - lastProgressTimestampSeconds + val reachedEnd = totalBytes != null && normalizedDownloadedBytes >= totalBytes + + if ( + lastProgressBytes >= 0L && + !reachedEnd && + byteDelta < PROGRESS_MIN_BYTE_DELTA && + timeDelta < PROGRESS_MIN_INTERVAL_SECONDS + ) { + return + } + + lastProgressBytes = normalizedDownloadedBytes + lastProgressTimestampSeconds = now + onProgress(normalizedDownloadedBytes, totalBytes) + } +} + +private fun NSURLResponse?.toDownloadResult(): IosDownloadResult { + val httpResponse = this as? NSHTTPURLResponse + return IosDownloadResult( + statusCode = httpResponse?.statusCode?.toInt() ?: 200, + contentRange = httpResponse?.valueForHTTPHeaderField("Content-Range"), + contentLength = httpResponse + ?.valueForHTTPHeaderField("Content-Length") + ?.toLongOrNull() + ?.takeIf { it > 0L }, + ) } @OptIn(ExperimentalForeignApi::class) @@ -166,45 +332,98 @@ private fun removePathIfExists(path: String): Boolean { } @OptIn(ExperimentalForeignApi::class) -private suspend fun writeChannelToFile( - channel: ByteReadChannel, - path: String, - append: Boolean, - initialDownloadedBytes: Long, - totalBytes: Long?, +private suspend fun performDownloadRequest( + request: DownloadPlatformRequest, + rangeStart: Long?, + resumeFromBytes: Long, + tempPath: String, + handle: IosDownloadsTaskHandle, onProgress: (downloadedBytes: Long, totalBytes: Long?) -> Unit, -): Boolean { - val file = fopen(path, if (append) "ab" else "wb") ?: return false +): IosDownloadResult { + val url = NSURL(string = request.sourceUrl) + val nativeRequest = NSMutableURLRequest( + uRL = url, + cachePolicy = NSURLRequestReloadIgnoringLocalCacheData, + timeoutInterval = DOWNLOAD_REQUEST_TIMEOUT_SECONDS, + ) + nativeRequest.setHTTPMethod("GET") + nativeRequest.setAllowsCellularAccess(true) + nativeRequest.setAllowsExpensiveNetworkAccess(true) + nativeRequest.setAllowsConstrainedNetworkAccess(true) + request.sourceHeaders.forEach { (key, value) -> + nativeRequest.setValue(value, forHTTPHeaderField = key) + } + if (rangeStart != null && rangeStart > 0L) { + nativeRequest.setValue("bytes=$rangeStart-", forHTTPHeaderField = "Range") + } + + val delegate = IosDownloadDelegate( + attemptedRangeRequest = rangeStart != null && rangeStart > 0L, + resumeFromBytes = resumeFromBytes, + tempPath = tempPath, + onProgress = onProgress, + ) + val configuration = NSURLSessionConfiguration.defaultSessionConfiguration().apply { + timeoutIntervalForRequest = DOWNLOAD_REQUEST_TIMEOUT_SECONDS + timeoutIntervalForResource = DOWNLOAD_RESOURCE_TIMEOUT_SECONDS + waitsForConnectivity = true + allowsCellularAccess = true + allowsExpensiveNetworkAccess = true + allowsConstrainedNetworkAccess = true + } + val session = NSURLSession.sessionWithConfiguration( + configuration = configuration, + delegate = delegate, + delegateQueue = NSOperationQueue(), + ) + val task = session.downloadTaskWithRequest(nativeRequest) + + handle.attach(task, session) + onProgress(resumeFromBytes.coerceAtLeast(0L), null) + task.resume() + + return try { + delegate.awaitCompletion() + } finally { + session.finishTasksAndInvalidate() + } +} + +@OptIn(ExperimentalForeignApi::class) +private fun appendFile(sourcePath: String, destinationPath: String): Boolean { + val source = fopen(sourcePath, "rb") ?: return false + val destination = fopen(destinationPath, "ab") ?: run { + fclose(source) + return false + } val buffer = ByteArray(16 * 1024) - var downloadedBytes = initialDownloadedBytes - onProgress(downloadedBytes, totalBytes) return try { while (true) { - kotlinx.coroutines.currentCoroutineContext().ensureActive() - val read = channel.readAvailable(buffer, 0, buffer.size) - if (read < 0) break - if (read == 0) continue + val read = buffer.usePinned { pinned -> + fread( + pinned.addressOf(0), + 1.convert(), + buffer.size.convert(), + source, + ).toInt() + } + if (read <= 0) break - val wroteChunk = buffer.usePinned { pinned -> - val written = fwrite( + val wrote = buffer.usePinned { pinned -> + fwrite( pinned.addressOf(0), 1.convert(), read.convert(), - file, - ) - written.toInt() == read + destination, + ).toInt() } - if (!wroteChunk) { - return false - } - - downloadedBytes += read.toLong() - onProgress(downloadedBytes, totalBytes) + if (wrote != read) return false } true } finally { - fclose(file) + fclose(source) + fclose(destination) } } diff --git a/iosApp/iosApp/Info.plist b/iosApp/iosApp/Info.plist index 4f941103..7ecac2c5 100644 --- a/iosApp/iosApp/Info.plist +++ b/iosApp/iosApp/Info.plist @@ -17,6 +17,11 @@ + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSSupportsLiveActivities diff --git a/iosApp/iosApp/OrientationLockCoordinator.swift b/iosApp/iosApp/OrientationLockCoordinator.swift index 5d514e02..cf78e051 100644 --- a/iosApp/iosApp/OrientationLockCoordinator.swift +++ b/iosApp/iosApp/OrientationLockCoordinator.swift @@ -23,6 +23,17 @@ final class OrientationLockAppDelegate: NSObject, UIApplicationDelegate, UNUserN OrientationLockCoordinator.shared.supportedOrientations } + func application( + _ application: UIApplication, + handleEventsForBackgroundURLSession identifier: String, + completionHandler: @escaping () -> Void + ) { + DownloadsPlatformDownloader_iosKt.handleDownloadsBackgroundEvents( + identifier: identifier, + completionHandler: completionHandler + ) + } + func userNotificationCenter( _ center: UNUserNotificationCenter, willPresent notification: UNNotification, diff --git a/vendor/quickjs-kt b/vendor/quickjs-kt new file mode 160000 index 00000000..57ce0962 --- /dev/null +++ b/vendor/quickjs-kt @@ -0,0 +1 @@ +Subproject commit 57ce096200ac36bceb4e1ee5b6ec411b12357eb8 From 8a58fabfddf7dc8f39db7072bb5271ce9e4d8526 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 30 Apr 2026 21:50:11 +0530 Subject: [PATCH 055/143] fix: patch remaining areas generating duplicate keys --- .../app/core/ui/DuplicateSafeLazyKeys.kt | 23 +++++++++++++++++++ .../nuvio/app/core/ui/NuvioShelfComponents.kt | 8 +++---- .../app/features/catalog/CatalogScreen.kt | 8 ++++--- .../features/collection/FolderDetailScreen.kt | 15 +++++++----- .../components/DetailCommentsSection.kt | 7 +++++- .../details/components/DetailSeriesContent.kt | 6 ++++- .../components/DetailTrailersSection.kt | 8 +++---- .../features/player/PlayerEpisodesPanel.kt | 5 +++- .../nuvio/app/features/search/SearchScreen.kt | 8 ++++--- iosApp/Configuration/Version.xcconfig | 2 +- .../xcshareddata/xcschemes/iosApp.xcscheme | 2 -- 11 files changed, 66 insertions(+), 26 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/DuplicateSafeLazyKeys.kt diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/DuplicateSafeLazyKeys.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/DuplicateSafeLazyKeys.kt new file mode 100644 index 00000000..cc3755eb --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/DuplicateSafeLazyKeys.kt @@ -0,0 +1,23 @@ +package com.nuvio.app.core.ui + +internal data class DuplicateSafeLazyEntry( + val value: T, + val lazyKey: Any, +) + +internal fun List.withDuplicateSafeLazyKeys(key: (T) -> Any): List> { + val keyCounts = groupingBy(key).eachCount() + val occurrences = mutableMapOf() + + return map { entry -> + val baseKey = key(entry) + val lazyKey = if (keyCounts[baseKey] == 1) { + baseKey + } else { + val occurrence = occurrences.getOrElse(baseKey) { 0 } + occurrences[baseKey] = occurrence + 1 + "$baseKey#$occurrence" + } + DuplicateSafeLazyEntry(value = entry, lazyKey = lazyKey) + } +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioShelfComponents.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioShelfComponents.kt index b1b99312..ace10d77 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioShelfComponents.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioShelfComponents.kt @@ -82,10 +82,10 @@ fun NuvioShelfSection( ) { if (key != null) { items( - items = entries, - key = key, - ) { entry -> - itemContent(entry) + items = entries.withDuplicateSafeLazyKeys(key), + key = { entry -> entry.lazyKey }, + ) { keyedEntry -> + itemContent(keyedEntry.value) } } else { items(entries) { entry -> diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/catalog/CatalogScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/catalog/CatalogScreen.kt index 9e53063e..fdff2ecd 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/catalog/CatalogScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/catalog/CatalogScreen.kt @@ -50,6 +50,7 @@ import com.nuvio.app.core.ui.NuvioBackButton import com.nuvio.app.core.ui.rememberPosterCardStyleUiState import com.nuvio.app.core.ui.posterCardClickable import com.nuvio.app.core.ui.nuvioSafeBottomPadding +import com.nuvio.app.core.ui.withDuplicateSafeLazyKeys import com.nuvio.app.features.home.MetaPreview import com.nuvio.app.features.home.PosterShape import com.nuvio.app.features.home.stableKey @@ -175,9 +176,10 @@ fun CatalogScreen( } } else { items( - items = uiState.items, - key = { item -> item.stableKey() }, - ) { item -> + items = uiState.items.withDuplicateSafeLazyKeys { item -> item.stableKey() }, + key = { item -> item.lazyKey }, + ) { keyedItem -> + val item = keyedItem.value CatalogPosterTile( item = item, cornerRadiusDp = posterCardStyle.cornerRadiusDp, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailScreen.kt index 07c3cb73..6101d18a 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailScreen.kt @@ -54,6 +54,7 @@ import com.nuvio.app.core.ui.NuvioPosterCard import com.nuvio.app.core.ui.NuvioPosterShape import com.nuvio.app.core.ui.NuvioScreenHeader import com.nuvio.app.core.ui.nuvioSafeBottomPadding +import com.nuvio.app.core.ui.withDuplicateSafeLazyKeys import com.nuvio.app.features.home.HomeCatalogSection import com.nuvio.app.features.home.MetaPreview import com.nuvio.app.features.home.PosterShape @@ -275,9 +276,10 @@ private fun TabbedGridContent( verticalArrangement = Arrangement.spacedBy(14.dp), ) { items( - items = selectedTab.items, - key = { item -> item.stableKey() }, - ) { item -> + items = selectedTab.items.withDuplicateSafeLazyKeys { item -> item.stableKey() }, + key = { item -> item.lazyKey }, + ) { keyedItem -> + val item = keyedItem.value NuvioPosterCard( title = item.name, imageUrl = item.poster, @@ -326,9 +328,10 @@ private fun RowsContent( verticalArrangement = Arrangement.spacedBy(16.dp), ) { items( - items = sections, - key = { it.key }, - ) { section -> + items = sections.withDuplicateSafeLazyKeys { it.key }, + key = { it.lazyKey }, + ) { keyedSection -> + val section = keyedSection.value HomeCatalogRowSection( section = section, entries = section.items.take(18), diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailCommentsSection.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailCommentsSection.kt index 43d740d1..5bc7112a 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailCommentsSection.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailCommentsSection.kt @@ -38,6 +38,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.nuvio.app.core.ui.withDuplicateSafeLazyKeys import com.nuvio.app.features.trakt.TraktCommentReview import kotlinx.coroutines.flow.distinctUntilChanged import nuvio.composeapp.generated.resources.* @@ -122,7 +123,11 @@ fun DetailCommentsSection( state = listState, horizontalArrangement = Arrangement.spacedBy(12.dp), ) { - items(comments, key = { it.id }) { review -> + items( + items = comments.withDuplicateSafeLazyKeys { it.id }, + key = { it.lazyKey }, + ) { keyedReview -> + val review = keyedReview.value CommentCard( review = review, onClick = { onCommentClick(review) }, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailSeriesContent.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailSeriesContent.kt index a463e5a2..485c729a 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailSeriesContent.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailSeriesContent.kt @@ -30,6 +30,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape @@ -582,7 +583,10 @@ private fun EpisodeHorizontalRow( contentPadding = PaddingValues(horizontal = rowMetrics.rowHorizontalPadding, vertical = rowMetrics.rowVerticalPadding), horizontalArrangement = Arrangement.spacedBy(rowMetrics.itemSpacing), ) { - items(episodes, key = { it.id }) { episode -> + itemsIndexed( + items = episodes, + key = { index, episode -> "${episode.season}:${episode.episode}:${episode.id}#$index" }, + ) { _, episode -> val episodeVideoId = buildPlaybackVideoId( parentMetaId = parentMetaId, seasonNumber = episode.season, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailTrailersSection.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailTrailersSection.kt index 0edc1a3c..e9ef5fa8 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailTrailersSection.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/details/components/DetailTrailersSection.kt @@ -13,7 +13,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyRow -import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ExpandMore @@ -158,10 +158,10 @@ fun DetailTrailersSection( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(sizing.cardSpacing), ) { - items( + itemsIndexed( items = selectedTrailers, - key = { trailer -> "${trailer.type}-${trailer.id}-${trailer.seasonNumber ?: 0}" }, - ) { trailer -> + key = { index, trailer -> "${trailer.type}-${trailer.id}-${trailer.seasonNumber ?: 0}#$index" }, + ) { _, trailer -> TrailerCard( trailer = trailer, cardWidth = sizing.cardWidth, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerEpisodesPanel.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerEpisodesPanel.kt index fc675a39..032fc605 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerEpisodesPanel.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerEpisodesPanel.kt @@ -291,7 +291,10 @@ private fun EpisodesListSubView( verticalArrangement = Arrangement.spacedBy(4.dp), contentPadding = androidx.compose.foundation.layout.PaddingValues(bottom = 16.dp), ) { - items(seasonEpisodes, key = { "${it.season}:${it.episode}:${it.id}" }) { episode -> + itemsIndexed( + items = seasonEpisodes, + key = { index, episode -> "${episode.season}:${episode.episode}:${episode.id}#$index" }, + ) { _, episode -> val isCurrent = episode.season == currentSeason && episode.episode == currentEpisode EpisodeRow( episode = episode, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchScreen.kt index c127cf3c..45e335eb 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/search/SearchScreen.kt @@ -44,6 +44,7 @@ import com.nuvio.app.core.ui.NuvioInputField import com.nuvio.app.core.ui.NuvioScreen import com.nuvio.app.core.ui.NuvioNetworkOfflineCard import com.nuvio.app.core.ui.NuvioScreenHeader +import com.nuvio.app.core.ui.withDuplicateSafeLazyKeys import com.nuvio.app.features.addons.AddonRepository import com.nuvio.app.features.home.MetaPreview import com.nuvio.app.features.home.components.HomeCatalogRowSection @@ -303,9 +304,10 @@ fun SearchScreen( else -> { items( - items = uiState.sections, - key = { section -> section.key }, - ) { section -> + items = uiState.sections.withDuplicateSafeLazyKeys { section -> section.key }, + key = { section -> section.lazyKey }, + ) { keyedSection -> + val section = keyedSection.value HomeCatalogRowSection( section = section, modifier = Modifier.padding(bottom = 12.dp), diff --git a/iosApp/Configuration/Version.xcconfig b/iosApp/Configuration/Version.xcconfig index 29d28954..e702a219 100644 --- a/iosApp/Configuration/Version.xcconfig +++ b/iosApp/Configuration/Version.xcconfig @@ -1,3 +1,3 @@ CURRENT_PROJECT_VERSION=48 -MARKETING_VERSION=0.1.12 +MARKETING_VERSION=0.1.0 diff --git a/iosApp/iosApp.xcodeproj/xcshareddata/xcschemes/iosApp.xcscheme b/iosApp/iosApp.xcodeproj/xcshareddata/xcschemes/iosApp.xcscheme index e171e6d7..9401d693 100644 --- a/iosApp/iosApp.xcodeproj/xcshareddata/xcschemes/iosApp.xcscheme +++ b/iosApp/iosApp.xcodeproj/xcshareddata/xcschemes/iosApp.xcscheme @@ -29,8 +29,6 @@ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES" shouldAutocreateTestPlan = "YES"> - - Date: Thu, 30 Apr 2026 21:54:58 +0530 Subject: [PATCH 056/143] fix: add cancelLoading method to StreamsRepository --- .../commonMain/kotlin/com/nuvio/app/App.kt | 2 ++ .../app/features/streams/StreamsRepository.kt | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt index 4e68adf2..f3095f59 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt @@ -1327,6 +1327,7 @@ private fun MainAppContent( ) ) StreamsRepository.consumeAutoPlay() + StreamsRepository.cancelLoading() navController.navigate(PlayerRoute(launchId = launchId)) { popUpTo { inclusive = true } } @@ -1405,6 +1406,7 @@ private fun MainAppContent( initialProgressFraction = resolvedResumeProgressFraction, ) ) + StreamsRepository.cancelLoading() navController.navigate( PlayerRoute(launchId = launchId) ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsRepository.kt index 98d6e7e3..674e3352 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/streams/StreamsRepository.kt @@ -424,8 +424,32 @@ object StreamsRepository { } } + fun cancelLoading() { + activeJob?.cancel() + activeJob = null + _uiState.update { current -> + if (!current.isAnyLoading && current.groups.none { it.isLoading }) { + current + } else { + val updatedGroups = current.groups.map { group -> + if (group.isLoading) group.copy(isLoading = false) else group + } + current.copy( + groups = updatedGroups, + isAnyLoading = false, + emptyStateReason = if (updatedGroups.isEmpty()) { + current.emptyStateReason + } else { + updatedGroups.toEmptyStateReason(anyLoading = false) + }, + ) + } + } + } + fun clear() { activeJob?.cancel() + activeJob = null activeRequestKey = null _uiState.value = StreamsUiState() } From cbbe65aab3f7edf7f6d7e0fe3f4eebca40d00889 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 30 Apr 2026 23:42:22 +0530 Subject: [PATCH 057/143] fix: add shouldSyncToTraktHistory method to prevent sending whole season marked to trakt while marking ep --- .../watching/sync/TraktWatchedSyncAdapter.kt | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/sync/TraktWatchedSyncAdapter.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/sync/TraktWatchedSyncAdapter.kt index 714dbcf7..9267011e 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/sync/TraktWatchedSyncAdapter.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/sync/TraktWatchedSyncAdapter.kt @@ -107,6 +107,8 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { val shows = mutableListOf() items.forEach { item -> + if (!item.shouldSyncToTraktHistory()) return@forEach + val ids = parseIds(item.id) ?: return@forEach val normalizedType = item.type.trim().lowercase() @@ -161,16 +163,11 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { ), ) } - } else { - // Series-level mark (no season/episode) → mark entire show - shows += TraktHistoryShowRequestDto( - title = item.name.takeIf { it.isNotBlank() }, - year = parseYear(item.releaseInfo), - ids = ids, - ) } } + if (movies.isEmpty() && shows.isEmpty()) return + val body = json.encodeToString( TraktHistoryAddRequestDto( movies = movies.takeIf { it.isNotEmpty() }, @@ -202,6 +199,8 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { val shows = mutableListOf() items.forEach { item -> + if (!item.shouldSyncToTraktHistory()) return@forEach + val ids = parseIds(item.id) ?: return@forEach val normalizedType = item.type.trim().lowercase() @@ -225,15 +224,11 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { ), ), ) - } else { - shows += TraktHistoryShowRequestDto( - title = item.name.takeIf { it.isNotBlank() }, - year = parseYear(item.releaseInfo), - ids = ids, - ) } } + if (movies.isEmpty() && shows.isEmpty()) return + val body = json.encodeToString( TraktHistoryRemoveRequestDto( movies = movies.takeIf { it.isNotEmpty() }, @@ -348,6 +343,13 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { private fun Int.pad4(): String = "$this".padStart(4, '0') } +internal fun WatchedItem.shouldSyncToTraktHistory(): Boolean { + val normalizedType = type.trim().lowercase() + return normalizedType == "movie" || + normalizedType == "film" || + (season != null && episode != null) +} + // ── DTOs for pull (GET /sync/watched) ─────────────────────────────────── @Serializable From 0f371e1b90c6ecaefc3ede299c8f5454f282b3c7 Mon Sep 17 00:00:00 2001 From: albyalex96 <72573722+albyalex96@users.noreply.github.com> Date: Thu, 30 Apr 2026 20:19:59 +0200 Subject: [PATCH 058/143] Update Italian strings in strings.xml --- .../composeResources/values-it/strings.xml | 146 +++++++++++++++++- 1 file changed, 138 insertions(+), 8 deletions(-) diff --git a/composeApp/src/commonMain/composeResources/values-it/strings.xml b/composeApp/src/commonMain/composeResources/values-it/strings.xml index 1e6ce43e..fca49b5c 100644 --- a/composeApp/src/commonMain/composeResources/values-it/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-it/strings.xml @@ -94,7 +94,7 @@ Quadrato Orizzontale Combina tutti i cataloghi in una singola scheda - Mostra scheda \"Tutti\" + Mostra scheda "Tutti" Riproduci la GIF configurata al posto della copertina statica quando disponibile. Mostra GIF se configurata %1$d sorgenti · %2$s @@ -297,7 +297,7 @@ Usa sfondi neri assoluti per schermi OLED. Lingua app Scegli lingua - Mostra, nascondi e personalizza lo stile della riga \"Continua a guardare\". + Mostra, nascondi e personalizza lo stile della riga "Continua a guardare". Regola la larghezza delle locandine e i preset del raggio degli angoli. DISPLAY HOME @@ -355,15 +355,15 @@ Richiesta ripresa all'avvio STILE SCHEDA ALL'AVVIO - COMPORTAMENTO \"PROSSIMO EPISODIO\" + COMPORTAMENTO "PROSSIMO EPISODIO" VISIBILITÀ - Mostra la riga \"Continua a guardare\" nella schermata Home. + Mostra la riga "Continua a guardare" nella schermata Home. Mostra Continua a guardare Locandina Scheda focalizzata sulla locandina Orizzontale Scheda orizzontale ricca di informazioni - Se abilitato, \"Prossimo episodio\" continua sempre dall'ultimo episodio visto. Se disabilitato, segue l'episodio visto più di recente. Utile se riguardi spesso episodi precedenti. + Se abilitato, "Prossimo episodio" continua sempre dall'ultimo episodio visto. Se disabilitato, segue l'episodio visto più di recente. Utile se riguardi spesso episodi precedenti. Prossimo episodio dall'ultimo visto HOME SORGENTI @@ -502,7 +502,7 @@ Forzati Nessuno Preferisci Binge Group - Durante la riproduzione automatica, preferisci un flusso dello stesso \"binge group\" di quello attuale. + Durante la riproduzione automatica, preferisci un flusso dello stesso "binge group" di quello attuale. Lingua audio preferita Lingua sottotitoli preferita Preset @@ -544,7 +544,7 @@ Mostra overlay di caricamento Mostra una schermata di caricamento all'avvio della riproduzione di un flusso. Salta Intro/Outro/Recap - Mostra il pulsante \"salta\" durante i segmenti rilevati di introduzione, chiusura e riassunto. + Mostra il pulsante "salta" durante i segmenti rilevati di introduzione, chiusura e riassunto. Ambito sorgente Tutti gli addon Considera i flussi da tutti gli addon installati. @@ -819,7 +819,7 @@ Scegli un avatar Scegli un avatar qui sotto. Crea profilo - Tutti i dati di \"%1$s\" verranno eliminati permanentemente. + Tutti i dati di "%1$s" verranno eliminati permanentemente. Elimina profilo Aggiungi profilo Modifica profilo @@ -1040,4 +1040,134 @@ KB MB GB + %1$d selezionati + %1$d cataloghi + %1$d selezionati + Sorgenti TMDB + Lista pubblica + Produzione + Network + Collezione + Persona + Regista + Personalizzato + Scegli una sorgente pronta all\'uso. Puoi modificarla o rimuoverla dopo averla aggiunta. + Incolla l\'URL di una lista pubblica TMDB o solo l\'ID numerico dall\'URL. + Cerca per nome dello studio, oppure incolla l\'ID/URL di una casa di produzione TMDB per aggiungerla direttamente. + Inserisci un ID network. I network più comuni sono disponibili nei Preset e nei filtri rapidi. + Cerca il nome di una collezione di film o incolla l\'ID collezione da TMDB. + Inserisci l\'ID o l\'URL di una persona su TMDB per creare una riga basata sul cast. + Inserisci l\'ID o l\'URL di una persona su TMDB per creare una riga basata sulla regia. + Crea una riga dinamica TMDB usando filtri opzionali. Lascia i campi vuoti se non ti serve un filtro specifico. + Lista pubblica TMDB + ID Network + ID Collezione + ID Persona + Nome, ID o URL casa di produzione + ID o URL TMDB + https://www.themoviedb.org/list/8504994 o 8504994 + 213 per Netflix, 49 per HBO, 2739 per Disney+ + 10 per Star Wars Collection + Marvel Studios, 420, o URL società + 31 per Tom Hanks, o URL persona + Esempi: Marvel Studios, 420, o https://www.themoviedb.org/company/420. + Esempio: Star Wars Collection, Harry Potter Collection, o URL collezione. + Esempi ID: Netflix 213, HBO 49, Disney+ 2739. + Esempio: https://www.themoviedb.org/list/8504994 o 8504994. + Esempio: https://www.themoviedb.org/person/31-tom-hanks o 31. + Titolo visualizzato + Appare come nome della riga/scheda. Se vuoto, Nuvio ne creerà uno dalla sorgente. + Film Marvel, Originali Netflix, Pixar + Film con Tom Hanks, Attori preferiti + Film di Christopher Nolan, Registi preferiti + Migliori film d\'azione, Drama coreani, Animazione 2024 + Risultati della ricerca + Collezione TMDB + Società TMDB %1$d + Collezione TMDB %1$d + Tipo + Film + Serie TV + Entrambi + Ordina + Filtri + Lascia i campi vuoti se non ti serve quel filtro. + Generi rapidi + Lingue rapide + Paesi rapidi + Parole chiave rapide + Studi rapidi + Network rapidi + ID Generi + Usa i numeri dei generi TMDB. Separa con la virgola per AND, o con la barra verticale (pipe) per OR. + Data uscita dal + Data uscita al + Usa AAAA-MM-GG, ad esempio 2024-01-01. + Voto minimo + Voto massimo + Valutazione TMDB da 0 a 10. Esempio: 7.0. + Voti minimi + Usa questo per evitare titoli poco noti con pochi voti. Esempio: 100. + Lingua originale + Usa codici lingua a due lettere, ad esempio it, en, ko. + Paese d\'origine + Usa codici paese a due lettere, ad esempio IT, US, KR. + ID Parole chiave + Usa i numeri delle parole chiave TMDB. I suggerimenti rapidi contengono esempi comuni. + 9715 per supereroi + ID Società + Usa gli ID degli studi/società. I suggerimenti rapidi contengono esempi comuni. + 420 per Marvel Studios + ID Network + Solo per le serie TV. Usa ID network come Netflix (213) o HBO (49). + 213 per Netflix + Anno + Usa l\'anno a quattro cifre, ad esempio 2024. + Preset + Cerca + Aggiungi sorgente + Azione + Avventura + Animazione + Commedia + Horror + Fantascienza + Dramma + Crime + Reality + Inglese + Coreano + Giapponese + Hindi + Spagnolo + Stati Uniti + Corea + Giappone + India + Regno Unito + Supereroi + Basato su un romanzo + Viaggio nel tempo + Spazio + Marvel + Disney + Pixar + Lucasfilm + Warner Bros. + Netflix + HBO + Disney+ + Prime Video + Hulu + Originale + Popolari + Più votati + Recenti + Lista TMDB + Collezione film TMDB + Produzione + Network + Persona + Regista + TMDB Discover From 626a690bca44b482fd541559c6d3a6f2226f4cca Mon Sep 17 00:00:00 2001 From: D4rk56 Date: Thu, 30 Apr 2026 21:38:44 +0200 Subject: [PATCH 059/143] Fix French translation --- .../composeResources/values-fr/strings.xml | 278 +++++++++--------- 1 file changed, 139 insertions(+), 139 deletions(-) diff --git a/composeApp/src/commonMain/composeResources/values-fr/strings.xml b/composeApp/src/commonMain/composeResources/values-fr/strings.xml index 58880bec..96edc2f7 100644 --- a/composeApp/src/commonMain/composeResources/values-fr/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-fr/strings.xml @@ -1,6 +1,6 @@ - Reconnaissance ouverte et crédits du projet + Reconnaissance et crédits du projet Retour Annuler Fermer @@ -19,36 +19,36 @@ Réessayer Enregistrer Installation en cours - Addons + Extensions Actif %1$d catalogues Configurable Actualisation %1$d ressources Indisponible - Configurer l\'addon - Supprimer l\'addon + Configurer l'extension + Supprimer l'extension Ajoutez une URL de manifeste pour commencer à charger des catalogues, métadonnées, streams ou sous-titres dans Nuvio. - Aucune addons installée. - Veuillez saisir une URL d\'addon. - URL de l\'addon - Installer l\'addon + Aucune extensions installée. + Veuillez saisir une URL de l'extension. + URL de l'extension + Installer l'extension Chargement des détails du manifeste… - Validation de l\'URL du manifeste et chargement des détails de l\'addon avant installation. - Vérification de l\'addon - Échec de l\'installation + Validation de l'URL du manifeste et chargement des détails de l'extension avant installation. + Vérification de l'extension + Échec de l'installation %1$s a été validé et ajouté avec succès. - Addon installée - Déplacer l\'addon vers le bas - Déplacer l\'addon vers le haut + Extension installée + Déplacer l'extension vers le bas + Déplacer l'extension vers le haut Actif - Addons + Extensions Catalogues - Actualiser l\'addon - Ajouter une addon - Addons installées + Actualiser l'extension + Ajouter une extension + Extensions installées Aperçu - %1$d règles d\'ID + %1$d règles d'ID Version %1$s Sélectionné Copier le JSON @@ -58,28 +58,28 @@ Ajouter un catalogue Ajouter un dossier Tous les genres - Ajoutez des catalogues depuis vos extensions installées pour définir ce qu\'affiche ce dossier. + Ajoutez des catalogues depuis vos extensions installées pour définir ce qu'affiche ce dossier. Aucune source de catalogue Choisir Emoji - URL de l\'image + URL de l'image Aucune Couverture Créer une collection Terminé Modifier la collection Modifier le dossier - Configurez l\'identité, la présentation et les sources de catalogue du dossier avec la même structure que l\'éditeur principal de collections. + Configurez l'identité, la présentation et les sources de catalogue du dossier avec la même structure que l'éditeur principal de collections. Ajoutez-en un pour commencer. Aucun dossier Dossiers Filtre de genre - Afficher uniquement l\'image de couverture + Afficher uniquement l'image de couverture Masquer le titre Nouveau dossier - Affiche cette collection au-dessus de tous les catalogues normaux de l\'accueil. Plusieurs collections épinglées suivent l\'ordre de création. + Affiche cette collection au-dessus de tous les catalogues normaux de l'accueil. Plusieurs collections épinglées suivent l'ordre de création. Épingler au-dessus des catalogues - URL de l\'image de fond (facultatif) + URL de l'image de fond (facultatif) Nom du dossier URL du GIF animé (se lit uniquement au focus) Nom de la collection @@ -88,7 +88,7 @@ Apparence Informations de base Sources de catalogue - Choisissez les catalogues d\'extension que ce dossier doit regrouper. + Choisissez les catalogues d'extension que ce dossier doit regrouper. Sélectionner des catalogues Sélectionner un genre %1$d sélectionné(s) @@ -98,26 +98,26 @@ Carré Large Combiner tous les catalogues en un seul onglet - Afficher l\'onglet « Tout » - Lire le GIF configuré à la place de la couverture statique lorsqu\'il est disponible. + Afficher l'onglet « Tout » + Lire le GIF configuré à la place de la couverture statique lorsqu'il est disponible. Afficher le GIF si configuré %1$d source(s) · %2$s Forme de la tuile Lignes Onglets - Mode d\'affichage + Mode d'affichage Sources TMDB Liste publique Production Chaîne Collection Personnalisé - Choisissez une source prédéfinie. Vous pouvez la modifier ou la supprimer après l\'avoir ajoutée. - Collez une URL de liste publique TMDB ou uniquement le numéro de l\'URL. + Choisissez une source prédéfinie. Vous pouvez la modifier ou la supprimer après l'avoir ajoutée. + Collez une URL de liste publique TMDB ou uniquement le numéro de l'URL. Recherchez par nom de studio, ou collez un ID/URL de société TMDB et ajoutez-le directement. Saisissez un ID de chaîne. Les chaînes courantes sont disponibles dans les préréglages et les filtres rapides. - Recherchez le nom d\'une collection de films ou collez l\'ID de collection TMDB. - Créez une ligne TMDB dynamique avec des filtres optionnels. Laissez les champs vides si vous n\'avez pas besoin de ce filtre. + Recherchez le nom d'une collection de films ou collez l'ID de collection TMDB. + Créez une ligne TMDB dynamique avec des filtres optionnels. Laissez les champs vides si vous n'avez pas besoin de ce filtre. Liste publique TMDB ID de chaîne ID de collection @@ -129,12 +129,12 @@ Marvel Studios, 420 ou URL de société Exemples : Marvel Studios, 420 ou https://www.themoviedb.org/company/420. Exemple : Star Wars Collection, Harry Potter Collection ou une URL de collection. - Exemples d\'ID : Netflix 213, HBO 49, Disney+ 2739. + Exemples d'ID : Netflix 213, HBO 49, Disney+ 2739. Exemple : https://www.themoviedb.org/list/8504994 ou 8504994. Titre affiché Affiché comme nom de ligne/onglet. Si vide, Nuvio en génère un depuis la source. Films Marvel, Originaux Netflix, Pixar - Meilleurs films d\'action, drames coréens, animation 2024 + Meilleurs films d'action, drames coréens, animation 2024 Résultats de recherche Collection TMDB Société TMDB %1$d @@ -145,7 +145,7 @@ Les deux Tri Filtres - Laissez les champs vides si vous n\'avez pas besoin de ce filtre. + Laissez les champs vides si vous n'avez pas besoin de ce filtre. Genres rapides Langues rapides Pays rapides @@ -155,7 +155,7 @@ ID de genre Utilisez des numéros de genre TMDB. Séparez plusieurs valeurs par des virgules pour ET, ou des barres verticales pour OU. Date de sortie ou de diffusion depuis - Date de sortie ou de diffusion jusqu\'au + Date de sortie ou de diffusion jusqu'au Utilisez le format AAAA-MM-JJ, ex. 2024-01-01. Note minimale Note maximale @@ -164,7 +164,7 @@ Utilisez ceci pour éviter les titres peu connus avec peu de votes. Exemple : 100. Langue originale Utilisez des codes de langue à deux lettres, ex. en, ko, ja, hi. - Pays d\'origine + Pays d'origine Utilisez des codes de pays à deux lettres, ex. US, KR, JP, IN. ID de mots-clés Utilisez des numéros de mots-clés TMDB. Les puces rapides remplissent des exemples courants. @@ -200,7 +200,7 @@ Inde Royaume-Uni Super-héros - Adapté d\'un roman + Adapté d'un roman Voyage dans le temps Espace Marvel @@ -251,7 +251,7 @@ Connectez-vous pour accéder à votre bibliothèque et votre progression Se connecter Inscrivez-vous pour synchroniser vos données entre appareils - S\'inscrire + S'inscrire Vos données seront uniquement stockées localement Regardez tout, partout Bon retour @@ -314,13 +314,13 @@ Ajouter un profil Effacer la recherche Découvrir - Les extensions installées n\'ont retourné aucun résultat de recherche valide. + Les extensions installées n'ont retourné aucun résultat de recherche valide. La recherche a échoué Installez et validez au moins une extension avant de rechercher. Aucune extension active - Les catalogues installés n\'ont retourné aucun résultat pour cette requête. + Les catalogues installés n'ont retourné aucun résultat pour cette requête. Aucun résultat trouvé - Vos extensions installées n\'exposent pas de catalogue de recherche. + Vos extensions installées n'exposent pas de catalogue de recherche. Aucun catalogue de recherche Rechercher des films, séries… Recherches récentes @@ -332,7 +332,7 @@ Apparence Contenu et découverte Continuer à regarder - Écran d\'accueil + Écran d'accueil Intégrations Notes MDBList Écran méta @@ -347,15 +347,15 @@ À PROPOS Gérez votre compte, déconnectez-vous ou supprimez-le. COMPTE - Ajustez la présentation de l\'accueil et les préférences visuelles. - Rechercher de nouvelles versions de l\'application. + Ajustez la présentation de l'accueil et les préférences visuelles. + Rechercher de nouvelles versions de l'application. Vérifier les mises à jour Gérez les extensions et sources de découverte. Gérez vos films et épisodes téléchargés. Téléchargements GÉNÉRAL Connectez les services TMDB et MDBList. - Gérez les alertes de sortie d\'épisodes et envoyez une notification de test. + Gérez les alertes de sortie d'épisodes et envoyez une notification de test. Basculer vers un profil différent. Changer de profil Connectez Trakt, synchronisez des listes et enregistrez des titres directement dans Trakt. @@ -369,8 +369,8 @@ %1$d/10 Avis Spoiler - Aucun avis Trakt pour l\'instant. - %1$d j\'aime + Aucun avis Trakt pour l'instant. + %1$d j'aime Ce commentaire contient des spoilers. Ce commentaire contient des spoilers et a été masqué. Commentaires @@ -407,31 +407,31 @@ Adresse e-mail Non connecté Se déconnecter - Vous serez redirigé vers l\'écran de connexion. + Vous serez redirigé vers l'écran de connexion. Se déconnecter ? Statut Anonyme Connecté Noir AMOLED Utilise des fonds noirs purs pour les écrans OLED. - Langue de l\'application + Langue de l'application Choisir la langue Afficher, masquer et ajuster le bandeau Continuer à regarder. - Ajustez la largeur partagée des cartes d\'affiches et les rayons des coins. + Ajustez la largeur partagée des cartes d'affiches et les rayons des coins. AFFICHAGE ACCUEIL THÈME Collection • %1$s Nom affiché - Installez une extension avec des catalogues compatibles avec les tableaux pour configurer les lignes de l\'écran d\'accueil. - Aucun catalogue d\'accueil + Installez une extension avec des catalogues compatibles avec les tableaux pour configurer les lignes de l'écran d'accueil. + Aucun catalogue d'accueil Source Hero Masqué - Garder l\'accueil en focus + Garder l'accueil en focus %1$s • Limite atteinte (max. %2$d) Aucune source Hero sélectionnée Absent du Hero - Retirez l\'épingle de la collection pour la déplacer + Retirez l'épingle de la collection pour la déplacer Épinglé Épinglé en haut Réorganiser @@ -442,16 +442,16 @@ SOURCES HERO %1$d sur %2$d sélectionnés Afficher le Hero - Afficher un carrousel Hero en vedette en haut de l\'accueil. Choisissez jusqu\'à 2 catalogues sources ci-dessous. + Afficher un carrousel Hero en vedette en haut de l'accueil. Choisissez jusqu'à 2 catalogues sources ci-dessous. %1$d sur %2$d catalogues visibles • %3$d sources Hero sélectionnées Ouvrez un catalogue uniquement si vous avez besoin de le renommer ou de le réorganiser. Visible Lecteur, sous-titres et lecture automatique Rayon de carte - STYLE DE CARTE D\'AFFICHE + STYLE DE CARTE D'AFFICHE Largeur de carte Personnalisé - Personnalisez la largeur de carte et le rayon des coins pour les cartes d\'affiches partagées dans toute l\'application. + Personnalisez la largeur de carte et le rayon des coins pour les cartes d'affiches partagées dans toute l'application. Masquer les étiquettes Mode paysage pour les affiches dans les rayons Aperçu en direct @@ -470,36 +470,36 @@ Dense Grand Standard - Afficher une invite pour reprendre là où vous en étiez à l\'ouverture de l\'application après avoir quitté le lecteur. + Afficher une invite pour reprendre là où vous en étiez à l'ouverture de l'application après avoir quitté le lecteur. Invite de reprise au démarrage STYLE DE CARTE AU DÉMARRAGE COMPORTEMENT DE LA SUITE VISIBILITÉ - Afficher le bandeau Continuer à regarder sur l\'écran d\'accueil. + Afficher le bandeau Continuer à regarder sur l'écran d'accueil. Afficher Continuer à regarder Affiche - Carte d\'affiche centrée sur la couverture + Carte d'affiche centrée sur la couverture Large Carte horizontale riche en informations - Quand activé, La suite reprend toujours depuis l\'épisode le plus avancé vu. Quand désactivé, suit l\'épisode le plus récemment visionné. Utile si vous revoyez des épisodes précédents. - La suite depuis l\'épisode le plus avancé + Quand activé, La suite reprend toujours depuis l'épisode le plus avancé vu. Quand désactivé, suit l'épisode le plus récemment visionné. Utile si vous revoyez des épisodes précédents. + La suite depuis l'épisode le plus avancé ACCUEIL SOURCES Installez, supprimez, mettez à jour et ordonnez vos sources de contenu. Installez des dépôts de scrapers JavaScript et testez des fournisseurs en interne. - Contrôlez quels catalogues apparaissent à l\'accueil et dans quel ordre. + Contrôlez quels catalogues apparaissent à l'accueil et dans quel ordre. Désactivez des sections de détails et réorganisez tout sous le Hero. - Créez des regroupements de catalogues personnalisés avec des dossiers affichés à l\'accueil. + Créez des regroupements de catalogues personnalisés avec des dossiers affichés à l'accueil. INTÉGRATIONS - Enrichissez les pages de détails avec de l\'art, des crédits, des métadonnées d\'épisodes et plus depuis TMDB. - Ajoutez des notes externes d\'IMDb, Rotten Tomatoes, Metacritic et d\'autres aux pages de détails. - Ajoutez votre clé API MDBList ci-dessous avant d\'activer les notes. + Enrichissez les pages de détails avec de l'art, des crédits, des métadonnées d'épisodes et plus depuis TMDB. + Ajoutez des notes externes d'IMDb, Rotten Tomatoes, Metacritic et d'autres aux pages de détails. + Ajoutez votre clé API MDBList ci-dessous avant d'activer les notes. Obtenez une clé sur https://mdblist.com/preferences et collez-la ici. Clé API Clé API MDBList Activer les notes MDBList - Afficher les notes externes de MDBList sur les pages de métadonnées lorsqu\'un ID IMDb est disponible. + Afficher les notes externes de MDBList sur les pages de métadonnées lorsqu'un ID IMDb est disponible. CLÉ API FOURNISSEURS DE NOTES MDBLIST @@ -508,21 +508,21 @@ Casting Liste principale du casting. Fond cinématographique - Fond flou derrière le contenu, similaire à l\'écran de streams. + Fond flou derrière le contenu, similaire à l'écran de streams. Collection Rayon de collection ou de franchise associée. Commentaires Section de commentaires Trakt. Détails Durée, statut, sortie, langue et informations associées. - Cartes d\'épisodes - Choisissez comment les épisodes sont affichés sur l\'écran de métadonnées. + Cartes d'épisodes + Choisissez comment les épisodes sont affichés sur l'écran de métadonnées. Horizontal Cartes en ligne style fond Liste Cartes empilées centrées sur les détails Épisodes - Saisons et liste d\'épisodes pour les séries. + Saisons et liste d'épisodes pour les séries. Groupe %1$d Plus comme ceci Rayon de recommandations. @@ -533,14 +533,14 @@ Studios et chaînes. APPARENCE SECTIONS - Groupe d\'onglets %1$d + Groupe d'onglets %1$d Disposition des onglets - Regroupez les sections en onglets comme dans l\'application TV. Assignez jusqu\'à 3 sections par groupe d\'onglets. + Regroupez les sections en onglets comme dans l'application TV. Assignez jusqu'à 3 sections par groupe d'onglets. Bandes-annonces Rayon de bandes-annonces et raccourcis de lecture. Les notifications sont actuellement désactivées dans Nuvio. - Alertes de sortie d\'épisodes - Programmez des notifications locales lorsqu\'un nouvel épisode d\'une série sauvegardée est disponible. + Alertes de sortie d'épisodes + Programmez des notifications locales lorsqu'un nouvel épisode d'une série sauvegardée est disponible. Les notifications système sont désactivées pour Nuvio. Activez-les pour recevoir des alertes et des notifications de test. Il y a actuellement %1$d alertes de sortie programmées sur cet appareil. ALERTES @@ -548,11 +548,11 @@ Envoyer une notification de test Envoi de la notification de test… Envoyer une notification locale de test pour %1$s. - Sauvegardez d\'abord une série dans votre bibliothèque pour tester les notifications. + Sauvegardez d'abord une série dans votre bibliothèque pour tester les notifications. Notification de test Communauté Découvrez les personnes qui construisent et soutiennent Nuvio sur Mobile, TV et Web. - L\'API des supporters n\'est pas configurée. Ajoutez DONATIONS_BASE_URL dans local.properties. + L'API des supporters n'est pas configurée. Ajoutez DONATIONS_BASE_URL dans local.properties. Contributeurs Supporters Ouvrir GitHub @@ -590,11 +590,11 @@ ID client AnimeSkip Saisissez votre ID client API AnimeSkip. Obtenez-en un sur anime-skip.com. Rechercher également des marqueurs de saut sur AnimeSkip (nécessite un ID client). - Lecture automatique de l\'épisode suivant - Rechercher et lire automatiquement l\'épisode suivant lorsque le seuil est atteint. + Lecture automatique de l'épisode suivant + Rechercher et lire automatiquement l'épisode suivant lorsque le seuil est atteint. Appareil uniquement - Préférer l\'application (FFmpeg) - Préférer l\'appareil + Préférer l'application (FFmpeg) + Préférer l'appareil Priorité du décodeur Appuyez en dehors pour fermer Appuyez en dehors pour enregistrer et fermer @@ -606,18 +606,18 @@ Utiliser libass pour afficher les sous-titres ASS/SSA à la place du moteur par défaut. Vitesse au maintien Maintenir pour accélérer - Maintenez appuyé n\'importe où sur la surface du lecteur pour augmenter temporairement la vitesse. + Maintenez appuyé n'importe où sur la surface du lecteur pour augmenter temporairement la vitesse. Modèle regex invalide Durée du cache du dernier lien Mapper DV7 vers HEVC Utiliser Dolby Vision Profil 7 vers HEVC comme alternative pour les appareils non compatibles. Minutes avant la fin - Afficher la carte de l\'épisode suivant ce nombre de minutes avant la fin. + Afficher la carte de l'épisode suivant ce nombre de minutes avant la fin. %1$d min Aucun élément disponible Non défini Par défaut - Langue de l\'appareil + Langue de l'appareil Forcé Aucun Préférer le groupe binge @@ -625,10 +625,10 @@ Langue audio préférée Langue des sous-titres préférée Préréglages - Correspond au nom du stream, à l\'étiquette, à la description, à l\'extension et à l\'URL. + Correspond au nom du stream, à l'étiquette, à la description, à l'extension et à l'URL. Modèle regex 4K|2160p|Remux - N\'importe quel 1080p+ + N'importe quel 1080p+ AVC / x264 Qualité BluRay Dolby Atmos / DTS @@ -661,9 +661,9 @@ RENDU DES SOUS-TITRES %1$d sélectionné(s) Afficher la superposition de chargement - Afficher la superposition de chargement initiale pendant le démarrage d\'un stream. - Passer l\'intro/outro/récap - Afficher un bouton de saut lors des segments d\'intro, d\'outro et de récapitulatif détectés. + Afficher la superposition de chargement initiale pendant le démarrage d'un stream. + Passer l'intro/outro/récap + Afficher un bouton de saut lors des segments d'intro, d'outro et de récapitulatif détectés. Périmètre des sources Toutes les extensions Considérer les streams de toutes les extensions installées. @@ -680,28 +680,28 @@ Sélectionner les streams manuellement à chaque fois. Correspondance regex Sélectionner automatiquement un stream correspondant à un modèle regex. - Délai d\'expiration du stream + Délai d'expiration du stream Combien de temps attendre les streams avant la sélection automatique. Minutes avant la fin Mode de seuil Minutes avant la fin Pourcentage Pourcentage de seuil - Afficher la carte de l\'épisode suivant lorsque la lecture atteint ce pourcentage. + Afficher la carte de l'épisode suivant lorsque la lecture atteint ce pourcentage. %1$d% Instantané %1$ds Illimité Lecture tunnelisée Active la lecture tunnelisée pour une latence réduite dans la synchronisation audio/vidéo. - Ajoutez votre propre clé API TMDB ci-dessous avant d\'activer l\'enrichissement. + Ajoutez votre propre clé API TMDB ci-dessous avant d'activer l'enrichissement. Clé API TMDB - Activer l\'enrichissement TMDB - Utiliser votre clé API TMDB pour enrichir les métadonnées de l\'extension sur l\'écran de détails lorsqu\'un ID TMDB ou IMDb est disponible. + Activer l'enrichissement TMDB + Utiliser votre clé API TMDB pour enrichir les métadonnées de l'extension sur l'écran de détails lorsqu'un ID TMDB ou IMDb est disponible. Saisissez votre clé API v3 TMDB. Code de langue Visuels - Remplacer le fond, l\'affiche et le logo par les visuels TMDB. + Remplacer le fond, l'affiche et le logo par les visuels TMDB. Informations de base Utiliser le titre, le synopsis, les genres et la note de TMDB. Collections @@ -717,9 +717,9 @@ Chaînes Utiliser les métadonnées des chaînes TMDB pour les titres TV. Sociétés de production - Utiliser les métadonnées des sociétés de production TMDB sur l\'écran de détails. + Utiliser les métadonnées des sociétés de production TMDB sur l'écran de détails. Affiches de saison - Utiliser les affiches de saison TMDB dans le sélecteur de saisons de l\'écran de métadonnées pour les séries. + Utiliser les affiches de saison TMDB dans le sélecteur de saisons de l'écran de métadonnées pour les séries. Bandes-annonces Récupérer et afficher la section des bandes-annonces TMDB sur les pages de détails. Clé API personnelle @@ -737,13 +737,13 @@ Connecté en tant que %1$s Utilisateur Trakt Déconnecter - Impossible d\'ouvrir le navigateur + Impossible d'ouvrir le navigateur FONCTIONNALITÉS Terminez la connexion Trakt dans votre navigateur Suivez ce que vous regardez, enregistrez dans votre liste ou vos listes personnalisées et gardez votre bibliothèque synchronisée avec Trakt. Identifiants Trakt manquants dans local.properties (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET). Ouvrir la connexion Trakt - Vos actions d\'enregistrement peuvent maintenant cibler la watchlist Trakt et vos listes personnelles. + Vos actions d'enregistrement peuvent maintenant cibler la watchlist Trakt et vos listes personnelles. Connectez-vous avec Trakt pour activer la sauvegarde basée sur les listes et le mode bibliothèque Trakt. Score du public IMDb @@ -763,11 +763,11 @@ Épisode suivant Recherche de la source… Lecture via %1$s dans %2$d… - Miniature de l\'épisode suivant + Miniature de l'épisode suivant Non diffusé Passer - Passer l\'intro - Passer l\'outro + Passer l'intro + Passer l'outro Passer le récap Aucun sous-titre trouvé Afrikaans @@ -856,32 +856,32 @@ Non Mettre à jour Oui - Voulez-vous quitter l\'application ? - Quitter l\'application - Ce catalogue n\'a retourné aucun élément. + Voulez-vous quitter l'application ? + Quitter l'application + Ce catalogue n'a retourné aucun élément. Aucun titre trouvé Vérifiez votre connexion Wi‑Fi ou données mobiles et réessayez. Réalisateur Échec du chargement Plus comme ceci Saisons - Cette extension a retourné des vidéos pour la série, mais aucune n\'incluait de numéros de saison ou d\'épisode. - Cette extension n\'a fourni aucune métadonnée d\'épisode pour cette série. - Cette extension n\'a pas encore publié d\'épisodes. - Votre appareil est en ligne, mais Nuvio n\'a pas pu se connecter aux serveurs nécessaires. + Cette extension a retourné des vidéos pour la série, mais aucune n'incluait de numéros de saison ou d'épisode. + Cette extension n'a fourni aucune métadonnée d'épisode pour cette série. + Cette extension n'a pas encore publié d'épisodes. + Votre appareil est en ligne, mais Nuvio n'a pas pu se connecter aux serveurs nécessaires. Afficher moins Afficher plus ▾ Scénariste Tous les genres Catalogue %1$s • %2$s - Le catalogue sélectionné n\'a retourné aucun élément de découverte. + Le catalogue sélectionné n'a retourné aucun élément de découverte. Impossible de charger Découvrir - Les extensions installées n\'exposent pas de catalogues compatibles avec le tableau pour Découvrir. + Les extensions installées n'exposent pas de catalogues compatibles avec le tableau pour Découvrir. Aucun catalogue de découverte - Le catalogue et les filtres sélectionnés n\'ont retourné aucun élément. + Le catalogue et les filtres sélectionnés n'ont retourné aucun élément. Aucun titre trouvé - Installez et validez au moins une extension avant d\'explorer les catalogues dans Découvrir. + Installez et validez au moins une extension avant d'explorer les catalogues dans Découvrir. Sélectionner un catalogue Sélectionner un genre Sélectionner un type @@ -894,9 +894,9 @@ Marquer comme vu Suivant %1$s vu - Installez et validez au moins une extension avant de charger des lignes de catalogue à l\'accueil. - Les extensions installées n\'exposent actuellement aucun catalogue compatible avec le tableau sans extras requis. - Aucune ligne d\'accueil disponible + Installez et validez au moins une extension avant de charger des lignes de catalogue à l'accueil. + Les extensions installées n'exposent actuellement aucun catalogue compatible avec le tableau sans extras requis. + Aucune ligne d'accueil disponible Voir les détails Contrôles pour lire et enregistrer. Actions @@ -906,7 +906,7 @@ Section de commentaires Trakt. Durée, statut, date de sortie, langue et informations associées. Détails - Saisons et liste d\'épisodes pour les séries. + Saisons et liste d'épisodes pour les séries. Rayon de recommandations. Plus comme ceci Synopsis, notes, genres et crédits principaux. @@ -915,7 +915,7 @@ Production Rayon de bandes-annonces et raccourcis de lecture. De nouveau en ligne - Impossible d\'atteindre les serveurs + Impossible d'atteindre les serveurs Pas de connexion Internet (âge %1$d) Né(e) le %1$s%2$s @@ -933,7 +933,7 @@ Code PIN oublié ? Code PIN incorrect Bloqué. Réessayez dans %1$ds - Les options d\'avatar apparaîtront ici une fois le catalogue chargé. + Les options d'avatar apparaîtront ici une fois le catalogue chargé. Avatar : %1$s Choisir un avatar Choisissez un avatar ci-dessous. @@ -955,7 +955,7 @@ Supprimer le verrouillage PIN Enregistrement… Sécurité - Ajoutez un code PIN si vous souhaitez que ce profil soit verrouillé avant d\'y accéder. + Ajoutez un code PIN si vous souhaitez que ce profil soit verrouillé avant d'y accéder. Ce profil est protégé par un code PIN. Sélectionnez un avatar pour ce profil. Configurer le verrouillage PIN @@ -966,15 +966,15 @@ Téléchargé Reprendre Scrapers actifs - Vérification d\'autres extensions… + Vérification d'autres extensions… Copier le lien du stream Télécharger le fichier - Les extensions de streams installées n\'ont pas retourné de réponse valide. + Les extensions de streams installées n'ont pas retourné de réponse valide. Impossible de charger les streams - Installez d\'abord une extension pour charger les streams de ce titre. + Installez d'abord une extension pour charger les streams de ce titre. Vos extensions installées ne fournissent pas de streams pour ce type de titre. Aucune extension de streams disponible - Aucune de vos extensions installées n\'a retourné de streams pour ce titre. + Aucune de vos extensions installées n'a retourné de streams pour ce titre. S%1$d E%2$d Épisode S%1$dE%2$d - %3$s @@ -996,9 +996,9 @@ Échec de la vérification des mises à jour Échec du téléchargement Téléchargement %1$d% - Impossible de démarrer l\'installation + Impossible de démarrer l'installation Vous utilisez la version la plus récente. - Activez l\'installation d\'applications pour Nuvio puis revenez pour continuer. + Activez l'installation d'applications pour Nuvio puis revenez pour continuer. Téléchargement de la mise à jour… Aucune mise à jour trouvée. Une nouvelle version est prête à être installée. @@ -1009,13 +1009,13 @@ Mise à jour disponible Statut de la mise à jour Cette extension est déjà installée. - Veuillez saisir une URL d\'extension valide + Veuillez saisir une URL d'extension valide Impossible de charger le manifeste Nuvio Impossible de supprimer le compte Échec de la connexion Échec de la déconnexion - Échec de l\'inscription + Échec de l'inscription Impossible de charger les éléments du catalogue. À suivre À suivre • S%1$dE%2$d @@ -1036,15 +1036,15 @@ Supprimer %1$s de votre bibliothèque ? Retirer de la bibliothèque ? Film - Alertes lorsqu\'un nouvel épisode d\'une série sauvegardée est disponible. - Aperçu de l\'alerte de sortie d\'épisode. - Impossible d\'envoyer une notification de test. + Alertes lorsqu'un nouvel épisode d'une série sauvegardée est disponible. + Aperçu de l'alerte de sortie d'épisode. + Impossible d'envoyer une notification de test. Notification de test envoyée pour %1$s. Impossible de lire ce stream. Le code PIN de ce profil a changé. Connectez-vous une fois pour mettre à jour le verrouillage sur cet appareil. Impossible de supprimer le verrouillage PIN. Veuillez réessayer. Connectez-vous à Internet pour supprimer le verrouillage PIN. - Ce code PIN ne peut pas encore être vérifié hors ligne sur cet appareil. Connectez-vous une fois et déverrouillez-le en ligne d\'abord. + Ce code PIN ne peut pas encore être vérifié hors ligne sur cet appareil. Connectez-vous une fois et déverrouillez-le en ligne d'abord. Impossible de définir le code PIN. Veuillez réessayer. Connectez-vous à Internet pour définir un code PIN. Ce profil utilise les extensions principales. @@ -1058,7 +1058,7 @@ Réponse de jeton Trakt invalide Impossible de charger la bibliothèque Trakt Liste %1$d - Trakt n\'a pas retourné de code d\'autorisation + Trakt n'a pas retourné de code d'autorisation Identifiants Trakt manquants Impossible de charger la progression Trakt Impossible de terminer la connexion Trakt @@ -1112,7 +1112,7 @@ Classification Détails du film Langue originale - Pays d\'origine + Pays d'origine Informations de sortie Durée Affiches @@ -1127,7 +1127,7 @@ Format de stream non pris en charge pour les téléchargements Corps de réponse vide La requête a échoué avec HTTP %1$d - Le système de téléchargement n\'est pas initialisé + Le système de téléchargement n'est pas initialisé La requête de téléchargement a échoué %1$s - %2$s Les titres enregistrés apparaîtront ici après avoir appuyé sur Enregistrer dans un écran de détails. @@ -1148,7 +1148,7 @@ %1$s • %2$s est maintenant disponible Un nouvel épisode est maintenant disponible %1$s est maintenant disponible - Sorties d\'épisodes + Sorties d'épisodes Créateur Réalisateur Scénariste From 12232cebe905fda436ca145dd92ad5f896f5d77a Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Fri, 1 May 2026 02:59:35 +0530 Subject: [PATCH 060/143] fix: ios player viewport container issues on downloads --- .../DownloadsPlatformDownloader.android.kt | 18 ++ .../commonMain/kotlin/com/nuvio/app/App.kt | 8 +- .../downloads/DownloadsPlatformDownloader.kt | 2 + .../features/downloads/DownloadsRepository.kt | 76 ++++++- .../nuvio/app/features/player/PlayerScreen.kt | 2 +- .../DownloadsPlatformDownloader.ios.kt | 198 ++++++++++-------- .../iosApp/OrientationLockCoordinator.swift | 4 + iosApp/iosApp/Player/MPVPlayerBridge.swift | 115 +++++++++- 8 files changed, 312 insertions(+), 111 deletions(-) diff --git a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.android.kt b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.android.kt index 502c14b1..52c7e112 100644 --- a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.android.kt +++ b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.android.kt @@ -168,6 +168,24 @@ internal actual object DownloadsPlatformDownloader { if (!tempFile.exists()) return true return runCatching { tempFile.delete() }.getOrDefault(false) } + + actual fun resolveLocalFileUri(localFileUri: String?, destinationFileName: String): String? { + localFileUri + ?.toLocalFileOrNull() + ?.takeIf { it.exists() } + ?.let { return it.toURI().toString() } + + val context = appContext ?: return null + val fileName = destinationFileName.trim().takeIf { it.isNotBlank() } + ?: localFileUri + ?.toLocalFileOrNull() + ?.name + ?.takeIf { it.isNotBlank() } + ?: return null + val downloadsDir = File(context.filesDir, "downloads") + val localFile = File(downloadsDir, fileName) + return localFile.takeIf { it.exists() }?.toURI()?.toString() + } } private class AndroidDownloadsTaskHandle( diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt index f3095f59..f9e85f6c 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt @@ -596,7 +596,9 @@ private fun MainAppContent( NetworkCondition.ServersUnreachable, -> { offlineLaunchRouteHandled = true - val hasPlayableDownload = downloadsUiState.completedItems.any { it.isPlayable } + val hasPlayableDownload = downloadsUiState.completedItems.any { + DownloadsRepository.playableLocalFileUri(it) != null + } if (hasPlayableDownload) { selectedTab = AppScreenTab.Settings navController.navigate(DownloadsSettingsRoute) { @@ -689,7 +691,7 @@ private fun MainAppContent( episodeNumber = episodeNumber, videoId = videoId, ) - val localSourceUrl = downloadedItem?.localFileUri + val localSourceUrl = downloadedItem?.let(DownloadsRepository::playableLocalFileUri) if (!localSourceUrl.isNullOrBlank()) { val launchId = PlayerLaunchStore.put( PlayerLaunch( @@ -1533,7 +1535,7 @@ private fun MainAppContent( DownloadsScreen( onBack = onBack, onOpenDownload = { item -> - val sourceUrl = item.localFileUri ?: return@DownloadsScreen + val sourceUrl = DownloadsRepository.playableLocalFileUri(item) ?: return@DownloadsScreen val resumeEntry = item.videoId .takeIf { it.isNotBlank() } ?.let(WatchProgressRepository::progressForVideo) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.kt index b2a331ad..9fb32ced 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.kt @@ -21,4 +21,6 @@ internal expect object DownloadsPlatformDownloader { fun removeFile(localFileUri: String?): Boolean fun removePartialFile(destinationFileName: String): Boolean + + fun resolveLocalFileUri(localFileUri: String?, destinationFileName: String): String? } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsRepository.kt index f6e715ba..7ed74677 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/downloads/DownloadsRepository.kt @@ -43,7 +43,7 @@ object DownloadsRepository { val normalizedVideoId = videoId?.trim().orEmpty() if (normalizedVideoId.isBlank()) return null return _uiState.value.items.firstOrNull { item -> - item.videoId == normalizedVideoId && item.isPlayable && !item.localFileUri.isNullOrBlank() + item.videoId == normalizedVideoId && item.hasPlayableLocalFile() } } @@ -64,20 +64,42 @@ object DownloadsRepository { item.parentMetaId == normalizedParentMetaId && item.seasonNumber == seasonNumber && item.episodeNumber == episodeNumber && - item.isPlayable && - !item.localFileUri.isNullOrBlank() + item.hasPlayableLocalFile() } } else { items.firstOrNull { item -> item.parentMetaId == normalizedParentMetaId && item.seasonNumber == null && item.episodeNumber == null && - item.isPlayable && - !item.localFileUri.isNullOrBlank() + item.hasPlayableLocalFile() } } } + fun playableLocalFileUri(item: DownloadItem): String? { + ensureLoaded() + if (item.status != DownloadStatus.Completed) return null + val resolvedUri = DownloadsPlatformDownloader.resolveLocalFileUri( + localFileUri = item.localFileUri, + destinationFileName = item.fileName, + ) ?: return null + + if (resolvedUri != item.localFileUri) { + mutateItem(item.id) { current -> + if (current.fileName == item.fileName) { + current.copy( + localFileUri = resolvedUri, + updatedAtEpochMs = DownloadsClock.nowEpochMs(), + ) + } else { + current + } + } + } + + return resolvedUri + } + fun enqueueFromStream( contentType: String, videoId: String, @@ -117,7 +139,7 @@ object DownloadsRepository { if (existing != null) { replacedExisting = true activeHandles.remove(existing.id)?.cancel() - DownloadsPlatformDownloader.removeFile(existing.localFileUri) + DownloadsPlatformDownloader.removeFile(playableLocalFileUri(existing) ?: existing.localFileUri) DownloadsPlatformDownloader.removePartialFile(existing.fileName) currentItems.removeAll { it.id == existing.id } } @@ -191,6 +213,14 @@ object DownloadsRepository { } } + fun pauseActiveDownloads() { + ensureLoaded() + _uiState.value.items + .filter { it.status == DownloadStatus.Downloading } + .map { it.id } + .forEach(::pauseDownload) + } + fun resumeDownload(downloadId: String) { ensureLoaded() val item = _uiState.value.items.firstOrNull { it.id == downloadId } ?: return @@ -217,7 +247,7 @@ object DownloadsRepository { val item = _uiState.value.items.firstOrNull { it.id == downloadId } ?: return activeHandles.remove(downloadId)?.cancel() - DownloadsPlatformDownloader.removeFile(item.localFileUri) + DownloadsPlatformDownloader.removeFile(playableLocalFileUri(item) ?: item.localFileUri) DownloadsPlatformDownloader.removePartialFile(item.fileName) publish(_uiState.value.items.filterNot { it.id == downloadId }) @@ -233,9 +263,10 @@ object DownloadsRepository { return } + var shouldPersistNormalized = false val normalized = DownloadsCodec.decodeItems(payload) .map { item -> - if (item.status == DownloadStatus.Downloading) { + val statusNormalized = if (item.status == DownloadStatus.Downloading) { item.copy( status = DownloadStatus.Paused, errorMessage = null, @@ -243,10 +274,19 @@ object DownloadsRepository { } else { item } + + val localUriNormalized = normalizeCompletedLocalFileUri(statusNormalized) + if (localUriNormalized != item) { + shouldPersistNormalized = true + } + localUriNormalized } _uiState.value = DownloadsUiState(normalized) notifyLiveStatusPlatform() + if (shouldPersistNormalized) { + persist() + } } private fun startDownload(item: DownloadItem) { @@ -359,6 +399,26 @@ object DownloadsRepository { append(nextDownloadOrdinal.toString(36)) } } + + private fun normalizeCompletedLocalFileUri(item: DownloadItem): DownloadItem { + if (item.status != DownloadStatus.Completed) return item + val resolvedUri = DownloadsPlatformDownloader.resolveLocalFileUri( + localFileUri = item.localFileUri, + destinationFileName = item.fileName, + ) ?: return item + return if (resolvedUri != item.localFileUri) { + item.copy(localFileUri = resolvedUri) + } else { + item + } + } + + private fun DownloadItem.hasPlayableLocalFile(): Boolean = + status == DownloadStatus.Completed && + DownloadsPlatformDownloader.resolveLocalFileUri( + localFileUri = localFileUri, + destinationFileName = fileName, + ) != null } @Serializable diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt index c3c5dd75..3dea8937 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt @@ -864,7 +864,7 @@ fun PlayerScreen( } fun switchToDownloadedEpisode(downloadItem: DownloadItem, episode: MetaVideo) { - val localFileUri = downloadItem.localFileUri ?: return + val localFileUri = DownloadsRepository.playableLocalFileUri(downloadItem) ?: return showNextEpisodeCard = false showSourcesPanel = false showEpisodesPanel = false diff --git a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.ios.kt b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.ios.kt index 2ce2b26a..733bec21 100644 --- a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.ios.kt +++ b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/downloads/DownloadsPlatformDownloader.ios.kt @@ -1,9 +1,8 @@ package com.nuvio.app.features.downloads import kotlinx.cinterop.ExperimentalForeignApi -import kotlinx.cinterop.addressOf +import kotlinx.cinterop.CPointer import kotlinx.cinterop.convert -import kotlinx.cinterop.usePinned import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope @@ -13,6 +12,7 @@ import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch import platform.Foundation.NSError import platform.Foundation.NSDate +import platform.Foundation.NSData import platform.Foundation.NSFileManager import platform.Foundation.NSHTTPURLResponse import platform.Foundation.NSHomeDirectory @@ -23,16 +23,17 @@ import platform.Foundation.NSURLRequestReloadIgnoringLocalCacheData import platform.Foundation.NSURLResponse import platform.Foundation.NSURLSession import platform.Foundation.NSURLSessionConfiguration -import platform.Foundation.NSURLSessionDownloadDelegateProtocol -import platform.Foundation.NSURLSessionDownloadTask +import platform.Foundation.NSURLSessionDataDelegateProtocol +import platform.Foundation.NSURLSessionDataTask import platform.Foundation.NSURLSessionTask import platform.Foundation.setHTTPMethod import platform.Foundation.setValue import platform.Foundation.timeIntervalSince1970 import platform.darwin.NSObject -import platform.posix.fopen +import platform.posix.FILE import platform.posix.fclose -import platform.posix.fread +import platform.posix.fflush +import platform.posix.fopen import platform.posix.fwrite private const val DOWNLOAD_REQUEST_TIMEOUT_SECONDS = 60.0 @@ -49,6 +50,10 @@ fun handleDownloadsBackgroundEvents( backgroundSessionCompletionHandlers[identifier] = completionHandler } +fun pauseDownloadsForAppBackground() { + DownloadsRepository.pauseActiveDownloads() +} + @OptIn(ExperimentalForeignApi::class) internal actual object DownloadsPlatformDownloader { actual fun start( @@ -132,22 +137,45 @@ internal actual object DownloadsPlatformDownloader { actual fun removeFile(localFileUri: String?): Boolean { if (localFileUri.isNullOrBlank()) return false val path = localFileUri.toLocalPath() ?: return false - return removePathIfExists(path) + if (NSFileManager.defaultManager.fileExistsAtPath(path)) { + return removePathIfExists(path) + } + + val fileName = path.substringAfterLast('/').takeIf { it.isNotBlank() } ?: return false + return removePathIfExists("${downloadsDirectoryPath()}/$fileName") } actual fun removePartialFile(destinationFileName: String): Boolean { val tempPath = "${downloadsDirectoryPath()}/$destinationFileName.part" return removePathIfExists(tempPath) } + + actual fun resolveLocalFileUri(localFileUri: String?, destinationFileName: String): String? { + localFileUri?.toLocalPath() + ?.takeIf { NSFileManager.defaultManager.fileExistsAtPath(it) } + ?.let { path -> + return NSURL.fileURLWithPath(path).absoluteString ?: "file://$path" + } + + val fileName = destinationFileName.trim().takeIf { it.isNotBlank() } + ?: localFileUri?.toLocalPath()?.substringAfterLast('/')?.takeIf { it.isNotBlank() } + ?: return null + val currentPath = "${downloadsDirectoryPath()}/$fileName" + return if (NSFileManager.defaultManager.fileExistsAtPath(currentPath)) { + NSURL.fileURLWithPath(currentPath).absoluteString ?: "file://$currentPath" + } else { + null + } + } } private class IosDownloadsTaskHandle( private val job: Job, ) : DownloadsTaskHandle { - private var task: NSURLSessionDownloadTask? = null + private var task: NSURLSessionTask? = null private var session: NSURLSession? = null - fun attach(task: NSURLSessionDownloadTask, session: NSURLSession) { + fun attach(task: NSURLSessionTask, session: NSURLSession) { this.task = task this.session = session } @@ -177,10 +205,14 @@ private class IosDownloadDelegate( private val resumeFromBytes: Long, private val tempPath: String, private val onProgress: (downloadedBytes: Long, totalBytes: Long?) -> Unit, -) : NSObject(), NSURLSessionDownloadDelegateProtocol { +) : NSObject(), NSURLSessionDataDelegateProtocol { private val completion = CompletableDeferred() private var result: IosDownloadResult? = null private var fileError: Throwable? = null + private var outputFile: CPointer? = null + private var startingBytesForResponse = 0L + private var bytesWrittenForResponse = 0L + private var totalBytesForResponse: Long? = null private var lastProgressBytes = -1L private var lastProgressTimestampSeconds = 0.0 @@ -188,12 +220,13 @@ private class IosDownloadDelegate( override fun URLSession( session: NSURLSession, - downloadTask: NSURLSessionDownloadTask, - didFinishDownloadingToURL: NSURL, + dataTask: NSURLSessionDataTask, + didReceiveResponse: NSURLResponse, + completionHandler: (Long) -> Unit, ) { - val httpResponse = downloadTask.response as? NSHTTPURLResponse + val httpResponse = didReceiveResponse as? NSHTTPURLResponse val statusCode = httpResponse?.statusCode?.toInt() ?: 200 - result = IosDownloadResult( + val nextResult = IosDownloadResult( statusCode = statusCode, contentRange = httpResponse?.valueForHTTPHeaderField("Content-Range"), contentLength = httpResponse @@ -201,51 +234,59 @@ private class IosDownloadDelegate( ?.toLongOrNull() ?.takeIf { it > 0L }, ) + result = nextResult - if (statusCode !in 200..299) return + if (statusCode in 200..299) { + val isPartialResume = attemptedRangeRequest && statusCode == 206 && resumeFromBytes > 0L + startingBytesForResponse = if (isPartialResume) resumeFromBytes else 0L + bytesWrittenForResponse = 0L + totalBytesForResponse = resolveTotalBytes( + startingBytes = startingBytesForResponse, + isPartialResume = isPartialResume, + contentRangeHeader = nextResult.contentRange, + contentLength = nextResult.contentLength, + ) - val sourcePath = didFinishDownloadingToURL.path - if (sourcePath.isNullOrBlank()) { - fileError = IllegalStateException("Downloaded file was not available") - return + outputFile = fopen(tempPath, if (isPartialResume) "ab" else "wb") ?: run { + fileError = IllegalStateException("Failed to open partial download file") + null + } + + reportProgress(startingBytesForResponse, totalBytesForResponse) } - val isPartialResume = attemptedRangeRequest && statusCode == 206 && resumeFromBytes > 0L - val stored = if (isPartialResume) { - appendFile(sourcePath, tempPath) - } else { - removePathIfExists(tempPath) && - NSFileManager.defaultManager.moveItemAtPath( - srcPath = sourcePath, - toPath = tempPath, - error = null, - ) - } - - if (!stored) { - fileError = IllegalStateException("Failed to store download file") - } + completionHandler(1L) } override fun URLSession( session: NSURLSession, - downloadTask: NSURLSessionDownloadTask, - didWriteData: Long, - totalBytesWritten: Long, - totalBytesExpectedToWrite: Long, + dataTask: NSURLSessionDataTask, + didReceiveData: NSData, ) { - val statusCode = (downloadTask.response as? NSHTTPURLResponse)?.statusCode?.toInt() - val startingBytes = if (attemptedRangeRequest && statusCode == 206 && resumeFromBytes > 0L) { - resumeFromBytes - } else { - 0L + if (fileError != null) return + + val file = outputFile ?: run { + fileError = IllegalStateException("Partial download file is not open") + return } - val expectedTotal = totalBytesExpectedToWrite - .takeIf { it > 0L } - ?.let { startingBytes + it } + + val bytesToWrite = didReceiveData.length.toLong() + val wrote = fwrite( + didReceiveData.bytes, + 1.convert(), + bytesToWrite.convert(), + file, + ).toLong() + if (wrote != bytesToWrite) { + fileError = IllegalStateException("Failed to write partial download file") + return + } + fflush(file) + + bytesWrittenForResponse += bytesToWrite reportProgress( - downloadedBytes = startingBytes + totalBytesWritten.coerceAtLeast(0L), - totalBytes = expectedTotal, + downloadedBytes = startingBytesForResponse + bytesWrittenForResponse, + totalBytes = totalBytesForResponse, ) } @@ -254,6 +295,8 @@ private class IosDownloadDelegate( task: NSURLSessionTask, didCompleteWithError: NSError?, ) { + closeOutputFile() + if (didCompleteWithError != null) { completion.completeExceptionally( IllegalStateException(didCompleteWithError.localizedDescription), @@ -275,6 +318,14 @@ private class IosDownloadDelegate( backgroundSessionCompletionHandlers.remove(identifier)?.invoke() } + private fun closeOutputFile() { + outputFile?.let { file -> + fflush(file) + fclose(file) + } + outputFile = null + } + private fun reportProgress( downloadedBytes: Long, totalBytes: Long?, @@ -374,9 +425,11 @@ private suspend fun performDownloadRequest( val session = NSURLSession.sessionWithConfiguration( configuration = configuration, delegate = delegate, - delegateQueue = NSOperationQueue(), + delegateQueue = NSOperationQueue().apply { + maxConcurrentOperationCount = 1 + }, ) - val task = session.downloadTaskWithRequest(nativeRequest) + val task = session.dataTaskWithRequest(nativeRequest) handle.attach(task, session) onProgress(resumeFromBytes.coerceAtLeast(0L), null) @@ -389,44 +442,6 @@ private suspend fun performDownloadRequest( } } -@OptIn(ExperimentalForeignApi::class) -private fun appendFile(sourcePath: String, destinationPath: String): Boolean { - val source = fopen(sourcePath, "rb") ?: return false - val destination = fopen(destinationPath, "ab") ?: run { - fclose(source) - return false - } - val buffer = ByteArray(16 * 1024) - - return try { - while (true) { - val read = buffer.usePinned { pinned -> - fread( - pinned.addressOf(0), - 1.convert(), - buffer.size.convert(), - source, - ).toInt() - } - if (read <= 0) break - - val wrote = buffer.usePinned { pinned -> - fwrite( - pinned.addressOf(0), - 1.convert(), - read.convert(), - destination, - ).toInt() - } - if (wrote != read) return false - } - true - } finally { - fclose(source) - fclose(destination) - } -} - @OptIn(ExperimentalForeignApi::class) private fun fileSizeOrNull(path: String): Long? { val attrs = NSFileManager.defaultManager.attributesOfItemAtPath(path, error = null) @@ -439,10 +454,11 @@ private fun fileSizeOrNull(path: String): Long? { } private fun String.toLocalPath(): String? { - if (startsWith("file://")) { - return removePrefix("file://") + val value = trim() + if (value.startsWith("file:")) { + return NSURL(string = value).path ?: value.removePrefix("file://") } - return takeIf { it.isNotBlank() } + return value.takeIf { it.isNotBlank() } } private fun resolveTotalBytes( diff --git a/iosApp/iosApp/OrientationLockCoordinator.swift b/iosApp/iosApp/OrientationLockCoordinator.swift index cf78e051..26d80c43 100644 --- a/iosApp/iosApp/OrientationLockCoordinator.swift +++ b/iosApp/iosApp/OrientationLockCoordinator.swift @@ -34,6 +34,10 @@ final class OrientationLockAppDelegate: NSObject, UIApplicationDelegate, UNUserN ) } + func applicationDidEnterBackground(_ application: UIApplication) { + DownloadsPlatformDownloader_iosKt.pauseDownloadsForAppBackground() + } + func userNotificationCenter( _ center: UNUserNotificationCenter, willPresent notification: UNNotification, diff --git a/iosApp/iosApp/Player/MPVPlayerBridge.swift b/iosApp/iosApp/Player/MPVPlayerBridge.swift index ae08f457..9839d1f0 100644 --- a/iosApp/iosApp/Player/MPVPlayerBridge.swift +++ b/iosApp/iosApp/Player/MPVPlayerBridge.swift @@ -137,12 +137,22 @@ struct TrackInfo { let selected: Bool } +private struct PendingLoadRequest { + let urlString: String + let audioUrl: String? + let requestHeaders: [String: String] + let queuedAtUptime: TimeInterval +} + // MARK: - MPV Player View Controller final class MPVPlayerViewController: UIViewController { private let errorStateLock = NSLock() private var metalLayer = MetalLayer() + private var lastAppliedDrawableSize: CGSize = .zero + private var pendingLoadRequest: PendingLoadRequest? + private var pendingLoadRetryWorkItem: DispatchWorkItem? private var mpv: OpaquePointer? private lazy var eventQueue = DispatchQueue(label: "mpv-events", qos: .userInitiated) private var recentPlaybackLogs: [String] = [] @@ -188,12 +198,14 @@ final class MPVPlayerViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .black + view.layer.masksToBounds = true - metalLayer.frame = view.bounds - metalLayer.contentsScale = UIScreen.main.nativeScale + metalLayer.contentsGravity = .resize + metalLayer.contentsScale = view.window?.screen.nativeScale ?? UIScreen.main.nativeScale metalLayer.framebufferOnly = true metalLayer.backgroundColor = UIColor.black.cgColor view.layer.addSublayer(metalLayer) + layoutMetalLayer() setupMpv() setupNotifications() @@ -207,17 +219,42 @@ final class MPVPlayerViewController: UIViewController { override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() - metalLayer.frame = view.bounds + layoutMetalLayer() + attemptStartPendingLoad() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) refreshImmersiveSystemUI() + attemptStartPendingLoad() } override func viewSafeAreaInsetsDidChange() { super.viewSafeAreaInsetsDidChange() + layoutMetalLayer() refreshImmersiveSystemUI() + attemptStartPendingLoad() + } + + private func layoutMetalLayer() { + let bounds = view.bounds + guard bounds.width > 1, bounds.height > 1 else { return } + + let scale = view.window?.screen.nativeScale ?? UIScreen.main.nativeScale + let drawableSize = CGSize( + width: (bounds.width * scale).rounded(.toNearestOrAwayFromZero), + height: (bounds.height * scale).rounded(.toNearestOrAwayFromZero) + ) + + CATransaction.begin() + CATransaction.setDisableActions(true) + metalLayer.contentsScale = scale + metalLayer.frame = CGRect(origin: .zero, size: bounds.size) + if drawableSize != lastAppliedDrawableSize { + metalLayer.drawableSize = drawableSize + lastAppliedDrawableSize = drawableSize + } + CATransaction.commit() } // MARK: - MPV Setup @@ -287,21 +324,80 @@ final class MPVPlayerViewController: UIViewController { // MARK: - Playback API func loadFile(_ urlString: String, audioUrl: String? = nil, requestHeaders: [String: String] = [:]) { + let request = PendingLoadRequest( + urlString: urlString, + audioUrl: audioUrl, + requestHeaders: requestHeaders, + queuedAtUptime: ProcessInfo.processInfo.systemUptime + ) + + if Thread.isMainThread { + queueLoad(request) + } else { + DispatchQueue.main.async { [weak self] in + self?.queueLoad(request) + } + } + } + + private func queueLoad(_ request: PendingLoadRequest) { + pendingLoadRequest = request + attemptStartPendingLoad() + } + + private func attemptStartPendingLoad() { + guard let request = pendingLoadRequest else { return } guard mpv != nil else { return } + layoutMetalLayer() + guard isViewportReadyForPlayback(queuedAtUptime: request.queuedAtUptime) else { + schedulePendingLoadRetry() + return + } + + pendingLoadRequest = nil + pendingLoadRetryWorkItem?.cancel() + pendingLoadRetryWorkItem = nil + startLoad(request) + } + + private func startLoad(_ request: PendingLoadRequest) { + guard mpv != nil else { return } + layoutMetalLayer() clearPlaybackError() - let sanitizedHeaders = sanitizeRequestHeaders(requestHeaders) + let sanitizedHeaders = sanitizeRequestHeaders(request.requestHeaders) activeRequestHeaders = sanitizedHeaders applyRequestHeaders(sanitizedHeaders) isPlayerLoading = true isPlayerEnded = false - command("loadfile", args: [urlString, "replace"]) - if let audioUrl, !audioUrl.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + command("loadfile", args: [request.urlString, "replace"]) + if let audioUrl = request.audioUrl, !audioUrl.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in self?.command("audio-add", args: [audioUrl, "select"], checkForErrors: false) } } } + private func isViewportReadyForPlayback(queuedAtUptime: TimeInterval) -> Bool { + guard isViewLoaded, view.window != nil else { return false } + let bounds = view.bounds + guard bounds.width > 1, bounds.height > 1 else { return false } + if bounds.width >= bounds.height { return true } + + let age = ProcessInfo.processInfo.systemUptime - queuedAtUptime + return age >= 0.9 + } + + private func schedulePendingLoadRetry() { + guard pendingLoadRetryWorkItem == nil else { return } + + let workItem = DispatchWorkItem { [weak self] in + self?.pendingLoadRetryWorkItem = nil + self?.attemptStartPendingLoad() + } + pendingLoadRetryWorkItem = workItem + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05, execute: workItem) + } + func playPlayback() { guard mpv != nil else { return } setFlag("pause", false) @@ -350,8 +446,8 @@ final class MPVPlayerViewController: UIViewController { checkError(mpv_set_option_string(mpv, "panscan", "1.0")) checkError(mpv_set_option_string(mpv, "video-unscaled", "no")) case 2: // Zoom - checkError(mpv_set_option_string(mpv, "panscan", "0.0")) - checkError(mpv_set_option_string(mpv, "video-unscaled", "downscale-big")) + checkError(mpv_set_option_string(mpv, "panscan", "1.0")) + checkError(mpv_set_option_string(mpv, "video-unscaled", "no")) default: // Fit checkError(mpv_set_option_string(mpv, "panscan", "0.0")) checkError(mpv_set_option_string(mpv, "video-unscaled", "no")) @@ -432,6 +528,9 @@ final class MPVPlayerViewController: UIViewController { func destroyPlayer() { NotificationCenter.default.removeObserver(self) + pendingLoadRetryWorkItem?.cancel() + pendingLoadRetryWorkItem = nil + pendingLoadRequest = nil clearPlaybackError() guard let ctx = mpv else { return } mpv = nil // nil first so event loop stops reading From 3efc8f0a1788b16d793be50f8a6b454e7fa7a9ba Mon Sep 17 00:00:00 2001 From: D4rk56 Date: Fri, 1 May 2026 09:40:46 +0200 Subject: [PATCH 061/143] Change "extension" to "addon" French translation --- .../composeResources/values-fr/strings.xml | 130 +++++++++--------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/composeApp/src/commonMain/composeResources/values-fr/strings.xml b/composeApp/src/commonMain/composeResources/values-fr/strings.xml index 96edc2f7..f107fc43 100644 --- a/composeApp/src/commonMain/composeResources/values-fr/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-fr/strings.xml @@ -19,34 +19,34 @@ Réessayer Enregistrer Installation en cours - Extensions + Addons Actif %1$d catalogues Configurable Actualisation %1$d ressources Indisponible - Configurer l'extension - Supprimer l'extension + Configurer l'addon + Supprimer l'addon Ajoutez une URL de manifeste pour commencer à charger des catalogues, métadonnées, streams ou sous-titres dans Nuvio. - Aucune extensions installée. - Veuillez saisir une URL de l'extension. - URL de l'extension - Installer l'extension + Aucun addon installé. + Veuillez saisir une URL d'addon. + URL de l'addon + Installer l'addon Chargement des détails du manifeste… - Validation de l'URL du manifeste et chargement des détails de l'extension avant installation. - Vérification de l'extension + Validation de l'URL du manifeste et chargement des détails de l'addon avant installation. + Vérification de l'addon Échec de l'installation %1$s a été validé et ajouté avec succès. - Extension installée - Déplacer l'extension vers le bas - Déplacer l'extension vers le haut + Addon installé + Déplacer l'addon vers le bas + Déplacer l'addon vers le haut Actif - Extensions + Addons Catalogues - Actualiser l'extension - Ajouter une extension - Extensions installées + Actualiser l'addon + Ajouter un addon + Addons installés Aperçu %1$d règles d'ID Version %1$s @@ -58,7 +58,7 @@ Ajouter un catalogue Ajouter un dossier Tous les genres - Ajoutez des catalogues depuis vos extensions installées pour définir ce qu'affiche ce dossier. + Ajoutez des catalogues depuis vos addons installés pour définir ce qu'affiche ce dossier. Aucune source de catalogue Choisir Emoji @@ -88,7 +88,7 @@ Apparence Informations de base Sources de catalogue - Choisissez les catalogues d'extension que ce dossier doit regrouper. + Choisissez les catalogues d'addon que ce dossier doit regrouper. Sélectionner des catalogues Sélectionner un genre %1$d sélectionné(s) @@ -251,7 +251,7 @@ Connectez-vous pour accéder à votre bibliothèque et votre progression Se connecter Inscrivez-vous pour synchroniser vos données entre appareils - S'inscrire + S\'inscrire Vos données seront uniquement stockées localement Regardez tout, partout Bon retour @@ -314,13 +314,13 @@ Ajouter un profil Effacer la recherche Découvrir - Les extensions installées n'ont retourné aucun résultat de recherche valide. + Les addons installés n'ont retourné aucun résultat de recherche valide. La recherche a échoué - Installez et validez au moins une extension avant de rechercher. - Aucune extension active + Installez et validez au moins un addon avant de rechercher. + Aucun addon active Les catalogues installés n'ont retourné aucun résultat pour cette requête. Aucun résultat trouvé - Vos extensions installées n'exposent pas de catalogue de recherche. + Vos addons installés n'exposent pas de catalogue de recherche. Aucun catalogue de recherche Rechercher des films, séries… Recherches récentes @@ -328,7 +328,7 @@ À propos Général Compte - Extensions + Addons Apparence Contenu et découverte Continuer à regarder @@ -350,7 +350,7 @@ Ajustez la présentation de l'accueil et les préférences visuelles. Rechercher de nouvelles versions de l'application. Vérifier les mises à jour - Gérez les extensions et sources de découverte. + Gérez les addons et sources de découverte. Gérez vos films et épisodes téléchargés. Téléchargements GÉNÉRAL @@ -423,7 +423,7 @@ THÈME Collection • %1$s Nom affiché - Installez une extension avec des catalogues compatibles avec les tableaux pour configurer les lignes de l'écran d'accueil. + Installez un addon avec des catalogues compatibles avec les tableaux pour configurer les lignes de l'écran d'accueil. Aucun catalogue d'accueil Source Hero Masqué @@ -448,7 +448,7 @@ Visible Lecteur, sous-titres et lecture automatique Rayon de carte - STYLE DE CARTE D'AFFICHE + STYLE DE CARTE D\'AFFICHE Largeur de carte Personnalisé Personnalisez la largeur de carte et le rayon des coins pour les cartes d'affiches partagées dans toute l'application. @@ -552,7 +552,7 @@ Notification de test Communauté Découvrez les personnes qui construisent et soutiennent Nuvio sur Mobile, TV et Web. - L'API des supporters n'est pas configurée. Ajoutez DONATIONS_BASE_URL dans local.properties. + L\'API des supporters n'est pas configurée. Ajoutez DONATIONS_BASE_URL dans local.properties. Contributeurs Supporters Ouvrir GitHub @@ -582,9 +582,9 @@ Nov Déc %1$s %2$s %3$s - Toutes les extensions + Toutes les addons Tous les plugins - Extensions autorisées + Addons autorisés Plugins autorisés Anime Skip ID client AnimeSkip @@ -625,10 +625,10 @@ Langue audio préférée Langue des sous-titres préférée Préréglages - Correspond au nom du stream, à l'étiquette, à la description, à l'extension et à l'URL. + Correspond au nom du stream, à l'étiquette, à la description, à l'addon et à l'URL. Modèle regex 4K|2160p|Remux - N'importe quel 1080p+ + N\'importe quel 1080p+ AVC / x264 Qualité BluRay Dolby Atmos / DTS @@ -665,14 +665,14 @@ Passer l'intro/outro/récap Afficher un bouton de saut lors des segments d'intro, d'outro et de récapitulatif détectés. Périmètre des sources - Toutes les extensions - Considérer les streams de toutes les extensions installées. + Toutes les addons + Considérer les streams de toutes les addons installés. Toutes les sources - Considérer les streams des extensions et des plugins. + Considérer les streams des addons et des plugins. Plugins activés uniquement Considérer uniquement les streams des plugins activés. - Extensions installées uniquement - Considérer uniquement les streams des extensions installées. + Addons installés uniquement + Considérer uniquement les streams des addons installés. Mode de sélection du stream Premier stream disponible Lire automatiquement le premier stream trouvé. @@ -697,7 +697,7 @@ Ajoutez votre propre clé API TMDB ci-dessous avant d'activer l'enrichissement. Clé API TMDB Activer l'enrichissement TMDB - Utiliser votre clé API TMDB pour enrichir les métadonnées de l'extension sur l'écran de détails lorsqu'un ID TMDB ou IMDb est disponible. + Utiliser votre clé API TMDB pour enrichir les métadonnées de l'addon sur l'écran de détails lorsqu'un ID TMDB ou IMDb est disponible. Saisissez votre clé API v3 TMDB. Code de langue Visuels @@ -865,9 +865,9 @@ Échec du chargement Plus comme ceci Saisons - Cette extension a retourné des vidéos pour la série, mais aucune n'incluait de numéros de saison ou d'épisode. - Cette extension n'a fourni aucune métadonnée d'épisode pour cette série. - Cette extension n'a pas encore publié d'épisodes. + Cet addon a retourné des vidéos pour la série, mais aucune n'incluait de numéros de saison ou d'épisode. + Cet addon n'a fourni aucune métadonnée d'épisode pour cette série. + Cet addon n'a pas encore publié d'épisodes. Votre appareil est en ligne, mais Nuvio n'a pas pu se connecter aux serveurs nécessaires. Afficher moins Afficher plus ▾ @@ -877,11 +877,11 @@ %1$s • %2$s Le catalogue sélectionné n'a retourné aucun élément de découverte. Impossible de charger Découvrir - Les extensions installées n'exposent pas de catalogues compatibles avec le tableau pour Découvrir. + Les addons installés n'exposent pas de catalogues compatibles avec le tableau pour Découvrir. Aucun catalogue de découverte Le catalogue et les filtres sélectionnés n'ont retourné aucun élément. Aucun titre trouvé - Installez et validez au moins une extension avant d'explorer les catalogues dans Découvrir. + Installez et validez au moins un addon avant d'explorer les catalogues dans Découvrir. Sélectionner un catalogue Sélectionner un genre Sélectionner un type @@ -894,8 +894,8 @@ Marquer comme vu Suivant %1$s vu - Installez et validez au moins une extension avant de charger des lignes de catalogue à l'accueil. - Les extensions installées n'exposent actuellement aucun catalogue compatible avec le tableau sans extras requis. + Installez et validez au moins un addon avant de charger des lignes de catalogue à l'accueil. + Les addons installés n'exposent actuellement aucun catalogue compatible avec le tableau sans extras requis. Aucune ligne d'accueil disponible Voir les détails Contrôles pour lire et enregistrer. @@ -949,8 +949,8 @@ Gérer les profils Nom du profil Nouveau profil - Extensions principales désactivées - Extensions principales activées + Addons principaux désactivés + Addons principaux activés Supprimer le code PIN pour %1$s Supprimer le verrouillage PIN Enregistrement… @@ -960,21 +960,21 @@ Sélectionnez un avatar pour ce profil. Configurer le verrouillage PIN Profil sans nom - Utiliser les extensions principales - Partager la configuration des extensions du profil principal plutôt que de gérer une liste séparée. + Utiliser les addons principales + Partager la configuration des addons du profil principal plutôt que de gérer une liste séparée. Qui regarde ? Téléchargé Reprendre Scrapers actifs - Vérification d'autres extensions… + Vérification d'autres addons… Copier le lien du stream Télécharger le fichier - Les extensions de streams installées n'ont pas retourné de réponse valide. + Les addons de streams installés n'ont pas retourné de réponse valide. Impossible de charger les streams - Installez d'abord une extension pour charger les streams de ce titre. - Vos extensions installées ne fournissent pas de streams pour ce type de titre. - Aucune extension de streams disponible - Aucune de vos extensions installées n'a retourné de streams pour ce titre. + Installez d'abord un addon pour charger les streams de ce titre. + Vos addons installés ne fournissent pas de streams pour ce type de titre. + Aucun addon de streams disponible + Aucune de vos addons installés n'a retourné de streams pour ce titre. S%1$d E%2$d Épisode S%1$dE%2$d - %3$s @@ -995,7 +995,7 @@ %1$s • %2$s Échec de la vérification des mises à jour Échec du téléchargement - Téléchargement %1$d% + Téléchargement %1$d%% Impossible de démarrer l'installation Vous utilisez la version la plus récente. Activez l'installation d'applications pour Nuvio puis revenez pour continuer. @@ -1008,8 +1008,8 @@ Autoriser les installations pour continuer Mise à jour disponible Statut de la mise à jour - Cette extension est déjà installée. - Veuillez saisir une URL d'extension valide + Cet addon est déjà installé. + Veuillez saisir une URL d'addon valide Impossible de charger le manifeste Nuvio Impossible de supprimer le compte @@ -1021,9 +1021,9 @@ À suivre • S%1$dE%2$d logo de %1$s Impossible de charger les commentaires - Impossible de charger les détails depuis aucune extension. + Impossible de charger les détails depuis aucun addon. Réseaux - Aucune extension ne fournit de métadonnées pour ce contenu. + Aucun addon ne fournit de métadonnées pour ce contenu. Téléchargement échoué Affiche la progression en direct et les contrôles de téléchargement. Téléchargements @@ -1047,7 +1047,7 @@ Ce code PIN ne peut pas encore être vérifié hors ligne sur cet appareil. Connectez-vous une fois et déverrouillez-le en ligne d'abord. Impossible de définir le code PIN. Veuillez réessayer. Connectez-vous à Internet pour définir un code PIN. - Ce profil utilise les extensions principales. + Ce profil utilise les addons principales. Impossible de charger %1$s Source Intégré @@ -1066,18 +1066,18 @@ Liste de suivi Bande-annonce Inconnu - Extension + Addon Enregistré Lire %1$s Reprendre %1$s Le JSON est vide. La collection %1$d a un ID vide. - La collection \'%1$s\' a un titre vide. - Le dossier %1$d dans \'%2$s\' a un ID vide. + La collection \'%1$s' a un titre vide. + Le dossier %1$d dans \'%2$s' a un ID vide. Le dossier \'%1$s\' dans \'%2$s\' a un titre vide. La source %1$d dans le dossier \'%2$s\' a des champs vides. JSON invalide : %1$s - Extension introuvable : %1$s + Addon introuvable : %1$s Janvier Février Mars From 35224f295025b1cdcac0831f986a8d1cadd67e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Costa?= <79596903+affcosta7@users.noreply.github.com> Date: Fri, 1 May 2026 14:22:50 +0100 Subject: [PATCH 062/143] Create strings for portuguese (portugal) --- .../composeResources/values-pt/strings | 1173 +++++++++++++++++ 1 file changed, 1173 insertions(+) create mode 100644 composeApp/src/commonMain/composeResources/values-pt/strings diff --git a/composeApp/src/commonMain/composeResources/values-pt/strings b/composeApp/src/commonMain/composeResources/values-pt/strings new file mode 100644 index 00000000..e5049d24 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/values-pt/strings @@ -0,0 +1,1173 @@ + + Reconhecimento aberto e créditos do projeto + Voltar + Cancelar + Fechar + Eliminar + Concluído + Editar + Importar + Seguinte + OK + Reproduzir + Anterior + Remover + Reordenar + Repor + Retomar + Tentar novamente + Guardar + A instalar + Addons + Ativo + %1$d catálogos + Configurável + A atualizar + %1$d recursos + Indisponível + Configurar addon + Eliminar addon + Adiciona um URL de manifesto para começares a carregar catálogos, metadados, streams ou legendas no Nuvio. + Ainda não tens addons instalados. + Introduz um URL de addon. + URL do Addon + Instalar Addon + A carregar detalhes do manifesto... + A validar o URL do manifesto e a carregar detalhes do addon antes de instalar. + A verificar Addon + Falha na Instalação + %1$s foi validado e adicionado com sucesso. + Addon Instalado + Mover addon para baixo + Mover addon para cima + Ativos + Addons + Catálogos + Atualizar addon + Adicionar Addon + Addons Instalados + Resumo + %1$d regras de id + Versão %1$s + Selecionado + Copiar JSON + %1$d coleção(ões), %2$d pasta(s) + Eliminar "%1$s"? Não poderás desfazer esta ação. + Eliminar Coleção + Adicionar Catálogo + Adicionar Pasta + Todos os géneros + Adiciona catálogos dos teis addons instalados para definires o que esta pasta mostra. + Ainda sem fontes de catálogo + Escolher + Emoji + URL da Imagem + Nenhum + Capa + Criar Coleção + Concluído + Editar Coleção + Editar Pasta + Define a identidade da pasta, apresentação e fontes de catálogo com a mesma estrutura do editor de coleções principal. + Adiciona uma para começar. + Ainda sem pastas + Pastas + Filtro de Género + Mostrar apenas a imagem de capa + Ocultar Título + Nova Pasta + Mostrar esta coleção acima de todos os catálogos normais do início. Múltiplas coleções afixadas seguem a ordem de criação. + Afixar Acima dos Catálogos + URL da imagem de fundo (opcional) + Nome da pasta + URL do GIF animado (reproduz apenas quando focado) + Nome da coleção + Guardar Alterações + Guardar + Aspeto + Básico + Fontes de Catálogo + Escolhe os catálogos de addons que esta pasta deve agregar. + Selecionar Catálogos + Selecionar género + %1$d selecionados + %1$d catálogos + %1$d selecionados + Póster + Quadrado + Panorâmico + Combinar todos os catálogos num único separador + Mostrar Separador \"Tudo\" + Reproduzir o GIF configurado em vez da capa estática quando disponível. + Mostrar GIF Quando Configurado + %1$d fonte(s) · %2$s + Formato do Cartão + Linhas + Separadores + Modo de Visualização + Fontes TMDB + Lista Pública + Produção + Canal/Rede + Coleção + Pessoa + Realizador + Personalizado + Escolhe uma fonte pronta a usar. Podes editá-la ou removê-la depois de adicionar. + Cola um URL de uma lista pública do TMDB ou apenas o número do URL. + Pesquisa pelo nome do estúdio, ou cola um ID/URL de empresa do TMDB para adicionar diretamente. + Introduz um ID de canal. Os canais comuns estão disponíveis nos Presets e filtros rápidos. + Pesquisa o nome de uma coleção de filmes ou cola o ID da coleção do TMDB. + Introduz o ID ou URL de uma pessoa do TMDB para criar uma linha baseada no elenco. + Introduz o ID ou URL de uma pessoa do TMDB para criar uma linha baseada no trabalho de realização. + Cria uma linha TMDB dinâmica usando filtros opcionais. Deixa os campos vazios se não precisares do filtro. + Lista pública do TMDB + ID do Canal + ID da Coleção + ID da Pessoa + Nome da produtora, ID ou URL + ID ou URL do TMDB + https://www.themoviedb.org/list/8504994 ou 8504994 + 213 para Netflix, 49 para HBO, 2739 para Disney+ + 10 para Coleção Star Wars + Marvel Studios, 420 ou URL da empresa + 31 para Tom Hanks ou URL da pessoa + Exemplos: Marvel Studios, 420 ou https://www.themoviedb.org/company/420. + Exemplo: Coleção Star Wars, Coleção Harry Potter ou um URL de coleção. + IDs de exemplo: Netflix 213, HBO 49, Disney+ 2739. + Exemplo: https://www.themoviedb.org/list/8504994 ou 8504994. + Exemplo: https://www.themoviedb.org/person/31-tom-hanks ou 31. + Título de exibição + Aparece como o nome da linha/separador. Se estiver vazio, o Nuvio cria um a partir da fonte. + Filmes da Marvel, Originais Netflix, Pixar + Filmes do Tom Hanks, Atores Favoritos + Filmes do Christopher Nolan, Realizadores Favoritos + Melhores Filmes de Ação, Dramas Coreanos, Animação 2024 + Resultados da Pesquisa + Coleção TMDB + Empresa TMDB %1$d + Coleção TMDB %1$d + Tipo + Filmes + Séries + Ambos + Ordenar + Filtros + Deixa os campos vazios se não precisares desse filtro. + Géneros rápidos + Idiomas rápidos + Países rápidos + Palavras-chave rápidas + Estúdios rápidos + Canais rápidos + IDs de Género + Usa números de género do TMDB. Separa múltiplos com vírgulas para E, ou barras verticais para OU. + Data de lançamento/emissão de + Data de lançamento/emissão até + Usa AAAA-MM-DD, por exemplo 2024-01-01. + Classificação mínima + Classificação máxima + Classificação TMDB de 0 a 10. Exemplo: 7.0. + Mínimo de votos + Usa isto para evitar títulos obscuros com poucos votos. Exemplo: 100. + Idioma original + Usa códigos de idioma de duas letras, por exemplo en, ko, ja, hi. + País de origem + Usa códigos de país de duas letras, por exemplo US, KR, JP, IN. + IDs de Palavras-chave + Usa números de palavras-chave do TMDB. Os botões rápidos preenchem exemplos comuns. + 9715 para super-herói + IDs de Empresas + Usa IDs de estúdios/empresas. Os botões rápidos preenchem exemplos comuns. + 420 para Marvel Studios + IDs de Canais + Apenas para séries. Usa IDs de canais como Netflix 213 ou HBO 49. + 213 para Netflix + Ano + Usa um ano com quatro dígitos, por exemplo 2024. + Presets + Pesquisar + Adicionar Fonte + Ação + Aventura + Animação + Comédia + Terror + Ficção Científica + Drama + Crime + Reality TV + Inglês + Coreano + Japonês + Hindi + Espanhol + Estados Unidos + Coreia + Japão + Índia + Reino Unido + Super-herói + Baseado num Livro + Viagem no Tempo + Espaço + Marvel + Disney + Pixar + Lucasfilm + Warner Bros. + Netflix + HBO + Disney+ + Prime Video + Hulu + Original + Popular + Melhor Classificados + Recente + Lista TMDB + Coleção de Filmes TMDB + Produção + Canal + Pessoa + Realizador + Descoberta TMDB + Cria uma para organizares os teus catálogos. + Ainda sem coleções + %1$d pasta(s) + Nenhum item encontrado + Pasta não encontrada + Coleções + Importar Coleções + JSON + Cola abaixo o JSON das tuas coleções. + Importar + Nova Coleção + Afixado + Tudo + As Tuas Coleções + Feito com ❤️ pela Tapframe e amigos + Versão %1$s (%2$s) + Desligado + Ligado + Pausa + Recarregar + Já tens uma conta? + Continuar Sem Conta + Criar Conta + Não tens uma conta? + E-mail + ou + Palavra-passe + Inicia sessão para acederes à tua biblioteca e progresso + Iniciar Sessão + Cria conta para sincronizares os teus dados entre dispositivos + Criar Conta + Os teus dados serão guardados apenas localmente + Tudo em stream, em qualquer lugar + Bem-vindo de volta + Biblioteca + Biblioteca Trakt + Início + Biblioteca + Perfil + Pesquisar + Faixas de Áudio + Áudio + Integrado + Ajuste Inferior + Fechar reprodutor + Cor + A reproduzir agora + E%1$d + S%1$dE%2$d + S%1$dE%2$d • %3$s + Episódios + Tamanho da Letra + %1$dsp + Bloquear controlos + Nenhuma faixa de áudio disponível + Nenhum episódio disponível + Nenhum stream encontrado + Nenhum + Contorno + Episódios + Fontes + Streams + Erro de reprodução + A reproduzir + Toca para procurar legendas + Voltar + Repor Predefinições + Preencher + Ajustar + Zoom + Recuar 10 segundos + -%1$ds + +%1$ds + -%1$ds + +%1$ds + Avançar 10 segundos + Fontes + Estilo + Legs + Legendas + Brilho %1$s + Volume %1$s + Sem som + Transferido + Emissão + A anunciar + Toca para desbloquear + Faixa %1$d + Desbloquear controlos + Estás a ver + Adicionar Perfil + Limpar pesquisa + Descobrir + Os addons instalados falharam ao devolver resultados de pesquisa válidos. + Falha na pesquisa + Instala e valida pelo menos um addon antes de pesquisares. + Sem addons ativos + Os catálogos pesquisáveis instalados não encontraram nada para esta procura. + Nenhum resultado encontrado + Os teus addons instalados não permitem pesquisa em catálogos. + Sem catálogos pesquisáveis + Pesquisa filmes, séries... + Pesquisas Recentes + Remover pesquisa recente + Sobre + Geral + Conta + Addons + Aspeto + Conteúdo e Descoberta + Continuar a Ver + Ecrã Inicial + Integrações + Classificações MDBList + Ecrã de Metadados + Notificações + Reprodução + Plugins + Personalização de Pósteres + Definições + Apoiantes e Colaboradores + Enriquecimento TMDB + Trakt + SOBRE + Gere a tua conta, termina sessão ou elimina-a. + CONTA + Afina a apresentação do início e as preferências visuais. + Verifica se há novas versões da aplicação. + Verificar atualizações + Gere addons e fontes de descoberta. + Gere os teus filmes e episódios transferidos. + Transferências + GERAL + Liga os serviços TMDB e MDBList. + Gere alertas de lançamento de episódios e envia uma notificação de teste. + Muda para um perfil diferente. + Mudar de Perfil + Liga o Trakt, sincroniza listas e guarda títulos diretamente no Trakt. + A carregar as tuas listas do Trakt… + Escolhe onde guardar este título no Trakt + Doar + Ver detalhes + Remover + Ver do início + Reproduzir + %1$d/10 + Crítica + Spoiler + Ainda não há críticas do Trakt disponíveis. + %1$d gostos + Este comentário contém spoilers. + Este comentário contém spoilers e foi ocultado. + Comentários + Trailer + %1$s (%2$d) + Trailers + Sem episódios concluídos + Ainda sem transferências + %1$d episódio(s) transferido(s) + Ativo + Filmes + Séries + Mostrar Transferências + Concluído • %1$s + A transferir • %1$s + Falhou + Pausado • %1$s + Visto + Temporada %1$d + Especiais + Continua de onde paraste + Adicionar à biblioteca + Marcar como não visto + Marcar como visto + Remover da biblioteca + Ver Tudo + Reproduzir manualmente + Logótipo de %1$s + Conta + Eliminar Conta + Isto irá eliminar permanentemente a tua conta e todos os dados associados. + Esta ação não pode ser desfeita. Todos os teus dados, perfis e histórico de sincronização serão removidos permanentemente. + Eliminar Conta? + E-mail + Sessão não iniciada + Terminar Sessão + Irás regressar ao ecrã de início de sessão. + Terminar Sessão? + Estado + Anónimo + Sessão Iniciada + Preto AMOLED + Usa fundos pretos puros para ecrãs OLED. + Idioma da Aplicação + Escolher Idioma + Mostra, oculta e personaliza a linha \"Continuar a Ver\". + Ajusta a largura do cartão e as predefinições do raio dos cantos. + ECRÃ + INÍCIO + TEMA + Coleção • %1$s + Nome de Exibição + Instala um addon com catálogos compatíveis para configurares as linhas do Ecrã Inicial. + Sem catálogos para o início + Fonte do Destaque + Oculto + Manter Início focado + %1$s • Limite atingido (máx %2$d) + Nenhuma fonte de destaque selecionada + Fora do destaque + Remove a afixação no topo da coleção para a moveres + Afixado + Afixado no topo + Reordenar + CATÁLOGOS + CATÁLOGOS E COLEÇÕES + COLEÇÕES + DESTAQUE (HERO) + FONTES DE DESTAQUE + %1$d de %2$d selecionados + Mostrar Destaque + Exibe um carrossel de destaque no topo do Início. Escolhe até 2 catálogos fonte abaixo. + %1$d de %2$d catálogos visíveis • %3$d fontes de destaque selecionadas + Abre um catálogo apenas quando precisares de o renomear ou reordenar. + Visível + Reprodutor, legendas e reprodução automática + Raio do Cartão + ESTILO DO CARTÃO + Largura do Cartão + Personalizado + Personaliza a largura e o raio dos cantos dos cartões em toda a aplicação. + Ocultar etiquetas + Modo panorâmico para pósteres em linha + Pré-visualização ao Vivo + %1$s (%2$s) + Raio do canto: %1$ddp + Altura: %1$ddp + Largura: %1$ddp + Clássico + Pílula + Arredondado + Afiado + Suave + Equilibrado + Confortável + Compacto + Denso + Grande + Padrão + Mostra um aviso para continuares de onde paraste ao abrir a aplicação após saíres do reprodutor. + Aviso de retoma ao iniciar + ESTILO DO CARTÃO + AO INICIAR + COMPORTAMENTO DO SEGUINTE + VISIBILIDADE + Exibe a linha \"Continuar a Ver\" no ecrã inicial. + Mostrar Continuar a Ver + Póster + Cartão focado na imagem + Panorâmico + Cartão horizontal rico em informação + Quando ativado, o \"Seguinte\" continua sempre a partir do episódio mais avançado que foi visto. Quando desativado, segue a partir do último visto. Útil se costumas rever episódios antigos. + Seguinte do episódio mais avançado + INÍCIO + FONTES + Instala, remove, atualiza e ordena as tuas fontes de conteúdo. + Instala repositórios de scrapers JavaScript e testa fornecedores internamente. + Controla quais os catálogos que aparecem no Início e por que ordem. + Desativa secções de detalhes e reordena tudo o que aparece abaixo do Destaque. + Cria agrupamentos de catálogos personalizados com pastas exibidas no Início. + INTEGRAÇÕES + Melhora as páginas de detalhes com imagens, créditos e metadados do TMDB. + Adiciona classificações do IMDb, Rotten Tomatoes, Metacritic e outros às páginas de detalhes. + Adiciona a tua chave API do MDBList abaixo antes de ativares as classificações. + Obtém uma chave em https://mdblist.com/preferences e cola-a aqui. + Chave API + Chave API MDBList + Ativar classificações MDBList + Mostra classificações externas do MDBList nas páginas de metadados quando um ID IMDb está disponível. + CHAVE API + FORNECEDORES DE CLASSIFICAÇÃO + MDBLIST + Ações + Controlos de reprodução e gravação. + Elenco + Lista do elenco principal. + Fundo Cinemático + Fundo desfocado atrás do conteúdo, semelhante ao ecrã de stream. + Coleção + Linha de coleções ou franchises relacionados. + Comentários + Secção de comentários do Trakt. + Detalhes + Duração, estado, lançamento, idioma e info relacionada. + Cartões de Episódio + Escolhe como os episódios são apresentados no ecrã de metadados. + Horizontal + Cartões em linha tipo miniatura + Lista + Cartões empilhados com foco no detalhe + Episódios + Lista de temporadas e episódios para séries. + Grupo %1$d + Mais como este + Linha de recomendações. + Nenhum + Resumo + Sinopse, classificações, géneros e créditos principais. + Produção + Estúdios e canais. + ASPETO + SECÇÕES + Grupo de Separadores %1$d + Layout de Separadores + Agrupa secções em separadores como na aplicação de TV. Atribui até 3 secções por grupo. + Trailers + Linha de trailers e atalhos de reprodução. + As notificações estão atualmente desativadas no Nuvio. + Alertas de lançamento de episódios + Agenda notificações locais para quando um novo episódio de uma série guardada ficar disponível. + As notificações do sistema estão desativadas para o Nuvio. Ativa-as para receberes alertas e notificações de teste. + %1$d alertas de lançamento agendados neste dispositivo. + ALERTAS + TESTE + Enviar Notificação de Teste + A enviar Notificação de Teste... + Enviar uma notificação de teste local para %1$s. + Guarda primeiro uma série na tua biblioteca para testares as notificações. + Notificação de teste + Comunidade + Vê quem está a construir e a apoiar o Nuvio em Mobile, TV e Web. + A API de Apoiantes não está configurada. Adiciona DONATIONS_BASE_URL ao local.properties. + Colaboradores + Apoiantes + Abrir GitHub + Perfil de GitHub indisponível + Sem mensagem anexada. + A carregar colaboradores... + A carregar apoiantes... + Não foi possível carregar os colaboradores + Não foi possível carregar os apoiantes + Nenhum colaborador encontrado. + Nenhum apoiante encontrado. + Não foi possível carregar os colaboradores. + Não foi possível carregar os apoiantes. + Não foi possível carregar os colaboradores neste momento. + Não foi possível carregar os apoiantes neste momento. + %1$d commits no total + Jan + Fev + Mar + Abr + Mai + Jun + Jul + Ago + Set + Out + Nov + Dez + %1$s %2$s, %3$s + Todos os Addons + Todos os Plugins + Addons Permitidos + Plugins Permitidos + Anime Skip + ID de Cliente AnimeSkip + Insere o teu ID de cliente da API AnimeSkip. Obtém um em anime-skip.com. + Pesquisa também no AnimeSkip por marcas de tempo para saltar partes (requer ID de cliente). + Reproduzir Próximo Episódio Automaticamente + Procura e reproduz automaticamente o próximo episódio quando o limite for atingido. + Apenas Dispositivo + Preferir Aplicação (FFmpeg) + Preferir Dispositivo + Prioridade do Descodificador + Toca fora para fechar + Toca fora para guardar e fechar + %1$d dia + %1$d dias + %1$d hora + %1$d horas + Ativar libass + Usa o libass para a renderização de legendas ASS/SSA em vez do renderizador padrão. + Manter Velocidade + Manter para Acelerar + Prime longamente em qualquer parte do reprodutor para aumentar temporariamente a velocidade de reprodução. + Padrão regex inválido + Duração do Cache do Último Link + Mapear DV7 para HEVC + Fallback de Dolby Vision Profile 7 para HEVC para dispositivos não suportados. + Minutos Antes do Fim + Mostra o cartão do próximo episódio estes minutos antes do fim. + %1$d min + Nenhum item disponível + Não definido + Padrão + Idioma do Dispositivo + Forçadas + Nenhum + Preferir Grupo de Maratona + Ao reproduzir automaticamente, prefere uma transmissão do mesmo grupo de maratona da atual. + Idioma de Áudio Preferido + Idioma de Legendas Preferido + Predefinições + Compara com o nome da transmissão, etiqueta, descrição, addon e URL. + Padrão Regex + 4K|2160p|Remux + Qualquer 1080p+ + AVC / x264 + Qualidade BluRay + Dolby Atmos / DTS + Inglês + HDR / Dolby Vision + HEVC / x265 + Sem CAM/TS + Sem REMUX/HDR + 1080p Padrão + 4K / Remux + 720p / Menor + Fontes WEB + Tipo de Renderização + Padrão (Cues) + Effects Canvas + Effects OpenGL + Overlay Canvas + Overlay OpenGL + Reutilizar Último Link + Reproduz automaticamente a última transmissão funcional para este filme/episódio enquanto o cache for válido. + Idioma de Áudio Secundário + Idioma de Legendas Secundário + DESCODIFICADOR + PRÓXIMO EPISÓDIO + REPRODUTOR + SALTAR SEGMENTOS + REPRODUÇÃO AUTOMÁTICA + SELEÇÃO DE TRANSMISSÃO + LEGENDAS E ÁUDIO + RENDERIZAÇÃO DE LEGENDAS + %1$d selecionados + Mostrar Sobreposição de Carregamento + Mostra a sobreposição inicial enquanto uma transmissão começa a ser reproduzida. + Saltar Introdução/Créditos/Resumo + Mostra o botão de saltar durante segmentos detetados de introdução, créditos e resumo. + Âmbito da Fonte + Todos os Addons + Considera transmissões de todos os addons instalados. + Todas as Fontes + Considera transmissões de addons e plugins. + Apenas Plugins Ativos + Considera apenas transmissões de plugins ativos. + Apenas Addons Instalados + Considera apenas transmissões de addons instalados. + Modo de Seleção de Transmissão + Primeira Transmissão Disponível + Reproduz automaticamente a primeira transmissão encontrada. + Manual + Seleciona as transmissões manualmente de cada vez. + Correspondência Regex + Seleciona automaticamente uma transmissão que corresponda a um padrão regex. + Tempo Limite da Transmissão + Quanto tempo esperar pelas transmissões antes da seleção automática. + Minutos Antes do Fim + Modo de Limite + Minutos Antes do Fim + Percentagem + Percentagem Limite + Mostra o cartão do próximo episódio quando a reprodução atingir esta percentagem. + %1$d%% + Instantâneo + %1$ds + Ilimitado + Reprodução em Túnel + Ativa a reprodução em túnel para menor latência na sincronização de áudio/vídeo. + Adiciona a tua própria chave API do TMDB abaixo antes de ativares o enriquecimento de dados. + Chave API TMDB + Ativar enriquecimento TMDB + Usa a tua chave API do TMDB para enriquecer os metadados do addon no ecrã de detalhes quando um ID TMDB ou IMDb está disponível. + Insere a tua chave API TMDB v3. + Código de idioma + Imagens (Artwork) + Substitui o fundo, o póster e o logótipo por imagens do TMDB. + Informação básica + Usa o título, sinopse, géneros e classificação do TMDB. + Coleções + Mostra linhas de franchises e coleções para filmes quando o TMDB as fornece. + Créditos + Usa criadores, realizadores, argumentistas e fotos do elenco do TMDB. + Detalhes + Usa info de lançamento, duração, classificação etária, estado, país e idioma do TMDB. + Episódios + Usa títulos de episódios, miniaturas, descrições e durações do TMDB para séries. + Mais como este + Mostra recomendações do TMDB no fundo das páginas de detalhes. + Canais (Networks) + Usa metadados de canais do TMDB para títulos de TV. + Produtoras + Usa metadados de produtoras do TMDB no ecrã de detalhes. + Pósteres de temporadas + Usa pósteres de temporadas do TMDB no seletor de temporadas do ecrã de metadados. + Trailers + Obtém e mostra a secção de trailers de vídeo do TMDB nas páginas de detalhes. + Chave API pessoal + Idioma preferido + Define o código de idioma do TMDB para metadados localizados, por exemplo: `pt-PT`, `en-GB` ou `en-US`. + CREDENCIAIS + LOCALIZAÇÃO + MÓDULOS + TMDB + Após a aprovação, serás redirecionado de volta automaticamente. + AUTENTICAÇÃO + Comentários + Mostra comentários do Trakt nos detalhes de filmes e séries + Ligar Trakt + Ligado como %1$s + Utilizador Trakt + Desligar + Falha ao abrir o navegador + FUNCIONALIDADES + Conclui o início de sessão do Trakt no teu navegador + Regista o que vês, guarda na lista de interesses ou em listas personalizadas e mantém a tua biblioteca sincronizada com o Trakt. + Faltam credenciais do Trakt no local.properties (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET). + Abrir Login do Trakt + As tuas ações de Guardar podem agora visar a lista de interesses e listas pessoais do Trakt. + Inicia sessão com o Trakt para ativares o salvamento em listas e o modo de biblioteca Trakt. + Pontuação do Público + IMDb + Letterboxd + Metacritic + Rotten Tomatoes + TMDB + Trakt + Desconhecido + Âmbar + Carmesim + Esmeralda + Oceano + Rosa + Violeta + Branco + Próximo Episódio + A procurar fonte… + A reproduzir via %1$s em %2$d… + Miniatura do próximo episódio + Não emitido + Saltar + Saltar Introdução + Saltar Créditos + Saltar Resumo + Nenhuma legenda encontrada + Africânder + Albanês + Amárico + Árabe + Arménio + Azerbaijano + Basco + Bielorrusso + Bengali + Bósnio + Búlgaro + Birmanês + Catalão + Chinês + Chinês (Simplificado) + Chinês (Tradicional) + Croata + Checo + Dinamarquês + Neerlandês + Inglês + Estónio + Filipino + Finlandês + Francês + Galego + Georgiano + Alemão + Grego + Gujarati + Hebraico + Hindi + Húngaro + Islandês + Indonésio + Irlandês + Italiano + Japonês + Canarim + Cazaque + Khmer + Coreano + Lao + Letão + Lituano + Macedónio + Malaio + Malaiala + Maltês + Marata + Mongol + Nepalês + Norueguês + Persa + Polaco + Português (Portugal) + Português (Brasil) + Panjabi + Romeno + Russo + Sérvio + Cingalês + Eslovaco + Esloveno + Espanhol + Espanhol (América Latina) + Suaíli + Sueco + Tâmil + Telugu + Tailandês + Turco + Ucraniano + Urdu + Usbeque + Vietnamita + Galês + Zulu + Limpar + Continuar + Ignorar + Instalar + Mais tarde + Não + Atualizar + Sim + Queres sair da aplicação? + Sair da aplicação + Este catálogo não devolveu nenhum item. + Nenhum título encontrado + Verifica a tua ligação Wi-Fi ou dados móveis e tenta novamente. + Realizador + Falha ao carregar + Mais Como Este + Temporadas + Este addon devolveu vídeos para a série, mas nenhum incluía números de temporada ou episódio. + Este addon não forneceu metadados de episódios para esta série. + Os episódios ainda não foram publicados por este addon. + O teu dispositivo está online, mas o Nuvio não conseguiu contactar os servidores necessários. + Mostrar Menos + Mostrar Mais ▾ + Argumentista + Todos os Géneros + Catálogo + %1$s • %2$s + O catálogo selecionado falhou ao devolver itens de descoberta. + Não foi possível carregar a descoberta + Os addons instalados não expõem catálogos compatíveis com o painel de descoberta. + Sem catálogos de descoberta + O catálogo e os filtros selecionados não devolveram nenhum item. + Nenhum título encontrado + Instala e valida pelo menos um addon antes de navegar nos catálogos de descoberta. + Selecionar Catálogo + Selecionar Género + Selecionar Tipo + Tipo + Marcar anteriores como não vistos + Marcar anteriores como vistos + Marcar %1$s como não vista + Marcar %1$s como vista + Marcar como não visto + Marcar como visto + A seguir + %1$s visto + Instala e valida pelo menos um addon antes de carregar as linhas de catálogo no Início. + Os addons instalados não expõem atualmente catálogos compatíveis sem extras obrigatórios. + Sem linhas disponíveis no início + Ver Detalhes + Controlos de reprodução e gravação. + Ações + Lista do elenco principal. + Linha de coleção ou franchise relacionada. + Coleção + Secção de comentários do Trakt. + Duração, estado, lançamento, idioma e info relacionada. + Detalhes + Lista de temporadas e episódios para séries. + Linha de recomendações. + Mais Como Este + Sinopse, classificações, géneros e créditos principais. + Resumo + Estúdios e canais. + Produção + Linha de trailers e atalhos de reprodução. + Novamente online + Não foi possível contactar os servidores + Sem ligação à Internet + (%1$d anos) + Nascimento: %1$s%2$s + Falecimento: %1$s + Conhecido por: %1$s + Mais Recente + Não foi possível carregar detalhes de %1$s + Popular + Algo correu mal + Brevemente + Retroceder + Cancelar + Introduzir PIN + Introduzir PIN de %1$s + Esqueceste-te do PIN? + PIN Incorreto + Bloqueado. Tenta novamente em %1$ds + As opções de avatar aparecerão aqui quando o catálogo carregar. + Avatar: %1$s + Escolhe um avatar + Escolhe um avatar abaixo. + Criar Perfil + Todos os dados de \"%1$s\" serão eliminados permanentemente. + Eliminar Perfil + Adicionar Perfil + Editar Perfil + Introduz o PIN atual + Introduz o novo PIN + Perfil %1$d + A carregar avatares... + Gerir Perfis + Nome do perfil + Novo perfil + Addons principais desativados + Addons principais ativos + Remover PIN de %1$s + Remover Bloqueio por PIN + A guardar... + Segurança + Adiciona um PIN se quiseres bloquear este perfil antes de alternares para ele. + Este perfil está protegido com um PIN. + Seleciona um avatar para este perfil. + Definir Bloqueio por PIN + Perfil sem nome + Usar Addons Principais + Partilha a configuração de addons do perfil principal em vez de gerir uma lista separada. + Quem está a ver? + Transferido + Retomar + Scrapers ativos + A verificar mais addons… + Copiar link da transmissão + Transferir ficheiro + Os addons de transmissão instalados falharam ao devolver uma resposta válida. + Não foi possível carregar as transmissões + Instala primeiro um addon para carregar transmissões para este título. + Os teus addons instalados não fornecem transmissões para este tipo de título. + Nenhum addon de transmissão disponível + Nenhum dos teus addons instalados devolveu transmissões para este título. + T%1$d E%2$d + Episódio + T%1$dE%2$d - %3$s + A obter… + A procurar fonte… + A procurar transmissões… + Link da transmissão copiado + Nenhum link direto de transmissão disponível + Nenhum metadado disponível + Atualizar transmissões + Retomar de %1$d%% + Retomar de %1$s + TAMANHO %1$s + Fechar trailer + Não foi possível reproduzir o trailer + Falha ao carregar as listas do Trakt + Falha ao atualizar as listas do Trakt + %1$s • %2$s + Falha na verificação de atualizações + Falha na transferência + A transferir %1$d%% + Não foi possível iniciar a instalação + Estás a usar a versão mais recente. + Ativa a instalação de aplicações para o Nuvio, depois volta e continua. + A transferir atualização... + Nenhuma atualização encontrada. + Uma nova versão está pronta para instalar. + As atualizações na aplicação não estão disponíveis nesta versão (build). + A preparar a transferência + Notas de lançamento + Permitir que as instalações continuem + Atualização disponível + Estado da atualização + Esse addon já está instalado. + Introduz um URL de addon válido + Não foi possível carregar o manifesto + Nuvio + Falha ao eliminar conta + Falha ao iniciar sessão + Falha ao terminar sessão + Falha no registo + Não foi possível carregar os itens do catálogo. + A seguir + A seguir • T%1$dE%2$d + Logótipo %1$s + Falha ao carregar comentários + Não foi possível carregar detalhes de nenhum addon. + Canais/Redes + Nenhum addon fornece metadados para este conteúdo. + Falha na transferência + Mostra o progresso e controlos das transferências em direto. + Transferências + Transferência concluída + A transferir %1$s • %2$s + A transferir %1$s • %2$s / %3$s + Falha na transferência + Pausado %1$s + Remover + Remover %1$s da tua biblioteca? + Remover da Biblioteca? + Filme + Alertas quando um novo episódio de uma série guardada é lançado. + Pré-visualização do alerta de lançamento de episódio. + Falha ao enviar uma notificação de teste. + Notificação de teste enviada para %1$s. + Não foi possível reproduzir esta transmissão. + O PIN deste perfil mudou. Liga-te uma vez para atualizar o bloqueio neste dispositivo. + Não foi possível remover o PIN. Tenta novamente. + Liga-te à Internet para remover o bloqueio por PIN. + Este PIN ainda não pode ser verificado offline neste dispositivo. Liga-te e desbloqueia-o online primeiro. + Não foi possível definir o PIN. Tenta novamente. + Liga-te à Internet para definir um PIN. + Este perfil utiliza addons principais. + Falha ao carregar %1$s + Transmissão + Incorporado + Autorização negada + Conclui o início de sessão no Trakt no teu browser + Callback do Trakt inválido + Estado de callback do Trakt inválido + Resposta de token do Trakt inválida + Falha ao carregar a biblioteca do Trakt + Lista %1$d + O Trakt não devolveu um código de autorização + Credenciais do Trakt em falta + Falha ao carregar o progresso do Trakt + Falha ao concluir o início de sessão no Trakt + Utilizador Trakt + Lista de Interesses + Trailer + Desconhecido + Addon + Guardado + Reproduzir %1$s + Retomar %1$s + O JSON está vazio. + A coleção %1$d tem um ID em branco. + A coleção \'%1$s\' tem um título em branco. + A pasta %1$d em \'%2$s\' tem um ID em branco. + A pasta \'%1$s\' em \'%2$s\' tem um título em branco. + A fonte %1$d na pasta \'%2$s\' tem campos em branco. + JSON inválido: %1$s + Addon não encontrado: %1$s + Janeiro + Fevereiro + Março + Abril + Maio + Junho + Julho + Agosto + Setembro + Outubro + Novembro + Dezembro + Jan + Fev + Mar + Abr + Mai + Jun + Jul + Ago + Set + Out + Nov + Dez + Produtora + Canal + Não foi possível carregar %1$s + Popular + Recente + %1$s • %2$s + Melhor Classificados + Classificação Etária + Detalhes do Filme + Idioma Original + País de Origem + Info de Lançamento + Duração + Pósteres + Texto + Detalhes da Série + Estado + Vídeos + FICH. + Nenhum link direto de transmissão disponível + Transferência anterior substituída + Transferência iniciada + Formato de transmissão não suportado para transferências + Corpo da resposta vazio + Pedido falhou com HTTP %1$d + O sistema de transferências não foi inicializado + Pedido de transferência falhou + %1$s - %2$s + Os títulos guardados aparecerão aqui depois de tocares em Guardar no ecrã de detalhes. + A tua biblioteca está vazia + Não foi possível carregar a biblioteca + Outro + Biblioteca + Liga-te ao Trakt e guarda títulos na tua lista de interesses ou listas pessoais. + A tua biblioteca do Trakt está vazia + Não foi possível carregar a biblioteca do Trakt + Biblioteca Trakt + Anime + Canais + Filmes + Séries + Televisão + %1$s lançado(s) + %1$s • %2$s já lançado(s) + Um novo episódio lançado + %1$s já lançado(s) + Lançamentos de Episódios + Criador + Realizador + Argumentista + Pontuação do Público + Nenhuma transmissão de trailer reproduzível encontrada. + Temporada %1$d - %2$s + B + KB + MB + GB + From 4297e488dade912aa4b7e82d182d499f30f67076 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Costa?= <79596903+affcosta7@users.noreply.github.com> Date: Fri, 1 May 2026 14:35:12 +0100 Subject: [PATCH 063/143] Update locale_config.xml --- composeApp/src/androidMain/res/xml/locale_config.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composeApp/src/androidMain/res/xml/locale_config.xml b/composeApp/src/androidMain/res/xml/locale_config.xml index 930f8bda..5599b948 100644 --- a/composeApp/src/androidMain/res/xml/locale_config.xml +++ b/composeApp/src/androidMain/res/xml/locale_config.xml @@ -3,7 +3,7 @@ - + From 859a1f0de9289f44c9a41cd4a7768a3d4353f35e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Costa?= <79596903+affcosta7@users.noreply.github.com> Date: Fri, 1 May 2026 14:35:44 +0100 Subject: [PATCH 064/143] Delete composeApp/src/commonMain/composeResources/values-pt-rPT directory --- .../values-pt-rPT/strings.xml | 1161 ----------------- 1 file changed, 1161 deletions(-) delete mode 100644 composeApp/src/commonMain/composeResources/values-pt-rPT/strings.xml diff --git a/composeApp/src/commonMain/composeResources/values-pt-rPT/strings.xml b/composeApp/src/commonMain/composeResources/values-pt-rPT/strings.xml deleted file mode 100644 index 9cf50f3c..00000000 --- a/composeApp/src/commonMain/composeResources/values-pt-rPT/strings.xml +++ /dev/null @@ -1,1161 +0,0 @@ - - Reconhecimento aberto e créditos do projeto - Retroceder - Cancelar - Fechar - Eliminar - Concluído - Editar - Importar - Seguinte - OK - Reproduzir - Anterior - Remover - Reordenar - Repor - Retomar - Tentar novamente - Guardar - A instalar - Addons - Ativo - %1$d catálogos - Configurável - A atualizar - %1$d recursos - Indisponível - Configurar addon - Eliminar addon - Adiciona um URL de manifesto para começares a carregar catálogos, metadados, transmissões ou legendas no Nuvio. - Ainda não existem addons instalados. - Introduz um URL de addon. - URL do Addon - Instalar Addon - A carregar detalhes do manifesto... - A validar o URL do manifesto e a carregar os detalhes do addon antes da instalação. - A verificar Addon - Falha na Instalação - %1$s foi validado e adicionado com sucesso. - Addon Instalado - Mover addon para baixo - Mover addon para cima - Ativos - Addons - Catálogos - Atualizar addon - Adicionar Addon - Addons Instalados - Visão Geral - %1$d regras de ID - Versão %1$s - Selecionado - Copiar JSON - %1$d coleção(ões), %2$d pasta(s) - Eliminar \"%1$s\"? Esta ação não pode ser desfeita. - Eliminar Coleção - Adicionar Catálogo - Adicionar Pasta - Todos os géneros - Adiciona catálogos dos teus addons instalados para definires o que esta pasta mostra. - Ainda não existem fontes de catálogo - Escolher - Emoji - URL da Imagem - Nenhum - Capa - Criar Coleção - Concluído - Editar Coleção - Editar Pasta - Define a identidade da pasta, a apresentação e as fontes de catálogo com a mesma estrutura do editor de coleções principal. - Adiciona uma para começar. - Ainda não existem pastas - Pastas - Filtro de Género - Mostrar apenas a imagem de capa - Ocultar Título - Nova Pasta - Mostrar esta coleção acima de todos os catálogos normais do ecrã inicial. Múltiplas coleções afixadas seguem a ordem de criação. - Afixar Acima dos Catálogos - URL da imagem de fundo (opcional) - Nome da pasta - URL do GIF animado (reproduz apenas quando focado) - Nome da coleção - Guardar Alterações - Guardar - Aparência - Básico - Fontes de Catálogo - Escolhe os catálogos de addons que esta pasta deve agregar. - Selecionar Catálogos - Selecionar género - %1$d selecionados - %1$d catálogos - %1$d selecionados - Poster - Quadrado - Panorâmico - Combinar todos os catálogos num único separador - Mostrar Separador \"Tudo\" - Reproduzir o GIF configurado em vez da capa estática, quando disponível. - Mostrar GIF quando Configurado - %1$d fonte(s) · %2$s - Forma do Cartão - Linhas - Separadores - Modo de Visualização - Fontes TMDB - Lista Pública - Produção - Rede/Canal - Coleção - Personalizado - Escolhe uma fonte predefinida. Podes editar ou remover após adicionar. - Cola o URL de uma lista pública do TMDB ou apenas o número presente no URL. - Pesquisa pelo nome do estúdio ou cola o ID/URL de uma empresa no TMDB para adicionar diretamente. - Introduz um ID de rede. As redes comuns estão disponíveis nas Predefinições e filtros rápidos. - Pesquisa pelo nome de uma coleção de filmes ou cola o ID da coleção do TMDB. - Cria uma linha TMDB dinâmica usando filtros opcionais. Deixa os campos vazios quando não precisares de um filtro. - Lista pública TMDB - ID da Rede - ID da Coleção - Nome da produtora, ID ou URL - ID ou URL do TMDB - https://www.themoviedb.org/list/8504994 ou 8504994 - 213 para Netflix, 49 para HBO, 2739 para Disney+ - 10 para Coleção Star Wars - Marvel Studios, 420 ou URL da empresa - Exemplos: Marvel Studios, 420 ou https://www.themoviedb.org/company/420. - Exemplo: Coleção Star Wars, Coleção Harry Potter ou um URL de coleção. - Exemplos de IDs: Netflix 213, HBO 49, Disney+ 2739. - Exemplo: https://www.themoviedb.org/list/8504994 ou 8504994. - Título a exibir - Exibido como o nome da linha/separador. Se estiver em branco, o Nuvio cria um a partir da fonte. - Filmes Marvel, Originais Netflix, Pixar - Melhores Filmes de Ação, Dramas Coreanos, Animação 2024 - Resultados da Pesquisa - Coleção TMDB - Empresa TMDB %1$d - Coleção TMDB %1$d - Tipo - Filmes - Séries - Ambos - Ordenar - Filtros - Deixa os campos vazios quando não precisares de um filtro. - Géneros rápidos - Idiomas rápidos - Países rápidos - Palavras-chave rápidas - Estúdios rápidos - Redes rápidas - IDs de Género - Usa números de género TMDB. Separa múltiplos com vírgulas para AND, ou barras verticais para OR. - Data de lançamento desde - Data de lançamento até - Usa AAAA-MM-DD, por exemplo 2024-01-01. - Avaliação mínima - Avaliação máxima - Avaliação TMDB de 0 a 10. Exemplo: 7.0. - Mínimo de votos - Usa isto para evitar títulos obscuros com poucos votos. Exemplo: 100. - Idioma original - Usa códigos de idioma de duas letras, por exemplo en, ko, ja, hi. - País de origem - Usa códigos de país de duas letras, por exemplo US, KR, JP, IN. - IDs de Palavras-chave - Usa números de palavras-chave TMDB. Os botões rápidos preenchem exemplos comuns. - 9715 para super-herói - IDs de Empresas - Usa IDs de estúdio/empresa. Os botões rápidos preenchem exemplos comuns. - 420 para Marvel Studios - IDs de Redes - Apenas para séries. Usa IDs de rede como Netflix 213 ou HBO 49. - 213 para Netflix - Ano - Usa um ano com quatro dígitos, por exemplo 2024. - Predefinições - Pesquisar - Adicionar Fonte - Ação - Aventura - Animação - Comédia - Terror - Ficção Científica - Drama - Crime - Reality TV - Inglês - Coreano - Japonês - Hindi - Espanhol - Estados Unidos - Coreia - Japão - Índia - Reino Unido - Super-herói - Baseado em Romance/Livro - Viagem no Tempo - Espaço - Marvel - Disney - Pixar - Lucasfilm - Warner Bros. - Netflix - HBO - Disney+ - Prime Video - Hulu - Popular - Melhor Classificados - Recentes - Lista TMDB - Coleção de Filmes TMDB - Produção - Rede/Canal - Descobrir TMDB - Cria uma para organizares os teus catálogos. - Ainda não existem coleções - %1$d pasta(s) - Nenhum item encontrado - Pasta não encontrada - Coleções - Importar Coleções - JSON - Cola o JSON das tuas coleções abaixo. - Importar - Nova Coleção - Afixado - Tudo - As Tuas Coleções - Feito com ❤️ pela Tapframe e amigos - Versão %1$s (%2$s) - Desligado - Ligado - Pausa - Recarregar - Já tens uma conta? - Continuar Sem Conta - Criar Conta - Não tens uma conta? - E-mail -   ou  - Palavra-passe - Inicia sessão para acederes à tua biblioteca e progresso - Iniciar Sessão - Regista-te para sincronizares os teus dados entre dispositivos - Registar - Os teus dados serão guardados apenas localmente - Transmite tudo, em qualquer lugar - Bem-vindo de volta - Biblioteca - Biblioteca Trakt - Início - Biblioteca - Perfil - Pesquisa - Faixas de Áudio - Áudio - Integrado - Ajuste Inferior - Fechar reprodutor - Cor - A reproduzir - E%1$d - S%1$dE%2$d - S%1$dE%2$d • %3$s - Episódios - Tamanho da Letra - %1$dsp - Bloquear controlos - Nenhuma faixa de áudio disponível - Nenhum episódio disponível - Nenhuma transmissão encontrada - Nenhum - Contorno - Episódios - Fontes - Transmissões - Erro de reprodução - A reproduzir - Toca para obter legendas - Voltar - Repor Predefinições - Preencher - Ajustar - Zoom - Recuar 10 segundos - -%1$ds - +%1$ds - -%1$ds - +%1$ds - Avançar 10 segundos - Fontes - Estilo - Leg. - Legendas - Brilho %1$s - Volume %1$s - Sem som - Transferido - Emitido em - A anunciar - Toca para desbloquear - Faixa %1$d - Desbloquear controlos - Estás a ver - Adicionar Perfil - Limpar pesquisa - Descobrir - Os addons instalados falharam ao devolver resultados de pesquisa válidos. - Falha na pesquisa - Instala e valida pelo menos um addon antes de pesquisares. - Sem addons ativos - Os catálogos pesquisáveis instalados não encontraram correspondências para esta consulta. - Nenhum resultado encontrado - Os teus addons instalados não disponibilizam pesquisa de catálogo. - Sem catálogos pesquisáveis - Pesquisa filmes, séries... - Pesquisas Recentes - Remover pesquisa recente - Sobre - Geral - Conta - Addons - Aparência - Conteúdo e Descoberta - Continuar a Ver - Ecrã Inicial - Integrações - Classificações MDBList - Ecrã de Metadados - Notificações - Reprodução - Plugins - Personalização de Posters - Definições - Apoiantes e Colaboradores - Enriquecimento TMDB - Trakt - SOBRE - Gere a tua conta, termina sessão ou elimina-a. - CONTA - Ajusta a apresentação inicial e preferências visuais. - Verifica se existem novas versões da aplicação. - Procurar atualizações - Gere addons e fontes de descoberta. - Gere os teus filmes e episódios transferidos. - Transferências - GERAL - Liga os serviços TMDB e MDBList. - Gere alertas de lançamento de episódios e envia uma notificação de teste. - Mudar para um perfil diferente. - Mudar de Perfil - Liga o Trakt, sincroniza listas e guarda títulos diretamente no Trakt. - A carregar as tuas listas do Trakt… - Escolhe onde guardar este título no Trakt - Doar - Ver detalhes - Remover - Começar do início - Reproduzir - %1$d/10 - Crítica - Spoiler - Ainda não existem críticas do Trakt disponíveis. - %1$d gostos - Este comentário contém spoilers. - Este comentário contém spoilers e foi ocultado. - Comentários - Trailer - %1$s (%2$d) - Trailers - Sem episódios concluídos - Ainda não existem transferências - %1$d episódio(s) transferido(s) - Ativas - Filmes - Séries - Ver Transferências - Concluída • %1$s - A transferir • %1$s - Falhou - Pausada • %1$s - Visto - Temporada %1$d - Especiais - Continua de onde ficaste - Adicionar à biblioteca - Marcar como não visto - Marcar como visto - Remover da biblioteca - Ver Tudo - Reproduzir manualmente - Logótipo %1$s - Conta - Eliminar Conta - Isto eliminará permanentemente a tua conta e todos os dados associados. - Esta ação não pode ser desfeita. Todos os teus dados, perfis e histórico de sincronização serão removidos permanentemente. - Eliminar Conta? - E-mail - Sessão não iniciada - Terminar Sessão - Serás redirecionado para o ecrã de início de sessão. - Terminar Sessão? - Estado - Anónimo - Sessão Iniciada - Preto AMOLED - Utiliza fundos pretos puros para ecrãs OLED. - Idioma da Aplicação - Escolher Idioma - Mostra, oculta e personaliza o aspeto da secção \"Continuar a Ver\". - Ajusta a largura e o arredondamento dos cantos dos posters. - ECRÃ - INÍCIO - TEMA - Coleção • %1$s - Nome de Exibição - Instala um addon com catálogos compatíveis para configurares as linhas do Ecrã Inicial. - Sem catálogos iniciais - Fonte do destaque (Hero) - Oculto - Manter Início focado - %1$s • Limite atingido (máx. %2$d) - Nenhuma fonte de destaque selecionada - Fora do destaque - Remove a afixação no topo da coleção para a moveres - Afixado - Afixado no topo - Reordenar - CATÁLOGOS - CATÁLOGOS E COLEÇÕES - COLEÇÕES - DESTAQUE (HERO) - FONTES DE DESTAQUE - %1$d de %2$d selecionados - Mostrar Destaque - Exibe um carrossel de destaque no topo do Início. Escolhe até 2 catálogos fonte abaixo. - %1$d de %2$d catálogos visíveis • %3$d fontes de destaque selecionadas - Abre um catálogo apenas quando precisares de o renomear ou reordenar. - Visível - Reprodutor, legendas e reprodução automática - Arredondamento do Cartão - ESTILO DO CARTÃO DO POSTER - Largura do Cartão - Personalizado - Personaliza a largura e o arredondamento dos cantos para os cartões de poster em toda a aplicação. - Ocultar etiquetas - Modo panorâmico para posters em prateleira - Pré-visualização em Tempo Real - %1$s (%2$s) - Raio dos cantos: %1$ddp - Altura: %1$ddp - Largura: %1$ddp - Clássico - Pílula - Arredondado - Afiado - Subtil - Equilibrado - Conforto - Compacto - Denso - Grande - Padrão - Mostra um aviso para continuares de onde ficaste ao abrir a aplicação após saíres do reprodutor. - Aviso de retoma ao iniciar - ESTILO DO CARTÃO - AO INICIAR - COMPORTAMENTO DO SEGUINTE - VISIBILIDADE - Exibe a secção \"Continuar a Ver\" no ecrã Inicial. - Mostrar Continuar a Ver - Poster - Cartão focado na imagem - Panorâmico - Cartão horizontal denso em informação - Quando ativado, o \"Seguinte\" continua sempre a partir do último episódio visto. Quando desativado, segue a partir do episódio visto mais recentemente. Útil se costumas rever episódios anteriores. - Seguinte a partir do último episódio - INÍCIO - FONTES - Instala, remove, atualiza e ordena as tuas fontes de conteúdo. - Instala repositórios de scrapers JavaScript e testa fornecedores internamente. - Controla quais os catálogos que aparecem no Início e por que ordem. - Desativa secções de detalhes e reordena tudo abaixo do Destaque. - Cria agrupamentos de catálogos personalizados com pastas exibidas no Início. - INTEGRAÇÕES - Melhora as páginas de detalhes com imagens TMDB, créditos, metadados de episódios e mais. - Adiciona classificações externas do IMDb, Rotten Tomatoes, Metacritic e outros. - Adiciona a tua chave API do MDBList abaixo antes de ativares as classificações. - Obtém uma chave em https://mdblist.com/preferences e cola-a aqui. - Chave API - Chave API MDBList - Ativar classificações MDBList - Mostra classificações externas do MDBList nas páginas de metadados quando o ID do IMDb estiver disponível. - CHAVE API - FORNECEDORES DE CLASSIFICAÇÃO - MDBLIST - Ações - Controlos de reprodução e gravação. - Elenco - Lista do elenco principal. - Fundo Cinemático - Fundo desfocado atrás do conteúdo, semelhante ao ecrã de transmissão. - Coleção - Linha de coleções ou franchises relacionados. - Comentários - Secção de comentários do Trakt. - Detalhes - Duração, estado, lançamento, idioma e informações relacionadas. - Cartões de Episódio - Escolhe como os episódios são apresentados no ecrã de metadados. - Horizontal - Cartões em linha tipo imagem de fundo - Lista - Cartões empilhados focados nos detalhes - Episódios - Lista de temporadas e episódios para séries. - Grupo %1$d - Mais como este - Linha de recomendações. - Nenhum - Resumo - Sinopse, classificações, géneros e créditos principais. - Produção - Estúdios e redes/canais. - APARÊNCIA - SECÇÕES - Grupo de Separadores %1$d - Esquema em Separadores - Agrupa secções em separadores. Atribui até 3 secções por grupo de separadores. - Trailers - Linha de trailers e atalhos de reprodução. - As notificações estão atualmente desativadas no Nuvio. - Alertas de lançamento de episódios - Agenda notificações locais quando um novo episódio de uma série guardada ficar disponível. - As notificações do sistema estão desativadas para o Nuvio. Ativa-as para receberes alertas. - %1$d alertas de lançamento estão agendados neste dispositivo. - ALERTAS - TESTE - Enviar Notificação de Teste - A enviar notificação de teste... - Enviar uma notificação de teste local para %1$s. - Guarda primeiro uma série na tua biblioteca para testares as notificações. - Notificação de teste - Comunidade - Conhece as pessoas que constroem e apoiam o Nuvio em Mobile, TV e Web. - API de Apoiantes não configurada. - Colaboradores - Apoiantes - Abrir GitHub - Perfil de GitHub indisponível - Sem mensagem anexada. - A carregar colaboradores... - A carregar apoiantes... - Não foi possível carregar os colaboradores - Não foi possível carregar os apoiantes - Nenhum colaborador encontrado. - Nenhum apoiante encontrado. - Incapaz de carregar colaboradores. - Incapaz de carregar apoiantes. - Não foi possível carregar os colaboradores agora. - Não foi possível carregar os apoiantes agora. - %1$d commits no total - Jan - Fev - Mar - Abr - Mai - Jun - Jul - Ago - Set - Out - Nov - Dez - %1$s %2$s, %3$s - Todos os Addons - Todos os Plugins - Addons Permitidos - Plugins Permitidos - Anime Skip - ID de Cliente AnimeSkip - Introduz o teu ID de cliente API do AnimeSkip. - Pesquisar também no AnimeSkip por marcas de tempo para saltar (requer ID de cliente). - Reproduzir Episódio Seguinte Automaticamente - Encontra e reproduz automaticamente o episódio seguinte quando o limite é atingido. - Apenas Dispositivo - Preferir Aplicação (FFmpeg) - Preferir Dispositivo - Prioridade do Descodificador - Toca fora para fechar - Toca fora para guardar e fechar - %1$d dia - %1$d dias - %1$d hora - %1$d horas - Ativar libass - Usa o libass para renderização de legendas ASS/SSA em vez do renderizador padrão. - Velocidade ao Premir - Premir para Acelerar - Prime longamente em qualquer parte do reprodutor para aumentar temporariamente a velocidade. - Padrão regex inválido - Duração do Cache do Último Link - Mapear DV7 para HEVC - Alternativa de Dolby Vision Profile 7 para HEVC em dispositivos não suportados. - Minutos Antes do Fim - Mostra o cartão do próximo episódio estes minutos antes do fim. - %1$d min - Nenhum item disponível - Não definido - Predefinição - Idioma do Dispositivo - Forçadas - Nenhum - Preferir Grupo de Maratona - Ao reproduzir automaticamente, prefere uma transmissão do mesmo grupo que a atual. - Idioma de Áudio Preferido - Idioma de Legendas Preferido - Predefinições - Compara com nome da stream, etiqueta, descrição, addon e URL. - Padrão Regex - 4K|2160p|Remux - Qualquer 1080p+ - AVC / x264 - Qualidade BluRay - Dolby Atmos / DTS - Inglês - HDR / Dolby Vision - HEVC / x265 - Sem CAM/TS - Sem REMUX/HDR - 1080p Padrão - 4K / Remux - 720p / Menor - Fontes WEB - Tipo de Renderização - Padrão (Cues) - Canvas de Efeitos - OpenGL de Efeitos - Canvas de Sobreposição - OpenGL de Sobreposição - Reutilizar Último Link - Reproduz automaticamente a última transmissão funcional para este filme/episódio enquanto o cache for válido. - Idioma de Áudio Secundário - Idioma de Legendas Secundário - DESCODIFICADOR - EPISÓDIO SEGUINTE - REPRODUTOR - SALTAR SEGMENTOS - REPRODUÇÃO AUTOMÁTICA - SELEÇÃO DE TRANSMISSÃO - LEGENDAS E ÁUDIO - RENDERIZAÇÃO DE LEGENDAS - %1$d selecionados - Mostrar Sobreposição de Carga - Mostra a animação de carregamento inicial enquanto uma transmissão começa. - Saltar Introdução/Créditos/Resumo - Mostra o botão de saltar durante segmentos detetados de introdução, créditos e resumo. - Âmbito da Fonte - Todos os Addons - Considerar transmissões de todos os addons instalados. - Todas as Fontes - Considerar transmissões tanto de addons como de plugins. - Apenas Plugins Ativados - Considerar apenas transmissões de plugins ativados. - Apenas Addons Instalados - Considerar apenas transmissões de addons instalados. - Modo de Seleção de Transmissão - Primeira Disponível - Reproduz automaticamente a primeira transmissão encontrada. - Manual - Selecionar transmissões manualmente de cada vez. - Correspondência Regex - Auto-seleciona uma stream que corresponda a um padrão regex. - Tempo Limite da Transmissão - Quanto tempo esperar por transmissões antes da auto-seleção. - Minutos Antes do Fim - Modo de Limite - Minutos Antes do Fim - Percentagem - Percentagem de Limite - Mostra o cartão do próximo episódio quando a reprodução atinge esta percentagem. - %1$d% - Instantâneo - %1$ds - Ilimitado - Reprodução Tunelada - Ativa a reprodução tunelada para menor latência na sincronização áudio/vídeo. - Adiciona a tua própria chave API do TMDB abaixo antes de ativares o enriquecimento. - Chave API TMDB - Ativar enriquecimento TMDB - Usa a tua chave API do TMDB para enriquecer metadados no ecrã de detalhes quando um ID TMDB ou IMDb está disponível. - Introduz a tua chave API v3 do TMDB. - Código de idioma - Arte Visual - Substitui fundo, poster e logótipo por arte do TMDB. - Informação básica - Usa título, sinopse, géneros e classificação do TMDB. - Coleções - Mostra linhas de franchises e coleções para filmes quando disponíveis. - Créditos - Usa criadores, realizadores, argumentistas e fotos do elenco do TMDB. - Detalhes - Usa info de lançamento, duração, classificação etária, estado, país e idioma do TMDB. - Episódios - Usa títulos, miniaturas, descrições e durações de episódios do TMDB para séries. - Mais como este - Mostra recomendações do TMDB no fundo das páginas de detalhes. - Redes/Canais - Usa metadados de redes do TMDB para títulos de TV. - Produtoras - Usa metadados de produtoras do TMDB no ecrã de detalhes. - Posters de temporadas - Usa posters de temporadas do TMDB no seletor de temporadas para séries. - Trailers - Procura e exibe a secção de trailers do TMDB nas páginas de detalhes. - Chave API pessoal - Idioma preferido - Define o código de idioma TMDB para metadados localizados (ex: `pt-PT`, `en-US`). - CREDENCIAIS - LOCALIZAÇÃO - MÓDULOS - TMDB - Após aprovação, serás redirecionado de volta automaticamente. - AUTENTICAÇÃO - Comentários - Mostrar comentários do Trakt nos detalhes de filmes e séries - Ligar ao Trakt - Ligado como %1$s - Utilizador Trakt - Desligar - Falha ao abrir o navegador - FUNCIONALIDADES - Conclui o início de sessão do Trakt no teu navegador - Monitoriza o que vês, guarda na lista de interesse ou listas personalizadas e mantém a biblioteca sincronizada. - Faltam credenciais do Trakt em local.properties. - Abrir Login do Trakt - As tuas ações de \"Guardar\" podem agora visar a lista de interesse e listas pessoais do Trakt. - Inicia sessão com o Trakt para ativar gravação baseada em listas e modo de biblioteca Trakt. - Pontuação do Público - IMDb - Letterboxd - Metacritic - Rotten Tomatoes - TMDB - Trakt - Desconhecido - Âmbar - Carmesim - Esmeralda - Oceano - Rosa - Violeta - Branco - Próximo Episódio - A procurar fonte… - A reproduzir via %1$s em %2$d… - Miniatura do próximo episódio - Não emitido - Saltar - Saltar Introdução - Saltar Créditos - Saltar Resumo - Nenhuma legenda encontrada - Africâner - Albanês - Amárico - Árabe - Arménio - Azerbaijano - Basco - Bielorrusso - Bengali - Bósnio - Búlgaro - Birmanês - Catalão - Chinês - Chinês (Simplificado) - Chinês (Tradicional) - Croata - Checo - Dinamarquês - Holandês - Inglês - Estónio - Filipino - Finlandês - Francês - Galego - Georgiano - Alemão - Grego - Gujarati - Hebraico - Hindi - Húngaro - Islandês - Indonésio - Irlandês - Italiano - Japonês - Canarim - Cazaque - Khmer - Coreano - Lao - Letão - Lituano - Macedónio - Malaio - Malaiala - Maltês - Marata - Mongol - Nepalês - Norueguês - Persa - Polaco - Português (Portugal) - Português (Brasil) - Panjabi - Romeno - Russo - Sérvio - Cingalês - Eslovaco - Esloveno - Espanhol - Espanhol (América Latina) - Suaíli - Sueco - Tâmil - Telugo - Tailandês - Turco - Ucraniano - Urdu - Usbeque - Vietnamita - Galês - Zulu - Limpar - Continuar - Ignorar - Instalar - Mais tarde - Não - Atualizar - Sim - Queres sair da aplicação? - Sair da aplicação - Este catálogo não devolveu nenhum item. - Nenhum título encontrado - Verifica a tua ligação Wi-Fi ou dados móveis e tenta novamente. - Realizador - Falha ao carregar - Mais Como Este - Temporadas - Este addon devolveu vídeos, mas nenhum inclui números de temporada ou episódio. - Este addon não forneceu metadados de episódios para esta série. - Os episódios ainda não foram publicados por este addon. - O teu dispositivo está online, mas o Nuvio não conseguiu contactar os servidores necessários. - Mostrar Menos - Mostrar Mais ▾ - Argumentista - Todos os Géneros - Catálogo - %1$s • %2$s - O catálogo selecionado falhou ao devolver itens de descoberta. - Não foi possível carregar descoberta - Os addons instalados não expõem catálogos compatíveis para descoberta. - Sem catálogos de descoberta - O catálogo e filtros selecionados não devolveram nenhuns itens. - Nenhum título encontrado - Instala e valida pelo menos um addon antes de navegar nos catálogos. - Selecionar Catálogo - Selecionar Género - Selecionar Tipo - Tipo - Marcar anteriores como não vistos - Marcar anteriores como vistos - Marcar %1$s como não vista - Marcar %1$s como vista - Marcar como não visto - Marcar como visto - Próximo - %1$s visto - Instala e valida pelo menos um addon antes de carregar o Início. - Os addons instalados não expõem catálogos compatíveis de momento. - Nenhuma linha disponível no Início - Ver Detalhes - Controlos de reprodução e gravação. - Ações - Lista do elenco principal. - Linha de coleção ou franchise relacionada. - Coleção - Secção de comentários do Trakt. - Duração, estado, lançamento, idioma e informações relacionadas. - Detalhes - Lista de temporadas e episódios para séries. - Linha de recomendações. - Mais Como Este - Sinopse, classificações, géneros e créditos principais. - Visão Geral - Estúdios e redes/canais. - Produção - Linha de trailers e atalhos de reprodução. - Novamente online - Não é possível contactar os servidores - Sem ligação à internet - (%1$d anos) - Nascimento: %1$s%2$s - Falecimento: %1$s - Conhecido por: %1$s - Mais recente - Não foi possível carregar os detalhes de %1$s - Popular - Algo correu mal - Próximos lançamentos - Apagar - Cancelar - Introduzir PIN - Introduz o PIN para %1$s - Esqueceste-te do PIN? - PIN incorreto - Bloqueado. Tenta novamente em %1$ds - As opções de avatar aparecerão aqui quando o catálogo carregar. - Avatar: %1$s - Escolhe um avatar - Escolhe um avatar abaixo. - Criar Perfil - Todos os dados de \"%1$s\" serão eliminados permanentemente. - Eliminar Perfil - Adicionar Perfil - Editar Perfil - Introduz o PIN atual - Introduz o novo PIN - Perfil %1$d - A carregar avatares... - Gerir Perfis - Nome do perfil - Novo perfil - Addons primários desativados - Addons primários ativados - Remover PIN de %1$s - Remover Bloqueio por PIN - A guardar... - Segurança - Adiciona um PIN se quiseres bloquear este perfil antes de alternares para ele. - Este perfil está protegido com um PIN. - Seleciona um avatar para este perfil. - Definir Bloqueio por PIN - Perfil sem nome - Usar Addons Primários - Partilha a configuração de addons do perfil principal em vez de gerir uma lista separada. - Quem está a ver? - Descarregado - Retomar - Scrapers ativos - A verificar mais addons… - Copiar link da stream - Descarregar ficheiro - Os addons de transmissão instalados falharam ao devolver uma resposta válida. - Não foi possível carregar as transmissões - Instala um addon primeiro para carregar transmissões para este título. - Os teus addons instalados não fornecem transmissões para este tipo de título. - Nenhum addon de transmissão disponível - Nenhum dos teus addons instalados devolveu transmissões para este título. - T%1$d E%2$d - Episódio - T%1$dE%2$d - %3$s - A obter… - A procurar fonte… - A procurar transmissões… - Link da stream copiado - Nenhum link direto disponível - Nenhuns metadados disponíveis - Atualizar transmissões - Retomar de %1$d% - Retomar de %1$s - TAMANHO %1$s - Fechar trailer - Não é possível reproduzir o trailer - Falha ao carregar listas do Trakt - Falha ao atualizar listas do Trakt - %1$s • %2$s - Falha ao verificar atualizações - Falha no download - A descarregar %1$d% - Não foi possível iniciar a instalação - Estás a usar a versão mais recente. - Ativa a instalação de aplicações para o Nuvio, depois volta e continua. - A descarregar atualização... - Nenhuma atualização encontrada. - Uma nova versão está pronta para instalar. - As atualizações na aplicação não estão disponíveis nesta versão. - A preparar download - Notas de lançamento - Permitir que a instalação continue - Atualização disponível - Estado da atualização - Esse addon já está instalado. - Introduz um URL de addon válido - Não foi possível carregar o manifesto - Nuvio - Falha ao eliminar conta - Falha ao iniciar sessão - Falha ao terminar sessão - Falha ao criar conta - Não foi possível carregar os itens do catálogo. - A Seguir - A Seguir • T%1$dE%2$d - Logótipo de %1$s - Falha ao carregar comentários - Não foi possível carregar detalhes de nenhum addon. - Redes/Canais - Nenhum addon fornece metadados para este conteúdo. - Falha no download - Mostra o progresso e controlos de downloads em direto. - Downloads - Download concluído - A descarregar %1$s • %2$s - A descarregar %1$s • %2$s / %3$s - Falha no download - Em pausa %1$s - Remover - Remover %1$s da tua biblioteca? - Remover da Biblioteca? - Filme - Alertas para quando um novo episódio de uma série guardada é lançado. - Pré-visualização do alerta de lançamento de episódio. - Falha ao enviar uma notificação de teste. - Notificação de teste enviada para %1$s. - Não é possível reproduzir esta transmissão. - O PIN deste perfil mudou. Liga-te uma vez para atualizar o bloqueio neste dispositivo. - Não foi possível remover o bloqueio por PIN. Tenta novamente. - Liga-te à internet para remover o bloqueio por PIN. - Este PIN ainda não pode ser verificado offline neste dispositivo. Liga-te e desbloqueia-o online primeiro. - Não foi possível definir o PIN. Tenta novamente. - Liga-te à internet para definir um PIN. - Este perfil utiliza addons primários. - Falha ao carregar %1$s - Transmissão - Incorporado - Autorização negada - Conclui o início de sessão do Trakt no teu navegador - Callback do Trakt inválido - Estado de callback do Trakt inválido - Resposta de token do Trakt inválida - Falha ao carregar biblioteca do Trakt - Lista %1$d - O Trakt não devolveu um código de autorização - Faltam credenciais do Trakt - Falha ao carregar progresso do Trakt - Falha ao concluir o início de sessão no Trakt - Utilizador Trakt - Lista de interesse - Trailer - Desconhecido - Addon - Guardado - Reproduzir %1$s - Retomar %1$s - O JSON está vazio. - A coleção %1$d tem um ID em branco. - A coleção \'%1$s\' tem um título em branco. - A pasta %1$d em \'%2$s\' tem um ID em branco. - A pasta \'%1$s\' em \'%2$s\' tem um título em branco. - A fonte %1$d na pasta \'%2$s\' tem campos em branco. - JSON inválido: %1$s - Addon não encontrado: %1$s - Janeiro - Fevereiro - Março - Abril - Maio - Junho - Julho - Agosto - Setembro - Outubro - Novembro - Dezembro - Jan - Fev - Mar - Abr - Mai - Jun - Jul - Ago - Set - Out - Nov - Dez - Produtora - Rede/Canal - Não foi possível carregar %1$s - Popular - Recente - %1$s • %2$s - Melhor Classificados - Certificação - Detalhes do Filme - Idioma Original - País de Origem - Info de Lançamento - Duração - Posters - Texto - Detalhes da Série - Estado - Vídeos - Ficheiro - Nenhum link direto disponível - Download anterior substituído - Download iniciado - Formato de transmissão não suportado para downloads - Corpo da resposta vazio - O pedido falhou com HTTP %1$d - O sistema de downloads não foi inicializado - Pedido de download falhou - %1$s - %2$s - Os títulos guardados aparecerão aqui após tocares em \"Guardar\" no ecrã de detalhes. - A tua biblioteca está vazia - Não foi possível carregar a biblioteca - Outro - Biblioteca - Liga o Trakt e guarda títulos na tua lista de interesse ou listas pessoais. - A tua biblioteca Trakt está vazia - Não foi possível carregar a biblioteca Trakt - Biblioteca Trakt - Anime - Canais - Filmes - Séries - TV - %1$s já está disponível - %1$s • %2$s já está disponível - Um novo episódio já está disponível - %1$s já está disponível - Lançamentos de Episódios - Criador - Realizador - Argumentista - Pontuação do Público - Nenhuma transmissão de trailer reproduzível encontrada. - Temporada %1$d - %2$s - B - KB - MB - GB - From b6f0267e0e231a57151640b8f64146229fbe37a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Costa?= <79596903+affcosta7@users.noreply.github.com> Date: Fri, 1 May 2026 14:36:38 +0100 Subject: [PATCH 065/143] Update AppLanguage.kt --- .../kotlin/com/nuvio/app/features/settings/AppLanguage.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt index a5062582..8002195d 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt @@ -4,7 +4,7 @@ import nuvio.composeapp.generated.resources.Res import nuvio.composeapp.generated.resources.lang_english import nuvio.composeapp.generated.resources.lang_french import nuvio.composeapp.generated.resources.lang_spanish -import nuvio.composeapp.generated.resources.lang_portuguese_portugal +import nuvio.composeapp.generated.resources.lang_portuguese import nuvio.composeapp.generated.resources.lang_turkish import nuvio.composeapp.generated.resources.lang_italian import nuvio.composeapp.generated.resources.lang_greek From 5c7253d21fd3dc2ddbc8680b196905f75a5afd15 Mon Sep 17 00:00:00 2001 From: paregi12 Date: Sat, 2 May 2026 11:27:47 +0530 Subject: [PATCH 066/143] feat: implement IntroDB submission feature --- .../player/PlayerSettingsStorage.android.kt | 31 ++ .../composeResources/values/strings.xml | 4 + .../app/features/player/PlayerControls.kt | 7 + .../nuvio/app/features/player/PlayerScreen.kt | 12 + .../player/PlayerSettingsRepository.kt | 20 + .../features/player/PlayerSettingsStorage.kt | 5 + .../app/features/player/skip/SkipIntroApi.kt | 56 +++ .../player/skip/SkipIntroRepository.kt | 30 ++ .../app/features/player/skip/SkipModels.kt | 12 + .../features/player/skip/SubmitIntroDialog.kt | 348 ++++++++++++++++++ .../features/settings/PlaybackSettingsPage.kt | 141 +++++++ .../player/PlayerSettingsStorage.ios.kt | 27 ++ 12 files changed, 693 insertions(+) create mode 100644 composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SubmitIntroDialog.kt diff --git a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/player/PlayerSettingsStorage.android.kt b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/player/PlayerSettingsStorage.android.kt index ddcc8a9f..4a589306 100644 --- a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/player/PlayerSettingsStorage.android.kt +++ b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/player/PlayerSettingsStorage.android.kt @@ -45,6 +45,8 @@ actual object PlayerSettingsStorage { private const val skipIntroEnabledKey = "skip_intro_enabled" private const val animeSkipEnabledKey = "animeskip_enabled" private const val animeSkipClientIdKey = "animeskip_client_id" + private const val introDbApiKeyKey = "introdb_api_key" + private const val introSubmitEnabledKey = "intro_submit_enabled" private const val streamAutoPlayNextEpisodeEnabledKey = "stream_auto_play_next_episode_enabled" private const val streamAutoPlayPreferBingeGroupKey = "stream_auto_play_prefer_binge_group" private const val nextEpisodeThresholdModeKey = "next_episode_threshold_mode" @@ -480,6 +482,33 @@ actual object PlayerSettingsStorage { ?.apply() } + actual fun loadIntroDbApiKey(): String? = + preferences?.getString(ProfileScopedKey.of(introDbApiKeyKey), null) + + actual fun saveIntroDbApiKey(apiKey: String) { + preferences + ?.edit() + ?.putString(ProfileScopedKey.of(introDbApiKeyKey), apiKey) + ?.apply() + } + + actual fun loadIntroSubmitEnabled(): Boolean? = + preferences?.let { sharedPreferences -> + val key = ProfileScopedKey.of(introSubmitEnabledKey) + if (sharedPreferences.contains(key)) { + sharedPreferences.getBoolean(key, false) + } else { + null + } + } + + actual fun saveIntroSubmitEnabled(enabled: Boolean) { + preferences + ?.edit() + ?.putBoolean(ProfileScopedKey.of(introSubmitEnabledKey), enabled) + ?.apply() + } + actual fun loadStreamAutoPlayNextEpisodeEnabled(): Boolean? = preferences?.let { sharedPreferences -> val key = ProfileScopedKey.of(streamAutoPlayNextEpisodeEnabledKey) @@ -652,6 +681,8 @@ actual object PlayerSettingsStorage { payload.decodeSyncBoolean(skipIntroEnabledKey)?.let(::saveSkipIntroEnabled) payload.decodeSyncBoolean(animeSkipEnabledKey)?.let(::saveAnimeSkipEnabled) payload.decodeSyncString(animeSkipClientIdKey)?.let(::saveAnimeSkipClientId) + payload.decodeSyncString(introDbApiKeyKey)?.let(::saveIntroDbApiKey) + payload.decodeSyncBoolean(introSubmitEnabledKey)?.let(::saveIntroSubmitEnabled) payload.decodeSyncBoolean(streamAutoPlayNextEpisodeEnabledKey)?.let(::saveStreamAutoPlayNextEpisodeEnabled) payload.decodeSyncBoolean(streamAutoPlayPreferBingeGroupKey)?.let(::saveStreamAutoPlayPreferBingeGroup) payload.decodeSyncString(nextEpisodeThresholdModeKey)?.let(::saveNextEpisodeThresholdMode) diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index 4a014ff0..1d7de0e3 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -600,6 +600,10 @@ Anime Skip AnimeSkip Client ID Enter your AnimeSkip API client ID. Get one at anime-skip.com. + Enable Intro Submission + Show a button to submit intro/outro timestamps to the community database. + IntroDB API Key + Enter your IntroDB API key to submit timestamps. Required for submission. Also search AnimeSkip for skip timestamps (requires client ID). Auto-Play Next Episode Automatically find and play the next episode when the threshold is reached. diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt index 018c1d5e..0a430e27 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt @@ -502,6 +502,13 @@ private fun ProgressControls( onClick = onEpisodesClick, ) } + if (onSubmitIntroClick != null) { + PlayerActionPillButton( + label = "Submit Intro", + icon = Icons.Rounded.Flag, + onClick = onSubmitIntroClick, + ) + } } } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt index c3c5dd75..a68ff0bd 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt @@ -242,6 +242,7 @@ fun PlayerScreen( // Sources & Episodes Panel state var showSourcesPanel by remember { mutableStateOf(false) } var showEpisodesPanel by remember { mutableStateOf(false) } + var showSubmitIntroModal by remember { mutableStateOf(false) } var episodeStreamsPanelState by remember { mutableStateOf(EpisodeStreamsPanelState()) } val sourceStreamsState by PlayerStreamsRepository.sourceState.collectAsStateWithLifecycle() val episodeStreamsRepoState by PlayerStreamsRepository.episodeStreamsState.collectAsStateWithLifecycle() @@ -1599,6 +1600,7 @@ fun PlayerScreen( }, onSourcesClick = if (activeVideoId != null) {{ openSourcesPanel() }} else null, onEpisodesClick = if (isSeries) {{ openEpisodesPanel() }} else null, + onSubmitIntroClick = if (isSeries && playerSettingsUiState.introSubmitEnabled && playerSettingsUiState.introDbApiKey.isNotBlank()) {{ showSubmitIntroModal = true }} else null, onScrubChange = { positionMs -> scrubbingPositionMs = positionMs }, onScrubFinished = { positionMs -> scrubbingPositionMs = null @@ -1844,6 +1846,16 @@ fun PlayerScreen( }, ) } + + if (showSubmitIntroModal && activeSeasonNumber != null && activeEpisodeNumber != null && activeImdbId != null) { + com.nuvio.app.features.player.skip.SubmitIntroDialog( + imdbId = activeImdbId, + season = activeSeasonNumber, + episode = activeEpisodeNumber, + currentTimeSec = (displayedPositionMs / 1000.0), + onDismiss = { showSubmitIntroModal = false }, + ) + } } } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsRepository.kt index df32f47d..eee56907 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsRepository.kt @@ -178,6 +178,8 @@ object PlayerSettingsRepository { skipIntroEnabled = PlayerSettingsStorage.loadSkipIntroEnabled() ?: true animeSkipEnabled = PlayerSettingsStorage.loadAnimeSkipEnabled() ?: false animeSkipClientId = PlayerSettingsStorage.loadAnimeSkipClientId() ?: "" + introDbApiKey = PlayerSettingsStorage.loadIntroDbApiKey() ?: "" + introSubmitEnabled = PlayerSettingsStorage.loadIntroSubmitEnabled() ?: false streamAutoPlayNextEpisodeEnabled = PlayerSettingsStorage.loadStreamAutoPlayNextEpisodeEnabled() ?: false streamAutoPlayPreferBingeGroup = PlayerSettingsStorage.loadStreamAutoPlayPreferBingeGroup() ?: true nextEpisodeThresholdMode = PlayerSettingsStorage.loadNextEpisodeThresholdMode() @@ -384,6 +386,22 @@ object PlayerSettingsRepository { PlayerSettingsStorage.saveAnimeSkipClientId(clientId) } + fun setIntroDbApiKey(apiKey: String) { + ensureLoaded() + if (introDbApiKey == apiKey) return + introDbApiKey = apiKey + publish() + PlayerSettingsStorage.saveIntroDbApiKey(apiKey) + } + + fun setIntroSubmitEnabled(enabled: Boolean) { + ensureLoaded() + if (introSubmitEnabled == enabled) return + introSubmitEnabled = enabled + publish() + PlayerSettingsStorage.saveIntroSubmitEnabled(enabled) + } + fun setStreamAutoPlayNextEpisodeEnabled(enabled: Boolean) { ensureLoaded() if (streamAutoPlayNextEpisodeEnabled == enabled) return @@ -465,6 +483,8 @@ object PlayerSettingsRepository { skipIntroEnabled = skipIntroEnabled, animeSkipEnabled = animeSkipEnabled, animeSkipClientId = animeSkipClientId, + introDbApiKey = introDbApiKey, + introSubmitEnabled = introSubmitEnabled, streamAutoPlayNextEpisodeEnabled = streamAutoPlayNextEpisodeEnabled, streamAutoPlayPreferBingeGroup = streamAutoPlayPreferBingeGroup, nextEpisodeThresholdMode = nextEpisodeThresholdMode, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsStorage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsStorage.kt index 929d7deb..efc6b6c2 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsStorage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsStorage.kt @@ -55,6 +55,11 @@ internal expect object PlayerSettingsStorage { fun saveAnimeSkipEnabled(enabled: Boolean) fun loadAnimeSkipClientId(): String? fun saveAnimeSkipClientId(clientId: String) + + fun loadIntroDbApiKey(): String? + fun saveIntroDbApiKey(apiKey: String) + fun loadIntroSubmitEnabled(): Boolean? + fun saveIntroSubmitEnabled(enabled: Boolean) fun loadStreamAutoPlayNextEpisodeEnabled(): Boolean? fun saveStreamAutoPlayNextEpisodeEnabled(enabled: Boolean) fun loadStreamAutoPlayPreferBingeGroup(): Boolean? diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipIntroApi.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipIntroApi.kt index 87b7edfe..25438fde 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipIntroApi.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipIntroApi.kt @@ -30,6 +30,62 @@ internal object SkipIntroApi { } } + suspend fun submitIntro( + apiKey: String, + request: SubmitIntroRequest, + ): Boolean { + val baseUrl = IntroDbConfig.URL.trimEnd('/') + if (baseUrl.isBlank() || apiKey.isBlank()) return false + val url = "$baseUrl/submit" + val body = json.encodeToString(SubmitIntroRequest.serializer(), request) + val headers = mapOf( + "Authorization" to "Bearer $apiKey", + "Content-Type" to "application/json" + ) + return try { + val response = com.nuvio.app.features.addons.httpRequestRaw( + method = "POST", + url = url, + headers = headers, + body = body + ) + response.status == 200 || response.status == 201 + } catch (_: Exception) { + false + } + } + + suspend fun verifyIntroDbApiKey(apiKey: String): Boolean { + val baseUrl = IntroDbConfig.URL.trimEnd('/') + if (baseUrl.isBlank() || apiKey.isBlank()) return false + val url = "$baseUrl/submit" + val headers = mapOf( + "Authorization" to "Bearer $apiKey", + "Content-Type" to "application/json" + ) + return try { + val response = com.nuvio.app.features.addons.httpRequestRaw( + method = "POST", + url = url, + headers = headers, + body = "{}" + ) + + // 400 means Auth passed but payload was empty/invalid -> Key is Valid + if (response.status == 400) return true + + // 200/201 would also mean valid (though unexpected with empty body) + if (response.status == 200 || response.status == 201) return true + + // Explicitly handle auth failures + if (response.status == 401 || response.status == 403) return false + + false + } catch (_: Exception) { + false + } + } + // --- AniSkip --- suspend fun getAniSkipTimes( diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipIntroRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipIntroRepository.kt index 4e8ebf68..9e96d4aa 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipIntroRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipIntroRepository.kt @@ -241,6 +241,36 @@ object SkipIntroRepository { } catch (_: Exception) { emptyList() }.also { imdbEntriesCache[imdbId] = it } } + suspend fun submitIntro( + imdbId: String, + season: Int, + episode: Int, + startSec: Double, + endSec: Double, + segmentType: String, + ): Boolean { + val settings = PlayerSettingsRepository.uiState.value + val apiKey = settings.introDbApiKey.trim() + if (!settings.introSubmitEnabled || apiKey.isBlank()) return false + + val request = SubmitIntroRequest( + imdbId = imdbId, + season = season, + episode = episode, + startSec = startSec, + endSec = endSec, + startMs = (startSec * 1000).toLong(), + endMs = (endSec * 1000).toLong(), + segmentType = segmentType, + ) + + return SkipIntroApi.submitIntro(apiKey, request) + } + + suspend fun verifyIntroDbApiKey(apiKey: String): Boolean { + return SkipIntroApi.verifyIntroDbApiKey(apiKey) + } + fun clearCache() { cache.clear() imdbEntriesCache.clear() diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipModels.kt index c97d27f8..0e996a97 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SkipModels.kt @@ -50,6 +50,18 @@ data class IntroDbSegment( @SerialName("updated_at") val updatedAt: String? = null, ) +@Serializable +data class SubmitIntroRequest( + @SerialName("imdb_id") val imdbId: String, + @SerialName("season") val season: Int, + @SerialName("episode") val episode: Int, + @SerialName("start_sec") val startSec: Double, + @SerialName("end_sec") val endSec: Double, + @SerialName("start_ms") val startMs: Long, + @SerialName("end_ms") val endMs: Long, + @SerialName("segment_type") val segmentType: String, +) + // --- AniSkip API response models --- @Serializable diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SubmitIntroDialog.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SubmitIntroDialog.kt new file mode 100644 index 00000000..0771633b --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SubmitIntroDialog.kt @@ -0,0 +1,348 @@ +package com.nuvio.app.features.player.skip + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Close +import androidx.compose.material.icons.rounded.GpsFixed +import androidx.compose.material.icons.rounded.PlayCircleOutline +import androidx.compose.material.icons.rounded.Replay +import androidx.compose.material.icons.rounded.Send +import androidx.compose.material.icons.rounded.StopCircle +import androidx.compose.material3.BasicAlertDialog +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp +import kotlinx.coroutines.launch +import kotlin.math.floor +import kotlin.math.roundToInt + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SubmitIntroDialog( + imdbId: String, + season: Int, + episode: Int, + currentTimeSec: Double, + onDismiss: () -> Unit, +) { + val scope = rememberCoroutineScope() + var isSubmitting by remember { mutableStateOf(false) } + var segmentType by remember { mutableStateOf("intro") } + var startTimeStr by remember { mutableStateOf("00:00") } + var endTimeStr by remember { mutableStateOf(formatSecondsToMMSS(currentTimeSec)) } + + BasicAlertDialog(onDismissRequest = onDismiss) { + Surface( + modifier = Modifier.fillMaxWidth().padding(16.dp), + shape = RoundedCornerShape(24.dp), + color = MaterialTheme.colorScheme.surface, + tonalElevation = 8.dp, + ) { + Column( + modifier = Modifier.padding(24.dp), + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + // Header + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = "Submit Timestamps", + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.onSurface, + fontWeight = FontWeight.Bold, + ) + IconButton(onClick = onDismiss, modifier = Modifier.size(24.dp)) { + Icon(Icons.Rounded.Close, contentDescription = "Close", tint = MaterialTheme.colorScheme.onSurfaceVariant) + } + } + + // Segment Type + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + Text( + text = "SEGMENT TYPE", + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + fontWeight = FontWeight.SemiBold, + ) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + SegmentTypeButton( + label = "Intro", + icon = Icons.Rounded.PlayCircleOutline, + selected = segmentType == "intro", + onClick = { segmentType = "intro" }, + modifier = Modifier.weight(1f) + ) + SegmentTypeButton( + label = "Recap", + icon = Icons.Rounded.Replay, + selected = segmentType == "recap", + onClick = { segmentType = "recap" }, + modifier = Modifier.weight(1f) + ) + SegmentTypeButton( + label = "Outro", + icon = Icons.Rounded.StopCircle, + selected = segmentType == "outro", + onClick = { segmentType = "outro" }, + modifier = Modifier.weight(1f) + ) + } + } + + // Start Time + TimeInputRow( + label = "START TIME (MM:SS)", + value = startTimeStr, + onValueChange = { startTimeStr = it }, + onCapture = { startTimeStr = formatSecondsToMMSS(currentTimeSec) } + ) + + // End Time + TimeInputRow( + label = "END TIME (MM:SS)", + value = endTimeStr, + onValueChange = { endTimeStr = it }, + onCapture = { endTimeStr = formatSecondsToMMSS(currentTimeSec) } + ) + + Spacer(modifier = Modifier.height(8.dp)) + + // Actions + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + Box( + modifier = Modifier + .weight(1f) + .height(48.dp) + .clip(RoundedCornerShape(12.dp)) + .background(MaterialTheme.colorScheme.surfaceVariant) + .clickable(enabled = !isSubmitting, onClick = onDismiss), + contentAlignment = Alignment.Center + ) { + Text( + text = "Cancel", + color = MaterialTheme.colorScheme.onSurfaceVariant, + fontWeight = FontWeight.SemiBold + ) + } + Box( + modifier = Modifier + .weight(2f) + .height(48.dp) + .clip(RoundedCornerShape(12.dp)) + .background(MaterialTheme.colorScheme.primary) + .clickable(enabled = !isSubmitting) { + val start = parseTimeToSeconds(startTimeStr) + val end = parseTimeToSeconds(endTimeStr) + if (start != null && end != null && end > start) { + isSubmitting = true + scope.launch { + SkipIntroRepository.submitIntro( + imdbId = imdbId, + season = season, + episode = episode, + startSec = start, + endSec = end, + segmentType = segmentType, + ) + isSubmitting = false + onDismiss() + } + } + }, + contentAlignment = Alignment.Center + ) { + if (isSubmitting) { + CircularProgressIndicator( + color = MaterialTheme.colorScheme.onPrimary, + modifier = Modifier.size(24.dp), + strokeWidth = 2.dp + ) + } else { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + Icon(Icons.Rounded.Send, contentDescription = null, tint = MaterialTheme.colorScheme.onPrimary, modifier = Modifier.size(18.dp)) + Text( + text = "Submit", + color = MaterialTheme.colorScheme.onPrimary, + fontWeight = FontWeight.Bold + ) + } + } + } + } + } + } + } +} + +@Composable +private fun SegmentTypeButton( + label: String, + icon: androidx.compose.ui.graphics.vector.ImageVector, + selected: Boolean, + onClick: () -> Unit, + modifier: Modifier = Modifier +) { + Box( + modifier = modifier + .clip(RoundedCornerShape(12.dp)) + .background(if (selected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.surfaceVariant) + .clickable(onClick = onClick) + .padding(vertical = 10.dp), + contentAlignment = Alignment.Center + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(6.dp) + ) { + Icon( + imageVector = icon, + contentDescription = null, + tint = if (selected) MaterialTheme.colorScheme.onPrimary else MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.size(18.dp) + ) + Text( + text = label, + color = if (selected) MaterialTheme.colorScheme.onPrimary else MaterialTheme.colorScheme.onSurfaceVariant, + style = MaterialTheme.typography.bodySmall, + fontWeight = FontWeight.SemiBold + ) + } + } +} + +@Composable +private fun TimeInputRow( + label: String, + value: String, + onValueChange: (String) -> Unit, + onCapture: () -> Unit +) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.Bottom, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text( + text = label, + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + fontWeight = FontWeight.SemiBold, + ) + Surface( + shape = RoundedCornerShape(12.dp), + color = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.5f), + border = BorderStroke(1.dp, MaterialTheme.colorScheme.outline.copy(alpha = 0.3f)), + ) { + BasicTextField( + value = value, + onValueChange = onValueChange, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 14.dp, vertical = 12.dp), + textStyle = MaterialTheme.typography.bodyLarge.copy( + color = MaterialTheme.colorScheme.onSurface, + ), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + cursorBrush = SolidColor(MaterialTheme.colorScheme.primary), + singleLine = true, + ) + } + } + Box( + modifier = Modifier + .height(48.dp) + .clip(RoundedCornerShape(12.dp)) + .background(MaterialTheme.colorScheme.surfaceVariant) + .clickable(onClick = onCapture) + .padding(horizontal = 16.dp), + contentAlignment = Alignment.Center + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(6.dp) + ) { + Icon( + Icons.Rounded.GpsFixed, + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.size(18.dp) + ) + Text( + text = "Capture", + color = MaterialTheme.colorScheme.onSurfaceVariant, + style = MaterialTheme.typography.bodySmall, + fontWeight = FontWeight.SemiBold + ) + } + } + } +} + +private fun formatSecondsToMMSS(seconds: Double): String { + val mins = floor(seconds / 60).toInt() + val secs = floor(seconds % 60).toInt() + return "${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}" +} + +private fun parseTimeToSeconds(input: String): Double? { + if (input.isBlank()) return null + if (input.contains(':')) { + val parts = input.split(':') + if (parts.size != 2) return null + val mins = parts[0].toIntOrNull() ?: return null + val secs = parts[1].toIntOrNull() ?: return null + if (secs < 0 || secs >= 60) return null + return (mins * 60 + secs).toDouble() + } + return input.toDoubleOrNull() +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt index d3ba2d92..24c786df 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt @@ -472,6 +472,35 @@ private fun PlaybackSettingsSection( ) } } + SettingsGroupDivider(isTablet = isTablet) + SettingsSwitchRow( + title = stringResource(Res.string.settings_playback_intro_submit_enabled), + description = stringResource(Res.string.settings_playback_intro_submit_enabled_description), + checked = autoPlayPlayerSettings.introSubmitEnabled, + isTablet = isTablet, + onCheckedChange = PlayerSettingsRepository::setIntroSubmitEnabled, + ) + if (autoPlayPlayerSettings.introSubmitEnabled) { + SettingsGroupDivider(isTablet = isTablet) + var showIntroDbApiKeyDialog by remember { mutableStateOf(false) } + val notSetLabel = stringResource(Res.string.settings_playback_not_set) + SettingsNavigationRow( + title = stringResource(Res.string.settings_playback_introdb_api_key), + description = autoPlayPlayerSettings.introDbApiKey.ifBlank { notSetLabel }, + isTablet = isTablet, + onClick = { showIntroDbApiKeyDialog = true }, + ) + if (showIntroDbApiKeyDialog) { + IntroDbApiKeyDialog( + initialValue = autoPlayPlayerSettings.introDbApiKey, + onSave = { + PlayerSettingsRepository.setIntroDbApiKey(it) + showIntroDbApiKeyDialog = false + }, + onDismiss = { showIntroDbApiKeyDialog = false }, + ) + } + } } } @@ -1895,6 +1924,118 @@ private fun AnimeSkipClientIdDialog( } } +@Composable +@OptIn(ExperimentalMaterial3Api::class) +private fun IntroDbApiKeyDialog( + initialValue: String, + onSave: (String) -> Unit, + onDismiss: () -> Unit, +) { + val scope = rememberCoroutineScope() + var value by remember { mutableStateOf(initialValue) } + var isVerifying by remember { mutableStateOf(false) } + var errorMessage by remember { mutableStateOf(null) } + + BasicAlertDialog(onDismissRequest = { if (!isVerifying) onDismiss() }) { + Surface( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(20.dp), + color = MaterialTheme.colorScheme.surface, + ) { + Column( + modifier = Modifier.padding(20.dp), + verticalArrangement = Arrangement.spacedBy(12.dp), + ) { + Text( + text = stringResource(Res.string.settings_playback_introdb_api_key), + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.onSurface, + fontWeight = FontWeight.SemiBold, + ) + Text( + text = stringResource(Res.string.settings_playback_introdb_api_key_description), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + Surface( + shape = RoundedCornerShape(12.dp), + color = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.5f), + border = BorderStroke(1.dp, MaterialTheme.colorScheme.outline.copy(alpha = if (errorMessage != null) 1f else 0.3f)), + ) { + BasicTextField( + value = value, + onValueChange = { + value = it + errorMessage = null + }, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 14.dp, vertical = 12.dp), + textStyle = MaterialTheme.typography.bodyLarge.copy( + color = MaterialTheme.colorScheme.onSurface, + ), + cursorBrush = SolidColor(MaterialTheme.colorScheme.primary), + singleLine = true, + ) + } + if (errorMessage != null) { + Text( + text = errorMessage!!, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.error, + modifier = Modifier.padding(start = 4.dp) + ) + } + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.End, + ) { + TextButton(onClick = onDismiss, enabled = !isVerifying) { + Text(stringResource(Res.string.action_cancel)) + } + TextButton( + onClick = { + val trimmed = value.trim() + if (trimmed.isEmpty()) { + onSave(trimmed) + return@TextButton + } + + if (trimmed == initialValue) { + onDismiss() + return@TextButton + } + + isVerifying = true + errorMessage = null + scope.launch { + val isValid = com.nuvio.app.features.player.skip.SkipIntroRepository.verifyIntroDbApiKey(trimmed) + isVerifying = false + if (isValid) { + onSave(trimmed) + } else { + errorMessage = "Invalid API Key or connection failed" + } + } + }, + enabled = !isVerifying + ) { + if (isVerifying) { + CircularProgressIndicator( + modifier = Modifier.size(16.dp), + strokeWidth = 2.dp, + color = MaterialTheme.colorScheme.primary + ) + } else { + Text(stringResource(Res.string.action_save)) + } + } + } + } + } + } +} + @Composable @OptIn(ExperimentalMaterial3Api::class) private fun NextEpisodeThresholdModeDialog( diff --git a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/player/PlayerSettingsStorage.ios.kt b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/player/PlayerSettingsStorage.ios.kt index c4e9795e..3f63f5db 100644 --- a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/player/PlayerSettingsStorage.ios.kt +++ b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/player/PlayerSettingsStorage.ios.kt @@ -43,6 +43,8 @@ actual object PlayerSettingsStorage { private const val skipIntroEnabledKey = "skip_intro_enabled" private const val animeSkipEnabledKey = "animeskip_enabled" private const val animeSkipClientIdKey = "animeskip_client_id" + private const val introDbApiKeyKey = "introdb_api_key" + private const val introSubmitEnabledKey = "intro_submit_enabled" private const val streamAutoPlayNextEpisodeEnabledKey = "stream_auto_play_next_episode_enabled" private const val streamAutoPlayPreferBingeGroupKey = "stream_auto_play_prefer_binge_group" private const val nextEpisodeThresholdModeKey = "next_episode_threshold_mode" @@ -418,6 +420,30 @@ actual object PlayerSettingsStorage { NSUserDefaults.standardUserDefaults.setObject(clientId, forKey = ProfileScopedKey.of(animeSkipClientIdKey)) } + actual fun loadIntroDbApiKey(): String? { + val defaults = NSUserDefaults.standardUserDefaults + val key = ProfileScopedKey.of(introDbApiKeyKey) + return defaults.stringForKey(key) + } + + actual fun saveIntroDbApiKey(apiKey: String) { + NSUserDefaults.standardUserDefaults.setObject(apiKey, forKey = ProfileScopedKey.of(introDbApiKeyKey)) + } + + actual fun loadIntroSubmitEnabled(): Boolean? { + val defaults = NSUserDefaults.standardUserDefaults + val key = ProfileScopedKey.of(introSubmitEnabledKey) + return if (defaults.objectForKey(key) != null) { + defaults.boolForKey(key) + } else { + null + } + } + + actual fun saveIntroSubmitEnabled(enabled: Boolean) { + NSUserDefaults.standardUserDefaults.setBool(enabled, forKey = ProfileScopedKey.of(introSubmitEnabledKey)) + } + actual fun loadStreamAutoPlayNextEpisodeEnabled(): Boolean? { val defaults = NSUserDefaults.standardUserDefaults val key = ProfileScopedKey.of(streamAutoPlayNextEpisodeEnabledKey) @@ -559,6 +585,7 @@ actual object PlayerSettingsStorage { payload.decodeSyncBoolean(skipIntroEnabledKey)?.let(::saveSkipIntroEnabled) payload.decodeSyncBoolean(animeSkipEnabledKey)?.let(::saveAnimeSkipEnabled) payload.decodeSyncString(animeSkipClientIdKey)?.let(::saveAnimeSkipClientId) + payload.decodeSyncString(introDbApiKeyKey)?.let(::saveIntroDbApiKey) payload.decodeSyncBoolean(streamAutoPlayNextEpisodeEnabledKey)?.let(::saveStreamAutoPlayNextEpisodeEnabled) payload.decodeSyncBoolean(streamAutoPlayPreferBingeGroupKey)?.let(::saveStreamAutoPlayPreferBingeGroup) payload.decodeSyncString(nextEpisodeThresholdModeKey)?.let(::saveNextEpisodeThresholdMode) From cf2274314818f50d31eb2d23f68ccfe15550345c Mon Sep 17 00:00:00 2001 From: paregi12 Date: Sat, 2 May 2026 11:48:45 +0530 Subject: [PATCH 067/143] fixes for introdb submit --- .../nuvio/app/features/player/PlayerControls.kt | 3 +++ .../com/nuvio/app/features/player/PlayerScreen.kt | 14 ++++++++++---- .../features/player/PlayerSettingsRepository.kt | 2 ++ .../app/features/settings/PlaybackSettingsPage.kt | 4 ++++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt index 0a430e27..f1514d6e 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt @@ -21,6 +21,7 @@ import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Flag import androidx.compose.material.icons.rounded.Forward10 import androidx.compose.material.icons.rounded.Lock import androidx.compose.material.icons.rounded.LockOpen @@ -79,6 +80,7 @@ internal fun PlayerControlsShell( onAudioClick: () -> Unit, onSourcesClick: (() -> Unit)? = null, onEpisodesClick: (() -> Unit)? = null, + onSubmitIntroClick: (() -> Unit)? = null, onScrubChange: (Long) -> Unit, onScrubFinished: (Long) -> Unit, horizontalSafePadding: androidx.compose.ui.unit.Dp, @@ -421,6 +423,7 @@ private fun ProgressControls( onAudioClick: () -> Unit, onSourcesClick: (() -> Unit)? = null, onEpisodesClick: (() -> Unit)? = null, + onSubmitIntroClick: (() -> Unit)? = null, modifier: Modifier = Modifier, ) { val durationMs = playbackSnapshot.durationMs.coerceAtLeast(1L) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt index a68ff0bd..e144c4ce 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt @@ -1847,11 +1847,17 @@ fun PlayerScreen( ) } - if (showSubmitIntroModal && activeSeasonNumber != null && activeEpisodeNumber != null && activeImdbId != null) { + val season = activeSeasonNumber + val episode = activeEpisodeNumber + val imdbId = activeVideoId?.split(":")?.firstOrNull()?.takeIf { it.startsWith("tt") } + ?: parentMetaId.takeIf { it.startsWith("tt") } + ?: metaUiState.meta?.id?.takeIf { it.startsWith("tt") } + + if (showSubmitIntroModal && season != null && episode != null && !imdbId.isNullOrBlank()) { com.nuvio.app.features.player.skip.SubmitIntroDialog( - imdbId = activeImdbId, - season = activeSeasonNumber, - episode = activeEpisodeNumber, + imdbId = imdbId, + season = season, + episode = episode, currentTimeSec = (displayedPositionMs / 1000.0), onDismiss = { showSubmitIntroModal = false }, ) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsRepository.kt index eee56907..451b9cda 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsRepository.kt @@ -32,6 +32,8 @@ data class PlayerSettingsUiState( val skipIntroEnabled: Boolean = true, val animeSkipEnabled: Boolean = false, val animeSkipClientId: String = "", + val introDbApiKey: String = "", + val introSubmitEnabled: Boolean = false, val streamAutoPlayNextEpisodeEnabled: Boolean = false, val streamAutoPlayPreferBingeGroup: Boolean = true, val nextEpisodeThresholdMode: NextEpisodeThresholdMode = NextEpisodeThresholdMode.PERCENTAGE, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt index 24c786df..dc0903e0 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt @@ -36,6 +36,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -58,6 +59,7 @@ import com.nuvio.app.features.plugins.PluginRepository import com.nuvio.app.features.streams.StreamAutoPlayMode import com.nuvio.app.features.streams.StreamAutoPlaySource import com.nuvio.app.isIos +import kotlinx.coroutines.launch import nuvio.composeapp.generated.resources.* import org.jetbrains.compose.resources.StringResource import org.jetbrains.compose.resources.stringResource @@ -2159,3 +2161,5 @@ private fun libassRenderTypeRes(renderType: String): StringResource = when (rend @Composable private fun libassRenderTypeLabel(renderType: String): String = stringResource(libassRenderTypeRes(renderType)) +): String = stringResource(libassRenderTypeRes(renderType)) +pe)) From 1119456ae0e097dd38b325ef4fa0bc1c1e882618 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sat, 2 May 2026 13:22:48 +0530 Subject: [PATCH 068/143] feat: trakt list as collections --- .../composeResources/values/strings.xml | 22 + .../collection/CollectionEditorRepository.kt | 285 +++++++++++- .../collection/CollectionEditorScreen.kt | 345 +++++++++++++- .../collection/CollectionJsonPreserver.kt | 32 +- .../features/collection/CollectionModels.kt | 40 +- .../collection/CollectionRepository.kt | 16 +- .../collection/FolderDetailRepository.kt | 52 ++- .../nuvio/app/features/trakt/TraktIdUtils.kt | 1 + .../trakt/TraktPublicListSourceResolver.kt | 430 ++++++++++++++++++ .../CollectionSourceSerializationTest.kt | 181 ++++++++ .../TraktPublicListSourceResolverTest.kt | 49 ++ iosApp/Configuration/Version.xcconfig | 2 +- 12 files changed, 1426 insertions(+), 29 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktPublicListSourceResolver.kt create mode 100644 composeApp/src/commonTest/kotlin/com/nuvio/app/features/collection/CollectionSourceSerializationTest.kt create mode 100644 composeApp/src/commonTest/kotlin/com/nuvio/app/features/trakt/TraktPublicListSourceResolverTest.kt diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index 4a014ff0..ef139d3b 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -188,6 +188,27 @@ Presets Search Add Source + Add Trakt List + Edit Trakt List + Trakt Lists + Trakt list + Search title, Trakt URL, or list ID + Use a public Trakt list URL or numeric list ID, or search by name. + Weekend Watch, Award Winners + Search Results + Trending Lists + Popular Lists + Direction + Ascending + Descending + List Order + Recently Added + Title + Released + Runtime + Popular + Percentage + Votes Action Adventure Animation @@ -1087,6 +1108,7 @@ Folder %1$d in '%2$s' has blank id. Folder '%1$s' in '%2$s' has blank title. Source %1$d in folder '%2$s' has blank fields. + Source %1$d in folder '%2$s' is missing a Trakt list ID. Invalid JSON: %1$s Addon not found: %1$s January diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt index f7597072..0a31a9d7 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorRepository.kt @@ -2,6 +2,8 @@ package com.nuvio.app.features.collection import co.touchlab.kermit.Logger import com.nuvio.app.features.home.PosterShape +import com.nuvio.app.features.trakt.TraktPublicListSearchResult +import com.nuvio.app.features.trakt.TraktPublicListSourceResolver import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob @@ -27,6 +29,8 @@ data class CollectionEditorUiState( val showFolderEditor: Boolean = false, val showCatalogPicker: Boolean = false, val showTmdbSourcePicker: Boolean = false, + val showTraktSourcePicker: Boolean = false, + val editingTraktSourceIndex: Int? = null, val genrePickerSourceIndex: Int? = null, val tmdbBuilderMode: TmdbBuilderMode = TmdbBuilderMode.PRESETS, val tmdbInput: String = "", @@ -38,6 +42,16 @@ data class CollectionEditorUiState( val tmdbCompanyResults: List = emptyList(), val tmdbCollectionResults: List = emptyList(), val tmdbSearchError: String? = null, + val traktInput: String = "", + val traktTitleInput: String = "", + val traktMediaType: TmdbCollectionMediaType = TmdbCollectionMediaType.MOVIE, + val traktMediaBoth: Boolean = true, + val traktSortBy: String = TraktListSort.RANK.value, + val traktSortHow: String = TraktSortHow.ASC.value, + val traktSearchResults: List = emptyList(), + val traktTrendingResults: List = emptyList(), + val traktPopularResults: List = emptyList(), + val traktSearchError: String? = null, ) enum class TmdbBuilderMode { @@ -246,7 +260,7 @@ object CollectionEditorRepository { fun updateCatalogSourceGenre(index: Int, genre: String?) { val folder = _uiState.value.editingFolder ?: return val sources = folder.resolvedSources - if (index !in sources.indices || sources[index].isTmdb) return + if (index !in sources.indices || sources[index].addonCatalogSource() == null) return val updated = sources.toMutableList() updated[index] = updated[index].copy(genre = genre) _uiState.value = _uiState.value.copy( @@ -258,7 +272,11 @@ object CollectionEditorRepository { val folder = _uiState.value.editingFolder ?: return val sources = folder.resolvedSources val existingIndex = sources.indexOfFirst { - !it.isTmdb && it.addonId == catalog.addonId && it.type == catalog.type && it.catalogId == catalog.catalogId + !it.isTmdb && + !it.isTrakt && + it.addonId == catalog.addonId && + it.type == catalog.type && + it.catalogId == catalog.catalogId } if (existingIndex >= 0) { removeCatalogSource(existingIndex) @@ -271,6 +289,8 @@ object CollectionEditorRepository { _uiState.value = _uiState.value.copy( showCatalogPicker = true, showTmdbSourcePicker = false, + showTraktSourcePicker = false, + editingTraktSourceIndex = null, genrePickerSourceIndex = null, ) } @@ -283,6 +303,8 @@ object CollectionEditorRepository { _uiState.value = _uiState.value.copy( showTmdbSourcePicker = true, showCatalogPicker = false, + showTraktSourcePicker = false, + editingTraktSourceIndex = null, genrePickerSourceIndex = null, tmdbSearchError = null, ) @@ -292,14 +314,139 @@ object CollectionEditorRepository { _uiState.value = _uiState.value.copy(showTmdbSourcePicker = false, tmdbSearchError = null) } + fun showTraktSourcePicker() { + _uiState.value = _uiState.value.copy( + showTraktSourcePicker = true, + showCatalogPicker = false, + showTmdbSourcePicker = false, + editingTraktSourceIndex = null, + genrePickerSourceIndex = null, + traktInput = "", + traktTitleInput = "", + traktMediaType = TmdbCollectionMediaType.MOVIE, + traktMediaBoth = true, + traktSortBy = TraktListSort.RANK.value, + traktSortHow = TraktSortHow.ASC.value, + traktSearchResults = emptyList(), + traktSearchError = null, + ) + loadTraktFeaturedLists() + } + + fun hideTraktSourcePicker() { + _uiState.value = _uiState.value.copy( + showTraktSourcePicker = false, + editingTraktSourceIndex = null, + traktSearchError = null, + ) + } + + fun editTraktSource(index: Int) { + val folder = _uiState.value.editingFolder ?: return + val source = folder.resolvedSources.getOrNull(index) ?: return + if (!source.isTrakt) return + _uiState.value = _uiState.value.copy( + showTraktSourcePicker = true, + showCatalogPicker = false, + showTmdbSourcePicker = false, + editingTraktSourceIndex = index, + genrePickerSourceIndex = null, + traktInput = source.traktListId?.toString().orEmpty(), + traktTitleInput = source.title.orEmpty(), + traktMediaType = TmdbCollectionMediaType.fromString(source.mediaType), + traktMediaBoth = false, + traktSortBy = TraktListSort.normalize(source.sortBy), + traktSortHow = TraktSortHow.normalize(source.sortHow), + traktSearchResults = emptyList(), + traktSearchError = null, + ) + loadTraktFeaturedLists() + } + + fun setTraktInput(value: String) { + _uiState.value = _uiState.value.copy(traktInput = value, traktSearchError = null) + } + + fun setTraktTitleInput(value: String) { + _uiState.value = _uiState.value.copy(traktTitleInput = value) + } + + fun setTraktMediaType(value: TmdbCollectionMediaType) { + _uiState.value = _uiState.value.copy(traktMediaType = value, traktMediaBoth = false) + } + + fun setTraktMediaBoth(value: Boolean) { + _uiState.value = _uiState.value.copy( + traktMediaBoth = value, + traktMediaType = if (value) TmdbCollectionMediaType.MOVIE else _uiState.value.traktMediaType, + ) + } + + fun setTraktSortBy(value: String) { + _uiState.value = _uiState.value.copy(traktSortBy = TraktListSort.normalize(value)) + } + + fun setTraktSortHow(value: String) { + _uiState.value = _uiState.value.copy(traktSortHow = TraktSortHow.normalize(value)) + } + + fun searchTraktLists() { + val state = _uiState.value + val query = state.traktInput.trim() + if (query.isBlank()) { + _uiState.value = state.copy(traktSearchError = "Enter a Trakt list name, URL, or ID") + return + } + + scope.launch { + val results = if (query.isTraktListIdentifierInput()) { + runCatching { + val metadata = TraktPublicListSourceResolver.listImportMetadata(query) + val id = metadata.traktListId ?: error("Could not load Trakt list") + listOf( + TraktPublicListSearchResult( + traktListId = id, + title = metadata.title ?: "Trakt List $id", + subtitle = "Resolved Trakt list", + coverImageUrl = metadata.coverImageUrl, + ), + ) + } + } else { + runCatching { TraktPublicListSourceResolver.searchPublicLists(query) } + } + val mapped = results.getOrDefault(emptyList()) + _uiState.value = _uiState.value.copy( + traktSearchResults = mapped, + traktSearchError = results.exceptionOrNull()?.message + ?: if (mapped.isEmpty()) "No Trakt lists found" else null, + ) + } + } + + private fun loadTraktFeaturedLists() { + scope.launch { + val trending = runCatching { TraktPublicListSourceResolver.trendingPublicLists() } + val popular = runCatching { TraktPublicListSourceResolver.popularPublicLists() } + _uiState.value = _uiState.value.copy( + traktTrendingResults = trending.getOrDefault(_uiState.value.traktTrendingResults), + traktPopularResults = popular.getOrDefault(_uiState.value.traktPopularResults), + traktSearchError = _uiState.value.traktSearchError + ?: trending.exceptionOrNull()?.message + ?: popular.exceptionOrNull()?.message, + ) + } + } + fun showGenrePicker(index: Int) { val folder = _uiState.value.editingFolder ?: return val sources = folder.resolvedSources - if (index !in sources.indices || sources[index].isTmdb) return + if (index !in sources.indices || sources[index].addonCatalogSource() == null) return _uiState.value = _uiState.value.copy( genrePickerSourceIndex = index, showCatalogPicker = false, showTmdbSourcePicker = false, + showTraktSourcePicker = false, ) } @@ -322,6 +469,8 @@ object CollectionEditorRepository { showFolderEditor = false, showCatalogPicker = false, showTmdbSourcePicker = false, + showTraktSourcePicker = false, + editingTraktSourceIndex = null, genrePickerSourceIndex = null, ) } @@ -332,6 +481,8 @@ object CollectionEditorRepository { showFolderEditor = false, showCatalogPicker = false, showTmdbSourcePicker = false, + showTraktSourcePicker = false, + editingTraktSourceIndex = null, genrePickerSourceIndex = null, ) } @@ -546,6 +697,103 @@ object CollectionEditorRepository { ) } + fun addTraktSourceFromInput() { + val state = _uiState.value + val input = state.traktInput.trim() + if (input.isBlank()) { + _uiState.value = state.copy(traktSearchError = "Enter a Trakt list ID or URL") + return + } + + scope.launch { + val metadata = runCatching { TraktPublicListSourceResolver.listImportMetadata(input) } + val resolved = metadata.getOrNull() + val listId = resolved?.traktListId + if (metadata.isFailure || listId == null) { + _uiState.value = _uiState.value.copy( + traktSearchError = metadata.exceptionOrNull()?.message ?: "Could not load Trakt list", + ) + return@launch + } + + val title = state.traktTitleInput.ifBlank { resolved.title ?: "Trakt List $listId" } + addTraktSourcesToFolder( + sources = selectedTraktMediaTypes(state).map { mediaType -> + CollectionSource( + provider = "trakt", + title = titleForMedia(title, mediaType, state.traktMediaBoth), + traktListId = listId, + mediaType = mediaType.name, + sortBy = TraktListSort.normalize(state.traktSortBy), + sortHow = TraktSortHow.normalize(state.traktSortHow), + ) + }, + coverImageUrl = resolved.coverImageUrl, + ) + } + } + + fun addTraktSourceFromResult(result: TraktPublicListSearchResult) { + val state = _uiState.value + val title = state.traktTitleInput.ifBlank { result.title } + addTraktSourcesToFolder( + sources = selectedTraktMediaTypes(state).map { mediaType -> + CollectionSource( + provider = "trakt", + title = titleForMedia(title, mediaType, state.traktMediaBoth), + traktListId = result.traktListId, + mediaType = mediaType.name, + sortBy = TraktListSort.normalize(state.traktSortBy), + sortHow = TraktSortHow.normalize(state.traktSortHow), + ) + }, + coverImageUrl = result.coverImageUrl, + ) + } + + private fun addTraktSourcesToFolder(sources: List, coverImageUrl: String? = null) { + val state = _uiState.value + val folder = state.editingFolder ?: return + val editingIndex = state.editingTraktSourceIndex + val existingKeys = folder.resolvedSources + .mapIndexedNotNull { index, source -> + collectionSourceKey(source).takeUnless { index == editingIndex } + } + .toMutableSet() + val newSources = sources.filter { existingKeys.add(collectionSourceKey(it)) } + if (newSources.isEmpty()) return + + val updatedSources = if ( + editingIndex != null && + editingIndex in folder.resolvedSources.indices && + folder.resolvedSources[editingIndex].isTrakt + ) { + folder.resolvedSources.toMutableList().also { + it.removeAt(editingIndex) + it.addAll(editingIndex, newSources) + } + } else { + folder.resolvedSources + newSources + } + val shouldApplyCover = !coverImageUrl.isNullOrBlank() && folder.coverImageUrl.isNullOrBlank() + val updatedFolder = if (shouldApplyCover) { + folder.withSources(updatedSources) + .copy(coverImageUrl = coverImageUrl, coverEmoji = null) + } else { + folder.withSources(updatedSources) + } + + _uiState.value = state.copy( + editingFolder = updatedFolder, + showTraktSourcePicker = false, + editingTraktSourceIndex = null, + traktInput = "", + traktTitleInput = "", + traktSearchResults = emptyList(), + traktSearchError = null, + ) + } + fun save(): Boolean { val state = _uiState.value if (state.title.isBlank()) return false @@ -593,10 +841,18 @@ private fun CollectionFolder.withSources(nextSources: List): C ) private fun collectionSourceKey(source: CollectionSource): String = - if (source.isTmdb) { - "tmdb_${source.tmdbSourceType}_${source.tmdbId}_${source.mediaType}_${source.sortBy}_${source.filters.hashCode()}" - } else { - "addon_${source.addonId}_${source.type}_${source.catalogId}_${source.genre.orEmpty()}" + when { + source.isTmdb -> { + "tmdb_${source.tmdbSourceType}_${source.tmdbId}_${source.mediaType}_${source.sortBy}_${source.filters.hashCode()}" + } + + source.isTrakt -> { + "trakt_${source.traktListId}_${source.mediaType}_${TraktListSort.normalize(source.sortBy)}_${TraktSortHow.normalize(source.sortHow)}" + } + + else -> { + "addon_${source.addonId}_${source.type}_${source.catalogId}_${source.genre.orEmpty()}" + } } private fun selectedMediaTypes( @@ -630,7 +886,22 @@ private fun titleForMedia( return "$title $suffix" } +private fun selectedTraktMediaTypes(state: CollectionEditorUiState): List = + if (state.traktMediaBoth) { + listOf(TmdbCollectionMediaType.MOVIE, TmdbCollectionMediaType.TV) + } else { + listOf(state.traktMediaType) + } + private fun CollectionSource.tmdbType(): TmdbCollectionSourceType = tmdbSourceType ?.let { raw -> runCatching { TmdbCollectionSourceType.valueOf(raw.uppercase()) }.getOrNull() } ?: TmdbCollectionSourceType.DISCOVER + +private fun String.isTraktListIdentifierInput(): Boolean { + val trimmed = trim() + if (trimmed.isBlank()) return false + if (trimmed.toLongOrNull() != null) return true + if (trimmed.contains("trakt.tv/", ignoreCase = true)) return true + return Regex("""[?&]id=([^&#/]+)""").containsMatchIn(trimmed) +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt index a47e36ab..1114ac1b 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionEditorScreen.kt @@ -21,6 +21,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.RoundedCornerShape @@ -32,7 +33,6 @@ import androidx.compose.material.icons.rounded.Delete import androidx.compose.material.icons.rounded.Edit import androidx.compose.material.icons.rounded.Menu import androidx.compose.material.icons.rounded.Search -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FilterChip import androidx.compose.material3.HorizontalDivider @@ -68,6 +68,7 @@ import com.nuvio.app.core.ui.NuvioSurfaceCard import com.nuvio.app.core.ui.nuvioSafeBottomPadding import com.nuvio.app.core.ui.PlatformBackHandler import com.nuvio.app.features.home.PosterShape +import com.nuvio.app.features.trakt.TraktPublicListSearchResult import nuvio.composeapp.generated.resources.* import org.jetbrains.compose.resources.stringResource import sh.calvin.reorderable.ReorderableCollectionItemScope @@ -107,6 +108,14 @@ fun CollectionEditorScreen( return } + if (state.showTraktSourcePicker) { + TraktSourcePickerScreen( + state = state, + onBack = { CollectionEditorRepository.hideTraktSourcePicker() }, + ) + return + } + val genrePickerIndex = state.genrePickerSourceIndex val genrePickerSource = genrePickerIndex?.let { editingFolder.resolvedSources.getOrNull(it) } val genrePickerCatalogSource = genrePickerSource?.addonCatalogSource() @@ -158,6 +167,14 @@ fun CollectionEditorScreen( return } + if (state.showTraktSourcePicker) { + TraktSourcePickerScreen( + state = state, + onBack = { CollectionEditorRepository.hideTraktSourcePicker() }, + ) + return + } + Box(modifier = Modifier.fillMaxSize()) { NuvioScreen( modifier = Modifier.fillMaxSize(), @@ -704,7 +721,10 @@ private fun FolderEditorPage( FolderEditorSection( title = stringResource(Res.string.collections_editor_section_catalog_sources), actions = { - Row(horizontalArrangement = Arrangement.spacedBy(4.dp)) { + FlowRow( + horizontalArrangement = Arrangement.spacedBy(4.dp), + verticalArrangement = Arrangement.spacedBy(4.dp), + ) { TextButton(onClick = { CollectionEditorRepository.showTmdbSourcePicker() }) { Icon( imageVector = Icons.Rounded.Add, @@ -714,6 +734,15 @@ private fun FolderEditorPage( Spacer(modifier = Modifier.width(4.dp)) Text(stringResource(Res.string.source_tmdb)) } + TextButton(onClick = { CollectionEditorRepository.showTraktSourcePicker() }) { + Icon( + imageVector = Icons.Rounded.Add, + contentDescription = null, + modifier = Modifier.size(18.dp), + ) + Spacer(modifier = Modifier.width(4.dp)) + Text(stringResource(Res.string.collections_editor_add_trakt_source)) + } TextButton(onClick = { CollectionEditorRepository.showCatalogPicker() }) { Icon( imageVector = Icons.Rounded.Add, @@ -752,6 +781,12 @@ private fun FolderEditorPage( source = source, onRemove = { CollectionEditorRepository.removeCatalogSource(index) }, ) + } else if (source.isTrakt) { + FolderTraktSourceCard( + source = source, + onEdit = { CollectionEditorRepository.editTraktSource(index) }, + onRemove = { CollectionEditorRepository.removeCatalogSource(index) }, + ) } else if (addonSource != null) { FolderCatalogSourceCard( source = addonSource, @@ -1393,6 +1428,208 @@ private fun TmdbSourcePickerScreen( } } +@OptIn(ExperimentalLayoutApi::class) +@Composable +private fun TraktSourcePickerScreen( + state: CollectionEditorUiState, + onBack: () -> Unit, +) { + val bottomInset = nuvioSafeBottomPadding() + val searchResultsTitle = stringResource(Res.string.collections_editor_trakt_search_results) + val trendingTitle = stringResource(Res.string.collections_editor_trakt_trending) + val popularTitle = stringResource(Res.string.collections_editor_trakt_popular) + + PlatformBackHandler(enabled = true) { + onBack() + } + + Box(modifier = Modifier.fillMaxSize()) { + NuvioScreen(modifier = Modifier.fillMaxSize()) { + stickyHeader { + NuvioScreenHeader( + title = if (state.editingTraktSourceIndex != null) { + stringResource(Res.string.collections_editor_edit_trakt_source) + } else { + stringResource(Res.string.collections_editor_trakt_sources) + }, + onBack = onBack, + ) + } + + item { + NuvioSurfaceCard { + Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { + TmdbLabeledField( + label = stringResource(Res.string.collections_editor_trakt_list), + value = state.traktInput, + onValueChange = { CollectionEditorRepository.setTraktInput(it) }, + placeholder = stringResource(Res.string.collections_editor_trakt_input_placeholder), + helper = stringResource(Res.string.collections_editor_trakt_input_helper), + ) + TmdbLabeledField( + label = stringResource(Res.string.collections_editor_tmdb_display_title), + value = state.traktTitleInput, + onValueChange = { CollectionEditorRepository.setTraktTitleInput(it) }, + placeholder = stringResource(Res.string.collections_editor_trakt_title_placeholder), + helper = stringResource(Res.string.collections_editor_tmdb_title_helper), + ) + if (state.traktSearchError != null) { + Text( + text = state.traktSearchError, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.error, + ) + } + } + } + } + + item { + PickerPanel(title = stringResource(Res.string.collections_editor_tmdb_type)) { + FlowRow( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + FilterChip( + selected = state.traktMediaType == TmdbCollectionMediaType.MOVIE && !state.traktMediaBoth, + onClick = { + CollectionEditorRepository.setTraktMediaBoth(false) + CollectionEditorRepository.setTraktMediaType(TmdbCollectionMediaType.MOVIE) + }, + label = { Text(stringResource(Res.string.collections_editor_tmdb_movies)) }, + ) + FilterChip( + selected = state.traktMediaType == TmdbCollectionMediaType.TV && !state.traktMediaBoth, + onClick = { + CollectionEditorRepository.setTraktMediaBoth(false) + CollectionEditorRepository.setTraktMediaType(TmdbCollectionMediaType.TV) + }, + label = { Text(stringResource(Res.string.collections_editor_tmdb_series)) }, + ) + FilterChip( + selected = state.traktMediaBoth, + onClick = { CollectionEditorRepository.setTraktMediaBoth(true) }, + label = { Text(stringResource(Res.string.collections_editor_tmdb_both)) }, + ) + } + } + } + + item { + PickerPanel(title = stringResource(Res.string.collections_editor_tmdb_sort)) { + FlowRow( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + traktSortOptions().forEach { (value, label) -> + FilterChip( + selected = state.traktSortBy == value, + onClick = { CollectionEditorRepository.setTraktSortBy(value) }, + label = { Text(label) }, + ) + } + } + + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + Text( + text = stringResource(Res.string.collections_editor_trakt_direction), + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + FlowRow( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + FilterChip( + selected = state.traktSortHow == TraktSortHow.ASC.value, + onClick = { CollectionEditorRepository.setTraktSortHow(TraktSortHow.ASC.value) }, + label = { Text(stringResource(Res.string.collections_editor_trakt_ascending)) }, + ) + FilterChip( + selected = state.traktSortHow == TraktSortHow.DESC.value, + onClick = { CollectionEditorRepository.setTraktSortHow(TraktSortHow.DESC.value) }, + label = { Text(stringResource(Res.string.collections_editor_trakt_descending)) }, + ) + } + } + } + } + + TraktResultSection( + title = searchResultsTitle, + results = state.traktSearchResults, + ) + TraktResultSection( + title = trendingTitle, + results = state.traktTrendingResults, + ) + TraktResultSection( + title = popularTitle, + results = state.traktPopularResults, + ) + + item { + Spacer(modifier = Modifier.height(96.dp + bottomInset)) + } + } + + Surface( + modifier = Modifier + .align(Alignment.BottomCenter) + .fillMaxWidth(), + color = MaterialTheme.colorScheme.background.copy(alpha = 0.96f), + tonalElevation = 6.dp, + shadowElevation = 10.dp, + ) { + PickerActionBar( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 12.dp) + .padding(bottom = bottomInset), + ) { + TextButton(onClick = { CollectionEditorRepository.searchTraktLists() }) { + Icon( + imageVector = Icons.Rounded.Search, + contentDescription = null, + modifier = Modifier.size(18.dp), + ) + Spacer(modifier = Modifier.width(4.dp)) + Text(stringResource(Res.string.collections_editor_tmdb_search)) + } + NuvioPrimaryButton( + text = if (state.editingTraktSourceIndex != null) { + stringResource(Res.string.collections_editor_save) + } else { + stringResource(Res.string.collections_editor_add_source) + }, + modifier = Modifier.weight(1f), + enabled = state.traktInput.isNotBlank(), + onClick = { CollectionEditorRepository.addTraktSourceFromInput() }, + ) + } + } + } +} + +private fun LazyListScope.TraktResultSection( + title: String, + results: List, +) { + if (results.isEmpty()) return + item { + PickerSectionLabel(title) + } + itemsIndexed(results) { _, result -> + PickerOptionRow( + title = result.title, + subtitle = result.subtitle, + selected = false, + onClick = { CollectionEditorRepository.addTraktSourceFromResult(result) }, + ) + } +} + @Composable private fun PickerPanel( title: String, @@ -1790,6 +2027,63 @@ private fun FolderTmdbSourceCard( } } +@Composable +private fun FolderTraktSourceCard( + source: CollectionSource, + onEdit: () -> Unit, + onRemove: () -> Unit, +) { + NuvioSurfaceCard { + Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { + Row(verticalAlignment = Alignment.CenterVertically) { + Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) { + Text( + text = source.title?.takeIf { it.isNotBlank() } ?: stringResource(Res.string.source_trakt), + style = MaterialTheme.typography.bodyLarge, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colorScheme.onSurface, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + Text( + text = stringResource(Res.string.source_trakt), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + IconButton( + onClick = onEdit, + modifier = Modifier.size(36.dp), + ) { + Icon( + imageVector = Icons.Rounded.Edit, + contentDescription = stringResource(Res.string.action_edit), + modifier = Modifier.size(20.dp), + tint = MaterialTheme.colorScheme.primary, + ) + } + IconButton( + onClick = onRemove, + modifier = Modifier.size(36.dp), + ) { + Icon( + imageVector = Icons.Rounded.Close, + contentDescription = stringResource(Res.string.action_remove), + modifier = Modifier.size(20.dp), + tint = MaterialTheme.colorScheme.error, + ) + } + } + + Text( + text = traktSourceSubtitle(source), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } +} + @OptIn(ExperimentalLayoutApi::class) @Composable private fun FolderCatalogSourceCard( @@ -1965,6 +2259,53 @@ private fun tmdbSortLabel(sort: TmdbCollectionSort): String = TmdbCollectionSort.FIRST_AIR_DATE_DESC -> stringResource(Res.string.collections_editor_tmdb_sort_recent) } +@Composable +private fun traktSortOptions(): List> = + listOf( + TraktListSort.RANK.value to stringResource(Res.string.collections_editor_trakt_sort_list_order), + TraktListSort.ADDED.value to stringResource(Res.string.collections_editor_trakt_sort_recently_added), + TraktListSort.TITLE.value to stringResource(Res.string.collections_editor_trakt_sort_title), + TraktListSort.RELEASED.value to stringResource(Res.string.collections_editor_trakt_sort_released), + TraktListSort.RUNTIME.value to stringResource(Res.string.collections_editor_trakt_sort_runtime), + TraktListSort.POPULARITY.value to stringResource(Res.string.collections_editor_trakt_sort_popular), + TraktListSort.PERCENTAGE.value to stringResource(Res.string.collections_editor_trakt_sort_percentage), + TraktListSort.VOTES.value to stringResource(Res.string.collections_editor_trakt_sort_votes), + ) + +@Composable +private fun traktSortLabel(value: String?): String = + when (TraktListSort.normalize(value)) { + TraktListSort.ADDED.value -> stringResource(Res.string.collections_editor_trakt_sort_recently_added) + TraktListSort.TITLE.value -> stringResource(Res.string.collections_editor_trakt_sort_title) + TraktListSort.RELEASED.value -> stringResource(Res.string.collections_editor_trakt_sort_released) + TraktListSort.RUNTIME.value -> stringResource(Res.string.collections_editor_trakt_sort_runtime) + TraktListSort.POPULARITY.value -> stringResource(Res.string.collections_editor_trakt_sort_popular) + TraktListSort.PERCENTAGE.value -> stringResource(Res.string.collections_editor_trakt_sort_percentage) + TraktListSort.VOTES.value -> stringResource(Res.string.collections_editor_trakt_sort_votes) + else -> stringResource(Res.string.collections_editor_trakt_sort_list_order) + } + +@Composable +private fun traktDirectionLabel(value: String?): String = + when (TraktSortHow.normalize(value)) { + TraktSortHow.DESC.value -> stringResource(Res.string.collections_editor_trakt_descending) + else -> stringResource(Res.string.collections_editor_trakt_ascending) + } + +@Composable +private fun traktSourceSubtitle(source: CollectionSource): String { + val media = when (TmdbCollectionMediaType.fromString(source.mediaType)) { + TmdbCollectionMediaType.MOVIE -> stringResource(Res.string.collections_editor_tmdb_movies) + TmdbCollectionMediaType.TV -> stringResource(Res.string.collections_editor_tmdb_series) + } + return listOf( + media, + traktSortLabel(source.sortBy), + traktDirectionLabel(source.sortHow), + "ID ${source.traktListId ?: ""}".trim(), + ).joinToString(" • ") +} + @Composable private fun tmdbSourceSubtitle(source: CollectionSource): String { val media = when (TmdbCollectionMediaType.fromString(source.mediaType)) { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionJsonPreserver.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionJsonPreserver.kt index 660e8a45..fa04e5f8 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionJsonPreserver.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionJsonPreserver.kt @@ -144,17 +144,27 @@ internal object CollectionJsonPreserver { private fun unifiedSourceKey(element: JsonElement): String? { val obj = element as? JsonObject ?: return null val provider = obj["provider"]?.jsonPrimitive?.contentOrNull ?: "addon" - return if (provider.equals("tmdb", ignoreCase = true)) { - val sourceType = obj["tmdbSourceType"]?.jsonPrimitive?.contentOrNull ?: return null - val tmdbId = obj["tmdbId"]?.jsonPrimitive?.contentOrNull.orEmpty() - val mediaType = obj["mediaType"]?.jsonPrimitive?.contentOrNull.orEmpty() - val sortBy = obj["sortBy"]?.jsonPrimitive?.contentOrNull.orEmpty() - "$provider|$sourceType|$tmdbId|$mediaType|$sortBy" - } else { - val addonId = obj["addonId"]?.jsonPrimitive?.contentOrNull ?: return null - val type = obj["type"]?.jsonPrimitive?.contentOrNull ?: return null - val catalogId = obj["catalogId"]?.jsonPrimitive?.contentOrNull ?: return null - "$provider|$addonId|$type|$catalogId" + return when { + provider.equals("tmdb", ignoreCase = true) -> { + val sourceType = obj["tmdbSourceType"]?.jsonPrimitive?.contentOrNull ?: return null + val tmdbId = obj["tmdbId"]?.jsonPrimitive?.contentOrNull.orEmpty() + val mediaType = obj["mediaType"]?.jsonPrimitive?.contentOrNull.orEmpty() + val sortBy = obj["sortBy"]?.jsonPrimitive?.contentOrNull.orEmpty() + "$provider|$sourceType|$tmdbId|$mediaType|$sortBy" + } + provider.equals("trakt", ignoreCase = true) -> { + val listId = obj["traktListId"]?.jsonPrimitive?.contentOrNull ?: return null + val mediaType = obj["mediaType"]?.jsonPrimitive?.contentOrNull.orEmpty() + val sortBy = obj["sortBy"]?.jsonPrimitive?.contentOrNull.orEmpty() + val sortHow = obj["sortHow"]?.jsonPrimitive?.contentOrNull.orEmpty() + "$provider|$listId|$mediaType|$sortBy|$sortHow" + } + else -> { + val addonId = obj["addonId"]?.jsonPrimitive?.contentOrNull ?: return null + val type = obj["type"]?.jsonPrimitive?.contentOrNull ?: return null + val catalogId = obj["catalogId"]?.jsonPrimitive?.contentOrNull ?: return null + "$provider|$addonId|$type|$catalogId" + } } } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt index f0780ad2..3a6a6013 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionModels.kt @@ -41,15 +41,20 @@ data class CollectionSource( val tmdbSourceType: String? = null, val title: String? = null, val tmdbId: Int? = null, + val traktListId: Long? = null, val mediaType: String? = null, val sortBy: String? = null, + val sortHow: String? = null, val filters: TmdbCollectionFilters? = null, ) { val isTmdb: Boolean get() = provider.equals("tmdb", ignoreCase = true) + val isTrakt: Boolean + get() = provider.equals("trakt", ignoreCase = true) + fun addonCatalogSource(): CollectionCatalogSource? { - if (isTmdb) return null + if (isTmdb || isTrakt) return null val sourceAddonId = addonId?.takeIf { it.isNotBlank() } ?: return null val sourceType = type?.takeIf { it.isNotBlank() } ?: return null val sourceCatalogId = catalogId?.takeIf { it.isNotBlank() } ?: return null @@ -62,6 +67,9 @@ data class CollectionSource( } } +internal fun CollectionSource.hasInvalidTraktListId(): Boolean = + isTrakt && (traktListId == null || traktListId <= 0L) + @Serializable enum class TmdbCollectionSourceType { LIST, @@ -95,6 +103,36 @@ enum class TmdbCollectionSort(val value: String) { FIRST_AIR_DATE_DESC("first_air_date.desc"), } +enum class TraktListSort(val value: String) { + RANK("rank"), + ADDED("added"), + TITLE("title"), + RELEASED("released"), + RUNTIME("runtime"), + POPULARITY("popularity"), + PERCENTAGE("percentage"), + VOTES("votes"); + + companion object { + fun normalize(value: String?): String { + val raw = value?.trim()?.lowercase().orEmpty() + return entries.firstOrNull { it.value == raw }?.value ?: RANK.value + } + } +} + +enum class TraktSortHow(val value: String) { + ASC("asc"), + DESC("desc"); + + companion object { + fun normalize(value: String?): String { + val raw = value?.trim()?.lowercase().orEmpty() + return entries.firstOrNull { it.value == raw }?.value ?: ASC.value + } + } +} + @Immutable @Serializable data class TmdbCollectionFilters( diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt index 0e9553ae..39916184 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/CollectionRepository.kt @@ -23,6 +23,7 @@ import nuvio.composeapp.generated.resources.collections_import_error_folder_blan import nuvio.composeapp.generated.resources.collections_import_error_folder_blank_title import nuvio.composeapp.generated.resources.collections_import_error_invalid_json import nuvio.composeapp.generated.resources.collections_import_error_source_blank_fields +import nuvio.composeapp.generated.resources.collections_import_error_trakt_list_id import org.jetbrains.compose.resources.getString import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @@ -185,7 +186,20 @@ object CollectionRepository { ) } f.resolvedSources.forEachIndexed { si, s -> - val invalidAddon = !s.isTmdb && + if (s.hasInvalidTraktListId()) { + return ValidationResult( + valid = false, + error = runBlocking { + getString( + Res.string.collections_import_error_trakt_list_id, + si + 1, + f.title, + ) + }, + ) + } + + val invalidAddon = !s.isTmdb && !s.isTrakt && (s.addonId.isNullOrBlank() || s.type.isNullOrBlank() || s.catalogId.isNullOrBlank()) val invalidTmdb = s.isTmdb && s.tmdbSourceType.isNullOrBlank() diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt index 36698b25..65c0101e 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/collection/FolderDetailRepository.kt @@ -10,6 +10,7 @@ import com.nuvio.app.core.i18n.localizedMediaTypeLabel import com.nuvio.app.features.home.HomeCatalogSection import com.nuvio.app.features.home.MetaPreview import com.nuvio.app.features.home.stableKey +import com.nuvio.app.features.trakt.TraktPublicListSourceResolver import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -148,6 +149,25 @@ object FolderDetailRepository { isLoading = true, ), ) + } else if (source.isTrakt) { + val mediaType = TmdbCollectionMediaType.fromString(source.mediaType) + val type = if (mediaType == TmdbCollectionMediaType.TV) "series" else "movie" + val typeLabel = if (mediaType == TmdbCollectionMediaType.TV) { + "Trakt Series List" + } else { + "Trakt Movie List" + } + add( + FolderTab( + label = source.title?.takeIf { it.isNotBlank() } ?: "Trakt", + typeLabel = typeLabel, + source = source, + type = type, + catalogId = traktCatalogId(source), + supportsPagination = true, + isLoading = true, + ), + ) } else { val catalogSource = source.addonCatalogSource() ?: return@forEach val resolvedCatalog = addons.findCollectionCatalog(catalogSource) @@ -188,7 +208,7 @@ object FolderDetailRepository { val tabIndex = if (showAll) sourceIndex + 1 else sourceIndex val catalogSource = source.addonCatalogSource() val resolvedCatalog = catalogSource?.let { addons.findCollectionCatalog(it) } - if (!source.isTmdb && resolvedCatalog == null) { + if (!source.isTmdb && !source.isTrakt && resolvedCatalog == null) { updateTab(tabIndex) { it.copy( isLoading = false, @@ -254,7 +274,12 @@ object FolderDetailRepository { private fun loadTabPage(index: Int, reset: Boolean) { val currentTab = _uiState.value.tabs.getOrNull(index) ?: return val requestedSkip = if (reset) 0 else currentTab.nextSkip ?: return - if (!currentTab.source?.isTmdb.orFalse() && currentTab.manifestUrl == null) return + val currentSource = currentTab.source + if ( + currentSource?.isTmdb != true && + currentSource?.isTrakt != true && + currentTab.manifestUrl == null + ) return updateTab(index) { tab -> if (reset) { @@ -277,13 +302,18 @@ object FolderDetailRepository { val job = scope.launch { runCatching { val source = currentTab.source - if (source?.isTmdb == true) { - TmdbCollectionSourceResolver.resolve( + when { + source?.isTmdb == true -> TmdbCollectionSourceResolver.resolve( source = source, page = if (reset) 1 else requestedSkip, ) - } else { - fetchCatalogPage( + + source?.isTrakt == true -> TraktPublicListSourceResolver.resolve( + source = source, + page = if (reset) 1 else requestedSkip, + ) + + else -> fetchCatalogPage( manifestUrl = requireNotNull(currentTab.manifestUrl), type = currentTab.type, catalogId = currentTab.catalogId, @@ -399,3 +429,13 @@ private fun tmdbCatalogId(source: CollectionSource): String = append("_") append(source.mediaType?.lowercase().orEmpty()) } + +private fun traktCatalogId(source: CollectionSource): String = + listOf( + "trakt", + "list", + source.traktListId?.toString().orEmpty(), + source.mediaType?.lowercase().orEmpty(), + TraktListSort.normalize(source.sortBy), + TraktSortHow.normalize(source.sortHow), + ).joinToString("_") diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktIdUtils.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktIdUtils.kt index b036b984..d7b005d2 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktIdUtils.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktIdUtils.kt @@ -7,6 +7,7 @@ internal data class TraktExternalIds( val trakt: Int? = null, val imdb: String? = null, val tmdb: Int? = null, + val slug: String? = null, ) internal fun parseTraktContentIds(contentId: String?): TraktExternalIds { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktPublicListSourceResolver.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktPublicListSourceResolver.kt new file mode 100644 index 00000000..f9d2dafa --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktPublicListSourceResolver.kt @@ -0,0 +1,430 @@ +package com.nuvio.app.features.trakt + +import co.touchlab.kermit.Logger +import com.nuvio.app.features.addons.RawHttpResponse +import com.nuvio.app.features.addons.httpRequestRaw +import com.nuvio.app.features.catalog.CatalogPage +import com.nuvio.app.features.collection.CollectionSource +import com.nuvio.app.features.collection.TmdbCollectionMediaType +import com.nuvio.app.features.collection.TraktListSort +import com.nuvio.app.features.collection.TraktSortHow +import com.nuvio.app.features.home.MetaPreview +import com.nuvio.app.features.home.PosterShape +import io.ktor.http.encodeURLParameter +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import kotlin.math.roundToInt + +data class TraktPublicListImportMetadata( + val title: String? = null, + val coverImageUrl: String? = null, + val traktListId: Long? = null, +) + +data class TraktPublicListSearchResult( + val traktListId: Long, + val title: String, + val subtitle: String, + val coverImageUrl: String? = null, + val sortBy: String? = null, + val sortHow: String? = null, +) + +object TraktPublicListSourceResolver { + const val PAGE_LIMIT = 50 + + private const val BASE_URL = "https://api.trakt.tv" + private const val API_VERSION = "2" + + private val log = Logger.withTag("TraktPublicListSource") + private val json = Json { ignoreUnknownKeys = true } + + suspend fun resolve(source: CollectionSource, page: Int = 1): CatalogPage = withContext(Dispatchers.Default) { + val listId = source.traktListId?.takeIf { it > 0L } ?: error("Missing Trakt list ID") + val mediaType = TmdbCollectionMediaType.fromString(source.mediaType) + val type = mediaType.toTraktType() + val sortBy = TraktListSort.normalize(source.sortBy) + val sortHow = TraktSortHow.normalize(source.sortHow) + val response = requestRaw( + endpoint = "lists/$listId/items/$type", + query = mapOf( + "extended" to "full,images", + "page" to page.toString(), + "limit" to PAGE_LIMIT.toString(), + "sort_by" to sortBy, + "sort_how" to sortHow, + ), + ) + if (response.status !in 200..299) { + error(errorMessageFor(response.status, "Could not load Trakt list")) + } + + val rawItems = json.decodeFromString>(response.body) + val items = rawItems + .mapNotNull { it.toPreview(mediaType) } + .distinctBy { "${it.type}:${it.id}" } + val pageCount = response.headerInt("x-pagination-page-count") ?: page + CatalogPage( + items = items, + rawItemCount = items.size, + nextSkip = if (page < pageCount && items.isNotEmpty()) page + 1 else null, + ) + } + + suspend fun listImportMetadata(input: String): TraktPublicListImportMetadata = withContext(Dispatchers.Default) { + val idPath = parseTraktListPath(input) ?: error("Enter a valid Trakt list ID or URL") + val list = requestJson( + endpoint = "lists/$idPath", + query = mapOf("extended" to "full,images"), + ) + val id = list.ids?.trakt ?: idPath.toLongOrNull() ?: error("Trakt list did not include a numeric ID") + TraktPublicListImportMetadata( + title = list.name?.takeIf { it.isNotBlank() }, + coverImageUrl = list.images?.posters.firstTraktImageUrl(), + traktListId = id, + ) + } + + suspend fun searchPublicLists(query: String): List = withContext(Dispatchers.Default) { + val trimmed = query.trim() + if (trimmed.isBlank()) return@withContext emptyList() + requestJson>( + endpoint = "search/list", + query = mapOf( + "query" to trimmed, + "extended" to "full,images", + "page" to "1", + "limit" to "20", + ), + ).mapNotNull { it.toPublicListResult() } + } + + suspend fun trendingPublicLists(): List = + loadProminentLists("lists/trending") + + suspend fun popularPublicLists(): List = + loadProminentLists("lists/popular") + + fun parseTraktListId(input: String): Long? = + parseTraktListPath(input)?.toLongOrNull() + + private suspend fun loadProminentLists(endpoint: String): List = + withContext(Dispatchers.Default) { + requestJson>( + endpoint = endpoint, + query = mapOf( + "extended" to "full,images", + "page" to "1", + "limit" to "20", + ), + ).mapNotNull { item -> + item.list?.toPublicListResult(likeCount = item.likeCount) + } + } + + private suspend inline fun requestJson( + endpoint: String, + query: Map = emptyMap(), + ): T { + val response = requestRaw(endpoint = endpoint, query = query) + if (response.status !in 200..299) { + error(errorMessageFor(response.status, "Trakt request failed")) + } + return runCatching { json.decodeFromString(response.body) } + .onFailure { error -> log.w(error) { "Failed to parse Trakt response for $endpoint" } } + .getOrThrow() + } + + private suspend fun requestRaw( + endpoint: String, + query: Map = emptyMap(), + ): RawHttpResponse { + if (TraktConfig.CLIENT_ID.isBlank()) { + error("Missing Trakt credentials in local.properties (TRAKT_CLIENT_ID).") + } + val url = buildTraktUrl(endpoint, query) + return httpRequestRaw( + method = "GET", + url = url, + headers = mapOf( + "Accept" to "application/json", + "trakt-api-version" to API_VERSION, + "trakt-api-key" to TraktConfig.CLIENT_ID, + ), + body = "", + ) + } + + private fun buildTraktUrl(endpoint: String, query: Map): String { + val trimmedEndpoint = endpoint.trim().trim('/') + val queryString = query.entries + .filter { (_, value) -> value.isNotBlank() } + .joinToString("&") { (key, value) -> + "${key.encodeURLParameter()}=${value.encodeURLParameter()}" + } + return if (queryString.isBlank()) { + "$BASE_URL/$trimmedEndpoint" + } else { + "$BASE_URL/$trimmedEndpoint?$queryString" + } + } + + private fun PublicTraktListItemDto.toPreview(mediaType: TmdbCollectionMediaType): MetaPreview? { + return when (mediaType) { + TmdbCollectionMediaType.MOVIE -> movie?.toPreview() + TmdbCollectionMediaType.TV -> show?.toPreview() + } + } + + private fun PublicTraktMovieDto.toPreview(): MetaPreview? { + val title = title?.takeIf { it.isNotBlank() } ?: return null + val fallback = when { + ids?.trakt != null -> "trakt:${ids.trakt}" + !ids?.slug.isNullOrBlank() -> "movie:${ids.slug}" + else -> null + } + val contentId = normalizeTraktContentId(ids, fallback) + if (contentId.isBlank()) return null + return MetaPreview( + id = contentId, + type = "movie", + name = title, + poster = images.traktBestPosterUrl(), + banner = images.traktBestBackdropUrl(), + logo = images.traktBestLogoUrl(), + posterShape = PosterShape.Poster, + description = overview?.takeIf { it.isNotBlank() }, + releaseInfo = year?.toString() ?: released?.take(4), + rawReleaseDate = released, + imdbRating = rating?.formatRating(), + genres = genres.orEmpty(), + ) + } + + private fun PublicTraktShowDto.toPreview(): MetaPreview? { + val title = title?.takeIf { it.isNotBlank() } ?: return null + val fallback = when { + ids?.trakt != null -> "trakt:${ids.trakt}" + !ids?.slug.isNullOrBlank() -> "series:${ids.slug}" + else -> null + } + val contentId = normalizeTraktContentId(ids, fallback) + if (contentId.isBlank()) return null + return MetaPreview( + id = contentId, + type = "series", + name = title, + poster = images.traktBestPosterUrl(), + banner = images.traktBestBackdropUrl(), + logo = images.traktBestLogoUrl(), + posterShape = PosterShape.Poster, + description = overview?.takeIf { it.isNotBlank() }, + releaseInfo = year?.toString() ?: firstAired?.take(4), + rawReleaseDate = firstAired, + imdbRating = rating?.formatRating(), + genres = genres.orEmpty(), + ) + } + + private fun PublicTraktSearchResultDto.toPublicListResult(): TraktPublicListSearchResult? { + if (!type.equals("list", ignoreCase = true)) return null + return list?.toPublicListResult() + } + + private fun PublicTraktListSummaryDto.toPublicListResult(likeCount: Int? = null): TraktPublicListSearchResult? { + val id = ids?.trakt ?: return null + val listTitle = name?.takeIf { it.isNotBlank() } ?: "Trakt List $id" + val owner = user?.username?.takeIf { it.isNotBlank() } + val stats = buildList { + itemCount?.let { add("$it items") } + (likeCount ?: likes)?.let { add("$it likes") } + } + val subtitle = (listOfNotNull(owner) + stats).joinToString(" • ").ifBlank { "Trakt public list" } + return TraktPublicListSearchResult( + traktListId = id, + title = listTitle, + subtitle = subtitle, + coverImageUrl = images?.posters.firstTraktImageUrl(), + sortBy = sortBy, + sortHow = sortHow, + ) + } + + private fun parseTraktListPath(input: String): String? { + val trimmed = input.trim() + if (trimmed.isBlank()) return null + trimmed.toLongOrNull()?.let { return it.toString() } + Regex("""[?&]id=([^&#/]+)""") + .find(trimmed) + ?.groupValues + ?.getOrNull(1) + ?.takeIf { it.isNotBlank() } + ?.let { return it } + Regex("""trakt\.tv/lists/([^/?#]+)""", RegexOption.IGNORE_CASE) + .find(trimmed) + ?.groupValues + ?.getOrNull(1) + ?.takeIf { it.isNotBlank() } + ?.let { return it } + Regex("""trakt\.tv/users/[^/]+/lists/([^/?#]+)""", RegexOption.IGNORE_CASE) + .find(trimmed) + ?.groupValues + ?.getOrNull(1) + ?.takeIf { it.isNotBlank() } + ?.let { return it } + return trimmed.takeIf { it.matches(Regex("""[A-Za-z0-9_-]+""")) } + } + + private fun TmdbCollectionMediaType.toTraktType(): String = + when (this) { + TmdbCollectionMediaType.MOVIE -> "movie" + TmdbCollectionMediaType.TV -> "show" + } + + private fun RawHttpResponse.headerInt(name: String): Int? = + headers.entries.firstOrNull { (key, _) -> key.equals(name, ignoreCase = true) } + ?.value + ?.substringBefore(',') + ?.trim() + ?.toIntOrNull() + + private fun errorMessageFor(code: Int, fallback: String): String { + return when (code) { + 401, 403, 404 -> "Trakt list not found or not public" + 429 -> "Trakt rate limit reached" + else -> "$fallback ($code)" + } + } +} + +internal fun List?.firstTraktImageUrl(): String? { + return orEmpty() + .firstOrNull { it.isNotBlank() } + ?.toTraktImageUrl() +} + +internal fun String.toTraktImageUrl(): String { + val normalized = trim() + return when { + normalized.startsWith("https://", ignoreCase = true) -> normalized + normalized.startsWith("http://", ignoreCase = true) -> "https://${normalized.substringAfter("://")}" + normalized.startsWith("//") -> "https:$normalized" + traktHostPattern.containsMatchIn(normalized) -> "https://$normalized" + else -> normalized + } +} + +private fun PublicTraktImagesDto?.traktPosterUrl(): String? = this?.poster.firstTraktImageUrl() + +private fun PublicTraktImagesDto?.traktFanartUrl(): String? = this?.fanart.firstTraktImageUrl() + +private fun PublicTraktImagesDto?.traktLogoUrl(): String? = this?.logo.firstTraktImageUrl() + +private fun PublicTraktImagesDto?.traktClearartUrl(): String? = this?.clearart.firstTraktImageUrl() + +private fun PublicTraktImagesDto?.traktBannerUrl(): String? = this?.banner.firstTraktImageUrl() + +private fun PublicTraktImagesDto?.traktThumbUrl(): String? = this?.thumb.firstTraktImageUrl() + +private fun PublicTraktImagesDto?.traktBestPosterUrl(): String? = + traktPosterUrl() ?: traktFanartUrl() + +private fun PublicTraktImagesDto?.traktBestBackdropUrl(): String? = + traktFanartUrl() ?: traktBannerUrl() ?: traktThumbUrl() ?: traktPosterUrl() + +private fun PublicTraktImagesDto?.traktBestLogoUrl(): String? = + traktLogoUrl() ?: traktClearartUrl() + +private fun Double.formatRating(): String = + ((this * 10).roundToInt() / 10.0).toString() + +private val traktHostPattern = Regex("""^[a-z0-9.-]*trakt\.tv/""", RegexOption.IGNORE_CASE) + +@Serializable +private data class PublicTraktSearchResultDto( + val type: String? = null, + val list: PublicTraktListSummaryDto? = null, +) + +@Serializable +private data class PublicTraktProminentListDto( + @SerialName("like_count") val likeCount: Int? = null, + val list: PublicTraktListSummaryDto? = null, +) + +@Serializable +private data class PublicTraktListSummaryDto( + val name: String? = null, + val description: String? = null, + @SerialName("sort_by") val sortBy: String? = null, + @SerialName("sort_how") val sortHow: String? = null, + @SerialName("item_count") val itemCount: Int? = null, + val likes: Int? = null, + val ids: PublicTraktListIdsDto? = null, + val user: PublicTraktUserDto? = null, + val images: PublicTraktListImagesDto? = null, +) + +@Serializable +private data class PublicTraktListImagesDto( + val posters: List? = null, +) + +@Serializable +private data class PublicTraktListIdsDto( + val trakt: Long? = null, + val slug: String? = null, +) + +@Serializable +private data class PublicTraktUserDto( + val username: String? = null, +) + +@Serializable +private data class PublicTraktListItemDto( + val rank: Int? = null, + val id: Long? = null, + @SerialName("listed_at") val listedAt: String? = null, + val type: String? = null, + val movie: PublicTraktMovieDto? = null, + val show: PublicTraktShowDto? = null, +) + +@Serializable +private data class PublicTraktMovieDto( + val title: String? = null, + val year: Int? = null, + val ids: TraktExternalIds? = null, + val overview: String? = null, + val released: String? = null, + val rating: Double? = null, + val genres: List? = null, + val images: PublicTraktImagesDto? = null, +) + +@Serializable +private data class PublicTraktShowDto( + val title: String? = null, + val year: Int? = null, + val ids: TraktExternalIds? = null, + val overview: String? = null, + @SerialName("first_aired") val firstAired: String? = null, + val rating: Double? = null, + val genres: List? = null, + val images: PublicTraktImagesDto? = null, +) + +@Serializable +private data class PublicTraktImagesDto( + val fanart: List? = null, + val poster: List? = null, + val logo: List? = null, + val clearart: List? = null, + val banner: List? = null, + val thumb: List? = null, +) diff --git a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/collection/CollectionSourceSerializationTest.kt b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/collection/CollectionSourceSerializationTest.kt new file mode 100644 index 00000000..66f227dd --- /dev/null +++ b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/collection/CollectionSourceSerializationTest.kt @@ -0,0 +1,181 @@ +package com.nuvio.app.features.collection + +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotNull +import kotlin.test.assertTrue + +class CollectionSourceSerializationTest { + private val json = Json { + ignoreUnknownKeys = true + encodeDefaults = true + prettyPrint = false + } + + @Test + fun traktSourceRoundTripsWithPublicListShape() { + val collection = Collection( + id = "collection-1", + title = "Favorites", + folders = listOf( + CollectionFolder( + id = "folder-1", + title = "Lists", + sources = listOf( + CollectionSource( + provider = "trakt", + title = "Criterion Movies", + traktListId = 123456L, + mediaType = TmdbCollectionMediaType.MOVIE.name, + sortBy = TraktListSort.ADDED.value, + sortHow = TraktSortHow.DESC.value, + ), + ), + ), + ), + ) + + val encoded = json.encodeToString(listOf(collection)) + assertTrue(encoded.contains(""""provider":"trakt"""")) + assertTrue(encoded.contains(""""traktListId":123456""")) + assertTrue(encoded.contains(""""sortHow":"desc"""")) + + val decoded = json.decodeFromString>(encoded) + val source = decoded.single().folders.single().resolvedSources.single() + assertTrue(source.isTrakt) + assertEquals(123456L, source.traktListId) + assertEquals(TmdbCollectionMediaType.MOVIE.name, source.mediaType) + assertEquals(TraktListSort.ADDED.value, source.sortBy) + assertEquals(TraktSortHow.DESC.value, source.sortHow) + } + + @Test + fun importedTraktSourceWithoutListIdIsRejected() { + val payload = """ + [ + { + "id": "collection-1", + "title": "Favorites", + "folders": [ + { + "id": "folder-1", + "title": "Lists", + "sources": [ + { + "provider": "trakt", + "title": "Missing List", + "mediaType": "MOVIE", + "sortBy": "rank", + "sortHow": "asc" + } + ] + } + ] + } + ] + """.trimIndent() + + val source = json.decodeFromString>(payload) + .single() + .folders + .single() + .resolvedSources + .single() + + assertTrue(source.hasInvalidTraktListId()) + } + + @Test + fun legacyAddonCatalogSourcesRemainCompatible() { + val payload = """ + [ + { + "id": "collection-1", + "title": "Favorites", + "folders": [ + { + "id": "folder-1", + "title": "Movies", + "catalogSources": [ + { + "addonId": "addon-1", + "type": "movie", + "catalogId": "top", + "genre": "Action" + } + ] + } + ] + } + ] + """.trimIndent() + + val collection = json.decodeFromString>(payload).single() + val source = collection.folders.single().resolvedSources.single() + val addonSource = source.addonCatalogSource() + + assertNotNull(addonSource) + assertEquals("addon-1", addonSource.addonId) + assertEquals("movie", addonSource.type) + assertEquals("top", addonSource.catalogId) + assertEquals("Action", addonSource.genre) + } + + @Test + fun sourceKeyPreservationKeepsUnknownTraktFields() { + val raw = json.parseToJsonElement( + """ + [ + { + "id": "collection-1", + "title": "Favorites", + "folders": [ + { + "id": "folder-1", + "title": "Lists", + "sources": [ + { + "provider": "trakt", + "title": "Criterion Movies", + "traktListId": 123456, + "mediaType": "MOVIE", + "sortBy": "rank", + "sortHow": "asc", + "customField": "keep-me" + } + ] + } + ] + } + ] + """.trimIndent(), + ) + val collection = Collection( + id = "collection-1", + title = "Favorites", + folders = listOf( + CollectionFolder( + id = "folder-1", + title = "Lists", + sources = listOf( + CollectionSource( + provider = "trakt", + title = "Criterion Movies", + traktListId = 123456L, + mediaType = TmdbCollectionMediaType.MOVIE.name, + sortBy = TraktListSort.RANK.value, + sortHow = TraktSortHow.ASC.value, + ), + ), + ), + ), + ) + + val merged = CollectionJsonPreserver.merge(json, raw, listOf(collection)).toString() + assertTrue(merged.contains(""""customField":"keep-me"""")) + assertTrue(merged.contains(""""traktListId":123456""")) + } +} diff --git a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/trakt/TraktPublicListSourceResolverTest.kt b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/trakt/TraktPublicListSourceResolverTest.kt new file mode 100644 index 00000000..2174b5dc --- /dev/null +++ b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/trakt/TraktPublicListSourceResolverTest.kt @@ -0,0 +1,49 @@ +package com.nuvio.app.features.trakt + +import com.nuvio.app.features.collection.TraktListSort +import com.nuvio.app.features.collection.TraktSortHow +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull + +class TraktPublicListSourceResolverTest { + @Test + fun parsesNumericTraktListIdsFromInputs() { + assertEquals(123456L, TraktPublicListSourceResolver.parseTraktListId("123456")) + assertEquals(123456L, TraktPublicListSourceResolver.parseTraktListId("https://trakt.tv/lists/123456")) + assertEquals(123456L, TraktPublicListSourceResolver.parseTraktListId("https://trakt.tv/users/nuvio/lists/123456")) + assertEquals(123456L, TraktPublicListSourceResolver.parseTraktListId("https://example.com/import?id=123456")) + assertNull(TraktPublicListSourceResolver.parseTraktListId("")) + } + + @Test + fun normalizesTraktSortValues() { + assertEquals("rank", TraktListSort.normalize(null)) + assertEquals("added", TraktListSort.normalize(" ADDED ")) + assertEquals("rank", TraktListSort.normalize("unknown")) + + assertEquals("asc", TraktSortHow.normalize(null)) + assertEquals("desc", TraktSortHow.normalize(" DESC ")) + assertEquals("asc", TraktSortHow.normalize("sideways")) + } + + @Test + fun normalizesTraktImageUrls() { + assertEquals( + "https://media.trakt.tv/images/poster.jpg", + "media.trakt.tv/images/poster.jpg".toTraktImageUrl(), + ) + assertEquals( + "https://media.trakt.tv/images/poster.jpg", + "http://media.trakt.tv/images/poster.jpg".toTraktImageUrl(), + ) + assertEquals( + "https://cdn.example.com/poster.jpg", + "https://cdn.example.com/poster.jpg".toTraktImageUrl(), + ) + assertEquals( + "https://media.trakt.tv/images/poster.jpg", + listOf("", "media.trakt.tv/images/poster.jpg").firstTraktImageUrl(), + ) + } +} diff --git a/iosApp/Configuration/Version.xcconfig b/iosApp/Configuration/Version.xcconfig index e702a219..d7b9fb66 100644 --- a/iosApp/Configuration/Version.xcconfig +++ b/iosApp/Configuration/Version.xcconfig @@ -1,3 +1,3 @@ -CURRENT_PROJECT_VERSION=48 +CURRENT_PROJECT_VERSION=49 MARKETING_VERSION=0.1.0 From c962a0ac248ebfbedc93d1ff0cbc128535123342 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sat, 2 May 2026 13:37:28 +0530 Subject: [PATCH 069/143] feat: implement Trakt image utilities and remove hydration --- .../app/features/trakt/TraktImageUtils.kt | 60 ++++++ .../features/trakt/TraktLibraryRepository.kt | 196 +----------------- .../trakt/TraktPublicListSourceResolver.kt | 54 +---- .../app/features/trakt/TraktImageUtilsTest.kt | 44 ++++ .../trakt/TraktLibraryRepositoryTest.kt | 50 ----- 5 files changed, 109 insertions(+), 295 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktImageUtils.kt create mode 100644 composeApp/src/commonTest/kotlin/com/nuvio/app/features/trakt/TraktImageUtilsTest.kt delete mode 100644 composeApp/src/commonTest/kotlin/com/nuvio/app/features/trakt/TraktLibraryRepositoryTest.kt diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktImageUtils.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktImageUtils.kt new file mode 100644 index 00000000..b6acf748 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktImageUtils.kt @@ -0,0 +1,60 @@ +package com.nuvio.app.features.trakt + +import kotlinx.serialization.Serializable + +private val traktHostPattern = Regex("""^[a-z0-9.-]*trakt\.tv/""", RegexOption.IGNORE_CASE) + +@Serializable +internal data class TraktImagesDto( + val fanart: List? = null, + val poster: List? = null, + val logo: List? = null, + val clearart: List? = null, + val banner: List? = null, + val thumb: List? = null, +) + +internal fun List?.firstTraktImageUrl(): String? { + return orEmpty() + .firstOrNull { it.isNotBlank() } + ?.toTraktImageUrl() +} + +internal fun String.toTraktImageUrl(): String { + val normalized = trim() + return when { + normalized.startsWith("https://", ignoreCase = true) -> normalized + normalized.startsWith("http://", ignoreCase = true) -> "https://${normalized.substringAfter("://")}" + normalized.startsWith("//") -> "https:$normalized" + traktHostPattern.containsMatchIn(normalized) -> "https://$normalized" + else -> normalized + } +} + +internal fun TraktImagesDto?.traktPosterUrl(): String? = this?.poster.firstTraktImageUrl() + +internal fun TraktImagesDto?.traktFanartUrl(): String? = this?.fanart.firstTraktImageUrl() + +internal fun TraktImagesDto?.traktLogoUrl(): String? = this?.logo.firstTraktImageUrl() + +internal fun TraktImagesDto?.traktClearartUrl(): String? = this?.clearart.firstTraktImageUrl() + +internal fun TraktImagesDto?.traktBannerUrl(): String? = this?.banner.firstTraktImageUrl() + +internal fun TraktImagesDto?.traktThumbUrl(): String? = this?.thumb.firstTraktImageUrl() + +internal fun TraktImagesDto?.traktBestPosterUrl(): String? { + return traktPosterUrl() ?: traktFanartUrl() +} + +internal fun TraktImagesDto?.traktBestBackdropUrl(): String? { + return traktFanartUrl() ?: traktBannerUrl() ?: traktThumbUrl() ?: traktPosterUrl() +} + +internal fun TraktImagesDto?.traktBestLandscapeUrl(): String? { + return traktThumbUrl() ?: traktFanartUrl() ?: traktBannerUrl() ?: traktPosterUrl() +} + +internal fun TraktImagesDto?.traktBestLogoUrl(): String? { + return traktLogoUrl() ?: traktClearartUrl() +} diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktLibraryRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktLibraryRepository.kt index 4e2468e8..0dc06966 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktLibraryRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktLibraryRepository.kt @@ -1,20 +1,15 @@ package com.nuvio.app.features.trakt import co.touchlab.kermit.Logger -import com.nuvio.app.features.addons.AddonRepository import com.nuvio.app.features.addons.httpGetTextWithHeaders import com.nuvio.app.features.addons.httpPostJsonWithHeaders -import com.nuvio.app.features.details.MetaDetailsRepository import com.nuvio.app.features.library.LibraryItem import com.nuvio.app.features.tmdb.TmdbService import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Deferred import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.async -import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -28,7 +23,6 @@ import org.jetbrains.compose.resources.getString import kotlinx.coroutines.sync.withPermit import kotlinx.coroutines.selects.select import kotlinx.coroutines.withContext -import kotlinx.coroutines.withTimeoutOrNull import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString @@ -38,8 +32,6 @@ import kotlinx.serialization.json.Json private const val BASE_URL = "https://api.trakt.tv" private const val WATCHLIST_KEY = "trakt:watchlist" private const val PERSONAL_LIST_PREFIX = "trakt:list:" -private const val METADATA_FETCH_TIMEOUT_MS = 3_500L -private const val METADATA_FETCH_CONCURRENCY = 5 private const val LIST_FETCH_CONCURRENCY = 4 private const val SNAPSHOT_CACHE_TTL_MS = 60_000L private const val LIST_TABS_CACHE_TTL_MS = 60_000L @@ -68,7 +60,6 @@ object TraktLibraryRepository { private var hasLoaded = false private val refreshMutex = Mutex() - private var hydrationJob: Job? = null private var lastRefreshAtMs: Long = 0L private var lastListTabsRefreshAtMs: Long = 0L @@ -91,8 +82,6 @@ object TraktLibraryRepository { } fun onProfileChanged() { - hydrationJob?.cancel() - hydrationJob = null hasLoaded = false lastRefreshAtMs = 0L lastListTabsRefreshAtMs = 0L @@ -101,8 +90,6 @@ object TraktLibraryRepository { } fun clearLocalState() { - hydrationJob?.cancel() - hydrationJob = null hasLoaded = false lastRefreshAtMs = 0L lastListTabsRefreshAtMs = 0L @@ -154,8 +141,6 @@ object TraktLibraryRepository { return } - AddonRepository.initialize() - val headers = TraktAuthRepository.authorizedHeaders() if (headers == null) { _uiState.value = TraktLibraryUiState() @@ -173,7 +158,6 @@ object TraktLibraryRepository { hasLoaded = true, errorMessage = null, ) - hydrateMissingMetadataAsync(_uiState.value) } }.onFailure { error -> if (error is CancellationException) throw error @@ -195,7 +179,6 @@ object TraktLibraryRepository { errorMessage = null, ) persistSnapshot(_uiState.value) - hydrateMissingMetadataAsync(_uiState.value) lastRefreshAtMs = now } } @@ -421,7 +404,6 @@ object TraktLibraryRepository { entriesByList = cached.entriesByList, ) _uiState.value = state.copy(isLoading = false, errorMessage = null, hasLoaded = true) - hydrateMissingMetadataAsync(_uiState.value) } private fun persistSnapshot(state: TraktLibraryUiState) { @@ -432,59 +414,6 @@ object TraktLibraryRepository { TraktLibraryStorage.savePayload(json.encodeToString(payload)) } - private fun hydrateMissingMetadataAsync(state: TraktLibraryUiState) { - if (state.entriesByList.isEmpty()) return - if (state.allItems.none(::shouldHydrateTraktLibraryItem)) return - - hydrationJob?.cancel() - hydrationJob = scope.launch { - val hydratedEntriesByList = runCatching { - hydrateEntriesFromAddonMeta(state.entriesByList) - }.onFailure { error -> - if (error is CancellationException) throw error - log.w { "Background Trakt metadata hydration failed: ${error.message}" } - }.getOrNull() ?: return@launch - - refreshMutex.withLock { - val current = _uiState.value - if (current.entriesByList.isEmpty()) return@withLock - - val mergedEntriesByList = mergeHydratedEntries( - currentEntriesByList = current.entriesByList, - hydratedEntriesByList = hydratedEntriesByList, - ) - if (mergedEntriesByList == current.entriesByList) return@withLock - - val rebuilt = rebuildUiState( - listTabs = current.listTabs, - entriesByList = mergedEntriesByList, - ).copy( - isLoading = current.isLoading, - hasLoaded = current.hasLoaded, - errorMessage = current.errorMessage, - ) - - _uiState.value = rebuilt - persistSnapshot(rebuilt) - } - } - } - - private fun mergeHydratedEntries( - currentEntriesByList: Map>, - hydratedEntriesByList: Map>, - ): Map> { - val hydratedByContentKey = hydratedEntriesByList.values - .flatten() - .associateBy { contentKey(it.id, it.type) } - - return currentEntriesByList.mapValues { (_, entries) -> - entries.map { entry -> - hydratedByContentKey[contentKey(entry.id, entry.type)] ?: entry - } - } - } - private suspend fun fetchListTabs(headers: Map): List { val watchlistTabs = listOf( TraktListTab( @@ -544,83 +473,6 @@ object TraktLibraryRepository { entriesByList.toMap() } - private suspend fun hydrateEntriesFromAddonMeta( - entriesByList: Map>, - ): Map> = coroutineScope { - if (entriesByList.isEmpty()) return@coroutineScope entriesByList - - val uniqueItems = entriesByList.values - .flatten() - .distinctBy { contentKey(it.id, it.type) } - if (uniqueItems.isEmpty()) return@coroutineScope entriesByList - - val semaphore = Semaphore(METADATA_FETCH_CONCURRENCY) - val hydratedByKey = uniqueItems - .map { item -> - async { - semaphore.withPermit { - val hydrated = hydrateItemFromAddonMeta(item) - contentKey(item.id, item.type) to hydrated - } - } - } - .awaitAll() - .toMap() - - entriesByList.mapValues { (_, entries) -> - entries.map { entry -> hydratedByKey[contentKey(entry.id, entry.type)] ?: entry } - } - } - - private suspend fun hydrateItemFromAddonMeta(item: LibraryItem): LibraryItem { - if (!shouldHydrateTraktLibraryItem(item)) { - return item - } - - val typeCandidates = if (normalizeType(item.type) == "movie") { - listOf("movie") - } else { - listOf("series", "tv") - } - - val idCandidates = buildList { - add(item.id) - if (item.id.startsWith("tmdb:")) { - add(item.id.substringAfter(':')) - } - if (item.id.startsWith("trakt:")) { - add(item.id.substringAfter(':')) - } - }.distinct() - - if (idCandidates.isEmpty()) { - return item - } - - for (type in typeCandidates) { - for (id in idCandidates) { - val meta = withTimeoutOrNull(METADATA_FETCH_TIMEOUT_MS) { - MetaDetailsRepository.fetch(type = type, id = id) - } - if (meta == null) continue - - val shouldOverrideName = item.name.isBlank() || item.name == item.id - return item.copy( - name = if (shouldOverrideName) meta.name else item.name, - poster = item.poster.orValidImageUrl(meta.poster), - banner = item.banner.orValidImageUrl(meta.background), - logo = item.logo.orValidImageUrl(meta.logo), - description = item.description.orIfBlank(meta.description), - releaseInfo = item.releaseInfo.orIfBlank(meta.releaseInfo), - imdbRating = item.imdbRating.orIfBlank(meta.imdbRating), - genres = if (item.genres.isEmpty()) meta.genres else item.genres, - ) - } - } - - return item - } - private suspend fun fetchPersonalLists(headers: Map): List { val payload = httpGetTextWithHeaders( url = "$BASE_URL/users/me/lists", @@ -786,10 +638,9 @@ object TraktLibraryRepository { ?: ids?.trakt?.let { "trakt:$it" } ?: return null - val poster = media.images?.poster.firstNonBlankImageUrl() - ?: media.images?.fanart.firstNonBlankImageUrl() - val banner = media.images?.banner.firstNonBlankImageUrl() - val logo = media.images?.logo.firstNonBlankImageUrl() + val poster = media.images.traktBestPosterUrl() + val banner = media.images.traktBestBackdropUrl() + val logo = media.images.traktBestLogoUrl() val savedAt = item.listedAt ?.takeIf { it.isNotBlank() } @@ -829,34 +680,6 @@ object TraktLibraryRepository { return yearText.toIntOrNull() } - private fun String?.orIfBlank(fallback: String?): String? { - val current = this?.trim().takeUnless { it.isNullOrBlank() } - if (current != null) return current - return fallback?.trim().takeUnless { it.isNullOrBlank() } - } - - private fun String?.orValidImageUrl(fallback: String?): String? { - val current = this.normalizeImageUrl() - if (current != null) return current - return fallback.normalizeImageUrl() - } - - private fun List?.firstNonBlankImageUrl(): String? { - return this - ?.asSequence() - ?.mapNotNull { it.normalizeImageUrl() } - ?.firstOrNull() - } - - private fun String?.normalizeImageUrl(): String? { - val value = this?.trim().takeUnless { it.isNullOrBlank() } ?: return null - val normalized = if (value.startsWith("//")) "https:$value" else value - return normalized.takeIf { - it.startsWith("https://", ignoreCase = true) || - it.startsWith("http://", ignoreCase = true) - } - } - private val imdbRegex = Regex("tt\\d+") } @@ -866,11 +689,6 @@ private data class StoredTraktLibraryPayload( val entriesByList: Map> = emptyMap(), ) -internal fun shouldHydrateTraktLibraryItem(item: LibraryItem): Boolean { - val missingDisplayName = item.name.isBlank() || item.name == item.id - return missingDisplayName || item.poster.isNullOrBlank() || item.releaseInfo.isNullOrBlank() -} - @Serializable private data class TraktListSummaryDto( val name: String? = null, @@ -902,14 +720,6 @@ private data class TraktMediaDto( val images: TraktImagesDto? = null, ) -@Serializable -private data class TraktImagesDto( - val fanart: List? = null, - val poster: List? = null, - val logo: List? = null, - val banner: List? = null, -) - @Serializable private data class TraktIdsDto( val trakt: Int? = null, diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktPublicListSourceResolver.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktPublicListSourceResolver.kt index f9d2dafa..e1468245 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktPublicListSourceResolver.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/trakt/TraktPublicListSourceResolver.kt @@ -301,49 +301,9 @@ object TraktPublicListSourceResolver { } } -internal fun List?.firstTraktImageUrl(): String? { - return orEmpty() - .firstOrNull { it.isNotBlank() } - ?.toTraktImageUrl() -} - -internal fun String.toTraktImageUrl(): String { - val normalized = trim() - return when { - normalized.startsWith("https://", ignoreCase = true) -> normalized - normalized.startsWith("http://", ignoreCase = true) -> "https://${normalized.substringAfter("://")}" - normalized.startsWith("//") -> "https:$normalized" - traktHostPattern.containsMatchIn(normalized) -> "https://$normalized" - else -> normalized - } -} - -private fun PublicTraktImagesDto?.traktPosterUrl(): String? = this?.poster.firstTraktImageUrl() - -private fun PublicTraktImagesDto?.traktFanartUrl(): String? = this?.fanart.firstTraktImageUrl() - -private fun PublicTraktImagesDto?.traktLogoUrl(): String? = this?.logo.firstTraktImageUrl() - -private fun PublicTraktImagesDto?.traktClearartUrl(): String? = this?.clearart.firstTraktImageUrl() - -private fun PublicTraktImagesDto?.traktBannerUrl(): String? = this?.banner.firstTraktImageUrl() - -private fun PublicTraktImagesDto?.traktThumbUrl(): String? = this?.thumb.firstTraktImageUrl() - -private fun PublicTraktImagesDto?.traktBestPosterUrl(): String? = - traktPosterUrl() ?: traktFanartUrl() - -private fun PublicTraktImagesDto?.traktBestBackdropUrl(): String? = - traktFanartUrl() ?: traktBannerUrl() ?: traktThumbUrl() ?: traktPosterUrl() - -private fun PublicTraktImagesDto?.traktBestLogoUrl(): String? = - traktLogoUrl() ?: traktClearartUrl() - private fun Double.formatRating(): String = ((this * 10).roundToInt() / 10.0).toString() -private val traktHostPattern = Regex("""^[a-z0-9.-]*trakt\.tv/""", RegexOption.IGNORE_CASE) - @Serializable private data class PublicTraktSearchResultDto( val type: String? = null, @@ -404,7 +364,7 @@ private data class PublicTraktMovieDto( val released: String? = null, val rating: Double? = null, val genres: List? = null, - val images: PublicTraktImagesDto? = null, + val images: TraktImagesDto? = null, ) @Serializable @@ -416,15 +376,5 @@ private data class PublicTraktShowDto( @SerialName("first_aired") val firstAired: String? = null, val rating: Double? = null, val genres: List? = null, - val images: PublicTraktImagesDto? = null, -) - -@Serializable -private data class PublicTraktImagesDto( - val fanart: List? = null, - val poster: List? = null, - val logo: List? = null, - val clearart: List? = null, - val banner: List? = null, - val thumb: List? = null, + val images: TraktImagesDto? = null, ) diff --git a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/trakt/TraktImageUtilsTest.kt b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/trakt/TraktImageUtilsTest.kt new file mode 100644 index 00000000..c432735f --- /dev/null +++ b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/trakt/TraktImageUtilsTest.kt @@ -0,0 +1,44 @@ +package com.nuvio.app.features.trakt + +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull + +class TraktImageUtilsTest { + + @Test + fun normalizesTraktHostedImageUrls() { + assertEquals( + "https://media.trakt.tv/images/movies/poster.jpg.webp", + listOf("media.trakt.tv/images/movies/poster.jpg.webp").firstTraktImageUrl(), + ) + assertEquals( + "https://media.trakt.tv/images/movies/poster.jpg.webp", + listOf("//media.trakt.tv/images/movies/poster.jpg.webp").firstTraktImageUrl(), + ) + assertEquals( + "https://media.trakt.tv/images/movies/poster.jpg.webp", + listOf("http://media.trakt.tv/images/movies/poster.jpg.webp").firstTraktImageUrl(), + ) + } + + @Test + fun selectsBestTraktImages() { + val images = TraktImagesDto( + fanart = listOf("media.trakt.tv/images/movies/fanart.jpg.webp"), + logo = listOf("media.trakt.tv/images/movies/logo.png.webp"), + thumb = listOf("media.trakt.tv/images/movies/thumb.jpg.webp"), + ) + + assertEquals("https://media.trakt.tv/images/movies/fanart.jpg.webp", images.traktBestPosterUrl()) + assertEquals("https://media.trakt.tv/images/movies/fanart.jpg.webp", images.traktBestBackdropUrl()) + assertEquals("https://media.trakt.tv/images/movies/thumb.jpg.webp", images.traktBestLandscapeUrl()) + assertEquals("https://media.trakt.tv/images/movies/logo.png.webp", images.traktBestLogoUrl()) + } + + @Test + fun returnsNullWhenTraktImagesAreMissing() { + assertNull(emptyList().firstTraktImageUrl()) + assertNull(TraktImagesDto().traktBestPosterUrl()) + } +} diff --git a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/trakt/TraktLibraryRepositoryTest.kt b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/trakt/TraktLibraryRepositoryTest.kt deleted file mode 100644 index a6b053a4..00000000 --- a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/trakt/TraktLibraryRepositoryTest.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.nuvio.app.features.trakt - -import com.nuvio.app.features.home.PosterShape -import com.nuvio.app.features.library.LibraryItem -import kotlin.test.Test -import kotlin.test.assertFalse -import kotlin.test.assertTrue - -class TraktLibraryRepositoryTest { - - @Test - fun `hydration skips items that already have core library data`() { - val item = LibraryItem( - id = "tt1234567", - type = "movie", - name = "Example", - poster = "https://image.tmdb.org/t/p/w500/poster.jpg", - banner = null, - logo = null, - description = null, - releaseInfo = "2024", - imdbRating = null, - genres = emptyList(), - posterShape = PosterShape.Poster, - savedAtEpochMs = 1L, - ) - - assertFalse(shouldHydrateTraktLibraryItem(item)) - } - - @Test - fun `hydration keeps filling missing poster metadata`() { - val item = LibraryItem( - id = "tt7654321", - type = "series", - name = "Example Show", - poster = null, - banner = null, - logo = null, - description = "", - releaseInfo = "2025", - imdbRating = null, - genres = emptyList(), - posterShape = PosterShape.Poster, - savedAtEpochMs = 1L, - ) - - assertTrue(shouldHydrateTraktLibraryItem(item)) - } -} \ No newline at end of file From c890cc3400f1d413f2fd5a635c325f26b747beb7 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sat, 2 May 2026 13:57:13 +0530 Subject: [PATCH 070/143] fix: language selection not working in ios --- .../values-pt/{strings => strings.xml} | 0 .../com/nuvio/app/features/settings/AppLanguage.kt | 5 +++-- .../features/settings/ThemeSettingsRepository.kt | 4 ++-- .../features/settings/ThemeSettingsStorage.ios.kt | 13 ++++++++++++- 4 files changed, 17 insertions(+), 5 deletions(-) rename composeApp/src/commonMain/composeResources/values-pt/{strings => strings.xml} (100%) diff --git a/composeApp/src/commonMain/composeResources/values-pt/strings b/composeApp/src/commonMain/composeResources/values-pt/strings.xml similarity index 100% rename from composeApp/src/commonMain/composeResources/values-pt/strings rename to composeApp/src/commonMain/composeResources/values-pt/strings.xml diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt index 8002195d..f47fb7b8 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt @@ -4,7 +4,7 @@ import nuvio.composeapp.generated.resources.Res import nuvio.composeapp.generated.resources.lang_english import nuvio.composeapp.generated.resources.lang_french import nuvio.composeapp.generated.resources.lang_spanish -import nuvio.composeapp.generated.resources.lang_portuguese +import nuvio.composeapp.generated.resources.lang_portuguese_portugal import nuvio.composeapp.generated.resources.lang_turkish import nuvio.composeapp.generated.resources.lang_italian import nuvio.composeapp.generated.resources.lang_greek @@ -16,8 +16,9 @@ enum class AppLanguage( val labelRes: StringResource, ) { ENGLISH("en", Res.string.lang_english), - FRENCH("fr", Res.string.lang_french), + FRENCH("fr", Res.string.lang_french), SPANISH("es", Res.string.lang_spanish), + PORTUGUESE("pt", Res.string.lang_portuguese_portugal), TURKISH("tr", Res.string.lang_turkish), ITALIAN("it", Res.string.lang_italian), GREEK("el", Res.string.lang_greek), diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsRepository.kt index 8a2b5241..863dd04f 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsRepository.kt @@ -48,8 +48,8 @@ object ThemeSettingsRepository { _selectedTheme.value = theme _amoledEnabled.value = ThemeSettingsStorage.loadAmoledEnabled() ?: false val appLanguage = AppLanguage.fromCode(ThemeSettingsStorage.loadSelectedAppLanguage()) - _selectedAppLanguage.value = appLanguage ThemeSettingsStorage.applySelectedAppLanguage(appLanguage.code) + _selectedAppLanguage.value = appLanguage } fun setTheme(theme: AppTheme) { @@ -69,8 +69,8 @@ object ThemeSettingsRepository { fun setAppLanguage(language: AppLanguage) { ensureLoaded() if (_selectedAppLanguage.value == language) return - _selectedAppLanguage.value = language ThemeSettingsStorage.saveSelectedAppLanguage(language.code) ThemeSettingsStorage.applySelectedAppLanguage(language.code) + _selectedAppLanguage.value = language } } diff --git a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt index f71eaaea..c878b4a8 100644 --- a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt +++ b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/settings/ThemeSettingsStorage.ios.kt @@ -50,7 +50,17 @@ actual object ThemeSettingsStorage { NSUserDefaults.standardUserDefaults.setObject(languageCode, forKey = selectedAppLanguageKey) } - actual fun applySelectedAppLanguage(languageCode: String) = Unit + actual fun applySelectedAppLanguage(languageCode: String) { + val normalizedCode = languageCode + .trim() + .takeIf { it.isNotBlank() } + ?: AppLanguage.ENGLISH.code + NSUserDefaults.standardUserDefaults.setObject( + listOf(normalizedCode), + forKey = "AppleLanguages", + ) + NSUserDefaults.standardUserDefaults.synchronize() + } actual fun exportToSyncPayload(): JsonObject = buildJsonObject { loadSelectedTheme()?.let { put(selectedThemeKey, encodeSyncString(it)) } @@ -69,5 +79,6 @@ actual object ThemeSettingsStorage { payload.decodeSyncString(selectedThemeKey)?.let(::saveSelectedTheme) payload.decodeSyncBoolean(amoledEnabledKey)?.let(::saveAmoledEnabled) payload.decodeSyncString(selectedAppLanguageKey)?.let(::saveSelectedAppLanguage) + applySelectedAppLanguage(loadSelectedAppLanguage() ?: AppLanguage.ENGLISH.code) } } From 4f62be91b8d51c4116d9e23c3e2ef628e448495c Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sat, 2 May 2026 14:05:47 +0530 Subject: [PATCH 071/143] fix: ios player not recreating after switching source/episode --- .../app/features/player/PlayerEngine.ios.kt | 244 +++++++++--------- 1 file changed, 123 insertions(+), 121 deletions(-) diff --git a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/player/PlayerEngine.ios.kt b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/player/PlayerEngine.ios.kt index a0286b9f..2877b04c 100644 --- a/composeApp/src/iosMain/kotlin/com/nuvio/app/features/player/PlayerEngine.ios.kt +++ b/composeApp/src/iosMain/kotlin/com/nuvio/app/features/player/PlayerEngine.ios.kt @@ -34,180 +34,182 @@ actual fun PlatformPlayerSurface( onError: (String?) -> Unit, ) { sanitizePlaybackResponseHeaders(sourceResponseHeaders) + val latestOnControllerReady = rememberUpdatedState(onControllerReady) val latestOnSnapshot = rememberUpdatedState(onSnapshot) val latestOnError = rememberUpdatedState(onError) - val bridge = remember(sourceUrl) { + val bridge = remember { NuvioPlayerBridgeFactory.create() } if (bridge == null) { LaunchedEffect(Unit) { - onError("MPV player engine not available. Please rebuild the app.") + latestOnError.value("MPV player engine not available. Please rebuild the app.") } return } - // Create controller - LaunchedEffect(bridge) { - onControllerReady( - object : PlayerEngineController { - override fun play() { - bridge.play() - } + val controller = remember(bridge) { + object : PlayerEngineController { + override fun play() { + bridge.play() + } - override fun pause() { - bridge.pause() - } + override fun pause() { + bridge.pause() + } - override fun seekTo(positionMs: Long) { - bridge.seekTo(positionMs) - } + override fun seekTo(positionMs: Long) { + bridge.seekTo(positionMs) + } - override fun seekBy(offsetMs: Long) { - bridge.seekBy(offsetMs) - } + override fun seekBy(offsetMs: Long) { + bridge.seekBy(offsetMs) + } - override fun retry() { - bridge.retry() - } + override fun retry() { + bridge.retry() + } - override fun setPlaybackSpeed(speed: Float) { - bridge.setPlaybackSpeed(speed) - } + override fun setPlaybackSpeed(speed: Float) { + bridge.setPlaybackSpeed(speed) + } - override fun getAudioTracks(): List { - val count = bridge.getAudioTrackCount() - return (0 until count).map { i -> - AudioTrack( - index = bridge.getAudioTrackIndex(i), - id = bridge.getAudioTrackId(i), - label = bridge.getAudioTrackLabel(i), - language = bridge.getAudioTrackLang(i), - isSelected = bridge.isAudioTrackSelected(i), - ) - } + override fun getAudioTracks(): List { + val count = bridge.getAudioTrackCount() + return (0 until count).map { i -> + AudioTrack( + index = bridge.getAudioTrackIndex(i), + id = bridge.getAudioTrackId(i), + label = bridge.getAudioTrackLabel(i), + language = bridge.getAudioTrackLang(i), + isSelected = bridge.isAudioTrackSelected(i), + ) } + } - override fun getSubtitleTracks(): List { - val count = bridge.getSubtitleTrackCount() - val tracks = (0 until count).map { i -> - val trackId = bridge.getSubtitleTrackId(i) - val trackLabel = bridge.getSubtitleTrackLabel(i) - val trackLanguage = bridge.getSubtitleTrackLang(i) - SubtitleTrack( - index = bridge.getSubtitleTrackIndex(i), - id = trackId, + override fun getSubtitleTracks(): List { + val count = bridge.getSubtitleTrackCount() + val tracks = (0 until count).map { i -> + val trackId = bridge.getSubtitleTrackId(i) + val trackLabel = bridge.getSubtitleTrackLabel(i) + val trackLanguage = bridge.getSubtitleTrackLang(i) + SubtitleTrack( + index = bridge.getSubtitleTrackIndex(i), + id = trackId, + label = trackLabel, + language = trackLanguage, + isSelected = bridge.isSubtitleTrackSelected(i), + isForced = inferForcedSubtitleTrack( label = trackLabel, language = trackLanguage, - isSelected = bridge.isSubtitleTrackSelected(i), - isForced = inferForcedSubtitleTrack( - label = trackLabel, - language = trackLanguage, - trackId = trackId, - ), - ) - } - Logger.d(TAG) { "getSubtitleTracks: found ${tracks.size} tracks" } - return tracks + trackId = trackId, + ), + ) } + Logger.d(TAG) { "getSubtitleTracks: found ${tracks.size} tracks" } + return tracks + } - override fun selectAudioTrack(index: Int) { - // Convert from logical track index to mpv track id - val count = bridge.getAudioTrackCount() + override fun selectAudioTrack(index: Int) { + // Convert from logical track index to mpv track id + val count = bridge.getAudioTrackCount() + if (count <= 0) return + + val trackId = (0 until count) + .firstNotNullOfOrNull { at -> + if (bridge.getAudioTrackIndex(at) == index) { + bridge.getAudioTrackId(at).toIntOrNull() + } else { + null + } + } + ?: if (index in 0 until count) { + bridge.getAudioTrackId(index).toIntOrNull() ?: (index + 1) + } else { + null + } + + if (trackId != null) { + bridge.selectAudioTrack(trackId) + } + } + + override fun selectSubtitleTrack(index: Int) { + if (index < 0) { + bridge.selectSubtitleTrack(-1) // disable + } else { + val count = bridge.getSubtitleTrackCount() if (count <= 0) return val trackId = (0 until count) .firstNotNullOfOrNull { at -> - if (bridge.getAudioTrackIndex(at) == index) { - bridge.getAudioTrackId(at).toIntOrNull() + if (bridge.getSubtitleTrackIndex(at) == index) { + bridge.getSubtitleTrackId(at).toIntOrNull() } else { null } } ?: if (index in 0 until count) { - bridge.getAudioTrackId(index).toIntOrNull() ?: (index + 1) + bridge.getSubtitleTrackId(index).toIntOrNull() ?: (index + 1) } else { null } if (trackId != null) { - bridge.selectAudioTrack(trackId) + bridge.selectSubtitleTrack(trackId) } } + } - override fun selectSubtitleTrack(index: Int) { - if (index < 0) { - bridge.selectSubtitleTrack(-1) // disable + override fun setSubtitleUri(url: String) { + Logger.d(TAG) { "setSubtitleUri: $url" } + bridge.setSubtitleUrl(url) + } + + override fun clearExternalSubtitle() { + bridge.clearExternalSubtitle() + } + + override fun clearExternalSubtitleAndSelect(trackIndex: Int) { + val trackId = if (trackIndex < 0) { + -1 + } else { + val count = bridge.getSubtitleTrackCount() + if (count <= 0) { + trackIndex + 1 } else { - val count = bridge.getSubtitleTrackCount() - if (count <= 0) return - - val trackId = (0 until count) + (0 until count) .firstNotNullOfOrNull { at -> - if (bridge.getSubtitleTrackIndex(at) == index) { + if (bridge.getSubtitleTrackIndex(at) == trackIndex) { bridge.getSubtitleTrackId(at).toIntOrNull() } else { null } } - ?: if (index in 0 until count) { - bridge.getSubtitleTrackId(index).toIntOrNull() ?: (index + 1) + ?: if (trackIndex in 0 until count) { + bridge.getSubtitleTrackId(trackIndex).toIntOrNull() ?: (trackIndex + 1) } else { - null + trackIndex + 1 } - - if (trackId != null) { - bridge.selectSubtitleTrack(trackId) - } } } - - override fun setSubtitleUri(url: String) { - Logger.d(TAG) { "setSubtitleUri: $url" } - bridge.setSubtitleUrl(url) - } - - override fun clearExternalSubtitle() { - bridge.clearExternalSubtitle() - } - - override fun clearExternalSubtitleAndSelect(trackIndex: Int) { - val trackId = if (trackIndex < 0) { - -1 - } else { - val count = bridge.getSubtitleTrackCount() - if (count <= 0) { - trackIndex + 1 - } else { - (0 until count) - .firstNotNullOfOrNull { at -> - if (bridge.getSubtitleTrackIndex(at) == trackIndex) { - bridge.getSubtitleTrackId(at).toIntOrNull() - } else { - null - } - } - ?: if (trackIndex in 0 until count) { - bridge.getSubtitleTrackId(trackIndex).toIntOrNull() ?: (trackIndex + 1) - } else { - trackIndex + 1 - } - } - } - bridge.clearExternalSubtitleAndSelect(trackId) - } - - override fun applySubtitleStyle(style: SubtitleStyleState) { - bridge.applySubtitleStyle( - textColor = style.textColor.toMpvColorString(), - outlineSize = if (style.outlineEnabled) 1.65f else 0f, - fontSize = style.toMpvSubtitleFontSize(), - subPos = style.toMpvSubtitlePosition(), - ) - } + bridge.clearExternalSubtitleAndSelect(trackId) } - ) + + override fun applySubtitleStyle(style: SubtitleStyleState) { + bridge.applySubtitleStyle( + textColor = style.textColor.toMpvColorString(), + outlineSize = if (style.outlineEnabled) 1.65f else 0f, + fontSize = style.toMpvSubtitleFontSize(), + subPos = style.toMpvSubtitlePosition(), + ) + } + } + } + + LaunchedEffect(controller, sourceUrl, sourceAudioUrl, sourceHeaders, sourceResponseHeaders) { + latestOnControllerReady.value(controller) } // Load file and set initial state From 000f081d2808dd900cce9fd22b4ae800ff93b997 Mon Sep 17 00:00:00 2001 From: paregi12 Date: Sat, 2 May 2026 12:00:53 +0530 Subject: [PATCH 072/143] fixes for introdb submit --- .../app/features/player/PlayerControls.kt | 1 + .../nuvio/app/features/player/PlayerScreen.kt | 21 +++++- .../player/PlayerSettingsRepository.kt | 4 ++ .../features/player/skip/SubmitIntroDialog.kt | 71 ++++++++++++------- .../features/settings/PlaybackSettingsPage.kt | 4 +- 5 files changed, 72 insertions(+), 29 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt index f1514d6e..48ffd528 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerControls.kt @@ -168,6 +168,7 @@ internal fun PlayerControlsShell( onAudioClick = onAudioClick, onSourcesClick = onSourcesClick, onEpisodesClick = onEpisodesClick, + onSubmitIntroClick = onSubmitIntroClick, modifier = Modifier .align(Alignment.BottomCenter) .fillMaxWidth() diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt index e144c4ce..79274569 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt @@ -243,6 +243,9 @@ fun PlayerScreen( var showSourcesPanel by remember { mutableStateOf(false) } var showEpisodesPanel by remember { mutableStateOf(false) } var showSubmitIntroModal by remember { mutableStateOf(false) } + var submitIntroSegmentType by rememberSaveable { mutableStateOf("intro") } + var submitIntroStartTimeStr by rememberSaveable { mutableStateOf("00:00") } + var submitIntroEndTimeStr by rememberSaveable { mutableStateOf("00:00") } var episodeStreamsPanelState by remember { mutableStateOf(EpisodeStreamsPanelState()) } val sourceStreamsState by PlayerStreamsRepository.sourceState.collectAsStateWithLifecycle() val episodeStreamsRepoState by PlayerStreamsRepository.episodeStreamsState.collectAsStateWithLifecycle() @@ -1598,9 +1601,9 @@ fun PlayerScreen( refreshTracks() showAudioModal = true }, - onSourcesClick = if (activeVideoId != null) {{ openSourcesPanel() }} else null, - onEpisodesClick = if (isSeries) {{ openEpisodesPanel() }} else null, - onSubmitIntroClick = if (isSeries && playerSettingsUiState.introSubmitEnabled && playerSettingsUiState.introDbApiKey.isNotBlank()) {{ showSubmitIntroModal = true }} else null, + onSourcesClick = if (activeVideoId != null) { { openSourcesPanel() } } else null, + onEpisodesClick = if (isSeries) { { openEpisodesPanel() } } else null, + onSubmitIntroClick = if (isSeries && playerSettingsUiState.introSubmitEnabled && playerSettingsUiState.introDbApiKey.isNotBlank()) { { showSubmitIntroModal = true } } else null, onScrubChange = { positionMs -> scrubbingPositionMs = positionMs }, onScrubFinished = { positionMs -> scrubbingPositionMs = null @@ -1859,7 +1862,19 @@ fun PlayerScreen( season = season, episode = episode, currentTimeSec = (displayedPositionMs / 1000.0), + segmentType = submitIntroSegmentType, + onSegmentTypeChange = { submitIntroSegmentType = it }, + startTimeStr = submitIntroStartTimeStr, + onStartTimeChange = { submitIntroStartTimeStr = it }, + endTimeStr = submitIntroEndTimeStr, + onEndTimeChange = { submitIntroEndTimeStr = it }, onDismiss = { showSubmitIntroModal = false }, + onSuccess = { + submitIntroStartTimeStr = "00:00" + submitIntroEndTimeStr = "00:00" + submitIntroSegmentType = "intro" + showSubmitIntroModal = false + } ) } } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsRepository.kt index 451b9cda..ec58911e 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerSettingsRepository.kt @@ -71,6 +71,8 @@ object PlayerSettingsRepository { private var skipIntroEnabled = true private var animeSkipEnabled = false private var animeSkipClientId = "" + private var introDbApiKey = "" + private var introSubmitEnabled = false private var streamAutoPlayNextEpisodeEnabled = false private var streamAutoPlayPreferBingeGroup = true private var nextEpisodeThresholdMode = NextEpisodeThresholdMode.PERCENTAGE @@ -113,6 +115,8 @@ object PlayerSettingsRepository { skipIntroEnabled = true animeSkipEnabled = false animeSkipClientId = "" + introDbApiKey = "" + introSubmitEnabled = false streamAutoPlayNextEpisodeEnabled = false streamAutoPlayPreferBingeGroup = true nextEpisodeThresholdMode = NextEpisodeThresholdMode.PERCENTAGE diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SubmitIntroDialog.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SubmitIntroDialog.kt index 0771633b..7d3df719 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SubmitIntroDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/skip/SubmitIntroDialog.kt @@ -13,9 +13,11 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Close import androidx.compose.material.icons.rounded.GpsFixed @@ -48,7 +50,6 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import kotlinx.coroutines.launch import kotlin.math.floor -import kotlin.math.roundToInt @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -57,23 +58,30 @@ fun SubmitIntroDialog( season: Int, episode: Int, currentTimeSec: Double, + segmentType: String, + onSegmentTypeChange: (String) -> Unit, + startTimeStr: String, + onStartTimeChange: (String) -> Unit, + endTimeStr: String, + onEndTimeChange: (String) -> Unit, onDismiss: () -> Unit, + onSuccess: () -> Unit, ) { val scope = rememberCoroutineScope() + val scrollState = rememberScrollState() var isSubmitting by remember { mutableStateOf(false) } - var segmentType by remember { mutableStateOf("intro") } - var startTimeStr by remember { mutableStateOf("00:00") } - var endTimeStr by remember { mutableStateOf(formatSecondsToMMSS(currentTimeSec)) } BasicAlertDialog(onDismissRequest = onDismiss) { Surface( - modifier = Modifier.fillMaxWidth().padding(16.dp), + modifier = Modifier.padding(horizontal = 16.dp, vertical = 24.dp), shape = RoundedCornerShape(24.dp), color = MaterialTheme.colorScheme.surface, tonalElevation = 8.dp, ) { Column( - modifier = Modifier.padding(24.dp), + modifier = Modifier + .padding(24.dp) + .verticalScroll(scrollState), verticalArrangement = Arrangement.spacedBy(16.dp), ) { // Header @@ -88,7 +96,7 @@ fun SubmitIntroDialog( color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Bold, ) - IconButton(onClick = onDismiss, modifier = Modifier.size(24.dp)) { + IconButton(onClick = onDismiss) { Icon(Icons.Rounded.Close, contentDescription = "Close", tint = MaterialTheme.colorScheme.onSurfaceVariant) } } @@ -109,21 +117,21 @@ fun SubmitIntroDialog( label = "Intro", icon = Icons.Rounded.PlayCircleOutline, selected = segmentType == "intro", - onClick = { segmentType = "intro" }, + onClick = { onSegmentTypeChange("intro") }, modifier = Modifier.weight(1f) ) SegmentTypeButton( label = "Recap", icon = Icons.Rounded.Replay, selected = segmentType == "recap", - onClick = { segmentType = "recap" }, + onClick = { onSegmentTypeChange("recap") }, modifier = Modifier.weight(1f) ) SegmentTypeButton( label = "Outro", icon = Icons.Rounded.StopCircle, selected = segmentType == "outro", - onClick = { segmentType = "outro" }, + onClick = { onSegmentTypeChange("outro") }, modifier = Modifier.weight(1f) ) } @@ -133,16 +141,16 @@ fun SubmitIntroDialog( TimeInputRow( label = "START TIME (MM:SS)", value = startTimeStr, - onValueChange = { startTimeStr = it }, - onCapture = { startTimeStr = formatSecondsToMMSS(currentTimeSec) } + onValueChange = onStartTimeChange, + onCapture = { onStartTimeChange(formatSecondsToMMSS(currentTimeSec)) } ) // End Time TimeInputRow( label = "END TIME (MM:SS)", value = endTimeStr, - onValueChange = { endTimeStr = it }, - onCapture = { endTimeStr = formatSecondsToMMSS(currentTimeSec) } + onValueChange = onEndTimeChange, + onCapture = { onEndTimeChange(formatSecondsToMMSS(currentTimeSec)) } ) Spacer(modifier = Modifier.height(8.dp)) @@ -179,7 +187,7 @@ fun SubmitIntroDialog( if (start != null && end != null && end > start) { isSubmitting = true scope.launch { - SkipIntroRepository.submitIntro( + val result = SkipIntroRepository.submitIntro( imdbId = imdbId, season = season, episode = episode, @@ -188,7 +196,9 @@ fun SubmitIntroDialog( segmentType = segmentType, ) isSubmitting = false - onDismiss() + if (result) { + onSuccess() + } } } }, @@ -292,7 +302,7 @@ private fun TimeInputRow( textStyle = MaterialTheme.typography.bodyLarge.copy( color = MaterialTheme.colorScheme.onSurface, ), - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal), cursorBrush = SolidColor(MaterialTheme.colorScheme.primary), singleLine = true, ) @@ -336,13 +346,26 @@ private fun formatSecondsToMMSS(seconds: Double): String { private fun parseTimeToSeconds(input: String): Double? { if (input.isBlank()) return null - if (input.contains(':')) { - val parts = input.split(':') - if (parts.size != 2) return null - val mins = parts[0].toIntOrNull() ?: return null - val secs = parts[1].toIntOrNull() ?: return null - if (secs < 0 || secs >= 60) return null - return (mins * 60 + secs).toDouble() + + // Check for separator (colon or dot) + val separator = when { + input.contains(':') -> ":" + input.contains('.') -> "." + else -> null } + + if (separator != null) { + val parts = input.split(separator) + if (parts.size == 2) { + val mins = parts[0].toIntOrNull() ?: return null + val secs = parts[1].toIntOrNull() ?: return null + // If the user uses a dot, we assume they mean MM.SS (e.g. 1.24 = 1m 24s) + // But we only treat it as minutes if seconds are 0-59. + if (secs in 0..59) { + return (mins * 60 + secs).toDouble() + } + } + } + return input.toDoubleOrNull() } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt index dc0903e0..681383f3 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/PlaybackSettingsPage.kt @@ -23,6 +23,7 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Check import androidx.compose.material3.BasicAlertDialog +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme @@ -2161,5 +2162,4 @@ private fun libassRenderTypeRes(renderType: String): StringResource = when (rend @Composable private fun libassRenderTypeLabel(renderType: String): String = stringResource(libassRenderTypeRes(renderType)) -): String = stringResource(libassRenderTypeRes(renderType)) -pe)) + From 1523177ffa2dd989b5f4824f32d3f37a786e142f Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sat, 2 May 2026 14:27:04 +0530 Subject: [PATCH 073/143] fix: improve trakt scrobble handling --- .../nuvio/app/features/player/PlayerScreen.kt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt index 3dea8937..b9f9df07 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt @@ -223,7 +223,6 @@ fun PlayerScreen( activeEpisodeNumber, ) { mutableStateOf(false) } var hasSentCompletionScrobbleForCurrentItem by remember( - activeSourceUrl, activeVideoId, activeSeasonNumber, activeEpisodeNumber, @@ -379,7 +378,6 @@ fun PlayerScreen( val progressPercent = currentPlaybackProgressPercent() if (progressPercent >= 1f && progressPercent < 80f) { emitTraktScrobbleStop(progressPercent) - hasSentCompletionScrobbleForCurrentItem = false return } @@ -1195,15 +1193,20 @@ fun PlayerScreen( pausedOverlayVisible = true } - LaunchedEffect(playbackSnapshot.positionMs, playbackSnapshot.isPlaying, playbackSnapshot.isEnded, playbackSnapshot.durationMs) { + LaunchedEffect( + playbackSnapshot.positionMs, + playbackSnapshot.isPlaying, + playbackSnapshot.isLoading, + playbackSnapshot.isEnded, + playbackSnapshot.durationMs, + ) { if (playbackSnapshot.isEnded) { - hasSentCompletionScrobbleForCurrentItem = false flushWatchProgress() previousIsPlaying = false return@LaunchedEffect } - if (previousIsPlaying && !playbackSnapshot.isPlaying) { + if (previousIsPlaying && !playbackSnapshot.isPlaying && !playbackSnapshot.isLoading) { flushWatchProgress() } @@ -1211,7 +1214,9 @@ fun PlayerScreen( emitTraktScrobbleStart() } - previousIsPlaying = playbackSnapshot.isPlaying + if (!playbackSnapshot.isLoading) { + previousIsPlaying = playbackSnapshot.isPlaying + } if (!playbackSnapshot.isPlaying) { return@LaunchedEffect From d328d62c66e9c6adbc6687619993bf741c8dbf3b Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sat, 2 May 2026 14:30:49 +0530 Subject: [PATCH 074/143] bump version --- iosApp/Configuration/Version.xcconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iosApp/Configuration/Version.xcconfig b/iosApp/Configuration/Version.xcconfig index d7b9fb66..2c747aca 100644 --- a/iosApp/Configuration/Version.xcconfig +++ b/iosApp/Configuration/Version.xcconfig @@ -1,3 +1,3 @@ -CURRENT_PROJECT_VERSION=49 -MARKETING_VERSION=0.1.0 +CURRENT_PROJECT_VERSION=50 +MARKETING_VERSION=0.1.13 From c95bef744701a7496c8691d4e67ce5e8c3b432aa Mon Sep 17 00:00:00 2001 From: Kevin Rouchut Date: Sat, 2 May 2026 14:57:10 +0200 Subject: [PATCH 075/143] fix: update French strings for clarity and consistency Co-authored-by: Copilot --- .../composeResources/values-fr/strings.xml | 83 +++++++++++++------ 1 file changed, 58 insertions(+), 25 deletions(-) diff --git a/composeApp/src/commonMain/composeResources/values-fr/strings.xml b/composeApp/src/commonMain/composeResources/values-fr/strings.xml index f107fc43..71116267 100644 --- a/composeApp/src/commonMain/composeResources/values-fr/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-fr/strings.xml @@ -1,4 +1,3 @@ - Reconnaissance et crédits du projet Retour @@ -111,29 +110,38 @@ Production Chaîne Collection + Personne + Réalisateur Personnalisé Choisissez une source prédéfinie. Vous pouvez la modifier ou la supprimer après l'avoir ajoutée. Collez une URL de liste publique TMDB ou uniquement le numéro de l'URL. Recherchez par nom de studio, ou collez un ID/URL de société TMDB et ajoutez-le directement. Saisissez un ID de chaîne. Les chaînes courantes sont disponibles dans les préréglages et les filtres rapides. Recherchez le nom d'une collection de films ou collez l'ID de collection TMDB. + Saisissez un ID ou une URL de personne TMDB pour créer une ligne à partir des crédits de casting. + Saisissez un ID ou une URL de personne TMDB pour créer une ligne à partir des crédits de réalisation. Créez une ligne TMDB dynamique avec des filtres optionnels. Laissez les champs vides si vous n'avez pas besoin de ce filtre. Liste publique TMDB ID de chaîne ID de collection + ID de personne Nom, ID ou URL de société de production ID ou URL TMDB https://www.themoviedb.org/list/8504994 ou 8504994 213 pour Netflix, 49 pour HBO, 2739 pour Disney+ 10 pour Star Wars Collection Marvel Studios, 420 ou URL de société + 31 pour Tom Hanks, ou URL de personne Exemples : Marvel Studios, 420 ou https://www.themoviedb.org/company/420. Exemple : Star Wars Collection, Harry Potter Collection ou une URL de collection. Exemples d'ID : Netflix 213, HBO 49, Disney+ 2739. Exemple : https://www.themoviedb.org/list/8504994 ou 8504994. + Exemple : https://www.themoviedb.org/person/31-tom-hanks ou 31. Titre affiché Affiché comme nom de ligne/onglet. Si vide, Nuvio en génère un depuis la source. Films Marvel, Originaux Netflix, Pixar + Films avec Tom Hanks, Acteurs favoris + Films de Christopher Nolan, Réalisateurs favoris Meilleurs films d'action, drames coréens, animation 2024 Résultats de recherche Collection TMDB @@ -180,6 +188,27 @@ Préréglages Rechercher Ajouter une source + Ajouter une liste Trakt + Modifier la liste Trakt + Listes Trakt + Liste Trakt + Rechercher un titre, URL Trakt ou ID de liste + Utilisez une URL publique de liste Trakt ou un ID numérique de liste, ou recherchez par nom. + Programme du week-end, Lauréats + Résultats de recherche + Listes tendances + Listes populaires + Ordre + Croissant + Décroissant + Ordre de la liste + Ajoutés récemment + Titre + Date de sortie + Durée + Populaire + Pourcentage + Votes Action Aventure Animation @@ -213,6 +242,7 @@ Disney+ Prime Video Hulu + Original Populaire Mieux notés Récent @@ -220,6 +250,8 @@ Collection de films TMDB Production Chaîne + Personne + Réalisateur Découverte TMDB Créez-en une pour organiser vos catalogues. Aucune collection @@ -251,7 +283,7 @@ Connectez-vous pour accéder à votre bibliothèque et votre progression Se connecter Inscrivez-vous pour synchroniser vos données entre appareils - S\'inscrire + S'inscrire Vos données seront uniquement stockées localement Regardez tout, partout Bon retour @@ -314,11 +346,11 @@ Ajouter un profil Effacer la recherche Découvrir - Les addons installés n'ont retourné aucun résultat de recherche valide. + Les addons installés n'ont renvoyé aucun résultat de recherche valide. La recherche a échoué Installez et validez au moins un addon avant de rechercher. - Aucun addon active - Les catalogues installés n'ont retourné aucun résultat pour cette requête. + Aucun addon actif + Les catalogues installés n'ont renvoyé aucun résultat pour cette requête. Aucun résultat trouvé Vos addons installés n'exposent pas de catalogue de recherche. Aucun catalogue de recherche @@ -448,7 +480,7 @@ Visible Lecteur, sous-titres et lecture automatique Rayon de carte - STYLE DE CARTE D\'AFFICHE + STYLE DE CARTE D'AFFICHE Largeur de carte Personnalisé Personnalisez la largeur de carte et le rayon des coins pour les cartes d'affiches partagées dans toute l'application. @@ -552,7 +584,7 @@ Notification de test Communauté Découvrez les personnes qui construisent et soutiennent Nuvio sur Mobile, TV et Web. - L\'API des supporters n'est pas configurée. Ajoutez DONATIONS_BASE_URL dans local.properties. + L'API des supporters n'est pas configurée. Ajoutez DONATIONS_BASE_URL dans local.properties. Contributeurs Supporters Ouvrir GitHub @@ -582,7 +614,7 @@ Nov Déc %1$s %2$s %3$s - Toutes les addons + Tous les addons Tous les plugins Addons autorisés Plugins autorisés @@ -628,7 +660,7 @@ Correspond au nom du stream, à l'étiquette, à la description, à l'addon et à l'URL. Modèle regex 4K|2160p|Remux - N\'importe quel 1080p+ + N'importe quel 1080p+ AVC / x264 Qualité BluRay Dolby Atmos / DTS @@ -665,8 +697,8 @@ Passer l'intro/outro/récap Afficher un bouton de saut lors des segments d'intro, d'outro et de récapitulatif détectés. Périmètre des sources - Toutes les addons - Considérer les streams de toutes les addons installés. + Tous les addons + Considérer les streams de tous les addons installés. Toutes les sources Considérer les streams des addons et des plugins. Plugins activés uniquement @@ -858,14 +890,14 @@ Oui Voulez-vous quitter l'application ? Quitter l'application - Ce catalogue n'a retourné aucun élément. + Ce catalogue n'a renvoyé aucun élément. Aucun titre trouvé Vérifiez votre connexion Wi‑Fi ou données mobiles et réessayez. Réalisateur Échec du chargement Plus comme ceci Saisons - Cet addon a retourné des vidéos pour la série, mais aucune n'incluait de numéros de saison ou d'épisode. + Cet addon a renvoyé des vidéos pour la série, mais aucune n'incluait de numéros de saison ou d'épisode. Cet addon n'a fourni aucune métadonnée d'épisode pour cette série. Cet addon n'a pas encore publié d'épisodes. Votre appareil est en ligne, mais Nuvio n'a pas pu se connecter aux serveurs nécessaires. @@ -875,11 +907,11 @@ Tous les genres Catalogue %1$s • %2$s - Le catalogue sélectionné n'a retourné aucun élément de découverte. + Le catalogue sélectionné n'a renvoyé aucun élément de découverte. Impossible de charger Découvrir Les addons installés n'exposent pas de catalogues compatibles avec le tableau pour Découvrir. Aucun catalogue de découverte - Le catalogue et les filtres sélectionnés n'ont retourné aucun élément. + Le catalogue et les filtres sélectionnés n'ont renvoyé aucun élément. Aucun titre trouvé Installez et validez au moins un addon avant d'explorer les catalogues dans Découvrir. Sélectionner un catalogue @@ -960,7 +992,7 @@ Sélectionnez un avatar pour ce profil. Configurer le verrouillage PIN Profil sans nom - Utiliser les addons principales + Utiliser les addons principaux Partager la configuration des addons du profil principal plutôt que de gérer une liste séparée. Qui regarde ? Téléchargé @@ -969,12 +1001,12 @@ Vérification d'autres addons… Copier le lien du stream Télécharger le fichier - Les addons de streams installés n'ont pas retourné de réponse valide. + Les addons de streams installés n'ont pas renvoyé de réponse valide. Impossible de charger les streams Installez d'abord un addon pour charger les streams de ce titre. Vos addons installés ne fournissent pas de streams pour ce type de titre. Aucun addon de streams disponible - Aucune de vos addons installés n'a retourné de streams pour ce titre. + Aucun de vos addons installés n'a renvoyé de stream pour ce titre. S%1$d E%2$d Épisode S%1$dE%2$d - %3$s @@ -1047,7 +1079,7 @@ Ce code PIN ne peut pas encore être vérifié hors ligne sur cet appareil. Connectez-vous une fois et déverrouillez-le en ligne d'abord. Impossible de définir le code PIN. Veuillez réessayer. Connectez-vous à Internet pour définir un code PIN. - Ce profil utilise les addons principales. + Ce profil utilise les addons principaux. Impossible de charger %1$s Source Intégré @@ -1058,7 +1090,7 @@ Réponse de jeton Trakt invalide Impossible de charger la bibliothèque Trakt Liste %1$d - Trakt n'a pas retourné de code d'autorisation + Trakt n'a pas renvoyé de code d'autorisation Identifiants Trakt manquants Impossible de charger la progression Trakt Impossible de terminer la connexion Trakt @@ -1071,11 +1103,12 @@ Lire %1$s Reprendre %1$s Le JSON est vide. - La collection %1$d a un ID vide. - La collection \'%1$s' a un titre vide. - Le dossier %1$d dans \'%2$s' a un ID vide. - Le dossier \'%1$s\' dans \'%2$s\' a un titre vide. - La source %1$d dans le dossier \'%2$s\' a des champs vides. + La collection '%1$d' a un ID vide. + La collection '%1$s' a un titre vide. + Le dossier '%1$d' dans '%2$s' a un ID vide. + Le dossier '%1$s' dans '%2$s' a un titre vide. + La source '%1$d' dans le dossier '%2$s' a des champs vides. + La source '%1$d' dans le dossier '%2$s' n'a pas d'ID de liste Trakt. JSON invalide : %1$s Addon introuvable : %1$s Janvier From 508ebe3cdc01f9264ccaff2e4793b5c725ac87c7 Mon Sep 17 00:00:00 2001 From: Marius Butz Date: Sun, 3 May 2026 12:13:24 +0200 Subject: [PATCH 076/143] add german strings --- .../composeResources/values-de/strings.xml | 1195 +++++++++++++++++ 1 file changed, 1195 insertions(+) create mode 100644 composeApp/src/commonMain/composeResources/values-de/strings.xml diff --git a/composeApp/src/commonMain/composeResources/values-de/strings.xml b/composeApp/src/commonMain/composeResources/values-de/strings.xml new file mode 100644 index 00000000..3900a44c --- /dev/null +++ b/composeApp/src/commonMain/composeResources/values-de/strings.xml @@ -0,0 +1,1195 @@ + + Anerkennung und Projekt-Credits öffnen + Zurück + Abbrechen + Schließen + Löschen + Fertig + Bearbeiten + Importieren + Weiter + OK + Abspielen + Zurück + Entfernen + Neu anordnen + Zurücksetzen + Fortsetzen + Erneut versuchen + Speichern + Wird installiert + Addons + Aktiv + %1$d Kataloge + Konfigurierbar + Wird aktualisiert + %1$d Ressourcen + Nicht verfügbar + Addon konfigurieren + Addon löschen + Füge eine Manifest-URL hinzu, um Kataloge, Metadaten, Streams oder Untertitel in Nuvio zu laden. + Noch keine Addons installiert. + Gib eine Addon-URL ein. + Addon-URL + Addon installieren + Manifest-Details werden geladen... + Manifest-URL wird geprüft und Addon-Details werden vor der Installation geladen. + Addon wird geprüft + Installation fehlgeschlagen + %1$s wurde erfolgreich geprüft und hinzugefügt. + Addon installiert + Addon nach unten verschieben + Addon nach oben verschieben + Aktiv + Addons + Kataloge + Addon aktualisieren + Addon hinzufügen + Installierte Addons + Übersicht + %1$d ID-Regeln + Version %1$s + Ausgewählt + JSON kopieren + %1$d Sammlung(en), %2$d Ordner + "%1$s" löschen? Dies kann nicht rückgängig gemacht werden. + Sammlung löschen + Katalog hinzufügen + Ordner hinzufügen + Alle Genres + Füge Kataloge aus deinen installierten Addons hinzu, um festzulegen, was dieser Ordner anzeigt. + Noch keine Katalogquellen + Auswählen + Emoji + Bild-URL + Keine + Cover + Sammlung erstellen + Fertig + Sammlung bearbeiten + Ordner bearbeiten + Lege Identität, Darstellung und Katalogquellen des Ordners mit derselben Struktur wie im Hauptsammlungs-Editor fest. + Füge einen hinzu, um zu beginnen. + Noch keine Ordner + Ordner + Genre-Filter + Nur das Cover-Bild anzeigen + Titel ausblenden + Neuer Ordner + Diese Sammlung über allen regulären Home-Katalogen anzeigen. Mehrere angeheftete Sammlungen folgen der Erstellungsreihenfolge. + Über Katalogen anheften + URL des Hintergrundbilds (optional) + Ordnername + URL des animierten GIFs (wird nur im Fokus abgespielt) + Name der Sammlung + Änderungen speichern + Speichern + Erscheinungsbild + Grundlagen + Katalogquellen + Wähle die Addon-Kataloge aus, die dieser Ordner zusammenfassen soll. + Kataloge auswählen + Genre auswählen + %1$d ausgewählt + %1$d Kataloge + %1$d ausgewählt + Poster + Quadratisch + Breit + Alle Kataloge in einem Tab kombinieren + \"Alle\"-Tab anzeigen + Wenn verfügbar, wird das konfigurierte GIF anstelle des statischen Covers abgespielt. + GIF anzeigen, wenn konfiguriert + %1$d Quelle(n) · %2$s + Kachelform + Reihen + Tabs + Ansichtsmodus + TMDB-Quellen + Öffentliche Liste + Produktion + Sender + Sammlung + Person + Regisseur + Benutzerdefiniert + Wähle eine vorgefertigte Quelle. Du kannst sie nach dem Hinzufügen bearbeiten oder entfernen. + Füge eine öffentliche TMDB-Listen-URL ein oder nur die Nummer aus der URL. + Suche nach einem Studionamen oder füge eine TMDB-Firmen-ID/-URL ein und füge sie direkt hinzu. + Gib eine Sender-ID ein. Gängige Sender sind in den Voreinstellungen und Schnellfiltern verfügbar. + Suche nach einem Filmsammlungsnamen oder füge die Sammlungs-ID von TMDB ein. + Gib eine TMDB-Personen-ID oder -URL ein, um eine Reihe aus Schauspieler-Credits zu erstellen. + Gib eine TMDB-Personen-ID oder -URL ein, um eine Reihe aus Regie-Credits zu erstellen. + Erstelle eine Live-TMDB-Reihe mit optionalen Filtern. Lass Felder leer, wenn du diesen Filter nicht benötigst. + Öffentliche TMDB-Liste + Sender-ID + Sammlungs-ID + Personen-ID + Produktionsfirmenname, ID oder URL + TMDB-ID oder -URL + https://www.themoviedb.org/list/8504994 oder 8504994 + 213 für Netflix, 49 für HBO, 2739 für Disney+ + 10 für Star-Wars-Sammlung + Marvel Studios, 420 oder Firmen-URL + 31 für Tom Hanks oder Personen-URL + Beispiele: Marvel Studios, 420 oder https://www.themoviedb.org/company/420. + Beispiel: Star Wars Collection, Harry Potter Collection oder eine Sammlungs-URL. + Beispiel-IDs: Netflix 213, HBO 49, Disney+ 2739. + Beispiel: https://www.themoviedb.org/list/8504994 oder 8504994. + Beispiel: https://www.themoviedb.org/person/31-tom-hanks oder 31. + Anzeigetitel + Wird als Reihen-/Tab-Name angezeigt. Wenn leer, erstellt Nuvio einen aus der Quelle. + Marvel-Filme, Netflix Originals, Pixar + Tom-Hanks-Filme, Lieblingsschauspieler + Christopher-Nolan-Filme, Lieblingsregisseure + Beste Actionfilme, Koreanische Dramen, Animation 2024 + Suchergebnisse + TMDB-Sammlung + TMDB-Firma %1$d + TMDB-Sammlung %1$d + Typ + Filme + Serien + Beides + Sortieren + Filter + Lass Felder leer, wenn du diesen Filter nicht benötigst. + Schnell-Genres + Schnell-Sprachen + Schnell-Länder + Schnell-Stichwörter + Schnell-Studios + Schnell-Sender + Genre-IDs + Verwende TMDB-Genrenummern. Trenne mehrere mit Kommas für UND oder mit senkrechten Strichen für ODER. + Erscheinungs- oder Ausstrahlungsdatum von + Erscheinungs- oder Ausstrahlungsdatum bis + Verwende JJJJ-MM-TT, zum Beispiel 2024-01-01. + Mindestbewertung + Maximalbewertung + TMDB-Bewertung von 0 bis 10. Beispiel: 7.0. + Mindeststimmen + Verwende dies, um obskure Titel mit wenigen Stimmen zu vermeiden. Beispiel: 100. + Originalsprache + Verwende zweistellige Sprachcodes, zum Beispiel en, ko, ja, hi. + Herkunftsland + Verwende zweistellige Ländercodes, zum Beispiel US, KR, JP, IN. + Stichwort-IDs + Verwende TMDB-Stichwortnummern. Schnell-Chips füllen gängige Beispiele aus. + 9715 für Superheld + Firmen-IDs + Verwende Studio-/Firmen-IDs. Schnell-Chips füllen gängige Beispiele aus. + 420 für Marvel Studios + Sender-IDs + Nur für Serien. Verwende Sender-IDs wie Netflix 213 oder HBO 49. + 213 für Netflix + Jahr + Verwende eine vierstellige Jahreszahl, zum Beispiel 2024. + Voreinstellungen + Suchen + Quelle hinzufügen + Trakt-Liste hinzufügen + Trakt-Liste bearbeiten + Trakt-Listen + Trakt-Liste + Titel, Trakt-URL oder Listen-ID suchen + Verwende eine öffentliche Trakt-Listen-URL oder eine numerische Listen-ID, oder suche nach Namen. + Wochenend-Watch, Preisträger + Suchergebnisse + Angesagte Listen + Beliebte Listen + Richtung + Aufsteigend + Absteigend + Listenreihenfolge + Kürzlich hinzugefügt + Titel + Veröffentlicht + Laufzeit + Beliebt + Prozentsatz + Stimmen + Action + Abenteuer + Animation + Komödie + Horror + Sci-Fi + Drama + Krimi + Reality + Englisch + Koreanisch + Japanisch + Hindi + Spanisch + Vereinigte Staaten + Korea + Japan + Indien + Vereinigtes Königreich + Superheld + Nach einem Roman + Zeitreise + Weltraum + Marvel + Disney + Pixar + Lucasfilm + Warner Bros. + Netflix + HBO + Disney+ + Prime Video + Hulu + Original + Beliebt + Bestbewertet + Aktuell + TMDB-Liste + TMDB-Filmsammlung + Produktion + Sender + Person + Regisseur + TMDB Discover + Erstelle eine, um deine Kataloge zu organisieren. + Noch keine Sammlungen + %1$d Ordner + Keine Einträge gefunden + Ordner nicht gefunden + Sammlungen + Sammlungen importieren + JSON + Füge unten dein Sammlungs-JSON ein. + Importieren + Neue Sammlung + Angeheftet + Alle + Deine Sammlungen + Mit ❤️ erstellt von Tapframe und Freunden + Version %1$s (%2$s) + Aus + Ein + Pause + Neu laden + Hast du bereits ein Konto? + Ohne Konto fortfahren + Konto erstellen + Du hast kein Konto? + E-Mail + oder + Passwort + Melde dich an, um auf deine Bibliothek und Fortschritt zuzugreifen + Anmelden + Registriere dich, um deine Daten geräteübergreifend zu synchronisieren + Registrieren + Deine Daten werden nur lokal gespeichert + Streame alles, überall + Willkommen zurück + Bibliothek + Trakt-Bibliothek + Start + Bibliothek + Profil + Suche + Tonspuren + Audio + Integriert + Unterer Versatz + Player schließen + Farbe + Wird gerade abgespielt + E%1$d + S%1$dE%2$d + S%1$dE%2$d • %3$s + Episoden + Schriftgröße + %1$dsp + Player-Steuerung sperren + Keine Tonspuren verfügbar + Keine Episoden verfügbar + Keine Streams gefunden + Keine + Umriss + Episoden + Quellen + Streams + Wiedergabefehler + Wird abgespielt + Tippen, um Untertitel zu laden + Zurück + Standard wiederherstellen + Ausfüllen + Anpassen + Zoom + 10 Sekunden zurückspulen + -%1$ds + +%1$ds + -%1$ds + +%1$ds + 10 Sekunden vorspulen + Quellen + Stil + UT + Untertitel + Helligkeit %1$s + Lautstärke %1$s + Stumm + Heruntergeladen + Läuft + TBA + Zum Entsperren tippen + Spur %1$d + Player-Steuerung entsperren + Du schaust gerade + Profil hinzufügen + Suche löschen + Entdecken + Installierte Addons konnten keine gültigen Suchergebnisse zurückgeben. + Suche fehlgeschlagen + Installiere und überprüfe vor der Suche mindestens ein Addon. + Keine aktiven Addons + Installierte durchsuchbare Kataloge haben keine Treffer für diese Suchanfrage zurückgegeben. + Keine Ergebnisse gefunden + Deine installierten Addons bieten keine Katalogsuche an. + Keine durchsuchbaren Kataloge + Filme, Serien suchen... + Letzte Suchen + Letzte Suche entfernen + Über + Allgemein + Konto + Addons + Erscheinungsbild + Inhalte & Entdeckung + Weiterschauen + Startbildschirm + Integrationen + MDBList-Bewertungen + Meta-Bildschirm + Benachrichtigungen + Wiedergabe + Plugins + Poster-Anpassung + Einstellungen + Unterstützer & Mitwirkende + TMDB-Anreicherung + Trakt + ÜBER + Verwalte dein Konto, melde dich ab oder lösche es. + KONTO + Passe Startseiten-Darstellung und visuelle Einstellungen an. + Suche nach neuen Versionen der App. + Nach Updates suchen + Verwalte Addons und Entdeckungsquellen. + Verwalte deine heruntergeladenen Filme und Episoden. + Downloads + ALLGEMEIN + TMDB- und MDBList-Dienste verbinden. + Verwalte Episode-Release-Benachrichtigungen und sende eine Test-Benachrichtigung. + Zu einem anderen Profil wechseln. + Profil wechseln + Trakt verbinden, Watchlist-Listen synchronisieren und Titel direkt in Trakt speichern. + Deine Trakt-Listen werden geladen… + Wähle, wo dieser Titel auf Trakt gespeichert werden soll + Spenden + Zu Details + Entfernen + Von Anfang an starten + Abspielen + %1$d/10 + Rezension + Spoiler + Noch keine Trakt-Rezensionen verfügbar. + %1$d Likes + Dieser Kommentar enthält Spoiler. + Dieser Kommentar enthält Spoiler und wurde ausgeblendet. + Kommentare + Trailer + %1$s (%2$d) + Trailer + Keine abgeschlossenen Episoden + Noch keine Downloads + %1$d heruntergeladene Episode(n) + Aktiv + Filme + Serien + Downloads anzeigen + Abgeschlossen • %1$s + Wird heruntergeladen • %1$s + Fehlgeschlagen + Pausiert • %1$s + Gesehen + Staffel %1$d + Specials + Da fortfahren, wo du aufgehört hast + Zur Bibliothek hinzufügen + Als ungesehen markieren + Als gesehen markieren + Aus Bibliothek entfernen + Alle anzeigen + Manuell abspielen + %1$s-Logo + Konto + Konto löschen + Damit werden dein Konto und alle zugehörigen Daten dauerhaft gelöscht. + Diese Aktion kann nicht rückgängig gemacht werden. Alle deine Daten, Profile und Sync-Verläufe werden dauerhaft entfernt. + Konto löschen? + E-Mail + Nicht angemeldet + Abmelden + Du wirst zum Anmeldebildschirm zurückgeleitet. + Abmelden? + Status + Anonym + Angemeldet + AMOLED-Schwarz + Reines Schwarz für OLED-Bildschirme verwenden. + App-Sprache + Sprache wählen + Anzeigen, ausblenden und gestalten der Weiterschauen-Reihe. + Voreinstellungen für gemeinsame Posterkartenbreite und Eckenradius anpassen. + ANZEIGE + START + DESIGN + Sammlung • %1$s + Anzeigename + Installiere ein Addon mit Board-kompatiblen Katalogen, um die Reihen des Startbildschirms zu konfigurieren. + Keine Start-Kataloge + Hero-Quelle + Ausgeblendet + Start fokussiert halten + %1$s • Limit erreicht (max. %2$d) + Keine Hero-Quellen ausgewählt + Nicht im Hero + Anheften aus der Sammlung entfernen, um zu verschieben + Angeheftet + Oben angeheftet + Neu anordnen + KATALOGE + KATALOGE & SAMMLUNGEN + SAMMLUNGEN + HERO + HERO-QUELLEN + %1$d von %2$d ausgewählt + Hero anzeigen + Ein Hero-Karussell oben auf der Startseite anzeigen. Wähle unten bis zu 2 Quellkataloge. + %1$d von %2$d Katalogen sichtbar • %3$d Hero-Quellen ausgewählt + Öffne einen Katalog nur, wenn du ihn umbenennen oder neu anordnen möchtest. + Sichtbar + Player, Untertitel und automatische Wiedergabe + Karten-Radius + POSTERKARTEN-STIL + Karten-Breite + Benutzerdefiniert + Passe Kartenbreite und Eckenradius für gemeinsame Posterkarten in der gesamten App an. + Beschriftungen ausblenden + Querformat für Regalposter + Live-Vorschau + %1$s (%2$s) + Eckenradius: %1$ddp + Höhe: %1$ddp + Breite: %1$ddp + Klassisch + Pille + Abgerundet + Scharf + Dezent + Ausgewogen + Komfort + Kompakt + Dicht + Groß + Standard + Beim Öffnen der App nach dem Verlassen des Players ein Popup anzeigen, um dort fortzusetzen, wo du aufgehört hast. + Fortsetzen-Aufforderung beim Start + KARTENSTIL + BEIM START + VERHALTEN „ALS NÄCHSTES“ + SICHTBARKEIT + Die Weiterschauen-Reihe auf dem Startbildschirm anzeigen. + Weiterschauen anzeigen + Poster + Posterkarte mit Artwork zuerst + Breit + Informationsdichte horizontale Karte + Wenn aktiviert, fährt „Als Nächstes“ immer mit der am weitesten gesehenen Episode fort. Wenn deaktiviert, folgt es der zuletzt gesehenen Episode. Nützlich, wenn du frühere Episoden erneut anschaust. + „Als Nächstes“ ab letzter Episode + START + QUELLEN + Installiere, entferne, aktualisiere und sortiere deine Inhaltsquellen. + Installiere JavaScript-Scraper-Repositories und teste Anbieter intern. + Lege fest, welche Kataloge auf der Startseite und in welcher Reihenfolge erscheinen. + Detail-Abschnitte deaktivieren und alles unterhalb des Hero neu anordnen. + Erstelle benutzerdefinierte Katalog-Gruppierungen mit Ordnern, die auf der Startseite angezeigt werden. + INTEGRATIONEN + Erweitere Detailseiten mit TMDB-Artwork, Credits, Episoden-Metadaten und mehr. + Füge IMDb, Rotten Tomatoes, Metacritic und andere externe Bewertungen zu Detailseiten hinzu. + Füge unten deinen MDBList-API-Schlüssel hinzu, bevor du Bewertungen aktivierst. + Hole dir einen Schlüssel unter https://mdblist.com/preferences und füge ihn hier ein. + API-Schlüssel + MDBList-API-Schlüssel + MDBList-Bewertungen aktivieren + Externe Bewertungen von MDBList auf Metadatenseiten anzeigen, wenn eine IMDb-ID verfügbar ist. + API-SCHLÜSSEL + BEWERTUNGSANBIETER + MDBLIST + Aktionen + Wiedergabe- und Speichersteuerung. + Besetzung + Hauptbesetzungsliste. + Kinematischer Hintergrund + Verschwommener Backdrop hinter dem Inhalt, ähnlich dem Stream-Bildschirm. + Sammlung + Reihe für verwandte Sammlung oder Franchise. + Kommentare + Trakt-Kommentar-Bereich. + Details + Laufzeit, Status, Veröffentlichung, Sprache und verwandte Infos. + Episoden-Karten + Wähle, wie Episoden auf dem Metadaten-Bildschirm dargestellt werden. + Horizontal + Reihenkarten im Backdrop-Stil + Liste + Detailorientierte gestapelte Karten + Episoden + Staffeln und Episodenliste für Serien. + Gruppe %1$d + Mehr davon + Empfehlungs-Reihe. + Keine + Übersicht + Synopsis, Bewertungen, Genres und wichtigste Credits. + Produktion + Studios und Sender. + ERSCHEINUNGSBILD + ABSCHNITTE + Tab-Gruppe %1$d + Tab-Layout + Abschnitte wie in der TV-App in Tabs gruppieren. Weise bis zu 3 Abschnitte pro Tab-Gruppe zu. + Trailer + Trailer-Reihe und Wiedergabe-Verknüpfungen. + Benachrichtigungen sind in Nuvio derzeit deaktiviert. + Episode-Release-Benachrichtigungen + Lokale Benachrichtigungen planen, wenn eine neue Episode für eine gespeicherte Serie verfügbar wird. + System-Benachrichtigungen sind für Nuvio deaktiviert. Aktiviere sie, um Benachrichtigungen und Tests zu erhalten. + %1$d Release-Benachrichtigungen sind derzeit auf diesem Gerät geplant. + BENACHRICHTIGUNGEN + TEST + Test-Benachrichtigung senden + Test-Benachrichtigung wird gesendet... + Lokale Test-Benachrichtigung für %1$s senden. + Speichere zuerst eine Serie in deiner Bibliothek, um Benachrichtigungen zu testen. + Test-Benachrichtigung + Community + Sieh dir die Menschen an, die Nuvio auf Mobile, TV und Web entwickeln und unterstützen. + Supporters-API ist nicht konfiguriert. Füge DONATIONS_BASE_URL zu local.properties hinzu. + Mitwirkende + Unterstützer + GitHub öffnen + GitHub-Profil nicht verfügbar + Keine Nachricht angehängt. + Mitwirkende werden geladen... + Unterstützer werden geladen... + Mitwirkende konnten nicht geladen werden + Unterstützer konnten nicht geladen werden + Keine Mitwirkenden gefunden. + Keine Unterstützer gefunden. + Mitwirkende können nicht geladen werden. + Unterstützer können nicht geladen werden. + Mitwirkende können momentan nicht geladen werden. + Unterstützer können momentan nicht geladen werden. + %1$d Commits insgesamt + Jan + Feb + Mär + Apr + Mai + Jun + Jul + Aug + Sep + Okt + Nov + Dez + %1$s %2$s, %3$s + Alle Addons + Alle Plugins + Erlaubte Addons + Erlaubte Plugins + Anime Skip + AnimeSkip-Client-ID + Gib deine AnimeSkip-API-Client-ID ein. Erhältlich unter anime-skip.com. + Auch AnimeSkip nach Skip-Zeitstempeln durchsuchen (erfordert Client-ID). + Nächste Episode automatisch abspielen + Automatisch die nächste Episode finden und abspielen, wenn der Schwellenwert erreicht ist. + Nur Gerät + App bevorzugen (FFmpeg) + Gerät bevorzugen + Decoder-Priorität + Außerhalb tippen, um zu schließen + Außerhalb tippen, um zu speichern & zu schließen + %1$d Tag + %1$d Tage + %1$d Stunde + %1$d Stunden + libass aktivieren + libass für ASS/SSA-Untertitel-Rendering anstelle des Standard-Renderers verwenden. + Halte-Geschwindigkeit + Halten zum Beschleunigen + Halte irgendwo auf der Player-Oberfläche gedrückt, um die Wiedergabegeschwindigkeit vorübergehend zu erhöhen. + Ungültiges Regex-Muster + Cache-Dauer des letzten Links + DV7 zu HEVC umwandeln + Dolby Vision Profil 7 zu HEVC-Fallback für nicht unterstützte Geräte. + Minuten vor Ende + Karte für nächste Episode so viele Minuten vor dem Ende anzeigen. + %1$d Min. + Keine Einträge verfügbar + Nicht festgelegt + Standard + Gerätesprache + Erzwungen + Keine + Binge-Gruppe bevorzugen + Bei automatischer Wiedergabe einen Stream aus derselben Binge-Gruppe wie den aktuellen bevorzugen. + Bevorzugte Audiosprache + Bevorzugte Untertitelsprache + Voreinstellungen + Stimmt mit Stream-Name, Bezeichnung, Beschreibung, Addon und URL überein. + Regex-Muster + 4K|2160p|Remux + Beliebig 1080p+ + AVC / x264 + BluRay-Qualität + Dolby Atmos / DTS + Englisch + HDR / Dolby Vision + HEVC / x265 + Kein CAM/TS + Kein REMUX/HDR + 1080p Standard + 4K / Remux + 720p / Kleiner + WEB-Quellen + Render-Typ + Standard (Cues) + Effekte Canvas + Effekte OpenGL + Overlay Canvas + Overlay OpenGL + Letzten Link wiederverwenden + Den letzten funktionierenden Stream für denselben Film/dieselbe Episode automatisch abspielen, solange der Cache gültig ist. + Zweite Audiosprache + Zweite Untertitelsprache + DECODER + NÄCHSTE EPISODE + PLAYER + ÜBERSPRINGEN-SEGMENTE + STREAM-AUTOPLAY + STREAM-AUSWAHL + UNTERTITEL UND AUDIO + UNTERTITEL-RENDERING + %1$d ausgewählt + Lade-Overlay anzeigen + Das einleitende Lade-Overlay anzeigen, während ein Stream startet. + Intro/Outro/Rückblick überspringen + Skip-Schaltfläche bei erkannten Intro-, Outro- und Rückblick-Segmenten anzeigen. + Quellbereich + Alle Addons + Streams aus allen installierten Addons berücksichtigen. + Alle Quellen + Streams aus Addons und Plugins berücksichtigen. + Nur aktivierte Plugins + Nur Streams aus aktivierten Plugins berücksichtigen. + Nur installierte Addons + Nur Streams aus installierten Addons berücksichtigen. + Stream-Auswahlmodus + Ersten verfügbaren Stream + Den ersten gefundenen Stream automatisch abspielen. + Manuell + Streams jedes Mal manuell auswählen. + Regex-Übereinstimmung + Automatisch einen Stream auswählen, der einem Regex-Muster entspricht. + Stream-Timeout + Wie lange auf Streams gewartet wird, bevor automatisch ausgewählt wird. + Minuten vor Ende + Schwellenwert-Modus + Minuten vor Ende + Prozent + Schwellenwert in Prozent + Karte für nächste Episode anzeigen, wenn die Wiedergabe diesen Prozentsatz erreicht. + %1$d% + Sofort + %1$ds + Unbegrenzt + Tunneled-Wiedergabe + Tunneled-Wiedergabe für niedrigere Latenz bei Audio-/Video-Synchronisation aktivieren. + Füge unten deinen eigenen TMDB-API-Schlüssel hinzu, bevor du die Anreicherung aktivierst. + TMDB-API-Schlüssel + TMDB-Anreicherung aktivieren + Verwende deinen TMDB-API-Schlüssel, um Addon-Metadaten auf dem Detail-Bildschirm anzureichern, wenn eine TMDB- oder IMDb-ID verfügbar ist. + Gib deinen TMDB-v3-API-Schlüssel ein. + Sprachcode + Artwork + Backdrop, Poster und Logo durch TMDB-Artwork ersetzen. + Grundinfos + TMDB-Titel, -Synopsis, -Genres und -Bewertung verwenden. + Sammlungen + Franchise- und Sammlungsreihen für Filme anzeigen, wenn TMDB sie bereitstellt. + Credits + TMDB-Schöpfer, -Regisseure, -Drehbuchautoren und -Besetzungsfotos verwenden. + Details + TMDB-Veröffentlichungsinfos, Laufzeit, Altersfreigabe, Status, Land und Sprache verwenden. + Episoden + TMDB-Episodentitel, -Thumbnails, -Beschreibungen und -Laufzeiten für Serien verwenden. + Mehr davon + TMDB-Empfehlungen am Ende der Detailseiten anzeigen. + Sender + TMDB-Sender-Metadaten für TV-Titel verwenden. + Produktionsfirmen + TMDB-Produktionsfirmen-Metadaten auf dem Detail-Bildschirm verwenden. + Staffel-Poster + TMDB-Staffel-Poster im Staffel-Auswahl-Bildschirm der Metadaten für Serien verwenden. + Trailer + TMDB-Trailer-Videos auf Detailseiten abrufen und anzeigen. + Persönlicher API-Schlüssel + Bevorzugte Sprache + Lege den TMDB-Sprachcode für lokalisierte Metadaten fest, zum Beispiel `de`, `de-DE` oder `en-US`. + ANMELDEDATEN + LOKALISIERUNG + MODULE + TMDB + Nach der Genehmigung wirst du automatisch zurückgeleitet. + AUTHENTIFIZIERUNG + Kommentare + Trakt-Kommentare auf Film- und Serien-Details anzeigen + Trakt verbinden + Verbunden als %1$s + Trakt-Benutzer + Trennen + Browser konnte nicht geöffnet werden + FUNKTIONEN + Trakt-Anmeldung in deinem Browser abschließen + Verfolge, was du anschaust, speichere in der Watchlist oder in benutzerdefinierten Listen und halte deine Bibliothek mit Trakt synchron. + Fehlende Trakt-Anmeldedaten in local.properties (TRAKT_CLIENT_ID / TRAKT_CLIENT_SECRET). + Trakt-Login öffnen + Deine Speichern-Aktionen können jetzt auf Trakt-Watchlist und persönliche Listen abzielen. + Mit Trakt anmelden, um listenbasiertes Speichern und Trakt-Bibliotheksmodus zu aktivieren. + Publikumsbewertung + IMDb + Letterboxd + Metacritic + Rotten Tomatoes + TMDB + Trakt + Unbekannt + Bernstein + Karminrot + Smaragd + Ozean + Rose + Violett + Weiß + Nächste Episode + Quelle wird gesucht… + Abspielen über %1$s in %2$d… + Thumbnail der nächsten Episode + Noch nicht ausgestrahlt + Überspringen + Intro überspringen + Outro überspringen + Rückblick überspringen + Keine Untertitel gefunden + Afrikaans + Albanisch + Amharisch + Arabisch + Armenisch + Aserbaidschanisch + Baskisch + Weißrussisch + Bengalisch + Bosnisch + Bulgarisch + Birmanisch + Katalanisch + Chinesisch + Chinesisch (vereinfacht) + Chinesisch (traditionell) + Kroatisch + Tschechisch + Dänisch + Niederländisch + Englisch + Estnisch + Filipino + Finnisch + Französisch + Galicisch + Georgisch + Deutsch + Griechisch + Gujarati + Hebräisch + Hindi + Ungarisch + Isländisch + Indonesisch + Irisch + Italienisch + Japanisch + Kannada + Kasachisch + Khmer + Koreanisch + Laotisch + Lettisch + Litauisch + Mazedonisch + Malaiisch + Malayalam + Maltesisch + Marathi + Mongolisch + Nepalesisch + Norwegisch + Persisch + Polnisch + Portugiesisch (Portugal) + Portugiesisch (Brasilien) + Punjabi + Rumänisch + Russisch + Serbisch + Singhalesisch + Slowakisch + Slowenisch + Spanisch + Spanisch (Lateinamerika) + Swahili + Schwedisch + Tamil + Telugu + Thailändisch + Türkisch + Ukrainisch + Urdu + Usbekisch + Vietnamesisch + Walisisch + Zulu + Löschen + Fortfahren + Ignorieren + Installieren + Später + Nein + Aktualisieren + Ja + Möchtest du die App verlassen? + App verlassen + Dieser Katalog hat keine Einträge zurückgegeben. + Keine Titel gefunden + Überprüfe deine WLAN- oder Mobilfunkverbindung und versuche es erneut. + Regisseur + Laden fehlgeschlagen + Mehr davon + Staffeln + Dieses Addon hat Videos für die Serie zurückgegeben, aber keines enthielt Staffel- oder Episodennummern. + Dieses Addon hat keine Episoden-Metadaten für diese Serie bereitgestellt. + Episoden wurden von diesem Addon noch nicht veröffentlicht. + Dein Gerät ist online, aber Nuvio konnte die erforderlichen Server nicht erreichen. + Weniger anzeigen + Mehr anzeigen ▾ + Drehbuchautor + Alle Genres + Katalog + %1$s • %2$s + Der ausgewählte Katalog konnte keine Discover-Einträge zurückgeben. + Discover konnte nicht geladen werden + Installierte Addons bieten keine Board-kompatiblen Kataloge für Discover. + Keine Discover-Kataloge + Der ausgewählte Katalog und die Filter haben keine Einträge zurückgegeben. + Keine Titel gefunden + Installiere und überprüfe mindestens ein Addon, bevor du Discover-Kataloge durchsuchst. + Katalog auswählen + Genre auswählen + Typ auswählen + Typ + Vorherige als ungesehen markieren + Vorherige als gesehen markieren + %1$s als ungesehen markieren + %1$s als gesehen markieren + Als ungesehen markieren + Als gesehen markieren + Als Nächstes + %1$s gesehen + Installiere und überprüfe mindestens ein Addon, bevor Katalogreihen auf der Startseite geladen werden. + Installierte Addons bieten derzeit keine Board-kompatiblen Kataloge ohne erforderliche Extras. + Keine Startreihen verfügbar + Details ansehen + Wiedergabe- und Speichersteuerung. + Aktionen + Hauptbesetzungsliste. + Reihe für verwandte Sammlung oder Franchise. + Sammlung + Trakt-Kommentar-Bereich. + Laufzeit, Status, Veröffentlichung, Sprache und verwandte Infos. + Details + Staffeln und Episodenliste für Serien. + Empfehlungs-Reihe. + Mehr davon + Synopsis, Bewertungen, Genres und wichtigste Credits. + Übersicht + Studios und Sender. + Produktion + Trailer-Reihe und Wiedergabe-Verknüpfungen. + Wieder online + Server nicht erreichbar + Keine Internetverbindung + (%1$d Jahre) + Geboren am %1$s%2$s + Gestorben am %1$s + Bekannt für: %1$s + Neueste + Details für %1$s konnten nicht geladen werden + Beliebt + Etwas ist schiefgelaufen + Demnächst + Rücktaste + Abbrechen + PIN eingeben + PIN für %1$s eingeben + PIN vergessen? + Falsche PIN + Gesperrt. Versuche es in %1$ds erneut + Avatar-Optionen erscheinen hier, wenn der Katalog geladen wird. + Avatar: %1$s + Avatar auswählen + Wähle unten einen Avatar. + Profil erstellen + Alle Daten für "%1$s" werden dauerhaft gelöscht. + Profil löschen + Profil hinzufügen + Profil bearbeiten + Aktuelle PIN eingeben + Neue PIN eingeben + Profil %1$d + Avatare werden geladen... + Profile verwalten + Profilname + Neues Profil + Primäre Addons aus + Primäre Addons ein + PIN für %1$s entfernen + PIN-Sperre entfernen + Wird gespeichert... + Sicherheit + Füge eine PIN hinzu, wenn dieses Profil vor dem Wechsel gesperrt sein soll. + Dieses Profil ist mit einer PIN geschützt. + Wähle einen Avatar für dieses Profil. + PIN-Sperre einrichten + Unbenanntes Profil + Primäre Addons verwenden + Das Addon-Setup des Hauptprofils mitverwenden, statt eine separate Liste zu pflegen. + Wer schaut? + Heruntergeladen + Fortsetzen + Aktive Scraper + Weitere Addons werden geprüft… + Stream-Link kopieren + Datei herunterladen + Die installierten Stream-Addons konnten keine gültige Stream-Antwort zurückgeben. + Streams konnten nicht geladen werden + Installiere zuerst ein Addon, um Streams für diesen Titel zu laden. + Deine installierten Addons bieten keine Streams für diesen Titeltyp. + Kein Stream-Addon verfügbar + Keines deiner installierten Addons hat Streams für diesen Titel zurückgegeben. + S%1$d E%2$d + Episode + S%1$dE%2$d - %3$s + Wird abgerufen… + Quelle wird gesucht… + Streams werden gesucht… + Stream-Link kopiert + Kein direkter Stream-Link verfügbar + Keine Metadaten verfügbar + Streams aktualisieren + Fortsetzen ab %1$d% + Fortsetzen ab %1$s + GRÖSSE %1$s + Trailer schließen + Trailer kann nicht abgespielt werden + Trakt-Listen konnten nicht geladen werden + Trakt-Listen konnten nicht aktualisiert werden + %1$s • %2$s + Update-Prüfung fehlgeschlagen + Download fehlgeschlagen + Wird heruntergeladen %1$d% + Installation kann nicht gestartet werden + Du verwendest die neueste Version. + Aktiviere App-Installationen für Nuvio und komm dann zurück, um fortzufahren. + Update wird heruntergeladen... + Keine Updates gefunden. + Eine neue Version ist bereit zur Installation. + In-App-Updates sind in diesem Build nicht verfügbar. + Download wird vorbereitet + Versionshinweise + Installationen erlauben, um fortzufahren + Update verfügbar + Update-Status + Dieses Addon ist bereits installiert. + Gib eine gültige Addon-URL ein + Manifest konnte nicht geladen werden + Nuvio + Kontolöschung fehlgeschlagen + Anmeldung fehlgeschlagen + Abmeldung fehlgeschlagen + Registrierung fehlgeschlagen + Katalogeinträge können nicht geladen werden. + Als Nächstes + Als Nächstes • S%1$dE%2$d + %1$s-Logo + Kommentare konnten nicht geladen werden + Details konnten von keinem Addon geladen werden. + Sender + Kein Addon liefert Metadaten für diesen Inhalt. + Download fehlgeschlagen + Zeigt Live-Download-Fortschritt und -Steuerung an. + Downloads + Download abgeschlossen + Wird heruntergeladen %1$s • %2$s + Wird heruntergeladen %1$s • %2$s / %3$s + Download fehlgeschlagen + Pausiert %1$s + Entfernen + %1$s aus deiner Bibliothek entfernen? + Aus Bibliothek entfernen? + Film + Benachrichtigungen, wenn eine neue Episode einer gespeicherten Serie veröffentlicht wird. + Vorschau einer Episoden-Release-Benachrichtigung. + Test-Benachrichtigung konnte nicht gesendet werden. + Test-Benachrichtigung für %1$s gesendet. + Dieser Stream kann nicht abgespielt werden. + Diese Profil-PIN wurde geändert. Verbinde dich einmal, um die Sperre auf diesem Gerät zu aktualisieren. + PIN-Sperre konnte nicht entfernt werden. Versuche es erneut. + Verbinde dich mit dem Internet, um die PIN-Sperre zu entfernen. + Diese PIN kann auf diesem Gerät noch nicht offline überprüft werden. Verbinde dich einmal und entsperre sie zuerst online. + PIN konnte nicht gesetzt werden. Versuche es erneut. + Verbinde dich mit dem Internet, um eine PIN festzulegen. + Dieses Profil verwendet primäre Addons. + %1$s konnte nicht geladen werden + Stream + Eingebettet + Autorisierung verweigert + Trakt-Anmeldung in deinem Browser abschließen + Ungültiger Trakt-Callback + Ungültiger Trakt-Callback-Status + Ungültige Trakt-Token-Antwort + Trakt-Bibliothek konnte nicht geladen werden + Liste %1$d + Trakt hat keinen Autorisierungscode zurückgegeben + Fehlende Trakt-Anmeldedaten + Trakt-Fortschritt konnte nicht geladen werden + Trakt-Anmeldung konnte nicht abgeschlossen werden + Trakt-Benutzer + Watchlist + Trailer + Unbekannt + Addon + Gespeichert + %1$s abspielen + %1$s fortsetzen + JSON ist leer. + Sammlung %1$d hat eine leere ID. + Sammlung '%1$s' hat einen leeren Titel. + Ordner %1$d in '%2$s' hat eine leere ID. + Ordner '%1$s' in '%2$s' hat einen leeren Titel. + Quelle %1$d in Ordner '%2$s' hat leere Felder. + Quelle %1$d in Ordner '%2$s' fehlt eine Trakt-Listen-ID. + Ungültiges JSON: %1$s + Addon nicht gefunden: %1$s + Januar + Februar + März + April + Mai + Juni + Juli + August + September + Oktober + November + Dezember + Jan + Feb + Mär + Apr + Mai + Jun + Jul + Aug + Sep + Okt + Nov + Dez + Produktionsfirma + Sender + %1$s konnte nicht geladen werden + Beliebt + Aktuell + %1$s • %2$s + Bestbewertet + Altersfreigabe + Filmdetails + Originalsprache + Herkunftsland + Veröffentlichungsinfo + Laufzeit + Poster + Text + Seriendetails + Status + Videos + DATEI + Kein direkter Stream-Link verfügbar + Vorherigen Download ersetzt + Download gestartet + Nicht unterstütztes Stream-Format für Downloads + Leerer Antwortinhalt + Anfrage mit HTTP %1$d fehlgeschlagen + Download-System ist nicht initialisiert + Download-Anfrage fehlgeschlagen + %1$s - %2$s + Gespeicherte Titel erscheinen hier, nachdem du auf einer Detailseite auf Speichern getippt hast. + Deine Bibliothek ist leer + Bibliothek konnte nicht geladen werden + Andere + Bibliothek + Verbinde Trakt und speichere Titel in deiner Watchlist oder in persönlichen Listen. + Deine Trakt-Bibliothek ist leer + Trakt-Bibliothek konnte nicht geladen werden + Trakt-Bibliothek + Anime + Kanäle + Filme + Serien + TV + %1$s ist jetzt verfügbar + %1$s • %2$s ist jetzt verfügbar + Eine neue Episode ist jetzt verfügbar + %1$s ist jetzt verfügbar + Episoden-Veröffentlichungen + Creator + Regisseur + Drehbuchautor + Publikumsbewertung + Kein abspielbarer Trailer-Stream gefunden. + Staffel %1$d - %2$s + B + KB + MB + GB + From d64faa692f3a939e1fef376e2681aee7a15a4c1d Mon Sep 17 00:00:00 2001 From: Marius Butz Date: Sun, 3 May 2026 12:13:41 +0200 Subject: [PATCH 077/143] add german to language picker --- composeApp/src/androidMain/res/xml/locale_config.xml | 1 + .../kotlin/com/nuvio/app/features/settings/AppLanguage.kt | 2 ++ 2 files changed, 3 insertions(+) diff --git a/composeApp/src/androidMain/res/xml/locale_config.xml b/composeApp/src/androidMain/res/xml/locale_config.xml index 5599b948..7d3f2e85 100644 --- a/composeApp/src/androidMain/res/xml/locale_config.xml +++ b/composeApp/src/androidMain/res/xml/locale_config.xml @@ -8,4 +8,5 @@ + diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt index f47fb7b8..025d6acc 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/AppLanguage.kt @@ -3,6 +3,7 @@ package com.nuvio.app.features.settings import nuvio.composeapp.generated.resources.Res import nuvio.composeapp.generated.resources.lang_english import nuvio.composeapp.generated.resources.lang_french +import nuvio.composeapp.generated.resources.lang_german import nuvio.composeapp.generated.resources.lang_spanish import nuvio.composeapp.generated.resources.lang_portuguese_portugal import nuvio.composeapp.generated.resources.lang_turkish @@ -17,6 +18,7 @@ enum class AppLanguage( ) { ENGLISH("en", Res.string.lang_english), FRENCH("fr", Res.string.lang_french), + GERMAN("de", Res.string.lang_german), SPANISH("es", Res.string.lang_spanish), PORTUGUESE("pt", Res.string.lang_portuguese_portugal), TURKISH("tr", Res.string.lang_turkish), From d433a5cab4d5557a5b06d8eadd518a74a73ba728 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Mon, 4 May 2026 01:19:51 +0530 Subject: [PATCH 078/143] update quick-js aar --- .../libs/quickjs-kt-android-1.0.5-nuvio.aar | Bin 1730643 -> 1881766 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/composeApp/libs/quickjs-kt-android-1.0.5-nuvio.aar b/composeApp/libs/quickjs-kt-android-1.0.5-nuvio.aar index ef0ce5289102255acf17ebc7d9416390f00e6623..e3705fb616698a330cf71cd3f30aaf2e2ceb2d90 100644 GIT binary patch literal 1881766 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 &aruPXCGr!hre?Kw$RyO>X7ALXA||o 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®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

D`Wso1E>3(~}ajr4n;C3n1eDpK;GTd`!3bbt1R- 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%0A&F4xlGw&M2>%>DcP7BTEQ`%JtU8=bJ1!DnMM*; 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⪼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 Xq|ZS8?f_5&#tulOesW@O9pC;ROtnG# diff --git a/composeApp/libs/quickjs-kt-android-1.0.5-nuvio.aar b/composeApp/libs/quickjs-kt-android-1.0.5-nuvio.aar new file mode 100644 index 0000000000000000000000000000000000000000..ef0ce5289102255acf17ebc7d9416390f00e6623 GIT binary patch literal 1730643 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 z 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ⅅS1cLa$s8G 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