diff --git a/lib/_included_packages/plexnet/plexstream.py b/lib/_included_packages/plexnet/plexstream.py
index 1e67add4..1238ffac 100644
--- a/lib/_included_packages/plexnet/plexstream.py
+++ b/lib/_included_packages/plexnet/plexstream.py
@@ -132,7 +132,7 @@ def __eq__(self, other):
if self.__class__ != other.__class__:
return False
- for attr in ("streamType", "language", "codec", "channels", "index"):
+ for attr in ("streamType", "language", "codec", "channels", "index", "key"):
if getattr(self, attr) != getattr(other, attr):
return False
diff --git a/lib/_included_packages/plexnet/video.py b/lib/_included_packages/plexnet/video.py
index 158f6d7e..e02a82b7 100644
--- a/lib/_included_packages/plexnet/video.py
+++ b/lib/_included_packages/plexnet/video.py
@@ -29,6 +29,7 @@ def items(self):
class Video(media.MediaItem):
TYPE = None
+ manually_selected_sub_stream = False
def __init__(self, *args, **kwargs):
self._settings = None
@@ -59,10 +60,28 @@ def selectedAudioStream(self):
return stream
return None
- def selectedSubtitleStream(self):
+ def selectedSubtitleStream(self, forced_subtitles_override=False):
if self.subtitleStreams:
for stream in self.subtitleStreams:
if stream.isSelected():
+ if forced_subtitles_override and \
+ stream.forced.asBool() and self.manually_selected_sub_stream != stream.id:
+ # try finding a non-forced variant of this stream
+ possible_alt = None
+ for alt_stream in self.subtitleStreams:
+ if alt_stream.language == stream.language and alt_stream != stream \
+ and not alt_stream.forced.asBool():
+ if possible_alt and not possible_alt.key and alt_stream.key:
+ possible_alt = alt_stream
+ break
+ if not possible_alt:
+ possible_alt = alt_stream
+ if possible_alt:
+ util.DEBUG_LOG("Selecting stream %s instead of %s" %
+ (possible_alt, stream))
+ stream.setSelected(False)
+ possible_alt.setSelected(True)
+ return possible_alt
return stream
return None
diff --git a/lib/player.py b/lib/player.py
index 52a37550..c29d61b9 100644
--- a/lib/player.py
+++ b/lib/player.py
@@ -373,7 +373,8 @@ def onPlayBackSeek(self, stime, offset):
# self.showOSD(from_seek=True)
def setSubtitles(self):
- subs = self.player.video.selectedSubtitleStream()
+ subs = self.player.video.selectedSubtitleStream(
+ forced_subtitles_override=util.advancedSettings.forcedSubtitlesOverride)
if subs:
xbmc.sleep(100)
self.player.showSubtitles(False)
diff --git a/lib/util.py b/lib/util.py
index 427ff991..6f239f84 100644
--- a/lib/util.py
+++ b/lib/util.py
@@ -88,6 +88,7 @@ class AdvancedSettings(object):
("kodi_skip_stepping", False),
("auto_seek", True),
("dynamic_timeline_seek", False),
+ ("forced_subtitles_override", False),
("fast_back", False),
)
diff --git a/lib/windows/episodes.py b/lib/windows/episodes.py
index f22697e3..e77d3c2b 100644
--- a/lib/windows/episodes.py
+++ b/lib/windows/episodes.py
@@ -734,7 +734,7 @@ def setItemAudioAndSubtitleInfo(self, video, mli):
sas = video.selectedAudioStream()
mli.setProperty('audio', sas and sas.getTitle(metadata.apiTranslate) or T(32309, 'None'))
- sss = video.selectedSubtitleStream()
+ sss = video.selectedSubtitleStream(forced_subtitles_override=util.advancedSettings.forcedSubtitlesOverride)
if sss:
if len(video.subtitleStreams) > 1:
mli.setProperty(
diff --git a/lib/windows/playersettings.py b/lib/windows/playersettings.py
index bd7ac270..d2fbd4e8 100644
--- a/lib/windows/playersettings.py
+++ b/lib/windows/playersettings.py
@@ -105,7 +105,8 @@ def getAudioAndSubtitleInfo(self):
sas = self.video.selectedAudioStream()
audio = sas and sas.getTitle(metadata.apiTranslate) or T(32309, 'None')
- sss = self.video.selectedSubtitleStream()
+ sss = self.video.selectedSubtitleStream(
+ forced_subtitles_override=util.advancedSettings.forcedSubtitlesOverride)
if sss:
if len(self.video.subtitleStreams) > 1:
subtitle = u'{0} \u2022 {1} {2}'.format(sss.getTitle(metadata.apiTranslate), len(self.video.subtitleStreams) - 1, T(32307, 'More'))
@@ -253,6 +254,7 @@ def showSubtitlesDialog(video, non_playback=False):
return
video.selectStream(choice)
+ video.manually_selected_sub_stream = choice.id
def showQualityDialog(video, non_playback=False, selected_idx=None):
diff --git a/lib/windows/preplay.py b/lib/windows/preplay.py
index 8e064a71..c03b2d55 100644
--- a/lib/windows/preplay.py
+++ b/lib/windows/preplay.py
@@ -522,7 +522,8 @@ def setAudioAndSubtitleInfo(self):
sas = self.video.selectedAudioStream()
self.setProperty('audio', sas and sas.getTitle(metadata.apiTranslate) or T(32309, 'None'))
- sss = self.video.selectedSubtitleStream()
+ sss = self.video.selectedSubtitleStream(
+ forced_subtitles_override=util.advancedSettings.forcedSubtitlesOverride)
if sss:
if len(self.video.subtitleStreams) > 1:
self.setProperty(
diff --git a/lib/windows/seekdialog.py b/lib/windows/seekdialog.py
index 4d7753f5..b462c871 100644
--- a/lib/windows/seekdialog.py
+++ b/lib/windows/seekdialog.py
@@ -510,8 +510,12 @@ def videoSettingsHaveChanged(self):
self.initialAudioStream = self.player.video.selectedAudioStream()
changed = True
- if self.player.video.selectedSubtitleStream() != self.initialSubtitleStream:
- self.initialSubtitleStream = self.player.video.selectedSubtitleStream()
+ if self.player.video.selectedSubtitleStream(
+ forced_subtitles_override=util.advancedSettings.forcedSubtitlesOverride
+ ) != self.initialSubtitleStream:
+ self.initialSubtitleStream = \
+ self.player.video.selectedSubtitleStream(
+ forced_subtitles_override=util.advancedSettings.forcedSubtitlesOverride)
if changed or self.handler.mode == self.handler.MODE_RELATIVE:
return True
else:
diff --git a/lib/windows/subitems.py b/lib/windows/subitems.py
index 6f5aa960..fc152006 100644
--- a/lib/windows/subitems.py
+++ b/lib/windows/subitems.py
@@ -151,7 +151,8 @@ def updateProperties(self):
sas = self.mediaItem.selectedAudioStream()
self.setProperty('audio', sas and sas.getTitle() or 'None')
- sss = self.mediaItem.selectedSubtitleStream()
+ sss = self.mediaItem.selectedSubtitleStream(
+ forced_subtitles_override=util.advancedSettings.forcedSubtitlesOverride)
self.setProperty('subtitles', sss and sss.getTitle() or 'None')
leafcount = self.mediaItem.leafCount.asFloat()
diff --git a/resources/language/English/strings.po b/resources/language/English/strings.po
index 90041a57..ad34133a 100644
--- a/resources/language/English/strings.po
+++ b/resources/language/English/strings.po
@@ -977,4 +977,8 @@ msgstr ""
msgctxt "#32492"
msgid "Kodi Subtitle Settings"
+msgstr ""
+
+msgctxt "#32493"
+msgid "Prefer normal over forced subtitles if available (PMS selects forced by default)"
msgstr ""
\ No newline at end of file
diff --git a/resources/settings.xml b/resources/settings.xml
index a30da7ce..f3c54013 100644
--- a/resources/settings.xml
+++ b/resources/settings.xml
@@ -12,6 +12,7 @@
+