Página 1 de 1

Ayuda con Python en Android

Publicado: 27 Jul 2016, 11:15
por dariomo
Hola compañeros.

Tengo un problema, estoy haciendo un sistema de actualizaciones de ficheros... básicamente lo que hace la rutina es leer un fichero de texto alojado en mi nube, verifica las versiones y si estas son diferentes (o no existe el fichero local que aloja la versión -por lo tanto es nuevo-)... lo sustituye... eso en la 1ª vez, en la 2ª si la versión es diferente, pero el fichero ya existe, primero me hace una copia de sguridad y después lo sustituye...

Si las versiones son IGUALES... no DEBE hacer nada.

Pues aquí es donde tengo mi problema, en Windows 7Pro+Kodi 16.1 me lo hace a la perfección... pero en Android con SPMC 16.3 con libreria de SuperCeleron aunque las versiones sean iguales, vuelve a actualizarlo y sacarme los mensajes de actualización cada vez que entro... le he dado mil vueltas y no veo xq no funciona... a ver si alguno de vosotros (que sois unos máquinas) me puede ayudar... os suministro todo para que podais probar:

Rutina:

Código: Seleccionar todo

# -*- coding: utf-8 -*-
#---------------------------------------------------------------------
# License: GPL (http://www.gnu.org/licenses/gpl-3.0.html)
# Gracias a las librerías de Jesús (www.mimediacenter.info)
#---------------------------------------------------------------------


import os, sys, urllib, urllib2, re, shutil
import xbmc, xbmcgui, xbmcaddon, xbmcplugin
import plugintools
from core.item import Item
from core import scrapertools

addonName           = xbmcaddon.Addon().getAddonInfo("name")
addonVersion        = xbmcaddon.Addon().getAddonInfo("version")
addonId             = xbmcaddon.Addon().getAddonInfo("id")
addonPath           = xbmcaddon.Addon().getAddonInfo("path")


home = xbmcaddon.Addon().getAddonInfo('path')+'/'
playlists = xbmc.translatePath(os.path.join('special://userdata/playlists', ''))
temp = xbmc.translatePath(os.path.join('special://userdata/playlists/tmp/', ''))
addons = xbmc.translatePath(os.path.join('special://home/addons/', ''))
mi_userdata = xbmc.translatePath(os.path.join("special://home/userdata/addon_data/plugin.video.pelisalacarta/", ''))
kodi = xbmc.translatePath(os.path.join('special://home/', ''))
backup_fich = xbmc.translatePath(os.path.join('special://home/userdata/addon_data/plugin.video.pelisalacarta/downloads/', ''))

# Comprobamos qué versión es la más reciente
def check_update():
    #Este Trae la vesión v01 de los ficheros, al no existir la 1ª vez, los añade pero no saca copia de seguridad
    Item.url = "https://www.cubbyusercontent.com/pl/UpdaterPrueba.txt/_5f56d12294064b9bab918929795a510c"

    #Este es para la 2ª vez (lo desmarco, y marco el 1º)... con este, al ya existir los ficheros, los debe sustituir y dejar una copia de seguridad del anterior.
    #Item.url = "https://www.cubbyusercontent.com/pl/UpdaterPrueba2.txt/_75a4d994108243978fd633b4153baac3"

    data = scrapertools.cache_page(Item.url)
    plugintools.log("*************************** "+data)	

    plotter="";datamovie = {}
    subchannel = plugintools.find_multiple_matches(data, '<subchannel>(.*?)</subchannel>')
    i = 0
    plugintools.log("***************************I= ")	
    plugintools.log(str(len(subchannel)))	
    plugintools.log("***************************I= "+str(i))	
    for entry in subchannel:
        try:
            plugintools.log("********************entry: "+entry+"***********************")	
            title = plugintools.find_single_match(entry, '<name>(.*?)</name>')
            url = plugintools.find_single_match(entry, '<url>(.*?)</url>')
            thumbnail = plugintools.find_single_match(entry, '<thumbnail>(.*?)</thumbnail>')
            version = plugintools.find_single_match(entry, '<version>(.*?)</version>')
            nom_fichero = plugintools.find_single_match(entry, '<fichero>(.*?)</fichero>')
            fanart = plugintools.find_single_match(entry, '<fanart>(.*?)</fanart>')
            forzado = plugintools.find_single_match(entry, '<forzado>(.*?)</forzado>')
            clase = plugintools.find_single_match(entry, '<clase>(.*?)</clase>').upper()
            ruta = plugintools.find_single_match(entry, '<ruta>(.*?)</ruta>')
            datamovie["Plot"] = '[COLOR white]'+plugintools.find_single_match(entry, '<changelog>(.*?)</changelog>')+'[/COLOR]'
			
            fich_verif = mi_userdata+title.replace(".","_").replace(" ","_")+".upd"
            fich_verif = xbmc.translatePath(os.path.join(fich_verif))
            plugintools.log("fich_verif: "+fich_verif)	
            actualizo = True
            if os.path.exists(fich_verif):  # Si ya hay fichero de verificación, leo la versión
                file_version=open(fich_verif, "r")
                ult_version = file_version.read()
                file_version.close()
                if version == ult_version:
                    plugintools.log("*************LA VERSION ES IGUAL!!!!**********************")
                    fichero = xbmc.translatePath(os.path.join(kodi+ruta+'/'+nom_fichero))
                    #if os.path.isfile(fichero):  # Ya tiene ese fichero/plugin de antes
                    if os.path.exists(fichero):  # Ya tiene ese fichero/plugin de antes
                       actualizo = False
                    else:                   					
                       actualizo = True  # Por algún motivo, aunq existe el de verificación, se ha borrado el fichero... así q lo repongo
                else:	
                    actualizo = True
            else:
                plugintools.log("*************fich_existente: "+kodi+ruta+'/'+nom_fichero)	
                fichero = xbmc.translatePath(os.path.join(kodi+ruta+'/'+nom_fichero))
                if os.path.exists(fichero):  # Ya tiene ese fichero/plugin de antes
                #if os.path.isfile(fichero):  # Ya tiene ese fichero/plugin de antes
                     if forzado.upper() == "SI":  # Anunq ya lo tenga, considero necesario cambiarlo x el mío
                         actualizo = True
                     else:                        # No considero necesario reemplazarlo.
                         actualizo = False
                else:                            # Si no lo tiene, evidentemente lo instalo
                     actualizo = True				
					
            if actualizo:
                if clase == "FICHERO":
                    plugintools.log("*************VOY A ENTRAR*****************")	
                    actualiza_fich(title, nom_fichero, ruta, url)
                    plugintools.log("************* I=I+1 *****************")	
                    i = i + 1

                    plugintools.log("*************fich_verif: "+fich_verif)	
                    #stop()
                    file_version=open(fich_verif, "w+")
                    file_version.write(version)
                    file_version.close()
        except:
            pass       

	if i > 0:
		xbmcgui.Dialog().ok( "¡¡ATENCIÓN" , "Se han producido [COLOR red]"+str(i)+" ACTUALIZACIONES[/COLOR]... se recomienda [COLOR red]REINICIAR[/COLOR] el sistema" )

    return i


