| 
									
										
										
										
											2014-01-07 09:41:13 +01:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-28 13:32:49 +01:00
										 |  |  | import re | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from .common import InfoExtractor | 
					
						
							| 
									
										
										
										
											2015-10-18 14:13:06 +02:00
										 |  |  | from ..utils import ( | 
					
						
							| 
									
										
										
										
											2018-04-28 04:51:39 +07:00
										 |  |  |     determine_ext, | 
					
						
							| 
									
										
										
										
											2016-05-13 23:25:05 +06:00
										 |  |  |     mimetype2ext, | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |     parse_duration, | 
					
						
							| 
									
										
										
										
											2015-10-18 14:13:06 +02:00
										 |  |  |     qualities, | 
					
						
							| 
									
										
										
										
											2018-07-21 19:08:28 +07:00
										 |  |  |     url_or_none, | 
					
						
							| 
									
										
										
										
											2013-11-28 13:32:49 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ImdbIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2014-01-07 09:41:13 +01:00
										 |  |  |     IE_NAME = 'imdb' | 
					
						
							|  |  |  |     IE_DESC = 'Internet Movie Database trailers' | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |     _VALID_URL = r'https?://(?:www|m)\.imdb\.com/(?:video|title|list).+?[/-]vi(?P<id>\d+)' | 
					
						
							| 
									
										
										
										
											2013-11-28 13:32:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-13 22:19:00 +06:00
										 |  |  |     _TESTS = [{ | 
					
						
							| 
									
										
										
										
											2014-01-07 09:41:13 +01:00
										 |  |  |         'url': 'http://www.imdb.com/video/imdb/vi2524815897', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': '2524815897', | 
					
						
							|  |  |  |             'ext': 'mp4', | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |             'title': 'No. 2 from Ice Age: Continental Drift (2012)', | 
					
						
							|  |  |  |             'description': 'md5:87bd0bdc61e351f21f20d2d7441cb4e7', | 
					
						
							| 
									
										
										
										
											2013-11-28 13:32:49 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-05-13 22:19:00 +06:00
										 |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'http://www.imdb.com/video/_/vi2524815897', | 
					
						
							|  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2016-06-15 22:34:55 +07:00
										 |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'http://www.imdb.com/title/tt1667889/?ref_=ext_shr_eml_vi#lb-vi2524815897', | 
					
						
							|  |  |  |         'only_matching': True, | 
					
						
							|  |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'http://www.imdb.com/title/tt1667889/#lb-vi2524815897', | 
					
						
							|  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2017-01-17 23:14:07 +07:00
										 |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'http://www.imdb.com/videoplayer/vi1562949145', | 
					
						
							|  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2017-05-14 00:32:50 +07:00
										 |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'http://www.imdb.com/title/tt4218696/videoplayer/vi2608641561', | 
					
						
							|  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'https://www.imdb.com/list/ls009921623/videoplayer/vi260482329', | 
					
						
							|  |  |  |         'only_matching': True, | 
					
						
							| 
									
										
										
										
											2016-05-13 22:19:00 +06:00
										 |  |  |     }] | 
					
						
							| 
									
										
										
										
											2013-11-28 13:32:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2014-11-04 23:26:23 +01:00
										 |  |  |         video_id = self._match_id(url) | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |         webpage = self._download_webpage( | 
					
						
							|  |  |  |             'https://www.imdb.com/videoplayer/vi' + video_id, video_id) | 
					
						
							|  |  |  |         video_metadata = self._parse_json(self._search_regex( | 
					
						
							|  |  |  |             r'window\.IMDbReactInitialState\.push\(({.+?})\);', webpage, | 
					
						
							|  |  |  |             'video metadata'), video_id)['videos']['videoMetadata']['vi' + video_id] | 
					
						
							|  |  |  |         title = self._html_search_meta( | 
					
						
							|  |  |  |             ['og:title', 'twitter:title'], webpage) or self._html_search_regex( | 
					
						
							|  |  |  |             r'<title>(.+?)</title>', webpage, 'title', fatal=False) or video_metadata['title'] | 
					
						
							| 
									
										
										
										
											2015-10-18 14:13:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-27 15:51:25 +06:00
										 |  |  |         quality = qualities(('SD', '480p', '720p', '1080p')) | 
					
						
							| 
									
										
										
										
											2013-11-28 13:32:49 +01:00
										 |  |  |         formats = [] | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |         for encoding in video_metadata.get('encodings', []): | 
					
						
							|  |  |  |             if not encoding or not isinstance(encoding, dict): | 
					
						
							| 
									
										
										
										
											2016-05-13 23:25:05 +06:00
										 |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2018-07-21 19:08:28 +07:00
										 |  |  |             video_url = url_or_none(encoding.get('videoUrl')) | 
					
						
							|  |  |  |             if not video_url: | 
					
						
							| 
									
										
										
										
											2016-05-13 23:25:05 +06:00
										 |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2018-08-06 04:37:03 +07:00
										 |  |  |             ext = mimetype2ext(encoding.get( | 
					
						
							|  |  |  |                 'mimeType')) or determine_ext(video_url) | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |             if ext == 'm3u8': | 
					
						
							|  |  |  |                 formats.extend(self._extract_m3u8_formats( | 
					
						
							|  |  |  |                     video_url, video_id, 'mp4', entry_protocol='m3u8_native', | 
					
						
							|  |  |  |                     m3u8_id='hls', fatal=False)) | 
					
						
							| 
									
										
										
										
											2016-05-13 23:25:05 +06:00
										 |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |             format_id = encoding.get('definition') | 
					
						
							|  |  |  |             formats.append({ | 
					
						
							|  |  |  |                 'format_id': format_id, | 
					
						
							|  |  |  |                 'url': video_url, | 
					
						
							|  |  |  |                 'ext': ext, | 
					
						
							|  |  |  |                 'quality': quality(format_id), | 
					
						
							|  |  |  |             }) | 
					
						
							| 
									
										
										
										
											2015-10-18 14:13:06 +02:00
										 |  |  |         self._sort_formats(formats) | 
					
						
							| 
									
										
										
										
											2013-11-28 13:32:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             'id': video_id, | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |             'title': title, | 
					
						
							| 
									
										
										
										
											2013-11-28 13:32:49 +01:00
										 |  |  |             'formats': formats, | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |             'description': video_metadata.get('description'), | 
					
						
							|  |  |  |             'thumbnail': video_metadata.get('slate', {}).get('url'), | 
					
						
							|  |  |  |             'duration': parse_duration(video_metadata.get('duration')), | 
					
						
							| 
									
										
										
										
											2013-11-28 13:32:49 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-12-25 08:34:41 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-07 09:41:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-25 08:34:41 +07:00
										 |  |  | class ImdbListIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2014-01-07 09:41:13 +01:00
										 |  |  |     IE_NAME = 'imdb:list' | 
					
						
							|  |  |  |     IE_DESC = 'Internet Movie Database lists' | 
					
						
							| 
									
										
										
										
											2018-05-19 11:04:08 +01:00
										 |  |  |     _VALID_URL = r'https?://(?:www\.)?imdb\.com/list/ls(?P<id>\d{9})(?!/videoplayer/vi\d+)' | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |     _TEST = { | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |         'url': 'https://www.imdb.com/list/ls009921623/', | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |         'info_dict': { | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |             'id': '009921623', | 
					
						
							|  |  |  |             'title': 'The Bourne Legacy', | 
					
						
							|  |  |  |             'description': 'A list of trailers, clips, and more from The Bourne Legacy, starring Jeremy Renner and Rachel Weisz.', | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |         'playlist_count': 8, | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-25 08:34:41 +07:00
										 |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2014-11-04 23:26:23 +01:00
										 |  |  |         list_id = self._match_id(url) | 
					
						
							| 
									
										
										
										
											2014-01-22 03:41:19 +01:00
										 |  |  |         webpage = self._download_webpage(url, list_id) | 
					
						
							|  |  |  |         entries = [ | 
					
						
							|  |  |  |             self.url_result('http://www.imdb.com' + m, 'Imdb') | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |             for m in re.findall(r'href="(/list/ls%s/videoplayer/vi[^"]+)"' % list_id, webpage)] | 
					
						
							| 
									
										
										
										
											2014-01-22 03:41:19 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         list_title = self._html_search_regex( | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |             r'<h1[^>]+class="[^"]*header[^"]*"[^>]*>(.*?)</h1>', | 
					
						
							|  |  |  |             webpage, 'list title') | 
					
						
							|  |  |  |         list_description = self._html_search_regex( | 
					
						
							|  |  |  |             r'<div[^>]+class="[^"]*list-description[^"]*"[^>]*><p>(.*?)</p>', | 
					
						
							|  |  |  |             webpage, 'list description') | 
					
						
							| 
									
										
										
										
											2014-01-22 03:41:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 10:15:11 +01:00
										 |  |  |         return self.playlist_result(entries, list_id, list_title, list_description) |