Página 2 de 4

Re: Scraper Themoviedb para pelisalacarta

Publicado: 17 Oct 2015, 18:24
por robalo
Ya lo sabemos super_berny, con el es.xml se consigue el still y el overview de cada episodio pero el still es de muy baja calidad, se puede hacer como tu la has hecho o siplemente con

Código: Seleccionar todo

        data_lang = agrupa_datos( scrapertools.cache_page( arts[tipo]['url_id_lang'] % id ) )

        patron = "<Episode>.*?<EpisodeNumber>(\d+)</EpisodeNumber>.*?<Overview>([^<]+)</Overview>.*?<SeasonNumber>(\d+)</SeasonNumber>.*?<filename>([^<]+)</filename>"
        episodes = re.compile(patron,re.DOTALL).findall(data_lang)
        for episode, plot, season, still in episodes:
            ret_arts['season-' + season + '-episode-' + episode.zfill(2) + '-plot'] = plot
            ret_arts['season-' + season + '-episode-' + episode.zfill(2) + '-still'] = urlparse.urljoin( arts[tipo]['path_img_tvdb'], still )
A mi me gustaría algo así:
  • Imagen
    Imagen
    Imagen
    Imagen
Esto en una tele grande se ve de muerte :) pero está complicalo el tema de los tiempos y es con rasp ni te cuento

Pero claro, es el tema de siempre, para gusto colores...

Re: Scraper Themoviedb para pelisalacarta

Publicado: 17 Oct 2015, 20:49
por super_berny
robalo, no entiendo tu postura:
robalo escribió:Me gusta el método de neno, yo no tengo problemas con su forma de trabajar sin bifurcaciones, entiendo lo que intenta hacer y el trabajo que le cuesta.
No os tomeis esto como una critica ni ataque personal. Yo tampoco tengo problemas con la forma de trabajar de nadie. Solo comparto ideas que creo pueden facilitar el trabajo.
Si alguien tiene problemas en que comente cosas relativas a sus codigos decirmelo y no los volvere a mirar.
robalo escribió:Ya lo sabemos super_berny, con el es.xml se consigue el still y el overview de cada episodio pero el still es de muy baja calidad
Uff me ha costado saber a que te referias con esto. Al final creo q te refieres al XML q retorna la web http://thetvdb.com, que en este caso yo no utilizo.
Aunque sobre la calidad del still si puedo decirte q es equivalente a la que yo obtengo con tmdb (400x225). Evidentemente baja para usarla como fanart o fondo pero suficiente para usarla como thumbnail (podeis verla junto a la sinopsis en la captura anterior).
robalo escribió: ...se puede hacer como tu la has hecho o siplemente con...
¿Realmente crees q es mas sencillo? Para saber cuanto es 10 veces 5 podemos sumar 10 veces 5 (5+5+5+5+5+5+5+5+5+5=50) o podemos multiplicar 10 por 5 (10x5=50). El resultado es el mismo por lo tanto las dos formas son validas. Tu propones una funcion que hay que añadir a cada canal que quiera tener imagenes extras, yo propongo una calculadora. Los creadores de canales no tienen que preocuparse de como funciona internamente, solo de como usarla (por eso la documento)
Si alguna de las webs q usamos para ello (tvdb, tmdb o fanart.tv) modifica su api o su respuesta ¿que pasara? Tu tendrias q modificar todos los canales que utilicen la funcion, yo solo debo modificar la clase y todos los canales volveran a funcionar.
robalo escribió:...pero está complicalo el tema de los tiempos...
No puedo entrar a analizar cuanto tarda tu funcion por q solo tengo trazas, pero te puedo explicar como funciona la mia (a nivel de conexiones que es lo q mas tarda) para rellenar las sinopsis y thumbnail de una serie de varias temporadas (partimos de que se muestran todos los episodios de las distintas temporadas seguidos, como en tus capturas):
En primer lugar se inicia el objeto y se cargan datos de la serie (1ª conexion).
Con el episodio 1x01 se cargan todos los datos de la temporada 1 (2ª coinexion).
Con el episodio 2x01 se cargan todos los datos de la temporada 2 (3ª coinexion).
Con el episodio 3x01 se cargan todos los datos de la temporada 3 (4ª coinexion).
Es decir hay unicamente una conexion mas que temporadas tenga la serie. Algo totalmente asumible tanto en tiempo como en espacio.
robalo escribió:Pero claro, es el tema de siempre, para gusto colores...
Por supuesto, yo publico mi solucion, explico como usarla, pero no obligo a nadie a usarla.
Y en cuanto a los colores, hace poco no te gustaban nada, preferias las listas espartanas :lol:

Re: Scraper Themoviedb para pelisalacarta

Publicado: 17 Oct 2015, 21:15
por robalo
Yo soy más sencillo y claro que todo eso, resumiendo, para muestra un botón

los episodios con tvdb:
http://robalo.esy.es/pelisalacarta/arts ... -tvdb.html
los episodios con tmdb:
http://robalo.esy.es/pelisalacarta/arts ... -tmdb.html

Re: Scraper Themoviedb para pelisalacarta

Publicado: 17 Oct 2015, 21:38
por super_berny
Pero por que me insistes con tvdb si yo no la uso?

Puedes hacer lo mismo con Homeland?

Re: Scraper Themoviedb para pelisalacarta

Publicado: 18 Oct 2015, 23:43
por robalo
lo cualo?

Creo que te estás confundiendo de persona o caso, yo soy del clan seriesblanco :lol: lista completa sin info, sin fondo y sin nada, sólo título y enlace a lo sumo con idioma

Re: Scraper Themoviedb para pelisalacarta

