diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index 0c7f4fe4b..306e195d4 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -661,9 +661,9 @@ %1$d links Formatting Name template - Controls how result names appear. + Controls how result names appear. Leave blank to use the original result name. Description template - Controls the metadata shown under each result. + Controls the metadata shown under each result. Leave blank to use the original result details. Reset formatting Restore default result formatting. API key validated. @@ -1545,6 +1545,7 @@ Learn more Default format + Original format Enter one group per line. Original order diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/debrid/DebridSettingsRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/debrid/DebridSettingsRepository.kt index 15ac88cfb..f42d6995d 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/debrid/DebridSettingsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/debrid/DebridSettingsRepository.kt @@ -390,11 +390,13 @@ object DebridSettingsRepository { } } streamNameTemplate = normalizeStreamTemplate( - DebridSettingsStorage.loadStreamNameTemplate().orEmpty(), + DebridSettingsStorage.loadStreamNameTemplate() + ?: DebridStreamFormatterDefaults.NAME_TEMPLATE, DebridTemplateKind.NAME, ) streamDescriptionTemplate = normalizeStreamTemplate( - DebridSettingsStorage.loadStreamDescriptionTemplate().orEmpty(), + DebridSettingsStorage.loadStreamDescriptionTemplate() + ?: DebridStreamFormatterDefaults.DESCRIPTION_TEMPLATE, DebridTemplateKind.DESCRIPTION, ) streamBadgeRules = parseStreamBadgeRules(DebridSettingsStorage.loadStreamBadgeRules()) ?: StreamBadgeRules() diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/debrid/DebridStreamFormatter.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/debrid/DebridStreamFormatter.kt index 9d99cee6b..da1af160e 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/debrid/DebridStreamFormatter.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/debrid/DebridStreamFormatter.kt @@ -19,14 +19,12 @@ class DebridStreamFormatter( if (!stream.isManagedDebridStream) return stream val matchedBadges = StreamBadgeMatcher.matchedBadges(stream, compiledBadgeFilters) val values = buildValues(stream, settings, matchedBadges) - val nameTemplate = settings.streamNameTemplate.ifBlank { DebridStreamFormatterDefaults.NAME_TEMPLATE } - val descriptionTemplate = settings.streamDescriptionTemplate.ifBlank { DebridStreamFormatterDefaults.DESCRIPTION_TEMPLATE } - val formattedName = engine.render(nameTemplate, values) + val formattedName = engine.render(settings.streamNameTemplate, values) .lineSequence() .joinToString(" ") { it.trim() } .replace(Regex("\\s+"), " ") .trim() - val formattedDescription = engine.render(descriptionTemplate, values) + val formattedDescription = engine.render(settings.streamDescriptionTemplate, values) .lineSequence() .map { it.trim() } .filter { it.isNotBlank() } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/DebridSettingsPage.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/DebridSettingsPage.kt index 59eb361fc..d5858fd2a 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/DebridSettingsPage.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/settings/DebridSettingsPage.kt @@ -150,6 +150,7 @@ import nuvio.composeapp.generated.resources.settings_debrid_size_range import nuvio.composeapp.generated.resources.settings_debrid_size_range_desc import nuvio.composeapp.generated.resources.settings_debrid_learn_more import nuvio.composeapp.generated.resources.settings_debrid_template_default_format +import nuvio.composeapp.generated.resources.settings_debrid_template_original_format import nuvio.composeapp.generated.resources.settings_debrid_release_groups_hint import nuvio.composeapp.generated.resources.settings_debrid_sort_best_quality import nuvio.composeapp.generated.resources.settings_debrid_sort_largest @@ -600,7 +601,10 @@ private enum class DebridTemplateField { private fun templatePreview(value: String, defaultValue: String): String { val defaultFormat = runBlocking { getString(Res.string.settings_debrid_template_default_format) } - if (value.trim().isBlank() || value.trim() == defaultValue.trim()) return defaultFormat + val originalFormat = runBlocking { getString(Res.string.settings_debrid_template_original_format) } + val trimmed = value.trim() + if (trimmed.isBlank()) return originalFormat + if (trimmed == defaultValue.trim()) return defaultFormat val firstLine = value .lineSequence() .map { it.trim() } diff --git a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/debrid/DebridStreamPresentationTest.kt b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/debrid/DebridStreamPresentationTest.kt index 3df13ab7b..50b1bcba7 100644 --- a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/debrid/DebridStreamPresentationTest.kt +++ b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/debrid/DebridStreamPresentationTest.kt @@ -39,6 +39,28 @@ class DebridStreamPresentationTest { assertContains(description, "Lost.S01E01.2160p.WEB-DL.H265.AAC-NAKSU.mkv") } + @Test + fun `blank templates preserve original stream name and description`() { + val stream = localTorboxStream( + name = "Original torrent", + filename = "Movie.2026.1080p.WEB-DL.H265-GRP.mkv", + size = 4_000_000_000, + ).copy(description = "Original addon details") + + val formatted = DebridStreamFormatter().format( + stream = stream, + settings = DebridSettings( + enabled = true, + providerApiKeys = mapOf(DebridProviders.TORBOX_ID to "key"), + streamNameTemplate = "", + streamDescriptionTemplate = "", + ), + ) + + assertEquals("Original torrent", formatted.name) + assertEquals("Original addon details", formatted.description) + } + @Test fun `formats imported badge matches from fusion badge rules`() { val stream = localTorboxStream(