| 
									
										
										
										
											2016-10-02 13:39:18 +02:00
										 |  |  |  | # coding: utf-8 | 
					
						
							| 
									
										
										
										
											2014-01-21 17:32:03 +01:00
										 |  |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 06:14:05 +07:00
										 |  |  |  | import collections | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  | import re | 
					
						
							| 
									
										
										
										
											2016-06-23 04:17:13 +07:00
										 |  |  |  | import sys | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | from .common import InfoExtractor | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  | from ..compat import ( | 
					
						
							|  |  |  |  |     compat_str, | 
					
						
							|  |  |  |  |     compat_urlparse, | 
					
						
							|  |  |  |  | ) | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  | from ..utils import ( | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  |     clean_html, | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |     ExtractorError, | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  |     get_element_by_class, | 
					
						
							| 
									
										
										
										
											2016-02-23 18:47:13 +06:00
										 |  |  |  |     int_or_none, | 
					
						
							| 
									
										
										
										
											2014-12-13 12:24:42 +01:00
										 |  |  |  |     orderedSet, | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  |     remove_start, | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |     str_or_none, | 
					
						
							| 
									
										
										
										
											2015-06-15 20:55:25 +06:00
										 |  |  |  |     str_to_int, | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  |     unescapeHTML, | 
					
						
							| 
									
										
										
										
											2016-09-29 23:48:21 +07:00
										 |  |  |  |     unified_timestamp, | 
					
						
							| 
									
										
										
										
											2018-07-21 19:08:28 +07:00
										 |  |  |  |     url_or_none, | 
					
						
							| 
									
										
										
										
											2016-03-26 02:19:24 +06:00
										 |  |  |  |     urlencode_postdata, | 
					
						
							| 
									
										
										
										
											2014-12-13 12:24:42 +01:00
										 |  |  |  | ) | 
					
						
							| 
									
										
										
										
											2016-09-25 05:39:29 +02:00
										 |  |  |  | from .dailymotion import DailymotionIE | 
					
						
							| 
									
										
										
										
											2015-12-07 22:03:52 +06:00
										 |  |  |  | from .pladform import PladformIE | 
					
						
							| 
									
										
										
										
											2016-09-25 05:39:29 +02:00
										 |  |  |  | from .vimeo import VimeoIE | 
					
						
							| 
									
										
										
										
											2017-09-06 00:50:25 +07:00
										 |  |  |  | from .youtube import YoutubeIE | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  | class VKBaseIE(InfoExtractor): | 
					
						
							|  |  |  |  |     _NETRC_MACHINE = 'vk' | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     def _login(self): | 
					
						
							| 
									
										
										
										
											2018-05-26 16:12:44 +01:00
										 |  |  |  |         username, password = self._get_login_info() | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  |         if username is None: | 
					
						
							|  |  |  |  |             return | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         login_page, url_handle = self._download_webpage_handle( | 
					
						
							|  |  |  |  |             'https://vk.com', None, 'Downloading login page') | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         login_form = self._hidden_inputs(login_page) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         login_form.update({ | 
					
						
							|  |  |  |  |             'email': username.encode('cp1251'), | 
					
						
							|  |  |  |  |             'pass': password.encode('cp1251'), | 
					
						
							|  |  |  |  |         }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         # https://new.vk.com/ serves two same remixlhk cookies in Set-Cookie header | 
					
						
							|  |  |  |  |         # and expects the first one to be set rather than second (see | 
					
						
							|  |  |  |  |         # https://github.com/rg3/youtube-dl/issues/9841#issuecomment-227871201). | 
					
						
							|  |  |  |  |         # As of RFC6265 the newer one cookie should be set into cookie store | 
					
						
							|  |  |  |  |         # what actually happens. | 
					
						
							|  |  |  |  |         # We will workaround this VK issue by resetting the remixlhk cookie to | 
					
						
							|  |  |  |  |         # the first one manually. | 
					
						
							| 
									
										
										
										
											2016-08-18 05:22:23 +07:00
										 |  |  |  |         for header, cookies in url_handle.headers.items(): | 
					
						
							|  |  |  |  |             if header.lower() != 'set-cookie': | 
					
						
							|  |  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2016-07-13 21:52:52 +07:00
										 |  |  |  |             if sys.version_info[0] >= 3: | 
					
						
							|  |  |  |  |                 cookies = cookies.encode('iso-8859-1') | 
					
						
							|  |  |  |  |             cookies = cookies.decode('utf-8') | 
					
						
							|  |  |  |  |             remixlhk = re.search(r'remixlhk=(.+?);.*?\bdomain=(.+?)(?:[,;]|$)', cookies) | 
					
						
							|  |  |  |  |             if remixlhk: | 
					
						
							|  |  |  |  |                 value, domain = remixlhk.groups() | 
					
						
							|  |  |  |  |                 self._set_cookie(domain, 'remixlhk', value) | 
					
						
							| 
									
										
										
										
											2016-08-18 05:22:23 +07:00
										 |  |  |  |                 break | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         login_page = self._download_webpage( | 
					
						
							|  |  |  |  |             'https://login.vk.com/?act=login', None, | 
					
						
							| 
									
										
										
										
											2017-11-11 20:49:03 +07:00
										 |  |  |  |             note='Logging in', | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  |             data=urlencode_postdata(login_form)) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         if re.search(r'onLoginFailed', login_page): | 
					
						
							|  |  |  |  |             raise ExtractorError( | 
					
						
							|  |  |  |  |                 'Unable to login, incorrect username and/or password', expected=True) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     def _real_initialize(self): | 
					
						
							|  |  |  |  |         self._login() | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | class VKIE(VKBaseIE): | 
					
						
							| 
									
										
										
										
											2015-07-18 17:23:33 +06:00
										 |  |  |  |     IE_NAME = 'vk' | 
					
						
							|  |  |  |  |     IE_DESC = 'VK' | 
					
						
							| 
									
										
										
										
											2015-07-08 20:27:06 +06:00
										 |  |  |  |     _VALID_URL = r'''(?x)
 | 
					
						
							|  |  |  |  |                     https?:// | 
					
						
							|  |  |  |  |                         (?: | 
					
						
							| 
									
										
										
										
											2016-05-06 15:02:40 +01:00
										 |  |  |  |                             (?: | 
					
						
							| 
									
										
										
										
											2016-07-02 16:43:19 +07:00
										 |  |  |  |                                 (?:(?:m|new)\.)?vk\.com/video_| | 
					
						
							| 
									
										
										
										
											2016-05-06 15:02:40 +01:00
										 |  |  |  |                                 (?:www\.)?daxab.com/ | 
					
						
							|  |  |  |  |                             ) | 
					
						
							|  |  |  |  |                             ext\.php\?(?P<embed_query>.*?\boid=(?P<oid>-?\d+).*?\bid=(?P<id>\d+).*)| | 
					
						
							| 
									
										
										
										
											2015-07-08 20:27:06 +06:00
										 |  |  |  |                             (?: | 
					
						
							| 
									
										
										
										
											2016-07-02 16:43:19 +07:00
										 |  |  |  |                                 (?:(?:m|new)\.)?vk\.com/(?:.+?\?.*?z=)?video| | 
					
						
							| 
									
										
										
										
											2016-05-06 15:02:40 +01:00
										 |  |  |  |                                 (?:www\.)?daxab.com/embed/ | 
					
						
							| 
									
										
										
										
											2015-07-08 20:27:06 +06:00
										 |  |  |  |                             ) | 
					
						
							| 
									
										
										
										
											2016-05-06 15:02:40 +01:00
										 |  |  |  |                             (?P<videoid>-?\d+_\d+)(?:.*\blist=(?P<list_id>[\da-f]+))? | 
					
						
							| 
									
										
										
										
											2015-07-08 20:27:06 +06:00
										 |  |  |  |                         ) | 
					
						
							|  |  |  |  |                     '''
 | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |     _TESTS = [ | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             'url': 'http://vk.com/videos-77521?z=video-77521_162222515%2Fclub77521', | 
					
						
							| 
									
										
										
										
											2018-02-20 16:21:10 +01:00
										 |  |  |  |             'md5': '7babad3b85ea2e91948005b1b8b0cb84', | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': '162222515', | 
					
						
							| 
									
										
										
										
											2018-02-20 16:21:10 +01:00
										 |  |  |  |                 'ext': 'mp4', | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |                 'title': 'ProtivoGunz - Хуёвая песня', | 
					
						
							| 
									
										
										
										
											2015-03-02 03:30:18 +06:00
										 |  |  |  |                 'uploader': 're:(?:Noize MC|Alexander Ilyashenko).*', | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |                 'uploader_id': '-77521', | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |                 'duration': 195, | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |                 'timestamp': 1329049880, | 
					
						
							| 
									
										
										
										
											2014-11-21 22:23:39 +00:00
										 |  |  |  |                 'upload_date': '20120212', | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |         { | 
					
						
							| 
									
										
										
										
											2014-11-21 22:52:01 +00:00
										 |  |  |  |             'url': 'http://vk.com/video205387401_165548505', | 
					
						
							|  |  |  |  |             'md5': '6c0aeb2e90396ba97035b9cbde548700', | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |             'info_dict': { | 
					
						
							| 
									
										
										
										
											2014-11-21 22:52:01 +00:00
										 |  |  |  |                 'id': '165548505', | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |                 'ext': 'mp4', | 
					
						
							| 
									
										
										
										
											2014-11-21 22:52:01 +00:00
										 |  |  |  |                 'title': 'No name', | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |                 'uploader': 'Tom Cruise', | 
					
						
							|  |  |  |  |                 'uploader_id': '205387401', | 
					
						
							| 
									
										
										
										
											2014-11-21 22:52:01 +00:00
										 |  |  |  |                 'duration': 9, | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |                 'timestamp': 1374364108, | 
					
						
							|  |  |  |  |                 'upload_date': '20130720', | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |             } | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2014-02-28 23:51:54 +07:00
										 |  |  |  |         { | 
					
						
							|  |  |  |  |             'note': 'Embedded video', | 
					
						
							|  |  |  |  |             'url': 'http://vk.com/video_ext.php?oid=32194266&id=162925554&hash=7d8c2e0d5e05aeaa&hd=1', | 
					
						
							|  |  |  |  |             'md5': 'c7ce8f1f87bec05b3de07fdeafe21a0a', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': '162925554', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |  |                 'uploader': 'Vladimir Gavrin', | 
					
						
							|  |  |  |  |                 'title': 'Lin Dan', | 
					
						
							|  |  |  |  |                 'duration': 101, | 
					
						
							| 
									
										
										
										
											2014-11-21 22:23:39 +00:00
										 |  |  |  |                 'upload_date': '20120730', | 
					
						
							| 
									
										
										
										
											2015-06-15 20:55:25 +06:00
										 |  |  |  |                 'view_count': int, | 
					
						
							| 
									
										
										
										
											2016-05-06 15:02:40 +01:00
										 |  |  |  |             }, | 
					
						
							|  |  |  |  |             'skip': 'This video has been removed from public access.', | 
					
						
							| 
									
										
										
										
											2014-02-28 23:51:54 +07:00
										 |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |         { | 
					
						
							| 
									
										
										
										
											2014-11-21 22:52:01 +00:00
										 |  |  |  |             # VIDEO NOW REMOVED | 
					
						
							|  |  |  |  |             # please update if you find a video whose URL follows the same pattern | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |             'url': 'http://vk.com/video-8871596_164049491', | 
					
						
							|  |  |  |  |             'md5': 'a590bcaf3d543576c9bd162812387666', | 
					
						
							|  |  |  |  |             'note': 'Only available for registered users', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': '164049491', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |  |                 'uploader': 'Триллеры', | 
					
						
							| 
									
										
										
										
											2014-06-29 19:33:39 +07:00
										 |  |  |  |                 'title': '► Бойцовский клуб / Fight Club 1999 [HD 720]', | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |                 'duration': 8352, | 
					
						
							| 
									
										
										
										
											2015-06-15 20:55:25 +06:00
										 |  |  |  |                 'upload_date': '20121218', | 
					
						
							|  |  |  |  |                 'view_count': int, | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |             }, | 
					
						
							|  |  |  |  |             'skip': 'Requires vk account credentials', | 
					
						
							| 
									
										
										
										
											2014-02-28 23:51:54 +07:00
										 |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2014-06-29 19:33:39 +07:00
										 |  |  |  |         { | 
					
						
							|  |  |  |  |             'url': 'http://vk.com/hd_kino_mania?z=video-43215063_168067957%2F15c66b9b533119788d', | 
					
						
							|  |  |  |  |             'md5': '4d7a5ef8cf114dfa09577e57b2993202', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': '168067957', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |  |                 'uploader': 'Киномания - лучшее из мира кино', | 
					
						
							|  |  |  |  |                 'title': ' ', | 
					
						
							|  |  |  |  |                 'duration': 7291, | 
					
						
							| 
									
										
										
										
											2014-11-21 22:23:39 +00:00
										 |  |  |  |                 'upload_date': '20140328', | 
					
						
							| 
									
										
										
										
											2014-06-29 19:33:39 +07:00
										 |  |  |  |             }, | 
					
						
							|  |  |  |  |             'skip': 'Requires vk account credentials', | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2014-06-29 20:07:59 +07:00
										 |  |  |  |         { | 
					
						
							|  |  |  |  |             'url': 'http://m.vk.com/video-43215063_169084319?list=125c627d1aa1cebb83&from=wall-43215063_2566540', | 
					
						
							|  |  |  |  |             'md5': '0c45586baa71b7cb1d0784ee3f4e00a6', | 
					
						
							|  |  |  |  |             'note': 'ivi.ru embed', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': '60690', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |  |                 'title': 'Книга Илая', | 
					
						
							|  |  |  |  |                 'duration': 6771, | 
					
						
							| 
									
										
										
										
											2014-11-21 22:23:39 +00:00
										 |  |  |  |                 'upload_date': '20140626', | 
					
						
							| 
									
										
										
										
											2015-06-15 20:55:25 +06:00
										 |  |  |  |                 'view_count': int, | 
					
						
							| 
									
										
										
										
											2014-06-29 20:07:59 +07:00
										 |  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2014-06-30 03:16:31 +07:00
										 |  |  |  |             'skip': 'Only works from Russia', | 
					
						
							| 
									
										
										
										
											2014-06-29 20:07:59 +07:00
										 |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2015-07-11 21:23:49 +06:00
										 |  |  |  |         { | 
					
						
							|  |  |  |  |             # video (removed?) only available with list id | 
					
						
							|  |  |  |  |             'url': 'https://vk.com/video30481095_171201961?list=8764ae2d21f14088d4', | 
					
						
							|  |  |  |  |             'md5': '091287af5402239a1051c37ec7b92913', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': '171201961', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |  |                 'title': 'ТюменцевВВ_09.07.2015', | 
					
						
							|  |  |  |  |                 'uploader': 'Anton Ivanov', | 
					
						
							|  |  |  |  |                 'duration': 109, | 
					
						
							|  |  |  |  |                 'upload_date': '20150709', | 
					
						
							|  |  |  |  |                 'view_count': int, | 
					
						
							|  |  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2016-09-29 23:48:21 +07:00
										 |  |  |  |             'skip': 'Removed', | 
					
						
							| 
									
										
										
										
											2015-07-11 21:23:49 +06:00
										 |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2015-07-08 20:41:08 +06:00
										 |  |  |  |         { | 
					
						
							|  |  |  |  |             # youtube embed | 
					
						
							|  |  |  |  |             'url': 'https://vk.com/video276849682_170681728', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': 'V3K4mi0SYkc', | 
					
						
							| 
									
										
										
										
											2016-03-05 21:52:24 +01:00
										 |  |  |  |                 'ext': 'webm', | 
					
						
							| 
									
										
										
										
											2015-07-08 20:41:08 +06:00
										 |  |  |  |                 'title': "DSWD Awards 'Children's Joy Foundation, Inc.' Certificate of Registration and License to Operate", | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |                 'description': 'md5:bf9c26cfa4acdfb146362682edd3827a', | 
					
						
							|  |  |  |  |                 'duration': 179, | 
					
						
							| 
									
										
										
										
											2015-07-08 20:41:08 +06:00
										 |  |  |  |                 'upload_date': '20130116', | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |                 'uploader': "Children's Joy Foundation Inc.", | 
					
						
							| 
									
										
										
										
											2015-07-08 20:41:08 +06:00
										 |  |  |  |                 'uploader_id': 'thecjf', | 
					
						
							|  |  |  |  |                 'view_count': int, | 
					
						
							|  |  |  |  |             }, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2016-09-25 05:39:29 +02:00
										 |  |  |  |         { | 
					
						
							|  |  |  |  |             # dailymotion embed | 
					
						
							|  |  |  |  |             'url': 'https://vk.com/video-37468416_456239855', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': 'k3lz2cmXyRuJQSjGHUv', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |  |                 'title': 'md5:d52606645c20b0ddbb21655adaa4f56f', | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |                 # TODO: fix test by fixing dailymotion description extraction | 
					
						
							| 
									
										
										
										
											2016-09-25 05:39:29 +02:00
										 |  |  |  |                 'description': 'md5:c651358f03c56f1150b555c26d90a0fd', | 
					
						
							|  |  |  |  |                 'uploader': 'AniLibria.Tv', | 
					
						
							|  |  |  |  |                 'upload_date': '20160914', | 
					
						
							|  |  |  |  |                 'uploader_id': 'x1p5vl5', | 
					
						
							|  |  |  |  |                 'timestamp': 1473877246, | 
					
						
							|  |  |  |  |             }, | 
					
						
							|  |  |  |  |             'params': { | 
					
						
							|  |  |  |  |                 'skip_download': True, | 
					
						
							| 
									
										
										
										
											2016-09-29 23:04:10 +07:00
										 |  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2016-09-25 05:39:29 +02:00
										 |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2016-02-23 18:47:13 +06:00
										 |  |  |  |         { | 
					
						
							|  |  |  |  |             # video key is extra_data not url\d+ | 
					
						
							|  |  |  |  |             'url': 'http://vk.com/video-110305615_171782105', | 
					
						
							|  |  |  |  |             'md5': 'e13fcda136f99764872e739d13fac1d1', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': '171782105', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |  |                 'title': 'S-Dance, репетиции к The way show', | 
					
						
							|  |  |  |  |                 'uploader': 'THE WAY SHOW | 17 апреля', | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |                 'uploader_id': '-110305615', | 
					
						
							|  |  |  |  |                 'timestamp': 1454859345, | 
					
						
							| 
									
										
										
										
											2016-02-23 18:47:13 +06:00
										 |  |  |  |                 'upload_date': '20160207', | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |             }, | 
					
						
							|  |  |  |  |             'params': { | 
					
						
							|  |  |  |  |                 'skip_download': True, | 
					
						
							| 
									
										
										
										
											2016-02-23 18:47:13 +06:00
										 |  |  |  |             }, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2016-09-29 23:04:10 +07:00
										 |  |  |  |         { | 
					
						
							| 
									
										
										
										
											2016-12-30 04:31:19 +07:00
										 |  |  |  |             # finished live stream, postlive_mp4 | 
					
						
							| 
									
										
										
										
											2016-09-29 23:04:10 +07:00
										 |  |  |  |             'url': 'https://vk.com/videos-387766?z=video-387766_456242764%2Fpl_-387766_-2', | 
					
						
							|  |  |  |  |             'md5': '90d22d051fccbbe9becfccc615be6791', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': '456242764', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |  |                 'title': 'ИгроМир 2016 — день 1', | 
					
						
							|  |  |  |  |                 'uploader': 'Игромания', | 
					
						
							|  |  |  |  |                 'duration': 5239, | 
					
						
							| 
									
										
										
										
											2016-09-29 23:51:52 +07:00
										 |  |  |  |                 'view_count': int, | 
					
						
							| 
									
										
										
										
											2016-09-29 23:04:10 +07:00
										 |  |  |  |             }, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2016-09-29 23:21:39 +07:00
										 |  |  |  |         { | 
					
						
							| 
									
										
										
										
											2016-12-30 04:31:19 +07:00
										 |  |  |  |             # live stream, hls and rtmp links, most likely already finished live | 
					
						
							| 
									
										
										
										
											2016-09-29 23:21:39 +07:00
										 |  |  |  |             # stream by the time you are reading this comment | 
					
						
							|  |  |  |  |             'url': 'https://vk.com/video-140332_456239111', | 
					
						
							|  |  |  |  |             'only_matching': True, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2014-11-23 10:11:04 +01:00
										 |  |  |  |         { | 
					
						
							|  |  |  |  |             # removed video, just testing that we match the pattern | 
					
						
							|  |  |  |  |             'url': 'http://vk.com/feed?z=video-43215063_166094326%2Fbb50cacd3177146d7a', | 
					
						
							|  |  |  |  |             'only_matching': True, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2015-07-18 19:25:06 +06:00
										 |  |  |  |         { | 
					
						
							|  |  |  |  |             # age restricted video, requires vk account credentials | 
					
						
							|  |  |  |  |             'url': 'https://vk.com/video205387401_164765225', | 
					
						
							|  |  |  |  |             'only_matching': True, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2015-12-07 22:05:54 +06:00
										 |  |  |  |         { | 
					
						
							|  |  |  |  |             # pladform embed | 
					
						
							|  |  |  |  |             'url': 'https://vk.com/video-76116461_171554880', | 
					
						
							|  |  |  |  |             'only_matching': True, | 
					
						
							| 
									
										
										
										
											2016-07-02 16:43:19 +07:00
										 |  |  |  |         }, | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             'url': 'http://new.vk.com/video205387401_165548505', | 
					
						
							|  |  |  |  |             'only_matching': True, | 
					
						
							| 
									
										
										
										
											2017-02-04 13:23:35 +05:00
										 |  |  |  |         }, | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             # This video is no longer available, because its author has been blocked. | 
					
						
							|  |  |  |  |             'url': 'https://vk.com/video-10639516_456240611', | 
					
						
							|  |  |  |  |             'only_matching': True, | 
					
						
							| 
									
										
										
										
											2015-07-08 20:27:06 +06:00
										 |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |     ] | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  |     def _real_extract(self, url): | 
					
						
							|  |  |  |  |         mobj = re.match(self._VALID_URL, url) | 
					
						
							| 
									
										
										
										
											2014-02-28 23:51:54 +07:00
										 |  |  |  |         video_id = mobj.group('videoid') | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-06 15:02:40 +01:00
										 |  |  |  |         if video_id: | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |             info_url = 'https://vk.com/al_video.php?act=show_inline&al=1&video=' + video_id | 
					
						
							| 
									
										
										
										
											2016-05-06 15:02:40 +01:00
										 |  |  |  |             # Some videos (removed?) can only be downloaded with list id specified | 
					
						
							|  |  |  |  |             list_id = mobj.group('list_id') | 
					
						
							|  |  |  |  |             if list_id: | 
					
						
							|  |  |  |  |                 info_url += '&list=%s' % list_id | 
					
						
							|  |  |  |  |         else: | 
					
						
							|  |  |  |  |             info_url = 'http://vk.com/video_ext.php?' + mobj.group('embed_query') | 
					
						
							| 
									
										
										
										
											2014-02-28 23:51:54 +07:00
										 |  |  |  |             video_id = '%s_%s' % (mobj.group('oid'), mobj.group('id')) | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  |         info_page = self._download_webpage(info_url, video_id) | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-18 19:15:20 +06:00
										 |  |  |  |         error_message = self._html_search_regex( | 
					
						
							| 
									
										
										
										
											2016-05-06 15:02:40 +01:00
										 |  |  |  |             [r'(?s)<!><div[^>]+class="video_layer_message"[^>]*>(.+?)</div>', | 
					
						
							|  |  |  |  |                 r'(?s)<div[^>]+id="video_ext_msg"[^>]*>(.+?)</div>'], | 
					
						
							| 
									
										
										
										
											2015-07-18 19:15:20 +06:00
										 |  |  |  |             info_page, 'error message', default=None) | 
					
						
							|  |  |  |  |         if error_message: | 
					
						
							|  |  |  |  |             raise ExtractorError(error_message, expected=True) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-07 00:04:19 +06:00
										 |  |  |  |         if re.search(r'<!>/login\.php\?.*\bact=security_check', info_page): | 
					
						
							|  |  |  |  |             raise ExtractorError( | 
					
						
							|  |  |  |  |                 'You are trying to log in from an unusual location. You should confirm ownership at vk.com to log in with this IP.', | 
					
						
							|  |  |  |  |                 expected=True) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-15 22:56:45 +07:00
										 |  |  |  |         ERROR_COPYRIGHT = 'Video %s has been removed from public access due to rightholder complaint.' | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-28 21:35:25 +07:00
										 |  |  |  |         ERRORS = { | 
					
						
							|  |  |  |  |             r'>Видеозапись .*? была изъята из публичного доступа в связи с обращением правообладателя.<': | 
					
						
							| 
									
										
										
										
											2018-01-15 22:56:45 +07:00
										 |  |  |  |             ERROR_COPYRIGHT, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             r'>The video .*? was removed from public access by request of the copyright holder.<': | 
					
						
							|  |  |  |  |             ERROR_COPYRIGHT, | 
					
						
							| 
									
										
										
										
											2014-11-23 22:14:27 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-28 21:35:25 +07:00
										 |  |  |  |             r'<!>Please log in or <': | 
					
						
							| 
									
										
										
										
											2014-11-23 22:14:27 +01:00
										 |  |  |  |             'Video %s is only available for registered users, ' | 
					
						
							|  |  |  |  |             'use --username and --password options to provide account credentials.', | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             r'<!>Unknown error': | 
					
						
							| 
									
										
										
										
											2015-03-01 21:55:43 +06:00
										 |  |  |  |             'Video %s does not exist.', | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             r'<!>Видео временно недоступно': | 
					
						
							|  |  |  |  |             'Video %s is temporarily unavailable.', | 
					
						
							| 
									
										
										
										
											2015-07-11 21:26:03 +06:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             r'<!>Access denied': | 
					
						
							|  |  |  |  |             'Access denied to video %s.', | 
					
						
							| 
									
										
										
										
											2017-02-04 13:23:35 +05:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             r'<!>Видеозапись недоступна, так как её автор был заблокирован.': | 
					
						
							|  |  |  |  |             'Video %s is no longer available, because its author has been blocked.', | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             r'<!>This video is no longer available, because its author has been blocked.': | 
					
						
							|  |  |  |  |             'Video %s is no longer available, because its author has been blocked.', | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             r'<!>This video is no longer available, because it has been deleted.': | 
					
						
							|  |  |  |  |             'Video %s is no longer available, because it has been deleted.', | 
					
						
							| 
									
										
										
										
											2014-10-28 21:35:25 +07:00
										 |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-28 21:35:25 +07:00
										 |  |  |  |         for error_re, error_msg in ERRORS.items(): | 
					
						
							|  |  |  |  |             if re.search(error_re, info_page): | 
					
						
							|  |  |  |  |                 raise ExtractorError(error_msg % video_id, expected=True) | 
					
						
							| 
									
										
										
										
											2014-10-28 21:06:07 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 00:50:25 +07:00
										 |  |  |  |         youtube_url = YoutubeIE._extract_url(info_page) | 
					
						
							| 
									
										
										
										
											2015-07-08 20:34:50 +06:00
										 |  |  |  |         if youtube_url: | 
					
						
							| 
									
										
										
										
											2017-09-06 00:50:25 +07:00
										 |  |  |  |             return self.url_result(youtube_url, ie=YoutubeIE.ie_key()) | 
					
						
							| 
									
										
										
										
											2014-06-29 20:07:59 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-06 23:22:52 +07:00
										 |  |  |  |         vimeo_url = VimeoIE._extract_url(url, info_page) | 
					
						
							| 
									
										
										
										
											2015-09-30 22:12:52 +06:00
										 |  |  |  |         if vimeo_url is not None: | 
					
						
							|  |  |  |  |             return self.url_result(vimeo_url) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-07 22:03:52 +06:00
										 |  |  |  |         pladform_url = PladformIE._extract_url(info_page) | 
					
						
							|  |  |  |  |         if pladform_url: | 
					
						
							|  |  |  |  |             return self.url_result(pladform_url) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-04 03:15:27 +01:00
										 |  |  |  |         m_rutube = re.search( | 
					
						
							| 
									
										
										
										
											2016-02-08 21:30:23 +06:00
										 |  |  |  |             r'\ssrc="((?:https?:)?//rutube\.ru\\?/(?:video|play)\\?/embed(?:.*?))\\?"', info_page) | 
					
						
							| 
									
										
										
										
											2015-01-04 03:15:27 +01:00
										 |  |  |  |         if m_rutube is not None: | 
					
						
							|  |  |  |  |             rutube_url = self._proto_relative_url( | 
					
						
							|  |  |  |  |                 m_rutube.group(1).replace('\\', '')) | 
					
						
							|  |  |  |  |             return self.url_result(rutube_url) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-25 05:39:29 +02:00
										 |  |  |  |         dailymotion_urls = DailymotionIE._extract_urls(info_page) | 
					
						
							|  |  |  |  |         if dailymotion_urls: | 
					
						
							|  |  |  |  |             return self.url_result(dailymotion_urls[0], DailymotionIE.ie_key()) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-15 20:46:10 +06:00
										 |  |  |  |         m_opts = re.search(r'(?s)var\s+opts\s*=\s*({.+?});', info_page) | 
					
						
							| 
									
										
										
										
											2014-06-29 20:07:59 +07:00
										 |  |  |  |         if m_opts: | 
					
						
							| 
									
										
										
										
											2015-06-15 20:46:10 +06:00
										 |  |  |  |             m_opts_url = re.search(r"url\s*:\s*'((?!/\b)[^']+)", m_opts.group(1)) | 
					
						
							| 
									
										
										
										
											2014-06-29 20:07:59 +07:00
										 |  |  |  |             if m_opts_url: | 
					
						
							|  |  |  |  |                 opts_url = m_opts_url.group(1) | 
					
						
							|  |  |  |  |                 if opts_url.startswith('//'): | 
					
						
							|  |  |  |  |                     opts_url = 'http:' + opts_url | 
					
						
							|  |  |  |  |                 return self.url_result(opts_url) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-25 21:05:29 +07:00
										 |  |  |  |         # vars does not look to be served anymore since 24.10.2016 | 
					
						
							|  |  |  |  |         data = self._parse_json( | 
					
						
							|  |  |  |  |             self._search_regex( | 
					
						
							|  |  |  |  |                 r'var\s+vars\s*=\s*({.+?});', info_page, 'vars', default='{}'), | 
					
						
							|  |  |  |  |             video_id, fatal=False) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         # <!json> is served instead | 
					
						
							|  |  |  |  |         if not data: | 
					
						
							|  |  |  |  |             data = self._parse_json( | 
					
						
							|  |  |  |  |                 self._search_regex( | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |                     [r'<!json>\s*({.+?})\s*<!>', r'<!json>\s*({.+})'], | 
					
						
							|  |  |  |  |                     info_page, 'json', default='{}'), | 
					
						
							| 
									
										
										
										
											2016-12-30 04:21:49 +07:00
										 |  |  |  |                 video_id) | 
					
						
							|  |  |  |  |             if data: | 
					
						
							|  |  |  |  |                 data = data['player']['params'][0] | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         if not data: | 
					
						
							|  |  |  |  |             data = self._parse_json( | 
					
						
							|  |  |  |  |                 self._search_regex( | 
					
						
							|  |  |  |  |                     r'var\s+playerParams\s*=\s*({.+?})\s*;\s*\n', info_page, | 
					
						
							|  |  |  |  |                     'player params'), | 
					
						
							|  |  |  |  |                 video_id)['params'][0] | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-29 23:21:39 +07:00
										 |  |  |  |         title = unescapeHTML(data['md_title']) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-30 04:31:19 +07:00
										 |  |  |  |         # 2 = live | 
					
						
							|  |  |  |  |         # 3 = post live (finished live) | 
					
						
							| 
									
										
										
										
											2016-12-30 04:21:49 +07:00
										 |  |  |  |         is_live = data.get('live') == 2 | 
					
						
							|  |  |  |  |         if is_live: | 
					
						
							| 
									
										
										
										
											2016-09-29 23:21:39 +07:00
										 |  |  |  |             title = self._live_title(title) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-29 23:48:21 +07:00
										 |  |  |  |         timestamp = unified_timestamp(self._html_search_regex( | 
					
						
							| 
									
										
										
										
											2016-09-29 23:51:52 +07:00
										 |  |  |  |             r'class=["\']mv_info_date[^>]+>([^<]+)(?:<|from)', info_page, | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |             'upload date', default=None)) or int_or_none(data.get('date')) | 
					
						
							| 
									
										
										
										
											2016-09-25 20:26:58 +02:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-29 23:51:52 +07:00
										 |  |  |  |         view_count = str_to_int(self._search_regex( | 
					
						
							|  |  |  |  |             r'class=["\']mv_views_count[^>]+>\s*([\d,.]+)', | 
					
						
							| 
									
										
										
										
											2017-12-15 22:53:56 +07:00
										 |  |  |  |             info_page, 'view count', default=None)) | 
					
						
							| 
									
										
										
										
											2015-06-15 20:55:25 +06:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-23 18:47:13 +06:00
										 |  |  |  |         formats = [] | 
					
						
							| 
									
										
										
										
											2016-09-29 23:21:39 +07:00
										 |  |  |  |         for format_id, format_url in data.items(): | 
					
						
							| 
									
										
										
										
											2018-07-21 19:08:28 +07:00
										 |  |  |  |             format_url = url_or_none(format_url) | 
					
						
							|  |  |  |  |             if not format_url or not format_url.startswith(('http', '//', 'rtmp')): | 
					
						
							| 
									
										
										
										
											2016-02-23 18:47:13 +06:00
										 |  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2016-12-30 04:31:19 +07:00
										 |  |  |  |             if (format_id.startswith(('url', 'cache')) or | 
					
						
							|  |  |  |  |                     format_id in ('extra_data', 'live_mp4', 'postlive_mp4')): | 
					
						
							| 
									
										
										
										
											2016-09-29 23:21:39 +07:00
										 |  |  |  |                 height = int_or_none(self._search_regex( | 
					
						
							|  |  |  |  |                     r'^(?:url|cache)(\d+)', format_id, 'height', default=None)) | 
					
						
							|  |  |  |  |                 formats.append({ | 
					
						
							|  |  |  |  |                     'format_id': format_id, | 
					
						
							|  |  |  |  |                     'url': format_url, | 
					
						
							|  |  |  |  |                     'height': height, | 
					
						
							|  |  |  |  |                 }) | 
					
						
							|  |  |  |  |             elif format_id == 'hls': | 
					
						
							|  |  |  |  |                 formats.extend(self._extract_m3u8_formats( | 
					
						
							| 
									
										
										
										
											2017-03-25 19:37:54 +01:00
										 |  |  |  |                     format_url, video_id, 'mp4', 'm3u8_native', | 
					
						
							| 
									
										
										
										
											2016-12-30 04:21:49 +07:00
										 |  |  |  |                     m3u8_id=format_id, fatal=False, live=is_live)) | 
					
						
							| 
									
										
										
										
											2016-09-29 23:21:39 +07:00
										 |  |  |  |             elif format_id == 'rtmp': | 
					
						
							|  |  |  |  |                 formats.append({ | 
					
						
							|  |  |  |  |                     'format_id': format_id, | 
					
						
							|  |  |  |  |                     'url': format_url, | 
					
						
							|  |  |  |  |                     'ext': 'flv', | 
					
						
							|  |  |  |  |                 }) | 
					
						
							| 
									
										
										
										
											2014-01-21 18:21:44 +01:00
										 |  |  |  |         self._sort_formats(formats) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  |         return { | 
					
						
							| 
									
										
										
										
											2016-09-29 23:21:39 +07:00
										 |  |  |  |             'id': compat_str(data.get('vid') or video_id), | 
					
						
							| 
									
										
										
										
											2014-01-21 18:21:44 +01:00
										 |  |  |  |             'formats': formats, | 
					
						
							| 
									
										
										
										
											2016-09-29 23:21:39 +07:00
										 |  |  |  |             'title': title, | 
					
						
							| 
									
										
										
										
											2014-01-21 18:21:44 +01:00
										 |  |  |  |             'thumbnail': data.get('jpg'), | 
					
						
							|  |  |  |  |             'uploader': data.get('md_author'), | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |             'uploader_id': str_or_none(data.get('author_id')), | 
					
						
							| 
									
										
										
										
											2014-11-18 20:19:56 +00:00
										 |  |  |  |             'duration': data.get('duration'), | 
					
						
							| 
									
										
										
										
											2016-09-29 23:48:21 +07:00
										 |  |  |  |             'timestamp': timestamp, | 
					
						
							| 
									
										
										
										
											2015-06-15 20:55:25 +06:00
										 |  |  |  |             'view_count': view_count, | 
					
						
							| 
									
										
										
										
											2018-07-26 07:24:46 +01:00
										 |  |  |  |             'like_count': int_or_none(data.get('liked')), | 
					
						
							|  |  |  |  |             'dislike_count': int_or_none(data.get('nolikes')), | 
					
						
							| 
									
										
										
										
											2016-12-30 04:21:49 +07:00
										 |  |  |  |             'is_live': is_live, | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2014-11-17 17:52:00 -05:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  | class VKUserVideosIE(VKBaseIE): | 
					
						
							| 
									
										
										
										
											2015-07-18 17:23:33 +06:00
										 |  |  |  |     IE_NAME = 'vk:uservideos' | 
					
						
							|  |  |  |  |     IE_DESC = "VK - User's Videos" | 
					
						
							| 
									
										
										
										
											2016-07-02 16:43:19 +07:00
										 |  |  |  |     _VALID_URL = r'https?://(?:(?:m|new)\.)?vk\.com/videos(?P<id>-?[0-9]+)(?!\?.*\bz=video)(?:[/?#&]|$)' | 
					
						
							| 
									
										
										
										
											2014-11-17 17:52:00 -05:00
										 |  |  |  |     _TEMPLATE_URL = 'https://vk.com/videos' | 
					
						
							| 
									
										
										
										
											2015-07-18 17:22:25 +06:00
										 |  |  |  |     _TESTS = [{ | 
					
						
							| 
									
										
										
										
											2014-11-17 17:52:00 -05:00
										 |  |  |  |         'url': 'http://vk.com/videos205387401', | 
					
						
							| 
									
										
										
										
											2015-02-18 00:33:41 +01:00
										 |  |  |  |         'info_dict': { | 
					
						
							|  |  |  |  |             'id': '205387401', | 
					
						
							| 
									
										
										
										
											2015-07-18 17:22:25 +06:00
										 |  |  |  |             'title': "Tom Cruise's Videos", | 
					
						
							| 
									
										
										
										
											2015-02-18 00:33:41 +01:00
										 |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2014-11-17 17:52:00 -05:00
										 |  |  |  |         'playlist_mincount': 4, | 
					
						
							| 
									
										
										
										
											2015-07-18 17:22:25 +06:00
										 |  |  |  |     }, { | 
					
						
							|  |  |  |  |         'url': 'http://vk.com/videos-77521', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2016-02-02 00:52:37 +06:00
										 |  |  |  |     }, { | 
					
						
							|  |  |  |  |         'url': 'http://vk.com/videos-97664626?section=all', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2016-07-02 16:43:19 +07:00
										 |  |  |  |     }, { | 
					
						
							|  |  |  |  |         'url': 'http://m.vk.com/videos205387401', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							|  |  |  |  |     }, { | 
					
						
							|  |  |  |  |         'url': 'http://new.vk.com/videos205387401', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2015-07-18 17:22:25 +06:00
										 |  |  |  |     }] | 
					
						
							| 
									
										
										
										
											2014-11-17 17:52:00 -05:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2014-11-21 23:21:03 +00:00
										 |  |  |  |         page_id = self._match_id(url) | 
					
						
							| 
									
										
										
										
											2015-07-18 17:22:25 +06:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         webpage = self._download_webpage(url, page_id) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         entries = [ | 
					
						
							| 
									
										
										
										
											2014-11-23 10:11:52 +01:00
										 |  |  |  |             self.url_result( | 
					
						
							|  |  |  |  |                 'http://vk.com/video' + video_id, 'VK', video_id=video_id) | 
					
						
							| 
									
										
										
										
											2015-07-18 18:05:08 +06:00
										 |  |  |  |             for video_id in orderedSet(re.findall(r'href="/video(-?[0-9_]+)"', webpage))] | 
					
						
							| 
									
										
										
										
											2015-07-18 17:22:25 +06:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         title = unescapeHTML(self._search_regex( | 
					
						
							|  |  |  |  |             r'<title>\s*([^<]+?)\s+\|\s+\d+\s+videos', | 
					
						
							|  |  |  |  |             webpage, 'title', default=page_id)) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         return self.playlist_result(entries, page_id, title) | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | class VKWallPostIE(VKBaseIE): | 
					
						
							|  |  |  |  |     IE_NAME = 'vk:wallpost' | 
					
						
							|  |  |  |  |     _VALID_URL = r'https?://(?:(?:(?:(?:m|new)\.)?vk\.com/(?:[^?]+\?.*\bw=)?wall(?P<id>-?\d+_\d+)))' | 
					
						
							|  |  |  |  |     _TESTS = [{ | 
					
						
							|  |  |  |  |         # public page URL, audio playlist | 
					
						
							|  |  |  |  |         'url': 'https://vk.com/bs.official?w=wall-23538238_35', | 
					
						
							|  |  |  |  |         'info_dict': { | 
					
						
							|  |  |  |  |             'id': '23538238_35', | 
					
						
							|  |  |  |  |             'title': 'Black Shadow - Wall post 23538238_35', | 
					
						
							|  |  |  |  |             'description': 'md5:3f84b9c4f9ef499731cf1ced9998cc0c', | 
					
						
							|  |  |  |  |         }, | 
					
						
							|  |  |  |  |         'playlist': [{ | 
					
						
							|  |  |  |  |             'md5': '5ba93864ec5b85f7ce19a9af4af080f6', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': '135220665_111806521', | 
					
						
							|  |  |  |  |                 'ext': 'mp3', | 
					
						
							|  |  |  |  |                 'title': 'Black Shadow - Слепое Верование', | 
					
						
							|  |  |  |  |                 'duration': 370, | 
					
						
							|  |  |  |  |                 'uploader': 'Black Shadow', | 
					
						
							|  |  |  |  |                 'artist': 'Black Shadow', | 
					
						
							|  |  |  |  |                 'track': 'Слепое Верование', | 
					
						
							|  |  |  |  |             }, | 
					
						
							|  |  |  |  |         }, { | 
					
						
							|  |  |  |  |             'md5': '4cc7e804579122b17ea95af7834c9233', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': '135220665_111802303', | 
					
						
							|  |  |  |  |                 'ext': 'mp3', | 
					
						
							|  |  |  |  |                 'title': 'Black Shadow - Война - Негасимое Бездны Пламя!', | 
					
						
							|  |  |  |  |                 'duration': 423, | 
					
						
							|  |  |  |  |                 'uploader': 'Black Shadow', | 
					
						
							|  |  |  |  |                 'artist': 'Black Shadow', | 
					
						
							|  |  |  |  |                 'track': 'Война - Негасимое Бездны Пламя!', | 
					
						
							|  |  |  |  |             }, | 
					
						
							|  |  |  |  |             'params': { | 
					
						
							|  |  |  |  |                 'skip_download': True, | 
					
						
							|  |  |  |  |             }, | 
					
						
							|  |  |  |  |         }], | 
					
						
							| 
									
										
										
										
											2016-08-18 06:14:05 +07:00
										 |  |  |  |         'params': { | 
					
						
							|  |  |  |  |             'usenetrc': True, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  |         'skip': 'Requires vk account credentials', | 
					
						
							|  |  |  |  |     }, { | 
					
						
							|  |  |  |  |         # single YouTube embed, no leading - | 
					
						
							|  |  |  |  |         'url': 'https://vk.com/wall85155021_6319', | 
					
						
							|  |  |  |  |         'info_dict': { | 
					
						
							|  |  |  |  |             'id': '85155021_6319', | 
					
						
							|  |  |  |  |             'title': 'Sergey Gorbunov - Wall post 85155021_6319', | 
					
						
							|  |  |  |  |         }, | 
					
						
							|  |  |  |  |         'playlist_count': 1, | 
					
						
							| 
									
										
										
										
											2016-08-18 06:14:05 +07:00
										 |  |  |  |         'params': { | 
					
						
							|  |  |  |  |             'usenetrc': True, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  |         'skip': 'Requires vk account credentials', | 
					
						
							|  |  |  |  |     }, { | 
					
						
							|  |  |  |  |         # wall page URL | 
					
						
							|  |  |  |  |         'url': 'https://vk.com/wall-23538238_35', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							|  |  |  |  |     }, { | 
					
						
							|  |  |  |  |         # mobile wall page URL | 
					
						
							|  |  |  |  |         'url': 'https://m.vk.com/wall-23538238_35', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							|  |  |  |  |     }] | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     def _real_extract(self, url): | 
					
						
							|  |  |  |  |         post_id = self._match_id(url) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         wall_url = 'https://vk.com/wall%s' % post_id | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         post_id = remove_start(post_id, '-') | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         webpage = self._download_webpage(wall_url, post_id) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         error = self._html_search_regex( | 
					
						
							|  |  |  |  |             r'>Error</div>\s*<div[^>]+class=["\']body["\'][^>]*>([^<]+)', | 
					
						
							|  |  |  |  |             webpage, 'error', default=None) | 
					
						
							|  |  |  |  |         if error: | 
					
						
							|  |  |  |  |             raise ExtractorError('VK said: %s' % error, expected=True) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         description = clean_html(get_element_by_class('wall_post_text', webpage)) | 
					
						
							| 
									
										
										
										
											2016-08-18 06:14:05 +07:00
										 |  |  |  |         uploader = clean_html(get_element_by_class('author', webpage)) | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  |         thumbnail = self._og_search_thumbnail(webpage) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         entries = [] | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 06:14:05 +07:00
										 |  |  |  |         audio_ids = re.findall(r'data-full-id=["\'](\d+_\d+)', webpage) | 
					
						
							|  |  |  |  |         if audio_ids: | 
					
						
							|  |  |  |  |             al_audio = self._download_webpage( | 
					
						
							|  |  |  |  |                 'https://vk.com/al_audio.php', post_id, | 
					
						
							|  |  |  |  |                 note='Downloading audio info', fatal=False, | 
					
						
							|  |  |  |  |                 data=urlencode_postdata({ | 
					
						
							|  |  |  |  |                     'act': 'reload_audio', | 
					
						
							|  |  |  |  |                     'al': '1', | 
					
						
							|  |  |  |  |                     'ids': ','.join(audio_ids) | 
					
						
							|  |  |  |  |                 })) | 
					
						
							|  |  |  |  |             if al_audio: | 
					
						
							|  |  |  |  |                 Audio = collections.namedtuple( | 
					
						
							|  |  |  |  |                     'Audio', ['id', 'user_id', 'url', 'track', 'artist', 'duration']) | 
					
						
							|  |  |  |  |                 audios = self._parse_json( | 
					
						
							|  |  |  |  |                     self._search_regex( | 
					
						
							|  |  |  |  |                         r'<!json>(.+?)<!>', al_audio, 'audios', default='[]'), | 
					
						
							|  |  |  |  |                     post_id, fatal=False, transform_source=unescapeHTML) | 
					
						
							|  |  |  |  |                 if isinstance(audios, list): | 
					
						
							|  |  |  |  |                     for audio in audios: | 
					
						
							|  |  |  |  |                         a = Audio._make(audio[:6]) | 
					
						
							|  |  |  |  |                         entries.append({ | 
					
						
							|  |  |  |  |                             'id': '%s_%s' % (a.user_id, a.id), | 
					
						
							|  |  |  |  |                             'url': a.url, | 
					
						
							|  |  |  |  |                             'title': '%s - %s' % (a.artist, a.track) if a.artist and a.track else a.id, | 
					
						
							|  |  |  |  |                             'thumbnail': thumbnail, | 
					
						
							|  |  |  |  |                             'duration': a.duration, | 
					
						
							|  |  |  |  |                             'uploader': uploader, | 
					
						
							|  |  |  |  |                             'artist': a.artist, | 
					
						
							|  |  |  |  |                             'track': a.track, | 
					
						
							|  |  |  |  |                         }) | 
					
						
							| 
									
										
										
										
											2016-07-13 21:51:44 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         for video in re.finditer( | 
					
						
							|  |  |  |  |                 r'<a[^>]+href=(["\'])(?P<url>/video(?:-?[\d_]+).*?)\1', webpage): | 
					
						
							|  |  |  |  |             entries.append(self.url_result( | 
					
						
							|  |  |  |  |                 compat_urlparse.urljoin(url, video.group('url')), VKIE.ie_key())) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         title = 'Wall post %s' % post_id | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         return self.playlist_result( | 
					
						
							|  |  |  |  |             orderedSet(entries), post_id, | 
					
						
							|  |  |  |  |             '%s - %s' % (uploader, title) if uploader else title, | 
					
						
							|  |  |  |  |             description) |