2 from __future__
import unicode_literals
9 from .common
import InfoExtractor
18 from ..compat
import (
25 class VideaIE(InfoExtractor
):
30 videok/(?:[^/]+/)*[^?#&]+-|
37 'url': 'http://videa.hu/videok/allatok/az-orult-kigyasz-285-kigyot-kigyo-8YfIAjxwWGwT8HVQ',
38 'md5': '97a7af41faeaffd9f1fc864a7c7e7603',
40 'id': '8YfIAjxwWGwT8HVQ',
42 'title': 'Az őrült kígyász 285 kígyót enged szabadon',
43 'thumbnail': r
're:^https?://.*',
47 'url': 'http://videa.hu/videok/origo/jarmuvek/supercars-elozes-jAHDWfWSJH5XuFhH',
48 'only_matching': True,
50 'url': 'http://videa.hu/player?v=8YfIAjxwWGwT8HVQ',
51 'only_matching': True,
53 'url': 'http://videa.hu/player/v/8YfIAjxwWGwT8HVQ?autoplay=1',
54 'only_matching': True,
56 'url': 'https://videakid.hu/videok/origo/jarmuvek/supercars-elozes-jAHDWfWSJH5XuFhH',
57 'only_matching': True,
59 'url': 'https://videakid.hu/player?v=8YfIAjxwWGwT8HVQ',
60 'only_matching': True,
62 'url': 'https://videakid.hu/player/v/8YfIAjxwWGwT8HVQ?autoplay=1',
63 'only_matching': True,
67 def _extract_urls(webpage
):
68 return [url
for _
, url
in re
.findall(
69 r
'<iframe[^>]+src=(["\'])(?P
<url
>(?
:https?
:)?
//videa\
.hu
/player
\?.*?
\bv
=.+?
)\
1',
72 def rc4(self, ciphertext, key):
80 j = (j + S[i] + ord(key[i % keyLen])) % 256
81 S[i], S[j] = S[j], S[i]
85 for m in range(len(ciphertext)):
88 S[i], S[j] = S[j], S[i]
89 k = S[(S[i] + S[j]) % 256]
90 res += struct.pack("B", k ^ compat_ord(ciphertext[m]))
94 def _real_extract(self, url):
95 video_id = self._match_id(url)
96 webpage = self._download_webpage(url, video_id, fatal=True)
97 error = self._search_regex(r'<p
class="error-text">([^
<]+)</p
>', webpage, 'error
', default=None)
99 raise ExtractorError(error, expected=True)
101 video_src_params_raw = self._search_regex(r'<iframe
[^
>]+id="videa_player_iframe"[^
>]+src
="/player\?([^"]+)"', webpage, 'video_src_params')
102 video_src_params = compat_parse_qs(video_src_params_raw)
103 player_page = self._download_webpage("https
://videa
.hu
/videojs_player?
%s" % video_src_params_raw, video_id, fatal=True)
104 nonce = self._search_regex(r'_xt\s*=\s*"([^
"]+)"', player_page, 'nonce
')
105 random_seed = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(8))
106 static_secret = 'xHb0ZvME5q8CBcoQi6AngerDu3FGO9fkUlwPmLVY_RTzj2hJIS4NasXWKy1td7p
'
110 for i in range(0, 32):
111 result += s[i - (static_secret.index(l[i]) - 31)]
113 video_src_params['_s
'] = random_seed
114 video_src_params['_t
'] = result[:16]
115 encryption_key_stem = result[16:] + random_seed
117 [b64_info, handle] = self._download_webpage_handle(
118 'http
://videa
.hu
/videaplayer_get_xml
.php
', video_id,
119 query=video_src_params, fatal=True)
121 encrypted_info = compat_b64decode(b64_info)
122 key = encryption_key_stem + handle.info()['x
-videa
-xs
']
123 info_str = self.rc4(encrypted_info, key).decode('utf8
')
124 info = self._parse_xml(info_str, video_id)
126 video = xpath_element(info, './/video
', 'video
', fatal=True)
127 sources = xpath_element(info, './/video_sources
', 'sources
', fatal=True)
128 hash_values = xpath_element(info, './/hash_values
', 'hash_values
', fatal=True)
130 title = xpath_text(video, './title
', fatal=True)
133 for source in sources.findall('./video_source
'):
134 source_url = source.text
137 source_url += '?md5
=%s&expires
=%s' % (hash_values.find('hash_value_
%s' % source.get('name
')).text, source.get('exp
'))
138 f = parse_codecs(source.get('codecs
'))
141 'ext
': mimetype2ext(source.get('mimetype
')) or 'mp4
',
142 'format_id
': source.get('name
'),
143 'width
': int_or_none(source.get('width
')),
144 'height
': int_or_none(source.get('height
')),
147 self._sort_formats(formats)
149 thumbnail = xpath_text(video, './poster_src
')
150 duration = int_or_none(xpath_text(video, './duration
'))
153 is_adult = xpath_text(video, './is_adult_content
', default=None)
155 age_limit = 18 if is_adult == '1' else 0
160 'thumbnail
': thumbnail,
161 'duration
': duration,
162 'age_limit
': age_limit,