Files
addon/servers/debriders/realdebrid.py
python2-kod a17bca7bf8 fix python2
2024-02-17 07:11:04 +01:00

162 lines
7.1 KiB
Python

# -*- coding: utf-8 -*-
import sys
PY3 = False
if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int
if PY3:
#from future import standard_library
#standard_library.install_aliases()
import urllib.parse as urllib # Es muy lento en PY2. En PY3 es nativo
else:
import urllib # Usamos el nativo de PY2 que es más rápido
import time
from core import httptools
from platformcode import config, logger
from platformcode import platformtools
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:65.0) Gecko/20100101 Firefox/65.0'}
# Returns an array of possible video url's from the page_url
def get_video_url(page_url, premium=False, user="", password="", video_password=""):
logger.debug("(page_url='%s' , video_password=%s)" % (page_url, video_password))
page_url = page_url.replace(".nz/embed", ".nz/")
# Se comprueba si existe un token guardado y sino se ejecuta el proceso de autentificación
token_auth = config.get_setting("token", server="realdebrid")
if token_auth is None or token_auth == "":
if config.is_xbmc():
token_auth = authentication()
if token_auth == "":
return [["REAL-DEBRID: No se ha completado el proceso de autentificación", ""]]
else:
return [["Es necesario activar la cuenta. Accede al menú de ayuda", ""]]
post_link = urllib.urlencode([("link", page_url), ("password", video_password)])
headers["Authorization"] = "Bearer %s" % token_auth
url = "https://api.real-debrid.com/rest/1.0/unrestrict/link"
data = httptools.downloadpage(url, post=post_link, headers=list(headers.items())).json
logger.error(data)
check = config.get_setting("secret", server="realdebrid")
#Se ha usado la autentificación por urlresolver (Bad Idea)
if "error" in data and data["error"] == "bad_token" and not check:
token_auth = authentication()
headers["Authorization"] = "Bearer %s" % token_auth
data = httptools.downloadpage(url, post=post_link, headers=list(headers.items())).json
# Si el token es erróneo o ha caducado, se solicita uno nuevo
elif "error" in data and data["error"] == "bad_token":
debrid_id = config.get_setting("id", server="realdebrid")
secret = config.get_setting("secret", server="realdebrid")
refresh = config.get_setting("refresh", server="realdebrid")
post_token = urllib.urlencode({"client_id": debrid_id, "client_secret": secret, "code": refresh,
"grant_type": "http://oauth.net/grant_type/device/1.0"})
renew_token = httptools.downloadpage("https://api.real-debrid.com/oauth/v2/token", post=post_token,
headers=list(headers.items())).json
if not "error" in renew_token:
token_auth = renew_token["access_token"]
config.set_setting("token", token_auth, server="realdebrid")
headers["Authorization"] = "Bearer %s" % token_auth
data = httptools.downloadpage(url, post=post_link, headers=list(headers.items())).json
else:
token_auth = authentication()
headers["Authorization"] = "Bearer %s" % token_auth
data = httptools.downloadpage(url, post=post_link, headers=list(headers.items())).json
if "download" in data:
return get_enlaces(data)
else:
if "error" in data:
msg = data["error"].decode("utf-8", "ignore")
msg = msg.replace("hoster_unavailable", "Servidor no disponible") \
.replace("unavailable_file", "Archivo no disponible") \
.replace("hoster_not_free", "Servidor no gratuito") \
.replace("bad_token", "Error en el token")
return [["REAL-DEBRID: " + msg, ""]]
else:
return [["REAL-DEBRID: No se ha generado ningún enlace", ""]]
def get_enlaces(data):
itemlist = []
if "alternative" in data:
for link in data["alternative"]:
video_url = link["download"].encode("utf-8")
title = video_url.rsplit(".", 1)[1]
if "quality" in link:
title += " (" + link["quality"] + ") [realdebrid]"
itemlist.append([title, video_url])
else:
video_url = data["download"].encode("utf-8")
title = video_url.rsplit(".", 1)[1] + " [realdebrid]"
itemlist.append([title, video_url])
return itemlist
def authentication():
logger.debug()
try:
client_id = "YTWNFBIJEEBP6"
# Se solicita url y código de verificación para conceder permiso a la app
url = "http://api.real-debrid.com/oauth/v2/device/code?client_id=%s&new_credentials=yes" % (client_id)
data = httptools.downloadpage(url, headers=list(headers.items())).json
verify_url = data["verification_url"]
user_code = data["user_code"]
device_code = data["device_code"]
intervalo = data["interval"]
dialog_auth = platformtools.dialog_progress(config.get_localized_string(70414),
config.get_localized_string(60252) % verify_url + '\n' +
config.get_localized_string(70413) % user_code + '\n' +
config.get_localized_string(60254))
# Generalmente cada 5 segundos se intenta comprobar si el usuario ha introducido el código
while True:
time.sleep(intervalo)
try:
if dialog_auth.iscanceled():
return ""
url = "https://api.real-debrid.com/oauth/v2/device/credentials?client_id=%s&code=%s" \
% (client_id, device_code)
data = httptools.downloadpage(url, headers=list(headers.items())).json
if "client_secret" in data:
# Código introducido, salimos del bucle
break
except:
pass
try:
dialog_auth.close()
except:
pass
debrid_id = data["client_id"]
secret = data["client_secret"]
# Se solicita el token de acceso y el de actualización para cuando el primero caduque
post = urllib.urlencode({"client_id": debrid_id, "client_secret": secret, "code": device_code,
"grant_type": "http://oauth.net/grant_type/device/1.0"})
data = httptools.downloadpage("https://api.real-debrid.com/oauth/v2/token", post=post,
headers=list(headers.items())).json
token = data["access_token"]
refresh = data["refresh_token"]
config.set_setting("id", debrid_id, server="realdebrid")
config.set_setting("secret", secret, server="realdebrid")
config.set_setting("token", token, server="realdebrid")
config.set_setting("refresh", refresh, server="realdebrid")
return token
except:
import traceback
logger.error(traceback.format_exc())
return ""