| 
									
										
										
										
											2014-04-19 19:51:04 +02:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-23 22:02:56 +02:00
										 |  |  | import re | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from .common import InfoExtractor | 
					
						
							|  |  |  | from ..utils import ( | 
					
						
							|  |  |  |     ExtractorError, | 
					
						
							|  |  |  |     unescapeHTML, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SteamIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2014-04-21 02:34:34 +02:00
										 |  |  |     _VALID_URL = r"""(?x)
 | 
					
						
							|  |  |  |         https?://store\.steampowered\.com/ | 
					
						
							|  |  |  |             (agecheck/)? | 
					
						
							|  |  |  |             (?P<urltype>video|app)/ #If the page is only for videos or for a game | 
					
						
							|  |  |  |             (?P<gameID>\d+)/? | 
					
						
							|  |  |  |             (?P<videoID>\d*)(?P<extra>\??) # For urltype == video we sometimes get the videoID | 
					
						
							|  |  |  |         | | 
					
						
							|  |  |  |         https?://(?:www\.)?steamcommunity\.com/sharedfiles/filedetails/\?id=(?P<fileID>[0-9]+) | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2013-06-23 22:02:56 +02:00
										 |  |  |     _VIDEO_PAGE_TEMPLATE = 'http://store.steampowered.com/video/%s/' | 
					
						
							|  |  |  |     _AGECHECK_TEMPLATE = 'http://store.steampowered.com/agecheck/video/%s/?snr=1_agecheck_agecheck__age-gate&ageDay=1&ageMonth=January&ageYear=1970' | 
					
						
							| 
									
										
										
										
											2014-04-21 02:34:34 +02:00
										 |  |  |     _TESTS = [{ | 
					
						
							| 
									
										
										
										
											2016-02-14 15:37:17 +06:00
										 |  |  |         'url': 'http://store.steampowered.com/video/105600/', | 
					
						
							|  |  |  |         'playlist': [ | 
					
						
							| 
									
										
										
										
											2013-06-27 20:20:00 +02:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2016-02-14 15:37:17 +06:00
										 |  |  |                 'md5': 'f870007cee7065d7c76b88f0a45ecc07', | 
					
						
							|  |  |  |                 'info_dict': { | 
					
						
							| 
									
										
										
										
											2014-04-19 19:51:04 +02:00
										 |  |  |                     'id': '81300', | 
					
						
							|  |  |  |                     'ext': 'flv', | 
					
						
							| 
									
										
										
										
											2016-02-14 15:37:17 +06:00
										 |  |  |                     'title': 'Terraria 1.1 Trailer', | 
					
						
							| 
									
										
										
										
											2014-04-19 19:51:04 +02:00
										 |  |  |                     'playlist_index': 1, | 
					
						
							| 
									
										
										
										
											2013-06-27 20:20:00 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2016-02-14 15:37:17 +06:00
										 |  |  |                 'md5': '61aaf31a5c5c3041afb58fb83cbb5751', | 
					
						
							|  |  |  |                 'info_dict': { | 
					
						
							| 
									
										
										
										
											2014-04-19 19:51:04 +02:00
										 |  |  |                     'id': '80859', | 
					
						
							|  |  |  |                     'ext': 'flv', | 
					
						
							| 
									
										
										
										
											2016-02-14 15:37:17 +06:00
										 |  |  |                     'title': 'Terraria Trailer', | 
					
						
							| 
									
										
										
										
											2014-04-19 19:51:04 +02:00
										 |  |  |                     'playlist_index': 2, | 
					
						
							| 
									
										
										
										
											2013-06-27 20:20:00 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2014-04-19 19:55:53 +02:00
										 |  |  |         ], | 
					
						
							|  |  |  |         'params': { | 
					
						
							|  |  |  |             'playlistend': 2, | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2014-04-21 02:34:34 +02:00
										 |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'http://steamcommunity.com/sharedfiles/filedetails/?id=242472205', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': 'WB5DvDOOvAY', | 
					
						
							|  |  |  |             'ext': 'mp4', | 
					
						
							|  |  |  |             'upload_date': '20140329', | 
					
						
							|  |  |  |             'title': 'FRONTIERS - Final Greenlight Trailer', | 
					
						
							| 
									
										
										
										
											2014-07-21 12:17:44 +02:00
										 |  |  |             'description': 'md5:dc96a773669d0ca1b36c13c1f30250d9', | 
					
						
							| 
									
										
										
										
											2014-04-21 02:34:34 +02:00
										 |  |  |             'uploader': 'AAD Productions', | 
					
						
							|  |  |  |             'uploader_id': 'AtomicAgeDogGames', | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }] | 
					
						
							| 
									
										
										
										
											2013-06-27 20:20:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-23 22:02:56 +02:00
										 |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2014-04-21 02:34:34 +02:00
										 |  |  |         m = re.match(self._VALID_URL, url) | 
					
						
							|  |  |  |         fileID = m.group('fileID') | 
					
						
							|  |  |  |         if fileID: | 
					
						
							|  |  |  |             videourl = url | 
					
						
							|  |  |  |             playlist_id = fileID | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             gameID = m.group('gameID') | 
					
						
							|  |  |  |             playlist_id = gameID | 
					
						
							|  |  |  |             videourl = self._VIDEO_PAGE_TEMPLATE % playlist_id | 
					
						
							|  |  |  |         webpage = self._download_webpage(videourl, playlist_id) | 
					
						
							| 
									
										
										
										
											2013-06-23 22:02:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if re.search('<h2>Please enter your birth date to continue:</h2>', webpage) is not None: | 
					
						
							| 
									
										
										
										
											2014-04-21 02:34:34 +02:00
										 |  |  |             videourl = self._AGECHECK_TEMPLATE % playlist_id | 
					
						
							| 
									
										
										
										
											2013-06-23 22:02:56 +02:00
										 |  |  |             self.report_age_confirmation() | 
					
						
							| 
									
										
										
										
											2014-04-21 02:34:34 +02:00
										 |  |  |             webpage = self._download_webpage(videourl, playlist_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if fileID: | 
					
						
							|  |  |  |             playlist_title = self._html_search_regex( | 
					
						
							|  |  |  |                 r'<div class="workshopItemTitle">(.+)</div>', webpage, 'title') | 
					
						
							|  |  |  |             mweb = re.finditer(r'''(?x)
 | 
					
						
							|  |  |  |                 'movie_(?P<videoID>[0-9]+)':\s*\{\s* | 
					
						
							|  |  |  |                 YOUTUBE_VIDEO_ID:\s*"(?P<youtube_id>[^"]+)", | 
					
						
							|  |  |  |                 ''', webpage)
 | 
					
						
							|  |  |  |             videos = [{ | 
					
						
							|  |  |  |                 '_type': 'url', | 
					
						
							|  |  |  |                 'url': vid.group('youtube_id'), | 
					
						
							|  |  |  |                 'ie_key': 'Youtube', | 
					
						
							|  |  |  |             } for vid in mweb] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             playlist_title = self._html_search_regex( | 
					
						
							|  |  |  |                 r'<h2 class="pageheader">(.*?)</h2>', webpage, 'game title') | 
					
						
							| 
									
										
										
										
											2013-06-23 22:02:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-21 02:34:34 +02:00
										 |  |  |             mweb = re.finditer(r'''(?x)
 | 
					
						
							|  |  |  |                 'movie_(?P<videoID>[0-9]+)':\s*\{\s* | 
					
						
							|  |  |  |                 FILENAME:\s*"(?P<videoURL>[\w:/\.\?=]+)" | 
					
						
							|  |  |  |                 (,\s*MOVIE_NAME:\s*\"(?P<videoName>[\w:/\.\?=\+-]+)\")?\s*\}, | 
					
						
							|  |  |  |                 ''', webpage)
 | 
					
						
							|  |  |  |             titles = re.finditer( | 
					
						
							|  |  |  |                 r'<span class="title">(?P<videoName>.+?)</span>', webpage) | 
					
						
							|  |  |  |             thumbs = re.finditer( | 
					
						
							|  |  |  |                 r'<img class="movie_thumb" src="(?P<thumbnail>.+?)">', webpage) | 
					
						
							|  |  |  |             videos = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for vid, vtitle, thumb in zip(mweb, titles, thumbs): | 
					
						
							|  |  |  |                 video_id = vid.group('videoID') | 
					
						
							|  |  |  |                 title = vtitle.group('videoName') | 
					
						
							|  |  |  |                 video_url = vid.group('videoURL') | 
					
						
							|  |  |  |                 video_thumb = thumb.group('thumbnail') | 
					
						
							|  |  |  |                 if not video_url: | 
					
						
							|  |  |  |                     raise ExtractorError('Cannot find video url for %s' % video_id) | 
					
						
							|  |  |  |                 videos.append({ | 
					
						
							|  |  |  |                     'id': video_id, | 
					
						
							|  |  |  |                     'url': video_url, | 
					
						
							|  |  |  |                     'ext': 'flv', | 
					
						
							|  |  |  |                     'title': unescapeHTML(title), | 
					
						
							|  |  |  |                     'thumbnail': video_thumb | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |         if not videos: | 
					
						
							|  |  |  |             raise ExtractorError('Could not find any videos') | 
					
						
							| 
									
										
										
										
											2013-06-23 22:02:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-21 02:34:34 +02:00
										 |  |  |         return self.playlist_result(videos, playlist_id, playlist_title) |