2 from __future__ 
import unicode_literals
 
   6 from .common 
import InfoExtractor
 
   9     compat_urllib_parse_urlencode
, 
  21 class MiTeleBaseIE(InfoExtractor
): 
  22     def _get_player_info(self
, url
, webpage
): 
  23         player_data 
= extract_attributes(self
._search
_regex
( 
  24             r
'(?s)(<ms-video-player.+?</ms-video-player>)', 
  25             webpage
, 'ms video player')) 
  26         video_id 
= player_data
['data-media-id'] 
  27         config_url 
= compat_urlparse
.urljoin(url
, player_data
['data-config']) 
  28         config 
= self
._download
_json
( 
  29             config_url
, video_id
, 'Downloading config JSON') 
  30         mmc_url 
= config
['services']['mmc'] 
  34         for m_url 
in (mmc_url
, mmc_url
.replace('/flash.json', '/html5.json')): 
  35             mmc 
= self
._download
_json
( 
  36                 m_url
, video_id
, 'Downloading mmc JSON') 
  38                 duration 
= int_or_none(mmc
.get('duration')) 
  39             for location 
in mmc
['locations']: 
  40                 gat 
= self
._proto
_relative
_url
(location
.get('gat'), 'http:') 
  41                 bas 
= location
.get('bas') 
  42                 loc 
= location
.get('loc') 
  43                 ogn 
= location
.get('ogn') 
  44                 if None in (gat
, bas
, loc
, ogn
): 
  52                 media 
= self
._download
_json
( 
  53                     '%s/?%s' % (gat
, compat_urllib_parse_urlencode(token_data
)), 
  54                     video_id
, 'Downloading %s JSON' % location
['loc']) 
  55                 file_ 
= media
.get('file') 
  58                 ext 
= determine_ext(file_
) 
  60                     formats
.extend(self
._extract
_f
4m
_formats
( 
  61                         file_ 
+ '&hdcore=3.2.0&plugin=aasp-3.2.0.77.18', 
  62                         video_id
, f4m_id
='hds', fatal
=False)) 
  64                     formats
.extend(self
._extract
_m
3u8_formats
( 
  65                         file_
, video_id
, 'mp4', 'm3u8_native', m3u8_id
='hls', fatal
=False)) 
  66         self
._sort
_formats
(formats
) 
  71             'thumbnail': player_data
.get('data-poster') or config
.get('poster', {}).get('imageUrl'), 
  76 class MiTeleIE(InfoExtractor
): 
  78     _VALID_URL 
= r
'https?://(?:www\.)?mitele\.es/(?:[^/]+/)+(?P<id>[^/]+)/player' 
  81         'url': 'http://www.mitele.es/programas-tv/diario-de/57b0dfb9c715da65618b4afa/player', 
  83             'id': '57b0dfb9c715da65618b4afa', 
  85             'title': 'Tor, la web invisible', 
  86             'description': 'md5:3b6fce7eaa41b2d97358726378d9369f', 
  87             'series': 'Diario de', 
  88             'season': 'La redacción', 
  90             'season_id': 'diario_de_t14_11981', 
  91             'episode': 'Programa 144', 
  93             'thumbnail': 're:(?i)^https?://.*\.jpg$', 
  99         'url': 'http://www.mitele.es/programas-tv/cuarto-milenio/57b0de3dc915da14058b4876/player', 
 101             'id': '57b0de3dc915da14058b4876', 
 103             'title': 'Cuarto Milenio Temporada 6 Programa 226', 
 104             'description': 'md5:5ff132013f0cd968ffbf1f5f3538a65f', 
 105             'series': 'Cuarto Milenio', 
 106             'season': 'Temporada 6', 
 108             'season_id': 'cuarto_milenio_t06_12715', 
 109             'episode': 'Programa 226', 
 110             'episode_number': 24, 
 111             'thumbnail': 're:(?i)^https?://.*\.jpg$', 
 115             'skip_download': True, 
 117         'add_ie': ['Ooyala'], 
 119         'url': 'http://www.mitele.es/series-online/la-que-se-avecina/57aac5c1c915da951a8b45ed/player', 
 120         'only_matching': True, 
 123     def _real_extract(self
, url
): 
 124         video_id 
= self
._match
_id
(url
) 
 125         webpage 
= self
._download
_webpage
(url
, video_id
) 
 127         gigya_url 
= self
._search
_regex
( 
 128             r
'<gigya-api>[^>]*</gigya-api>[^>]*<script\s+src="([^"]*)">[^>]*</script>', 
 129             webpage
, 'gigya', default
=None) 
 130         gigya_sc 
= self
._download
_webpage
( 
 131             compat_urlparse
.urljoin('http://www.mitele.es/', gigya_url
), 
 132             video_id
, 'Downloading gigya script') 
 134         # Get a appKey/uuid for getting the session key 
 135         appKey_var 
= self
._search
_regex
( 
 136             r
'value\s*\(\s*["\']appGridApplicationKey
["\']\s*,\s*([0-9a-f]+)', 
 137             gigya_sc, 'appKey variable') 
 138         appKey = self._search_regex( 
 139             r'var\s+%s\s*=\s*["\']([0-9a
-f
]+)' % appKey_var, gigya_sc, 'appKey
') 
 141         session_json = self._download_json( 
 142             'https
://appgrid
-api
.cloud
.accedo
.tv
/session
', 
 143             video_id, 'Downloading session keys
', query={ 
 145                 'uuid
': compat_str(uuid.uuid4()), 
 148         paths = self._download_json( 
 149             'https
://appgrid
-api
.cloud
.accedo
.tv
/metadata
/general_configuration
,%20web_configuration
', 
 150             video_id, 'Downloading paths JSON
', 
 151             query={'sessionKey
': compat_str(session_json['sessionKey
'])}) 
 153         ooyala_s = paths['general_configuration
']['api_configuration
']['ooyala_search
'] 
 154         source = self._download_json( 
 155             'http
://%s%s%s/docs
/%s' % ( 
 156                 ooyala_s['base_url
'], ooyala_s['full_path
'], 
 157                 ooyala_s['provider_id
'], video_id), 
 158             video_id, 'Downloading data JSON
', query={ 
 159                 'include_titles
': 'Series
,Season
', 
 160                 'product_name
': 'test
', 
 162             })['hits
']['hits
'][0]['_source
'] 
 164         embedCode = source['offers
'][0]['embed_codes
'][0] 
 165         titles = source['localizable_titles
'][0] 
 167         title = titles.get('title_medium
') or titles['title_long
'] 
 169         description = titles.get('summary_long
') or titles.get('summary_medium
') 
 172             value1 = source.get(key1) 
 173             if not value1 or not isinstance(value1, list): 
 175             if not isinstance(value1[0], dict): 
 177             return value1[0].get(key2) 
 179         series = get('localizable_titles_series
', 'title_medium
') 
 181         season = get('localizable_titles_season
', 'title_medium
') 
 182         season_number = int_or_none(source.get('season_number
')) 
 183         season_id = source.get('season_id
') 
 185         episode = titles.get('title_sort_name
') 
 186         episode_number = int_or_none(source.get('episode_number
')) 
 188         duration = parse_duration(get('videos
', 'duration
')) 
 191             '_type
': 'url_transparent
', 
 192             # for some reason only HLS is supported 
 193             'url
': smuggle_url('ooyala
:' + embedCode, {'supportedformats
': 'm3u8
'}), 
 196             'description
': description, 
 199             'season_number
': season_number, 
 200             'season_id
': season_id, 
 202             'episode_number
': episode_number, 
 203             'duration
': duration, 
 204             'thumbnail
': get('images
', 'url
'),