| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  | # coding: utf-8 | 
					
						
							|  |  |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | from .common import InfoExtractor | 
					
						
							| 
									
										
										
										
											2016-04-25 22:15:15 +06:00
										 |  |  |  | from ..compat import ( | 
					
						
							| 
									
										
										
										
											2017-04-16 21:24:34 +01:00
										 |  |  |  |     compat_etree_fromstring, | 
					
						
							| 
									
										
										
										
											2016-04-25 22:15:15 +06:00
										 |  |  |  |     compat_parse_qs, | 
					
						
							|  |  |  |  |     compat_urllib_parse_unquote, | 
					
						
							|  |  |  |  |     compat_urllib_parse_urlparse, | 
					
						
							|  |  |  |  | ) | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  | from ..utils import ( | 
					
						
							| 
									
										
										
										
											2015-09-17 22:59:15 +06:00
										 |  |  |  |     ExtractorError, | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |     unified_strdate, | 
					
						
							|  |  |  |  |     int_or_none, | 
					
						
							|  |  |  |  |     qualities, | 
					
						
							| 
									
										
										
										
											2015-05-13 22:26:30 +06:00
										 |  |  |  |     unescapeHTML, | 
					
						
							| 
									
										
										
										
											2017-11-28 09:04:51 +01:00
										 |  |  |  |     urlencode_postdata, | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  | ) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | class OdnoklassnikiIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2018-04-08 22:21:21 +07:00
										 |  |  |  |     _VALID_URL = r'''(?x)
 | 
					
						
							|  |  |  |  |                 https?:// | 
					
						
							|  |  |  |  |                     (?:(?:www|m|mobile)\.)? | 
					
						
							|  |  |  |  |                     (?:odnoklassniki|ok)\.ru/ | 
					
						
							|  |  |  |  |                     (?: | 
					
						
							|  |  |  |  |                         video(?:embed)?/| | 
					
						
							|  |  |  |  |                         web-api/video/moviePlayer/| | 
					
						
							|  |  |  |  |                         live/| | 
					
						
							|  |  |  |  |                         dk\?.*?st\.mvId= | 
					
						
							|  |  |  |  |                     ) | 
					
						
							|  |  |  |  |                     (?P<id>[\d-]+) | 
					
						
							|  |  |  |  |                 '''
 | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |     _TESTS = [{ | 
					
						
							| 
									
										
										
										
											2015-05-25 21:22:13 +06:00
										 |  |  |  |         # metadata in JSON | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |         'url': 'http://ok.ru/video/20079905452', | 
					
						
							| 
									
										
										
										
											2018-01-08 21:53:03 +07:00
										 |  |  |  |         'md5': '0b62089b479e06681abaaca9d204f152', | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |         'info_dict': { | 
					
						
							|  |  |  |  |             'id': '20079905452', | 
					
						
							|  |  |  |  |             'ext': 'mp4', | 
					
						
							|  |  |  |  |             'title': 'Культура меняет нас (прекрасный ролик!))', | 
					
						
							|  |  |  |  |             'duration': 100, | 
					
						
							| 
									
										
										
										
											2015-08-08 22:08:54 +06:00
										 |  |  |  |             'upload_date': '20141207', | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |             'uploader_id': '330537914540', | 
					
						
							|  |  |  |  |             'uploader': 'Виталий Добровольский', | 
					
						
							|  |  |  |  |             'like_count': int, | 
					
						
							| 
									
										
										
										
											2015-08-08 22:04:48 +06:00
										 |  |  |  |             'age_limit': 0, | 
					
						
							| 
									
										
										
										
											2015-05-25 21:22:13 +06:00
										 |  |  |  |         }, | 
					
						
							|  |  |  |  |     }, { | 
					
						
							|  |  |  |  |         # metadataUrl | 
					
						
							| 
									
										
										
										
											2016-04-25 22:15:15 +06:00
										 |  |  |  |         'url': 'http://ok.ru/video/63567059965189-0?fromTime=5', | 
					
						
							| 
									
										
										
										
											2017-04-19 00:16:31 +01:00
										 |  |  |  |         'md5': '6ff470ea2dd51d5d18c295a355b0b6bc', | 
					
						
							| 
									
										
										
										
											2015-05-25 21:22:13 +06:00
										 |  |  |  |         'info_dict': { | 
					
						
							|  |  |  |  |             'id': '63567059965189-0', | 
					
						
							|  |  |  |  |             'ext': 'mp4', | 
					
						
							|  |  |  |  |             'title': 'Девушка без комплексов ...', | 
					
						
							|  |  |  |  |             'duration': 191, | 
					
						
							| 
									
										
										
										
											2015-08-08 22:08:54 +06:00
										 |  |  |  |             'upload_date': '20150518', | 
					
						
							| 
									
										
										
										
											2015-05-25 21:22:13 +06:00
										 |  |  |  |             'uploader_id': '534380003155', | 
					
						
							| 
									
										
										
										
											2015-08-08 22:08:54 +06:00
										 |  |  |  |             'uploader': '☭ Андрей Мещанинов ☭', | 
					
						
							| 
									
										
										
										
											2015-05-25 21:22:13 +06:00
										 |  |  |  |             'like_count': int, | 
					
						
							| 
									
										
										
										
											2015-08-08 22:04:48 +06:00
										 |  |  |  |             'age_limit': 0, | 
					
						
							| 
									
										
										
										
											2016-04-25 22:15:15 +06:00
										 |  |  |  |             'start_time': 5, | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2015-09-02 22:08:50 +06:00
										 |  |  |  |     }, { | 
					
						
							|  |  |  |  |         # YouTube embed (metadataUrl, provider == USER_YOUTUBE) | 
					
						
							|  |  |  |  |         'url': 'http://ok.ru/video/64211978996595-1', | 
					
						
							| 
									
										
										
										
											2017-04-19 00:16:31 +01:00
										 |  |  |  |         'md5': '2f206894ffb5dbfcce2c5a14b909eea5', | 
					
						
							| 
									
										
										
										
											2015-09-02 22:08:50 +06:00
										 |  |  |  |         'info_dict': { | 
					
						
							| 
									
										
										
										
											2017-11-28 09:04:51 +01:00
										 |  |  |  |             'id': 'V_VztHT5BzY', | 
					
						
							| 
									
										
										
										
											2015-09-02 22:08:50 +06:00
										 |  |  |  |             'ext': 'mp4', | 
					
						
							|  |  |  |  |             'title': 'Космическая среда от 26 августа 2015', | 
					
						
							|  |  |  |  |             'description': 'md5:848eb8b85e5e3471a3a803dae1343ed0', | 
					
						
							|  |  |  |  |             'duration': 440, | 
					
						
							|  |  |  |  |             'upload_date': '20150826', | 
					
						
							| 
									
										
										
										
											2017-04-19 00:16:31 +01:00
										 |  |  |  |             'uploader_id': 'tvroscosmos', | 
					
						
							|  |  |  |  |             'uploader': 'Телестудия Роскосмоса', | 
					
						
							| 
									
										
										
										
											2015-09-02 22:08:50 +06:00
										 |  |  |  |             'age_limit': 0, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2016-04-25 22:05:47 +06:00
										 |  |  |  |     }, { | 
					
						
							|  |  |  |  |         # YouTube embed (metadata, provider == USER_YOUTUBE, no metadata.movie.title field) | 
					
						
							|  |  |  |  |         'url': 'http://ok.ru/video/62036049272859-0', | 
					
						
							|  |  |  |  |         'info_dict': { | 
					
						
							|  |  |  |  |             'id': '62036049272859-0', | 
					
						
							|  |  |  |  |             'ext': 'mp4', | 
					
						
							|  |  |  |  |             'title': 'МУЗЫКА     ДОЖДЯ .', | 
					
						
							|  |  |  |  |             'description': 'md5:6f1867132bd96e33bf53eda1091e8ed0', | 
					
						
							|  |  |  |  |             'upload_date': '20120106', | 
					
						
							|  |  |  |  |             'uploader_id': '473534735899', | 
					
						
							|  |  |  |  |             'uploader': 'МARINA D', | 
					
						
							|  |  |  |  |             'age_limit': 0, | 
					
						
							|  |  |  |  |         }, | 
					
						
							|  |  |  |  |         'params': { | 
					
						
							|  |  |  |  |             'skip_download': True, | 
					
						
							|  |  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2017-04-19 00:16:31 +01:00
										 |  |  |  |         'skip': 'Video has not been found', | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |     }, { | 
					
						
							|  |  |  |  |         'url': 'http://ok.ru/web-api/video/moviePlayer/20079905452', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2015-09-01 16:34:05 +08:00
										 |  |  |  |     }, { | 
					
						
							|  |  |  |  |         'url': 'http://www.ok.ru/video/20648036891', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2015-10-19 00:11:16 +06:00
										 |  |  |  |     }, { | 
					
						
							|  |  |  |  |         'url': 'http://www.ok.ru/videoembed/20648036891', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2016-01-28 22:56:49 +06:00
										 |  |  |  |     }, { | 
					
						
							|  |  |  |  |         'url': 'http://m.ok.ru/video/20079905452', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							|  |  |  |  |     }, { | 
					
						
							|  |  |  |  |         'url': 'http://mobile.ok.ru/video/20079905452', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2018-01-08 21:53:03 +07:00
										 |  |  |  |     }, { | 
					
						
							|  |  |  |  |         'url': 'https://www.ok.ru/live/484531969818', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2018-04-08 17:13:00 +02:00
										 |  |  |  |     }, { | 
					
						
							|  |  |  |  |         'url': 'https://m.ok.ru/dk?st.cmd=movieLayer&st.discId=863789452017&st.retLoc=friend&st.rtu=%2Fdk%3Fst.cmd%3DfriendMovies%26st.mode%3Down%26st.mrkId%3D%257B%2522uploadedMovieMarker%2522%253A%257B%2522marker%2522%253A%25221519410114503%2522%252C%2522hasMore%2522%253Atrue%257D%252C%2522sharedMovieMarker%2522%253A%257B%2522marker%2522%253Anull%252C%2522hasMore%2522%253Afalse%257D%257D%26st.friendId%3D561722190321%26st.frwd%3Don%26_prevCmd%3DfriendMovies%26tkn%3D7257&st.discType=MOVIE&st.mvId=863789452017&_prevCmd=friendMovies&tkn=3648#lst#', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2019-01-20 10:15:01 +02:00
										 |  |  |  |     }, { | 
					
						
							|  |  |  |  |         # Paid video | 
					
						
							|  |  |  |  |         'url': 'https://ok.ru/video/954886983203', | 
					
						
							|  |  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |     }] | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2016-04-25 22:15:15 +06:00
										 |  |  |  |         start_time = int_or_none(compat_parse_qs( | 
					
						
							|  |  |  |  |             compat_urllib_parse_urlparse(url).query).get('fromTime', [None])[0]) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |         video_id = self._match_id(url) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-25 21:27:43 +06:00
										 |  |  |  |         webpage = self._download_webpage( | 
					
						
							|  |  |  |  |             'http://ok.ru/video/%s' % video_id, video_id) | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-17 22:59:15 +06:00
										 |  |  |  |         error = self._search_regex( | 
					
						
							|  |  |  |  |             r'[^>]+class="vp_video_stub_txt"[^>]*>([^<]+)<', | 
					
						
							|  |  |  |  |             webpage, 'error', default=None) | 
					
						
							|  |  |  |  |         if error: | 
					
						
							|  |  |  |  |             raise ExtractorError(error, expected=True) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |         player = self._parse_json( | 
					
						
							| 
									
										
										
										
											2015-05-13 22:26:30 +06:00
										 |  |  |  |             unescapeHTML(self._search_regex( | 
					
						
							| 
									
										
										
										
											2015-09-02 21:38:56 +06:00
										 |  |  |  |                 r'data-options=(?P<quote>["\'])(?P<player>{.+?%s.+?})(?P=quote)' % video_id, | 
					
						
							|  |  |  |  |                 webpage, 'player', group='player')), | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |             video_id) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-25 21:22:13 +06:00
										 |  |  |  |         flashvars = player['flashvars'] | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         metadata = flashvars.get('metadata') | 
					
						
							|  |  |  |  |         if metadata: | 
					
						
							|  |  |  |  |             metadata = self._parse_json(metadata, video_id) | 
					
						
							|  |  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2017-11-28 09:04:51 +01:00
										 |  |  |  |             data = {} | 
					
						
							|  |  |  |  |             st_location = flashvars.get('location') | 
					
						
							|  |  |  |  |             if st_location: | 
					
						
							|  |  |  |  |                 data['st.location'] = st_location | 
					
						
							| 
									
										
										
										
											2015-05-25 21:22:13 +06:00
										 |  |  |  |             metadata = self._download_json( | 
					
						
							| 
									
										
										
										
											2015-07-17 23:45:00 +06:00
										 |  |  |  |                 compat_urllib_parse_unquote(flashvars['metadataUrl']), | 
					
						
							| 
									
										
										
										
											2017-11-28 09:04:51 +01:00
										 |  |  |  |                 video_id, 'Downloading metadata JSON', | 
					
						
							|  |  |  |  |                 data=urlencode_postdata(data)) | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         movie = metadata['movie'] | 
					
						
							| 
									
										
										
										
											2016-04-25 22:05:47 +06:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         # Some embedded videos may not contain title in movie dict (e.g. | 
					
						
							|  |  |  |  |         # http://ok.ru/video/62036049272859-0) thus we allow missing title | 
					
						
							|  |  |  |  |         # here and it's going to be extracted later by an extractor that | 
					
						
							|  |  |  |  |         # will process the actual embed. | 
					
						
							|  |  |  |  |         provider = metadata.get('provider') | 
					
						
							|  |  |  |  |         title = movie['title'] if provider == 'UPLOADED_ODKL' else movie.get('title') | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |         thumbnail = movie.get('poster') | 
					
						
							|  |  |  |  |         duration = int_or_none(movie.get('duration')) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         author = metadata.get('author', {}) | 
					
						
							|  |  |  |  |         uploader_id = author.get('id') | 
					
						
							|  |  |  |  |         uploader = author.get('name') | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         upload_date = unified_strdate(self._html_search_meta( | 
					
						
							| 
									
										
										
										
											2015-05-25 21:22:13 +06:00
										 |  |  |  |             'ya:ovs:upload_date', webpage, 'upload date', default=None)) | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         age_limit = None | 
					
						
							|  |  |  |  |         adult = self._html_search_meta( | 
					
						
							| 
									
										
										
										
											2015-05-25 21:22:13 +06:00
										 |  |  |  |             'ya:ovs:adult', webpage, 'age limit', default=None) | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |         if adult: | 
					
						
							|  |  |  |  |             age_limit = 18 if adult == 'true' else 0 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         like_count = int_or_none(metadata.get('likeCount')) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-02 22:08:50 +06:00
										 |  |  |  |         info = { | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |             'id': video_id, | 
					
						
							|  |  |  |  |             'title': title, | 
					
						
							|  |  |  |  |             'thumbnail': thumbnail, | 
					
						
							|  |  |  |  |             'duration': duration, | 
					
						
							|  |  |  |  |             'upload_date': upload_date, | 
					
						
							|  |  |  |  |             'uploader': uploader, | 
					
						
							|  |  |  |  |             'uploader_id': uploader_id, | 
					
						
							|  |  |  |  |             'like_count': like_count, | 
					
						
							|  |  |  |  |             'age_limit': age_limit, | 
					
						
							| 
									
										
										
										
											2016-04-25 22:15:15 +06:00
										 |  |  |  |             'start_time': start_time, | 
					
						
							| 
									
										
										
										
											2015-02-28 00:15:03 +06:00
										 |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-09-02 22:08:50 +06:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-25 22:05:47 +06:00
										 |  |  |  |         if provider == 'USER_YOUTUBE': | 
					
						
							| 
									
										
										
										
											2015-09-02 22:08:50 +06:00
										 |  |  |  |             info.update({ | 
					
						
							|  |  |  |  |                 '_type': 'url_transparent', | 
					
						
							|  |  |  |  |                 'url': movie['contentId'], | 
					
						
							|  |  |  |  |             }) | 
					
						
							|  |  |  |  |             return info | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-08 21:53:03 +07:00
										 |  |  |  |         assert title | 
					
						
							|  |  |  |  |         if provider == 'LIVE_TV_APP': | 
					
						
							|  |  |  |  |             info['title'] = self._live_title(title) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 21:24:34 +01:00
										 |  |  |  |         quality = qualities(('4', '0', '1', '2', '3', '5')) | 
					
						
							| 
									
										
										
										
											2015-09-02 22:08:50 +06:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         formats = [{ | 
					
						
							|  |  |  |  |             'url': f['url'], | 
					
						
							|  |  |  |  |             'ext': 'mp4', | 
					
						
							|  |  |  |  |             'format_id': f['name'], | 
					
						
							|  |  |  |  |         } for f in metadata['videos']] | 
					
						
							| 
									
										
										
										
											2017-04-16 21:24:34 +01:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         m3u8_url = metadata.get('hlsManifestUrl') | 
					
						
							|  |  |  |  |         if m3u8_url: | 
					
						
							|  |  |  |  |             formats.extend(self._extract_m3u8_formats( | 
					
						
							|  |  |  |  |                 m3u8_url, video_id, 'mp4', 'm3u8_native', | 
					
						
							|  |  |  |  |                 m3u8_id='hls', fatal=False)) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         dash_manifest = metadata.get('metadataEmbedded') | 
					
						
							|  |  |  |  |         if dash_manifest: | 
					
						
							|  |  |  |  |             formats.extend(self._parse_mpd_formats( | 
					
						
							|  |  |  |  |                 compat_etree_fromstring(dash_manifest), 'mpd')) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         for fmt in formats: | 
					
						
							|  |  |  |  |             fmt_type = self._search_regex( | 
					
						
							|  |  |  |  |                 r'\btype[/=](\d)', fmt['url'], | 
					
						
							|  |  |  |  |                 'format type', default=None) | 
					
						
							|  |  |  |  |             if fmt_type: | 
					
						
							|  |  |  |  |                 fmt['quality'] = quality(fmt_type) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-08 21:53:03 +07:00
										 |  |  |  |         # Live formats | 
					
						
							|  |  |  |  |         m3u8_url = metadata.get('hlsMasterPlaylistUrl') | 
					
						
							|  |  |  |  |         if m3u8_url: | 
					
						
							|  |  |  |  |             formats.extend(self._extract_m3u8_formats( | 
					
						
							|  |  |  |  |                 m3u8_url, video_id, 'mp4', entry_protocol='m3u8', | 
					
						
							|  |  |  |  |                 m3u8_id='hls', fatal=False)) | 
					
						
							|  |  |  |  |         rtmp_url = metadata.get('rtmpUrl') | 
					
						
							|  |  |  |  |         if rtmp_url: | 
					
						
							|  |  |  |  |             formats.append({ | 
					
						
							|  |  |  |  |                 'url': rtmp_url, | 
					
						
							|  |  |  |  |                 'format_id': 'rtmp', | 
					
						
							|  |  |  |  |                 'ext': 'flv', | 
					
						
							|  |  |  |  |             }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-20 10:15:01 +02:00
										 |  |  |  |         if not formats: | 
					
						
							|  |  |  |  |             payment_info = metadata.get('paymentInfo') | 
					
						
							|  |  |  |  |             if payment_info: | 
					
						
							|  |  |  |  |                 raise ExtractorError('This video is paid, subscribe to download it', expected=True) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-02 22:09:33 +06:00
										 |  |  |  |         self._sort_formats(formats) | 
					
						
							| 
									
										
										
										
											2015-09-02 22:08:50 +06:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         info['formats'] = formats | 
					
						
							|  |  |  |  |         return info |