2 from __future__
import unicode_literals
6 from .common
import InfoExtractor
7 from ..compat
import compat_HTTPError
16 class ImgGamingBaseIE(InfoExtractor
):
17 _API_BASE
= 'https://dce-frontoffice.imggaming.com/api/v2/'
18 _API_KEY
= '857a1e5d-e35e-4fdf-805b-a87b6f8364bf'
20 _MANIFEST_HEADERS
= {'Accept-Encoding': 'identity'}
22 _VALID_URL_TEMPL
= r
'https?://(?P<domain>%s)/(?P<type>live|playlist|video)/(?P<id>\d+)(?:\?.*?\bplaylistId=(?P<playlist_id>\d+))?'
24 def _initialize_pre_login(self
):
26 'Realm': 'dce.' + self
._REALM
,
27 'x-api-key': self
._API
_KEY
,
30 def _perform_login(self
, username
, password
):
31 p_headers
= self
._HEADERS
.copy()
32 p_headers
['Content-Type'] = 'application/json'
33 self
._HEADERS
['Authorization'] = 'Bearer ' + self
._download
_json
(
34 self
._API
_BASE
+ 'login',
35 None, 'Logging in', data
=json
.dumps({
38 }).encode(), headers
=p_headers
)['authorisationToken']
40 def _real_initialize(self
):
41 if not self
._HEADERS
.get('Authorization'):
42 self
.raise_login_required(method
='password')
44 def _call_api(self
, path
, media_id
):
45 return self
._download
_json
(
46 self
._API
_BASE
+ path
+ media_id
, media_id
, headers
=self
._HEADERS
)
48 def _extract_dve_api_url(self
, media_id
, media_type
):
49 stream_path
= 'stream'
50 if media_type
== 'video':
51 stream_path
+= '/vod/'
53 stream_path
+= '?eventId='
55 return self
._call
_api
(
56 stream_path
, media_id
)['playerUrlCallback']
57 except ExtractorError
as e
:
58 if isinstance(e
.cause
, compat_HTTPError
) and e
.cause
.code
== 403:
60 self
._parse
_json
(e
.cause
.read().decode(), media_id
)['messages'][0],
64 def _real_extract(self
, url
):
65 domain
, media_type
, media_id
, playlist_id
= self
._match
_valid
_url
(url
).groups()
68 if self
._yes
_playlist
(playlist_id
, media_id
):
69 media_type
, media_id
= 'playlist', playlist_id
71 if media_type
== 'playlist':
72 playlist
= self
._call
_api
('vod/playlist/', media_id
)
74 for video
in try_get(playlist
, lambda x
: x
['videos']['vods']) or []:
75 video_id
= str_or_none(video
.get('id'))
78 entries
.append(self
.url_result(
79 'https://%s/video/%s' % (domain
, video_id
),
80 self
.ie_key(), video_id
))
81 return self
.playlist_result(
82 entries
, media_id
, playlist
.get('title'),
83 playlist
.get('description'))
85 dve_api_url
= self
._extract
_dve
_api
_url
(media_id
, media_type
)
86 video_data
= self
._download
_json
(dve_api_url
, media_id
)
87 is_live
= media_type
== 'live'
89 title
= self
._call
_api
('event/', media_id
)['title']
91 title
= video_data
['name']
94 for proto
in ('hls', 'dash'):
95 media_url
= video_data
.get(proto
+ 'Url') or try_get(video_data
, lambda x
: x
[proto
]['url'])
99 m3u8_formats
= self
._extract
_m
3u8_formats
(
100 media_url
, media_id
, 'mp4', live
=is_live
,
101 m3u8_id
='hls', fatal
=False, headers
=self
._MANIFEST
_HEADERS
)
102 for f
in m3u8_formats
:
103 f
.setdefault('http_headers', {}).update(self
._MANIFEST
_HEADERS
)
106 formats
.extend(self
._extract
_mpd
_formats
(
107 media_url
, media_id
, mpd_id
='dash', fatal
=False,
108 headers
=self
._MANIFEST
_HEADERS
))
109 self
._sort
_formats
(formats
)
112 for subtitle
in video_data
.get('subtitles', []):
113 subtitle_url
= subtitle
.get('url')
116 subtitles
.setdefault(subtitle
.get('lang', 'en_US'), []).append({
124 'thumbnail': video_data
.get('thumbnailUrl'),
125 'description': video_data
.get('description'),
126 'duration': int_or_none(video_data
.get('duration')),
127 'tags': video_data
.get('tags'),
129 'subtitles': subtitles
,