Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions resources/language/resource.language.en_gb/strings.po
Original file line number Diff line number Diff line change
Expand Up @@ -1005,3 +1005,15 @@ msgstr ""
msgctxt "#30273"
msgid "OAuth Token is expired or invalid"
msgstr ""

msgctxt "#30307"
msgid "Supported codecs"
msgstr ""

msgctxt "#30308"
msgid "Twitch default"
msgstr ""

msgctxt "#30309"
msgid "H.265 (HEVC)"
msgstr ""
26 changes: 20 additions & 6 deletions resources/lib/twitch_addon/addon/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
from twitch.api import helix as twitch
from twitch.api.parameters import Language, Boolean, VideoSort, PeriodHelix

try:
from inspect import signature as _signature
# Older library versions don't accept the supported_codecs keyword; degrade gracefully.
_USHER_SUPPORTS_CODECS = 'supported_codecs' in _signature(usher.live_request).parameters
except Exception:
_USHER_SUPPORTS_CODECS = False

i18n = utils.i18n


Expand Down Expand Up @@ -329,10 +336,17 @@ def get_followed_streams(self, user_id, after='MA==', first=20):
results = self.error_check(results)
return results

@staticmethod
def _codec_kwargs():
codecs = utils.get_supported_codecs()
if codecs and _USHER_SUPPORTS_CODECS:
return {'supported_codecs': codecs}
return {}

@api_error_handler
@cache.cache_method(cache_limit=cache.limit)
def get_vod(self, video_id):
results = self.usher.video(video_id, headers=self.get_private_credential_headers())
results = self.usher.video(video_id, headers=self.get_private_credential_headers(), **self._codec_kwargs())
return self.error_check(results, private=True)

@api_error_handler
Expand All @@ -343,25 +357,25 @@ def get_clip(self, slug):
@api_error_handler
@cache.cache_method(cache_limit=cache.limit)
def get_live(self, name):
results = self.usher.live(name, headers=self.get_private_credential_headers())
results = self.usher.live(name, headers=self.get_private_credential_headers(), **self._codec_kwargs())
return self.error_check(results, private=True)

@api_error_handler
@cache.cache_method(cache_limit=cache.limit)
def live_request(self, name):
if not utils.inputstream_adpative_supports('EXT-X-DISCONTINUITY'):
results = self.usher.live_request(name, platform='ps4', headers=self.get_private_credential_headers())
results = self.usher.live_request(name, platform='ps4', headers=self.get_private_credential_headers(), **self._codec_kwargs())
else:
results = self.usher.live_request(name, headers=self.get_private_credential_headers())
results = self.usher.live_request(name, headers=self.get_private_credential_headers(), **self._codec_kwargs())
return self.error_check(results, private=True)

@api_error_handler
@cache.cache_method(cache_limit=cache.limit)
def video_request(self, video_id):
if not utils.inputstream_adpative_supports('EXT-X-DISCONTINUITY'):
results = self.usher.video_request(video_id, platform='ps4', headers=self.get_private_credential_headers())
results = self.usher.video_request(video_id, platform='ps4', headers=self.get_private_credential_headers(), **self._codec_kwargs())
else:
results = self.usher.video_request(video_id, headers=self.get_private_credential_headers())
results = self.usher.video_request(video_id, headers=self.get_private_credential_headers(), **self._codec_kwargs())
return self.error_check(results, private=True)

@staticmethod
Expand Down
11 changes: 11 additions & 0 deletions resources/lib/twitch_addon/addon/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,17 @@ def append_headers(headers):
return '|%s' % '&'.join(['%s=%s' % (key, quote_plus(headers[key])) for key in headers])


# supported_codecs setting -> usher 'supported_codecs' value. Index 0 = Twitch default (omit param).
SUPPORTED_CODECS = ('', 'h265,h264')


def get_supported_codecs():
try:
return SUPPORTED_CODECS[int(kodi.get_setting('supported_codecs'))]
except (ValueError, IndexError):
return ''


def get_redirect_uri():
settings_id = kodi.get_setting('oauth_redirecturi')
stripped_id = settings_id.strip()
Expand Down
2 changes: 2 additions & 0 deletions resources/settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
<setting id="video_support_ia_addon" type="bool" label="" visible="false" enable="true" default="false"/>
<setting id="video_quality_ia" type="bool" label="30223" default="false" enable="eq(-1,true)|eq(-2,true)"/>
<setting id="video_quality_ia_configure" type="action" label="30224" enable="eq(-1,true)+eq(-2,true)" visible="eq(-1,true)+eq(-2,true)" option="close" action="RunPlugin(plugin://$ID/?mode=configure_ia)"/>
<!-- Supported codecs (Twitch Enhanced Broadcasting: HEVC enables 1440p+ variants; requires hardware decode) -->
<setting id="supported_codecs" type="enum" label="30307" lvalues="30308|30309" default="0"/>
<!-- Title Display -->
<setting id="title_display" type="enum" label="30045" lvalues="30046|30047|30048|30049|30051|30067|30054" default="0"/>
<!-- Truncate titles -->
Expand Down