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 @@ +