diff --git a/yt_dlp/extractor/opencast.py b/yt_dlp/extractor/opencast.py index a4b0a1989d..5b7710ab97 100644 --- a/yt_dlp/extractor/opencast.py +++ b/yt_dlp/extractor/opencast.py @@ -33,7 +33,8 @@ class OpencastBaseIE(InfoExtractor): vid\.igb\.illinois\.edu| cursosabertos\.c3sl\.ufpr\.br| mcmedia\.missioncollege\.org| - clases\.odon\.edu\.uy + clases\.odon\.edu\.uy| + oc-p\.uni-jena\.de )''' _UUID_RE = r'[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}' @@ -106,7 +107,7 @@ class OpencastBaseIE(InfoExtractor): class OpencastIE(OpencastBaseIE): _VALID_URL = rf'''(?x) - https?://(?P{OpencastBaseIE._INSTANCES_RE})/paella/ui/watch\.html\? + https?://(?P{OpencastBaseIE._INSTANCES_RE})/paella[0-9]*/ui/watch\.html\? (?:[^#]+&)?id=(?P{OpencastBaseIE._UUID_RE})''' _API_BASE = 'https://%s/search/episode.json?id=%s' @@ -131,8 +132,12 @@ class OpencastIE(OpencastBaseIE): def _real_extract(self, url): host, video_id = self._match_valid_url(url).group('host', 'id') - return self._parse_mediapackage( - self._call_api(host, video_id)['search-results']['result']['mediapackage']) + response = self._call_api(host, video_id) + package = traverse_obj(response, ( + ('search-results', 'result'), + ('result', ...), # Path needed for oc-p.uni-jena.de + 'mediapackage', {dict}, any)) or {} + return self._parse_mediapackage(package) class OpencastPlaylistIE(OpencastBaseIE):