2016-06-18 04:06:19 +07:00
# coding: utf-8
2014-08-18 22:43:35 +02:00
from __future__ import unicode_literals
2016-10-04 02:04:24 +01:00
import uuid
2016-06-18 04:06:19 +07:00
2014-08-18 22:43:35 +02:00
from . common import InfoExtractor
2015-11-02 12:46:10 +01:00
from . . compat import (
2016-10-04 02:04:24 +01:00
compat_str ,
2016-03-26 01:46:57 +06:00
compat_urllib_parse_urlencode ,
2015-11-02 12:46:10 +01:00
compat_urlparse ,
)
2014-12-13 12:24:42 +01:00
from . . utils import (
2015-09-16 22:27:03 +06:00
int_or_none ,
2016-07-06 23:08:44 +01:00
extract_attributes ,
determine_ext ,
2016-10-04 02:04:24 +01:00
smuggle_url ,
parse_duration ,
2014-08-18 22:43:35 +02:00
)
2016-07-06 23:08:44 +01:00
class MiTeleBaseIE ( InfoExtractor ) :
def _get_player_info ( self , url , webpage ) :
player_data = extract_attributes ( self . _search_regex (
r ' (?s)(<ms-video-player.+?</ms-video-player>) ' ,
webpage , ' ms video player ' ) )
video_id = player_data [ ' data-media-id ' ]
config_url = compat_urlparse . urljoin ( url , player_data [ ' data-config ' ] )
config = self . _download_json (
config_url , video_id , ' Downloading config JSON ' )
mmc_url = config [ ' services ' ] [ ' mmc ' ]
duration = None
formats = [ ]
for m_url in ( mmc_url , mmc_url . replace ( ' /flash.json ' , ' /html5.json ' ) ) :
mmc = self . _download_json (
m_url , video_id , ' Downloading mmc JSON ' )
if not duration :
duration = int_or_none ( mmc . get ( ' duration ' ) )
for location in mmc [ ' locations ' ] :
gat = self . _proto_relative_url ( location . get ( ' gat ' ) , ' http: ' )
bas = location . get ( ' bas ' )
loc = location . get ( ' loc ' )
ogn = location . get ( ' ogn ' )
if None in ( gat , bas , loc , ogn ) :
continue
token_data = {
' bas ' : bas ,
' icd ' : loc ,
' ogn ' : ogn ,
' sta ' : ' 0 ' ,
}
media = self . _download_json (
' %s /? %s ' % ( gat , compat_urllib_parse_urlencode ( token_data ) ) ,
video_id , ' Downloading %s JSON ' % location [ ' loc ' ] )
file_ = media . get ( ' file ' )
if not file_ :
continue
ext = determine_ext ( file_ )
if ext == ' f4m ' :
formats . extend ( self . _extract_f4m_formats (
file_ + ' &hdcore=3.2.0&plugin=aasp-3.2.0.77.18 ' ,
video_id , f4m_id = ' hds ' , fatal = False ) )
elif ext == ' m3u8 ' :
formats . extend ( self . _extract_m3u8_formats (
file_ , video_id , ' mp4 ' , ' m3u8_native ' , m3u8_id = ' hls ' , fatal = False ) )
self . _sort_formats ( formats )
return {
' id ' : video_id ,
' formats ' : formats ,
' thumbnail ' : player_data . get ( ' data-poster ' ) or config . get ( ' poster ' , { } ) . get ( ' imageUrl ' ) ,
' duration ' : duration ,
}
2016-10-04 02:04:24 +01:00
class MiTeleIE ( InfoExtractor ) :
2015-09-16 22:39:48 +06:00
IE_DESC = ' mitele.es '
2016-11-19 19:23:49 +01:00
_VALID_URL = r ' https?://(?:www \ .)?mitele \ .es/(?:[^/]+/)(?:[^/]+/)(?P<id>[^/]+)/player '
2014-08-18 22:43:35 +02:00
2016-06-18 04:06:19 +07:00
_TESTS = [ {
2016-10-04 02:04:24 +01:00
' url ' : ' http://www.mitele.es/programas-tv/diario-de/57b0dfb9c715da65618b4afa/player ' ,
2014-08-18 22:43:35 +02:00
' info_dict ' : {
2016-10-04 02:04:24 +01:00
' id ' : ' 57b0dfb9c715da65618b4afa ' ,
2016-07-06 23:08:44 +01:00
' ext ' : ' mp4 ' ,
2015-09-16 22:27:03 +06:00
' title ' : ' Tor, la web invisible ' ,
' description ' : ' md5:3b6fce7eaa41b2d97358726378d9369f ' ,
2016-06-18 04:06:19 +07:00
' series ' : ' Diario de ' ,
' season ' : ' La redacción ' ,
' episode ' : ' Programa 144 ' ,
2015-09-16 22:27:03 +06:00
' thumbnail ' : ' re:(?i)^https?://.* \ .jpg$ ' ,
2014-08-18 22:43:35 +02:00
' duration ' : 2913 ,
} ,
2016-10-04 02:04:24 +01:00
' add_ie ' : [ ' Ooyala ' ] ,
2016-06-18 04:06:19 +07:00
} , {
# no explicit title
2016-10-04 02:04:24 +01:00
' url ' : ' http://www.mitele.es/programas-tv/cuarto-milenio/57b0de3dc915da14058b4876/player ' ,
2016-06-18 04:06:19 +07:00
' info_dict ' : {
2016-10-04 02:04:24 +01:00
' id ' : ' 57b0de3dc915da14058b4876 ' ,
2016-07-06 23:08:44 +01:00
' ext ' : ' mp4 ' ,
2016-10-04 02:04:24 +01:00
' title ' : ' Cuarto Milenio Temporada 6 Programa 226 ' ,
' description ' : ' md5:5ff132013f0cd968ffbf1f5f3538a65f ' ,
2016-06-18 04:06:19 +07:00
' series ' : ' Cuarto Milenio ' ,
' season ' : ' Temporada 6 ' ,
' episode ' : ' Programa 226 ' ,
' thumbnail ' : ' re:(?i)^https?://.* \ .jpg$ ' ,
2016-10-04 02:04:24 +01:00
' duration ' : 7313 ,
2016-06-18 04:06:19 +07:00
} ,
' params ' : {
' skip_download ' : True ,
} ,
2016-10-04 02:04:24 +01:00
' add_ie ' : [ ' Ooyala ' ] ,
2016-11-19 19:23:49 +01:00
} , {
' url ' : ' http://www.mitele.es/series-online/la-que-se-avecina/57adb4bac715dac3628b4732/player ' ,
' info_dict ' : {
' id ' : ' 58299dc5c915daa12a8b45da ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Una poliza premium, un novio tirita y un mayorista con el género a la vista ' ,
' description ' : ' Gabi, amigo y antiguo compa \xf1 ero de universidad de Javi, regresa a Mirador de Montepinar. Cuando conoce a Judith inician un t \xf3 rrido romance. Cansada de encadenar un fracaso sentimental con otro, la psic \xf3 loga comienza a salir con el joven para tratar de enderezar su vida. ' ,
' series ' : ' La Que Se Avecina ' ,
' season ' : ' Temporada 9 ' ,
' episode ' : ' Capítulo 124 ' ,
' thumbnail ' : ' re:(?i)^https?://.* \ .jpg$ ' ,
' duration ' : 5206 ,
} ,
' add_ie ' : [ ' Ooyala ' ] ,
2016-06-18 04:06:19 +07:00
} ]
2014-08-18 22:43:35 +02:00
def _real_extract ( self , url ) :
2016-10-04 02:04:24 +01:00
video_id = self . _match_id ( url )
webpage = self . _download_webpage ( url , video_id )
gigya_url = self . _search_regex ( r ' <gigya-api>[^>]*</gigya-api>[^>]*<script \ s*src= " ([^ " ]*) " >[^>]*</script> ' , webpage , ' gigya ' , default = None )
gigya_sc = self . _download_webpage ( compat_urlparse . urljoin ( r ' http://www.mitele.es/ ' , gigya_url ) , video_id , ' Downloading gigya script ' )
# Get a appKey/uuid for getting the session key
appKey_var = self . _search_regex ( r ' value \ ( " appGridApplicationKey " ,([0-9a-f]+) \ ) ' , gigya_sc , ' appKey variable ' )
appKey = self . _search_regex ( r ' var %s = " ([0-9a-f]+) " ' % appKey_var , gigya_sc , ' appKey ' )
uid = compat_str ( uuid . uuid4 ( ) )
session_url = ' https://appgrid-api.cloud.accedo.tv/session?appKey= %s &uuid= %s ' % ( appKey , uid )
session_json = self . _download_json ( session_url , video_id , ' Downloading session keys ' )
sessionKey = compat_str ( session_json [ ' sessionKey ' ] )
paths_url = ' https://appgrid-api.cloud.accedo.tv/metadata/general_configuration, % 20web_configuration?sessionKey= ' + sessionKey
paths = self . _download_json ( paths_url , video_id , ' Downloading paths JSON ' )
ooyala_s = paths [ ' general_configuration ' ] [ ' api_configuration ' ] [ ' ooyala_search ' ]
data_p = (
' http:// ' + ooyala_s [ ' base_url ' ] + ooyala_s [ ' full_path ' ] + ooyala_s [ ' provider_id ' ] +
' /docs/ ' + video_id + ' ?include_titles=Series,Season&product_name=test&format=full ' )
data = self . _download_json ( data_p , video_id , ' Downloading data JSON ' )
source = data [ ' hits ' ] [ ' hits ' ] [ 0 ] [ ' _source ' ]
embedCode = source [ ' offers ' ] [ 0 ] [ ' embed_codes ' ] [ 0 ]
titles = source [ ' localizable_titles ' ] [ 0 ]
title = titles . get ( ' title_medium ' ) or titles [ ' title_long ' ]
episode = titles [ ' title_sort_name ' ]
description = titles [ ' summary_long ' ]
titles_series = source [ ' localizable_titles_series ' ] [ 0 ]
series = titles_series [ ' title_long ' ]
titles_season = source [ ' localizable_titles_season ' ] [ 0 ]
season = titles_season [ ' title_medium ' ]
duration = parse_duration ( source [ ' videos ' ] [ 0 ] [ ' duration ' ] )
2015-09-16 22:27:03 +06:00
2016-10-04 02:04:24 +01:00
return {
' _type ' : ' url_transparent ' ,
# for some reason only HLS is supported
' url ' : smuggle_url ( ' ooyala: ' + embedCode , { ' supportedformats ' : ' m3u8 ' } ) ,
' id ' : video_id ,
2015-09-16 22:27:03 +06:00
' title ' : title ,
2016-10-04 02:04:24 +01:00
' description ' : description ,
2016-06-18 04:06:19 +07:00
' series ' : series ,
' season ' : season ,
' episode ' : episode ,
2016-10-04 02:04:24 +01:00
' duration ' : duration ,
' thumbnail ' : source [ ' images ' ] [ 0 ] [ ' url ' ] ,
}