2 from __future__ 
import unicode_literals
 
   6 from .common 
import InfoExtractor
 
   7 from .ooyala 
import OoyalaIE
 
  10     compat_urllib_parse_urlencode
, 
  22 class MiTeleBaseIE(InfoExtractor
): 
  23     def _get_player_info(self
, url
, webpage
): 
  24         player_data 
= extract_attributes(self
._search
_regex
( 
  25             r
'(?s)(<ms-video-player.+?</ms-video-player>)', 
  26             webpage
, 'ms video player')) 
  27         video_id 
= player_data
['data-media-id'] 
  28         if player_data
.get('data-cms-id') == 'ooyala': 
  29             return self
.url_result( 
  30                 'ooyala:%s' % video_id
, ie
=OoyalaIE
.ie_key(), video_id
=video_id
) 
  31         config_url 
= compat_urlparse
.urljoin(url
, player_data
['data-config']) 
  32         config 
= self
._download
_json
( 
  33             config_url
, video_id
, 'Downloading config JSON') 
  34         mmc_url 
= config
['services']['mmc'] 
  38         for m_url 
in (mmc_url
, mmc_url
.replace('/flash.json', '/html5.json')): 
  39             mmc 
= self
._download
_json
( 
  40                 m_url
, video_id
, 'Downloading mmc JSON') 
  42                 duration 
= int_or_none(mmc
.get('duration')) 
  43             for location 
in mmc
['locations']: 
  44                 gat 
= self
._proto
_relative
_url
(location
.get('gat'), 'http:') 
  45                 bas 
= location
.get('bas') 
  46                 loc 
= location
.get('loc') 
  47                 ogn 
= location
.get('ogn') 
  48                 if None in (gat
, bas
, loc
, ogn
): 
  56                 media 
= self
._download
_json
( 
  57                     '%s/?%s' % (gat
, compat_urllib_parse_urlencode(token_data
)), 
  58                     video_id
, 'Downloading %s JSON' % location
['loc']) 
  59                 file_ 
= media
.get('file') 
  62                 ext 
= determine_ext(file_
) 
  64                     formats
.extend(self
._extract
_f
4m
_formats
( 
  65                         file_ 
+ '&hdcore=3.2.0&plugin=aasp-3.2.0.77.18', 
  66                         video_id
, f4m_id
='hds', fatal
=False)) 
  68                     formats
.extend(self
._extract
_m
3u8_formats
( 
  69                         file_
, video_id
, 'mp4', 'm3u8_native', m3u8_id
='hls', fatal
=False)) 
  70         self
._sort
_formats
(formats
) 
  75             'thumbnail': player_data
.get('data-poster') or config
.get('poster', {}).get('imageUrl'), 
  80 class MiTeleIE(InfoExtractor
): 
  82     _VALID_URL 
= r
'https?://(?:www\.)?mitele\.es/(?:[^/]+/)+(?P<id>[^/]+)/player' 
  85         'url': 'http://www.mitele.es/programas-tv/diario-de/57b0dfb9c715da65618b4afa/player', 
  87             'id': '57b0dfb9c715da65618b4afa', 
  89             'title': 'Tor, la web invisible', 
  90             'description': 'md5:3b6fce7eaa41b2d97358726378d9369f', 
  91             'series': 'Diario de', 
  92             'season': 'La redacción', 
  94             'season_id': 'diario_de_t14_11981', 
  95             'episode': 'Programa 144', 
  97             'thumbnail': r
're:(?i)^https?://.*\.jpg$', 
 100         'add_ie': ['Ooyala'], 
 103         'url': 'http://www.mitele.es/programas-tv/cuarto-milenio/57b0de3dc915da14058b4876/player', 
 105             'id': '57b0de3dc915da14058b4876', 
 107             'title': 'Cuarto Milenio Temporada 6 Programa 226', 
 108             'description': 'md5:5ff132013f0cd968ffbf1f5f3538a65f', 
 109             'series': 'Cuarto Milenio', 
 110             'season': 'Temporada 6', 
 112             'season_id': 'cuarto_milenio_t06_12715', 
 113             'episode': 'Programa 226', 
 114             'episode_number': 24, 
 115             'thumbnail': r
