From 13da588f6564ad16d55e6d3165766f136d2f0998 Mon Sep 17 00:00:00 2001 From: Phisher98 Date: Wed, 4 Feb 2026 21:25:12 +0530 Subject: [PATCH 1/9] Minor Fix for case insensitive match --- .../cloudstream3/ui/player/GeneratorPlayer.kt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 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 933d5de325..57732650ae 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 @@ -1459,16 +1459,16 @@ class GeneratorPlayer : FullScreenPlayer() { ?: "Audio" val codec = track.sampleMimeType?.let { mimeType -> - when { - mimeType.contains("mp4a") || mimeType.contains("aac") -> "aac" - mimeType.contains("ac-3") || mimeType.contains("ac3") -> "ac3" - mimeType.contains("eac3-joc") -> "Dolby Atmos" - mimeType.contains("eac3") -> "eac3" - mimeType.contains("opus") -> "opus" - mimeType.contains("vorbis") -> "vorbis" - mimeType.contains("mp3") || mimeType.contains("mpeg") -> "mp3" - mimeType.contains("flac") -> "flac" - mimeType.contains("dts") -> "dts" + when { + mimeType.contains("mp4a", ignoreCase = true) || mimeType.contains("aac", ignoreCase = true) -> "aac" + mimeType.contains("ac-3", ignoreCase = true) || mimeType.contains("ac3", ignoreCase = true) -> "ac3" + mimeType.contains("eac3-joc", ignoreCase = true) -> "Dolby Atmos" + mimeType.contains("eac3", ignoreCase = true) -> "eac3" + mimeType.contains("opus", ignoreCase = true) -> "opus" + mimeType.contains("vorbis", ignoreCase = true) -> "vorbis" + mimeType.contains("mp3", ignoreCase = true) || mimeType.contains("mpeg", ignoreCase = true) -> "mp3" + mimeType.contains("flac", ignoreCase = true) -> "flac" + mimeType.contains("dts", ignoreCase = true) -> "dts" else -> mimeType.substringAfter("/") } } ?: "codec?" From a3a173ff6c531b9d9cc40bc7910c83b1f5d6a377 Mon Sep 17 00:00:00 2001 From: Phisher98 Date: Wed, 4 Feb 2026 21:31:16 +0530 Subject: [PATCH 2/9] Minor Fix for case insensitive match --- .../cloudstream3/ui/player/GeneratorPlayer.kt | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 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 57732650ae..109b29e162 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 @@ -1457,23 +1457,25 @@ class GeneratorPlayer : FullScreenPlayer() { val language = track.language?.let { fromTagToLanguageName(it) ?: it } ?: track.label ?: "Audio" - - val codec = track.sampleMimeType?.let { mimeType -> - when { - mimeType.contains("mp4a", ignoreCase = true) || mimeType.contains("aac", ignoreCase = true) -> "aac" - mimeType.contains("ac-3", ignoreCase = true) || mimeType.contains("ac3", ignoreCase = true) -> "ac3" - mimeType.contains("eac3-joc", ignoreCase = true) -> "Dolby Atmos" - mimeType.contains("eac3", ignoreCase = true) -> "eac3" - mimeType.contains("opus", ignoreCase = true) -> "opus" - mimeType.contains("vorbis", ignoreCase = true) -> "vorbis" - mimeType.contains("mp3", ignoreCase = true) || mimeType.contains("mpeg", ignoreCase = true) -> "mp3" - mimeType.contains("flac", ignoreCase = true) -> "flac" - mimeType.contains("dts", ignoreCase = true) -> "dts" - else -> mimeType.substringAfter("/") + + val codec = track.sampleMimeType + ?.lowercase() + ?.let { mime -> + when { + mime.contains("eac3-joc") -> "Dolby Atmos" + mime.contains("mp4a") || mime.contains("aac") -> "aac" + mime.contains("ac-3") || mime.contains("ac3") -> "ac3" + mime.contains("eac3") -> "eac3" + mime.contains("opus") -> "opus" + mime.contains("vorbis") -> "vorbis" + mime.contains("mp3") || mime.contains("mpeg") -> "mp3" + mime.contains("flac") -> "flac" + mime.contains("dts") -> "dts" + "/" in mime -> mime.substringAfter("/") + else -> mime } } ?: "codec?" - val channels: Int = track.channelCount ?: 0 val channelConfig = when (channels) { 1 -> "mono" From e251c4e3675178dc5541e976d001366b1f3684ed Mon Sep 17 00:00:00 2001 From: Phisher98 Date: Wed, 4 Feb 2026 21:47:56 +0530 Subject: [PATCH 3/9] Minor Fix for case insensitive match and Improvement on Video Codec --- .../cloudstream3/ui/player/GeneratorPlayer.kt | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 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 109b29e162..c03de090f0 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 @@ -1851,6 +1851,38 @@ class GeneratorPlayer : FullScreenPlayer() { } } + + private fun videoCodecName(mime: String?): String? { + val m = mime?.lowercase() ?: return null + return when { + m.contains("avc") || m.contains("h264") -> "AVC" + m.contains("hevc") || m.contains("h265") -> "HEVC" + m.contains("av1") -> "AV1" + m.contains("vp9") -> "VP9" + m.contains("vp8") -> "VP8" + "/" in m -> m.substringAfter("/").uppercase() + else -> m.uppercase() + } + } + + private fun audioCodecName(mime: String?): String? { + val m = mime?.lowercase() ?: return null + return when { + m.contains("eac3-joc") -> "Dolby Atmos" + m.contains("mp4a") || m.contains("aac") -> "AAC" + m.contains("ac-3") || m.contains("ac3") -> "AC3" + m.contains("eac3") -> "E-AC3" + m.contains("opus") -> "Opus" + m.contains("vorbis") -> "Vorbis" + m.contains("mp3") -> "MP3" + m.contains("flac") -> "FLAC" + m.contains("dts") -> "DTS" + "/" in m -> m.substringAfter("/").uppercase() + else -> m.uppercase() + } + } + + private fun updatePlayerInfo() { val tracks = player.getVideoTracks() @@ -1861,8 +1893,8 @@ class GeneratorPlayer : FullScreenPlayer() { val prefs = PreferenceManager.getDefaultSharedPreferences(ctx) showMediaInfo = prefs.getBoolean(ctx.getString(R.string.show_media_info_key), false) - val videoCodec = videoTrack?.sampleMimeType?.substringAfterLast('/')?.uppercase() - val audioCodec = audioTrack?.sampleMimeType?.substringAfterLast('/')?.uppercase() + val videoCodec = videoCodecName(videoTrack?.sampleMimeType) + val audioCodec = audioCodecName(audioTrack?.sampleMimeType) val language = listOfNotNull( audioTrack?.label, fromTagToLanguageName(audioTrack?.language)?.let { "[$it]" } From e373ffcf36f24eaf4e40bae94605939cc9c2ccb3 Mon Sep 17 00:00:00 2001 From: Phisher98 Date: Wed, 4 Feb 2026 21:54:06 +0530 Subject: [PATCH 4/9] Minor Fix for case insensitive match and Improvement on Video Codec --- .../com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt | 3 +-- 1 file changed, 1 insertion(+), 2 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 c03de090f0..a556bdc48c 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 @@ -1486,13 +1486,12 @@ class GeneratorPlayer : FullScreenPlayer() { } listOfNotNull( - "[$index]", language.replaceFirstChar { it.uppercaseChar() }, codec.uppercase(), channelConfig.replaceFirstChar { it.uppercaseChar() } ).joinToString(" • ") - "[$index] $language $codec $channelConfig" + "$language $codec $channelConfig" }) audioList.adapter = audioArrayAdapter From a3da693ec3610c70708c31f235491cac8b8af9ee Mon Sep 17 00:00:00 2001 From: Phisher98 Date: Wed, 4 Feb 2026 21:58:45 +0530 Subject: [PATCH 5/9] Minor Fix for case insensitive match and Improvement on Video Codec --- .../com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 a556bdc48c..c03de090f0 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 @@ -1486,12 +1486,13 @@ class GeneratorPlayer : FullScreenPlayer() { } listOfNotNull( + "[$index]", language.replaceFirstChar { it.uppercaseChar() }, codec.uppercase(), channelConfig.replaceFirstChar { it.uppercaseChar() } ).joinToString(" • ") - "$language $codec $channelConfig" + "[$index] $language $codec $channelConfig" }) audioList.adapter = audioArrayAdapter From a24dc242daaa68c62a7f4dc568f138c916a361bf Mon Sep 17 00:00:00 2001 From: Phisher98 Date: Wed, 4 Feb 2026 22:15:19 +0530 Subject: [PATCH 6/9] Minor Fix for case insensitive match and Improvement on Video Codec --- .../cloudstream3/ui/player/GeneratorPlayer.kt | 94 ++++++++++--------- 1 file changed, 51 insertions(+), 43 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 c03de090f0..40bd72dd9b 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 @@ -1453,47 +1453,49 @@ class GeneratorPlayer : FullScreenPlayer() { val audioArrayAdapter = ArrayAdapter(ctx, R.layout.sort_bottom_single_choice) - audioArrayAdapter.addAll(currentAudioTracks.mapIndexed { index, track -> - val language = track.language?.let { fromTagToLanguageName(it) ?: it } - ?: track.label - ?: "Audio" - - val codec = track.sampleMimeType - ?.lowercase() - ?.let { mime -> - when { - mime.contains("eac3-joc") -> "Dolby Atmos" - mime.contains("mp4a") || mime.contains("aac") -> "aac" - mime.contains("ac-3") || mime.contains("ac3") -> "ac3" - mime.contains("eac3") -> "eac3" - mime.contains("opus") -> "opus" - mime.contains("vorbis") -> "vorbis" - mime.contains("mp3") || mime.contains("mpeg") -> "mp3" - mime.contains("flac") -> "flac" - mime.contains("dts") -> "dts" - "/" in mime -> mime.substringAfter("/") - else -> mime + audioArrayAdapter.addAll( + currentAudioTracks.mapIndexed { index, track -> + + val language = ( + track.language?.let { fromTagToLanguageName(it) ?: it } + ?: track.label + ?: "Audio" + ).replaceFirstChar { it.uppercaseChar() } + + val codec = track.sampleMimeType + ?.lowercase() + ?.let { mime -> + when { + mime.contains("eac3-joc") -> "Dolby Atmos" + mime.contains("eac3") -> "E-AC3" + mime.contains("ac-3") || mime.contains("ac3") -> "AC3" + mime.contains("mp4a") || mime.contains("aac") -> "AAC" + mime.contains("opus") -> "Opus" + mime.contains("vorbis") -> "Vorbis" + mime.contains("mp3") -> "MP3" + mime.contains("flac") -> "FLAC" + mime.contains("dts") -> "DTS" + else -> "Unknown" + } + } ?: "Unknown" + + val channels = when (track.channelCount ?: 0) { + 1 -> "Mono" + 2 -> "Stereo" + 6 -> "5.1" + 8 -> "7.1" + else -> "${track.channelCount ?: "?"}ch" } - } ?: "codec?" - - val channels: Int = track.channelCount ?: 0 - val channelConfig = when (channels) { - 1 -> "mono" - 2 -> "stereo" - 6 -> "5.1" - 8 -> "7.1" - else -> "${channels}Ch" - } - listOfNotNull( - "[$index]", - language.replaceFirstChar { it.uppercaseChar() }, - codec.uppercase(), - channelConfig.replaceFirstChar { it.uppercaseChar() } - ).joinToString(" • ") - - "[$index] $language $codec $channelConfig" - }) + listOfNotNull( + "${index + 1}.", + language.takeIf { it.isNotBlank() }?.replaceFirstChar { it.uppercaseChar() }, + channels.takeIf { it.isNotBlank() }?.replaceFirstChar { it.uppercaseChar() }, + codec.takeIf { it.isNotBlank() }?.uppercase()?.let { "($it)" } + ).joinToString(" ") + + } + ) audioList.adapter = audioArrayAdapter audioList.choiceMode = AbsListView.CHOICE_MODE_SINGLE @@ -1895,10 +1897,16 @@ class GeneratorPlayer : FullScreenPlayer() { val videoCodec = videoCodecName(videoTrack?.sampleMimeType) val audioCodec = audioCodecName(audioTrack?.sampleMimeType) - val language = listOfNotNull( - audioTrack?.label, - fromTagToLanguageName(audioTrack?.language)?.let { "[$it]" } - ).joinToString(" ") + val languageName = fromTagToLanguageName(audioTrack?.language) + val label = audioTrack?.label + + val language = when { + languageName.isNullOrBlank() && label.isNullOrBlank() -> null + languageName.isNullOrBlank() -> label + label.isNullOrBlank() -> languageName + label.equals(languageName, ignoreCase = true) -> languageName + else -> "$languageName ($label)" + } val stats = arrayOf(videoCodec, audioCodec, language).filter { !it.isNullOrBlank() }.joinToString(" • ") From 7308aea869b3bc1923f181ac1a1940c06c39e601 Mon Sep 17 00:00:00 2001 From: Phisher98 Date: Thu, 5 Feb 2026 09:02:01 +0530 Subject: [PATCH 7/9] Removing Showing Index --- .../java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt | 1 - 1 file changed, 1 deletion(-) 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 40bd72dd9b..7623fc89dd 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 @@ -1488,7 +1488,6 @@ class GeneratorPlayer : FullScreenPlayer() { } listOfNotNull( - "${index + 1}.", language.takeIf { it.isNotBlank() }?.replaceFirstChar { it.uppercaseChar() }, channels.takeIf { it.isNotBlank() }?.replaceFirstChar { it.uppercaseChar() }, codec.takeIf { it.isNotBlank() }?.uppercase()?.let { "($it)" } From 9505d1ead4c421b77b505da23a26558aaabd9b20 Mon Sep 17 00:00:00 2001 From: Phisher98 Date: Thu, 5 Feb 2026 09:02:15 +0530 Subject: [PATCH 8/9] Removing Showing Index --- .../com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7623fc89dd..8d02f71411 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 @@ -1454,7 +1454,7 @@ class GeneratorPlayer : FullScreenPlayer() { val audioArrayAdapter = ArrayAdapter(ctx, R.layout.sort_bottom_single_choice) audioArrayAdapter.addAll( - currentAudioTracks.mapIndexed { index, track -> + currentAudioTracks.mapIndexed { _, track -> val language = ( track.language?.let { fromTagToLanguageName(it) ?: it } From 60a88184a721080225a55f34f0352bdc022f69f2 Mon Sep 17 00:00:00 2001 From: Phisher98 Date: Thu, 5 Feb 2026 09:12:26 +0530 Subject: [PATCH 9/9] Minor Changes --- .../cloudstream3/ui/player/GeneratorPlayer.kt | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 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 8d02f71411..742894086e 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 @@ -1457,7 +1457,11 @@ class GeneratorPlayer : FullScreenPlayer() { currentAudioTracks.mapIndexed { _, track -> val language = ( - track.language?.let { fromTagToLanguageName(it) ?: it } + track.language?.trim()?.let { raw -> + fromTagToLanguageName(raw) + ?: fromTagToLanguageName(raw.replace('_','-').substringBefore('-').lowercase()) + ?: raw + } ?: track.label ?: "Audio" ).replaceFirstChar { it.uppercaseChar() } @@ -1899,13 +1903,11 @@ class GeneratorPlayer : FullScreenPlayer() { val languageName = fromTagToLanguageName(audioTrack?.language) val label = audioTrack?.label - val language = when { - languageName.isNullOrBlank() && label.isNullOrBlank() -> null - languageName.isNullOrBlank() -> label - label.isNullOrBlank() -> languageName - label.equals(languageName, ignoreCase = true) -> languageName - else -> "$languageName ($label)" - } + val language = languageName?.takeIf { it.isNotBlank() }?.let { lang -> + label?.takeIf { it.isNotBlank() && !it.equals(lang, true) } + ?.let { "$lang ($it)" } + ?: lang + } ?: label?.takeIf { it.isNotBlank() } val stats = arrayOf(videoCodec, audioCodec, language).filter { !it.isNullOrBlank() }.joinToString(" • ")