| 
									
										
										
										
											2014-09-14 23:14:00 -05:00
										 |  |  | # coding: utf-8 | 
					
						
							|  |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  | import json | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-14 23:14:00 -05:00
										 |  |  | from .common import InfoExtractor | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  | from ..compat import ( | 
					
						
							| 
									
										
										
										
											2018-01-23 22:23:12 +07:00
										 |  |  |     compat_b64decode, | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  |     compat_str, | 
					
						
							| 
									
										
										
										
											2018-01-23 22:23:12 +07:00
										 |  |  |     compat_urlparse, | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2016-01-01 02:23:03 +06:00
										 |  |  | from ..utils import ( | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  |     extract_attributes, | 
					
						
							|  |  |  |     ExtractorError, | 
					
						
							|  |  |  |     get_elements_by_class, | 
					
						
							|  |  |  |     urlencode_postdata, | 
					
						
							| 
									
										
										
										
											2016-01-01 02:23:03 +06:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-09-14 23:14:00 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class EinthusanIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2017-02-17 22:02:01 +07:00
										 |  |  |     _VALID_URL = r'https?://einthusan\.tv/movie/watch/(?P<id>[^/?#&]+)' | 
					
						
							|  |  |  |     _TESTS = [{ | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  |         'url': 'https://einthusan.tv/movie/watch/9097/', | 
					
						
							|  |  |  |         'md5': 'ff0f7f2065031b8a2cf13a933731c035', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': '9097', | 
					
						
							|  |  |  |             'ext': 'mp4', | 
					
						
							|  |  |  |             'title': 'Ae Dil Hai Mushkil', | 
					
						
							|  |  |  |             'description': 'md5:33ef934c82a671a94652a9b4e54d931b', | 
					
						
							|  |  |  |             'thumbnail': r're:^https?://.*\.jpg$', | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-17 22:02:01 +07:00
										 |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'https://einthusan.tv/movie/watch/51MZ/?lang=hindi', | 
					
						
							|  |  |  |         'only_matching': True, | 
					
						
							|  |  |  |     }] | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # reversed from jsoncrypto.prototype.decrypt() in einthusan-PGMovieWatcher.js | 
					
						
							|  |  |  |     def _decrypt(self, encrypted_data, video_id): | 
					
						
							| 
									
										
										
										
											2018-01-23 22:23:12 +07:00
										 |  |  |         return self._parse_json(compat_b64decode(( | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  |             encrypted_data[:10] + encrypted_data[-1] + encrypted_data[12:-1] | 
					
						
							| 
									
										
										
										
											2018-01-23 22:23:12 +07:00
										 |  |  |         )).decode('utf-8'), video_id) | 
					
						
							| 
									
										
										
										
											2014-09-14 23:14:00 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2016-01-01 02:23:03 +06:00
										 |  |  |         video_id = self._match_id(url) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  |         webpage = self._download_webpage(url, video_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         title = self._html_search_regex(r'<h3>([^<]+)</h3>', webpage, 'title') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         player_params = extract_attributes(self._search_regex( | 
					
						
							|  |  |  |             r'(<section[^>]+id="UIVideoPlayer"[^>]+>)', webpage, 'player parameters')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         page_id = self._html_search_regex( | 
					
						
							|  |  |  |             '<html[^>]+data-pageid="([^"]+)"', webpage, 'page ID') | 
					
						
							|  |  |  |         video_data = self._download_json( | 
					
						
							|  |  |  |             'https://einthusan.tv/ajax/movie/watch/%s/' % video_id, video_id, | 
					
						
							|  |  |  |             data=urlencode_postdata({ | 
					
						
							|  |  |  |                 'xEvent': 'UIVideoPlayer.PingOutcome', | 
					
						
							|  |  |  |                 'xJson': json.dumps({ | 
					
						
							|  |  |  |                     'EJOutcomes': player_params['data-ejpingables'], | 
					
						
							|  |  |  |                     'NativeHLS': False | 
					
						
							|  |  |  |                 }), | 
					
						
							|  |  |  |                 'arcVersion': 3, | 
					
						
							|  |  |  |                 'appVersion': 59, | 
					
						
							|  |  |  |                 'gorilla.csrf.Token': page_id, | 
					
						
							|  |  |  |             }))['Data'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if isinstance(video_data, compat_str) and video_data.startswith('/ratelimited/'): | 
					
						
							|  |  |  |             raise ExtractorError( | 
					
						
							|  |  |  |                 'Download rate reached. Please try again later.', expected=True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ej_links = self._decrypt(video_data['EJLinks'], video_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         formats = [] | 
					
						
							| 
									
										
										
										
											2014-09-14 23:14:00 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  |         m3u8_url = ej_links.get('HLSLink') | 
					
						
							|  |  |  |         if m3u8_url: | 
					
						
							|  |  |  |             formats.extend(self._extract_m3u8_formats( | 
					
						
							|  |  |  |                 m3u8_url, video_id, ext='mp4', entry_protocol='m3u8_native')) | 
					
						
							| 
									
										
										
										
											2014-09-14 23:14:00 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  |         mp4_url = ej_links.get('MP4Link') | 
					
						
							|  |  |  |         if mp4_url: | 
					
						
							|  |  |  |             formats.append({ | 
					
						
							|  |  |  |                 'url': mp4_url, | 
					
						
							|  |  |  |             }) | 
					
						
							| 
									
										
										
										
											2015-12-15 21:37:47 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  |         self._sort_formats(formats) | 
					
						
							| 
									
										
										
										
											2014-09-14 23:14:00 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  |         description = get_elements_by_class('synopsis', webpage)[0] | 
					
						
							| 
									
										
										
										
											2014-09-15 23:33:47 +02:00
										 |  |  |         thumbnail = self._html_search_regex( | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  |             r'''<img[^>]+src=(["'])(?P<url>(?!\1).+?/moviecovers/(?!\1).+?)\1''', | 
					
						
							|  |  |  |             webpage, 'thumbnail url', fatal=False, group='url') | 
					
						
							| 
									
										
										
										
											2014-09-15 23:33:47 +02:00
										 |  |  |         if thumbnail is not None: | 
					
						
							| 
									
										
										
										
											2017-02-12 20:53:55 +08:00
										 |  |  |             thumbnail = compat_urlparse.urljoin(url, thumbnail) | 
					
						
							| 
									
										
										
										
											2014-09-14 23:14:00 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             'id': video_id, | 
					
						
							| 
									
										
										
										
											2016-01-01 02:23:03 +06:00
										 |  |  |             'title': title, | 
					
						
							| 
									
										
										
										
											2016-09-27 14:38:41 +08:00
										 |  |  |             'formats': formats, | 
					
						
							| 
									
										
										
										
											2014-09-15 23:33:47 +02:00
										 |  |  |             'thumbnail': thumbnail, | 
					
						
							|  |  |  |             'description': description, | 
					
						
							| 
									
										
										
										
											2014-09-14 23:14:00 -05:00
										 |  |  |         } |