| 
									
										
										
										
											2014-01-07 10:04:48 +01:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											2013-09-29 20:49:58 +02:00
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | from .common import InfoExtractor | 
					
						
							|  |  |  | from ..utils import ( | 
					
						
							| 
									
										
										
										
											2013-09-29 20:49:58 +02:00
										 |  |  |     compat_urlparse, | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AppleTrailersIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2013-12-04 20:34:47 +07:00
										 |  |  |     _VALID_URL = r'https?://(?:www\.)?trailers\.apple\.com/trailers/(?P<company>[^/]+)/(?P<movie>[^/]+)' | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  |     _TEST = { | 
					
						
							| 
									
										
										
										
											2014-01-07 10:04:48 +01:00
										 |  |  |         "url": "http://trailers.apple.com/trailers/wb/manofsteel/", | 
					
						
							|  |  |  |         "playlist": [ | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2014-01-07 10:04:48 +01:00
										 |  |  |                 "md5": "d97a8e575432dbcb81b7c3acb741f8a8", | 
					
						
							|  |  |  |                 "info_dict": { | 
					
						
							| 
									
										
										
										
											2014-03-27 21:10:51 +01:00
										 |  |  |                     "id": "manofsteel-trailer4", | 
					
						
							|  |  |  |                     "ext": "mov", | 
					
						
							| 
									
										
										
										
											2014-01-07 10:04:48 +01:00
										 |  |  |                     "duration": 111, | 
					
						
							|  |  |  |                     "title": "Trailer 4", | 
					
						
							|  |  |  |                     "upload_date": "20130523", | 
					
						
							|  |  |  |                     "uploader_id": "wb", | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2014-01-07 10:04:48 +01:00
										 |  |  |                 "md5": "b8017b7131b721fb4e8d6f49e1df908c", | 
					
						
							|  |  |  |                 "info_dict": { | 
					
						
							| 
									
										
										
										
											2014-03-27 21:10:51 +01:00
										 |  |  |                     "id": "manofsteel-trailer3", | 
					
						
							|  |  |  |                     "ext": "mov", | 
					
						
							| 
									
										
										
										
											2014-01-07 10:04:48 +01:00
										 |  |  |                     "duration": 182, | 
					
						
							|  |  |  |                     "title": "Trailer 3", | 
					
						
							|  |  |  |                     "upload_date": "20130417", | 
					
						
							|  |  |  |                     "uploader_id": "wb", | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2014-01-07 10:04:48 +01:00
										 |  |  |                 "md5": "d0f1e1150989b9924679b441f3404d48", | 
					
						
							|  |  |  |                 "info_dict": { | 
					
						
							| 
									
										
										
										
											2014-03-27 21:10:51 +01:00
										 |  |  |                     "id": "manofsteel-trailer", | 
					
						
							|  |  |  |                     "ext": "mov", | 
					
						
							| 
									
										
										
										
											2014-01-07 10:04:48 +01:00
										 |  |  |                     "duration": 148, | 
					
						
							|  |  |  |                     "title": "Trailer", | 
					
						
							|  |  |  |                     "upload_date": "20121212", | 
					
						
							|  |  |  |                     "uploader_id": "wb", | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  |                 }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2014-01-07 10:04:48 +01:00
										 |  |  |                 "md5": "5fe08795b943eb2e757fa95cb6def1cb", | 
					
						
							|  |  |  |                 "info_dict": { | 
					
						
							| 
									
										
										
										
											2014-03-27 21:10:51 +01:00
										 |  |  |                     "id": "manofsteel-teaser", | 
					
						
							|  |  |  |                     "ext": "mov", | 
					
						
							| 
									
										
										
										
											2014-01-07 10:04:48 +01:00
										 |  |  |                     "duration": 93, | 
					
						
							|  |  |  |                     "title": "Teaser", | 
					
						
							|  |  |  |                     "upload_date": "20120721", | 
					
						
							|  |  |  |                     "uploader_id": "wb", | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2014-03-27 21:10:51 +01:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  |         ] | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-29 20:49:58 +02:00
										 |  |  |     _JSON_RE = r'iTunes.playURL\((.*?)\);' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  |     def _real_extract(self, url): | 
					
						
							|  |  |  |         mobj = re.match(self._VALID_URL, url) | 
					
						
							|  |  |  |         movie = mobj.group('movie') | 
					
						
							|  |  |  |         uploader_id = mobj.group('company') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-27 21:10:51 +01:00
										 |  |  |         playlist_url = compat_urlparse.urljoin(url, 'includes/playlists/itunes.inc') | 
					
						
							| 
									
										
										
										
											2013-12-10 21:03:53 +01:00
										 |  |  |         def fix_html(s): | 
					
						
							| 
									
										
										
										
											2014-03-27 21:10:51 +01:00
										 |  |  |             s = re.sub(r'(?s)<script[^<]*?>.*?</script>', '', s) | 
					
						
							| 
									
										
										
										
											2013-12-10 21:03:53 +01:00
										 |  |  |             s = re.sub(r'<img ([^<]*?)>', r'<img \1/>', s) | 
					
						
							|  |  |  |             # The ' in the onClick attributes are not escaped, it couldn't be parsed | 
					
						
							|  |  |  |             # like: http://trailers.apple.com/trailers/wb/gravity/ | 
					
						
							|  |  |  |             def _clean_json(m): | 
					
						
							| 
									
										
										
										
											2014-03-27 21:10:51 +01:00
										 |  |  |                 return 'iTunes.playURL(%s);' % m.group(1).replace('\'', ''') | 
					
						
							| 
									
										
										
										
											2013-12-10 21:03:53 +01:00
										 |  |  |             s = re.sub(self._JSON_RE, _clean_json, s) | 
					
						
							| 
									
										
										
										
											2014-03-27 21:10:51 +01:00
										 |  |  |             s = '<html>' + s + u'</html>' | 
					
						
							| 
									
										
										
										
											2013-12-10 21:03:53 +01:00
										 |  |  |             return s | 
					
						
							|  |  |  |         doc = self._download_xml(playlist_url, movie, transform_source=fix_html) | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         playlist = [] | 
					
						
							|  |  |  |         for li in doc.findall('./div/ul/li'): | 
					
						
							| 
									
										
										
										
											2013-09-29 20:49:58 +02:00
										 |  |  |             on_click = li.find('.//a').attrib['onClick'] | 
					
						
							|  |  |  |             trailer_info_json = self._search_regex(self._JSON_RE, | 
					
						
							| 
									
										
										
										
											2014-03-27 21:10:51 +01:00
										 |  |  |                 on_click, 'trailer info') | 
					
						
							| 
									
										
										
										
											2013-09-29 20:49:58 +02:00
										 |  |  |             trailer_info = json.loads(trailer_info_json) | 
					
						
							|  |  |  |             title = trailer_info['title'] | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  |             video_id = movie + '-' + re.sub(r'[^a-zA-Z0-9]', '', title).lower() | 
					
						
							|  |  |  |             thumbnail = li.find('.//img').attrib['src'] | 
					
						
							| 
									
										
										
										
											2013-09-29 20:49:58 +02:00
										 |  |  |             upload_date = trailer_info['posted'].replace('-', '') | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-29 20:49:58 +02:00
										 |  |  |             runtime = trailer_info['runtime'] | 
					
						
							|  |  |  |             m = re.search(r'(?P<minutes>[0-9]+):(?P<seconds>[0-9]{1,2})', runtime) | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  |             duration = None | 
					
						
							|  |  |  |             if m: | 
					
						
							|  |  |  |                 duration = 60 * int(m.group('minutes')) + int(m.group('seconds')) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-29 20:49:58 +02:00
										 |  |  |             first_url = trailer_info['url'] | 
					
						
							| 
									
										
										
										
											2013-09-29 20:59:19 +02:00
										 |  |  |             trailer_id = first_url.split('/')[-1].rpartition('_')[0].lower() | 
					
						
							| 
									
										
										
										
											2013-09-29 20:49:58 +02:00
										 |  |  |             settings_json_url = compat_urlparse.urljoin(url, 'includes/settings/%s.json' % trailer_id) | 
					
						
							| 
									
										
										
										
											2014-03-27 21:10:51 +01:00
										 |  |  |             settings = self._download_json(settings_json_url, trailer_id, 'Downloading settings json') | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-29 20:49:58 +02:00
										 |  |  |             formats = [] | 
					
						
							|  |  |  |             for format in settings['metadata']['sizes']: | 
					
						
							|  |  |  |                 # The src is a file pointing to the real video file | 
					
						
							|  |  |  |                 format_url = re.sub(r'_(\d*p.mov)', r'_h\1', format['src']) | 
					
						
							|  |  |  |                 formats.append({ | 
					
						
							|  |  |  |                     'url': format_url, | 
					
						
							|  |  |  |                     'format': format['type'], | 
					
						
							|  |  |  |                     'width': format['width'], | 
					
						
							|  |  |  |                     'height': int(format['height']), | 
					
						
							|  |  |  |                 }) | 
					
						
							| 
									
										
										
										
											2013-12-25 15:24:41 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             self._sort_formats(formats) | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:06 +01:00
										 |  |  |             playlist.append({ | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  |                 '_type': 'video', | 
					
						
							|  |  |  |                 'id': video_id, | 
					
						
							|  |  |  |                 'title': title, | 
					
						
							|  |  |  |                 'formats': formats, | 
					
						
							|  |  |  |                 'title': title, | 
					
						
							|  |  |  |                 'duration': duration, | 
					
						
							|  |  |  |                 'thumbnail': thumbnail, | 
					
						
							|  |  |  |                 'upload_date': upload_date, | 
					
						
							|  |  |  |                 'uploader_id': uploader_id, | 
					
						
							|  |  |  |                 'user_agent': 'QuickTime compatible (youtube-dl)', | 
					
						
							| 
									
										
										
										
											2013-12-03 14:21:06 +01:00
										 |  |  |             }) | 
					
						
							| 
									
										
										
										
											2013-08-28 02:18:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             '_type': 'playlist', | 
					
						
							|  |  |  |             'id': movie, | 
					
						
							|  |  |  |             'entries': playlist, | 
					
						
							|  |  |  |         } |