aboutsummaryrefslogtreecommitdiffstats
path: root/hypervideo_dl/extractor/europa.py
diff options
context:
space:
mode:
Diffstat (limited to 'hypervideo_dl/extractor/europa.py')
-rw-r--r--hypervideo_dl/extractor/europa.py84
1 files changed, 84 insertions, 0 deletions
diff --git a/hypervideo_dl/extractor/europa.py b/hypervideo_dl/extractor/europa.py
index c2b4937..f3da95f 100644
--- a/hypervideo_dl/extractor/europa.py
+++ b/hypervideo_dl/extractor/europa.py
@@ -3,8 +3,10 @@ from ..utils import (
int_or_none,
orderedSet,
parse_duration,
+ parse_iso8601,
parse_qs,
qualities,
+ traverse_obj,
unified_strdate,
xpath_text
)
@@ -87,3 +89,85 @@ class EuropaIE(InfoExtractor):
'view_count': view_count,
'formats': formats
}
+
+
+class EuroParlWebstreamIE(InfoExtractor):
+ _VALID_URL = r'''(?x)
+ https?://multimedia\.europarl\.europa\.eu/[^/#?]+/
+ (?:(?!video)[^/#?]+/[\w-]+_)(?P<id>[\w-]+)
+ '''
+ _TESTS = [{
+ 'url': 'https://multimedia.europarl.europa.eu/pl/webstreaming/plenary-session_20220914-0900-PLENARY',
+ 'info_dict': {
+ 'id': '62388b15-d85b-4add-99aa-ba12ccf64f0d',
+ 'ext': 'mp4',
+ 'title': 'Plenary session',
+ 'release_timestamp': 1663139069,
+ 'release_date': '20220914',
+ },
+ 'params': {
+ 'skip_download': True,
+ }
+ }, {
+ # live webstream
+ 'url': 'https://multimedia.europarl.europa.eu/en/webstreaming/euroscola_20221115-1000-SPECIAL-EUROSCOLA',
+ 'info_dict': {
+ 'ext': 'mp4',
+ 'id': '510eda7f-ba72-161b-7ee7-0e836cd2e715',
+ 'release_timestamp': 1668502800,
+ 'title': 'Euroscola 2022-11-15 19:21',
+ 'release_date': '20221115',
+ 'live_status': 'is_live',
+ },
+ 'skip': 'not live anymore'
+ }, {
+ 'url': 'https://multimedia.europarl.europa.eu/en/webstreaming/committee-on-culture-and-education_20230301-1130-COMMITTEE-CULT',
+ 'info_dict': {
+ 'id': '7355662c-8eac-445e-4bb9-08db14b0ddd7',
+ 'ext': 'mp4',
+ 'release_date': '20230301',
+ 'title': 'Committee on Culture and Education',
+ 'release_timestamp': 1677666641,
+ }
+ }, {
+ # live stream
+ 'url': 'https://multimedia.europarl.europa.eu/en/webstreaming/committee-on-environment-public-health-and-food-safety_20230524-0900-COMMITTEE-ENVI',
+ 'info_dict': {
+ 'id': 'e4255f56-10aa-4b3c-6530-08db56d5b0d9',
+ 'ext': 'mp4',
+ 'release_date': '20230524',
+ 'title': r're:Committee on Environment, Public Health and Food Safety \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}',
+ 'release_timestamp': 1684911541,
+ 'live_status': 'is_live',
+ },
+ 'skip': 'Not live anymore'
+ }]
+
+ def _real_extract(self, url):
+ display_id = self._match_id(url)
+ webpage = self._download_webpage(url, display_id)
+
+ webpage_nextjs = self._search_nextjs_data(webpage, display_id)['props']['pageProps']
+
+ json_info = self._download_json(
+ 'https://acs-api.europarl.connectedviews.eu/api/FullMeeting', display_id,
+ query={
+ 'api-version': 1.0,
+ 'tenantId': 'bae646ca-1fc8-4363-80ba-2c04f06b4968',
+ 'externalReference': display_id
+ })
+
+ formats, subtitles = [], {}
+ for hls_url in traverse_obj(json_info, ((('meetingVideo'), ('meetingVideos', ...)), 'hlsUrl')):
+ fmt, subs = self._extract_m3u8_formats_and_subtitles(hls_url, display_id)
+ formats.extend(fmt)
+ self._merge_subtitles(subs, target=subtitles)
+
+ return {
+ 'id': json_info['id'],
+ 'title': traverse_obj(webpage_nextjs, (('mediaItem', 'title'), ('title', )), get_all=False),
+ 'formats': formats,
+ 'subtitles': subtitles,
+ 'release_timestamp': parse_iso8601(json_info.get('startDateTime')),
+ 'is_live': traverse_obj(webpage_nextjs, ('mediaItem', 'mediaSubType')) == 'Live'
+ }