're:(?i)^https?://.*\.jpg$', 
 119             'skip_download': True, 
 121         'add_ie': ['Ooyala'], 
 123         'url': 'http://www.mitele.es/series-online/la-que-se-avecina/57aac5c1c915da951a8b45ed/player', 
 124         'only_matching': True, 
 127     def _real_extract(self
, url
): 
 128         video_id 
= self
._match
_id
(url
) 
 129         webpage 
= self
._download
_webpage
(url
, video_id
) 
 131         gigya_url 
= self
._search
_regex
( 
 132             r
'<gigya-api>[^>]*</gigya-api>[^>]*<script\s+src="([^"]*)">[^>]*</script>', 
 133             webpage
, 'gigya', default
=None) 
 134         gigya_sc 
= self
._download
_webpage
( 
 135             compat_urlparse
.urljoin('http://www.mitele.es/', gigya_url
), 
 136             video_id
, 'Downloading gigya script') 
 138         # Get a appKey/uuid for getting the session key 
 139         appKey 
= self
._search
_regex
( 
 140             r
'constant\s*\(\s*["\']_appGridApplicationKey
["\']\s*,\s*["\']([0-9a
-f
]+)', 
 143         session_json = self._download_json( 
 144             'https
://appgrid
-api
.cloud
.accedo
.tv
/session
', 
 145             video_id, 'Downloading session keys
', query={ 
 147                 'uuid
': compat_str(uuid.uuid4()), 
 150         paths = self._download_json( 
 151             'https
://appgrid
-api
.cloud
.accedo
.tv
/metadata
/general_configuration
,%20web_configuration
', 
 152             video_id, 'Downloading paths JSON
', 
 153             query={'sessionKey
': compat_str(session_json['sessionKey
'])}) 
 155         ooyala_s = paths['general_configuration
']['api_configuration
']['ooyala_search
'] 
 156         source = self._download_json( 
 157             'http
://%s%s%s/docs
/%s' % ( 
 158                 ooyala_s['base_url
'], ooyala_s['full_path
'], 
 159                 ooyala_s['provider_id
'], video_id), 
 160             video_id, 'Downloading data JSON
', query={ 
 161                 'include_titles
': 'Series
,Season
', 
 162                 'product_name
': 'test
', 
 164             })['hits
']['hits
'][0]['_source
'] 
 166         embedCode = source['offers
'][0]['embed_codes
'][0] 
 167         titles = source['localizable_titles
'][0] 
 169         title = titles.get('title_medium
') or titles['title_long
'] 
 171         description = titles.get('summary_long
') or titles.get('summary_medium
') 
 174             value1 = source.get(key1) 
 175             if not value1 or not isinstance(value1, list): 
 177             if not isinstance(value1[0], dict): 
 179             return value1[0].get(key2) 
 181         series = get('localizable_titles_series
', 'title_medium
') 
 183         season = get('localizable_titles_season
', 'title_medium
') 
 184         season_number = int_or_none(source.get('season_number
')) 
 185         season_id = source.get('season_id
') 
 187         episode = titles.get('title_sort_name
') 
 188         episode_number = int_or_none(source.get('episode_number
')) 
 190         duration = parse_duration(get('videos
', 'duration
')) 
 193             '_type
': 'url_transparent
', 
 194             # for some reason only HLS is supported 
 195             'url
': smuggle_url('ooyala
:' + embedCode, {'supportedformats
': 'm3u8
,dash
'}), 
 198             'description
': description, 
 201             'season_number
': season_number, 
 202             'season_id
': season_id, 
 204             'episode_number
': episode_number, 
 205             'duration
': duration, 
 206             'thumbnail
': get('images
', 'url
'),