diff options
| -rw-r--r-- | youtube_dl/extractor/common.py | 11 | ||||
| -rw-r--r-- | youtube_dl/extractor/twitch.py | 6 | 
2 files changed, 17 insertions, 0 deletions
| diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index 4b0ee882c..31599bf52 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -839,6 +839,7 @@ class InfoExtractor(object):              note='Downloading m3u8 information',              errnote='Failed to download m3u8 information')          last_info = None +        last_media= None          kv_rex = re.compile(              r'(?P<key>[a-zA-Z_-]+)=(?P<val>"[^"]+"|[^",]+)(?:,|$)')          for line in m3u8_doc.splitlines(): @@ -849,6 +850,13 @@ class InfoExtractor(object):                      if v.startswith('"'):                          v = v[1:-1]                      last_info[m.group('key')] = v +            elif line.startswith('#EXT-X-MEDIA:'): +                last_media = {} +                for m in kv_rex.finditer(line): +                    v = m.group('val') +                    if v.startswith('"'): +                        v = v[1:-1] +                    last_media[m.group('key')] = v              elif line.startswith('#') or not line.strip():                  continue              else: @@ -877,6 +885,9 @@ class InfoExtractor(object):                      width_str, height_str = resolution.split('x')                      f['width'] = int(width_str)                      f['height'] = int(height_str) +                if last_media is not None: +                    f['m3u8_media'] = last_media +                    last_media = None                  formats.append(f)                  last_info = {}          self._sort_formats(formats) diff --git a/youtube_dl/extractor/twitch.py b/youtube_dl/extractor/twitch.py index 87290d002..8e296698e 100644 --- a/youtube_dl/extractor/twitch.py +++ b/youtube_dl/extractor/twitch.py @@ -348,6 +348,12 @@ class TwitchStreamIE(TwitchBaseIE):              '%s/api/channel/hls/%s.m3u8?%s'              % (self._USHER_BASE, channel_id, compat_urllib_parse.urlencode(query).encode('utf-8')),              channel_id, 'mp4') +        # prefer the 'source' stream, the others are limited to 30 fps +        def _sort_source(f): +            if f.get('m3u8_media') is not None and f['m3u8_media'].get('NAME') == 'Source': +                return 1 +            return 0 +        formats = sorted(formats, key=_sort_source)          view_count = stream.get('viewers')          timestamp = parse_iso8601(stream.get('created_at')) | 
