2 from __future__ import unicode_literals
4 from .common import InfoExtractor
5 from ..compat import compat_str
15 class YandexDiskIE(InfoExtractor):
16 _VALID_URL = r'https?://yadi\.sk/i/(?P<id>[^/?#&]+)'
19 'url': 'https://yadi.sk/i/VdOeDou8eZs6Y',
20 'md5': '33955d7ae052f15853dc41f35f17581c',
22 'id': 'VdOeDou8eZs6Y',
26 'uploader': 'y.botova',
27 'uploader_id': '300043621',
32 def _real_extract(self, url):
33 video_id = self._match_id(url)
35 status = self._download_webpage(
36 'https://disk.yandex.com/auth/status', video_id, query={
42 sk = self._search_regex(
43 r'(["\'])sk(?:External)?\1\s*:\s*(["\'])(?P<value>(?:(?!\2).)+)\2',
44 status, 'sk', group='value')
46 webpage = self._download_webpage(url, video_id)
48 models = self._parse_json(
50 r'<script[^>]+id=["\']models-client[^>]+>\s*(\[.+?\])\s*</script',
51 webpage, 'video JSON'),
55 model['data'] for model in models
56 if model.get('model') == 'resource')
58 video_hash = data['id']
61 models = self._download_json(
62 'https://disk.yandex.com/models/', video_id,
63 data=urlencode_postdata({
64 '_model.0': 'videoInfo',
66 '_model.1': 'do-get-resource-url',
70 }), query={'_m': 'videoInfo'})['models']
72 videos = try_get(models, lambda x: x[0]['data']['videos'], list) or []
74 models, lambda x: x[1]['data']['file'], compat_str)
80 'format_id': 'source',
81 'ext': determine_ext(title, 'mp4'),
85 format_url = video.get('url')
88 if determine_ext(format_url) == 'm3u8':
89 formats.extend(self._extract_m3u8_formats(
90 format_url, video_id, 'mp4', entry_protocol='m3u8_native',
91 m3u8_id='hls', fatal=False))
96 self._sort_formats(formats)
98 duration = float_or_none(try_get(
99 models, lambda x: x[0]['data']['duration']), 1000)
101 data, lambda x: x['user']['display_name'], compat_str)
102 uploader_id = try_get(
103 data, lambda x: x['user']['uid'], compat_str)
104 view_count = int_or_none(try_get(
105 data, lambda x: x['meta']['views_counter']))
110 'duration': duration,
111 'uploader': uploader,
112 'uploader_id': uploader_id,
113 'view_count': view_count,