From 89eac10fa841029e9da654f95c7be0b836360020 Mon Sep 17 00:00:00 2001 From: Nikolay Fedorov <40500428+swayll@users.noreply.github.com> Date: Wed, 6 Aug 2025 22:25:54 +0300 Subject: [PATCH] Use traverse_obj for get json info data --- yt_dlp/extractor/smotrim.py | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/yt_dlp/extractor/smotrim.py b/yt_dlp/extractor/smotrim.py index b396f9a6f..77796eb46 100644 --- a/yt_dlp/extractor/smotrim.py +++ b/yt_dlp/extractor/smotrim.py @@ -2,6 +2,7 @@ from .common import InfoExtractor from ..utils import ExtractorError, int_or_none +from ..utils.traversal import traverse_obj class SmotrimIE(InfoExtractor): @@ -126,24 +127,19 @@ def _real_extract(self, url): raise ExtractorError(str(e), expected=True) if json_info.get('status') != 200: raise ExtractorError('Json download error. Status code: %s' % str(json_info.get('status')), expected=True) - try: - media_info = json_info.get('data').get('playlist').get('medialist')[0] - except (KeyError, AttributeError, TypeError) as e: - raise ExtractorError('media_info get error: %s' % str(e), expected=True) - try: - formats, subtitles = self._extract_m3u8_formats_and_subtitles( - media_info.get('sources').get('m3u8').get('auto'), video_id, 'mp4', m3u8_id='hls', - ) - res = { - 'id': video_id, - 'title': media_info.get('title'), - 'thumbnail': media_info.get('pictures').get('16:9'), - 'formats': formats, - 'subtitles': subtitles, - 'is_live': json_info.get('data').get('playlist').get('type') == 'live', - 'duration': int_or_none(media_info.get('duration')), - } - except (KeyError, AttributeError, TypeError) as e: - raise ExtractorError('Result error: %s' % str(e), expected=True) + media_info = traverse_obj(json_info, ('data', 'playlist', 'medialist', 0)) + if not media_info: + raise ExtractorError('Unable to get media_info', expected=True) + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + traverse_obj(media_info, ('sources', 'm3u8', 'auto')), video_id, 'mp4', m3u8_id='hls', + ) - return res + return { + 'id': video_id, + 'title': traverse_obj(media_info, ('title')), + 'thumbnail': traverse_obj(media_info, ('pictures', '16:9')), + 'formats': formats, + 'subtitles': subtitles, + 'is_live': traverse_obj(json_info, ('data', 'playlist', 'type')) == 'live', + 'duration': int_or_none(traverse_obj(media_info, ('duration'))), + }