diff options
| author | Remita Amine <remitamine@gmail.com> | 2017-05-12 16:17:32 +0100 | 
|---|---|---|
| committer | Remita Amine <remitamine@gmail.com> | 2017-05-12 16:37:09 +0100 | 
| commit | 6c52477f595176d16f063407bcf44439b9c26022 (patch) | |
| tree | d9b4eccd18bf6fb6372ad00c428dd0c4f869b08c | |
| parent | 116283ff640ec77de7359ddaffaa8dfbb50f6e17 (diff) | |
[condenast] improve embed support
| -rw-r--r-- | youtube_dl/extractor/condenast.py | 81 | ||||
| -rw-r--r-- | youtube_dl/extractor/generic.py | 16 | 
2 files changed, 54 insertions, 43 deletions
| diff --git a/youtube_dl/extractor/condenast.py b/youtube_dl/extractor/condenast.py index d3463b874..0c3f0c0e4 100644 --- a/youtube_dl/extractor/condenast.py +++ b/youtube_dl/extractor/condenast.py @@ -16,7 +16,6 @@ from ..utils import (      mimetype2ext,      orderedSet,      parse_iso8601, -    remove_end,  ) @@ -50,10 +49,17 @@ class CondeNastIE(InfoExtractor):          'wmagazine': 'W Magazine',      } -    _VALID_URL = r'https?://(?:video|www|player)\.(?P<site>%s)\.com/(?P<type>watch|series|video|embed(?:js)?)/(?P<id>[^/?#]+)' % '|'.join(_SITES.keys()) +    _VALID_URL = r'''(?x)https?://(?:video|www|player(?:-backend)?)\.(?:%s)\.com/ +        (?: +            (?: +                embed(?:js)?| +                (?:script|inline)/video +            )/(?P<id>[0-9a-f]{24})(?:/(?P<player_id>[0-9a-f]{24}))?(?:.+?\btarget=(?P<target>[^&]+))?| +            (?P<type>watch|series|video)/(?P<display_id>[^/?#]+) +        )''' % '|'.join(_SITES.keys())      IE_DESC = 'Condé Nast media group: %s' % ', '.join(sorted(_SITES.values())) -    EMBED_URL = r'(?:https?:)?//player\.(?P<site>%s)\.com/(?P<type>embed(?:js)?)/.+?' % '|'.join(_SITES.keys()) +    EMBED_URL = r'(?:https?:)?//player(?:-backend)?\.(?:%s)\.com/(?:embed(?:js)?|(?:script|inline)/video)/.+?' % '|'.join(_SITES.keys())      _TESTS = [{          'url': 'http://video.wired.com/watch/3d-printed-speakers-lit-with-led', @@ -89,6 +95,12 @@ class CondeNastIE(InfoExtractor):              'upload_date': '20150916',              'timestamp': 1442434955,          } +    }, { +        'url': 'https://player.cnevids.com/inline/video/59138decb57ac36b83000005.js?target=js-cne-player', +        'only_matching': True, +    }, { +        'url': 'http://player-backend.cnevids.com/script/video/59138decb57ac36b83000005.js', +        'only_matching': True,      }]      def _extract_series(self, url, webpage): @@ -104,7 +116,7 @@ class CondeNastIE(InfoExtractor):          entries = [self.url_result(build_url(path), 'CondeNast') for path in paths]          return self.playlist_result(entries, playlist_title=title) -    def _extract_video(self, webpage, url_type): +    def _extract_video_params(self, webpage):          query = {}          params = self._search_regex(              r'(?s)var params = {(.+?)}[;,]', webpage, 'player params', default=None) @@ -123,17 +135,30 @@ class CondeNastIE(InfoExtractor):                  'playerId': params['data-player'],                  'target': params['id'],              }) -        video_id = query['videoId'] +        return query + +    def _extract_video(self, params): +        video_id = params['videoId'] +          video_info = None -        info_page = self._download_json( -            'http://player.cnevids.com/player/video.js', -            video_id, 'Downloading video info', fatal=False, query=query) -        if info_page: -            video_info = info_page.get('video') -        if not video_info: +        if params.get('playerId'): +            info_page = self._download_json( +                'http://player.cnevids.com/player/video.js', +                video_id, 'Downloading video info', fatal=False, query=params) +            if info_page: +                video_info = info_page.get('video') +            if not video_info: +                info_page = self._download_webpage( +                    'http://player.cnevids.com/player/loader.js', +                    video_id, 'Downloading loader info', query=params) +        else:              info_page = self._download_webpage( -                'http://player.cnevids.com/player/loader.js', -                video_id, 'Downloading loader info', query=query) +                'https://player.cnevids.com/inline/video/%s.js' % video_id, +                video_id, 'Downloading inline info', query={ +                    'target': params.get('target', 'embedplayer') +                }) + +        if not video_info:              video_info = self._parse_json(                  self._search_regex(                      r'(?s)var\s+config\s*=\s*({.+?});', info_page, 'config'), @@ -161,9 +186,7 @@ class CondeNastIE(InfoExtractor):              })          self._sort_formats(formats) -        info = self._search_json_ld( -            webpage, video_id, fatal=False) if url_type != 'embed' else {} -        info.update({ +        return {              'id': video_id,              'formats': formats,              'title': title, @@ -174,22 +197,26 @@ class CondeNastIE(InfoExtractor):              'series': video_info.get('series_title'),              'season': video_info.get('season_title'),              'timestamp': parse_iso8601(video_info.get('premiere_date')), -        }) -        return info +            'categories': video_info.get('categories'), +        }      def _real_extract(self, url): -        site, url_type, item_id = re.match(self._VALID_URL, url).groups() +        video_id, player_id, target, url_type, display_id = re.match(self._VALID_URL, url).groups() -        # Convert JS embed to regular embed -        if url_type == 'embedjs': -            parsed_url = compat_urlparse.urlparse(url) -            url = compat_urlparse.urlunparse(parsed_url._replace( -                path=remove_end(parsed_url.path, '.js').replace('/embedjs/', '/embed/'))) -            url_type = 'embed' +        if video_id: +            return self._extract_video({ +                'videoId': video_id, +                'playerId': player_id, +                'target': target, +            }) -        webpage = self._download_webpage(url, item_id) +        webpage = self._download_webpage(url, display_id)          if url_type == 'series':              return self._extract_series(url, webpage)          else: -            return self._extract_video(webpage, url_type) +            params = self._extract_video_params(webpage) +            info = self._search_json_ld( +                webpage, display_id, fatal=False) +            info.update(self._extract_video(params)) +            return info diff --git a/youtube_dl/extractor/generic.py b/youtube_dl/extractor/generic.py index b06f43446..635043c9e 100644 --- a/youtube_dl/extractor/generic.py +++ b/youtube_dl/extractor/generic.py @@ -2146,22 +2146,6 @@ class GenericIE(InfoExtractor):          if svt_url:              return self.url_result(svt_url, 'SVT') -        # Look for embedded condenast player -        matches = re.findall( -            r'<iframe\s+(?:[a-zA-Z-]+="[^"]+"\s+)*?src="(https?://player\.cnevids\.com/embed/[^"]+")', -            webpage) -        if matches: -            return { -                '_type': 'playlist', -                'entries': [{ -                    '_type': 'url', -                    'ie_key': 'CondeNast', -                    'url': ma, -                } for ma in matches], -                'title': video_title, -                'id': video_id, -            } -          # Look for Bandcamp pages with custom domain          mobj = re.search(r'<meta property="og:url"[^>]*?content="(.*?bandcamp\.com.*?)"', webpage)          if mobj is not None: | 
