From e7cc02b14d8d323f805d14325a9c95593a170d28 Mon Sep 17 00:00:00 2001 From: Roman Date: Sat, 25 Jan 2025 21:10:44 +0400 Subject: [PATCH] [ie/GoodGame] Fix extractor (#12173) Authored by: NecroRomnt --- yt_dlp/extractor/goodgame.py | 58 ++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/yt_dlp/extractor/goodgame.py b/yt_dlp/extractor/goodgame.py index c17ad56f46..6f61f18fd4 100644 --- a/yt_dlp/extractor/goodgame.py +++ b/yt_dlp/extractor/goodgame.py @@ -1,40 +1,48 @@ from .common import InfoExtractor from ..utils import ( - clean_html, int_or_none, str_or_none, traverse_obj, + url_or_none, ) class GoodGameIE(InfoExtractor): IE_NAME = 'goodgame:stream' - _VALID_URL = r'https?://goodgame\.ru/channel/(?P\w+)' + _VALID_URL = r'https?://goodgame\.ru/(?!channel/)(?P[\w.*-]+)' _TESTS = [{ - 'url': 'https://goodgame.ru/channel/Pomi/#autoplay', + 'url': 'https://goodgame.ru/TGW#autoplay', 'info_dict': { - 'id': 'pomi', + 'id': '7998', 'ext': 'mp4', - 'title': r're:Reynor vs Special \(1/2,bo3\) Wardi Spring EU \- playoff \(финальный день\) \d{4}-\d{2}-\d{2} \d{2}:\d{2}$', - 'channel_id': '1644', - 'channel': 'Pomi', - 'channel_url': 'https://goodgame.ru/channel/Pomi/', - 'description': 'md5:4a87b775ee7b2b57bdccebe285bbe171', - 'thumbnail': r're:^https?://.*\.jpg$', + 'channel_id': '7998', + 'title': r're:шоуматч Happy \(NE\) vs Fortitude \(UD\), потом ладдер и дс \d{4}-\d{2}-\d{2} \d{2}:\d{2}$', + 'channel_url': 'https://goodgame.ru/TGW', + 'thumbnail': 'https://hls.goodgame.ru/previews/7998_240.jpg', + 'uploader': 'TGW', + 'channel': 'JosephStalin', 'live_status': 'is_live', - 'view_count': int, + 'age_limit': 18, + 'channel_follower_count': int, + 'uploader_id': '2899', + 'concurrent_view_count': int, }, 'params': {'skip_download': 'm3u8'}, - 'skip': 'May not be online', + }, { + 'url': 'https://goodgame.ru/Mr.Gray', + 'only_matching': True, + }, { + 'url': 'https://goodgame.ru/HeDoPa3yMeHue*', + 'only_matching': True, }] def _real_extract(self, url): channel_name = self._match_id(url) - response = self._download_json(f'https://api2.goodgame.ru/v2/streams/{channel_name}', channel_name) - player_id = response['channel']['gg_player_src'] + response = self._download_json(f'https://goodgame.ru/api/4/users/{channel_name}/stream', channel_name) + player_id = response['streamkey'] formats, subtitles = [], {} - if response.get('status') == 'Live': + if response.get('status'): formats, subtitles = self._extract_m3u8_formats_and_subtitles( f'https://hls.goodgame.ru/manifest/{player_id}_master.m3u8', channel_name, 'mp4', live=True) @@ -45,13 +53,17 @@ def _real_extract(self, url): 'id': player_id, 'formats': formats, 'subtitles': subtitles, - 'title': traverse_obj(response, ('channel', 'title')), - 'channel': channel_name, - 'channel_id': str_or_none(traverse_obj(response, ('channel', 'id'))), - 'channel_url': response.get('url'), - 'description': clean_html(traverse_obj(response, ('channel', 'description'))), - 'thumbnail': traverse_obj(response, ('channel', 'thumb')), 'is_live': bool(formats), - 'view_count': int_or_none(response.get('viewers')), - 'age_limit': 18 if traverse_obj(response, ('channel', 'adult')) else None, + **traverse_obj(response, { + 'title': ('title', {str}), + 'channel': ('channelkey', {str}), + 'channel_id': ('id', {str_or_none}), + 'channel_url': ('link', {url_or_none}), + 'uploader': ('streamer', 'username', {str}), + 'uploader_id': ('streamer', 'id', {str_or_none}), + 'thumbnail': ('preview', {url_or_none}, {self._proto_relative_url}), + 'concurrent_view_count': ('viewers', {int_or_none}), + 'channel_follower_count': ('followers', {int_or_none}), + 'age_limit': ('adult', {bool}, {lambda x: 18 if x else None}), + }), }