def actualiza_fich(title, nom_fichero, ruta, url):
	fich_destino = xbmc.translatePath(os.path.join(backup_fich + nom_fichero))
	plugintools.log("*************fich destino: "+fich_destino)
	#stop()
	#if os.path.isfile(fich_destino):
	if os.path.exists(fich_destino):
		plugintools.log("*************YA EXISTE EL FICH. DESTINO ASI Q LO BORRO Y LE COPIO EL Q HAY AHORA**************")
		os.remove(fich_destino)
		origen = xbmc.translatePath(os.path.join(kodi + ruta + '/' +nom_fichero))
		#destino = xbmc.translatePath(os.path.join(backup_fich + ruta +'/' + nom_fichero))
		destino = xbmc.translatePath(os.path.join(backup_fich + nom_fichero))
		shutil.copyfile(origen , destino)  # Hago el backup del fichero
	
	else:	
		plugintools.log("************NO EXISTE EL FICH DESTINO ASÍ Q LO COPIO**************")
		origen = xbmc.translatePath(os.path.join(kodi + ruta + '/' +nom_fichero))
		plugintools.log("************FICHERO ORIGEN: "+origen+"**************")
		if os.path.exists(origen):
			plugintools.log("************SI ENTRA AQUÍ ES XQ YA EXISTE EN EL PROGRAMA... PERO PUEDE SER NUEVO, ASI Q NO HACE EL COPY PUES DA ERROR**************")
			destino = xbmc.translatePath(os.path.join(backup_fich + nom_fichero))
			shutil.copyfile(origen , destino)  # Hago el backup del fichero
	

	plugintools.log("************DESCARGO E INICIO ACTUALIZACIÓN**************")
	#Ahora descargo el fichero nuevo y lo pongo en su sitio
	progreso = xbmcgui.DialogProgressBG()
	progreso.create("Iniciando actualización... " , nom_fichero )
	#yesno = 0

	r = urllib2.urlopen(url)
	contenido = r.read()
	r.close()
	origen = xbmc.translatePath(os.path.join(temp + nom_fichero))
	destino = xbmc.translatePath(os.path.join(kodi+ruta+"/"+nom_fichero))
	plugintools.log("*************origen: "+origen)	
	plugintools.log("*************destino: "+destino)	
	plugintools.log("*************url: "+url)	

	f = open(origen, "wb")
	f.write(contenido)
	f.close()

	plugintools.log("************LO INTENTO COPIAR**************")

	try:
		progreso.update(50, "Copiando archivo... " , nom_fichero)
		shutil.copyfile(origen, destino)        
		progreso.update(100, "Actualización completada! " , nom_fichero)
		progreso.close()
	except:
		progreso.update(0, "Error al sobreescribir! " , nom_fichero)
		pass       

	try:
		os.remove(origen)
		xbmc.executebuiltin("Notification(%s,%s,%i,%s)" % (addonName, "Actualización completada!", 3 , home+'icon.png'))
		plugintools.log("Completada la actualización de "+nom_fichero)
	except:
		pass
