| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  | # encoding: utf-8 | 
					
						
							| 
									
										
										
										
											2014-01-21 17:32:03 +01:00
										 |  |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  | import re | 
					
						
							|  |  |  |  | import json | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | from .common import InfoExtractor | 
					
						
							| 
									
										
										
										
											2014-12-13 12:24:42 +01:00
										 |  |  |  | from ..compat import ( | 
					
						
							|  |  |  |  |     compat_str, | 
					
						
							|  |  |  |  |     compat_urllib_parse, | 
					
						
							|  |  |  |  | ) | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  | from ..utils import ( | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |     ExtractorError, | 
					
						
							| 
									
										
										
										
											2014-12-13 12:24:42 +01:00
										 |  |  |  |     orderedSet, | 
					
						
							| 
									
										
										
										
											2015-11-21 22:18:17 +06:00
										 |  |  |  |     sanitized_Request, | 
					
						
							| 
									
										
										
										
											2015-06-15 20:55:25 +06:00
										 |  |  |  |     str_to_int, | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  |     unescapeHTML, | 
					
						
							| 
									
										
										
										
											2014-11-21 23:16:12 +00:00
										 |  |  |  |     unified_strdate, | 
					
						
							| 
									
										
										
										
											2014-12-13 12:24:42 +01:00
										 |  |  |  | ) | 
					
						
							| 
									
										
										
										
											2015-09-30 22:12:52 +06:00
										 |  |  |  | from .vimeo import VimeoIE | 
					
						
							| 
									
										
										
										
											2015-12-07 22:03:52 +06:00
										 |  |  |  | from .pladform import PladformIE | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | class VKIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											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?:// | 
					
						
							|  |  |  |  |                         (?: | 
					
						
							|  |  |  |  |                             (?:m\.)?vk\.com/video_ext\.php\?.*?\boid=(?P<oid>-?\d+).*?\bid=(?P<id>\d+)| | 
					
						
							|  |  |  |  |                             (?: | 
					
						
							|  |  |  |  |                                 (?:m\.)?vk\.com/(?:.+?\?.*?z=)?video| | 
					
						
							|  |  |  |  |                                 (?:www\.)?biqle\.ru/watch/ | 
					
						
							|  |  |  |  |                             ) | 
					
						
							| 
									
										
										
										
											2015-07-11 21:23:49 +06:00
										 |  |  |  |                             (?P<videoid>[^s].*?)(?:\?(?:.*\blist=(?P<list_id>[\da-f]+))?|%2F|$) | 
					
						
							| 
									
										
										
										
											2015-07-08 20:27:06 +06:00
										 |  |  |  |                         ) | 
					
						
							|  |  |  |  |                     '''
 | 
					
						
							| 
									
										
										
										
											2014-02-17 02:17:10 +07:00
										 |  |  |  |     _NETRC_MACHINE = 'vk' | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |     _TESTS = [ | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             'url': 'http://vk.com/videos-77521?z=video-77521_162222515%2Fclub77521', | 
					
						
							|  |  |  |  |             'md5': '0deae91935c54e00003c2a00646315f0', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': '162222515', | 
					
						
							|  |  |  |  |                 'ext': 'flv', | 
					
						
							|  |  |  |  |                 'title': 'ProtivoGunz - Хуёвая песня', | 
					
						
							| 
									
										
										
										
											2015-03-02 03:30:18 +06:00
										 |  |  |  |                 'uploader': 're:(?:Noize MC|Alexander Ilyashenko).*', | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |                 'duration': 195, | 
					
						
							| 
									
										
										
										
											2014-11-21 22:23:39 +00:00
										 |  |  |  |                 'upload_date': '20120212', | 
					
						
							| 
									
										
										
										
											2015-06-15 20:55:25 +06:00
										 |  |  |  |                 'view_count': int, | 
					
						
							| 
									
										
										
										
											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
										 |  |  |  |                 'uploader': 'Tom Cruise', | 
					
						
							|  |  |  |  |                 'title': 'No name', | 
					
						
							|  |  |  |  |                 'duration': 9, | 
					
						
							| 
									
										
										
										
											2015-06-15 20:55:25 +06:00
										 |  |  |  |                 'upload_date': '20130721', | 
					
						
							|  |  |  |  |                 'view_count': int, | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							|  |  |  |  |             }, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2015-07-08 20:41:08 +06:00
										 |  |  |  |         { | 
					
						
							|  |  |  |  |             # youtube embed | 
					
						
							|  |  |  |  |             'url': 'https://vk.com/video276849682_170681728', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': 'V3K4mi0SYkc', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |  |                 'title': "DSWD Awards 'Children's Joy Foundation, Inc.' Certificate of Registration and License to Operate", | 
					
						
							|  |  |  |  |                 'description': 'md5:bf9c26cfa4acdfb146362682edd3827a', | 
					
						
							|  |  |  |  |                 'duration': 179, | 
					
						
							|  |  |  |  |                 'upload_date': '20130116', | 
					
						
							|  |  |  |  |                 'uploader': "Children's Joy Foundation", | 
					
						
							|  |  |  |  |                 'uploader_id': 'thecjf', | 
					
						
							|  |  |  |  |                 'view_count': int, | 
					
						
							|  |  |  |  |             }, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											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-07-08 20:27:06 +06:00
										 |  |  |  |         { | 
					
						
							|  |  |  |  |             # vk wrapper | 
					
						
							|  |  |  |  |             'url': 'http://www.biqle.ru/watch/847655_160197695', | 
					
						
							|  |  |  |  |             'only_matching': True, | 
					
						
							| 
									
										
										
										
											2015-12-07 22:05:54 +06:00
										 |  |  |  |         }, | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             # pladform embed | 
					
						
							|  |  |  |  |             'url': 'https://vk.com/video-76116461_171554880', | 
					
						
							|  |  |  |  |             'only_matching': True, | 
					
						
							| 
									
										
										
										
											2015-07-08 20:27:06 +06:00
										 |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  |     ] | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     def _login(self): | 
					
						
							|  |  |  |  |         (username, password) = self._get_login_info() | 
					
						
							|  |  |  |  |         if username is None: | 
					
						
							|  |  |  |  |             return | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-27 14:04:55 +06:00
										 |  |  |  |         login_page = self._download_webpage( | 
					
						
							|  |  |  |  |             'https://vk.com', None, 'Downloading login page') | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-14 22:36:30 +06:00
										 |  |  |  |         login_form = self._hidden_inputs(login_page) | 
					
						
							| 
									
										
										
										
											2015-06-27 14:04:55 +06:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         login_form.update({ | 
					
						
							| 
									
										
										
										
											2015-06-13 03:09:35 +06:00
										 |  |  |  |             'email': username.encode('cp1251'), | 
					
						
							|  |  |  |  |             'pass': password.encode('cp1251'), | 
					
						
							| 
									
										
										
										
											2015-06-27 14:04:55 +06:00
										 |  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-21 22:18:17 +06:00
										 |  |  |  |         request = sanitized_Request( | 
					
						
							| 
									
										
										
										
											2015-06-27 14:04:55 +06:00
										 |  |  |  |             'https://login.vk.com/?act=login', | 
					
						
							|  |  |  |  |             compat_urllib_parse.urlencode(login_form).encode('utf-8')) | 
					
						
							|  |  |  |  |         login_page = self._download_webpage( | 
					
						
							|  |  |  |  |             request, None, note='Logging in as %s' % username) | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         if re.search(r'onLoginFailed', login_page): | 
					
						
							| 
									
										
										
										
											2015-06-27 14:04:55 +06:00
										 |  |  |  |             raise ExtractorError( | 
					
						
							|  |  |  |  |                 'Unable to login, incorrect username and/or password', expected=True) | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     def _real_initialize(self): | 
					
						
							|  |  |  |  |         self._login() | 
					
						
							| 
									
										
										
										
											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') | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         if not video_id: | 
					
						
							|  |  |  |  |             video_id = '%s_%s' % (mobj.group('oid'), mobj.group('id')) | 
					
						
							| 
									
										
										
										
											2014-02-17 02:05:15 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-07 00:02:34 +06:00
										 |  |  |  |         info_url = 'https://vk.com/al_video.php?act=show&al=1&module=video&video=%s' % video_id | 
					
						
							| 
									
										
										
										
											2015-07-11 21:23:49 +06: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 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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( | 
					
						
							|  |  |  |  |             r'(?s)<!><div[^>]+class="video_layer_message"[^>]*>(.+?)</div>', | 
					
						
							|  |  |  |  |             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) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-28 21:35:25 +07:00
										 |  |  |  |         ERRORS = { | 
					
						
							|  |  |  |  |             r'>Видеозапись .*? была изъята из публичного доступа в связи с обращением правообладателя.<': | 
					
						
							| 
									
										
										
										
											2014-11-23 22:14:27 +01:00
										 |  |  |  |             'Video %s has been removed from public access due to rightholder complaint.', | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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.', | 
					
						
							| 
									
										
										
										
											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
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-08 20:34:50 +06:00
										 |  |  |  |         youtube_url = self._search_regex( | 
					
						
							|  |  |  |  |             r'<iframe[^>]+src="((?:https?:)?//www.youtube.com/embed/[^"]+)"', | 
					
						
							|  |  |  |  |             info_page, 'youtube iframe', default=None) | 
					
						
							|  |  |  |  |         if youtube_url: | 
					
						
							| 
									
										
										
										
											2015-07-08 20:41:08 +06:00
										 |  |  |  |             return self.url_result(youtube_url, 'Youtube') | 
					
						
							| 
									
										
										
										
											2014-06-29 20:07:59 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 22:12:52 +06:00
										 |  |  |  |         vimeo_url = VimeoIE._extract_vimeo_url(url, info_page) | 
					
						
							|  |  |  |  |         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( | 
					
						
							|  |  |  |  |             r'\ssrc="((?:https?:)?//rutube\.ru\\?/video\\?/embed(?:.*?))\\?"', info_page) | 
					
						
							|  |  |  |  |         if m_rutube is not None: | 
					
						
							|  |  |  |  |             rutube_url = self._proto_relative_url( | 
					
						
							|  |  |  |  |                 m_rutube.group(1).replace('\\', '')) | 
					
						
							|  |  |  |  |             return self.url_result(rutube_url) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-15 20:46:10 +06:00
										 |  |  |  |         data_json = self._search_regex(r'var\s+vars\s*=\s*({.+?});', info_page, 'vars') | 
					
						
							| 
									
										
										
										
											2014-01-21 17:29:04 +01:00
										 |  |  |  |         data = json.loads(data_json) | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-18 20:19:56 +00:00
										 |  |  |  |         # Extract upload date | 
					
						
							|  |  |  |  |         upload_date = None | 
					
						
							| 
									
										
										
										
											2015-06-15 20:47:01 +06:00
										 |  |  |  |         mobj = re.search(r'id="mv_date(?:_views)?_wrap"[^>]*>([a-zA-Z]+ [0-9]+), ([0-9]+) at', info_page) | 
					
						
							| 
									
										
										
										
											2014-11-18 20:19:56 +00:00
										 |  |  |  |         if mobj is not None: | 
					
						
							| 
									
										
										
										
											2014-11-23 21:39:15 +01:00
										 |  |  |  |             mobj.group(1) + ' ' + mobj.group(2) | 
					
						
							| 
									
										
										
										
											2014-11-18 20:19:56 +00:00
										 |  |  |  |             upload_date = unified_strdate(mobj.group(1) + ' ' + mobj.group(2)) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-04 17:57:46 +06:00
										 |  |  |  |         view_count = None | 
					
						
							|  |  |  |  |         views = self._html_search_regex( | 
					
						
							|  |  |  |  |             r'"mv_views_count_number"[^>]*>(.+?\bviews?)<', | 
					
						
							|  |  |  |  |             info_page, 'view count', fatal=False) | 
					
						
							|  |  |  |  |         if views: | 
					
						
							|  |  |  |  |             view_count = str_to_int(self._search_regex( | 
					
						
							|  |  |  |  |                 r'([\d,.]+)', views, 'view count', fatal=False)) | 
					
						
							| 
									
										
										
										
											2015-06-15 20:55:25 +06:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-21 18:21:44 +01:00
										 |  |  |  |         formats = [{ | 
					
						
							|  |  |  |  |             'format_id': k, | 
					
						
							|  |  |  |  |             'url': v, | 
					
						
							|  |  |  |  |             'width': int(k[len('url'):]), | 
					
						
							|  |  |  |  |         } for k, v in data.items() | 
					
						
							|  |  |  |  |             if k.startswith('url')] | 
					
						
							|  |  |  |  |         self._sort_formats(formats) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  |         return { | 
					
						
							| 
									
										
										
										
											2014-01-21 17:29:04 +01:00
										 |  |  |  |             'id': compat_str(data['vid']), | 
					
						
							| 
									
										
										
										
											2014-01-21 18:21:44 +01:00
										 |  |  |  |             'formats': formats, | 
					
						
							| 
									
										
										
										
											2014-01-21 17:29:04 +01:00
										 |  |  |  |             'title': unescapeHTML(data['md_title']), | 
					
						
							| 
									
										
										
										
											2014-01-21 18:21:44 +01:00
										 |  |  |  |             'thumbnail': data.get('jpg'), | 
					
						
							|  |  |  |  |             'uploader': data.get('md_author'), | 
					
						
							| 
									
										
										
										
											2014-11-18 20:19:56 +00:00
										 |  |  |  |             'duration': data.get('duration'), | 
					
						
							|  |  |  |  |             'upload_date': upload_date, | 
					
						
							| 
									
										
										
										
											2015-06-15 20:55:25 +06:00
										 |  |  |  |             'view_count': view_count, | 
					
						
							| 
									
										
										
										
											2013-11-01 22:28:51 +01:00
										 |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2014-11-17 17:52:00 -05:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | class VKUserVideosIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2015-07-18 17:23:33 +06:00
										 |  |  |  |     IE_NAME = 'vk:uservideos' | 
					
						
							|  |  |  |  |     IE_DESC = "VK - User's Videos" | 
					
						
							| 
									
										
										
										
											2015-07-18 17:22:25 +06:00
										 |  |  |  |     _VALID_URL = r'https?://vk\.com/videos(?P<id>-?[0-9]+)$' | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							|  |  |  |  |     }] | 
					
						
							| 
									
										
										
										
											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) |