Página 9 de 12

Re: Actualizaciones automaticas y channelselector dinamico

Publicado: 15 Dic 2015, 18:41
por SeiTaN
Cmos en la 4.0.4 no están los jsons, bajate los canales del GitHub.

Voy a probar la nueva versión.

Re: Actualizaciones automaticas y channelselector dinamico

Publicado: 15 Dic 2015, 18:45
por Cmos
SeiTaN escribió:Cmos en la 4.0.4 no están los jsons, bajate los canales del GitHub.

Voy a probar la nueva versión.
Sí, sí, eso fue lo primero que hice, los json son iguales que en github, pero como los .py que descomprime el zip son distintos, detecta que se ha actualizado cuando en realidad es la misma versión. No es un problema gordo porque actualizas y punto, pero es lo que dice divadr, que lo que haya en el zip debería ser exactamente igual que lo que hay en github.

Re: Actualizaciones automaticas y channelselector dinamico

Publicado: 15 Dic 2015, 19:07
por SeiTaN
Con la versión update 2, no me encuentra que haya cambiado un canal que tengo personalizado, de hecho no me genera los .json con sha1

Código: Seleccionar todo

19:05:04 T:17024  NOTICE: pelisalacarta.platformcode.launcher multiplatform channel
19:05:04 T:17024  NOTICE: pelisalacarta.platformcode.launcher executing channel 'mainlist' method
19:05:04 T:17024  NOTICE: get_channels_list
19:05:04 T:17024  NOTICE: [get_channels_list] No es necesario regenerar el indice
19:05:04 T:17024  NOTICE: get_servers_list
19:05:04 T:17024  NOTICE: [get_servers_list] No es necesario regenerar el indice
19:05:04 T:17024  NOTICE: [xbmctools.py] renderItems
19:05:04 T:17024  NOTICE: [xbmctools.py] addnewfolderextra( "","updater" , "refresh" , "Actualizaciones", "Buscar actualizaciones de nuevo" , "" , "" , "" , "")
19:05:04 T:17024  NOTICE: [xbmctools.py] addnewfolderextra( "","" , "" , "Actualizaciones", "¡No hay actualizaciones!" , "" , "" , "" , "")
19:05:04 T:8904  NOTICE: Thread BackgroundLoader start, auto delete: false
19:05:04 T:15324   ERROR: XFILE::CDirectory::GetDirectory - Error getting plugin://plugin.video.pelisalacarta/?Serie&action=refresh&category=Actualizaciones&channel=updater&extradata&fanart=C%3a%2fUsers%2fSeiTaN%2fAppData%2fRoaming%2fKodi%2faddons%2fplugin.video.pelisalacarta%2ffanart.jpg&fulltitle=Buscar%20actualizaciones%20de%20nuevo&plot&show&thumbnail&title=Buscar%20actualizaciones%20de%20nuevo&url
19:05:04 T:15324   ERROR: CGUIMediaWindow::GetDirectory(plugin://plugin.video.pelisalacarta/?Serie&action=refresh&category=Actualizaciones&channel=updater&extradata&fanart=C%3a%2fUsers%2fSeiTaN%2fAppData%2fRoaming%2fKodi%2faddons%2fplugin.video.pelisalacarta%2ffanart.jpg&fulltitle=Buscar%20actualizaciones%20de%20nuevo&plot&show&thumbnail&title=Buscar%20actualizaciones%20de%20nuevo&url) failed
19:05:04 T:16868  NOTICE: Thread LanguageInvoker start, auto delete: false
19:05:04 T:16868  NOTICE: -->Python Interpreter Initialized<--
19:05:04 T:16868  NOTICE: pelisalacarta.default init...
19:05:04 T:16868  NOTICE: pelisalacarta.platformcode.launcher run
19:05:04 T:16868  NOTICE: pelisalacarta.core.config.verify_directories_created
19:05:04 T:16868  NOTICE: pelisalacarta.platformcode.launcher extract_parameters
19:05:04 T:16868  NOTICE: pelisalacarta.platformcode.launcher sys.argv=['plugin://plugin.video.pelisalacarta/', '10', '?action=mainlist&category=Actualizaciones&channel=updater']
19:05:04 T:16868  NOTICE: get_params
19:05:04 T:16868  NOTICE: get_params ?action=mainlist&category=Actualizaciones&channel=updater
19:05:04 T:16868  NOTICE: get_params command=action=mainlist
19:05:04 T:16868  NOTICE: get_params command=category=Actualizaciones
19:05:04 T:16868  NOTICE: get_params command=channel=updater
19:05:04 T:16868  NOTICE: get_params {'action': 'mainlist', 'category': 'Actualizaciones', 'channel': 'updater'}
19:05:04 T:16868  NOTICE: pelisalacarta.platformcode.launcher params={'action': 'mainlist', 'category': 'Actualizaciones', 'channel': 'updater'}
19:05:04 T:16868  NOTICE: pelisalacarta.platformcode.launcher fanart=, channel_name=updater, title=, fulltitle=, url=, thumbnail=, plot=, action=mainlist, server=, extra=, subtitle=, category=Actualizaciones, show=, password=
19:05:04 T:16868  NOTICE: pelisalacarta.platformcode.launcher.set_server_list start
19:05:04 T:16868  NOTICE: set_server_list whiteList ['streamcloud', 'powvideo', 'streaminto']
19:05:04 T:16868  NOTICE: set_server_list blackList []
19:05:04 T:16868  NOTICE: pelisalacarta.platformcode.launcher.set_server_list end
19:05:04 T:16868  NOTICE: pelisalacarta.core.channeltools is_adult channel_name=updater
19:05:04 T:16868  NOTICE: pelisalacarta.core.channeltools get_channel_parameters channel_name=updater
19:05:04 T:16868  NOTICE: pelisalacarta.core.channeltools get_channel_parameters updater.xml NOT found
19:05:04 T:16868  NOTICE: pelisalacarta.platformcode.launcher regular_channel_path=C:\Users\SeiTaN\AppData\Roaming\Kodi\addons\plugin.video.pelisalacarta\channels\updater.py
19:05:04 T:16868  NOTICE: pelisalacarta.platformcode.launcher core_channel_path=C:\Users\SeiTaN\AppData\Roaming\Kodi\addons\plugin.video.pelisalacarta\core\updater.py
19:05:04 T:16868  NOTICE: pelisalacarta.platformcode.launcher running channel core.updater C:\Users\SeiTaN\AppData\Roaming\Kodi\addons\plugin.video.pelisalacarta\core\updater.pyo
19:05:04 T:16868  NOTICE: pelisalacarta.platformcode.launcher multiplatform channel
19:05:04 T:16868  NOTICE: pelisalacarta.platformcode.launcher executing channel 'mainlist' method
19:05:04 T:16868  NOTICE: get_channels_list
19:05:04 T:16868  NOTICE: [get_channels_list] No es necesario regenerar el indice
19:05:04 T:16868  NOTICE: get_servers_list
19:05:04 T:16868  NOTICE: [get_servers_list] No es necesario regenerar el indice
19:05:04 T:16868  NOTICE: [xbmctools.py] renderItems
19:05:04 T:16868  NOTICE: [xbmctools.py] addnewfolderextra( "","updater" , "refresh" , "Actualizaciones", "Buscar actualizaciones de nuevo" , "" , "" , "" , "")
19:05:04 T:16868  NOTICE: [xbmctools.py] addnewfolderextra( "","" , "" , "Actualizaciones", "¡No hay actualizaciones!" , "" , "" , "" , "")
19:05:04 T:16896  NOTICE: Thread BackgroundLoader start, auto delete: false

Re: Actualizaciones automaticas y channelselector dinamico

Publicado: 15 Dic 2015, 19:11
por divadr
Que es lo que has modificado? El jspn el .py?

Lo comento porque en los canales, el updater SOLO comprueba el json, cuando descargas la actualización si que descarga los dos json + py

Lo hice asi porque me parece tontería comprobar los dos archivos, y ya que el json es el que lleva el numero de versión, cuando este cambia es que hay una actualización y deben actualizarse los dos

Re: Actualizaciones automaticas y channelselector dinamico

Publicado: 15 Dic 2015, 19:39
por SeiTaN
divadr escribió:Que es lo que has modificado? El jspn el .py?

Lo comento porque en los canales, el updater SOLO comprueba el json, cuando descargas la actualización si que descarga los dos json + py

Lo hice asi porque me parece tontería comprobar los dos archivos, y ya que el json es el que lleva el numero de versión, cuando este cambia es que hay una actualización y deben actualizarse los dos
Vale, entonces es eso, gracias por la explicación.

Re: Actualizaciones automaticas y channelselector dinamico

Publicado: 15 Dic 2015, 20:34
por super_berny
Gracias divadr por tu trabajo.
Antes de nada queria recordaros una premisas q marco nuestro "Gran Lider Espiritual Jesus" (y no, no es el de nazaret) :lol: :lol: :lol:
Los canales han de incluir entre sus parametros/caracteristicas/json (a ver si le buscamos un nombre) "update_url", normalmente este sera: "https://raw.githubusercontent.com/tvala ... n-classic/...", pero se abre la posibilidad de fijar otros repositorios (Github o no, eso esta por decidir). Discutimos bastante sobre esto, ya que a mi me parecia un fallo grave de seguridad, pero me hizo ver q en algunos casos no hay mas remedio por temas de la LPI.
Yo distingia entre canales q se actualizan en el repositorio de Jesus (canales oficiales) y los q lo hacen desde otras fuentes (canales no oficiales) y daba la posibilidad de actualizar solo los oficiales (no quiero darle la llave de mi sistema a cualquiera), pero Jesus me dijo q seria un lio explicar al usuario medio esas diferencias y q debiamos tratar todos los canales por igual. Aqui si q me gustaria oir vuestra opinion.

Bueno, por lo demas voy poco a poco analizando el codigo y de momento solo he podido ver updater.py:
  • Me encanta la linea 295: logger.info("Opciñon seleccionada: No Descargar") :lol: :lol: :lol: Opciñon si alguna vez monto un negocio seguro q le pongo ese nombre :lol: :lol: :lol:
  • Creacion de channels.json (¿no te gustaba list_channels.json? :cry: ): veo la estructura un poco lio, yo la simplificaria.

    Código: Seleccionar todo

    {
        "count": 114, 
        "date": 1450019790.0, 
        "channels": {
            "animeflv": {
    		        "active": true, 
            		"adult": false, 
    	        	"category": [
    		        	"anime"
    		         ], 
    		        "changes": "resueltos problemas utf, libreria requests, pep8 conventions, etc", 
    	        	"date": "24/10/2015", 
    		        "fanart": "", 
    		        "id": "animeflv", 
      		        "include_in_global_search": true, 
    		        "language": "es", 
    		        "name": "Animeflv", 
    		        "sha": "ebd51e52acc64ba5452c3af51344195210969814"
    		        "thumbnail": "", 
    		        "update_url": "", 
    		        "version": "3.0"
            }, 
            "animeid": {
    		         "active": true, 
    		         "adult": false, 
                     ...
  • En el mismo punto, la asignacion de JSONIndex["date"] y JSONIndex["count"] mediante la creacion de listas por compresion queda muy chulo, pero volver a recorrer el listado de canales es innecesario:

    Código: Seleccionar todo

    Lineas 394 a 410:
    	JSONIndex={"list":{}, "date":0, "count":0}
    	for File in os.listdir(ChannelsPath):
    		File = os.path.join(ChannelsPath,File)
    		if File.endswith(".json"):
    			FileData = open(File, 'rb').read()
    			JSONFileData = {}
    			JSONFileData["json"] = json.loads(FileData)["channel"]
    			JSONFileData["sha"] = hashlib.sha1("blob " + str(len(FileData)) + "\0" + FileData).hexdigest()
    			JSONIndex["list"][os.path.basename(File)[:-5]] = JSONFileData
    			if os.path.getmtime(File) > JSONIndex["date"]:
    				JSONIndex["date"] = os.path.getmtime(File)
    			JSONIndex["count"] += 1
    	open(ChannelsIndex,"w").write(json.dumps(JSONIndex, indent=4, sort_keys=True))
    	return JSONIndex["list"]
  • Lo anterior tb es aplicable a get_servers_list()

Re: Actualizaciones automaticas y channelselector dinamico

Publicado: 15 Dic 2015, 21:14
por divadr
Los canales han de incluir entre sus parametros/caracteristicas/json (a ver si le buscamos un nombre) "update_url", normalmente este sera:"https://raw.githubusercontent.com/tvala ... n-classic/...", pero se abre la posibilidad de fijar otros repositorios (Github o no, eso esta por decidir). Discutimos bastante sobre esto, ya que a mi me parecia un fallo grave de seguridad, pero me hizo ver q en algunos casos no hay mas remedio por temas de la LPI. 
Hoy por hoy los json no contienen eseparametro... de todas formas yo no acavo de ver claro como gestionar un updater con varios repositorios con todos los canales juntos... pero seria cuestion de mirarlo...

Por otro lado nos es que no me guste el list_channels.json... solo es que no contiene la informacion q necesito... y necesito que se regenere cuando algun archivo se modifica.... la idea es juntarlo en uno solo.. la estructura no la veo tan liada...

Estoy seguro que es mejorable... y espero que entre todos aporemos ideas

Re: Actualizaciones automaticas y channelselector dinamico

Publicado: 15 Dic 2015, 23:55
por super_berny
divadr escribió:Hoy por hoy los json no contienen eseparametro...
El parametro esta, lo q pasa es q cuando converti los xml en json fije como valor de "update_url" una cadena vacia para todos los canales.
divadr escribió:Por otro lado nos es que no me guste el list_channels.json... solo es que no contiene la informacion q necesito
Me referia al nombre del fichero no a su contenido ;) Pero vamos q no tiene mayor importancia.
divadr escribió: la estructura no la veo tan liada...
Bueno, liada no es la mejor definicion. Pero coincidiras conmigo q no es lo mismo:

Código: Seleccionar todo

316       if "noupdate" in LocalJSONData[file["name"]]["json"]["channel"] and LocalJSONData[file["name"]]["json"]["channel"]["noupdate"] == True:
  
que:

Código: Seleccionar todo

316       if "noupdate" in LocalJSONData[file["name"]] and LocalJSONData[file["name"]]["noupdate"] == True:
   
Por lo demas, tu codigo es como siempre claro, limpio y eficiente. Gracias por compartirlo.

Re: Actualizaciones automaticas y channelselector dinamico

Publicado: 16 Dic 2015, 00:09
por divadr
Bueno, si en ese sentido si que es un poco liado.

La estructura del índice es la siguiente:
tiene 3 claves principales:
date: contiene la fecha de modificación del archivo que sea mas alta
count: el numero de archivos
list: contiene la lista de canales

dentro de list hay dos claves:
sha: contiene el sha del canal
json: contiene el fichero json del canal tal y como esta con todos su niveles... aquí es donde se podría sustituir esto y poner directamente los parámetros leídos del json sin tantos niveles, desde luego es una opción, pero como tampoco se si los json se van a quedar como están o si se van a sustituir, pues de momento lo he cargado tal cual.

En el mismo punto, la asignacion de JSONIndex["date"] y JSONIndex["count"] mediante la creacion de listas por compresion queda muy chulo, pero volver a recorrer el listado de canales es innecesario:
acabo de corregir ese punto, tienes toda la razón, no es necesario listar los directorios tantas veces.

El parametro esta, lo q pasa es q cuando converti los xml en json fije como valor de "update_url" una cadena vacia para todos los canales.
Bueno, a eso me refiero, que no esta la url, de todos modos la update_url, cual seria? la del json, la del .py?

Re: Actualizaciones automaticas y channelselector dinamico

Publicado: 16 Dic 2015, 00:38
por super_berny
divadr escribió:Bueno, si en ese sentido si que es un poco liado.

La estructura del índice es la siguiente:
tiene 3 claves principales:
date: contiene la fecha de modificación del archivo que sea mas alta
count: el numero de archivos
list: contiene la lista de canales

dentro de list hay dos claves:
sha: contiene el sha del canal
json: contiene el fichero json del canal tal y como esta con todos su niveles... aquí es donde se podría sustituir esto y poner directamente los parámetros leídos del json sin tantos niveles, desde luego es una opción, pero como tampoco se si los json se van a quedar como están o si se van a sustituir, pues de momento lo he cargado tal cual.
En mi mensaje anterior te proponia incluir el sha y los parametros obtenidos del canal.json juntos bajo el nombre del canal y todos los canales bajo el indice list (q yo he llamado channels por concretar, pero q es igual), el indice settings del channel.json no es necesario copiarlo aqui. (es mas facil escribir el esquema q explicarlo :D , de echo el codigo q puse ya deberia genera este esquema)
Yo tampoco se si los channel.json se van a quedar asi o no, pero creo q tal y como lo hemos planteado no limitamos q en un futuro se puedan añadir o modificar parametros.
divadr escribió:Bueno, a eso me refiero, que no esta la url, de todos modos la update_url, cual seria? la del json, la del .py?
Digamos q para los "oficiales" (ya se q esta definicion no gusta al jefe :lol: ) update_url = DownloadUrl (de tu updater.py)

Otro tema, creo q no hemos interpretado igual el comentario de cmos:
cmos escribió:Por cierto, creo que no se ha comentado por el hilo, pero me preguntaba si no se debería añadir algún campo en los json para que un canal se incluyera o no dentro de la actualización. Lo digo porque a veces se crea o modifica un canal o servidor que lleva consigo un cambio en una librería o la implementación de una nueva que no se añadiría hasta la siguiente versión por lo que el canal/servidor no sería funcional hasta entonces. Sé que no lo más común, pero puede darse el caso...
Yo entiendo a q se refiere a un canal subido al github q no debe ser descargado con la version actual, ya q necesita la modificacion de alguna "libreria" q no sera distribuida hasta la proxima actualizacion del plugin. En este caso coincido con @seitan y con el propio @cmos q es necesario una rama "develop" en github para estas cosas y dejar master con el codigo funcional de la version distribuida.
Por el contrario creo q tu lo has interpretado como poner un flag (o candado :lol: ) para q un canal o server modificado por mi no sea actualizable (ya q buscas el parametro "noupdate" en los archivos locales en lugar de los remotos)

PD: no me has dicho nada del nombre de mi futura empresa :lol: :lol: :lol: