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)