# -*- coding: utf-8 -*- # -------------------------------------------------------------------------------- # Updater (kodi) # -------------------------------------------------------------------------------- import os import time import threading from platformcode import config, logger, platformtools from core import httptools from core import jsontools from core import downloadtools from core import ziptools from core import filetools def check_addon_init(): logger.info() # Subtarea de monitor. Se activa cada X horas para comprobar si hay FIXES al addon def check_addon_monitor(): logger.info() # Obtiene el íntervalo entre actualizaciones y si se quieren mensajes try: timer = int(config.get_setting('addon_update_timer')) # Intervalo entre actualizaciones, en Ajustes de Alfa if timer <= 0: return # 0. No se quieren actualizaciones verbose = config.get_setting('addon_update_message') except: timer = 12 # Por defecto cada 12 horas verbose = False # Por defecto, sin mensajes timer = timer * 3600 # Lo pasamos a segundos if config.get_platform(True)['num_version'] >= 14: # Si es Kodi, lanzamos el monitor import xbmc monitor = xbmc.Monitor() else: # Lanzamos solo una actualización y salimos check_addon_updates(verbose) # Lanza la actualización return while not monitor.abortRequested(): # Loop infinito hasta cancelar Kodi check_addon_updates(verbose) # Lanza la actualización if monitor.waitForAbort(timer): # Espera el tiempo programado o hasta que cancele Kodi break # Cancelación de Kodi, salimos return # Lanzamos en Servicio de actualización de FIXES try: threading.Thread(target=check_addon_monitor).start() # Creamos un Thread independiente, hasta el fin de Kodi time.sleep(5) # Dejamos terminar la primera verificación... except: # Si hay problemas de threading, se llama una sola vez try: timer = int(config.get_setting('addon_update_timer')) # Intervalo entre actualizaciones, en Ajustes de Alfa if timer <= 0: return # 0. No se quieren actualizaciones verbose = config.get_setting('addon_update_message') except: verbose = False # Por defecto, sin mensajes pass check_addon_updates(verbose) # Lanza la actualización, en Ajustes de Alfa time.sleep(5) # Dejamos terminar la primera verificación... return def check_addon_updates(verbose=False): logger.info() ADDON_UPDATES_JSON = 'http://extra.alfa-addon.com/addon_updates/updates.json' ADDON_UPDATES_ZIP = 'http://extra.alfa-addon.com/addon_updates/updates.zip' try: last_fix_json = os.path.join(config.get_runtime_path(), 'last_fix.json') # información de la versión fixeada del usuario # Se guarda en get_runtime_path en lugar de get_data_path para que se elimine al cambiar de versión # Descargar json con las posibles actualizaciones # ----------------------------------------------- data = httptools.downloadpage(ADDON_UPDATES_JSON, timeout=2).data if data == '': logger.info('No se encuentran actualizaciones del addon') if verbose: platformtools.dialog_notification('Alfa ya está actualizado', 'No hay ninguna actualización urgente') return False data = jsontools.load(data) if 'addon_version' not in data or 'fix_version' not in data: logger.info('No hay actualizaciones del addon') if verbose: platformtools.dialog_notification('Alfa ya está actualizado', 'No hay ninguna actualización urgente') return False # Comprobar versión que tiene instalada el usuario con versión de la actualización # -------------------------------------------------------------------------------- current_version = config.get_addon_version(with_fix=False) if current_version != data['addon_version']: logger.info('No hay actualizaciones para la versión %s del addon' % current_version) if verbose: platformtools.dialog_notification('Alfa ya está actualizado', 'No hay ninguna actualización urgente') return False if os.path.exists(last_fix_json): lastfix = jsontools.load(filetools.read(last_fix_json)) if lastfix['addon_version'] == data['addon_version'] and lastfix['fix_version'] == data['fix_version']: logger.info('Ya está actualizado con los últimos cambios. Versión %s.fix%d' % (data['addon_version'], data['fix_version'])) if verbose: platformtools.dialog_notification('Alfa ya está actualizado', 'Versión %s.fix%d' % (data['addon_version'], data['fix_version'])) return False # Descargar zip con las actualizaciones # ------------------------------------- localfilename = os.path.join(config.get_data_path(), 'temp_updates.zip') if os.path.exists(localfilename): os.remove(localfilename) downloadtools.downloadfile(ADDON_UPDATES_ZIP, localfilename, silent=True) # Descomprimir zip dentro del addon # --------------------------------- unzipper = ziptools.ziptools() unzipper.extract(localfilename, config.get_runtime_path()) # Borrar el zip descargado # ------------------------ os.remove(localfilename) # Guardar información de la versión fixeada # ----------------------------------------- if 'files' in data: data.pop('files', None) filetools.write(last_fix_json, jsontools.dump(data)) logger.info('Addon actualizado correctamente a %s.fix%d' % (data['addon_version'], data['fix_version'])) if verbose: platformtools.dialog_notification('Alfa actualizado a', 'Versión %s.fix%d' % (data['addon_version'], data['fix_version'])) return True except: logger.error('Error al comprobar actualizaciones del addon!') if verbose: platformtools.dialog_notification('Alfa actualizaciones', 'Error al comprobar actualizaciones') return False