tmdb cache and configuration

This commit is contained in:
alfa_addon_10
2017-10-24 18:47:02 +02:00
parent 7f6ffd48ce
commit 5a332243e0
4 changed files with 255 additions and 141 deletions
+241 -134
View File
@@ -2,11 +2,15 @@
import copy import copy
import re import re
import sqlite3
import time import time
from core import filetools
from core import httptools
from core import jsontools from core import jsontools
from core import scrapertools from core import scrapertools
from core.item import InfoLabels from core.item import InfoLabels
from platformcode import config
from platformcode import logger from platformcode import logger
# ----------------------------------------------------------------------------------------------------------- # -----------------------------------------------------------------------------------------------------------
@@ -61,6 +65,114 @@ from platformcode import logger
# -------------------------------------------------------------------------------------------------------------- # --------------------------------------------------------------------------------------------------------------
otmdb_global = None otmdb_global = None
fname = filetools.join(config.get_data_path(), "alfa_db.sqlite")
def create_bd():
conn = sqlite3.connect(fname)
c = conn.cursor()
c.execute('CREATE TABLE IF NOT EXISTS tmdb_cache (url TEXT PRIMARY KEY, response TEXT, added TEXT)')
conn.commit()
conn.close()
def drop_bd():
conn = sqlite3.connect(fname)
c = conn.cursor()
c.execute('DROP TABLE IF EXISTS tmdb_cache')
conn.commit()
conn.close()
return True
create_bd()
# El nombre de la funcion es el nombre del decorador y recibe la funcion que decora.
def cache_response(fn):
logger.info()
# import time
# start_time = time.time()
def wrapper(*args):
import base64
def check_expired(ts):
import datetime
valided = False
cache_expire = config.get_setting("tmdb_cache", default=0)
saved_date = datetime.datetime.fromtimestamp(ts)
current_date = datetime.datetime.fromtimestamp(time.time())
logger.debug("saved date %s" % saved_date)
logger.debug("current date %s" % current_date)
elapsed = current_date - saved_date
logger.debug("elapsed %s" % elapsed)
# 7 days
if cache_expire == 1:
if elapsed > datetime.timedelta(days=7):
valided = False
logger.debug("ha pasado MÁS de 7 dias")
else:
valided = True
logger.debug("ha pasado MENOS de 7 dias")
# 1 month - 30 days
elif cache_expire == 2:
# no tenemos en cuenta febrero o meses con 31 días
if elapsed > datetime.timedelta(days=30):
valided = False
else:
valided = True
return valided
result = {}
try:
# no cache - no guarda en la BD
# if option selected is "no cached"
if config.get_setting("tmdb_cache", default=0) == 0:
result = fn(*args)
else:
conn = sqlite3.connect(fname)
c = conn.cursor()
url_base64 = base64.b64encode(args[0])
c.execute("SELECT response, added FROM tmdb_cache WHERE url=?", (url_base64,))
row = c.fetchone()
if row and check_expired(float(row[1])):
result = eval(base64.b64decode(row[0]))
# si no se ha obtenido información, llamamos a la funcion
if not result:
result = fn(*args)
result_base64 = base64.b64encode(str(result))
c.execute("INSERT OR REPLACE INTO tmdb_cache (url, response, added) VALUES (?, ?, ?)",
(url_base64, result_base64, time.time()))
conn.commit()
conn.close()
# elapsed_time = time.time() - start_time
# logger.debug("TARDADO %s" % elapsed_time)
# error al obtener los datos
except Exception, ex:
message = "An exception of type %s occured. Arguments:\n%s" % (type(ex).__name__, repr(ex.args))
logger.error("error en: %s" % message)
return result
return wrapper
def set_infoLabels(source, seekTmdb=True, idioma_busqueda='es'): def set_infoLabels(source, seekTmdb=True, idioma_busqueda='es'):
@@ -78,6 +190,7 @@ def set_infoLabels(source, seekTmdb=True, idioma_busqueda='es'):
@return: un numero o lista de numeros con el resultado de las llamadas a set_infoLabels_item @return: un numero o lista de numeros con el resultado de las llamadas a set_infoLabels_item
@rtype: int, list @rtype: int, list
""" """
start_time = time.time() start_time = time.time()
if type(source) == list: if type(source) == list:
ret = set_infoLabels_itemlist(source, seekTmdb, idioma_busqueda) ret = set_infoLabels_itemlist(source, seekTmdb, idioma_busqueda)
@@ -95,34 +208,35 @@ def set_infoLabels_itemlist(item_list, seekTmdb=False, idioma_busqueda='es'):
La API tiene un limite de 40 peticiones por IP cada 10'' y por eso la lista no deberia tener mas de 30 items La API tiene un limite de 40 peticiones por IP cada 10'' y por eso la lista no deberia tener mas de 30 items
para asegurar un buen funcionamiento de esta funcion. para asegurar un buen funcionamiento de esta funcion.
:param item_list: listado de objetos Item que representan peliculas, series o capitulos. El atributo @param item_list: listado de objetos Item que representan peliculas, series o capitulos. El atributo
infoLabels de cada objeto Item sera modificado incluyendo los datos extras localizados. infoLabels de cada objeto Item sera modificado incluyendo los datos extras localizados.
:type item_list: list @type item_list: list
:param seekTmdb: Si es True hace una busqueda en www.themoviedb.org para obtener los datos, en caso contrario @param seekTmdb: Si es True hace una busqueda en www.themoviedb.org para obtener los datos, en caso contrario
obtiene los datos del propio Item si existen. obtiene los datos del propio Item si existen.
:type seekTmdb: bool @type seekTmdb: bool
:param idioma_busqueda: Codigo del idioma segun ISO 639-1, en caso de busqueda en www.themoviedb.org. @param idioma_busqueda: Codigo del idioma segun ISO 639-1, en caso de busqueda en www.themoviedb.org.
:type idioma_busqueda: str @type idioma_busqueda: str
:return: Una lista de numeros cuyo valor absoluto representa la cantidad de elementos incluidos en el atributo @return: Una lista de numeros cuyo valor absoluto representa la cantidad de elementos incluidos en el atributo
infoLabels de cada Item. Este numero sera positivo si los datos se han obtenido de www.themoviedb.org y infoLabels de cada Item. Este numero sera positivo si los datos se han obtenido de www.themoviedb.org y
negativo en caso contrario. negativo en caso contrario.
:rtype: list @rtype: list
""" """
import threading import threading
semaforo = threading.Semaphore(20) threads_num = config.get_setting("tmdb_threads", default=20)
semaforo = threading.Semaphore(threads_num)
lock = threading.Lock() lock = threading.Lock()
r_list = list() r_list = list()
i = 0 i = 0
l_hilo = list() l_hilo = list()
def sub_thread(item, _i, _seekTmdb): def sub_thread(_item, _i, _seekTmdb):
semaforo.acquire() semaforo.acquire()
ret = set_infoLabels_item(item, _seekTmdb, idioma_busqueda, lock) ret = set_infoLabels_item(_item, _seekTmdb, idioma_busqueda, lock)
# logger.debug(str(ret) + "item: " + item.tostring()) # logger.debug(str(ret) + "item: " + _item.tostring())
semaforo.release() semaforo.release()
r_list.append((_i, item, ret)) r_list.append((_i, _item, ret))
for item in item_list: for item in item_list:
t = threading.Thread(target=sub_thread, args=(item, i, seekTmdb)) t = threading.Thread(target=sub_thread, args=(item, i, seekTmdb))
@@ -142,21 +256,22 @@ def set_infoLabels_itemlist(item_list, seekTmdb=False, idioma_busqueda='es'):
def set_infoLabels_item(item, seekTmdb=True, idioma_busqueda='es', lock=None): def set_infoLabels_item(item, seekTmdb=True, idioma_busqueda='es', lock=None):
# ----------------------------------------------------------------------------------------------------------- """
# Obtiene y fija (item.infoLabels) los datos extras de una serie, capitulo o pelicula. Obtiene y fija (item.infoLabels) los datos extras de una serie, capitulo o pelicula.
#
# Parametros: @param item: Objeto Item que representa un pelicula, serie o capitulo. El atributo infoLabels sera modificado
# item: (Item) Objeto Item que representa un pelicula, serie o capitulo. El atributo infoLabels sera incluyendo los datos extras localizados.
# modificado incluyendo los datos extras localizados. @type item: Item
# (opcional) seekTmdb: (bool) Si es True hace una busqueda en www.themoviedb.org para obtener los datos, @param seekTmdb: Si es True hace una busqueda en www.themoviedb.org para obtener los datos, en caso contrario
# en caso contrario obtiene los datos del propio Item si existen. obtiene los datos del propio Item si existen.
# (opcional) idioma_busqueda: (str) Codigo del idioma segun ISO 639-1, en caso de busqueda en @type seekTmdb: bool
# www.themoviedb.org. @param idioma_busqueda: Codigo del idioma segun ISO 639-1, en caso de busqueda en www.themoviedb.org.
# Retorna: @type idioma_busqueda: str
# Un numero cuyo valor absoluto representa la cantidad de elementos incluidos en el atributo @param lock: para uso de threads cuando es llamado del metodo 'set_infoLabels_itemlist'
# item.infoLabels. @return: Un numero cuyo valor absoluto representa la cantidad de elementos incluidos en el atributo item.infoLabels.
# Este numero sera positivo si los datos se han obtenido de www.themoviedb.org y negativo en caso contrario. Este numero sera positivo si los datos se han obtenido de www.themoviedb.org y negativo en caso contrario.
# --------------------------------------------------------------------------------------------------------- @rtype: int
"""
global otmdb_global global otmdb_global
def __leer_datos(otmdb_aux): def __leer_datos(otmdb_aux):
@@ -183,10 +298,9 @@ def set_infoLabels_item(item, seekTmdb=True, idioma_busqueda='es', lock=None):
if lock: if lock:
lock.acquire() lock.acquire()
if not otmdb_global or (item.infoLabels['tmdb_id'] and if not otmdb_global or (item.infoLabels['tmdb_id']
str(otmdb_global.result.get("id")) != item.infoLabels['tmdb_id']) \ and str(otmdb_global.result.get("id")) != item.infoLabels['tmdb_id']) \
or (otmdb_global.texto_buscado and or (otmdb_global.texto_buscado and otmdb_global.texto_buscado != item.infoLabels['tvshowtitle']):
otmdb_global.texto_buscado != item.infoLabels['tvshowtitle']):
if item.infoLabels['tmdb_id']: if item.infoLabels['tmdb_id']:
otmdb_global = Tmdb(id_Tmdb=item.infoLabels['tmdb_id'], tipo=tipo_busqueda, otmdb_global = Tmdb(id_Tmdb=item.infoLabels['tmdb_id'], tipo=tipo_busqueda,
idioma_busqueda=idioma_busqueda) idioma_busqueda=idioma_busqueda)
@@ -196,8 +310,6 @@ def set_infoLabels_item(item, seekTmdb=True, idioma_busqueda='es', lock=None):
__leer_datos(otmdb_global) __leer_datos(otmdb_global)
temporada = otmdb_global.get_temporada(numtemporada)
if lock: if lock:
lock.release() lock.release()
@@ -230,7 +342,6 @@ def set_infoLabels_item(item, seekTmdb=True, idioma_busqueda='es', lock=None):
return len(item.infoLabels) return len(item.infoLabels)
else: else:
# Tenemos numero de temporada valido pero no numero de episodio... # Tenemos numero de temporada valido pero no numero de episodio...
# ... buscar datos temporada # ... buscar datos temporada
@@ -254,7 +365,6 @@ def set_infoLabels_item(item, seekTmdb=True, idioma_busqueda='es', lock=None):
# Buscar... # Buscar...
else: else:
otmdb = copy.copy(otmdb_global) otmdb = copy.copy(otmdb_global)
# if otmdb is None: # Se elimina por q sino falla al añadir series por falta de imdb, pero por contra provoca mas llamadas
# Busquedas por ID... # Busquedas por ID...
if item.infoLabels['tmdb_id']: if item.infoLabels['tmdb_id']:
# ...Busqueda por tmdb_id # ...Busqueda por tmdb_id
@@ -270,8 +380,7 @@ def set_infoLabels_item(item, seekTmdb=True, idioma_busqueda='es', lock=None):
elif tipo_busqueda == 'tv': # buscar con otros codigos elif tipo_busqueda == 'tv': # buscar con otros codigos
if item.infoLabels['tvdb_id']: if item.infoLabels['tvdb_id']:
# ...Busqueda por tvdb_id # ...Busqueda por tvdb_id
otmdb = Tmdb(external_id=item.infoLabels['tvdb_id'], external_source="tvdb_id", otmdb = Tmdb(external_id=item.infoLabels['tvdb_id'], external_source="tvdb_id", tipo=tipo_busqueda,
tipo=tipo_busqueda,
idioma_busqueda=idioma_busqueda) idioma_busqueda=idioma_busqueda)
elif item.infoLabels['freebase_mid']: elif item.infoLabels['freebase_mid']:
# ...Busqueda por freebase_mid # ...Busqueda por freebase_mid
@@ -303,16 +412,16 @@ def set_infoLabels_item(item, seekTmdb=True, idioma_busqueda='es', lock=None):
else: else:
titulo_buscado = item.fulltitle titulo_buscado = item.fulltitle
otmdb = Tmdb(texto_buscado=titulo_buscado, tipo=tipo_busqueda, otmdb = Tmdb(texto_buscado=titulo_buscado, tipo=tipo_busqueda, idioma_busqueda=idioma_busqueda,
idioma_busqueda=idioma_busqueda, filtro=item.infoLabels.get('filtro', {}), year=item.infoLabels['year'])
filtro=item.infoLabels.get('filtro', {}),
year=item.infoLabels['year'])
if otmdb.get_id() and not lock: if otmdb.get_id() and config.get_setting("tmdb_plus_info", default=False):
# Si la busqueda ha dado resultado y no se esta buscando una lista de items, # Si la busqueda ha dado resultado y no se esta buscando una lista de items,
# realizar otra busqueda para ampliar la informacion # realizar otra busqueda para ampliar la informacion
otmdb = Tmdb(id_Tmdb=otmdb.result.get("id"), tipo=tipo_busqueda, otmdb = Tmdb(id_Tmdb=otmdb.result.get("id"), tipo=tipo_busqueda, idioma_busqueda=idioma_busqueda)
idioma_busqueda=idioma_busqueda)
if lock and lock.locked():
lock.release()
if otmdb is not None and otmdb.get_id(): if otmdb is not None and otmdb.get_id():
# La busqueda ha encontrado un resultado valido # La busqueda ha encontrado un resultado valido
@@ -386,8 +495,8 @@ def find_and_set_infoLabels(item):
def get_nfo(item): def get_nfo(item):
""" """
Devuelve la información necesaria para que se scrapee el resultado en la videoteca de kodi, Devuelve la información necesaria para que se scrapee el resultado en la videoteca de kodi, para tmdb funciona
para tmdb funciona solo pasandole la url solo pasandole la url.
@param item: elemento que contiene los datos necesarios para generar la info @param item: elemento que contiene los datos necesarios para generar la info
@type item: Item @type item: Item
@rtype: str @rtype: str
@@ -427,9 +536,9 @@ class ResultDictDefault(dict):
return self.__missing__(key) return self.__missing__(key)
def __missing__(self, key): def __missing__(self, key):
''' """
valores por defecto en caso de que la clave solicitada no exista valores por defecto en caso de que la clave solicitada no exista
''' """
if key in ['genre_ids', 'genre', 'genres']: if key in ['genre_ids', 'genre', 'genres']:
return list() return list()
elif key == 'images_posters': elif key == 'images_posters':
@@ -677,14 +786,44 @@ class Tmdb(object):
else: else:
logger.debug("Creado objeto vacio") logger.debug("Creado objeto vacio")
@staticmethod
@cache_response
def get_json(url):
try:
result = httptools.downloadpage(url, cookies=False)
res_headers = result.headers
# logger.debug("res_headers es %s" % res_headers)
dict_data = jsontools.load(result.data)
# logger.debug("result_data es %s" % dict_data)
if "status_code" in dict_data:
logger.debug("\nError de tmdb: %s %s" % (dict_data["status_code"], dict_data["status_message"]))
if dict_data["status_code"] == 25:
while "status_code" in dict_data and dict_data["status_code"] == 25:
wait = int(res_headers['retry-after'])
logger.debug("Limite alcanzado, esperamos para volver a llamar en ...%s" % wait)
time.sleep(wait)
# logger.debug("RE Llamada #%s" % d)
result = httptools.downloadpage(url, cookies=False)
res_headers = result.headers
# logger.debug("res_headers es %s" % res_headers)
dict_data = jsontools.load(result.data)
# logger.debug("result_data es %s" % dict_data)
# error al obtener los datos
except Exception, ex:
message = "An exception of type %s occured. Arguments:\n%s" % (type(ex).__name__, repr(ex.args))
logger.error("error en: %s" % message)
dict_data = {}
return dict_data
@classmethod @classmethod
def rellenar_dic_generos(cls, tipo='movie', idioma='es'): def rellenar_dic_generos(cls, tipo='movie', idioma='es'):
resultado = {}
# Si se busca en idioma catalán, se cambia a español para el diccionario de géneros
if idioma == "ca":
idioma = "es"
# Rellenar diccionario de generos del tipo e idioma pasados como parametros # Rellenar diccionario de generos del tipo e idioma pasados como parametros
if idioma not in cls.dic_generos: if idioma not in cls.dic_generos:
cls.dic_generos[idioma] = {} cls.dic_generos[idioma] = {}
@@ -695,21 +834,16 @@ class Tmdb(object):
% (tipo, idioma)) % (tipo, idioma))
try: try:
logger.info("[Tmdb.py] Rellenando dicionario de generos") logger.info("[Tmdb.py] Rellenando dicionario de generos")
resultado = jsontools.load(scrapertools.downloadpageWithoutCookies(url))
resultado = cls.get_json(url)
lista_generos = resultado["genres"] lista_generos = resultado["genres"]
for i in lista_generos: for i in lista_generos:
cls.dic_generos[idioma][tipo][str(i["id"])] = i["name"] cls.dic_generos[idioma][tipo][str(i["id"])] = i["name"]
except: except:
pass logger.error("Error generando diccionarios")
if "status_code" in resultado:
msg = "Error de tmdb: %s %s" % (resultado["status_code"], resultado["status_message"])
logger.error(msg)
def __by_id(self, source='tmdb'): def __by_id(self, source='tmdb'):
resultado = {}
buscando = ""
if self.busqueda_id: if self.busqueda_id:
if source == "tmdb": if source == "tmdb":
@@ -728,31 +862,26 @@ class Tmdb(object):
buscando = "%s: %s" % (source.capitalize(), self.busqueda_id) buscando = "%s: %s" % (source.capitalize(), self.busqueda_id)
logger.info("[Tmdb.py] Buscando %s:\n%s" % (buscando, url)) logger.info("[Tmdb.py] Buscando %s:\n%s" % (buscando, url))
resultado = self.get_json(url)
try: if resultado:
resultado = jsontools.load(scrapertools.downloadpageWithoutCookies(url))
if source != "tmdb": if source != "tmdb":
if self.busqueda_tipo == "movie": if self.busqueda_tipo == "movie":
resultado = resultado["movie_results"][0] resultado = resultado["movie_results"][0]
else: else:
resultado = resultado["tv_results"][0] resultado = resultado["tv_results"][0]
except:
resultado = {}
if resultado and not "status_code" in resultado: self.results = [resultado]
self.results = [resultado] self.total_results = 1
self.total_results = 1 self.total_pages = 1
self.total_pages = 1 self.result = ResultDictDefault(resultado)
self.result = ResultDictDefault(resultado)
else: else:
# No hay resultados de la busqueda # No hay resultados de la busqueda
msg = "La busqueda de %s no dio resultados." % buscando msg = "La busqueda de %s no dio resultados." % buscando
if "status_code" in resultado: logger.debug(msg)
msg += "\nError de tmdb: %s %s" % (resultado["status_code"], resultado["status_message"])
logger.debug(msg)
def __search(self, index_results=0, page=1): def __search(self, index_results=0, page=1):
resultado = {}
self.result = ResultDictDefault() self.result = ResultDictDefault()
results = [] results = []
total_results = 0 total_results = 0
@@ -767,17 +896,14 @@ class Tmdb(object):
self.busqueda_idioma, self.busqueda_include_adult, page)) self.busqueda_idioma, self.busqueda_include_adult, page))
if self.busqueda_year: if self.busqueda_year:
url += '&year=%s' % (self.busqueda_year) url += '&year=%s' % self.busqueda_year
buscando = self.busqueda_texto.capitalize() buscando = self.busqueda_texto.capitalize()
logger.info("[Tmdb.py] Buscando %s en pagina %s:\n%s" % (buscando, page, url)) logger.info("[Tmdb.py] Buscando %s en pagina %s:\n%s" % (buscando, page, url))
resultado = self.get_json(url)
try: total_results = resultado.get("total_results", 0)
resultado = jsontools.load(scrapertools.downloadpageWithoutCookies(url)) total_pages = resultado.get("total_pages", 0)
total_results = resultado["total_results"]
total_pages = resultado["total_pages"]
except:
total_results = 0
if total_results > 0: if total_results > 0:
results = resultado["results"] results = resultado["results"]
@@ -808,13 +934,10 @@ class Tmdb(object):
else: else:
# No hay resultados de la busqueda # No hay resultados de la busqueda
msg = "La busqueda de '%s' no dio resultados para la pagina %s" % (buscando, page) msg = "La busqueda de '%s' no dio resultados para la pagina %s" % (buscando, page)
if "status_code" in resultado:
msg += "\nError de tmdb: %s %s" % (resultado["status_code"], resultado["status_message"])
logger.error(msg) logger.error(msg)
return 0 return 0
def __discover(self, index_results=0): def __discover(self, index_results=0):
resultado = {}
self.result = ResultDictDefault() self.result = ResultDictDefault()
results = [] results = []
total_results = 0 total_results = 0
@@ -834,17 +957,10 @@ class Tmdb(object):
% (type_search, "&".join(params))) % (type_search, "&".join(params)))
logger.info("[Tmdb.py] Buscando %s:\n%s" % (type_search, url)) logger.info("[Tmdb.py] Buscando %s:\n%s" % (type_search, url))
resultado = self.get_json(url)
try: total_results = resultado.get("total_results", -1)
resultado = jsontools.load(scrapertools.downloadpageWithoutCookies(url)) total_pages = resultado.get("total_pages", 1)
total_results = resultado["total_results"]
total_pages = resultado["total_pages"]
except:
if resultado and not "status_code" in resultado:
total_results = -1
total_pages = 1
else:
total_results = 0
if total_results > 0: if total_results > 0:
results = resultado["results"] results = resultado["results"]
@@ -979,7 +1095,6 @@ class Tmdb(object):
:return: Devuelve la sinopsis de una pelicula o serie :return: Devuelve la sinopsis de una pelicula o serie
:rtype: str :rtype: str
""" """
resultado = {}
ret = "" ret = ""
if 'id' in self.result: if 'id' in self.result:
@@ -994,19 +1109,13 @@ class Tmdb(object):
url = ('http://api.themoviedb.org/3/%s/%s?api_key=6889f6089877fd092454d00edb44a84d&language=%s' % url = ('http://api.themoviedb.org/3/%s/%s?api_key=6889f6089877fd092454d00edb44a84d&language=%s' %
(self.busqueda_tipo, self.busqueda_id, self.busqueda_idioma)) (self.busqueda_tipo, self.busqueda_id, self.busqueda_idioma))
try:
resultado = jsontools.load(scrapertools.downloadpageWithoutCookies(url)) resultado = self.get_json(url)
except:
pass
if 'overview' in resultado: if 'overview' in resultado:
self.result['overview'] = resultado['overview'] self.result['overview'] = resultado['overview']
ret = self.result['overview'] ret = self.result['overview']
if "status_code" in resultado:
msg = "Error de tmdb: %s %s" % (resultado["status_code"], resultado["status_message"])
logger.debug(msg)
return ret return ret
def get_poster(self, tipo_respuesta="str", size="original"): def get_poster(self, tipo_respuesta="str", size="original"):
@@ -1133,18 +1242,22 @@ class Tmdb(object):
buscando = "id_Tmdb: " + str(self.result["id"]) + " temporada: " + str(numtemporada) + "\nURL: " + url buscando = "id_Tmdb: " + str(self.result["id"]) + " temporada: " + str(numtemporada) + "\nURL: " + url
logger.info("[Tmdb.py] Buscando " + buscando) logger.info("[Tmdb.py] Buscando " + buscando)
try: try:
self.temporada[numtemporada] = jsontools.load(scrapertools.downloadpageWithoutCookies(url)) # self.temporada[numtemporada] = jsontools.load(scrapertools.downloadpageWithoutCookies(url))
except: self.temporada[numtemporada] = self.get_json(url)
self.temporada[numtemporada] = {"status_code": 15, "status_message": "Failed"}
if "status_code" in self.temporada[numtemporada]: except:
# Se ha producido un error logger.error("No se ha podido obtener la temporada")
msg = "La busqueda de " + buscando + " no dio resultados." self.temporada[numtemporada] = {"status_code": 15, "status_message": "Failed"}
msg += "\nError de tmdb: %s %s" % (
self.temporada[numtemporada]["status_code"], self.temporada[numtemporada]["status_message"])
logger.debug(msg)
self.temporada[numtemporada] = {"episodes": {}} self.temporada[numtemporada] = {"episodes": {}}
# if "status_code" in self.temporada[numtemporada]:
# # Se ha producido un error
# msg = "La busqueda de " + buscando + " no dio resultados."
# msg += "\nError de tmdb: %s %s" % (
# self.temporada[numtemporada]["status_code"], self.temporada[numtemporada]["status_message"])
# logger.debug(msg)
# self.temporada[numtemporada] = {"episodes": {}}
return self.temporada[numtemporada] return self.temporada[numtemporada]
def get_episodio(self, numtemporada=1, capitulo=1): def get_episodio(self, numtemporada=1, capitulo=1):
@@ -1242,10 +1355,8 @@ class Tmdb(object):
# Primera búsqueda de videos en el idioma de busqueda # Primera búsqueda de videos en el idioma de busqueda
url = "http://api.themoviedb.org/3/%s/%s/videos?api_key=6889f6089877fd092454d00edb44a84d&language=%s" \ url = "http://api.themoviedb.org/3/%s/%s/videos?api_key=6889f6089877fd092454d00edb44a84d&language=%s" \
% (self.busqueda_tipo, self.result['id'], self.busqueda_idioma) % (self.busqueda_tipo, self.result['id'], self.busqueda_idioma)
try:
dict_videos = jsontools.load(scrapertools.downloadpageWithoutCookies(url)) dict_videos = self.get_json(url)
except:
pass
if dict_videos['results']: if dict_videos['results']:
dict_videos['results'] = sorted(dict_videos['results'], key=lambda x: (x['type'], x['size'])) dict_videos['results'] = sorted(dict_videos['results'], key=lambda x: (x['type'], x['size']))
@@ -1255,19 +1366,13 @@ class Tmdb(object):
if self.busqueda_idioma != 'en': if self.busqueda_idioma != 'en':
url = "http://api.themoviedb.org/3/%s/%s/videos?api_key=6889f6089877fd092454d00edb44a84d" \ url = "http://api.themoviedb.org/3/%s/%s/videos?api_key=6889f6089877fd092454d00edb44a84d" \
% (self.busqueda_tipo, self.result['id']) % (self.busqueda_tipo, self.result['id'])
try:
dict_videos = jsontools.load(scrapertools.downloadpageWithoutCookies(url)) dict_videos = self.get_json(url)
except:
pass
if dict_videos['results']: if dict_videos['results']:
dict_videos['results'] = sorted(dict_videos['results'], key=lambda x: (x['type'], x['size'])) dict_videos['results'] = sorted(dict_videos['results'], key=lambda x: (x['type'], x['size']))
self.result["videos"].extend(dict_videos['results']) self.result["videos"].extend(dict_videos['results'])
if "status_code" in dict_videos:
msg = "Error de tmdb: %s %s" % (dict_videos["status_code"], dict_videos["status_message"])
logger.debug(msg)
# Si las busqueda han obtenido resultados devolver un listado de objetos # Si las busqueda han obtenido resultados devolver un listado de objetos
for i in self.result['videos']: for i in self.result['videos']:
if i['site'] == "YouTube": if i['site'] == "YouTube":
@@ -1316,7 +1421,8 @@ class Tmdb(object):
if ret_infoLabels['season'] and self.temporada.get(ret_infoLabels['season']): if ret_infoLabels['season'] and self.temporada.get(ret_infoLabels['season']):
# Si hay datos cargados de la temporada indicada # Si hay datos cargados de la temporada indicada
episodio = -1 episodio = -1
if ret_infoLabels['episode']: episodio = ret_infoLabels['episode'] if ret_infoLabels['episode']:
episodio = ret_infoLabels['episode']
items.extend(self.get_episodio(ret_infoLabels['season'], episodio).items()) items.extend(self.get_episodio(ret_infoLabels['season'], episodio).items())
@@ -1371,8 +1477,10 @@ class Tmdb(object):
ret_infoLabels['imdb_id'] = v ret_infoLabels['imdb_id'] = v
elif k == 'external_ids': elif k == 'external_ids':
if 'tvdb_id' in v: ret_infoLabels['tvdb_id'] = v['tvdb_id'] if 'tvdb_id' in v:
if 'imdb_id' in v: ret_infoLabels['imdb_id'] = v['imdb_id'] ret_infoLabels['tvdb_id'] = v['tvdb_id']
if 'imdb_id' in v:
ret_infoLabels['imdb_id'] = v['imdb_id']
elif k in ['genres', "genre_ids", "genre"]: elif k in ['genres', "genre_ids", "genre"]:
ret_infoLabels['genre'] = self.get_generos(origen) ret_infoLabels['genre'] = self.get_generos(origen)
@@ -1405,7 +1513,7 @@ class Tmdb(object):
elif isinstance(v[0], dict): elif isinstance(v[0], dict):
# {'iso_3166_1': 'FR', 'name':'France'} # {'iso_3166_1': 'FR', 'name':'France'}
for i in v: for i in v:
if i.has_key('iso_3166_1'): if 'iso_3166_1' in i:
pais = Tmdb.dic_country.get(i['iso_3166_1'], i['iso_3166_1']) pais = Tmdb.dic_country.get(i['iso_3166_1'], i['iso_3166_1'])
l_country = list(set(l_country + [pais])) l_country = list(set(l_country + [pais]))
@@ -1421,7 +1529,6 @@ class Tmdb(object):
for crew in v: for crew in v:
l_writer = list(set(l_writer + [crew['name']])) l_writer = list(set(l_writer + [crew['name']]))
elif isinstance(v, str) or isinstance(v, int) or isinstance(v, float): elif isinstance(v, str) or isinstance(v, int) or isinstance(v, float):
ret_infoLabels[k] = v ret_infoLabels[k] = v
+2 -7
View File
@@ -19,12 +19,7 @@ from platformcode import platformtools
HOST = "https://api.thetvdb.com" HOST = "https://api.thetvdb.com"
HOST_IMAGE = "http://thetvdb.com/banners/" HOST_IMAGE = "http://thetvdb.com/banners/"
# comprobación tras el cambio de tipos en config.get_setting TOKEN = config.get_setting("tvdb_token", default="")
if config.get_setting("tvdb_token") is not None:
TOKEN = config.get_setting("tvdb_token")
else:
TOKEN = ""
DEFAULT_LANG = "es" DEFAULT_LANG = "es"
DEFAULT_HEADERS = { DEFAULT_HEADERS = {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
@@ -97,7 +92,7 @@ def find_and_set_infoLabels(item):
otvdb_global = Tvdb(imdb_id=item.infoLabels.get("imdb_id")) otvdb_global = Tvdb(imdb_id=item.infoLabels.get("imdb_id"))
elif not otvdb_global or otvdb_global.get_id() != item.infoLabels['tvdb_id']: elif not otvdb_global or otvdb_global.get_id() != item.infoLabels['tvdb_id']:
otvdb_global = Tvdb(tvdb_id=item.infoLabels['tvdb_id']) # , tipo=tipo_busqueda, idioma_busqueda="es") otvdb_global = Tvdb(tvdb_id=item.infoLabels['tvdb_id'])
if not item.contentSeason: if not item.contentSeason:
p_dialog.update(50, "Buscando información de la serie", "Obteniendo resultados...") p_dialog.update(50, "Buscando información de la serie", "Obteniendo resultados...")
@@ -127,6 +127,11 @@ def run(item=None):
else: else:
return keymaptools.set_key() return keymaptools.set_key()
elif item.action == "script":
from core import tmdb
if tmdb.drop_bd():
platformtools.dialog_notification("Alfa", "caché eliminada", time=2000, sound=False)
# Action in certain channel specified in "action" and "channel" parameters # Action in certain channel specified in "action" and "channel" parameters
else: else:
+7
View File
@@ -48,6 +48,13 @@
<setting label="Botones/Teclas de acceso (Cambios requieren reiniciar Kodi)" type="lsep"/> <setting label="Botones/Teclas de acceso (Cambios requieren reiniciar Kodi)" type="lsep"/>
<setting id="shortcut_key" type="action" label="30999" action="RunPlugin(plugin://plugin.video.alfa/?ew0KICAgICJhY3Rpb24iOiAia2V5bWFwIg0KfQ==)" /> <setting id="shortcut_key" type="action" label="30999" action="RunPlugin(plugin://plugin.video.alfa/?ew0KICAgICJhY3Rpb24iOiAia2V5bWFwIg0KfQ==)" />
<setting type="sep"/>
<setting label="TMDB" type="lsep"/>
<setting id="tmdb_plus_info" type="bool" label="Buscar información extendida (datos de actores) Aumenta el tiempo de búsqueda" default="false"/>
<setting id="tmdb_cache" type="enum" lvalues="No renovar|cada 7 días|cada 30 días" label="Renovar caché" default="2"/>
<setting id="tmdb_threads" type="enum" values="5|10|20" label="Número de hilos" default="2"/>
<setting id="db_clean_tmdb_cache" type="action" label="Pulse para 'Borrar caché' guardada" action="RunPlugin(plugin://plugin.video.alfa/?ew0KICAgICJhY3Rpb24iOiAic2NyaXB0Ig0KfQ==)" />
</category> </category>
</settings> </settings>