Página 9 de 19

Re: Sobre los pepitos

Publicado: 11 Jun 2014, 22:28
por robalo
tazvader escribió:
gertakari escribió:Pelis OK, las series me fallan en XBMC con los de kruxty
Si, en el fichero de series esta mal el referer.

De todas maneras no dejan de ser parches, es mejor enviar el referer real, no uno fijo.
No creas que no lo he estado probando.
Lo añadí en la función findvideos que es dónde se puede con
ENLACESPEPITO_REQUEST_HEADERS.append(['Referer', item.url)]
y aunque crea bien el referer, no tira. El motivo? no tengo ni idea, estoy muy verde

Lo que si es cierto es que sobrán las cookies, pegué el encabezado de la solicitud completo

Re: Sobre los pepitos

Publicado: 12 Jun 2014, 05:42
por tazvader
Efectivamente, lo unico que le falta al codigo anterior es pasar los referer corectos, el resto de añadidos fijos mejor no ponerlos.
Respecto a passar el referer lo puedes pasar concatenado(con un separador) con la url en item.url y despues separarlo nada mas entrar , y ya tienes url y referer.

Re: Sobre los pepitos

Publicado: 12 Jun 2014, 07:31
por robalo
El problema no es ese, concatenar o no concatenar, la entrada se crea bien. Lo que no llego a entender es por qué la función play no recoge los cambios del header que se hacen en la función findvideos, ya te digo que estoy muy verde, probé con global y no se cuantas historias más. La única solución sencilla que he encontrado para esto es pasarle la url en el argumento item de la siguiente forma:

Declarar al inicio del archivo ENLACESPEPITO_REQUEST_HEADERS = [] (se puede llenar con lo que había si se quiere)
En findvideos añadir a itemlist extra=item.url
Y en play añadir el referer con ENLACESPEPITO_REQUEST_HEADERS.append(['Referer', item.extra])

Cuando me encuentro con cosas de este tipo no mareo y no cambio, elimino o añado nada, sólo las líneas que cambiaron que aunque sobren algunas, hacen que funcionen con la esperanza de que alguien me alumbre y aprenda hacerlo de una forma más mona :)

Re: Sobre los pepitos

Publicado: 14 Jun 2014, 11:59
por gertakari
Estoy intentando modificar el .py de pelis con lo de robalo y me está dando problemas en el script de seguido. ¿modificas solo el de pelis o también el de series?

En concreto al añadir en play el referer con ENLACESPEPITO_REQUEST_HEADERS.append(['Referer', item.extra])

Este es el play definido que tengo en el archivo. ¿Donde lo añado, en la línea 400?

[línea 399] def play(item):
logger.info("[seriespepito.py] play")
itemlist=[]

import seriespepito

mediaurl = seriespepito.get_server_link_peliculas(item.url)

# Busca el vídeo
videoitemlist = servertools.find_video_items(data=mediaurl)
i=1
for videoitem in videoitemlist:
if not "favicon" in videoitem.url:
videoitem.title = "Mirror %d%s" % (i,videoitem.title)
videoitem.fulltitle = item.fulltitle
videoitem.channel=channel=__channel__
videoitem.show = item.show
itemlist.append(videoitem)
i=i+1

return itemlist

# Verificación automática de canales: Esta función debe devolver "True" si está ok el canal.

En cuanto a añarid En findvideos itemlist extra=item.url, ¿quedaría así? itemlist = extra=item.url

Re: Sobre los pepitos

Publicado: 14 Jun 2014, 19:31
por robalo
veo que en la función play tienes

import seriespepito

mediaurl = seriespepito.get_server_link_peliculas(item.url)

Ahora mismo es necesario el referer y si importamos el fichero de seriespepito y ,éste tiene tiene
ENLACESPEPITO_REQUEST_HEADERS.append(['Referer', 'lo que sea'])
no va ha funcionar. No se como lo tendrás.

Te paso el de pelis con lo de item.extra. Éste debería funcionar en xbmc y plex

Re: Sobre los pepitos

Publicado: 14 Jun 2014, 23:28
por gertakari
Muchas gracias robalo por al archivo, así puedo comparar con el mío e intentar aprender un poco más.

El de series tiene referer fijo y ENLACESPEPITO_REQUEST_HEADERS.append(['Referer', 'lo que sea']) "comentado", por lo que con el tuyo funcionan ambas cosas.

El problema ya lo tenía al modificar sobre el mío el código en findvideos, lo que pasa es que si no tocaba el play me entraba hasta la selección de servidor de la película seleccionada. Por eso pensaba que era algo relacionado con la función play, pero ya venía de atrás.

Re: Sobre los pepitos

Publicado: 16 Jun 2014, 14:33
por chopchop
robalo escribió:Lo que no llego a entender es por qué la función play no recoge los cambios del header que se hacen en la función findvideos, ya te digo que estoy muy verde, probé con global y no se cuantas historias más.
Creo que el problema es que el xbmc (a grandes rasgos) cada vez que pulsas en un item relee el .py y genera una nueva instancia del script llamando a la función que le pongas en el "callback" del item.
Al ejecutar la función play, la variable global que has modificado en findvideos vuelve a estar inicializada porque en la nueva instancia no se ha ejecutado findvideos.
Creo que la mejor opción es usar, como has hecho,el parámetro extra para enviar los datos que necesites entre callbacks.

Re: Sobre los pepitos

