]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/atresplayer.py
   2 from __future__ 
import unicode_literals
 
   6 from .common 
import InfoExtractor
 
   7 from ..compat 
import compat_HTTPError
 
  15 class AtresPlayerIE(InfoExtractor
): 
  16     _VALID_URL 
= r
'https?://(?:www\.)?atresplayer\.com/[^/]+/[^/]+/[^/]+/[^/]+/(?P<display_id>.+?)_(?P<id>[0-9a-f]{24})' 
  17     _NETRC_MACHINE 
= 'atresplayer' 
  20             'url': 'https://www.atresplayer.com/antena3/series/pequenas-coincidencias/temporada-1/capitulo-7-asuntos-pendientes_5d4aa2c57ed1a88fc715a615/', 
  22                 'id': '5d4aa2c57ed1a88fc715a615', 
  24                 'title': 'Capítulo 7: Asuntos pendientes', 
  25                 'description': 'md5:7634cdcb4d50d5381bedf93efb537fbc', 
  29                 'format': 'bestvideo', 
  31             'skip': 'This video is only available for registered users' 
  34             'url': 'https://www.atresplayer.com/lasexta/programas/el-club-de-la-comedia/temporada-4/capitulo-10-especial-solidario-nochebuena_5ad08edf986b2855ed47adc4/', 
  35             'only_matching': True, 
  38             'url': 'https://www.atresplayer.com/antena3/series/el-secreto-de-puente-viejo/el-chico-de-los-tres-lunares/capitulo-977-29-12-14_5ad51046986b2886722ccdea/', 
  39             'only_matching': True, 
  42     _API_BASE 
= 'https://api.atresplayer.com/' 
  44     def _real_initialize(self
): 
  47     def _handle_error(self
, e
, code
): 
  48         if isinstance(e
.cause
, compat_HTTPError
) and e
.cause
.code 
== code
: 
  49             error 
= self
._parse
_json
(e
.cause
.read(), None) 
  50             if error
.get('error') == 'required_registered': 
  51                 self
.raise_login_required() 
  52             raise ExtractorError(error
['error_description'], expected
=True) 
  56         username
, password 
= self
._get
_login
_info
() 
  60         self
._request
_webpage
( 
  61             self
._API
_BASE 
+ 'login', None, 'Downloading login page') 
  64             target_url 
= self
._download
_json
( 
  65                 'https://account.atresmedia.com/api/login', None, 
  66                 'Logging in', headers
={ 
  67                     'Content-Type': 'application/x-www-form-urlencoded' 
  68                 }, data
=urlencode_postdata({ 
  72         except ExtractorError 
as e
: 
  73             self
._handle
_error
(e
, 400) 
  75         self
._request
_webpage
(target_url
, None, 'Following Target URL') 
  77     def _real_extract(self
, url
): 
  78         display_id
, video_id 
= re
.match(self
._VALID
_URL
, url
).groups() 
  81             episode 
= self
._download
_json
( 
  82                 self
._API
_BASE 
+ 'client/v1/player/episode/' + video_id
, video_id
) 
  83         except ExtractorError 
as e
: 
  84             self
._handle
_error
(e
, 403) 
  86         title 
= episode
['titulo'] 
  89         for source 
in episode
.get('sources', []): 
  90             src 
= source
.get('src') 
  93             src_type 
= source
.get('type') 
  94             if src_type 
== 'application/vnd.apple.mpegurl': 
  95                 formats
.extend(self
._extract
_m
3u8_formats
( 
  96                     src
, video_id
, 'mp4', 'm3u8_native', 
  97                     m3u8_id
='hls', fatal
=False)) 
  98             elif src_type 
== 'application/dash+xml': 
  99                 formats
.extend(self
._extract
_mpd
_formats
( 
 100                     src
, video_id
, mpd_id
='dash', fatal
=False)) 
 101         self
._sort
_formats
(formats
) 
 103         heartbeat 
= episode
.get('heartbeat') or {} 
 104         omniture 
= episode
.get('omniture') or {} 
 105         get_meta 
= lambda x
: heartbeat
.get(x
) or omniture
.get(x
) 
 108             'display_id': display_id
, 
 111             'description': episode
.get('descripcion'), 
 112             'thumbnail': episode
.get('imgPoster'), 
 113             'duration': int_or_none(episode
.get('duration')), 
 115             'channel': get_meta('channel'), 
 116             'season': get_meta('season'), 
 117             'episode_number': int_or_none(get_meta('episodeNumber')),