Patch for adding preferred subtitle language tracks and preferred audio language tracks for Android devices

"Miller, Kyle via vlc-devel" <[email protected]>
Newsgroups gmane.comp.video.videolan.vlc.devel
Message-ID <BL0PR01MB47546473644FFB2F5F2C2E60CEB19@BL0PR01MB4754.prod.exchangelabs.com>
This has been a feature mentioned maybe as many as 8 years ago if I recall from reading the requests correctly. I have use for it, so I implemented it for my FireTV.

I was not sure how to make the test suite checks or anything, but I tested the code a few times and it seems to work.

There were 2 lines of code I was not sure about replacing but it seemed necessary for this patch to work correctly. That part is checking to see if media.id == 0L. I cannot figure out the purpose of this check and it breaks my code if I keep it.

_______________________________________________
vlc-devel mailing list
To unsubscribe or modify your subscription options:
https://mailman.videolan.org/listinfo/vlc-devel
0001-Implemented-subtitle-track-langauge-preferences-and-.patch (text/x-patch, 7.3 KB)
From 5fa5de051da8827bffa41f409f222135af993336 Mon Sep 17 00:00:00 2001
From: Kyle Miller <[email protected]>
Date: Thu, 7 Oct 2021 10:24:54 -0400
Subject: [PATCH] Implemented subtitle track langauge preferences and audio
 track language preferences

---
 .../resources/src/main/res/values/strings.xml |  2 ++
 .../vlc-android/res/xml/preferences_audio.xml |  6 ++++
 .../res/xml/preferences_subtitles.xml         |  5 +++
 .../vlc/gui/video/VideoPlayerActivity.kt      | 34 ++++++++++++++++---
 4 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/application/resources/src/main/res/values/strings.xml b/application/resources/src/main/res/values/strings.xml
index e2da8afd4..b8be7c62e 100644
--- a/application/resources/src/main/res/values/strings.xml
+++ b/application/resources/src/main/res/values/strings.xml
@@ -291,6 +291,7 @@
     <string name="screen_orientation_last_locked">Last locked orientation</string>
     <string name="enable_black_theme">Black theme</string>
     <string name="subtitle_text_encoding">Subtitle text encoding</string>
+    <string name="subtitle_preferred_language">Preferred subtitle language</string>
     <string name="daynight_title">DayNight mode</string>
     <string name="daynight_follow_system_title">Follow system mode</string>
 
@@ -589,6 +590,7 @@
     <string name="audio_digital_failed">Failed to change Audio Digital Output state</string>
     <string name="audio_digital_output_enabled">Audio Digital Output enabled</string>
     <string name="audio_digital_output_disabled">Audio Digital Output disabled</string>
+    <string name="audio_preferred_language">Preferred audio language</string>
     <string name="audio_digital_title">Digital audio output (passthrough)</string>
     <string name="audio_task_cleared_title">Stop on application swipe</string>
     <string name="audio_task_cleared_summary">Stop playback when application is dismissed</string>
diff --git a/application/vlc-android/res/xml/preferences_audio.xml b/application/vlc-android/res/xml/preferences_audio.xml
index 2cc8a86e6..961a7f168 100644
--- a/application/vlc-android/res/xml/preferences_audio.xml
+++ b/application/vlc-android/res/xml/preferences_audio.xml
@@ -31,6 +31,12 @@
             android:key="audio_digital_output"
             android:title="@string/audio_digital_title"/>
 
+    <EditTextPreference
+        android:defaultValue=""
+        android:key="audio_preferred_language"
+        android:persistent="true"
+        android:title="@string/audio_preferred_language"/>
+
     <PreferenceCategory
             android:title="@string/headset_prefs_category"
             android:key="headset_prefs_category">
diff --git a/application/vlc-android/res/xml/preferences_subtitles.xml b/application/vlc-android/res/xml/preferences_subtitles.xml
index 5c053410d..bfd303a83 100644
--- a/application/vlc-android/res/xml/preferences_subtitles.xml
+++ b/application/vlc-android/res/xml/preferences_subtitles.xml
@@ -41,5 +41,10 @@
             android:key="subtitle_text_encoding"
             android:persistent="true"
             android:title="@string/subtitle_text_encoding"/>
+    <EditTextPreference
+            android:defaultValue=""
+            android:key="subtitle_preferred_language"
+            android:persistent="true"
+            android:title="@string/subtitle_preferred_language"/>
 
 </androidx.preference.PreferenceScreen>
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
index 05763ed3a..db96ff332 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt
@@ -1246,20 +1246,46 @@ open class VideoPlayerActivity : AppCompatActivity(), PlaybackService.Callback,
                         if (event.esChangedType == IMedia.Track.Type.Audio) {
                             lifecycleScope.launch(Dispatchers.IO) {
                                 val media = medialibrary.findMedia(mw)
-                                val audioTrack = media.getMetaLong(MediaWrapper.META_AUDIOTRACK).toInt()
+                                var preferredTrack: Int = 0
+                                val contains = settings.getString("audio_preferred_language", null)
+                                val it = PlaybackService.instance?.audioTracks?.iterator()
+                                while (it?.hasNext() === true) {
+                                    val next = it?.next()
+                                    if (next.name.contains(contains.toString(), ignoreCase = true)) {
+                                        preferredTrack = next.id
+                                        break
+                                    }
+                                }
+                                val audioTrack = when (val savedTrack = media.getMetaLong(MediaWrapper.META_AUDIOTRACK).toInt()) {
+                                    0 -> preferredTrack
+                                    else -> savedTrack
+                                }
                                 if (audioTrack != 0 || currentAudioTrack != -2)
-                                    service.setAudioTrack(if (media.id == 0L) currentAudioTrack else audioTrack)
+                                    service.setAudioTrack(audioTrack)
                             }
                         } else if (event.esChangedType == IMedia.Track.Type.Text) {
                             lifecycleScope.launch(Dispatchers.IO) {
                                 val media = medialibrary.findMedia(mw)
-                                val spuTrack = media.getMetaLong(MediaWrapper.META_SUBTITLE_TRACK).toInt()
+                                var preferredTrack: Int = 0
+                                val contains = settings.getString("subtitle_preferred_language", null)
+                                val it = PlaybackService.instance?.spuTracks?.iterator()
+                                while (it?.hasNext() === true) {
+                                    val next = it?.next()
+                                    if (next.name.contains(contains.toString(), ignoreCase = true)) {
+                                        preferredTrack = next.id
+                                        break
+                                    }
+                                }
+                                val spuTrack = when (val savedTrack = media.getMetaLong(MediaWrapper.META_SUBTITLE_TRACK).toInt()) {
+                                    0 -> preferredTrack
+                                    else -> savedTrack
+                                }
                                 if (addNextTrack) {
                                     val tracks = service.spuTracks
                                     if (!(tracks as Array<MediaPlayer.TrackDescription>).isNullOrEmpty()) service.setSpuTrack(tracks[tracks.size - 1].id)
                                     addNextTrack = false
                                 } else if (spuTrack != 0 || currentSpuTrack != -2) {
-                                    service.setSpuTrack(if (media.id == 0L) currentSpuTrack else spuTrack)
+                                    service.setSpuTrack(spuTrack)
                                     lastSpuTrack = -2
                                 }
                             }
-- 
2.25.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.