diff --git a/yt_dlp/extractor/playsuisse.py b/yt_dlp/extractor/playsuisse.py index 59231d840..c9bc30e75 100644 --- a/yt_dlp/extractor/playsuisse.py +++ b/yt_dlp/extractor/playsuisse.py @@ -120,6 +120,12 @@ class PlaySuisseIE(InfoExtractor): id name description + descriptionLong + year + contentTypes + directors + mainCast + productionCountries duration episodeNumber seasonNumber @@ -215,9 +221,7 @@ def _perform_login(self, username, password): if not self._ID_TOKEN: raise ExtractorError('Login failed') - def _get_media_data(self, media_id): - # NOTE In the web app, the "locale" header is used to switch between languages, - # However this doesn't seem to take effect when passing the header here. + def _get_media_data(self, media_id, locale): response = self._download_json( 'https://www.playsuisse.ch/api/graphql', media_id, data=json.dumps({ @@ -225,8 +229,7 @@ def _get_media_data(self, media_id): 'query': self._GRAPHQL_QUERY, 'variables': {'assetId': media_id}, }).encode(), - headers={'Content-Type': 'application/json', 'locale': 'de'}) - + headers={'Content-Type': 'application/json', 'locale': locale}) return response['data']['assetV2'] def _real_extract(self, url): @@ -234,7 +237,10 @@ def _real_extract(self, url): self.raise_login_required(method='password') media_id = self._match_id(url) - media_data = self._get_media_data(media_id) + query = parse_qs(url) + locale_param = (query.get('locale') or ['de'])[0].lower() + locale = locale_param if locale_param in {'de', 'fr', 'it', 'rm'} else 'de' + media_data = self._get_media_data(media_id, locale) info = self._extract_single(media_data) if media_data.get('episodes'): info.update({ @@ -257,15 +263,20 @@ def _extract_single(self, media_data): self._merge_subtitles(subs, target=subtitles) return { - 'id': media_data['id'], - 'title': media_data.get('name'), - 'description': media_data.get('description'), + 'id': traverse_obj(media_data, 'id'), + 'title': traverse_obj(media_data, 'name'), + 'description': traverse_obj(media_data, 'descriptionLong') or traverse_obj(media_data, 'description'), + 'genres': traverse_obj(media_data, 'contentTypes'), + 'creators': traverse_obj(media_data, 'directors'), + 'cast': traverse_obj(media_data, 'mainCast'), + 'location': traverse_obj(media_data, 'productionCountries'), + 'release_year': int_or_none(traverse_obj(media_data, 'year', lambda _, x: x[:4])), 'thumbnails': thumbnails, - 'duration': int_or_none(media_data.get('duration')), + 'duration': int_or_none(traverse_obj(media_data, 'duration')), 'formats': formats, 'subtitles': subtitles, - 'series': media_data.get('seriesName'), - 'season_number': int_or_none(media_data.get('seasonNumber')), - 'episode': media_data.get('name') if media_data.get('episodeNumber') else None, - 'episode_number': int_or_none(media_data.get('episodeNumber')), + 'series': traverse_obj(media_data, 'seriesName'), + 'season_number': int_or_none(traverse_obj(media_data, 'seasonNumber')), + 'episode': traverse_obj(media_data, 'name') if traverse_obj(media_data, 'episodeNumber') else None, + 'episode_number': int_or_none(traverse_obj(media_data, 'episodeNumber')), }