From 231d0679c0b586976b43586e4a73d51f23e4d4e5 Mon Sep 17 00:00:00 2001 From: diogob003 Date: Sat, 27 Sep 2025 00:51:44 -0300 Subject: [PATCH] Feature: emoji on subtitles / sources selection * Show flag and translated name when choosing subtitles / sources * Group by language code instead of name on sources / mirrors selection --- .../cloudstream3/ui/player/GeneratorPlayer.kt | 19 ++++++++++--------- .../ui/player/PlayerSubtitleHelper.kt | 4 ++++ .../ui/player/RepoLinkGenerator.kt | 10 +++++----- .../cloudstream3/utils/AppContextUtils.kt | 4 +++- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt index 4d72214a5c..772c94ce50 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt @@ -1179,24 +1179,25 @@ class GeneratorPlayer : FullScreenPlayer() { ArrayAdapter(ctx, R.layout.sort_bottom_single_choice) subsArrayAdapter.add(ctx.getString(R.string.no_subtitles).html()) - val subtitlesGrouped = - currentSubtitles.groupBy { it.originalName }.map { (key, value) -> - key to value.sortedBy { it.nameSuffix.toIntOrNull() ?: 0 } - }.toMap() + val subtitlesGrouped = currentSubtitles + .groupBy { it.languageCode } + .mapValues { it.value.sortedWith( + compareBy({ it.localizedName.substringAfter("\u00a0").lowercase() }, { it.nameSuffix.toIntOrNull() ?: 0 })) } + .toMap() val subtitlesGroupedList = subtitlesGrouped.entries.toList() - val subtitles = subtitlesGrouped.map { it.key.html() } + val subtitlesDisplayNames = subtitlesGrouped.map { it.value.first().localizedName.html() } val subtitleGroupIndexStart = - subtitlesGrouped.keys.indexOf(currentSelectedSubtitles?.originalName) + 1 + subtitlesGrouped.keys.indexOf(currentSelectedSubtitles?.languageCode) + 1 var subtitleGroupIndex = subtitleGroupIndexStart val subtitleOptionIndexStart = - subtitlesGrouped[currentSelectedSubtitles?.originalName]?.indexOfFirst { it.nameSuffix == currentSelectedSubtitles?.nameSuffix } - ?: 0 + subtitlesGrouped[currentSelectedSubtitles?.languageCode] + ?.indexOfFirst { it.nameSuffix == currentSelectedSubtitles?.nameSuffix } ?: 0 var subtitleOptionIndex = subtitleOptionIndexStart - subsArrayAdapter.addAll(subtitles) + subsArrayAdapter.addAll(subtitlesDisplayNames) subtitleList.adapter = subsArrayAdapter subtitleList.choiceMode = AbsListView.CHOICE_MODE_SINGLE diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt index fe19149756..00eb04b24c 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt @@ -11,6 +11,7 @@ import androidx.media3.ui.SubtitleView import com.lagradost.cloudstream3.SubtitleFile import com.lagradost.cloudstream3.ui.subtitles.SaveCaptionStyle import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment.Companion.setSubtitleViewStyle +import com.lagradost.cloudstream3.utils.SubtitleHelper.getNameNextToFlagEmoji import com.lagradost.cloudstream3.utils.UIHelper.toPx enum class SubtitleStatus { @@ -49,6 +50,9 @@ data class SubtitleData( val name = "$originalName $nameSuffix" + val localizedName + get() = getNameNextToFlagEmoji(languageCode) ?: originalName + /** * Gets the URL, but tries to fix it if it is malformed. */ diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/RepoLinkGenerator.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/RepoLinkGenerator.kt index 0dddf58a1d..fe804f7aa1 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/RepoLinkGenerator.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/RepoLinkGenerator.kt @@ -88,8 +88,8 @@ class RepoLinkGenerator( currentCache.subtitleCache.forEach { sub -> currentSubsUrls.add(sub.url) - val suffixCount = lastCountedSuffix.getOrDefault(sub.originalName, 0u) + 1u - lastCountedSuffix[sub.originalName] = suffixCount + val suffixCount = lastCountedSuffix.getOrDefault(sub.languageCode?: "unknown", 0u) + 1u + lastCountedSuffix[sub.languageCode?: "unknown"] = suffixCount subtitleCallback(sub) } @@ -116,9 +116,9 @@ class RepoLinkGenerator( // this part makes sure that all names are unique for UX val nameDecoded = correctFile.originalName.html().toString().trim() // `%3Ch1%3Esub%20name…` → `

sub name…` → `sub name…` - - val suffixCount = lastCountedSuffix.getOrDefault(nameDecoded, 0u) +1u - lastCountedSuffix[nameDecoded] = suffixCount + val langCode = correctFile.languageCode ?: "unknown" + val suffixCount = lastCountedSuffix.getOrDefault(langCode, 0u) +1u + lastCountedSuffix[langCode] = suffixCount val updatedFile = correctFile.copy(originalName = nameDecoded, nameSuffix = "$suffixCount") diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/AppContextUtils.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/AppContextUtils.kt index 918f870b4f..82b5076bd4 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/AppContextUtils.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/AppContextUtils.kt @@ -383,7 +383,9 @@ object AppContextUtils { } fun sortSubs(subs: Set): List { - return subs.sortedBy { it.name } + return subs.sortedWith( + compareBy({ it.localizedName.substringAfter("\u00a0").lowercase() }, { it.nameSuffix.toIntOrNull() ?: 0 }) + ) } fun Context.getApiSettings(): HashSet {