diff options
Diffstat (limited to 'youtube_dl/extractor/brightcove.py')
| -rw-r--r-- | youtube_dl/extractor/brightcove.py | 22 | 
1 files changed, 17 insertions, 5 deletions
| diff --git a/youtube_dl/extractor/brightcove.py b/youtube_dl/extractor/brightcove.py index c947337f9..f8413d5f2 100644 --- a/youtube_dl/extractor/brightcove.py +++ b/youtube_dl/extractor/brightcove.py @@ -13,6 +13,7 @@ from ..compat import (      compat_urllib_parse_urlparse,      compat_urlparse,      compat_xml_parse_error, +    compat_HTTPError,  )  from ..utils import (      determine_ext, @@ -355,7 +356,7 @@ class BrightcoveLegacyIE(InfoExtractor):  class BrightcoveNewIE(InfoExtractor):      IE_NAME = 'brightcove:new' -    _VALID_URL = r'https?://players\.brightcove\.net/(?P<account_id>\d+)/(?P<player_id>[^/]+)_(?P<embed>[^/]+)/index\.html\?.*videoId=(?P<video_id>(?:ref:)?\d+)' +    _VALID_URL = r'https?://players\.brightcove\.net/(?P<account_id>\d+)/(?P<player_id>[^/]+)_(?P<embed>[^/]+)/index\.html\?.*videoId=(?P<video_id>\d+|ref:[^&]+)'      _TESTS = [{          'url': 'http://players.brightcove.net/929656772001/e41d32dc-ec74-459e-a845-6c69f7b724ea_default/index.html?videoId=4463358922001',          'md5': 'c8100925723840d4b0d243f7025703be', @@ -391,6 +392,10 @@ class BrightcoveNewIE(InfoExtractor):          # ref: prefixed video id          'url': 'http://players.brightcove.net/3910869709001/21519b5c-4b3b-4363-accb-bdc8f358f823_default/index.html?videoId=ref:7069442',          'only_matching': True, +    }, { +        # non numeric ref: prefixed video id +        'url': 'http://players.brightcove.net/710858724001/default_default/index.html?videoId=ref:event-stream-356', +        'only_matching': True,      }]      @staticmethod @@ -424,7 +429,7 @@ class BrightcoveNewIE(InfoExtractor):                      </video>.*?                      <script[^>]+                          src=["\'](?:https?:)?//players\.brightcove\.net/ -                        (\d+)/([\da-f-]+)_([^/]+)/index\.min\.js +                        (\d+)/([\da-f-]+)_([^/]+)/index(?:\.min)?\.js                  ''', webpage):              entries.append(                  'http://players.brightcove.net/%s/%s_%s/index.html?videoId=%s' @@ -458,15 +463,22 @@ class BrightcoveNewIE(InfoExtractor):              'https://edge.api.brightcove.com/playback/v1/accounts/%s/videos/%s'              % (account_id, video_id),              headers={'Accept': 'application/json;pk=%s' % policy_key}) -        json_data = self._download_json(req, video_id) +        try: +            json_data = self._download_json(req, video_id) +        except ExtractorError as e: +            if isinstance(e.cause, compat_HTTPError) and e.cause.code == 403: +                json_data = self._parse_json(e.cause.read().decode(), video_id) +                raise ExtractorError(json_data[0]['message'], expected=True) +            raise          title = json_data['name']          formats = []          for source in json_data.get('sources', []): +            container = source.get('container')              source_type = source.get('type')              src = source.get('src') -            if source_type == 'application/x-mpegURL': +            if source_type == 'application/x-mpegURL' or container == 'M2TS':                  if not src:                      continue                  formats.extend(self._extract_m3u8_formats( @@ -484,7 +496,7 @@ class BrightcoveNewIE(InfoExtractor):                      'width': int_or_none(source.get('width')),                      'height': height,                      'filesize': int_or_none(source.get('size')), -                    'container': source.get('container'), +                    'container': container,                      'vcodec': source.get('codec'),                      'ext': source.get('container').lower(),                  } | 