Podeis descargarla aquí: https://www.cubbyusercontent.com/pli/Up ... c444be711b

Los 2 ficheros de texto (para versión1 y versión2) de info. para la actualización, que uso e intercambio para hacer las pruebas, los podeis bajar aquí:

https://www.cubbyusercontent.com/pl/Upd ... 29795a510c

https://www.cubbyusercontent.com/pl/Upd ... b4153baac3

Y la librería pluguinstools. py... q es la de PalcoTV del amigo Juarrox y por lo tanto completamente abierta, la teneis aquí:

https://www.cubbyusercontent.com/pl/plu ... 07e2c61bfb



Espero que alguno pueda ayudarme xq ya me trae loco.

Gracias a todos.

ahhh, he puesto las rutas de pelisalacarta como puro ejemplo, podría ser de cualquier otro plugin.


Saludos.

Re: Ayuda con Python en Android

Publicado: 28 Jul 2016, 09:41
por super_berny
Hola DarioMo,
me encantaria poder ayudarte, pero los enlaces q has puesto no me funcionan.

Re: Ayuda con Python en Android

Publicado: 28 Jul 2016, 12:26
por dariomo
Gracias Super... es curioso, hasta anoche me funcionaban sin problema los links de descarga de Cubby... y hoy me dan error... lo curioso es que yo tengo fibra óptica, así q me dá por "pillarle" (jejeje) el internet a un vecino q tiene Vodafone y con ese sí funcionan las descargas.... he llamado a mi proveedor de internet y les he mandado imagenes de como da error con su conexión y como va bien con otro proveedor... me han dicho q lo van a mirar... te lo digo xq no es problema en sí de Cubby ... de todas formas, lo he pasado todo a Dropbox y aquí os dejo los enlaces:

Rutina .py: https://www.dropbox.com/s/vl61ba18ca6ye ... ba.py?dl=0

Updater Prueba txt: https://www.dropbox.com/s/4wbc6zzm87n2r ... a.txt?dl=0

Updater Prueba2 txt: https://www.dropbox.com/s/xbeosjclg2rad ... 2.txt?dl=0

Plugintools.py: https://www.dropbox.com/s/lgnq31db5xgoe ... ls.py?dl=0

En la rutina updater_prueba.py ya he modificado los links a los ficheros de texto prueba y prueba2 por los de dropbox.


Espero me podáis ayudar xq me trae loco.

Muchas gracias Super_Berny.

Re: Ayuda con Python en Android

Publicado: 28 Jul 2016, 20:00
por super_berny
dariomo escribió:lo curioso es que yo tengo fibra óptica
Yo tb tengo fibra, en mi caso con jazztel por si te sirve de algo. Ademas es curioso pero ya funcionan los enlaces de cubby :shock:

Y ahora vamos al lio:
Lo primero decirte q solo he probado tu codigo en windows de momento y no me funcionaba, asi q he estado mirando y te comento algunas cosas:
  • Utilizas una ruta a "...\Kodi\userdata\playlists\tmp" y en mi caso no existia el directorio de destino. Tambien utilizas la ruta "...\Kodi\userdata\addon_data\plugin.video.pelisalacarta\downloads" Es posible q en Android q esta probando no existan algunas de estas rutas? Seria interesante ahcer una verificacion previa y si no existen las rutas crearlas.
  • En varios puntos del codigo haces:

    Código: Seleccionar todo

    os.path.join(kodi+ruta+'/'+nom_fichero)
    Esto es un error ya q estas suponiendo q el caracter de union de la ruta es siempre "/". En su lugar deberias hacer:

    Código: Seleccionar todo

    os.path.join(kodi , ruta, nom_fichero)
    De este modo se utilizaran las barras correctas y ademas es indiferente si en UpdaterPrueba.txt la url empieza o acaba con barra o no.
dariomo escribió: pero en Android con SPMC 16.3 con libreria de SuperCeleron
No tengo instalada esa version, pero si te sigue fallando puedo probarlo en Kodi original sobre Android.

Re: Ayuda con Python en Android

Publicado: 29 Jul 2016, 11:59
por super_berny
Hola DarioMo,
No se muy bien por q quieres guardar un archivo upd por cada uno de los archivos q quieres actualizar, pero me he permitido hacer algunas modificaciones en tu codigo y proponerte el uso de un solo fichero (json) para guardar las ultimas versiones.
Dentro del codigo hay algunos comentarios mas. Mira a ver si hace exactamente lo q tu querias (cuando actualizar y cuando no, cuando crear backup, etc...)

Puedes probarlo directamente en pelisalacarta descomprimiendo el archivo adjunto ya q he creado tb un canal de pruebas test_DarioMo