]>
jfr.im git - yt-dlp.git/blob - youtube_dlc/extractor/yandexdisk.py
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/[di]/(?P<id>[^/?#&]+)'
19 'url': 'https://yadi.sk/i/VdOeDou8eZs6Y',
20 'md5': '33955d7ae052f15853dc41f35f17581c',
22 'id': 'VdOeDou8eZs6Y',
26 'uploader': 'y.botova',
27 'uploader_id': '300043621',
31 'url': 'https://yadi.sk/d/h3WAXvDS3Li3Ce',
32 'only_matching': True,
35 def _real_extract(self
, url
):
36 video_id
= self
._match
_id
(url
)
38 status
= self
._download
_webpage
(
39 'https://disk.yandex.com/auth/status', video_id
, query
={
45 sk
= self
._search
_regex
(
46 r
'(["\'])sk(?
:External
)?\
1\s
*:\s
*(["\'])(?P<value>(?:(?!\2).)+)\2',
47 status, 'sk', group='value')
49 webpage = self._download_webpage(url, video_id)
51 models = self._parse_json(
53 r'<script[^>]+id=["\']models
-client
[^
>]+>\s
*(\
[.+?\
])\s
*</script
',
54 webpage, 'video JSON
'),
58 model['data
'] for model in models
59 if model.get('model
') == 'resource
')
61 video_hash = data['id']
64 models = self._download_json(
65 'https
://disk
.yandex
.com
/models
/', video_id,
66 data=urlencode_postdata({
67 '_model
.0': 'videoInfo
',
69 '_model
.1': 'do
-get
-resource
-url
',
73 }), query={'_m': 'videoInfo'})['models
']
75 videos = try_get(models, lambda x: x[0]['data
']['videos
'], list) or []
77 models, lambda x: x[1]['data
']['file'], compat_str)
83 'format_id
': 'source
',
84 'ext
': determine_ext(title, 'mp4
'),
88 format_url = video.get('url
')
91 if determine_ext(format_url) == 'm3u8
':
92 formats.extend(self._extract_m3u8_formats(
93 format_url, video_id, 'mp4
', entry_protocol='m3u8_native
',
94 m3u8_id='hls
', fatal=False))
99 self._sort_formats(formats)
101 duration = float_or_none(try_get(
102 models, lambda x: x[0]['data
']['duration
']), 1000)
104 data, lambda x: x['user
']['display_name
'], compat_str)
105 uploader_id = try_get(
106 data, lambda x: x['user
']['uid
'], compat_str)
107 view_count = int_or_none(try_get(
108 data, lambda x: x['meta
']['views_counter
']))
113 'duration
': duration,
114 'uploader
': uploader,
115 'uploader_id
': uploader_id,
116 'view_count
': view_count,