Skip to content
Merged
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
2 changes: 1 addition & 1 deletion addon.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="script.module.python.twitch" name="python-twitch for Kodi" version="2.0.16~beta2" provider-name="anxdpanic, A Talented Community">
<addon id="script.module.python.twitch" name="python-twitch for Kodi" version="2.0.16" provider-name="anxdpanic, A Talented Community">
<requires>
<import addon="xbmc.python" version="2.20.0"/>
<import addon="script.module.six" version="1.11.0"/>
Expand Down
45 changes: 31 additions & 14 deletions resources/lib/twitch/api/usher.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@

from six.moves.urllib.parse import urlencode

ACCESS_TOKEN_EXCEPTION = {
'error': 'Error',
'message': 'Failed to retrieve access token',
'status': 404
}


def valid_video_id(video_id):
if video_id.startswith('videos'):
Expand Down Expand Up @@ -74,10 +80,11 @@ def _legacy_video(video_id):

def live_request(channel, platform=keys.WEB, headers={}):
token = channel_token(channel, platform=platform, headers=headers)
if keys.ERROR in token:
return token
token = token[0][keys.DATA][keys.STREAM_PLAYBACK_ACCESS_TOKEN]

if not token:
return ACCESS_TOKEN_EXCEPTION
else:
token = token[0][keys.DATA][keys.STREAM_PLAYBACK_ACCESS_TOKEN]
signature = token[keys.SIGNATURE]
access_token = token[keys.VALUE]
q = UsherQuery('api/channel/hls/{channel}.m3u8', headers=headers)
Expand All @@ -94,16 +101,19 @@ def live_request(channel, platform=keys.WEB, headers={}):
q.add_param(keys.RTQOS, keys.CONTROL)
q.add_param(keys.PLAYER_BACKEND, keys.MEDIAPLAYER)
url = '?'.join([q.url, urlencode(q.params)])
request_dict = {'url': url, 'headers': q.headers}
request_dict = {
'url': url,
'headers': q.headers
}
log.debug('live_request: |{0}|'.format(str(request_dict)))
return request_dict


@query
def _live(channel, token, headers={}):
token = token[0][keys.DATA][keys.STREAM_PLAYBACK_ACCESS_TOKEN]
signature = token[keys.SIGNATURE]
access_token = token[keys.VALUE]

q = UsherQuery('api/channel/hls/{channel}.m3u8', headers=headers)
q.add_urlkw(keys.CHANNEL, channel)
q.add_param(keys.SIG, signature.encode('utf-8'))
Expand All @@ -123,8 +133,9 @@ def _live(channel, token, headers={}):
@m3u8
def live(channel, platform=keys.WEB, headers={}):
token = channel_token(channel, platform=platform, headers=headers)
if keys.ERROR in token:
return token
token = token[0][keys.DATA][keys.STREAM_PLAYBACK_ACCESS_TOKEN]
if not token:
return ACCESS_TOKEN_EXCEPTION
else:
return _live(channel, token, headers=headers)

Expand All @@ -133,10 +144,11 @@ def video_request(video_id, platform=keys.WEB, headers={}):
video_id = valid_video_id(video_id)
if video_id:
token = vod_token(video_id, platform=platform, headers=headers)
if keys.ERROR in token:
return token
token = token[0][keys.DATA][keys.VIDEO_PLAYBACK_ACCESS_TOKEN]

if not token:
return ACCESS_TOKEN_EXCEPTION
else:
token = token[0][keys.DATA][keys.VIDEO_PLAYBACK_ACCESS_TOKEN]
signature = token[keys.SIGNATURE]
access_token = token[keys.VALUE]
q = UsherQuery('vod/{id}', headers=headers)
Expand All @@ -154,7 +166,10 @@ def video_request(video_id, platform=keys.WEB, headers={}):
q.add_param(keys.BAKING_BROWNIES, Boolean.TRUE)
q.add_param(keys.BAKING_BROWNIES_TIMEOUT, 1050)
url = '?'.join([q.url, urlencode(q.params)])
request_dict = {'url': url, 'headers': q.headers}
request_dict = {
'url': url,
'headers': q.headers
}
log.debug('video_request: |{0}|'.format(str(request_dict)))
return request_dict
else:
Expand All @@ -163,9 +178,9 @@ def video_request(video_id, platform=keys.WEB, headers={}):

@query
def _vod(video_id, token, headers={}):
token = token[0][keys.DATA][keys.VIDEO_PLAYBACK_ACCESS_TOKEN]
signature = token[keys.SIGNATURE]
access_token = token[keys.VALUE]

q = UsherQuery('vod/{id}', headers=headers)
q.add_urlkw(keys.ID, video_id)
q.add_param(keys.NAUTHSIG, signature.encode('utf-8'))
Expand All @@ -188,8 +203,10 @@ def video(video_id, platform=keys.WEB, headers={}):
video_id = valid_video_id(video_id)
if video_id:
token = vod_token(video_id, platform=platform, headers=headers)
if keys.ERROR in token:
return token
token = token[0][keys.DATA][keys.VIDEO_PLAYBACK_ACCESS_TOKEN]

if not token:
return ACCESS_TOKEN_EXCEPTION
else:
return _vod(video_id, token, headers=headers)
else:
Expand Down