1 from .common
import InfoExtractor
2 from ..utils
import traverse_obj
5 class EurosportIE(InfoExtractor
):
6 _VALID_URL
= r
'https?://www\.eurosport\.com/\w+/[\w-]+/\d+/[\w-]+_(?P<id>vid\d+)'
8 'url': 'https://www.eurosport.com/tennis/roland-garros/2022/highlights-rafael-nadal-brushes-aside-caper-ruud-to-win-record-extending-14th-french-open-title_vid1694147/video.shtml',
12 'title': 'Highlights: Rafael Nadal brushes aside Caper Ruud to win record-extending 14th French Open title',
13 'description': 'md5:b564db73ecfe4b14ebbd8e62a3692c76',
14 'thumbnail': 'https://imgresizer.eurosport.com/unsafe/1280x960/smart/filters:format(jpeg)/origin-imgresizer.eurosport.com/2022/06/05/3388285-69245968-2560-1440.png',
16 'display_id': 'vid1694147',
17 'timestamp': 1654446698,
18 'upload_date': '20220605',
21 'url': 'https://www.eurosport.com/tennis/roland-garros/2022/watch-the-top-five-shots-from-men-s-final-as-rafael-nadal-beats-casper-ruud-to-seal-14th-french-open_vid1694283/video.shtml',
25 'title': 'md5:149dcc5dfb38ab7352acc008cc9fb071',
27 'thumbnail': 'https://imgresizer.eurosport.com/unsafe/1280x960/smart/filters:format(jpeg)/origin-imgresizer.eurosport.com/2022/06/05/3388422-69248708-2560-1440.png',
28 'description': 'md5:a0c8a7f6b285e48ae8ddbe7aa85cfee6',
29 'display_id': 'vid1694283',
30 'timestamp': 1654456090,
31 'upload_date': '20220605',
34 # geo-fence but can bypassed by xff
35 'url': 'https://www.eurosport.com/cycling/tour-de-france-femmes/2022/incredible-ride-marlen-reusser-storms-to-stage-4-win-at-tour-de-france-femmes_vid1722221/video.shtml',
39 'title': '‘Incredible ride!’ - Marlen Reusser storms to Stage 4 win at Tour de France Femmes',
41 'display_id': 'vid1722221',
42 'timestamp': 1658936167,
43 'thumbnail': 'https://imgresizer.eurosport.com/unsafe/1280x960/smart/filters:format(jpeg)/origin-imgresizer.eurosport.com/2022/07/27/3423347-69852108-2560-1440.jpg',
44 'description': 'md5:32bbe3a773ac132c57fb1e8cca4b7c71',
45 'upload_date': '20220727',
51 # actually defined in https://netsport.eurosport.io/?variables={"databaseId":<databaseId>,"playoutType":"VDP"}&extensions={"persistedQuery":{"version":1 ..
52 # but this method require to get sha256 hash
53 _GEO_COUNTRIES
= ['DE', 'NL', 'EU', 'IT', 'FR'] # Not complete list but it should work
55 def _real_initialize(self
):
56 if EurosportIE
._TOKEN
is None:
57 EurosportIE
._TOKEN
= self
._download
_json
(
58 'https://eu3-prod-direct.eurosport.com/token?realm=eurosport', None,
59 'Trying to get token')['data']['attributes']['token']
61 def _real_extract(self
, url
):
62 display_id
= self
._match
_id
(url
)
63 webpage
= self
._download
_webpage
(url
, display_id
)
65 json_data
= self
._download
_json
(
66 f
'https://eu3-prod-direct.eurosport.com/playback/v2/videoPlaybackInfo/sourceSystemId/eurosport-{display_id}',
67 display_id
, query
={'usePreAuth': True}
, headers
={'Authorization': f'Bearer {EurosportIE._TOKEN}
'})['data
']
69 json_ld_data = self._search_json_ld(webpage, display_id)
71 formats, subtitles = [], {}
72 for stream_type in json_data['attributes
']['streaming
']:
73 if stream_type == 'hls
':
74 fmts, subs = self._extract_m3u8_formats_and_subtitles(
75 traverse_obj(json_data, ('attributes
', 'streaming
', stream_type, 'url
')), display_id, ext='mp4
')
76 elif stream_type == 'dash
':
77 fmts, subs = self._extract_mpd_formats_and_subtitles(
78 traverse_obj(json_data, ('attributes
', 'streaming
', stream_type, 'url
')), display_id)
79 elif stream_type == 'mss
':
80 fmts, subs = self._extract_ism_formats_and_subtitles(
81 traverse_obj(json_data, ('attributes
', 'streaming
', stream_type, 'url
')), display_id)
84 self._merge_subtitles(subs, target=subtitles)
86 self._sort_formats(formats)
89 'id': json_data['id'],
90 'title
': json_ld_data.get('title
') or self._og_search_title(webpage),
91 'display_id
': display_id,
93 'subtitles
': subtitles,
94 'thumbnails
': json_ld_data.get('thumbnails
'),
95 'description
': (json_ld_data.get('description
')
96 or self._html_search_meta(['og
:description
', 'description
'], webpage)),
97 'duration
': json_ld_data.get('duration
'),
98 'timestamp
': json_ld_data.get('timestamp
'),