mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-05-23 02:02:04 +00:00
String changes
This commit is contained in:
parent
8c25cca724
commit
0bfd2cb99c
7 changed files with 116 additions and 43 deletions
|
|
@ -379,7 +379,7 @@
|
|||
<string name="compose_settings_page_appearance">Utseende</string>
|
||||
<string name="compose_settings_page_content_discovery">Innhold & oppdagelse</string>
|
||||
<string name="compose_settings_page_continue_watching">Fortsett å se</string>
|
||||
<string name="compose_settings_page_debrid">Skytjenester</string>
|
||||
<string name="compose_settings_page_debrid">Tilkoblede tjenester</string>
|
||||
<string name="compose_settings_page_homescreen">Hjemmeoppsett</string>
|
||||
<string name="compose_settings_page_integrations">Integrasjoner</string>
|
||||
<string name="compose_settings_page_licenses_attributions">Lisenser & attribusjon</string>
|
||||
|
|
@ -588,17 +588,17 @@
|
|||
<string name="settings_integrations_section_title">Integrasjoner</string>
|
||||
<string name="settings_integrations_tmdb_description">Metadata-berikelse-kontroller</string>
|
||||
<string name="settings_integrations_mdblist_description">Eksterne vurderingsleverandører</string>
|
||||
<string name="settings_integrations_debrid_description">Administrer skytjenestekontoer og tilgang til skybibliotek</string>
|
||||
<string name="settings_debrid_section_title">Skytjenester</string>
|
||||
<string name="settings_debrid_experimental_notice">Støtte for skytjenester er eksperimentell og kan endres eller fjernes senere.</string>
|
||||
<string name="settings_integrations_debrid_description">Koble til kontoer for lenker og bibliotektilgang</string>
|
||||
<string name="settings_debrid_section_title">Tilkoblede tjenester</string>
|
||||
<string name="settings_debrid_experimental_notice">Disse integrasjonene er eksperimentelle og kan endres eller fjernes senere.</string>
|
||||
<string name="settings_debrid_cloud_library">Skybibliotek</string>
|
||||
<string name="settings_debrid_cloud_library_description">Bla gjennom og spill filer som allerede finnes i tilkoblede skytjenester.</string>
|
||||
<string name="settings_debrid_cloud_library_description">Bla gjennom og spill filer som allerede finnes i tilkoblede kontoer.</string>
|
||||
<string name="settings_debrid_enable">Løs spillbare lenker</string>
|
||||
<string name="settings_debrid_enable_description">Be en tilkoblet tjeneste om spillbare lenker når et resultat trenger det. Dette kan legge elementet til i den tjenesten.</string>
|
||||
<string name="settings_debrid_resolve_with">Løs med</string>
|
||||
<string name="settings_debrid_resolve_with_description">Velg hvilken tilkoblet skytjeneste som håndterer spillbare lenker.</string>
|
||||
<string name="settings_debrid_add_key_first">Koble til en skytjenestekonto først.</string>
|
||||
<string name="settings_debrid_section_providers">Skytjenester</string>
|
||||
<string name="settings_debrid_resolve_with_description">Velg hvilken tilkoblet konto som håndterer spillbare lenker.</string>
|
||||
<string name="settings_debrid_add_key_first">Koble til en konto først.</string>
|
||||
<string name="settings_debrid_section_providers">Kontoer</string>
|
||||
<string name="settings_debrid_provider_description">Koble til %1$s-kontoen din.</string>
|
||||
<string name="settings_debrid_provider_device_description">Koble til %1$s-kontoen din i nettleseren.</string>
|
||||
<string name="settings_debrid_dialog_title">%1$s API-nøkkel</string>
|
||||
|
|
@ -625,9 +625,9 @@
|
|||
<string name="settings_debrid_prepare_count_many">%1$d lenker</string>
|
||||
<string name="settings_debrid_section_formatting">Formatering</string>
|
||||
<string name="settings_debrid_name_template">Navnemal</string>
|
||||
<string name="settings_debrid_name_template_description">Styrer hvordan navn på skyresultater vises.</string>
|
||||
<string name="settings_debrid_name_template_description">Styrer hvordan resultatnavn vises.</string>
|
||||
<string name="settings_debrid_description_template">Beskrivelsesmal</string>
|
||||
<string name="settings_debrid_description_template_description">Styrer metadata vist under hvert skyresultat.</string>
|
||||
<string name="settings_debrid_description_template_description">Styrer metadata vist under hvert resultat.</string>
|
||||
<string name="settings_debrid_key_valid">API-nøkkel validert.</string>
|
||||
<string name="settings_debrid_key_invalid">Kunne ikke validere denne API-nøkkelen.</string>
|
||||
<string name="settings_mdb_add_api_key_first">Legg til MDBList API-nøkkel før du skrur på vurderinger.</string>
|
||||
|
|
@ -1165,9 +1165,9 @@
|
|||
<string name="streams_resume_from_time">Gjenoppta fra %1$s</string>
|
||||
<string name="streams_size">STØRRELSE %1$s</string>
|
||||
<string name="streams_torrent_not_supported">Denne strømtypen støttes ikke</string>
|
||||
<string name="debrid_missing_api_key">Koble til en skytjenestekonto i Innstillinger.</string>
|
||||
<string name="debrid_stream_stale">Denne skytjenestelenken er utgått. Oppdaterer resultater.</string>
|
||||
<string name="debrid_resolve_failed">Kunne ikke åpne denne skytjenestelenken.</string>
|
||||
<string name="debrid_missing_api_key">Koble til en konto i Innstillinger.</string>
|
||||
<string name="debrid_stream_stale">Denne lenken er utgått. Oppdaterer resultater.</string>
|
||||
<string name="debrid_resolve_failed">Kunne ikke åpne denne lenken.</string>
|
||||
<string name="external_player_failed">Kunne ikke åpne ekstern avspiller</string>
|
||||
<string name="external_player_not_configured">Velg en ekstern avspiller i innstillinger først</string>
|
||||
<string name="external_player_unavailable">Ingen ekstern avspiller er tilgjengelig</string>
|
||||
|
|
|
|||
|
|
@ -380,7 +380,7 @@
|
|||
<string name="compose_settings_page_appearance">Layout</string>
|
||||
<string name="compose_settings_page_content_discovery">Content & Discovery</string>
|
||||
<string name="compose_settings_page_continue_watching">Continue Watching</string>
|
||||
<string name="compose_settings_page_debrid">Cloud Services</string>
|
||||
<string name="compose_settings_page_debrid">Connected Services</string>
|
||||
<string name="compose_settings_page_homescreen">Home Layout</string>
|
||||
<string name="compose_settings_page_integrations">Integrations</string>
|
||||
<string name="compose_settings_page_licenses_attributions">Licenses & Attribution</string>
|
||||
|
|
@ -589,17 +589,17 @@
|
|||
<string name="settings_integrations_section_title">Integrations</string>
|
||||
<string name="settings_integrations_tmdb_description">Metadata enrichment controls</string>
|
||||
<string name="settings_integrations_mdblist_description">External ratings providers</string>
|
||||
<string name="settings_integrations_debrid_description">Manage cloud service accounts and cloud library access</string>
|
||||
<string name="settings_debrid_section_title">Cloud Services</string>
|
||||
<string name="settings_debrid_experimental_notice">Cloud Services support is experimental and may be kept, changed, or removed later.</string>
|
||||
<string name="settings_integrations_debrid_description">Connect accounts for links and library access</string>
|
||||
<string name="settings_debrid_section_title">Connected Services</string>
|
||||
<string name="settings_debrid_experimental_notice">These integrations are experimental and may be kept, changed, or removed later.</string>
|
||||
<string name="settings_debrid_cloud_library">Cloud library</string>
|
||||
<string name="settings_debrid_cloud_library_description">Browse and play files already in your connected cloud services.</string>
|
||||
<string name="settings_debrid_cloud_library_description">Browse and play files already in your connected accounts.</string>
|
||||
<string name="settings_debrid_enable">Resolve playable links</string>
|
||||
<string name="settings_debrid_enable_description">Ask a connected service for playable links when a result needs it. This may add the item to that service.</string>
|
||||
<string name="settings_debrid_resolve_with">Resolve with</string>
|
||||
<string name="settings_debrid_resolve_with_description">Choose which connected cloud service manages playable links.</string>
|
||||
<string name="settings_debrid_add_key_first">Connect a cloud service account first.</string>
|
||||
<string name="settings_debrid_section_providers">Cloud Services</string>
|
||||
<string name="settings_debrid_resolve_with_description">Choose which connected account handles playable links.</string>
|
||||
<string name="settings_debrid_add_key_first">Connect an account first.</string>
|
||||
<string name="settings_debrid_section_providers">Accounts</string>
|
||||
<string name="settings_debrid_provider_description">Connect your %1$s account.</string>
|
||||
<string name="settings_debrid_provider_device_description">Link your %1$s account in the browser.</string>
|
||||
<string name="settings_debrid_dialog_title">%1$s API Key</string>
|
||||
|
|
@ -623,16 +623,16 @@
|
|||
<string name="settings_debrid_prepare_instant_playback">Prepare links</string>
|
||||
<string name="settings_debrid_prepare_instant_playback_description">Resolve playable links before playback starts.</string>
|
||||
<string name="settings_debrid_prepare_stream_count">Links to prepare</string>
|
||||
<string name="settings_debrid_prepare_stream_count_warning">Use a lower count when possible. Cloud services may rate-limit how many links can be resolved in a time period. Opening a movie or episode can count toward those limits even if you do not press Watch, because the links are prepared ahead of time.</string>
|
||||
<string name="settings_debrid_prepare_stream_count_warning">Use a lower count when possible. Connected services may rate-limit how many links can be resolved in a time period. Opening a movie or episode can count toward those limits even if you do not press Watch, because the links are prepared ahead of time.</string>
|
||||
<string name="settings_debrid_prepare_count_one">1 link</string>
|
||||
<string name="settings_debrid_prepare_count_many">%1$d links</string>
|
||||
<string name="settings_debrid_section_formatting">Formatting</string>
|
||||
<string name="settings_debrid_name_template">Name template</string>
|
||||
<string name="settings_debrid_name_template_description">Controls how cloud result names appear.</string>
|
||||
<string name="settings_debrid_name_template_description">Controls how result names appear.</string>
|
||||
<string name="settings_debrid_description_template">Description template</string>
|
||||
<string name="settings_debrid_description_template_description">Controls the metadata shown under each cloud result.</string>
|
||||
<string name="settings_debrid_description_template_description">Controls the metadata shown under each result.</string>
|
||||
<string name="settings_debrid_formatter_reset_title">Reset formatting</string>
|
||||
<string name="settings_debrid_formatter_reset_subtitle">Restore default cloud result formatting.</string>
|
||||
<string name="settings_debrid_formatter_reset_subtitle">Restore default result formatting.</string>
|
||||
<string name="settings_debrid_key_valid">API key validated.</string>
|
||||
<string name="settings_debrid_key_invalid">Could not validate this API key.</string>
|
||||
<string name="settings_mdb_add_api_key_first">Add your MDBList API key below before turning ratings on.</string>
|
||||
|
|
@ -1170,10 +1170,10 @@
|
|||
<string name="streams_resume_from_time">Resume from %1$s</string>
|
||||
<string name="streams_size">SIZE %1$s</string>
|
||||
<string name="streams_torrent_not_supported">This stream type is not supported</string>
|
||||
<string name="debrid_missing_api_key">Connect a cloud service account in Settings.</string>
|
||||
<string name="debrid_missing_api_key">Connect an account in Settings.</string>
|
||||
<string name="debrid_not_cached">Not cached on Torbox.</string>
|
||||
<string name="debrid_stream_stale">This cloud service link expired. Refreshing results.</string>
|
||||
<string name="debrid_resolve_failed">Could not open this cloud service link.</string>
|
||||
<string name="debrid_stream_stale">This link expired. Refreshing results.</string>
|
||||
<string name="debrid_resolve_failed">Could not open this link.</string>
|
||||
<string name="external_player_failed">Couldn't open external player</string>
|
||||
<string name="external_player_not_configured">Choose an external player in settings first</string>
|
||||
<string name="external_player_unavailable">No external player is available</string>
|
||||
|
|
@ -1333,10 +1333,10 @@
|
|||
<string name="library_trakt_load_failed">Couldn't load Trakt library</string>
|
||||
<string name="library_trakt_title">Trakt Library</string>
|
||||
<string name="cloud_library_connect_action">Connect account</string>
|
||||
<string name="cloud_library_connect_message">Connect a cloud service in Cloud Services settings to browse playable files from your cloud library.</string>
|
||||
<string name="cloud_library_connect_message">Connect an account in Connected Services settings to browse playable files from your cloud library.</string>
|
||||
<string name="cloud_library_connect_title">No cloud account connected</string>
|
||||
<string name="cloud_library_disabled_action">Open Cloud Services</string>
|
||||
<string name="cloud_library_disabled_message">Turn on Cloud library in Cloud Services settings to browse files from connected accounts.</string>
|
||||
<string name="cloud_library_disabled_action">Open Connected Services</string>
|
||||
<string name="cloud_library_disabled_message">Turn on Cloud library in Connected Services settings to browse files from connected accounts.</string>
|
||||
<string name="cloud_library_disabled_title">Cloud library is off</string>
|
||||
<string name="cloud_library_empty_message">No playable cloud files match the current filters.</string>
|
||||
<string name="cloud_library_empty_title">Nothing here yet</string>
|
||||
|
|
|
|||
|
|
@ -56,7 +56,10 @@ data class DebridSettings(
|
|||
get() = cloudLibraryEnabled && hasCloudLibraryProvider
|
||||
|
||||
val hasCustomStreamFormatting: Boolean
|
||||
get() = streamNameTemplate.isNotBlank() || streamDescriptionTemplate.isNotBlank()
|
||||
get() = DebridStreamFormatterDefaults.NAME_TEMPLATE.isNotBlank() ||
|
||||
DebridStreamFormatterDefaults.DESCRIPTION_TEMPLATE.isNotBlank() ||
|
||||
streamNameTemplate.isNotBlank() ||
|
||||
streamDescriptionTemplate.isNotBlank()
|
||||
|
||||
fun apiKeyFor(providerId: String?): String {
|
||||
val normalized = DebridProviders.byId(providerId)?.id
|
||||
|
|
|
|||
|
|
@ -12,12 +12,14 @@ class DebridStreamFormatter(
|
|||
fun format(stream: StreamItem, settings: DebridSettings): StreamItem {
|
||||
if (!stream.isManagedDebridStream) return stream
|
||||
val values = buildValues(stream, settings)
|
||||
val formattedName = engine.render(settings.streamNameTemplate, values)
|
||||
val nameTemplate = settings.streamNameTemplate.ifBlank { DebridStreamFormatterDefaults.NAME_TEMPLATE }
|
||||
val descriptionTemplate = settings.streamDescriptionTemplate.ifBlank { DebridStreamFormatterDefaults.DESCRIPTION_TEMPLATE }
|
||||
val formattedName = engine.render(nameTemplate, values)
|
||||
.lineSequence()
|
||||
.joinToString(" ") { it.trim() }
|
||||
.replace(Regex("\\s+"), " ")
|
||||
.trim()
|
||||
val formattedDescription = engine.render(settings.streamDescriptionTemplate, values)
|
||||
val formattedDescription = engine.render(descriptionTemplate, values)
|
||||
.lineSequence()
|
||||
.map { it.trim() }
|
||||
.filter { it.isNotBlank() }
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
package com.nuvio.app.features.debrid
|
||||
|
||||
object DebridStreamFormatterDefaults {
|
||||
const val NAME_TEMPLATE = ""
|
||||
const val NAME_TEMPLATE = "{stream.resolution::exists[\"{stream.resolution} \"||\"\"]}{service.shortName::exists[\"{service.shortName}\"||\"Cloud\"]} Instant"
|
||||
|
||||
const val DESCRIPTION_TEMPLATE = ""
|
||||
|
||||
|
|
|
|||
|
|
@ -321,7 +321,7 @@ internal fun LazyListScope.debridSettingsContent(
|
|||
DebridPreferenceRow(
|
||||
isTablet = isTablet,
|
||||
title = "Max results",
|
||||
description = "Limit how many cloud-service results appear.",
|
||||
description = "Limit how many results appear.",
|
||||
value = streamMaxResultsLabel(preferences.maxResults),
|
||||
enabled = settings.canResolvePlayableLinks,
|
||||
onClick = { activeStreamPicker = DebridStreamPicker.MAX_RESULTS },
|
||||
|
|
@ -330,7 +330,7 @@ internal fun LazyListScope.debridSettingsContent(
|
|||
DebridPreferenceRow(
|
||||
isTablet = isTablet,
|
||||
title = "Sort results",
|
||||
description = "Choose how cloud-service results are ordered.",
|
||||
description = "Choose how results are ordered.",
|
||||
value = sortProfileLabel(preferences.sortCriteria),
|
||||
enabled = settings.canResolvePlayableLinks,
|
||||
onClick = { activeStreamPicker = DebridStreamPicker.SORT_MODE },
|
||||
|
|
@ -357,7 +357,7 @@ internal fun LazyListScope.debridSettingsContent(
|
|||
DebridPreferenceRow(
|
||||
isTablet = isTablet,
|
||||
title = "Size range",
|
||||
description = "Filter cloud-service results by file size.",
|
||||
description = "Filter results by file size.",
|
||||
value = sizeRangeLabel(preferences),
|
||||
enabled = settings.canResolvePlayableLinks,
|
||||
onClick = { activeStreamPicker = DebridStreamPicker.SIZE_RANGE },
|
||||
|
|
@ -398,7 +398,10 @@ internal fun LazyListScope.debridSettingsContent(
|
|||
isTablet = isTablet,
|
||||
title = stringResource(Res.string.settings_debrid_name_template),
|
||||
description = stringResource(Res.string.settings_debrid_name_template_description),
|
||||
value = templatePreview(settings.streamNameTemplate),
|
||||
value = templatePreview(
|
||||
value = settings.streamNameTemplate,
|
||||
defaultValue = DebridStreamFormatterDefaults.NAME_TEMPLATE,
|
||||
),
|
||||
enabled = settings.canResolvePlayableLinks,
|
||||
onClick = { activeTemplateField = DebridTemplateField.NAME },
|
||||
)
|
||||
|
|
@ -407,7 +410,10 @@ internal fun LazyListScope.debridSettingsContent(
|
|||
isTablet = isTablet,
|
||||
title = stringResource(Res.string.settings_debrid_description_template),
|
||||
description = stringResource(Res.string.settings_debrid_description_template_description),
|
||||
value = templatePreview(settings.streamDescriptionTemplate),
|
||||
value = templatePreview(
|
||||
value = settings.streamDescriptionTemplate,
|
||||
defaultValue = DebridStreamFormatterDefaults.DESCRIPTION_TEMPLATE,
|
||||
),
|
||||
enabled = settings.canResolvePlayableLinks,
|
||||
onClick = { activeTemplateField = DebridTemplateField.DESCRIPTION },
|
||||
)
|
||||
|
|
@ -450,7 +456,8 @@ private enum class DebridTemplateField {
|
|||
DESCRIPTION,
|
||||
}
|
||||
|
||||
private fun templatePreview(value: String): String {
|
||||
private fun templatePreview(value: String, defaultValue: String): String {
|
||||
if (value.trim().isBlank() || value.trim() == defaultValue.trim()) return "Default format"
|
||||
val firstLine = value
|
||||
.lineSequence()
|
||||
.map { it.trim() }
|
||||
|
|
|
|||
|
|
@ -2,12 +2,17 @@ package com.nuvio.app.features.debrid
|
|||
|
||||
import com.nuvio.app.features.streams.AddonStreamGroup
|
||||
import com.nuvio.app.features.streams.StreamBehaviorHints
|
||||
import com.nuvio.app.features.streams.StreamClientResolve
|
||||
import com.nuvio.app.features.streams.StreamClientResolveParsed
|
||||
import com.nuvio.app.features.streams.StreamClientResolveRaw
|
||||
import com.nuvio.app.features.streams.StreamClientResolveStream
|
||||
import com.nuvio.app.features.streams.StreamDebridCacheState
|
||||
import com.nuvio.app.features.streams.StreamDebridCacheStatus
|
||||
import com.nuvio.app.features.streams.StreamItem
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertContains
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertFalse
|
||||
|
||||
class DebridStreamPresentationTest {
|
||||
@Test
|
||||
|
|
@ -34,6 +39,36 @@ class DebridStreamPresentationTest {
|
|||
assertContains(description, "Lost.S01E01.2160p.WEB-DL.H265.AAC-NAKSU.mkv")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `default formatter replaces addon source labels for managed streams`() {
|
||||
val stream = premiumizeDirectStream(
|
||||
name = "[P2P] Torrentio 2160p - PM Instant",
|
||||
filename = "The.Boys.S03E01.Payback.2160p.WEB-DL.H265.mkv",
|
||||
size = 12_000_000_000,
|
||||
)
|
||||
|
||||
val presented = DebridStreamPresentation.apply(
|
||||
groups = listOf(
|
||||
AddonStreamGroup(
|
||||
addonName = "Torrentio",
|
||||
addonId = "addon:torrentio",
|
||||
streams = listOf(stream),
|
||||
),
|
||||
),
|
||||
settings = DebridSettings(
|
||||
enabled = true,
|
||||
providerApiKeys = mapOf(DebridProviders.PREMIUMIZE_ID to "pm_key"),
|
||||
),
|
||||
).single().streams.single()
|
||||
|
||||
val name = presented.name.orEmpty()
|
||||
assertEquals("2160p PM Instant", name)
|
||||
assertFalse(name.contains("P2P", ignoreCase = true))
|
||||
assertFalse(name.contains("torrent", ignoreCase = true))
|
||||
assertFalse(name.contains("Torrentio", ignoreCase = true))
|
||||
assertFalse(name.contains("Comet", ignoreCase = true))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `applies debrid sort filters and limits without removing normal urls`() {
|
||||
val low = localTorboxStream(
|
||||
|
|
@ -75,7 +110,7 @@ class DebridStreamPresentationTest {
|
|||
),
|
||||
).single().streams
|
||||
|
||||
assertEquals(listOf("Large", "Mid", "Resolved addon URL"), presented.map { it.name })
|
||||
assertEquals(listOf("2160p TB Instant", "1080p TB Instant", "Resolved addon URL"), presented.map { it.name })
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -106,7 +141,7 @@ class DebridStreamPresentationTest {
|
|||
),
|
||||
).single().streams
|
||||
|
||||
assertEquals(listOf("Cached"), presented.map { it.name })
|
||||
assertEquals(listOf("1080p TB Instant"), presented.map { it.name })
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -158,4 +193,30 @@ class DebridStreamPresentationTest {
|
|||
cachedSize = size,
|
||||
),
|
||||
)
|
||||
|
||||
private fun premiumizeDirectStream(
|
||||
name: String,
|
||||
filename: String,
|
||||
size: Long,
|
||||
): StreamItem =
|
||||
StreamItem(
|
||||
name = name,
|
||||
addonName = "Torrentio",
|
||||
addonId = "addon:torrentio",
|
||||
clientResolve = StreamClientResolve(
|
||||
type = "debrid",
|
||||
service = DebridProviders.PREMIUMIZE_ID,
|
||||
filename = filename,
|
||||
isCached = true,
|
||||
stream = StreamClientResolveStream(
|
||||
raw = StreamClientResolveRaw(
|
||||
filename = filename,
|
||||
size = size,
|
||||
parsed = StreamClientResolveParsed(
|
||||
resolution = "2160p",
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue