diff options
| -rw-r--r-- | youtube_dl/extractor/vimeo.py | 97 | 
1 files changed, 9 insertions, 88 deletions
| diff --git a/youtube_dl/extractor/vimeo.py b/youtube_dl/extractor/vimeo.py index ddf375c6c..5dc38e243 100644 --- a/youtube_dl/extractor/vimeo.py +++ b/youtube_dl/extractor/vimeo.py @@ -23,7 +23,6 @@ from ..utils import (      NO_DEFAULT,      OnDemandPagedList,      parse_filesize, -    qualities,      RegexNotFoundError,      sanitized_Request,      smuggle_url, @@ -211,6 +210,7 @@ class VimeoBaseInfoExtractor(InfoExtractor):          video_uploader_url = owner.get('url')          return { +            'id': video_id,              'title': self._live_title(video_title) if is_live else video_title,              'uploader': owner.get('name'),              'uploader_id': video_uploader_url.split('/')[-1] if video_uploader_url else None, @@ -730,7 +730,6 @@ class VimeoIE(VimeoBaseInfoExtractor):          channel_url = 'https://vimeo.com/channels/%s' % channel_id if channel_id else None          info_dict = { -            'id': video_id,              'formats': formats,              'timestamp': unified_timestamp(timestamp),              'description': video_description, @@ -1061,7 +1060,6 @@ class VimeoReviewIE(VimeoBaseInfoExtractor):          if source_format:              info_dict['formats'].append(source_format)          self._vimeo_sort_formats(info_dict['formats']) -        info_dict['id'] = video_id          return info_dict @@ -1115,94 +1113,17 @@ class VimeoLikesIE(VimeoChannelIE):          return self._extract_videos(user_id, 'https://vimeo.com/%s/likes' % user_id) -class VHXEmbedIE(InfoExtractor): +class VHXEmbedIE(VimeoBaseInfoExtractor):      IE_NAME = 'vhx:embed'      _VALID_URL = r'https?://embed\.vhx\.tv/videos/(?P<id>\d+)' -    def _call_api(self, video_id, access_token, path='', query=None): -        return self._download_json( -            'https://api.vhx.tv/videos/' + video_id + path, video_id, headers={ -                'Authorization': 'Bearer ' + access_token, -            }, query=query) -      def _real_extract(self, url):          video_id = self._match_id(url)          webpage = self._download_webpage(url, video_id) -        credentials = self._parse_json(self._search_regex( -            r'(?s)credentials\s*:\s*({.+?}),', webpage, -            'config'), video_id, js_to_json) -        access_token = credentials['access_token'] - -        query = {} -        for k, v in credentials.items(): -            if k in ('authorization', 'authUserToken', 'ticket') and v and v != 'undefined': -                if k == 'authUserToken': -                    query['auth_user_token'] = v -                else: -                    query[k] = v -        files = self._call_api(video_id, access_token, '/files', query) - -        formats = [] -        for f in files: -            href = try_get(f, lambda x: x['_links']['source']['href']) -            if not href: -                continue -            method = f.get('method') -            if method == 'hls': -                formats.extend(self._extract_m3u8_formats( -                    href, video_id, 'mp4', 'm3u8_native', -                    m3u8_id='hls', fatal=False)) -            elif method == 'dash': -                formats.extend(self._extract_mpd_formats( -                    href, video_id, mpd_id='dash', fatal=False)) -            else: -                fmt = { -                    'filesize': int_or_none(try_get(f, lambda x: x['size']['bytes'])), -                    'format_id': 'http', -                    'preference': 1, -                    'url': href, -                    'vcodec': f.get('codec'), -                } -                quality = f.get('quality') -                if quality: -                    fmt.update({ -                        'format_id': 'http-' + quality, -                        'height': int_or_none(self._search_regex(r'(\d+)p', quality, 'height', default=None)), -                    }) -                formats.append(fmt) -        self._sort_formats(formats) - -        video_data = self._call_api(video_id, access_token) -        title = video_data.get('title') or video_data['name'] - -        subtitles = {} -        for subtitle in try_get(video_data, lambda x: x['tracks']['subtitles'], list) or []: -            lang = subtitle.get('srclang') or subtitle.get('label') -            for _link in subtitle.get('_links', {}).values(): -                href = _link.get('href') -                if not href: -                    continue -                subtitles.setdefault(lang, []).append({ -                    'url': href, -                }) - -        q = qualities(['small', 'medium', 'large', 'source']) -        thumbnails = [] -        for thumbnail_id, thumbnail_url in video_data.get('thumbnail', {}).items(): -            thumbnails.append({ -                'id': thumbnail_id, -                'url': thumbnail_url, -                'preference': q(thumbnail_id), -            }) - -        return { -            'id': video_id, -            'title': title, -            'description': video_data.get('description'), -            'duration': int_or_none(try_get(video_data, lambda x: x['duration']['seconds'])), -            'formats': formats, -            'subtitles': subtitles, -            'thumbnails': thumbnails, -            'timestamp': unified_timestamp(video_data.get('created_at')), -            'view_count': int_or_none(video_data.get('plays_count')), -        } +        config_url = self._parse_json(self._search_regex( +            r'window\.OTTData\s*=\s*({.+})', webpage, +            'ott data'), video_id, js_to_json)['config_url'] +        config = self._download_json(config_url, video_id) +        info = self._parse_config(config, video_id) +        self._vimeo_sort_formats(info['formats']) +        return info | 
