From 3ff31353c069dee87b92ec3ba69fc0538d6a8e77 Mon Sep 17 00:00:00 2001 From: Paco8 <5084042+Paco8@users.noreply.github.com> Date: Sat, 19 Oct 2024 08:27:28 +0200 Subject: [PATCH] Version 0.9.14 --- addon.xml | 2 +- resources/lib/endpoints.py | 77 +++------------------------- resources/lib/movistar.py | 102 +++++++++++++++++++------------------ 3 files changed, 59 insertions(+), 122 deletions(-) diff --git a/addon.xml b/addon.xml index 20660ba..55afbe1 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@ diff --git a/resources/lib/endpoints.py b/resources/lib/endpoints.py index 361109a..fe8a30e 100644 --- a/resources/lib/endpoints.py +++ b/resources/lib/endpoints.py @@ -5,97 +5,32 @@ from __future__ import unicode_literals, absolute_import, division endpoints = { - "activacion_dispositivo_cuenta_tk": "https://auth.dof6.com/movistarplus/webplayer/accounts/{ACCOUNTNUMBER}/devices/{DEVICEID}?qspVersion=ssp", - "activarpartner": "https://clientservices.dof6.com/oauth2/webplayer/users/{ACCOUNTNUMBER}/partners/{PARTNER}/promo?profile={PROFILE}", - "alquilertvodlite": "https://lite.dof6.com/mpluslite/webplayer/accounts/{ACCOUNTNUMBER}/tvod/rent", - "altaperfil": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/profiles", - "autenticacion_tk": "https://auth.dof6.com/movistarplus/api/devices/webplayer/users/authenticate", + "activacion_dispositivo_cuenta_tk": "https://auth.dof6.com/movistarplus/{deviceType}/accounts/{ACCOUNTNUMBER}/devices/{DEVICEID}?qspVersion=ssp", + "autenticacion_tk": "https://auth.dof6.com/movistarplus/api/devices/{deviceType}/users/authenticate", "avatares": "https://ottcache.dof6.com/vod/config/perfiles/config/avatares.json", - "bookmarking2": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/bookmarks/{family}", "borradofavoritos": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/favorites/{family}/{contentId}", "borrargrabacionindividual": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/npvrRecordings/{showId}", - "borrargrabaciontemporada": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/npvrRecordings/episodesDeletion", - "borrarperfil": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/profiles/{profileID}", - "boton_contrata": "https://www.movistar.es/particulares/tv?pid=yomvi-canalyficha-contratar", - "buscar_anonimo": "https://ottcache.dof6.com/movistarplus/webplayer/users/contents/search?term={texto}&mode=VODRU7D&profile=anonimo&version=8&mdrm={mdrm}&tlsstream=true&scope=DAZN", - "buscar_best": "https://perso.dof6.com/movistarplus/webplayer/users/contents/search?accountnumber={ACCOUNTNUMBER}&profile={profile}&term={texto}&mode=VODRU7D&showSeries=series&distilledTvRights={distilledTvRights}&version=8&mdrm={mdrm}&tlsstream=true&demarcation={demarcation}&scope=DAZN", - "buscar_best_tag": "https://perso.dof6.com/movistarplus/webplayer/users/contents/search?{POPULATE}&demarcation={demarcation}&scope=DAZN", - "buscar_coldstart": "https://ottcache.dof6.com/movistarplus/webplayer/users/coldstart/contents/search?profile={profile}&mode=VODRU7D&showSeries=series&version=8&mdrm={mdrm}&tlsstream=true&maxItems=0&demarcation={demarcation}&scope=DAZN", - "cambiopassword": "https://auth.dof6.com/credmgmt/api/credmgmt/user/{DIGITALPLUSUSERIDC}/changePassword", - "cambiopin": "https://clientservices.dof6.com/movistarplus/webplayer/users/{DIGITALPLUSUSERIDC}/purchasePin", + "buscar_best": "https://perso.dof6.com/movistarplus/{deviceType}/users/contents/search?accountnumber={ACCOUNTNUMBER}&profile={profile}&term={texto}&mode=VODRU7D&showSeries=series&distilledTvRights={distilledTvRights}&version=8&mdrm={mdrm}&tlsstream=true&demarcation={demarcation}&scope=DAZN", "canales": "https://ottcache.dof6.com/movistarplus/{deviceType}/{profile}/contents/channels?mdrm={mdrm}&tlsstream=true&demarcation={demarcation}&version=8", - "cancelargrabaciontemporada": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/npvrScheduledSeasons/{id}", - "capitulos": "https://ottcache.dof6.com/movistarplus/webplayer/contents/series/{contentId}/episodes?start={start}&end={end}", "cerrarsesiondispositivo": "https://clientservices.dof6.com/movistarplus/accounts/{ACCOUNTNUMBER}/devices/{DEVICEID}/sessions?qspVersion=ssp", - "cerrarsesiones": "https://clientservices.dof6.com/movistarplus/accounts/{ACCOUNTNUMBER}/devices?qspVersion=ssp", - "compras": "https://clientservices.dof6.com/movistarplus/webplayer/users/{ACCOUNTNUMBER}/impulsivePurchases?qspVersion=ssp&version=8", - "config": "https://ottcache.dof6.com/movistarplus/{origin}/webplayer/{profile}/configuration/config?format=json&uisegment={uisegment}", - "consulta_producto": "https://clientservices.dof6.com/movistarplus/upselling/{deviceType}/{PLAYREADYID}/contents/{contents}/{contentId}/subscription?mdrm={mdrm}", - "consultaestadoalquiler": "https://lite.dof6.com/mpluslite/webplayer/accounts/{ACCOUNTNUMBER}/tvod/rental/{EXTERNALPRODUCTID}", - "consultaestadooperacion": "https://clientservices.dof6.com/movistarplus/webplayer/users/{ACCOUNTNUMBER}/paymentStatus", - "consultaformaspago": "https://clientservices.dof6.com/movistarplus/webplayer/users/{ACCOUNTNUMBER}/formsOfPayment", "consultar": "https://ottcache.dof6.com/movistarplus/{deviceType}/contents/browse?profile={profile}&sort={sort}&version=8&start={start}&end={end}&mdrm={mdrm}&tlsstream=true&demarcation={demarcation}", - "consultarperfil": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/profiles/{profileID}", - "consultarsala": "https://watchtogether.dof6.com/rooms/{ROOMID}?accountId={ACCOUNTNUMBER}", - "contrata_producto": "https://clientservices.dof6.com/movistarplus/upselling/{deviceType}/{PLAYREADYID}/user/{ACCOUNTNUMBER}/products/{ProductId}?mdrm={mdrm}", - "contratarlite_ANONIMO": "https://contratar.movistarplus.es/", - "controlpaterno": "https://auth.dof6.com/movistarplus/auth/webplayer/users/authenticate", - "crearsala": "https://watchtogether.dof6.com/rooms?accountId={ACCOUNTNUMBER}", - "dejardeseguir2": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/seriesTrackings/{id}", - "editarperfil": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/profiles/{profileID}", "eliminardipositivo": "https://clientservices.dof6.com/movistarplus/accounts/{ACCOUNTNUMBER}/devices/{DEVICEID}?qspVersion=ssp", - "en-canales-por-genero": "https://ottcache.dof6.com/movistarplus/webplayer/{profile}/contents/highlighted?mediaType=FOTOH&filter=SVODQ3&pageNumber={pagenumber}&pageLength={pagelength}&mdrm={mdrm}&tlsstream=true&version=8", "favoritos": "https://perso.dof6.com/movistarplus/{deviceType}/users/{DIGITALPLUSUSERIDC}/favorites?profile={PROFILE}&version=8&mediaType=FOTOV&accountNumber={ACCOUNTNUMBER}&idsOnly={idsOnly}&start={start}&end={end}&mdrm={mdrm}&tlsstream=true&demarcation={demarcation}", "ficha": "https://ottcache.dof6.com/movistarplus/{deviceType}/contents/{id}/details?profile={profile}&mediaType={mediatype}&version=8&mode={mode}&catalog={catalog}&channels={channels}&state={state}&mdrm={mdrm}&tlsstream=true&demarcation={demarcation}&legacyBoxOffice={legacyBoxOffice}", "grabaciones": "https://perso.dof6.com/movistarplus/npvr/{deviceType}/users/{DIGITALPLUSUSERIDC}/recordings?profile={PROFILE}&mediaType=FOTOH&version=8&idsOnly={idsOnly}&start={start}&end={end}&mdrm={mdrm}&tlsstream=true&demarcation={demarcation}", "grabarprograma": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/npvrRecordings", "grabartemporada": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/npvrScheduledSeasons", - "guiaTV": "https://ottcache.dof6.com/movistarplus/{deviceType}/{profile}/contents/epg?preOffset={preOffset}&postOffset={postOffset}&mdrm={mdrm}&tlsstream=true&demarcation={demarcation}&version=8", - "haztecliente": "https://www.movistarplus.es/", - "hazteclienteregistro": "https://www.movistar.es/particulares/television/movistar-imagenio/?pid=yomvi-registro-nocliente", - "infopub": "https://ottcache.dof6.com/movistarplus/webplayer/{contents}/{contentId}/ad-info?profile={profile}&isRental={ISRENTAL}", "initdata": "https://clientservices.dof6.com/movistarplus/{deviceType}/sdp/mediaPlayers/{DEVICEID}/initData?qspVersion=ssp&version=8&status=default", - "initdata2": "https://clientservices.dof6.com/movistarplus/{deviceType}/sdp/mediaPlayers/{DEVICEID}/initData?qspVersion=ssp&version=8&status=login", - "keepAliveStream": "https://alkasvaspub.imagenio.telefonica.net/asvas/ccs/{PID}/{deviceCode}/{PLAYREADYID}/Session/{SessionID}", "listaperfiles": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/profiles?state=0&isForKids=0", "marcadofavoritos2": "https://grmovistar.imagenio.telefonica.net/asfe/rest/users/favorites/{family}", - "meterusuariosala": "https://watchtogether.dof6.com/rooms/{ROOMID}/participant/{PARTICIPANTID}?accountId={ACCOUNTNUMBER}", "nombrardispositivo": "https://clientservices.dof6.com/movistarplus/accounts/{ACCOUNTNUMBER}/devices/{DEVICEID}/name?qspVersion=ssp", - "obtenercuenta": "https://clientservices.dof6.com/movistarplus/api/devices/webplayer/account", "obtenerdipositivos": "https://clientservices.dof6.com/movistarplus/accounts/{ACCOUNTNUMBER}/devices?qspVersion=ssp", - "pagodiferido": "https://clientservices.dof6.com/movistarplus/webplayer/users/{ACCOUNTNUMBER}/vod/deferredPurchase?profile={PROFILE}", - "pixelTef": "https://audiencias-ott.imagenio.telefonica.net/events", - "primerepisodio": "https://ottcache.dof6.com/movistarplus/{deviceType}/series/{id}/first?profile={PROFILE}&version=8&mdrm={mdrm}&tlsstream=true", - "promo_home": "https://ottcache.dof6.com/movistarplus/{origin}/webplayer/{profile}/configuration/promo-home?format=json&promosegment={promosegment}", - "proximamente-por-genero": "https://ottcache.dof6.com/movistarplus/webplayer/{profile}/contents/upcoming?mediaType=FOTOV&sort=FA&maxItems=30&mdrm={mdrm}&tlsstream=true", - "recomendados": "https://perso.dof6.com/movistarplus/{deviceType}/users/{ACCOUNTNUMBER}/recommendations?profile={PROFILE}&userProfile={PROFILEID}&deviceId={PLAYREADYID}&showSeries=series&start={start}&end={end}&version=8&mdrm={mdrm}&tlsstream=true", - "recomendados2": "https://perso.dof6.com/movistarplus/{deviceType}/users/{ACCOUNTNUMBER}/contents/recommended?profile={PROFILE}&userProfile={PROFILEID}&deviceId={PLAYREADYID}&start={start}&end={end}&mode=VODRU7D&version=8&mdrm={mdrm}&tlsstream=true", - "registro": "https://www.movistar.es/particulares/ver-tv/contenidos/yomvi?origen=activar", "rejilla": "https://ottcache.dof6.com/movistarplus/{deviceType}/{profile}/epg?from={UTCDATETIME}&span={DURATION}&channel={CHANNELS}&network={NETWORK}&version=8&mdrm={mdrm}&tlsstream=true&demarcation={demarcation}", - "relacionados": "https://ottcache.dof6.com/movistarplus/{deviceType}/users/webplayer/recommendations?profile={profile}&contentId={contentId}&showSeries=series&start={start}&end={end}&version=8&mdrm={mdrm}&tlsstream=true", - "renovacion_cdntoken2": "https://idserver.dof6.com/{ACCOUNTNUMBER}/devices/webplayer/cdn/token/refresh", + "renovacion_cdntoken2": "https://idserver.dof6.com/{ACCOUNTNUMBER}/devices/{deviceType}/cdn/token/refresh", "renovacion_hztoken": "https://clientservices.dof6.com/movistarplus/{deviceType}/mediaPlayers/{DEVICEID}/hz-token", "renovacion_ssptoken": "https://clientservices.dof6.com/movistarplus/{deviceType}/accounts/{ACCOUNTNUMBER}/ssp-token?mediaPlayerId={DEVICEID}", - "sacarusuariosala": "https://watchtogether.dof6.com/rooms/{ROOMID}/participant/{PARTICIPANTID}?accountId={ACCOUNTNUMBER}", - "sacarusuariosalaoffline": "https://watchtogether.dof6.com/rooms/{ROOMID}/participant/{PARTICIPANTID}/abort?accountId={ACCOUNTNUMBER}", - "seguimiento": "https://perso.dof6.com/movistarplus/{deviceType}/user/{DIGITALPLUSUSERIDC}/tracking/series/{SERIESID}?accountNumber={ACCOUNTNUMBER}&profile={PROFILE}&version=8&mdrm={mdrm}&tlsstream=true", - "serverFP": "https://fp-ottlic-f3.imagenio.telefonica.net/TFAESP/fpls/contentlicenseservice/v1/licenses", - "serverPR": "https://pr-ottlic-f3.imagenio.telefonica.net/TFAESP/prls/contentlicenseservice/v1/licenses", - "serverWV": "https://wv-ottlic-f3.imagenio.telefonica.net/TFAESP/wvls/contentlicenseservice/v1/licenses", "setUpStream": "https://alkasvaspub.imagenio.telefonica.net/asvas/ccs/{PID}/{deviceCode}/{PLAYREADYID}/Session", - "siguiente_episodio": "https://ottcache.dof6.com/movistarplus/{deviceType}/episodes/{contentId}/next?profile={PROFILE}&version=8&mdrm={mdrm}&tlsstream=true", - "suscripcion_CASUAL": "https://contratar.movistarplus.es/cliente-suscripcion/", - "suscripcion_DTHTITULAR": "https://sitioseguro.movistarplus.es/zonacliente/mi-suscripcion/", - "suscripcion_LITE": "https://contratar.movistarplus.es/cliente-suscripcion/", "tearDownStream": "https://alkasvaspub.imagenio.telefonica.net/asvas/ccs/{PID}/{deviceCode}/{PLAYREADYID}/Session/{SessionID}", - "token": "https://auth.dof6.com/auth/oauth2/token?deviceClass=webplayer", - "token_hz": "https://autologinmovistar.imagenio.telefonica.net/asmgr/ccs/getHZTokenOnHome/WP_OTT/{MEDIAPLAYERID}", - "tracking_series": "https://perso.dof6.com/movistarplus/{deviceType}/user/{DIGITALPLUSUSERIDC}/tracking/series?accountNumber={ACCOUNTNUMBER}&version=8&mdrm={mdrm}&tlsstream=true", - "ultimasreproducciones": "https://perso.dof6.com/movistarplus/{deviceType}/users/{DIGITALPLUSUSERIDC}/viewings?profile={PROFILE}&container=trackedseries&mediaType=FOTOH&idsOnly={idsOnly}&accountNumber={ACCOUNTNUMBER}&version=8&start={start}&end={end}&mdrm={mdrm}&tlsstream=true&demarcation={demarcation}", - "valorar": "https://perso.dof6.com/vod/vod.svc/webplayer/contents/yomvi/{CONTENTID}/ratings/{RATING}?userId={USERID}&accountnumber={ACCOUNTNUMBER}", - "zonacliente_CASUAL_YOMVI": "https://contratar.movistarplus.es/cliente-suscripcion/", - "zonacliente_DTHTITULAR_YOMVI": "https://sitioseguro.movistarplus.es/zonacliente/tienda/index.html", - "zonacliente_LITE_YOMVI": "https://contratar.movistarplus.es/cliente-suscripcion/", - "zonacliente_OTT_YOMVI": "https://ver.movistarplus.es/ampliatususcripcion/", - "zonacliente_SVOD_YOMVI": "https://sitioseguro.movistarplus.es/zonacliente/tienda/index.html" + "token": "https://auth.dof6.com/auth/oauth2/token?deviceClass={deviceType}", + "ultimasreproducciones": "https://perso.dof6.com/movistarplus/{deviceType}/users/{DIGITALPLUSUSERIDC}/viewings?profile={PROFILE}&container=trackedseries&mediaType=FOTOH&idsOnly={idsOnly}&accountNumber={ACCOUNTNUMBER}&version=8&start={start}&end={end}&mdrm={mdrm}&tlsstream=true&demarcation={demarcation}" } diff --git a/resources/lib/movistar.py b/resources/lib/movistar.py index 2b031fe..b8d620c 100644 --- a/resources/lib/movistar.py +++ b/resources/lib/movistar.py @@ -37,12 +37,9 @@ class Movistar(object): 'demarcation': 0} add_extra_info = True - #dplayer = 'webplayer' - #device_code = 'WP_OTT' - #manufacturer = 'Firefox' - dplayer = 'android.tv' - device_code = 'SMARTTV_OTT' - manufacturer = 'LG' + dplayer = 'webplayer' + device_code = 'WP_OTT' + manufacturer = 'Firefox' account_dir = 'account_1' def __init__(self, config_directory, reuse_devices=False): @@ -89,7 +86,6 @@ class Movistar(object): os.makedirs(config_directory + 'cache') # Endpoints - #self.endpoints = self.get_endpoints() self.endpoints = endpoints # Access token @@ -272,17 +268,18 @@ class Movistar(object): headers = self.net.headers.copy() if self.account['device_id']: headers['x-movistarplus-deviceid'] = self.account['device_id'] - headers['x-movistarplus-ui'] = '2.36.30' - headers['x-movistarplus-os'] = 'Linux88' + #headers['x-movistarplus-ui'] = '2.36.30' + #headers['x-movistarplus-os'] = 'Linux88' data = { 'grant_type': 'password', - 'deviceClass': 'webplayer', + 'deviceClass': self.dplayer, 'username': username, 'password': password, } - url = self.endpoints['token'] + url = self.endpoints['token'].format(deviceType=self.dplayer) + #LOG(url) response = self.net.session.post(url, headers=headers, data=data) content = response.content.decode('utf-8') LOG(content) @@ -300,37 +297,16 @@ class Movistar(object): headers = self.net.headers.copy() headers['Content-Type'] = 'application/x-www-form-urlencoded' #headers['x-movistarplus-deviceid'] = self.account['device_id'] - headers['x-movistarplus-ui'] = '2.36.30' - headers['x-movistarplus-os'] = 'Linux88' + #headers['x-movistarplus-ui'] = '2.36.30' + #headers['x-movistarplus-os'] = 'Linux88' headers['Authorization'] = 'Bearer ' + self.account['access_token'] - url = self.endpoints['autenticacion_tk'] + '?_=' + str(int(time.time()*1000)) + url = self.endpoints['autenticacion_tk'].format(deviceType=self.dplayer) + '?_=' + str(int(time.time()*1000)) + #LOG(url) #LOG('authenticate: headers: {}'.format(headers)) data = self.net.load_data(url, headers) #LOG('authenticate: data: {}'.format(data)) return data - def load_service_directory(self): - url = 'https://homeservicedirectory.dof6.com/VoD/vod.svc/webplayer/environments/prod/ws-directory?format=json' - return self.net.load_data(url) - - def get_endpoints(self): - endpoints = {} - content = self.cache.load('endpoints.json') - if content: - data = json.loads(content) - else: - data = self.load_service_directory() - self.cache.save_file('endpoints.json', json.dumps(data, ensure_ascii=False)) - - for services in data['services']['service']: - if isinstance(services['endpoint'], list): - for endpoint in services['endpoint']: - endpoints[endpoint['@name']] = endpoint['@address'] - else: - endpoint = services['endpoint'] - endpoints[endpoint['@name']] = endpoint['@address'] - return endpoints - def change_device(self, id): self.account['device_id'] = id self.cache.save_file('device_id.conf', self.account['device_id']) @@ -361,10 +337,10 @@ class Movistar(object): headers = self.net.headers.copy() headers['Content-Type'] = 'application/json' headers['x-movistarplus-deviceid'] = self.account['device_id'] - headers['x-movistarplus-ui'] = '2.36.30' - headers['x-movistarplus-os'] = 'Linux88' + #headers['x-movistarplus-ui'] = '2.36.30' + #headers['x-movistarplus-os'] = 'Linux88' headers['Authorization'] = 'Bearer ' + self.account['access_token'] - url = self.endpoints['activacion_dispositivo_cuenta_tk'].format(ACCOUNTNUMBER=self.account['id'], DEVICEID=self.account['device_id']) + url = self.endpoints['activacion_dispositivo_cuenta_tk'].format(deviceType=self.dplayer, ACCOUNTNUMBER=self.account['id'], DEVICEID=self.account['device_id']) response = self.net.session.post(url, headers=headers) content = response.content.decode('utf-8') return content @@ -375,10 +351,12 @@ class Movistar(object): def new_device_id(self): headers = self.net.headers.copy() headers['Content-Type'] = 'application/json' - headers['x-movistarplus-ui'] = '2.36.30' - headers['x-movistarplus-os'] = 'Linux88' + #headers['x-movistarplus-ui'] = '2.36.30' + #headers['x-movistarplus-os'] = 'Linux88' headers['Authorization'] = 'Bearer ' + self.account['access_token'] - url = 'https://auth.dof6.com/movistarplus/webplayer/accounts/'+ self.account['id'] + '/devices/?qspVersion=ssp' + url = 'https://auth.dof6.com/movistarplus/{deviceType}/accounts/{ACCOUNTNUMBER}/devices/?qspVersion=ssp' + url = url.format(deviceType=self.dplayer, ACCOUNTNUMBER=self.account['id']) + #LOG(url) response = self.net.session.post(url, headers=headers) content = response.content.decode('utf-8') return content.strip('"') @@ -435,7 +413,7 @@ class Movistar(object): def get_cdntoken(self): headers = self.net.headers.copy() headers['Authorization'] = 'Bearer ' + self.account['access_token'] - url = self.endpoints['renovacion_cdntoken2'].format(ACCOUNTNUMBER=self.account['id']) + url = self.endpoints['renovacion_cdntoken2'].format(deviceType=self.dplayer, ACCOUNTNUMBER=self.account['id']) data = self.net.post_data(url, None, headers) if isinstance(data, dict): return data.get('access_token') @@ -461,7 +439,7 @@ class Movistar(object): headers = self.net.headers.copy() headers['Content-Type'] = 'application/json' headers['Authorization'] = 'Bearer ' + self.account['access_token'] - url = self.endpoints['renovacion_ssptoken'].format(deviceType='webplayer', ACCOUNTNUMBER=self.account['id'], DEVICEID=self.account['device_id']) + url = self.endpoints['renovacion_ssptoken'].format(deviceType=self.dplayer, ACCOUNTNUMBER=self.account['id'], DEVICEID=self.account['device_id']) data = self.net.post_data(url, '', headers) return data.get('access_token') @@ -494,7 +472,7 @@ class Movistar(object): def load_epg_data(self, date_str, duration=2, channels=''): demarcation = self.account['demarcation'] - url = self.endpoints['rejilla'].format(deviceType='webplayer', profile=self.account['platform'], UTCDATETIME=date_str, DURATION=duration, CHANNELS=channels, NETWORK='movistarplus', mdrm='true', demarcation=demarcation) + url = self.endpoints['rejilla'].format(deviceType=self.dplayer, profile=self.account['platform'], UTCDATETIME=date_str, DURATION=duration, CHANNELS=channels, NETWORK='movistarplus', mdrm='true', demarcation=demarcation) if self.quality == 'UHD': url += '&filterQuality=UHD' #LOG(url) data = self.net.load_data(url) @@ -643,7 +621,7 @@ class Movistar(object): if content: data = json.loads(content) else: - url = self.endpoints['canales'].format(deviceType='webplayer', profile=profile, mdrm='true', demarcation=demarcation) + url = self.endpoints['canales'].format(deviceType=self.dplayer, profile=profile, mdrm='true', demarcation=demarcation) if self.quality == 'UHD': url += '&filterQuality=UHD' #LOG(url) data = self.net.load_data(url) @@ -750,7 +728,7 @@ class Movistar(object): def get_recordings_url(self): url = self.endpoints['grabaciones'].format( - deviceType='webplayer', DIGITALPLUSUSERIDC=self.account['encoded_user'], PROFILE=self.account['platform'], + deviceType=self.dplayer, DIGITALPLUSUSERIDC=self.account['encoded_user'], PROFILE=self.account['platform'], idsOnly='false', start=1, end=30, mdrm='true', demarcation=self.account['demarcation']) #url += '&state=Completed&_='+ str(int(time.time()*1000)) url += '&_='+ str(int(time.time()*1000)) @@ -766,12 +744,12 @@ class Movistar(object): def get_search_url(self, search_term): url = self.endpoints['buscar_best'].format( + deviceType=self.dplayer, ACCOUNTNUMBER=self.account['id'], profile=self.account['platform'], texto=search_term, distilledTvRights=','.join(self.entitlements['distilledTvRights']), mdrm='true', demarcation=self.account['demarcation']) - url = url.replace('webplayer', self.dplayer) if self.quality == 'UHD': url += '&filterQuality=UHD' return url @@ -795,7 +773,7 @@ class Movistar(object): return res def get_ficha_url(self, id, mode='GLOBAL', catalog=''): - url = self.endpoints['ficha'].format(deviceType='webplayer', id=id, profile=self.account['platform'], mediatype='FOTOV', version='7.1', mode=mode, catalog=catalog, channels='', state='', mdrm='true', demarcation=self.account['demarcation'], legacyBoxOffice='') + url = self.endpoints['ficha'].format(deviceType=self.dplayer, id=id, profile=self.account['platform'], mediatype='FOTOV', version='7.1', mode=mode, catalog=catalog, channels='', state='', mdrm='true', demarcation=self.account['demarcation'], legacyBoxOffice='') url = url.replace('state=&', '') if self.quality == 'UHD': url += '&filterQuality=UHD' #print(url) @@ -844,6 +822,27 @@ class Movistar(object): if 'ShowId' in video: t['show_id'] = video['ShowId'] if self.add_extra_info: self.add_video_extra_info(t) + elif 'Pases' in data and len(data['Pases']) > 0: + video = data['Pases'][0] + t['subscribed'] = self.is_subscribed_vod(video.get('tvProducts', [])) + if 'ShowId' in video: t['show_id'] = video['ShowId'] + stype = None + if 'catalog=catchup' in ed['Ficha']: + stype = 'catch-up' + t['stream_type'] = 'u7d' + t['session_request'] = '{"contentID":' + str(t['id']) + ', "streamType":"CUTV"}' + elif 'catalog=npvr' in ed['Ficha']: + stype = 'npvr' + t['stream_type'] = 'rec' + t['session_request'] = '{"contentID":' + str(t['id']) + ', "streamType":"NPVR"}' + if 'UrlVideo' in video: + t['url'] = video['UrlVideo'] + else: + if stype: + for l in video['links']: + if l['rel'] == stype: + t['url'] = l['href'] + break if 'Recording' in data: t['stream_type'] = 'rec' t['rec'] = {'id': data['Recording']['id'], @@ -1156,7 +1155,7 @@ class Movistar(object): #sort = 'FE' sort = 'MA' #sort = 'AZ' - url = self.endpoints['consultar'].format(deviceType='webplayer', profile=self.account['platform'], sort=sort, start=1, end=50, mdrm='true', demarcation=self.account['demarcation']) + url = self.endpoints['consultar'].format(deviceType=self.dplayer, profile=self.account['platform'], sort=sort, start=1, end=50, mdrm='true', demarcation=self.account['demarcation']) filter = '&filter=AC-OM,AC-MA,MA-GBLCICLO59,TD-CUP,RG-SINCAT,AC-PREPUB,' + self.entitlements['suscripcion'] #filter = '&filter=AC-OM,AC-MA,MA-GBLCICLO59,TD-CUP,RG-SINCAT,AC-PREPUB' url += '&mode=VOD' + filter @@ -1524,5 +1523,8 @@ class Movistar(object): @staticmethod def save_file(filename, content): + if sys.version_info[0] < 3: + if not isinstance(content, unicode): + content = unicode(content, 'utf-8') with io.open(filename, 'w', encoding='utf-8') as handle: handle.write(content)