|
|
@ -22,6 +22,7 @@ class TwitchIE(InfoExtractor): |
|
|
|
_VALID_URL = r"""(?x)^(?:http://)?(?:www\.)?twitch\.tv/ |
|
|
|
(?: |
|
|
|
(?P<channelid>[^/]+)| |
|
|
|
(?:(?:[^/]+)/v/(?P<vodid>[^/]+))| |
|
|
|
(?:(?:[^/]+)/b/(?P<videoid>[^/]+))| |
|
|
|
(?:(?:[^/]+)/c/(?P<chapterid>[^/]+)) |
|
|
|
) |
|
|
@ -70,11 +71,24 @@ class TwitchIE(InfoExtractor): |
|
|
|
def _extract_media(self, item, item_id): |
|
|
|
ITEMS = { |
|
|
|
'a': 'video', |
|
|
|
'v': 'vod', |
|
|
|
'c': 'chapter', |
|
|
|
} |
|
|
|
info = self._extract_info(self._download_json( |
|
|
|
'%s/kraken/videos/%s%s' % (self._API_BASE, item, item_id), item_id, |
|
|
|
'Downloading %s info JSON' % ITEMS[item])) |
|
|
|
|
|
|
|
if item == 'v': |
|
|
|
access_token = self._download_json( |
|
|
|
'%s/api/vods/%s/access_token' % (self._API_BASE, item_id), item_id, |
|
|
|
'Downloading %s access token' % ITEMS[item]) |
|
|
|
formats = self._extract_m3u8_formats( |
|
|
|
'http://usher.twitch.tv/vod/%s?nauth=%s&nauthsig=%s' |
|
|
|
% (item_id, access_token['token'], access_token['sig']), |
|
|
|
item_id, 'mp4') |
|
|
|
info['formats'] = formats |
|
|
|
return info |
|
|
|
|
|
|
|
response = self._download_json( |
|
|
|
'%s/api/videos/%s%s' % (self._API_BASE, item, item_id), item_id, |
|
|
|
'Downloading %s playlist JSON' % ITEMS[item]) |
|
|
@ -209,6 +223,8 @@ class TwitchIE(InfoExtractor): |
|
|
|
""" |
|
|
|
elif mobj.group('videoid'): |
|
|
|
return self._extract_media('a', mobj.group('videoid')) |
|
|
|
elif mobj.group('vodid'): |
|
|
|
return self._extract_media('v', mobj.group('vodid')) |
|
|
|
elif mobj.group('channelid'): |
|
|
|
channel_id = mobj.group('channelid') |
|
|
|
info = self._download_json( |
|
|
|