| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | # coding: utf-8 | 
					
						
							| 
									
										
										
										
											2014-08-22 01:44:35 +02:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-20 17:05:28 +01:00
										 |  |  | from .common import InfoExtractor | 
					
						
							|  |  |  | from ..utils import ( | 
					
						
							| 
									
										
										
										
											2017-08-12 17:18:23 +07:00
										 |  |  |     int_or_none, | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |     merge_dicts, | 
					
						
							| 
									
										
										
										
											2017-08-12 17:18:23 +07:00
										 |  |  |     mimetype2ext, | 
					
						
							| 
									
										
										
										
											2018-07-21 19:08:28 +07:00
										 |  |  |     url_or_none, | 
					
						
							| 
									
										
										
										
											2013-12-20 17:05:28 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AparatIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2017-08-12 17:18:23 +07:00
										 |  |  |     _VALID_URL = r'https?://(?:www\.)?aparat\.com/(?:v/|video/video/embed/videohash/)(?P<id>[a-zA-Z0-9]+)' | 
					
						
							| 
									
										
										
										
											2013-12-20 17:05:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |     _TESTS = [{ | 
					
						
							| 
									
										
										
										
											2014-08-22 01:44:35 +02:00
										 |  |  |         'url': 'http://www.aparat.com/v/wP8On', | 
					
						
							| 
									
										
										
										
											2016-08-08 12:59:07 +08:00
										 |  |  |         'md5': '131aca2e14fe7c4dcb3c4877ba300c89', | 
					
						
							| 
									
										
										
										
											2014-08-22 01:44:35 +02:00
										 |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': 'wP8On', | 
					
						
							|  |  |  |             'ext': 'mp4', | 
					
						
							|  |  |  |             'title': 'تیم گلکسی 11 - زومیت', | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |             'description': 'md5:096bdabcdcc4569f2b8a5e903a3b3028', | 
					
						
							|  |  |  |             'duration': 231, | 
					
						
							|  |  |  |             'timestamp': 1387394859, | 
					
						
							|  |  |  |             'upload_date': '20131218', | 
					
						
							|  |  |  |             'view_count': int, | 
					
						
							| 
									
										
										
										
											2013-12-20 17:05:28 +01:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |     }, { | 
					
						
							|  |  |  |         # multiple formats | 
					
						
							|  |  |  |         'url': 'https://www.aparat.com/v/8dflw/', | 
					
						
							|  |  |  |         'only_matching': True, | 
					
						
							|  |  |  |     }] | 
					
						
							| 
									
										
										
										
											2013-12-20 17:05:28 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2014-11-26 12:40:51 +01:00
										 |  |  |         video_id = self._match_id(url) | 
					
						
							| 
									
										
										
										
											2013-12-20 17:05:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |         # Provides more metadata | 
					
						
							|  |  |  |         webpage = self._download_webpage(url, video_id, fatal=False) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not webpage: | 
					
						
							|  |  |  |             # Note: There is an easier-to-parse configuration at | 
					
						
							|  |  |  |             # http://www.aparat.com/video/video/config/videohash/%video_id | 
					
						
							|  |  |  |             # but the URL in there does not work | 
					
						
							|  |  |  |             webpage = self._download_webpage( | 
					
						
							|  |  |  |                 'http://www.aparat.com/video/video/embed/vt/frame/showvideo/yes/videohash/' + video_id, | 
					
						
							|  |  |  |                 video_id) | 
					
						
							| 
									
										
										
										
											2013-12-20 17:05:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |         options = self._parse_json( | 
					
						
							| 
									
										
										
										
											2017-08-12 17:18:23 +07:00
										 |  |  |             self._search_regex( | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |                 r'options\s*=\s*JSON\.parse\(\s*(["\'])(?P<value>(?:(?!\1).)+)\1\s*\)', | 
					
						
							|  |  |  |                 webpage, 'options', group='value'), | 
					
						
							| 
									
										
										
										
											2017-08-12 17:18:23 +07:00
										 |  |  |             video_id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |         player = options['plugins']['sabaPlayerPlugin'] | 
					
						
							| 
									
										
										
										
											2018-09-06 02:08:38 +04:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-12 17:18:23 +07:00
										 |  |  |         formats = [] | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |         for sources in player['multiSRC']: | 
					
						
							|  |  |  |             for item in sources: | 
					
						
							|  |  |  |                 if not isinstance(item, dict): | 
					
						
							|  |  |  |                     continue | 
					
						
							| 
									
										
										
										
											2018-09-06 02:08:38 +04:30
										 |  |  |                 file_url = url_or_none(item.get('src')) | 
					
						
							|  |  |  |                 if not file_url: | 
					
						
							|  |  |  |                     continue | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |                 item_type = item.get('type') | 
					
						
							|  |  |  |                 if item_type == 'application/vnd.apple.mpegurl': | 
					
						
							|  |  |  |                     formats.extend(self._extract_m3u8_formats( | 
					
						
							|  |  |  |                         file_url, video_id, 'mp4', | 
					
						
							|  |  |  |                         entry_protocol='m3u8_native', m3u8_id='hls', | 
					
						
							|  |  |  |                         fatal=False)) | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     ext = mimetype2ext(item.get('type')) | 
					
						
							|  |  |  |                     label = item.get('label') | 
					
						
							|  |  |  |                     formats.append({ | 
					
						
							|  |  |  |                         'url': file_url, | 
					
						
							|  |  |  |                         'ext': ext, | 
					
						
							|  |  |  |                         'format_id': 'http-%s' % (label or ext), | 
					
						
							|  |  |  |                         'height': int_or_none(self._search_regex( | 
					
						
							|  |  |  |                             r'(\d+)[pP]', label or '', 'height', | 
					
						
							|  |  |  |                             default=None)), | 
					
						
							|  |  |  |                     }) | 
					
						
							|  |  |  |         self._sort_formats( | 
					
						
							|  |  |  |             formats, field_preference=('height', 'width', 'tbr', 'format_id')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         info = self._search_json_ld(webpage, video_id, default={}) | 
					
						
							| 
									
										
										
										
											2017-08-12 17:18:23 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |         if not info.get('title'): | 
					
						
							|  |  |  |             info['title'] = player['title'] | 
					
						
							| 
									
										
										
										
											2013-12-20 17:05:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |         return merge_dicts(info, { | 
					
						
							| 
									
										
										
										
											2013-12-20 17:05:28 +01:00
										 |  |  |             'id': video_id, | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |             'thumbnail': url_or_none(options.get('poster')), | 
					
						
							|  |  |  |             'duration': int_or_none(player.get('duration')), | 
					
						
							| 
									
										
										
										
											2017-08-12 17:18:23 +07:00
										 |  |  |             'formats': formats, | 
					
						
							| 
									
										
										
										
											2018-10-29 23:29:05 +07:00
										 |  |  |         }) |