Publicado: 16 Jun 2014, 19:16
por robalo
Gracias chopchop, va tener que ser eso, así si tiene sentido. En la vesión HTML play si ve los cambios del ENLACESPEPITO_REQUEST_HEADERS.append en findvideos sin usar global ENLACESPEPITO_REQUEST_HEADERS. Osea, cada vez que se llama a findvideos la lista de referer va creciendo :), se tendría que hacer de otra forma. Para el resto de variables 'global' funciona normalmente.

Gracias otra vez

Re: Sobre los pepitos

Publicado: 17 Jun 2014, 10:24
por chopchop
robalo escribió:En la vesión HTML play si ve los cambios del ENLACESPEPITO_REQUEST_HEADERS.append en findvideos sin usar global ENLACESPEPITO_REQUEST_HEADERS. Osea, cada vez que se llama a findvideos la lista de referer va creciendo
No domino mucho Python pero si es como en otros lenguajes supongo que para cambiar los contenidos de una lista global no se necesitará especificar nada, sin embargo para cambiar la lista de raíz por otro objeto seguro que sí.
[...]
He estado haciendo unas pruebas y me ha dado este error al intentar "pisar" una lista dentro ed una función

UnboundLocalError: local variable 'a' referenced before assignment

Lo que me parece un poco confuso es que por un lado considere la variable como local a la función pero venga rellena con los datos de la variable global. Para mí es incongruente y más que variable local yo le llamaría variable de sólo lectura o algo similar.

Con respecto a como pasar el referer te explico un poco cómo lo haría yo:

En programacion el uso de variables globlales es bastante problemático. Todo lo que sea mantener un estado global cambiante puede llevar a muchos errores dificilmente detectables. Lo deseable siempre es tener cajas negras (funciones, métodos, incluso objetos o como quieras llamarlos) que se comporten siempre igual cuando se les pasen los mismos parámetros de entrada.
Así pues lo ideal es mantener un estado local, mucho más manejable y simple en vez de usar variables globales.

Dicha la teoría. La práctica en este caso sería:

Tenemos unas cabeceras de la petición http constantes que no cambian en cada petición. Estas son las que están en la lista ENLACESPEPITO_REQUEST_HEADERS.
Tenemos una cabecera, Referer, que debe estar sólo en algunas peticiones. Esta cabecera se usa en la función "get_server_link" en la función "play". Por lo tanto tenemos que añadir esa cabecera a las constantes para hacer la petición en la función "get_server_link", pero como el dato que necesitamos se saca en la función "findvideos" tenemos que pasarlo de alguna forma.

Se puede pensar en usar la variable global directamente, pero como el Referer se usa en la función "get_server_link" lo ideal es pasar ese dato a la función "play" y seguir la cadena de variables locales para minimizar el cambio en el estado global del programa. Dado como funciona xbmc y su sistema de listas y callbacks no podemos pasar directamente la url como parámetro a la función play.
Afortunadamente tenemos la propiedad extra en el objeto item para pasar la url del Referer desde "findvideos" a "play" cuando el usuario pulsa el item.

En la función "get_server_link" añadimos un segundo parámetro para pasarle el referer. Este referer con el nombre del dominio en la url nos da si el enlace es de tipo series o peliculas, que necesitmos luego.
Dentro de "get_server_link" creamos una lista temporal con los datos constantes y le añadimos el valor del Referer. Hacemos la petición y listo.
De esta forma no modificamos el estado global y hacemos la petición. Así da igual cuantas veces se llame a findvideos que el resultado siempre será el mismo puesto que estamos operando todo el rato sobre datos locales y dada una misma entrada, la url inicial y su refererer, siempre nos da la misma salida.
Espero que en el código se vea más claro.

Código: Seleccionar todo

def play(item):
    logger.info("[seriespepito.py] play")
    itemlist=[]

    # Pasamos la url del referer asignada a item.extra en "findvideos"
    # El referer ya nos dice si es series o peliculas por lo que no necesitamos
    # las funciones get_server_link_series y get_server_link_peliculas
    mediaurl = get_server_link(item.url, item.extra)

    # Busca el vídeo
    [...]
    return itemlist

def get_server_link(first_link, referer):
    logger.info("[seriespepito.py] first_link=" + first_link + ", link_type=" + referer)

    # Sin el Referer da 403
    # Creamos la lista local con las constantes
    # y añadimos el referer de "findvideos" necesario para la petición
    headers = list(ENLACESPEPITO_REQUEST_HEADERS)
    headers.append(['Referer', referer])

    html = scrapertools.downloadpage(first_link, headers = headers)
    logger.info("[seriespepito.py] html="+html)

    # Miramos si es series o películas según el nombre de la url
    if referer.find('.seriespepito.com') != -1:
        link_type = SERIES_PEPITO
    else:
        link_type = PELICULAS_PEPITO

    fixed_link = convert_link(html, link_type)
    logger.info("[seriespepito.py] fixed_link="+fixed_link)

    # Hacemos la última petición con el referer de la página actual
    # Sin referer también funciona pero el navegador lo envía
    headers[-1] = ['Referer', first_link]

    return scrapertools.get_header_from_response(fixed_link, header_to_get="location", headers = headers)

Re: Sobre los pepitos

Publicado: 17 Jun 2014, 22:56
por Türme
Hola,

Una consulta, en el plex me funciona muy bien los cambian que han hecho en seriespepito, el problema es en Wiimc; cambio el archivo pero al acceder desde Wiimc se actualiza y me vuelve a colocar el seriespepito original, ¿hay alguna forma de que no se actualice, o de subirle el numero al archivo parcheado para que crea que está actualizado?

Gracias.