Completamente de acuerdo.Cmos escribió: En primer lugar, me he encontrado con que cuando haces una búsqueda con tmdb y quieres sacar el thumbnail/poster con la función get_poster(), a veces se produce un error porque devuelve un objeto NoneType en vez de str. Me he fijado que es porque cuando un resultado no tiene poster, en lugar de aparecer en el json como una cadena vacía, aparece como None (u'poster_path': None), pero dentro de get_poster se hace una comparación con una cadena vacía, por lo que da el error "cannot concatenate 'str' and 'NoneType' objects" y sale del try. Yo lo he solucionado así, pero no sé si este cambio puede afectar a otra cosa:
Código: Seleccionar todo
def get_poster(self, tipo_respuesta="str", size="original"): ret=[] if not size in ("w45", "w92", "w154", "w185", "w300", "w342", "w500", "w600", "h632", "w780", "w1280", "original"): size="original" if self.result["poster_path"] is None: self.result["poster_path"] = "" --->Aquí es donde comprueba si es None y si es así lo convierte a un string vacío. if tipo_respuesta !='list': if self.result["poster_path"] !="": ---> Aquí es donde da el error que comento return 'http://image.tmdb.org/t/p/' + size + self.result["poster_path"] else: return "" elif self.result["id"] == "": return []
Completamente de acuerdo tb.Cmos escribió:Luego, he estado probando la función load_resultado(), y entre los if que encadena, creo que falta la opción de que haga algo cuando index_resultado sea superior a 0 y page sea igual que self.page. No sé si así estaría bien pero a mí me ha dado resultado:
Código: Seleccionar todo
def load_resultado(self,index_resultado=0,page=1): if self.total_results <= 1: # Si no hay mas un resultado no podemos cambiar return None if page < 1 or page > self.total_pages: page=1 if index_resultado < 0: index_resultado=0 if page !=self.page: self.__inicializar() self.__search(index_resultado=index_resultado, page=page) else: --->A partir de aquí lo que he añadido self.__leer_resultado(self.results[index_resultado])
Esto es dificil de decir sin ver el resto del codigo. De todos modos estoy rehaciendo lo q tiene q ver con los generos.Cmos escribió: También me pasa una cosa que en esto estoy seguro de que soy yo el que lo está haciendo mal. Cuando saco los géneros de una película y los agrego con infoLabels, veo que en cada item se van concatenando los de las anteriores, es decir, si por ejemplo la primera peli tiene "Comedia, Acción" y la segunda "Guerra", en la primera sale bien en kodi, pero en la segunda saldría "Comedia, Acción, Guerra". Este es el código que utilizo para ello, ¿cuál puede ser el fallo?
Código: Seleccionar todo
infoLabels['genre'] = ", ".join(oTmdb.result["genres"])
Te explicas perfectamente y de matarte nada, todo lo contrario agradezco no solo q detectes los bugs, si no q ademas aportes soluciones.Cmos escribió: Y ya por último que me vas a matar. He notado que tarda bastante en hacer el scraper de las películas (unos 26-27 segundos), en el caso de mi canal que tiene unas 40 por página. Mirando el log me he dado cuenta que antes de cada búsqueda en tmdb carga una url para rellenar el diccionario de géneros, por lo que en lugar de cargar 40 páginas, carga el doble. Viendo eso se me ocurrió que se podría crear el diccionario con los generos directamente como variable en el tmdb.py y no tener que cargar la misma página una y otra vez. Imagino que lo hiciste así para cargar el diccionario según el idioma de la búsqueda, pero he pensado que se podría crear dos diccionarios, uno en español y otro en inglés pues suelen ser lo más utilizados y si se hace la búsqueda en otro idioma, entonces sí rellenar de esa manera el diccionario. He hecho la prueba y pasa de, como decía, 26-27 segundos, a unos 13-14, a mí modo de ver la diferencia merece la pena. Te pongo cómo lo he puesto para verlo más claro:
Espero haberme sabido explicar y a ver qué te parecen mis sugerencias y si me puedes orientar sobre el error raro de los génerosCódigo: Seleccionar todo
----Dentro del constructor de la clase linea 107 temporada={} lista_generos_ES=[{u'id': 28, u'name': 'Acci\xc3\xb3n'},.... lista_generos_EN=[{u'id': 28, u'name': 'Action'},.... -------- En el init def __init__(self, **kwargs): self.__inicializar() self.busqueda["idioma"]=kwargs.get('idioma_busqueda','es') self.busqueda["tipo"]=kwargs.get('tipo','movie') if self.busqueda["tipo"] =='movie' or self.busqueda["tipo"] =="tv": # Rellenar diccionario de generos en el idioma seleccionado url='http://api.themoviedb.org/3/genre/%s/list?api_key=57983e31fb435df4df77afb854740ea9&language=%s' %(self.busqueda["tipo"], self.busqueda["idioma"]) if self.busqueda["idioma"] == "es": lista_generos = self.lista_generos_ES elif self.busqueda["idioma"] == "en": lista_generos = self.lista_generos_EN else: lista_generos = self.__get_json(url)["genres"] for i in lista_generos: self.dic_generos[str(i["id"])]=i ["name"]
Y hablando de soluciones esta ultima si q no me acaba de convencer. En primer lugar la busqueda es por idioma y tipo de contenido (y tu solo consideras el idioma). Pero lo mas gracioso es q o bien la Api ha cambiado o bien yo estaba pensando en no se q cuando hice esta parte. Lo tengo q mirar mejor, pero creo q no hace falta ningun diccionario. Dejame q lo mire con mas cariño ...
Por otra parte, creo q buscar los datos de las 40 peliculas del listado inicial es un poco heavy. Yo lo q aconsejo es hacer la busqueda cuando ya se ha seleccionado un contenido en concreto: Cuando has de mostrar servidores de video en Peliculas o cuando en las Series, has de visualizar temporadas (o listado completo de capitulos, segun el caso) . Asi es mucho mas fluido.