diff options
| -rw-r--r-- | youtube_dl/extractor/viewster.py | 36 | 
1 files changed, 24 insertions, 12 deletions
diff --git a/youtube_dl/extractor/viewster.py b/youtube_dl/extractor/viewster.py index fe94a4793..1fbf9d794 100644 --- a/youtube_dl/extractor/viewster.py +++ b/youtube_dl/extractor/viewster.py @@ -1,6 +1,8 @@  # coding: utf-8  from __future__ import unicode_literals +import re +  from .common import InfoExtractor  from ..compat import (      compat_HTTPError, @@ -14,6 +16,7 @@ from ..utils import (      parse_iso8601,      sanitized_Request,      HEADRequest, +    url_basename,  ) @@ -114,6 +117,7 @@ class ViewsterIE(InfoExtractor):              return self.playlist_result(entries, video_id, title, description)          formats = [] +        manifest_url = None          for media_type in ('application/f4m+xml', 'application/x-mpegURL', 'video/mp4'):              media = self._download_json(                  'https://public-api.viewster.com/movies/%s/video?mediaType=%s' @@ -126,29 +130,37 @@ class ViewsterIE(InfoExtractor):                  continue              ext = determine_ext(video_url)              if ext == 'f4m': +                manifest_url = video_url                  video_url += '&' if '?' in video_url else '?'                  video_url += 'hdcore=3.2.0&plugin=flowplayer-3.2.0.1'                  formats.extend(self._extract_f4m_formats(                      video_url, video_id, f4m_id='hds'))              elif ext == 'm3u8': +                manifest_url = video_url                  m3u8_formats = self._extract_m3u8_formats(                      video_url, video_id, 'mp4', m3u8_id='hls',                      fatal=False)  # m3u8 sometimes fail                  if m3u8_formats:                      formats.extend(m3u8_formats)              else: -                format_id = media.get('Bitrate') -                f = { -                    'url': video_url, -                    'format_id': 'mp4-%s' % format_id, -                    'height': int_or_none(media.get('Height')), -                    'width': int_or_none(media.get('Width')), -                    'preference': 1, -                } -                if format_id and not f['height']: -                    f['height'] = int_or_none(self._search_regex( -                        r'^(\d+)[pP]$', format_id, 'height', default=None)) -                formats.append(f) +                qualities_basename = self._search_regex( +                    '/([^/]+)(?:.csmil/manifest.f4m|.csmil/master.m3u8)', +                    manifest_url, 'qualities basename', default=None) +                if qualities_basename: +                    QUALITIES_RE = r'((,\d+k)+,?)' +                    qualities = self._search_regex( +                        QUALITIES_RE, qualities_basename, +                        'qualities').strip(',').split(',') +                    http_template = re.sub(QUALITIES_RE, r'%s', qualities_basename) +                    http_url_basename = url_basename(video_url) +                    for q in qualities: +                        formats.append({ +                            'url': video_url.replace(http_url_basename, http_template % q), +                            'ext': 'mp4', +                            'format_id': 'http-%s' % q, +                            'tbr': int_or_none(self._search_regex( +                                r'(\d+)k', q, 'bitrate', default=None)), +                        })          if not formats and not info.get('LanguageSets') and not info.get('VODSettings'):              self.raise_geo_restricted()  | 
