2 from __future__ 
import unicode_literals
 
   6 from .common 
import InfoExtractor
 
  10     compat_urllib_parse_urlparse
, 
  20 class SixPlayIE(InfoExtractor
): 
  22     _VALID_URL 
= r
'(?:6play:|https?://(?:www\.)?(?P<domain>6play\.fr|rtlplay\.be|play\.rtl\.hr)/.+?-c_)(?P<id>[0-9]+)' 
  24         'url': 'https://www.6play.fr/minute-par-minute-p_9533/le-but-qui-a-marque-lhistoire-du-football-francais-c_12041051', 
  25         'md5': '31fcd112637baa0c2ab92c4fcd8baf27', 
  29             'title': 'Le but qui a marqué l\'histoire du football français !', 
  30             'description': 'md5:b59e7e841d646ef1eb42a7868eb6a851', 
  33         'url': 'https://www.rtlplay.be/rtl-info-13h-p_8551/les-titres-du-rtlinfo-13h-c_12045869', 
  34         'only_matching': True, 
  36         'url': 'https://play.rtl.hr/pj-masks-p_9455/epizoda-34-sezona-1-catboyevo-cudo-na-dva-kotaca-c_11984989', 
  37         'only_matching': True, 
  40     def _real_extract(self
, url
): 
  41         domain
, video_id 
= re
.search(self
._VALID
_URL
, url
).groups() 
  42         service
, consumer_name 
= { 
  43             '6play.fr': ('6play', 'm6web'), 
  44             'rtlplay.be': ('rtlbe_rtl_play', 'rtlbe'), 
  45             'play.rtl.hr': ('rtlhr_rtl_play', 'rtlhr'), 
  46         }.get(domain
, ('6play', 'm6web')) 
  48         data 
= self
._download
_json
( 
  49             'https://pc.middleware.6play.fr/6play/v2/platforms/m6group_web/services/%s/videos/clip_%s' % (service
, video_id
), 
  51                 'x-customer-name': consumer_name
 
  57         clip_data 
= data
['clips'][0] 
  58         title 
= clip_data
['title'] 
  61         quality_key 
= qualities(['lq', 'sd', 'hq', 'hd']) 
  64         for asset 
in clip_data
['assets']: 
  65             asset_url 
= asset
.get('full_physical_path') 
  66             protocol 
= asset
.get('protocol') 
  67             if not asset_url 
or protocol 
== 'primetime' or asset
.get('type') == 'usp_hlsfp_h264' or asset_url 
in urls
: 
  69             urls
.append(asset_url
) 
  70             container 
= asset
.get('video_container') 
  71             ext 
= determine_ext(asset_url
) 
  72             if protocol 
== 'http_subtitle' or ext 
== 'vtt': 
  73                 subtitles
.setdefault('fr', []).append({'url': asset_url
}) 
  75             if container 
== 'm3u8' or ext 
== 'm3u8': 
  77                     if compat_parse_qs(compat_urllib_parse_urlparse(asset_url
).query
).get('token', [None])[0]: 
  78                         urlh 
= self
._request
_webpage
( 
  79                             asset_url
, video_id
, fatal
=False, 
  80                             headers
=self
.geo_verification_headers()) 
  83                         asset_url 
= urlh
.geturl() 
  84                     for i 
in range(3, 0, -1): 
  85                         asset_url 
= asset_url 
= asset_url
.replace('_sd1/', '_sd%d/' % i
) 
  86                         m3u8_formats 
= self
._extract
_m
3u8_formats
( 
  87                             asset_url
, video_id
, 'mp4', 'm3u8_native', 
  88                             m3u8_id
='hls', fatal
=False) 
  89                         formats
.extend(m3u8_formats
) 
  90                         formats
.extend(self
._extract
_mpd
_formats
( 
  91                             asset_url
.replace('.m3u8', '.mpd'), 
  92                             video_id
, mpd_id
='dash', fatal
=False)) 
  96                     formats
.extend(self
._extract
_m
3u8_formats
( 
  97                         asset_url
, video_id
, 'mp4', 'm3u8_native', 
  98                         m3u8_id
='hls', fatal
=False)) 
  99             elif container 
== 'mp4' or ext 
== 'mp4': 
 100                 quality 
= asset
.get('video_quality') 
 103                     'format_id': quality
, 
 104                     'quality': quality_key(quality
), 
 107         self
._sort
_formats
(formats
) 
 110             for src 
in (data
, clip_data
): 
 111                 v 
= try_get(src
, getter
, compat_str
) 
 118             'description': get(lambda x
: x
['description']), 
 119             'duration': int_or_none(clip_data
.get('duration')), 
 120             'series': get(lambda x
: x
['program']['title']), 
 122             'subtitles': subtitles
,