]>
Commit | Line | Data |
---|---|---|
40c716d2 JMF |
1 | from __future__ import unicode_literals |
2 | ||
2ef648d3 | 3 | import re |
2ef648d3 JMF |
4 | |
5 | from .common import InfoExtractor | |
adccf336 | 6 | from ..utils import ( |
7 | int_or_none, | |
8 | parse_iso8601, | |
9 | ) | |
2ef648d3 | 10 | |
a95967f8 | 11 | |
2ef648d3 | 12 | class IGNIE(InfoExtractor): |
a95967f8 JMF |
13 | """ |
14 | Extractor for some of the IGN sites, like www.ign.com, es.ign.com de.ign.com. | |
15 | Some videos of it.ign.com are also supported | |
16 | """ | |
17 | ||
adccf336 | 18 | _VALID_URL = r'https?://.+?\.ign\.com/(?:[^/]+/)?(?P<type>videos|show_videos|articles|feature|(?:[^/]+/\d+/video))(/.+)?/(?P<name_or_id>.+)' |
40c716d2 | 19 | IE_NAME = 'ign.com' |
2ef648d3 | 20 | |
adccf336 | 21 | _API_URL_TEMPLATE = 'http://apis.ign.com/video/v3/videos/%s' |
22 | _EMBED_RE = r'<iframe[^>]+?["\']((?:https?:)?//.+?\.ign\.com.+?/embed.+?)["\']' | |
a95967f8 | 23 | |
ee6adb16 JMF |
24 | _TESTS = [ |
25 | { | |
40c716d2 | 26 | 'url': 'http://www.ign.com/videos/2013/06/05/the-last-of-us-review', |
adccf336 | 27 | 'md5': 'febda82c4bafecd2d44b6e1a18a595f8', |
40c716d2 JMF |
28 | 'info_dict': { |
29 | 'id': '8f862beef863986b2785559b9e1aa599', | |
30 | 'ext': 'mp4', | |
31 | 'title': 'The Last of Us Review', | |
32 | 'description': 'md5:c8946d4260a4d43a00d5ae8ed998870c', | |
adccf336 | 33 | 'timestamp': 1370440800, |
34 | 'upload_date': '20130605', | |
e3e166d8 | 35 | 'uploader_id': 'cberidon@ign.com', |
ee6adb16 JMF |
36 | } |
37 | }, | |
38 | { | |
40c716d2 | 39 | 'url': 'http://me.ign.com/en/feature/15775/100-little-things-in-gta-5-that-will-blow-your-mind', |
4d278fde PH |
40 | 'info_dict': { |
41 | 'id': '100-little-things-in-gta-5-that-will-blow-your-mind', | |
42 | }, | |
40c716d2 | 43 | 'playlist': [ |
ee6adb16 | 44 | { |
40c716d2 JMF |
45 | 'info_dict': { |
46 | 'id': '5ebbd138523268b93c9141af17bec937', | |
47 | 'ext': 'mp4', | |
48 | 'title': 'GTA 5 Video Review', | |
49 | 'description': 'Rockstar drops the mic on this generation of games. Watch our review of the masterly Grand Theft Auto V.', | |
adccf336 | 50 | 'timestamp': 1379339880, |
51 | 'upload_date': '20130916', | |
e3e166d8 | 52 | 'uploader_id': 'danieljkrupa@gmail.com', |
ee6adb16 JMF |
53 | }, |
54 | }, | |
55 | { | |
40c716d2 JMF |
56 | 'info_dict': { |
57 | 'id': '638672ee848ae4ff108df2a296418ee2', | |
58 | 'ext': 'mp4', | |
59 | 'title': '26 Twisted Moments from GTA 5 in Slow Motion', | |
60 | 'description': 'The twisted beauty of GTA 5 in stunning slow motion.', | |
adccf336 | 61 | 'timestamp': 1386878820, |
62 | 'upload_date': '20131212', | |
e3e166d8 | 63 | 'uploader_id': 'togilvie@ign.com', |
ee6adb16 JMF |
64 | }, |
65 | }, | |
66 | ], | |
40c716d2 JMF |
67 | 'params': { |
68 | 'skip_download': True, | |
ee6adb16 JMF |
69 | }, |
70 | }, | |
a204c854 JMF |
71 | { |
72 | 'url': 'http://www.ign.com/articles/2014/08/15/rewind-theater-wild-trailer-gamescom-2014?watch', | |
cc36e229 | 73 | 'md5': '618fedb9c901fd086f6f093564ef8558', |
a204c854 JMF |
74 | 'info_dict': { |
75 | 'id': '078fdd005f6d3c02f63d795faa1b984f', | |
76 | 'ext': 'mp4', | |
77 | 'title': 'Rewind Theater - Wild Trailer Gamescom 2014', | |
adccf336 | 78 | 'description': 'Brian and Jared explore Michel Ancel\'s captivating new preview.', |
79 | 'timestamp': 1408047180, | |
80 | 'upload_date': '20140814', | |
e3e166d8 | 81 | 'uploader_id': 'jamesduggan1990@gmail.com', |
a204c854 JMF |
82 | }, |
83 | }, | |
db8e38b8 | 84 | { |
85 | 'url': 'http://me.ign.com/en/videos/112203/video/how-hitman-aims-to-be-different-than-every-other-s', | |
86 | 'only_matching': True, | |
87 | }, | |
88 | { | |
89 | 'url': 'http://me.ign.com/ar/angry-birds-2/106533/video/lrd-ldyy-lwl-lfylm-angry-birds', | |
90 | 'only_matching': True, | |
91 | }, | |
ee6adb16 | 92 | ] |
2ef648d3 | 93 | |
a95967f8 | 94 | def _find_video_id(self, webpage): |
40c716d2 | 95 | res_id = [ |
109a540e | 96 | r'"video_id"\s*:\s*"(.*?)"', |
cc36e229 | 97 | r'class="hero-poster[^"]*?"[^>]*id="(.+?)"', |
40c716d2 JMF |
98 | r'data-video-id="(.+?)"', |
99 | r'<object id="vid_(.+?)"', | |
100 | r'<meta name="og:image" content=".*/(.+?)-(.+?)/.+.jpg"', | |
101 | ] | |
adccf336 | 102 | return self._search_regex(res_id, webpage, 'video id', default=None) |
a95967f8 | 103 | |
2ef648d3 JMF |
104 | def _real_extract(self, url): |
105 | mobj = re.match(self._VALID_URL, url) | |
a95967f8 | 106 | name_or_id = mobj.group('name_or_id') |
f1fb2d12 | 107 | page_type = mobj.group('type') |
a95967f8 | 108 | webpage = self._download_webpage(url, name_or_id) |
a204c854 | 109 | if page_type != 'video': |
ee6adb16 | 110 | multiple_urls = re.findall( |
e3e166d8 | 111 | r'<param name="flashvars"[^>]*value="[^"]*?url=(https?://www\.ign\.com/videos/.*?)["&]', |
607d65fb | 112 | webpage) |
ee6adb16 | 113 | if multiple_urls: |
6043f1df PH |
114 | entries = [self.url_result(u, ie='IGN') for u in multiple_urls] |
115 | return { | |
116 | '_type': 'playlist', | |
117 | 'id': name_or_id, | |
118 | 'entries': entries, | |
119 | } | |
ee6adb16 | 120 | |
a95967f8 | 121 | video_id = self._find_video_id(webpage) |
adccf336 | 122 | if not video_id: |
f889ac45 | 123 | return self.url_result(self._search_regex( |
124 | self._EMBED_RE, webpage, 'embed url')) | |
adccf336 | 125 | return self._get_video_info(video_id) |
a95967f8 JMF |
126 | |
127 | def _get_video_info(self, video_id): | |
f889ac45 | 128 | api_data = self._download_json( |
129 | self._API_URL_TEMPLATE % video_id, video_id) | |
adccf336 | 130 | |
131 | formats = [] | |
132 | m3u8_url = api_data['refs'].get('m3uUrl') | |
133 | if m3u8_url: | |
f889ac45 | 134 | formats.extend(self._extract_m3u8_formats( |
135 | m3u8_url, video_id, 'mp4', 'm3u8_native', | |
136 | m3u8_id='hls', fatal=False)) | |
adccf336 | 137 | f4m_url = api_data['refs'].get('f4mUrl') |
138 | if f4m_url: | |
f889ac45 | 139 | formats.extend(self._extract_f4m_formats( |
140 | f4m_url, video_id, f4m_id='hds', fatal=False)) | |
adccf336 | 141 | for asset in api_data['assets']: |
142 | formats.append({ | |
143 | 'url': asset['url'], | |
144 | 'tbr': asset.get('actual_bitrate_kbps'), | |
145 | 'fps': asset.get('frame_rate'), | |
146 | 'height': int_or_none(asset.get('height')), | |
147 | 'width': int_or_none(asset.get('width')), | |
148 | }) | |
149 | self._sort_formats(formats) | |
150 | ||
e3e166d8 | 151 | thumbnails = [{ |
152 | 'url': thumbnail['url'] | |
153 | } for thumbnail in api_data.get('thumbnails', [])] | |
adccf336 | 154 | |
155 | metadata = api_data['metadata'] | |
2ef648d3 | 156 | |
40c716d2 | 157 | return { |
adccf336 | 158 | 'id': api_data.get('videoId') or video_id, |
159 | 'title': metadata.get('longTitle') or metadata.get('name') or metadata.get['title'], | |
160 | 'description': metadata.get('description'), | |
161 | 'timestamp': parse_iso8601(metadata.get('publishDate')), | |
162 | 'duration': int_or_none(metadata.get('duration')), | |
163 | 'display_id': metadata.get('slug') or video_id, | |
e3e166d8 | 164 | 'uploader_id': metadata.get('creator'), |
adccf336 | 165 | 'thumbnails': thumbnails, |
166 | 'formats': formats, | |
40c716d2 | 167 | } |
2ef648d3 JMF |
168 | |
169 | ||
a95967f8 | 170 | class OneUPIE(IGNIE): |
09b23c90 | 171 | _VALID_URL = r'https?://gamevideos\.1up\.com/(?P<type>video)/id/(?P<name_or_id>.+)\.html' |
a95967f8 JMF |
172 | IE_NAME = '1up.com' |
173 | ||
52fadd5f | 174 | _TESTS = [{ |
09b23c90 | 175 | 'url': 'http://gamevideos.1up.com/video/id/34976.html', |
adccf336 | 176 | 'md5': 'c9cc69e07acb675c31a16719f909e347', |
40c716d2 JMF |
177 | 'info_dict': { |
178 | 'id': '34976', | |
179 | 'ext': 'mp4', | |
180 | 'title': 'Sniper Elite V2 - Trailer', | |
adccf336 | 181 | 'description': 'md5:bf0516c5ee32a3217aa703e9b1bc7826', |
182 | 'timestamp': 1313099220, | |
183 | 'upload_date': '20110811', | |
e3e166d8 | 184 | 'uploader_id': 'IGN', |
a95967f8 | 185 | } |
52fadd5f | 186 | }] |
ee6adb16 | 187 | |
a95967f8 JMF |
188 | def _real_extract(self, url): |
189 | mobj = re.match(self._VALID_URL, url) | |
a95967f8 | 190 | result = super(OneUPIE, self)._real_extract(url) |
40c716d2 | 191 | result['id'] = mobj.group('name_or_id') |
a95967f8 | 192 | return result |
adccf336 | 193 | |
194 | ||
195 | class PCMagIE(IGNIE): | |
196 | _VALID_URL = r'https?://(?:www\.)?pcmag\.com/(?P<type>videos|article2)(/.+)?/(?P<name_or_id>.+)' | |
197 | IE_NAME = 'pcmag' | |
198 | ||
199 | _EMBED_RE = r'iframe.setAttribute\("src",\s*__util.objToUrlString\("http://widgets\.ign\.com/video/embed/content.html?[^"]*url=([^"]+)["&]' | |
200 | ||
201 | _TESTS = [{ | |
202 | 'url': 'http://www.pcmag.com/videos/2015/01/06/010615-whats-new-now-is-gogo-snooping-on-your-data', | |
203 | 'md5': '212d6154fd0361a2781075f1febbe9ad', | |
204 | 'info_dict': { | |
205 | 'id': 'ee10d774b508c9b8ec07e763b9125b91', | |
206 | 'ext': 'mp4', | |
207 | 'title': '010615_What\'s New Now: Is GoGo Snooping on Your Data?', | |
208 | 'description': 'md5:a7071ae64d2f68cc821c729d4ded6bb3', | |
209 | 'timestamp': 1420571160, | |
210 | 'upload_date': '20150106', | |
e3e166d8 | 211 | 'uploader_id': 'cozzipix@gmail.com', |
adccf336 | 212 | } |
607d65fb | 213 | }, { |
adccf336 | 214 | 'url': 'http://www.pcmag.com/article2/0,2817,2470156,00.asp', |
215 | 'md5': '94130c1ca07ba0adb6088350681f16c1', | |
216 | 'info_dict': { | |
217 | 'id': '042e560ba94823d43afcb12ddf7142ca', | |
218 | 'ext': 'mp4', | |
219 | 'title': 'HTC\'s Weird New Re Camera - What\'s New Now', | |
220 | 'description': 'md5:53433c45df96d2ea5d0fda18be2ca908', | |
221 | 'timestamp': 1412953920, | |
222 | 'upload_date': '20141010', | |
e3e166d8 | 223 | 'uploader_id': 'chris_snyder@pcmag.com', |
adccf336 | 224 | } |
225 | }] |