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(