Publicado: 19 Oct 2015, 14:30
por neno1978
Superberny aquí no creo q nadie tenga problemas con nada ni con nadie , ni con comentar nada de nadie así q no te comas más la cabeza con eso ;) . Y el problema de los tiempos es muy importante,y súmale la calidad, prueba a hacerlo en una rasp y lo veras , y , te aseguro q ese método es bastante más lento, amén de otros problemas . Y si, se puede hacer eso con homeland y además añadirle fanart.tv y , como todos lo habéis dicho pues eso , pa gusto, lo cooooolooooreee arsaaaa!!!

Re: Scraper Themoviedb para pelisalacarta

Publicado: 19 Oct 2015, 23:20
por super_berny
neno1978 escribió:Y el problema de los tiempos es muy importante,y súmale la calidad, prueba a hacerlo en una rasp y lo veras , y , te aseguro q ese método es bastante más lento, amén de otros problemas
Lo siento no tengo rasp para probarlo, pero si aun androidTV de 40€ que no es q vaya muy sobrado.
¿Has hecho pruebas para ver cual de los dos metodos es mas lento? ¿has comprobado cuantas conexiones son necesarias en cada caso? ¿Puedes compartir esos resultados? ¿a que otros problemas te refieres?

Voy a explicar el tema de Homeland: robalo nos colgo 2 paginas para comparar la calidad de las imagenes de la serie The Big Bang Theory obtenidas de tvdb y tmdb. Mi clase obtiene los resultados de tmdb (y de fanart.tv si asi lo deseas) que en su comparativa salia como ganadora en cuanto a calidad ya que las imagenes de los capitulos tenian mayor resolucion. Pero esto no es siempre asi, por ejemplo en las 3 primeras temporadas de Homeland las imagenes de los capitulos (episode images) tienen una resolucion de 400x225 que es la misma que ofrece tvdb.
Por eso le pedi si podia hacer la comparativa de nuevo (las dos paginas) pero en este caso con la serie Homeland.

Re: Scraper Themoviedb para pelisalacarta

Publicado: 20 Oct 2015, 00:14
por robalo
Se que os os váis a partir la caja pero no se porqué pensé que homeland era otra BD como tmdb :lol:

Bueno pues ahí tienes las fotitos de la rubia del pañuelo rojo :D
http://robalo.esy.es/pelisalacarta/arts ... -tmdb.html

Por si os interesa o habéis tenido curiosidad, os pego el script que crea el html que pongo al principio de la función episodios

Código: Seleccionar todo

    ## ------------------------------------------------------------------------------------
    arte = get_arts(item.show, tipo="1")
    lineas = ""
    for key in arte:
        t = "arte['"+key+"'] = %s \n" % arte[key]
        t = re.sub(r"(.*?-still'\]) = (.*?)\n", r'<p>\1<br><img src="\2" /></p>\n', t)
        t = re.sub(r"(.*?-plot'\]) = (.*?)\n", r'<div class="plot-var">\1<br><div class="plot">\2</div></div>\n', t)
        t = re.sub(r"(.*?plot'\]) = (.*?)\n", r'<div class="plot-var">\1<br><div class="plot">\2</div></div>\n', t)
        t = re.sub(r"(.*?'\]) = (.*?)\n", r'<p>\1<br><img src="\2" /></p>\n', t)
        t = re.sub(r"(.*?-still'\]) =\n", r'<p>\1<br><img src="" /></p>\n', t)
        t = re.sub(r"(.*?-plot'\]) =\n", r'<div class="plot-var">\1<br><div class="plot">&nbsp;</div></div>\n', t)
        t = re.sub(r"(.*?'\]) =\n", r'<p>\1<br><img src="" /></p>\n', t)
        lineas+= t

    t = lineas

    c = '<html>\n<head>\n<meta charset="UTF-8">\n<title>%s epi-tmdb</title>\n' % item.show
    c+= "<style>\nbody{background: #ccc;}\nimg{border: solid 1px #000;}\n"
    c+= ".plot-var{text-align: center; color: blue; font-family: courier;}\n"
    c+= ".plot{border: solid 1px #000; margin-left: 10%; text-align: justify; color: #000; width: 80%;}\n"
    c+= "p{text-align: center; color: blue; font-family: courier;}\n</style>\n</head>\n<body>\n"
    p = "</body>\n</html>\n"

    f = open("./arts_test_%s-epi-tmdb.html" % item.show.replace(' ', '_').lower(), "w")
    f.write( c + t + p )
    f.close()
    ## ------------------------------------------------------------------------------------

Re: Scraper Themoviedb para pelisalacarta

Publicado: 20 Oct 2015, 09:35
por super_berny
robalo escribió:Creo que te estás confundiendo de persona o caso...
Se que os os váis a partir la caja pero no se porqué pensé que homeland era otra BD como tmdb :lol:
:lol: :lol: :lol: :lol: Claro ahora todo tiene sentido!!!! :lol: :lol: :lol: :lol:

Muchas gracias por la rubia del pañuelo.
¿Ves a lo que me referia con el tamaño de los still? Desgraciadamente no hay un criterio comun y cada capitulo tiene un tamaño distinto. Por eso no es buena idea utilizarlos como fondo (item.fanart) si quieres mantener cierta calidad en pantallas grandes, mientras q como miniatura (item.thumbnail) si que dan todos la talla.

Re: Scraper Themoviedb para pelisalacarta

Publicado: 16 Nov 2015, 11:13
por Cmos
@super_berny, estoy intentando integrar tu scraper en mi canal inkapelis y me surgen varias dudas:

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 []
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])
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"])
Y ya por último que me vas a matar :lol: . 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:

Có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"]
Espero haberme sabido explicar y a ver qué te parecen mis sugerencias y si me puedes orientar sobre el error raro de los géneros :mrgreen: