2 from __future__
import unicode_literals
4 from .common
import InfoExtractor
6 from ..compat
import compat_b64decode
15 class BIQLEIE(InfoExtractor
):
16 _VALID_URL
= r
'https?://(?:www\.)?biqle\.(?:com|org|ru)/watch/(?P<id>-?\d+_\d+)'
18 'url': 'https://biqle.ru/watch/-2000421746_85421746',
19 'md5': 'ae6ef4f04d19ac84e4658046d02c151c',
21 'id': '-2000421746_85421746',
23 'title': 'Forsaken By Hope Studio Clip',
24 'description': 'Forsaken By Hope Studio Clip — Смотреть онлайн',
25 'upload_date': '19700101',
26 'thumbnail': r
're:https://[^/]+/impf/7vN3ACwSTgChP96OdOfzFjUCzFR6ZglDQgWsIw/KPaACiVJJxM\.jpg\?size=800x450&quality=96&keep_aspect_ratio=1&background=000000&sign=b48ea459c4d33dbcba5e26d63574b1cb&type=video_thumb',
30 'url': 'http://biqle.org/watch/-44781847_168547604',
31 'md5': '7f24e72af1db0edf7c1aaba513174f97',
33 'id': '-44781847_168547604',
35 'title': 'Ребенок в шоке от автоматической мойки',
36 'description': 'Ребенок в шоке от автоматической мойки — Смотреть онлайн',
37 'timestamp': 1396633454,
38 'upload_date': '20140404',
39 'thumbnail': r
're:https://[^/]+/c535507/u190034692/video/l_b84df002\.jpg',
43 def _real_extract(self
, url
):
44 video_id
= self
._match
_id
(url
)
45 webpage
= self
._download
_webpage
(url
, video_id
)
47 title
= self
._html
_search
_meta
('name', webpage
, 'Title', fatal
=False)
48 timestamp
= unified_timestamp(self
._html
_search
_meta
('uploadDate', webpage
, 'Upload Date', default
=None))
49 description
= self
._html
_search
_meta
('description', webpage
, 'Description', default
=None)
51 global_embed_url
= self
._search
_regex
(
52 r
'<script[^<]+?window.globEmbedUrl\s*=\s*\'((?
:https?
:)?
//(?
:daxab\
.com|dxb\
.to|
[^
/]+/player
)/[^
\']+)\'',
53 webpage, 'global Embed url
')
54 hash = self._search_regex(
55 r'<script
id="data-embed-video[^<]+?hash: "([^
"]+)"[^
<]*</script
>', webpage, 'Hash
')
57 embed_url = global_embed_url + hash
59 if VKIE.suitable(embed_url):
60 return self.url_result(embed_url, VKIE.ie_key(), video_id)
62 embed_page = self._download_webpage(
63 embed_url, video_id, 'Downloading embed webpage
', headers={'Referer': url})
65 glob_params = self._parse_json(self._search_regex(
66 r'<script
id="globParams">[^
<]*window
.globParams
= ([^
;]+);[^
<]+</script
>',
67 embed_page, 'Global Parameters
'), video_id, transform_source=js_to_json)
68 host_name = compat_b64decode(glob_params['server
'][::-1]).decode()
70 item = self._download_json(
71 f'https
://{host_name}
/method
/video
.get
/{video_id}
', video_id,
72 headers={'Referer': url}, query={
73 'token
': glob_params['video
']['access_token
'],
75 'ckey
': glob_params['c_key
'],
76 'credentials
': glob_params['video
']['credentials
'],
77 })['response
']['items
'][0]
80 for f_id, f_url in item.get('files
', {}).items():
81 if f_id == 'external
':
82 return self.url_result(f_url)
83 ext, height = f_id.split('_
')
84 height_extra_key = traverse_obj(glob_params, ('video
', 'partial
', 'quality
', height))
87 'format_id
': f'{height}p
',
88 'url
': f'https
://{host_name}
/{f_url[8:]}
&videos
={video_id}
&extra_key
={height_extra_key}
',
89 'height
': int_or_none(height),
92 self._sort_formats(formats)
95 for k, v in item.items():
96 if k.startswith('photo_
') and v:
97 width = k.replace('photo_
', '')
101 'width
': int_or_none(width),
108 'comment_count
': int_or_none(item.get('comments
')),
109 'description
': description,
110 'duration
': int_or_none(item.get('duration
')),
111 'thumbnails
': thumbnails,
112 'timestamp
': timestamp,
113 'view_count
': int_or_none(item.get('views
')),