| 
									
										
										
										
											2016-10-02 13:39:18 +02:00
										 |  |  |  | # coding: utf-8 | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  | from __future__ import unicode_literals | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | import re | 
					
						
							|  |  |  |  | import json | 
					
						
							|  |  |  |  | import hashlib | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | import uuid | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | from .common import InfoExtractor | 
					
						
							| 
									
										
										
										
											2014-12-13 12:24:42 +01:00
										 |  |  |  | from ..utils import ( | 
					
						
							| 
									
										
										
										
											2013-12-09 04:42:35 +01:00
										 |  |  |  |     ExtractorError, | 
					
						
							| 
									
										
										
										
											2014-03-28 19:58:49 +07:00
										 |  |  |  |     int_or_none, | 
					
						
							| 
									
										
										
										
											2015-11-21 22:18:17 +06:00
										 |  |  |  |     sanitized_Request, | 
					
						
							| 
									
										
										
										
											2014-11-23 23:53:41 +06:00
										 |  |  |  |     unified_strdate, | 
					
						
							| 
									
										
										
										
											2016-03-26 02:19:24 +06:00
										 |  |  |  |     urlencode_postdata, | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |     xpath_text, | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  | ) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | class SmotriIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |     IE_DESC = 'Smotri.com' | 
					
						
							|  |  |  |  |     IE_NAME = 'smotri' | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |     _VALID_URL = r'https?://(?:www\.)?(?:smotri\.com/video/view/\?id=|pics\.smotri\.com/(?:player|scrubber_custom8)\.swf\?file=)(?P<id>v(?P<realvideoid>[0-9]+)[a-z0-9]{4})' | 
					
						
							| 
									
										
										
										
											2014-02-17 02:19:55 +07:00
										 |  |  |  |     _NETRC_MACHINE = 'smotri' | 
					
						
							| 
									
										
										
										
											2013-12-02 17:08:17 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |     _TESTS = [ | 
					
						
							|  |  |  |  |         # real video id 2610366 | 
					
						
							|  |  |  |  |         { | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |             'url': 'http://smotri.com/video/view/?id=v261036632ab', | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |             'md5': '02c0dfab2102984e9c5bb585cc7cc321', | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |             'info_dict': { | 
					
						
							| 
									
										
										
										
											2014-03-28 19:58:49 +07:00
										 |  |  |  |                 'id': 'v261036632ab', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |                 'title': 'катастрофа с камер видеонаблюдения', | 
					
						
							|  |  |  |  |                 'uploader': 'rbc2008', | 
					
						
							|  |  |  |  |                 'uploader_id': 'rbc08', | 
					
						
							|  |  |  |  |                 'upload_date': '20131118', | 
					
						
							|  |  |  |  |                 'thumbnail': 'http://frame6.loadup.ru/8b/a9/2610366.3.3.jpg', | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |             }, | 
					
						
							|  |  |  |  |         }, | 
					
						
							|  |  |  |  |         # real video id 57591 | 
					
						
							|  |  |  |  |         { | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |             'url': 'http://smotri.com/video/view/?id=v57591cb20', | 
					
						
							|  |  |  |  |             'md5': '830266dfc21f077eac5afd1883091bcd', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							| 
									
										
										
										
											2014-03-28 19:58:49 +07:00
										 |  |  |  |                 'id': 'v57591cb20', | 
					
						
							|  |  |  |  |                 'ext': 'flv', | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |                 'title': 'test', | 
					
						
							|  |  |  |  |                 'uploader': 'Support Photofile@photofile', | 
					
						
							|  |  |  |  |                 'uploader_id': 'support-photofile', | 
					
						
							|  |  |  |  |                 'upload_date': '20070704', | 
					
						
							|  |  |  |  |                 'thumbnail': 'http://frame4.loadup.ru/03/ed/57591.2.3.jpg', | 
					
						
							| 
									
										
										
										
											2013-12-02 17:08:17 +01:00
										 |  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2015-06-27 23:31:27 +06:00
										 |  |  |  |         # video-password, not approved by moderator | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |         { | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |             'url': 'http://smotri.com/video/view/?id=v1390466a13c', | 
					
						
							|  |  |  |  |             'md5': 'f6331cef33cad65a0815ee482a54440b', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							| 
									
										
										
										
											2014-03-28 19:58:49 +07:00
										 |  |  |  |                 'id': 'v1390466a13c', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |                 'title': 'TOCCA_A_NOI_-_LE_COSE_NON_VANNO_CAMBIAMOLE_ORA-1', | 
					
						
							|  |  |  |  |                 'uploader': 'timoxa40', | 
					
						
							|  |  |  |  |                 'uploader_id': 'timoxa40', | 
					
						
							|  |  |  |  |                 'upload_date': '20100404', | 
					
						
							|  |  |  |  |                 'thumbnail': 'http://frame7.loadup.ru/af/3f/1390466.3.3.jpg', | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |             'params': { | 
					
						
							|  |  |  |  |                 'videopassword': 'qwerty', | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2014-12-23 20:33:56 +06:00
										 |  |  |  |             'skip': 'Video is not approved by moderator', | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2015-06-27 23:31:27 +06:00
										 |  |  |  |         # video-password | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             'url': 'http://smotri.com/video/view/?id=v6984858774#', | 
					
						
							|  |  |  |  |             'md5': 'f11e01d13ac676370fc3b95b9bda11b0', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': 'v6984858774', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |  |                 'title': 'Дача Солженицина ПАРОЛЬ 223322', | 
					
						
							|  |  |  |  |                 'uploader': 'psavari1', | 
					
						
							|  |  |  |  |                 'uploader_id': 'psavari1', | 
					
						
							|  |  |  |  |                 'upload_date': '20081103', | 
					
						
							| 
									
										
										
										
											2017-01-02 20:08:07 +08:00
										 |  |  |  |                 'thumbnail': r're:^https?://.*\.jpg$', | 
					
						
							| 
									
										
										
										
											2015-06-27 23:31:27 +06:00
										 |  |  |  |             }, | 
					
						
							|  |  |  |  |             'params': { | 
					
						
							|  |  |  |  |                 'videopassword': '223322', | 
					
						
							|  |  |  |  |             }, | 
					
						
							|  |  |  |  |         }, | 
					
						
							|  |  |  |  |         # age limit + video-password, not approved by moderator | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |         { | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |             'url': 'http://smotri.com/video/view/?id=v15408898bcf', | 
					
						
							|  |  |  |  |             'md5': '91e909c9f0521adf5ee86fbe073aad70', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							| 
									
										
										
										
											2014-03-28 19:58:49 +07:00
										 |  |  |  |                 'id': 'v15408898bcf', | 
					
						
							|  |  |  |  |                 'ext': 'flv', | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |                 'title': 'этот ролик не покажут по ТВ', | 
					
						
							|  |  |  |  |                 'uploader': 'zzxxx', | 
					
						
							|  |  |  |  |                 'uploader_id': 'ueggb', | 
					
						
							|  |  |  |  |                 'upload_date': '20101001', | 
					
						
							|  |  |  |  |                 'thumbnail': 'http://frame3.loadup.ru/75/75/1540889.1.3.jpg', | 
					
						
							|  |  |  |  |                 'age_limit': 18, | 
					
						
							| 
									
										
										
										
											2013-12-02 17:08:17 +01:00
										 |  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |             'params': { | 
					
						
							|  |  |  |  |                 'videopassword': '333' | 
					
						
							| 
									
										
										
										
											2014-12-23 20:33:56 +06:00
										 |  |  |  |             }, | 
					
						
							|  |  |  |  |             'skip': 'Video is not approved by moderator', | 
					
						
							| 
									
										
										
										
											2014-03-28 19:58:49 +07:00
										 |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2015-06-27 23:31:27 +06:00
										 |  |  |  |         # age limit + video-password | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             'url': 'http://smotri.com/video/view/?id=v7780025814', | 
					
						
							|  |  |  |  |             'md5': 'b4599b068422559374a59300c5337d72', | 
					
						
							|  |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': 'v7780025814', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |  |                 'title': 'Sexy Beach (пароль 123)', | 
					
						
							|  |  |  |  |                 'uploader': 'вАся', | 
					
						
							|  |  |  |  |                 'uploader_id': 'asya_prosto', | 
					
						
							|  |  |  |  |                 'upload_date': '20081218', | 
					
						
							| 
									
										
										
										
											2017-01-02 20:08:07 +08:00
										 |  |  |  |                 'thumbnail': r're:^https?://.*\.jpg$', | 
					
						
							| 
									
										
										
										
											2015-06-27 23:31:27 +06:00
										 |  |  |  |                 'age_limit': 18, | 
					
						
							|  |  |  |  |             }, | 
					
						
							|  |  |  |  |             'params': { | 
					
						
							|  |  |  |  |                 'videopassword': '123' | 
					
						
							|  |  |  |  |             }, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2014-03-28 19:58:49 +07:00
										 |  |  |  |         # swf player | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             'url': 'http://pics.smotri.com/scrubber_custom8.swf?file=v9188090500', | 
					
						
							| 
									
										
										
										
											2015-01-30 20:35:20 +11:00
										 |  |  |  |             'md5': '31099eeb4bc906712c5f40092045108d', | 
					
						
							| 
									
										
										
										
											2014-03-28 19:58:49 +07:00
										 |  |  |  |             'info_dict': { | 
					
						
							|  |  |  |  |                 'id': 'v9188090500', | 
					
						
							|  |  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |  |                 'title': 'Shakira - Don\'t Bother', | 
					
						
							|  |  |  |  |                 'uploader': 'HannahL', | 
					
						
							|  |  |  |  |                 'uploader_id': 'lisaha95', | 
					
						
							|  |  |  |  |                 'upload_date': '20090331', | 
					
						
							|  |  |  |  |                 'thumbnail': 'http://frame8.loadup.ru/44/0b/918809.7.3.jpg', | 
					
						
							|  |  |  |  |             }, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-28 19:58:49 +07:00
										 |  |  |  |     @classmethod | 
					
						
							|  |  |  |  |     def _extract_url(cls, webpage): | 
					
						
							|  |  |  |  |         mobj = re.search( | 
					
						
							|  |  |  |  |             r'<embed[^>]src=(["\'])(?P<url>http://pics\.smotri\.com/(?:player|scrubber_custom8)\.swf\?file=v.+?\1)', | 
					
						
							|  |  |  |  |             webpage) | 
					
						
							|  |  |  |  |         if mobj is not None: | 
					
						
							|  |  |  |  |             return mobj.group('url') | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         mobj = re.search( | 
					
						
							|  |  |  |  |             r'''(?x)<div\s+class="video_file">http://smotri\.com/video/download/file/[^<]+</div>\s*
 | 
					
						
							|  |  |  |  |                     <div\s+class="video_image">[^<]+</div>\s* | 
					
						
							|  |  |  |  |                     <div\s+class="video_id">(?P<id>[^<]+)</div>''', webpage)
 | 
					
						
							|  |  |  |  |         if mobj is not None: | 
					
						
							|  |  |  |  |             return 'http://smotri.com/video/view/?id=%s' % mobj.group('id') | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |     def _search_meta(self, name, html, display_name=None): | 
					
						
							|  |  |  |  |         if display_name is None: | 
					
						
							|  |  |  |  |             display_name = name | 
					
						
							| 
									
										
										
										
											2013-12-02 17:08:17 +01:00
										 |  |  |  |         return self._html_search_meta(name, html, display_name) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2014-11-23 23:53:41 +06:00
										 |  |  |  |         video_id = self._match_id(url) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         video_form = { | 
					
						
							|  |  |  |  |             'ticket': video_id, | 
					
						
							|  |  |  |  |             'video_url': '1', | 
					
						
							|  |  |  |  |             'frame_url': '1', | 
					
						
							|  |  |  |  |             'devid': 'LoadupFlashPlayer', | 
					
						
							|  |  |  |  |             'getvideoinfo': '1', | 
					
						
							|  |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-14 14:25:04 +06:00
										 |  |  |  |         video_password = self._downloader.params.get('videopassword') | 
					
						
							| 
									
										
										
										
											2015-06-27 23:00:27 +06:00
										 |  |  |  |         if video_password: | 
					
						
							|  |  |  |  |             video_form['pass'] = hashlib.md5(video_password.encode('utf-8')).hexdigest() | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |         video = self._download_json( | 
					
						
							|  |  |  |  |             'http://smotri.com/video/view/url/bot/', | 
					
						
							|  |  |  |  |             video_id, 'Downloading video JSON', | 
					
						
							|  |  |  |  |             data=urlencode_postdata(video_form), | 
					
						
							|  |  |  |  |             headers={'Content-Type': 'application/x-www-form-urlencoded'}) | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-14 21:50:36 +06:00
										 |  |  |  |         video_url = video.get('_vidURL') or video.get('_vidURL_mp4') | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         if not video_url: | 
					
						
							| 
									
										
										
										
											2015-06-27 23:00:27 +06:00
										 |  |  |  |             if video.get('_moderate_no'): | 
					
						
							| 
									
										
										
										
											2015-01-14 21:50:36 +06:00
										 |  |  |  |                 raise ExtractorError( | 
					
						
							|  |  |  |  |                     'Video %s has not been approved by moderator' % video_id, expected=True) | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-14 21:50:36 +06:00
										 |  |  |  |             if video.get('error'): | 
					
						
							|  |  |  |  |                 raise ExtractorError('Video %s does not exist' % video_id, expected=True) | 
					
						
							| 
									
										
										
										
											2014-11-23 23:53:41 +06:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-27 23:00:27 +06:00
										 |  |  |  |             if video.get('_pass_protected') == 1: | 
					
						
							|  |  |  |  |                 msg = ('Invalid video password' if video_password | 
					
						
							|  |  |  |  |                        else 'This video is protected by a password, use the --video-password option') | 
					
						
							|  |  |  |  |                 raise ExtractorError(msg, expected=True) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-23 23:53:41 +06:00
										 |  |  |  |         title = video['title'] | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |         thumbnail = video.get('_imgURL') | 
					
						
							|  |  |  |  |         upload_date = unified_strdate(video.get('added')) | 
					
						
							|  |  |  |  |         uploader = video.get('userNick') | 
					
						
							|  |  |  |  |         uploader_id = video.get('userLogin') | 
					
						
							|  |  |  |  |         duration = int_or_none(video.get('duration')) | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |         # Video JSON does not provide enough meta data | 
					
						
							|  |  |  |  |         # We will extract some from the video web page instead | 
					
						
							| 
									
										
										
										
											2014-11-23 23:53:41 +06:00
										 |  |  |  |         webpage_url = 'http://smotri.com/video/view/?id=%s' % video_id | 
					
						
							|  |  |  |  |         webpage = self._download_webpage(webpage_url, video_id, 'Downloading video page') | 
					
						
							| 
									
										
										
										
											2013-12-23 03:44:47 +01:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         # Warning if video is unavailable | 
					
						
							|  |  |  |  |         warning = self._html_search_regex( | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |             r'<div[^>]+class="videoUnModer"[^>]*>(.+?)</div>', webpage, | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |             'warning message', default=None) | 
					
						
							| 
									
										
										
										
											2013-12-23 03:44:47 +01:00
										 |  |  |  |         if warning is not None: | 
					
						
							|  |  |  |  |             self._downloader.report_warning( | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |                 'Video %s may not be available; smotri said: %s ' % | 
					
						
							| 
									
										
										
										
											2013-12-23 03:44:47 +01:00
										 |  |  |  |                 (video_id, warning)) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |         # Adult content | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |         if 'EroConfirmText">' in webpage: | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |             self.report_age_confirmation() | 
					
						
							|  |  |  |  |             confirm_string = self._html_search_regex( | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |                 r'<a[^>]+href="/video/view/\?id=%s&confirm=([^"]+)"' % video_id, | 
					
						
							| 
									
										
										
										
											2014-11-23 23:53:41 +06:00
										 |  |  |  |                 webpage, 'confirm string') | 
					
						
							|  |  |  |  |             confirm_url = webpage_url + '&confirm=%s' % confirm_string | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |             webpage = self._download_webpage( | 
					
						
							|  |  |  |  |                 confirm_url, video_id, | 
					
						
							|  |  |  |  |                 'Downloading video page (age confirmed)') | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |             adult_content = True | 
					
						
							|  |  |  |  |         else: | 
					
						
							|  |  |  |  |             adult_content = False | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-23 23:53:41 +06:00
										 |  |  |  |         view_count = self._html_search_regex( | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |             r'(?s)Общее количество просмотров.*?<span class="Number">(\d+)</span>', | 
					
						
							|  |  |  |  |             webpage, 'view count', fatal=False) | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |         return { | 
					
						
							|  |  |  |  |             'id': video_id, | 
					
						
							|  |  |  |  |             'url': video_url, | 
					
						
							| 
									
										
										
										
											2014-11-23 23:53:41 +06:00
										 |  |  |  |             'title': title, | 
					
						
							|  |  |  |  |             'thumbnail': thumbnail, | 
					
						
							|  |  |  |  |             'uploader': uploader, | 
					
						
							|  |  |  |  |             'upload_date': upload_date, | 
					
						
							|  |  |  |  |             'uploader_id': uploader_id, | 
					
						
							|  |  |  |  |             'duration': duration, | 
					
						
							|  |  |  |  |             'view_count': int_or_none(view_count), | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |             'age_limit': 18 if adult_content else 0, | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 17:08:17 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  | class SmotriCommunityIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |     IE_DESC = 'Smotri.com community videos' | 
					
						
							|  |  |  |  |     IE_NAME = 'smotri:community' | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |     _VALID_URL = r'https?://(?:www\.)?smotri\.com/community/video/(?P<id>[0-9A-Za-z_\'-]+)' | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |  |     _TEST = { | 
					
						
							|  |  |  |  |         'url': 'http://smotri.com/community/video/kommuna', | 
					
						
							|  |  |  |  |         'info_dict': { | 
					
						
							|  |  |  |  |             'id': 'kommuna', | 
					
						
							|  |  |  |  |         }, | 
					
						
							|  |  |  |  |         'playlist_mincount': 4, | 
					
						
							|  |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |         community_id = self._match_id(url) | 
					
						
							| 
									
										
										
										
											2013-12-02 17:08:17 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |         rss = self._download_xml( | 
					
						
							|  |  |  |  |             'http://smotri.com/export/rss/video/by/community/-/%s/video.xml' % community_id, | 
					
						
							|  |  |  |  |             community_id, 'Downloading community RSS') | 
					
						
							| 
									
										
										
										
											2013-12-02 17:08:17 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |         entries = [ | 
					
						
							|  |  |  |  |             self.url_result(video_url.text, SmotriIE.ie_key()) | 
					
						
							|  |  |  |  |             for video_url in rss.findall('./channel/item/link')] | 
					
						
							| 
									
										
										
										
											2013-12-02 17:08:17 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |         return self.playlist_result(entries, community_id) | 
					
						
							| 
									
										
										
										
											2013-12-02 17:08:17 +01:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  | class SmotriUserIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |     IE_DESC = 'Smotri.com user videos' | 
					
						
							|  |  |  |  |     IE_NAME = 'smotri:user' | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |     _VALID_URL = r'https?://(?:www\.)?smotri\.com/user/(?P<id>[0-9A-Za-z_\'-]+)' | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |  |     _TESTS = [{ | 
					
						
							|  |  |  |  |         'url': 'http://smotri.com/user/inspector', | 
					
						
							|  |  |  |  |         'info_dict': { | 
					
						
							|  |  |  |  |             'id': 'inspector', | 
					
						
							|  |  |  |  |             'title': 'Inspector', | 
					
						
							|  |  |  |  |         }, | 
					
						
							|  |  |  |  |         'playlist_mincount': 9, | 
					
						
							|  |  |  |  |     }] | 
					
						
							| 
									
										
										
										
											2013-12-02 17:08:17 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |         user_id = self._match_id(url) | 
					
						
							| 
									
										
										
										
											2013-12-02 17:08:17 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |         rss = self._download_xml( | 
					
						
							|  |  |  |  |             'http://smotri.com/export/rss/user/video/-/%s/video.xml' % user_id, | 
					
						
							|  |  |  |  |             user_id, 'Downloading user RSS') | 
					
						
							| 
									
										
										
										
											2013-12-02 17:08:17 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  |         entries = [self.url_result(video_url.text, 'Smotri') | 
					
						
							|  |  |  |  |                    for video_url in rss.findall('./channel/item/link')] | 
					
						
							| 
									
										
										
										
											2013-12-02 17:08:17 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |         description_text = xpath_text(rss, './channel/description') or '' | 
					
						
							|  |  |  |  |         user_nickname = self._search_regex( | 
					
						
							|  |  |  |  |             '^Видео режиссера (.+)$', description_text, | 
					
						
							|  |  |  |  |             'user nickname', fatal=False) | 
					
						
							| 
									
										
										
										
											2013-12-02 20:10:19 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         return self.playlist_result(entries, user_id, user_nickname) | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | class SmotriBroadcastIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |     IE_DESC = 'Smotri.com broadcasts' | 
					
						
							|  |  |  |  |     IE_NAME = 'smotri:broadcast' | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |     _VALID_URL = r'https?://(?:www\.)?(?P<url>smotri\.com/live/(?P<id>[^/]+))/?.*' | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     def _real_extract(self, url): | 
					
						
							|  |  |  |  |         mobj = re.match(self._VALID_URL, url) | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |         broadcast_id = mobj.group('id') | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         broadcast_url = 'http://' + mobj.group('url') | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |         broadcast_page = self._download_webpage(broadcast_url, broadcast_id, 'Downloading broadcast page') | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |         if re.search('>Режиссер с логином <br/>"%s"<br/> <span>не существует<' % broadcast_id, broadcast_page) is not None: | 
					
						
							| 
									
										
										
										
											2014-12-10 20:22:49 +06:00
										 |  |  |  |             raise ExtractorError( | 
					
						
							|  |  |  |  |                 'Broadcast %s does not exist' % broadcast_id, expected=True) | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         # Adult content | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |         if re.search('EroConfirmText">', broadcast_page) is not None: | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             (username, password) = self._get_login_info() | 
					
						
							|  |  |  |  |             if username is None: | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |                 self.raise_login_required( | 
					
						
							|  |  |  |  |                     'Erotic broadcasts allowed only for registered users') | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             login_form = { | 
					
						
							|  |  |  |  |                 'login-hint53': '1', | 
					
						
							|  |  |  |  |                 'confirm_erotic': '1', | 
					
						
							|  |  |  |  |                 'login': username, | 
					
						
							|  |  |  |  |                 'password': password, | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  |             } | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-21 22:18:17 +06:00
										 |  |  |  |             request = sanitized_Request( | 
					
						
							| 
									
										
										
										
											2016-03-26 02:19:24 +06:00
										 |  |  |  |                 broadcast_url + '/?no_redirect=1', urlencode_postdata(login_form)) | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  |             request.add_header('Content-Type', 'application/x-www-form-urlencoded') | 
					
						
							| 
									
										
										
										
											2014-12-10 20:22:49 +06:00
										 |  |  |  |             broadcast_page = self._download_webpage( | 
					
						
							|  |  |  |  |                 request, broadcast_id, 'Logging in and confirming age') | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |             if '>Неверный логин или пароль<' in broadcast_page: | 
					
						
							|  |  |  |  |                 raise ExtractorError( | 
					
						
							|  |  |  |  |                     'Unable to log in: bad username or password', expected=True) | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             adult_content = True | 
					
						
							|  |  |  |  |         else: | 
					
						
							|  |  |  |  |             adult_content = False | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         ticket = self._html_search_regex( | 
					
						
							| 
									
										
										
										
											2014-12-10 20:22:49 +06:00
										 |  |  |  |             r"window\.broadcast_control\.addFlashVar\('file'\s*,\s*'([^']+)'\)", | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |             broadcast_page, 'broadcast ticket') | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         url = 'http://smotri.com/broadcast/view/url/?ticket=%s' % ticket | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-14 14:25:04 +06:00
										 |  |  |  |         broadcast_password = self._downloader.params.get('videopassword') | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  |         if broadcast_password: | 
					
						
							|  |  |  |  |             url += '&pass=%s' % hashlib.md5(broadcast_password.encode('utf-8')).hexdigest() | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-10 20:22:49 +06:00
										 |  |  |  |         broadcast_json_page = self._download_webpage( | 
					
						
							|  |  |  |  |             url, broadcast_id, 'Downloading broadcast JSON') | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         try: | 
					
						
							|  |  |  |  |             broadcast_json = json.loads(broadcast_json_page) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             protected_broadcast = broadcast_json['_pass_protected'] == 1 | 
					
						
							|  |  |  |  |             if protected_broadcast and not broadcast_password: | 
					
						
							| 
									
										
										
										
											2014-12-10 20:22:49 +06:00
										 |  |  |  |                 raise ExtractorError( | 
					
						
							|  |  |  |  |                     'This broadcast is protected by a password, use the --video-password option', | 
					
						
							|  |  |  |  |                     expected=True) | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             broadcast_offline = broadcast_json['is_play'] == 0 | 
					
						
							|  |  |  |  |             if broadcast_offline: | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |                 raise ExtractorError('Broadcast %s is offline' % broadcast_id, expected=True) | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             rtmp_url = broadcast_json['_server'] | 
					
						
							| 
									
										
										
										
											2014-12-10 20:22:49 +06:00
										 |  |  |  |             mobj = re.search(r'^rtmp://[^/]+/(?P<app>.+)/?$', rtmp_url) | 
					
						
							|  |  |  |  |             if not mobj: | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |                 raise ExtractorError('Unexpected broadcast rtmp URL') | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |             broadcast_playpath = broadcast_json['_streamName'] | 
					
						
							| 
									
										
										
										
											2014-12-10 20:22:49 +06:00
										 |  |  |  |             broadcast_app = '%s/%s' % (mobj.group('app'), broadcast_json['_vidURL']) | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |             broadcast_thumbnail = broadcast_json.get('_imgURL') | 
					
						
							| 
									
										
										
										
											2014-12-10 20:22:49 +06:00
										 |  |  |  |             broadcast_title = self._live_title(broadcast_json['title']) | 
					
						
							| 
									
										
										
										
											2016-07-24 18:38:18 +07:00
										 |  |  |  |             broadcast_description = broadcast_json.get('description') | 
					
						
							|  |  |  |  |             broadcaster_nick = broadcast_json.get('nick') | 
					
						
							|  |  |  |  |             broadcaster_login = broadcast_json.get('login') | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  |             rtmp_conn = 'S:%s' % uuid.uuid4().hex | 
					
						
							|  |  |  |  |         except KeyError: | 
					
						
							|  |  |  |  |             if protected_broadcast: | 
					
						
							| 
									
										
										
										
											2014-01-29 01:52:57 +07:00
										 |  |  |  |                 raise ExtractorError('Bad broadcast password', expected=True) | 
					
						
							|  |  |  |  |             raise ExtractorError('Unexpected broadcast JSON') | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         return { | 
					
						
							|  |  |  |  |             'id': broadcast_id, | 
					
						
							|  |  |  |  |             'url': rtmp_url, | 
					
						
							|  |  |  |  |             'title': broadcast_title, | 
					
						
							|  |  |  |  |             'thumbnail': broadcast_thumbnail, | 
					
						
							|  |  |  |  |             'description': broadcast_description, | 
					
						
							|  |  |  |  |             'uploader': broadcaster_nick, | 
					
						
							|  |  |  |  |             'uploader_id': broadcaster_login, | 
					
						
							|  |  |  |  |             'age_limit': 18 if adult_content else 0, | 
					
						
							|  |  |  |  |             'ext': 'flv', | 
					
						
							|  |  |  |  |             'play_path': broadcast_playpath, | 
					
						
							| 
									
										
										
										
											2014-12-10 20:22:49 +06:00
										 |  |  |  |             'player_url': 'http://pics.smotri.com/broadcast_play.swf', | 
					
						
							|  |  |  |  |             'app': broadcast_app, | 
					
						
							| 
									
										
										
										
											2013-12-04 08:41:09 +07:00
										 |  |  |  |             'rtmp_live': True, | 
					
						
							| 
									
										
										
										
											2014-12-10 20:22:49 +06:00
										 |  |  |  |             'rtmp_conn': rtmp_conn, | 
					
						
							|  |  |  |  |             'is_live': True, | 
					
						
							| 
									
										
										
										
											2013-12-09 04:42:35 +01:00
										 |  |  |  |         } |