diff --git a/yt_dlp/extractor/_extractors.py b/yt_dlp/extractor/_extractors.py index fbbd9571f..8be2ef5b5 100644 --- a/yt_dlp/extractor/_extractors.py +++ b/yt_dlp/extractor/_extractors.py @@ -2326,6 +2326,7 @@ BTVestlendingenIE, ) from .vh1 import VH1IE +from .viacomcbs import ViacomcbsIE from .vice import ( ViceArticleIE, ViceIE, diff --git a/yt_dlp/extractor/southpark.py b/yt_dlp/extractor/southpark.py index 3d661a86a..30483180b 100644 --- a/yt_dlp/extractor/southpark.py +++ b/yt_dlp/extractor/southpark.py @@ -1,4 +1,5 @@ from .mtv import MTVServicesInfoExtractor +from .viacomcbs import ViacomcbsIE class SouthParkIE(MTVServicesInfoExtractor): @@ -50,7 +51,7 @@ class SouthParkEsIE(SouthParkIE): # XXX: Do not subclass from concrete IE }] -class SouthParkDeIE(SouthParkIE): # XXX: Do not subclass from concrete IE +class SouthParkDeIE(ViacomcbsIE): IE_NAME = 'southpark.de' _VALID_URL = r'https?://(?:www\.)?(?Psouthpark\.de/(?:(en/(videoclip|collections|episodes|video-clips))|(videoclip|collections|folgen))/(?P(?P.+?)/.+?)(?:\?|#|$))' _TESTS = [{ diff --git a/yt_dlp/extractor/viacomcbs.py b/yt_dlp/extractor/viacomcbs.py new file mode 100644 index 000000000..9c0afe7c2 --- /dev/null +++ b/yt_dlp/extractor/viacomcbs.py @@ -0,0 +1,28 @@ +from yt_dlp.utils.traversal import traverse_obj + +from .common import InfoExtractor + + +class ViacomcbsIE(InfoExtractor): + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + mgid = self._html_search_regex(r'\"videoServiceUrl\":.*(mgid[\w:\.\-]+).*mica.*json', webpage, 'mgid') + title = self._html_search_regex(r'\"shortTitle\":\"([\w\s]+)\"', webpage, 'title') + + formats, subtitles = self._extract_m3u8_formats_and_subtitles(self._get_video_url(mgid, video_id), video_id) + + return { + 'id': video_id, + 'title': title, + 'description': self._og_search_description(webpage), + 'formats': formats, + 'subtitles': subtitles, + } + + def _get_video_url(self, mgid, video_id): + config = self._download_json( + f'https://topaz.viacomcbs.digital/topaz/api/{mgid}/mica.json?clientPlatform=desktop', video_id) + return traverse_obj(config, ('stitchedstream', 'source'))