mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 14:45:14 +00:00 
			
		
		
		
	| @@ -7,14 +7,13 @@ from ..utils import ( | |||||||
|     extract_attributes, |     extract_attributes, | ||||||
|     ExtractorError, |     ExtractorError, | ||||||
|     get_element_by_class, |     get_element_by_class, | ||||||
|     js_to_json, |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  |  | ||||||
| class SteamIE(InfoExtractor): | class SteamIE(InfoExtractor): | ||||||
|     _VALID_URL = r"""(?x) |     _VALID_URL = r"""(?x) | ||||||
|         https?://store\.steampowered\.com/ |         https?://(?:store\.steampowered|steamcommunity)\.com/ | ||||||
|             (agecheck/)? |             (?:agecheck/)? | ||||||
|             (?P<urltype>video|app)/ #If the page is only for videos or for a game |             (?P<urltype>video|app)/ #If the page is only for videos or for a game | ||||||
|             (?P<gameID>\d+)/? |             (?P<gameID>\d+)/? | ||||||
|             (?P<videoID>\d*)(?P<extra>\??) # For urltype == video we sometimes get the videoID |             (?P<videoID>\d*)(?P<extra>\??) # For urltype == video we sometimes get the videoID | ||||||
| @@ -26,22 +25,25 @@ class SteamIE(InfoExtractor): | |||||||
|     _TESTS = [{ |     _TESTS = [{ | ||||||
|         'url': 'http://store.steampowered.com/video/105600/', |         'url': 'http://store.steampowered.com/video/105600/', | ||||||
|         'playlist': [ |         'playlist': [ | ||||||
|  |             { | ||||||
|  |                 'md5': '695242613303ffa2a4c44c9374ddc067', | ||||||
|  |                 'info_dict': { | ||||||
|  |                     'id': '256785003', | ||||||
|  |                     'ext': 'mp4', | ||||||
|  |                     'title': 'Terraria video 256785003', | ||||||
|  |                     'thumbnail': r're:^https://cdn\.[^\.]+\.steamstatic\.com', | ||||||
|  |                     'n_entries': 2, | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|             { |             { | ||||||
|                 'md5': '6a294ee0c4b1f47f5bb76a65e31e3592', |                 'md5': '6a294ee0c4b1f47f5bb76a65e31e3592', | ||||||
|                 'info_dict': { |                 'info_dict': { | ||||||
|                     'id': '2040428', |                     'id': '2040428', | ||||||
|                     'ext': 'mp4', |                     'ext': 'mp4', | ||||||
|                     'title': 'Terraria 1.3 Trailer', |                     'title': 'Terraria video 2040428', | ||||||
|                     'playlist_index': 1, |  | ||||||
|                 } |  | ||||||
|             }, |  | ||||||
|             { |  | ||||||
|                 'md5': '911672b20064ca3263fa89650ba5a7aa', |  | ||||||
|                 'info_dict': { |  | ||||||
|                     'id': '2029566', |  | ||||||
|                     'ext': 'mp4', |  | ||||||
|                     'title': 'Terraria 1.2 Trailer', |  | ||||||
|                     'playlist_index': 2, |                     'playlist_index': 2, | ||||||
|  |                     'thumbnail': r're:^https://cdn\.[^\.]+\.steamstatic\.com', | ||||||
|  |                     'n_entries': 2, | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         ], |         ], | ||||||
| @@ -53,96 +55,76 @@ class SteamIE(InfoExtractor): | |||||||
|             'playlistend': 2, |             'playlistend': 2, | ||||||
|         } |         } | ||||||
|     }, { |     }, { | ||||||
|         'url': 'http://steamcommunity.com/sharedfiles/filedetails/?id=242472205', |         'url': 'https://store.steampowered.com/app/271590/Grand_Theft_Auto_V/', | ||||||
|         'info_dict': { |         'info_dict': { | ||||||
|             'id': 'X8kpJBlzD2E', |             'id': '256757115', | ||||||
|  |             'title': 'Grand Theft Auto V video 256757115', | ||||||
|             'ext': 'mp4', |             'ext': 'mp4', | ||||||
|             'upload_date': '20140617', |             'thumbnail': r're:^https://cdn\.[^\.]+\.steamstatic\.com', | ||||||
|             'title': 'FRONTIERS - Trapping', |             'n_entries': 20, | ||||||
|             'description': 'md5:bf6f7f773def614054089e5769c12a6e', |         }, | ||||||
|             'uploader': 'AAD Productions', |  | ||||||
|             'uploader_id': 'AtomicAgeDogGames', |  | ||||||
|         } |  | ||||||
|     }] |     }] | ||||||
|  |  | ||||||
|     def _real_extract(self, url): |     def _real_extract(self, url): | ||||||
|         m = self._match_valid_url(url) |         m = self._match_valid_url(url) | ||||||
|         fileID = m.group('fileID') |         fileID = m.group('fileID') | ||||||
|         if fileID: |         if fileID: | ||||||
|             videourl = url |             video_url = url | ||||||
|             playlist_id = fileID |             playlist_id = fileID | ||||||
|         else: |         else: | ||||||
|             gameID = m.group('gameID') |             gameID = m.group('gameID') | ||||||
|             playlist_id = gameID |             playlist_id = gameID | ||||||
|             videourl = self._VIDEO_PAGE_TEMPLATE % playlist_id |             video_url = self._VIDEO_PAGE_TEMPLATE % playlist_id | ||||||
|  |  | ||||||
|         self._set_cookie('steampowered.com', 'mature_content', '1') |         self._set_cookie('steampowered.com', 'wants_mature_content', '1') | ||||||
|  |         self._set_cookie('steampowered.com', 'birthtime', '944006401') | ||||||
|  |         self._set_cookie('steampowered.com', 'lastagecheckage', '1-0-2000') | ||||||
|  |  | ||||||
|         webpage = self._download_webpage(videourl, playlist_id) |         webpage = self._download_webpage(video_url, playlist_id) | ||||||
|  |  | ||||||
|         if re.search('<h2>Please enter your birth date to continue:</h2>', webpage) is not None: |         if re.search('<div[^>]+>Please enter your birth date to continue:</div>', webpage) is not None: | ||||||
|             videourl = self._AGECHECK_TEMPLATE % playlist_id |             video_url = self._AGECHECK_TEMPLATE % playlist_id | ||||||
|             self.report_age_confirmation() |             self.report_age_confirmation() | ||||||
|             webpage = self._download_webpage(videourl, playlist_id) |             webpage = self._download_webpage(video_url, playlist_id) | ||||||
|  |  | ||||||
|         flash_vars = self._parse_json(self._search_regex( |         videos = re.findall(r'(<div[^>]+id=[\'"]highlight_movie_(\d+)[\'"][^>]+>)', webpage) | ||||||
|             r'(?s)rgMovieFlashvars\s*=\s*({.+?});', webpage, |  | ||||||
|             'flash vars'), playlist_id, js_to_json) |  | ||||||
|  |  | ||||||
|         playlist_title = None |  | ||||||
|         entries = [] |         entries = [] | ||||||
|         if fileID: |         playlist_title = get_element_by_class('apphub_AppName', webpage) | ||||||
|             playlist_title = get_element_by_class('workshopItemTitle', webpage) |         for movie, movie_id in videos: | ||||||
|             for movie in flash_vars.values(): |             if not movie: | ||||||
|                 if not movie: |                 continue | ||||||
|                     continue |             movie = extract_attributes(movie) | ||||||
|                 youtube_id = movie.get('YOUTUBE_VIDEO_ID') |             if not movie_id: | ||||||
|                 if not youtube_id: |                 continue | ||||||
|                     continue |             entry = { | ||||||
|  |                 'id': movie_id, | ||||||
|  |                 'title': f'{playlist_title} video {movie_id}', | ||||||
|  |             } | ||||||
|  |             formats = [] | ||||||
|  |             if movie: | ||||||
|  |                 entry['thumbnail'] = movie.get('data-poster') | ||||||
|  |                 for quality in ('', '-hd'): | ||||||
|  |                     for ext in ('webm', 'mp4'): | ||||||
|  |                         video_url = movie.get('data-%s%s-source' % (ext, quality)) | ||||||
|  |                         if video_url: | ||||||
|  |                             formats.append({ | ||||||
|  |                                 'format_id': ext + quality, | ||||||
|  |                                 'url': video_url, | ||||||
|  |                             }) | ||||||
|  |             self._sort_formats(formats) | ||||||
|  |             entry['formats'] = formats | ||||||
|  |             entries.append(entry) | ||||||
|  |         embedded_videos = re.findall(r'(<iframe[^>]+>)', webpage) | ||||||
|  |         for evideos in embedded_videos: | ||||||
|  |             evideos = extract_attributes(evideos).get('src') | ||||||
|  |             video_id = self._search_regex(r'youtube\.com/embed/([0-9A-Za-z_-]{11})', evideos, 'youtube_video_id', default=None) | ||||||
|  |             if video_id: | ||||||
|                 entries.append({ |                 entries.append({ | ||||||
|                     '_type': 'url', |                     '_type': 'url_transparent', | ||||||
|                     'url': youtube_id, |                     'id': video_id, | ||||||
|  |                     'url': video_id, | ||||||
|                     'ie_key': 'Youtube', |                     'ie_key': 'Youtube', | ||||||
|                 }) |                 }) | ||||||
|         else: |  | ||||||
|             playlist_title = get_element_by_class('apphub_AppName', webpage) |  | ||||||
|             for movie_id, movie in flash_vars.items(): |  | ||||||
|                 if not movie: |  | ||||||
|                     continue |  | ||||||
|                 video_id = self._search_regex(r'movie_(\d+)', movie_id, 'video id', fatal=False) |  | ||||||
|                 title = movie.get('MOVIE_NAME') |  | ||||||
|                 if not title or not video_id: |  | ||||||
|                     continue |  | ||||||
|                 entry = { |  | ||||||
|                     'id': video_id, |  | ||||||
|                     'title': title.replace('+', ' '), |  | ||||||
|                 } |  | ||||||
|                 formats = [] |  | ||||||
|                 flv_url = movie.get('FILENAME') |  | ||||||
|                 if flv_url: |  | ||||||
|                     formats.append({ |  | ||||||
|                         'format_id': 'flv', |  | ||||||
|                         'url': flv_url, |  | ||||||
|                     }) |  | ||||||
|                 highlight_element = self._search_regex( |  | ||||||
|                     r'(<div[^>]+id="highlight_movie_%s"[^>]+>)' % video_id, |  | ||||||
|                     webpage, 'highlight element', fatal=False) |  | ||||||
|                 if highlight_element: |  | ||||||
|                     highlight_attribs = extract_attributes(highlight_element) |  | ||||||
|                     if highlight_attribs: |  | ||||||
|                         entry['thumbnail'] = highlight_attribs.get('data-poster') |  | ||||||
|                         for quality in ('', '-hd'): |  | ||||||
|                             for ext in ('webm', 'mp4'): |  | ||||||
|                                 video_url = highlight_attribs.get('data-%s%s-source' % (ext, quality)) |  | ||||||
|                                 if video_url: |  | ||||||
|                                     formats.append({ |  | ||||||
|                                         'format_id': ext + quality, |  | ||||||
|                                         'url': video_url, |  | ||||||
|                                     }) |  | ||||||
|                 if not formats and not self.get_param('ignore_no_formats'): |  | ||||||
|                     continue |  | ||||||
|                 entry['formats'] = formats |  | ||||||
|                 entries.append(entry) |  | ||||||
|         if not entries: |         if not entries: | ||||||
|             raise ExtractorError('Could not find any videos') |             raise ExtractorError('Could not find any videos') | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 u-spec-png
					u-spec-png