def get_environment(): """ Devuelve las variables de entorno del OS, de Kodi y de Alfa más habituales, necesarias para el diagnóstico de fallos """ try: import base64 import ast environment = config.get_platform(full_version=True) environment['num_version'] = str(environment['num_version']) environment['python_version'] = str(platform.python_version()) environment['os_release'] = str(platform.release()) if xbmc.getCondVisibility("system.platform.Windows"): try: if platform._syscmd_ver()[2]: environment['os_release'] = str(platform._syscmd_ver()[2]) except: pass environment['prod_model'] = '' if xbmc.getCondVisibility("system.platform.Android"): environment['os_name'] = 'Android' try: for label_a in subprocess.check_output('getprop').split('\n'): if 'build.version.release' in label_a: environment['os_release'] = str( scrapertools.find_single_match( label_a, ':\s*\[(.*?)\]$')) if 'product.model' in label_a: environment['prod_model'] = str( scrapertools.find_single_match( label_a, ':\s*\[(.*?)\]$')) except: try: for label_a in filetools.read(os.environ['ANDROID_ROOT'] + '/build.prop').split(): if 'build.version.release' in label_a: environment['os_release'] = str( scrapertools.find_single_match( label_a, '=(.*?)$')) if 'product.model' in label_a: environment['prod_model'] = str( scrapertools.find_single_match( label_a, '=(.*?)$')) except: pass elif xbmc.getCondVisibility("system.platform.Linux.RaspberryPi"): environment['os_name'] = 'RaspberryPi' else: environment['os_name'] = str(platform.system()) environment['machine'] = str(platform.machine()) environment['architecture'] = str(sys.maxsize > 2**32 and "64-bit" or "32-bit") environment['language'] = str(xbmc.getInfoLabel('System.Language')) environment['cpu_usage'] = str(xbmc.getInfoLabel('System.CpuUsage')) environment['mem_total'] = str( xbmc.getInfoLabel('System.Memory(total)')).replace('MB', '').replace( 'KB', '') environment['mem_free'] = str( xbmc.getInfoLabel('System.Memory(free)')).replace('MB', '').replace( 'KB', '') if not environment['mem_total'] or not environment['mem_free']: try: if environment['os_name'].lower() == 'windows': kernel32 = ctypes.windll.kernel32 c_ulong = ctypes.c_ulong c_ulonglong = ctypes.c_ulonglong class MEMORYSTATUS(ctypes.Structure): _fields_ = [('dwLength', c_ulong), ('dwMemoryLoad', c_ulong), ('dwTotalPhys', c_ulonglong), ('dwAvailPhys', c_ulonglong), ('dwTotalPageFile', c_ulonglong), ('dwAvailPageFile', c_ulonglong), ('dwTotalVirtual', c_ulonglong), ('dwAvailVirtual', c_ulonglong), ('availExtendedVirtual', c_ulonglong)] memoryStatus = MEMORYSTATUS() memoryStatus.dwLength = ctypes.sizeof(MEMORYSTATUS) kernel32.GlobalMemoryStatus(ctypes.byref(memoryStatus)) environment['mem_total'] = str( old_div(int(memoryStatus.dwTotalPhys), (1024**2))) environment['mem_free'] = str( old_div(int(memoryStatus.dwAvailPhys), (1024**2))) else: with open('/proc/meminfo') as f: meminfo = f.read() environment['mem_total'] = str( old_div( int( re.search(r'MemTotal:\s+(\d+)', meminfo).groups()[0]), 1024)) environment['mem_free'] = str( old_div( int( re.search(r'MemAvailable:\s+(\d+)', meminfo).groups()[0]), 1024)) except: environment['mem_total'] = '' environment['mem_free'] = '' try: environment['kodi_buffer'] = '20' environment['kodi_bmode'] = '0' environment['kodi_rfactor'] = '4.0' if filetools.exists( filetools.join(xbmc.translatePath("special://userdata"), "advancedsettings.xml")): advancedsettings = filetools.read( filetools.join(xbmc.translatePath("special://userdata"), "advancedsettings.xml")).split('\n') for label_a in advancedsettings: if 'memorysize' in label_a: environment['kodi_buffer'] = str( old_div( int( scrapertools.find_single_match( label_a, '>(\d+)<\/')), 1024**2)) if 'buffermode' in label_a: environment['kodi_bmode'] = str( scrapertools.find_single_match( label_a, '>(\d+)<\/')) if 'readfactor' in label_a: environment['kodi_rfactor'] = str( scrapertools.find_single_match( label_a, '>(.*?)<\/')) except: pass environment['userdata_path'] = str( xbmc.translatePath(config.get_data_path())) try: if environment['os_name'].lower() == 'windows': free_bytes = ctypes.c_ulonglong(0) ctypes.windll.kernel32.GetDiskFreeSpaceExW( ctypes.c_wchar_p(environment['userdata_path']), None, None, ctypes.pointer(free_bytes)) environment['userdata_free'] = str( round(float(free_bytes.value) / (1024**3), 3)) else: disk_space = os.statvfs(environment['userdata_path']) if not disk_space.f_frsize: disk_space.f_frsize = disk_space.f_frsize.f_bsize environment['userdata_free'] = str(round((float(disk_space.f_bavail) / \ (1024 ** 3)) * float(disk_space.f_frsize), 3)) except: environment['userdata_free'] = '?' try: environment['videolab_series'] = '?' environment['videolab_episodios'] = '?' environment['videolab_pelis'] = '?' environment['videolab_path'] = str( xbmc.translatePath(config.get_videolibrary_path())) if filetools.exists(filetools.join(environment['videolab_path'], \ config.get_setting("folder_tvshows"))): environment['videolab_series'] = str(len(filetools.listdir(filetools.join(environment['videolab_path'], \ config.get_setting( "folder_tvshows"))))) counter = 0 for root, folders, files in filetools.walk(filetools.join(environment['videolab_path'], \ config.get_setting("folder_tvshows"))): for file in files: if file.endswith('.strm'): counter += 1 environment['videolab_episodios'] = str(counter) if filetools.exists(filetools.join(environment['videolab_path'], \ config.get_setting("folder_movies"))): environment['videolab_pelis'] = str(len(filetools.listdir(filetools.join(environment['videolab_path'], \ config.get_setting( "folder_movies"))))) except: pass try: video_updates = ['No', 'Inicio', 'Una vez', 'Inicio+Una vez'] environment['videolab_update'] = str( video_updates[config.get_setting("update", "videolibrary")]) except: environment['videolab_update'] = '?' try: if environment['os_name'].lower() == 'windows': free_bytes = ctypes.c_ulonglong(0) ctypes.windll.kernel32.GetDiskFreeSpaceExW( ctypes.c_wchar_p(environment['videolab_path']), None, None, ctypes.pointer(free_bytes)) environment['videolab_free'] = str( round(float(free_bytes.value) / (1024**3), 3)) else: disk_space = os.statvfs(environment['videolab_path']) if not disk_space.f_frsize: disk_space.f_frsize = disk_space.f_frsize.f_bsize environment['videolab_free'] = str(round((float(disk_space.f_bavail) / \ (1024 ** 3)) * float(disk_space.f_frsize), 3)) except: environment['videolab_free'] = '?' environment['torrent_list'] = [] environment['torrentcli_option'] = '' environment['torrent_error'] = '' environment['torrentcli_rar'] = config.get_setting("mct_rar_unpack", server="torrent", default=True) environment['torrentcli_backgr'] = config.get_setting( "mct_background_download", server="torrent", default=True) environment['torrentcli_lib_path'] = config.get_setting( "libtorrent_path", server="torrent", default="") if environment['torrentcli_lib_path']: lib_path = 'Activo' else: lib_path = 'Inactivo' environment['torrentcli_unrar'] = config.get_setting("unrar_path", server="torrent", default="") if environment['torrentcli_unrar']: if xbmc.getCondVisibility("system.platform.Android"): unrar = 'Android' else: unrar, bin = filetools.split(environment['torrentcli_unrar']) unrar = unrar.replace('\\', '/') if not unrar.endswith('/'): unrar = unrar + '/' unrar = scrapertools.find_single_match( unrar, '\/([^\/]+)\/$').capitalize() else: unrar = 'Inactivo' torrent_id = config.get_setting("torrent_client", server="torrent", default=0) environment['torrentcli_option'] = str(torrent_id) torrent_options = platformtools.torrent_client_installed() if lib_path == 'Activo': torrent_options = ['MCT'] + torrent_options torrent_options = ['BT'] + torrent_options environment['torrent_list'].append({'Torrent_opt': str(torrent_id), 'Libtorrent': lib_path, \ 'RAR_Auto': str(environment['torrentcli_rar']), \ 'RAR_backgr': str(environment['torrentcli_backgr']), \ 'UnRAR': unrar}) environment['torrent_error'] = config.get_setting("libtorrent_error", server="torrent", default="") if environment['torrent_error']: environment['torrent_list'].append( {'Libtorrent_error': environment['torrent_error']}) for torrent_option in torrent_options: cliente = dict() cliente['D_load_Path'] = '' cliente['Libre'] = '?' cliente['Plug_in'] = torrent_option.replace('Plugin externo: ', '') if cliente['Plug_in'] == 'BT': cliente['D_load_Path'] = str( config.get_setting("bt_download_path", server="torrent", default='')) if not cliente['D_load_Path']: continue cliente['Buffer'] = str( config.get_setting("bt_buffer", server="torrent", default=50)) elif cliente['Plug_in'] == 'MCT': cliente['D_load_Path'] = str( config.get_setting("mct_download_path", server="torrent", default='')) if not cliente['D_load_Path']: continue cliente['Buffer'] = str( config.get_setting("mct_buffer", server="torrent", default=50)) elif xbmc.getCondVisibility('System.HasAddon("plugin.video.%s")' % cliente['Plug_in']): __settings__ = xbmcaddon.Addon(id="plugin.video.%s" % cliente['Plug_in']) cliente['Plug_in'] = cliente['Plug_in'].capitalize() if cliente['Plug_in'] == 'Torrenter': cliente['D_load_Path'] = str( xbmc.translatePath(__settings__.getSetting('storage'))) if not cliente['D_load_Path']: cliente['D_load_Path'] = str(filetools.join(xbmc.translatePath("special://home/"), \ "cache", "xbmcup", "plugin.video.torrenter", "Torrenter")) cliente['Buffer'] = str( __settings__.getSetting('pre_buffer_bytes')) else: cliente['D_load_Path'] = str( xbmc.translatePath( __settings__.getSetting('download_path'))) cliente['Buffer'] = str( __settings__.getSetting('buffer_size')) if __settings__.getSetting( 'download_storage' ) == '1' and __settings__.getSetting('memory_size'): cliente['Memoria'] = str( __settings__.getSetting('memory_size')) if cliente['D_load_Path']: try: if environment['os_name'].lower() == 'windows': free_bytes = ctypes.c_ulonglong(0) ctypes.windll.kernel32.GetDiskFreeSpaceExW( ctypes.c_wchar_p(cliente['D_load_Path']), None, None, ctypes.pointer(free_bytes)) cliente['Libre'] = str(round(float(free_bytes.value) / \ (1024 ** 3), 3)).replace('.', ',') else: disk_space = os.statvfs(cliente['D_load_Path']) if not disk_space.f_frsize: disk_space.f_frsize = disk_space.f_frsize.f_bsize cliente['Libre'] = str(round((float(disk_space.f_bavail) / \ (1024 ** 3)) * float(disk_space.f_frsize), 3)).replace('.', ',') except: pass environment['torrent_list'].append(cliente) environment['proxy_active'] = '' try: proxy_channel_bloqued_str = base64.b64decode( config.get_setting('proxy_channel_bloqued')).decode('utf-8') proxy_channel_bloqued = dict() proxy_channel_bloqued = ast.literal_eval(proxy_channel_bloqued_str) for channel_bloqued, proxy_active in list( proxy_channel_bloqued.items()): if proxy_active != 'OFF': environment['proxy_active'] += channel_bloqued + ', ' except: pass if not environment['proxy_active']: environment['proxy_active'] = 'OFF' environment['proxy_active'] = environment['proxy_active'].rstrip(', ') for root, folders, files in filetools.walk( xbmc.translatePath("special://logpath/")): for file in files: if file.lower() in ['kodi.log', 'jarvis.log', 'spmc.log', 'cemc.log', \ 'mygica.log', 'wonderbox.log', 'leiapp,log', \ 'leianmc.log', 'kodiapp.log', 'anmc.log', \ 'latin-anmc.log']: environment['log_path'] = str(filetools.join(root, file)) break else: environment['log_path'] = '' break if environment['log_path']: environment['log_size_bytes'] = str( filetools.getsize(environment['log_path'])) environment['log_size'] = str(round(float(environment['log_size_bytes']) / \ (1024 * 1024), 3)) else: environment['log_size_bytes'] = '' environment['log_size'] = '' environment['debug'] = str(config.get_setting('debug')) environment['addon_version'] = str(config.get_addon_version()) except: logger.error(traceback.format_exc()) environment = {} environment['log_size'] = '' environment['cpu_usage'] = '' environment['python_version'] = '' environment['log_path'] = '' environment['userdata_free'] = '' environment['mem_total'] = '' environment['machine'] = '' environment['platform'] = '' environment['videolab_path'] = '' environment['num_version'] = '' environment['os_name'] = '' environment['video_db'] = '' environment['userdata_path'] = '' environment['log_size_bytes'] = '' environment['name_version'] = '' environment['language'] = '' environment['mem_free'] = '' environment['prod_model'] = '' environment['proxy_active'] = '' environment['architecture'] = '' environment['os_release'] = '' environment['videolab_free'] = '' environment['kodi_buffer'] = '' environment['kodi_bmode'] = '' environment['kodi_rfactor'] = '' environment['videolab_series'] = '' environment['videolab_episodios'] = '' environment['videolab_pelis'] = '' environment['videolab_update'] = '' environment['debug'] = '' environment['addon_version'] = '' environment['torrent_list'] = [] environment['torrentcli_option'] = '' environment['torrentcli_rar'] = '' environment['torrentcli_lib_path'] = '' environment['torrentcli_unrar'] = '' environment['torrent_error'] = '' return environment
def getmainlist(view="thumb_"): logger.info() itemlist = list() if config.dev_mode(): itemlist.append( Item(title="Redirect", channel="checkhost", action="check_channels", thumbnail='', category=config.get_localized_string(30119), viewmode="thumbnails")) # Añade los canales que forman el menú principal if addon.getSetting('enable_news_menu') == "true": itemlist.append( Item(title=config.get_localized_string(30130), channel="news", action="mainlist", thumbnail=get_thumb("news.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", context=[{ "title": config.get_localized_string(70285), "channel": "news", "action": "menu_opciones", "goto": True }])) if addon.getSetting('enable_channels_menu') == "true": itemlist.append( Item(title=config.get_localized_string(30118), channel="channelselector", action="getchanneltypes", thumbnail=get_thumb("channels.png", view), view=view, category=config.get_localized_string(30119), viewmode="thumbnails")) if addon.getSetting('enable_search_menu') == "true": itemlist.append( Item(title=config.get_localized_string(30103), channel="search", path='special', action="mainlist", thumbnail=get_thumb("search.png", view), category=config.get_localized_string(30119), viewmode="list", context=[{ "title": config.get_localized_string(70286), "channel": "search", "action": "opciones", "goto": True }])) if addon.getSetting('enable_onair_menu') == "true": itemlist.append( Item(channel="filmontv", action="mainlist", title=config.get_localized_string(50001), thumbnail=get_thumb("on_the_air.png"), viewmode="thumbnails")) if addon.getSetting('enable_link_menu') == "true": itemlist.append( Item(title=config.get_localized_string(70527), channel="kodfavorites", action="mainlist", thumbnail=get_thumb("mylink.png", view), view=view, category=config.get_localized_string(70527), viewmode="thumbnails")) if addon.getSetting('enable_fav_menu') == "true": itemlist.append( Item(title=config.get_localized_string(30102), channel="favorites", action="mainlist", thumbnail=get_thumb("favorites.png", view), category=config.get_localized_string(30102), viewmode="thumbnails")) if config.get_videolibrary_support() and addon.getSetting( 'enable_library_menu') == "true": itemlist.append( Item(title=config.get_localized_string(30131), channel="videolibrary", action="mainlist", thumbnail=get_thumb("videolibrary.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", context=[{ "title": config.get_localized_string(70287), "channel": "videolibrary", "action": "channel_config" }])) if downloadenabled != "false": itemlist.append( Item(title=config.get_localized_string(30101), channel="downloads", action="mainlist", thumbnail=get_thumb("downloads.png", view), viewmode="list", context=[{ "title": config.get_localized_string(70288), "channel": "setting", "config": "downloads", "action": "channel_config" }])) thumb_setting = "setting_%s.png" % 0 # config.get_setting("plugin_updates_available") itemlist.append( Item(title=config.get_localized_string(30100), channel="setting", action="mainlist", thumbnail=get_thumb(thumb_setting, view), category=config.get_localized_string(30100), viewmode="list")) itemlist.append( Item(title=config.get_localized_string(30104) + " (v" + config.get_addon_version(with_fix=True) + ")", channel="help", action="mainlist", thumbnail=get_thumb("help.png", view), category=config.get_localized_string(30104), viewmode="list")) return itemlist
def submenu_tools(item): logger.info() itemlist = list() # Herramientas personalizadas import os channel_custom = os.path.join(config.get_runtime_path(), 'channels', 'custom.py') if not filetools.exists(channel_custom): user_custom = os.path.join(config.get_data_path(), 'custom.py') if filetools.exists(user_custom): filetools.copy(user_custom, channel_custom, silent=True) if filetools.exists(channel_custom): itemlist.append( Item(channel='custom', action='mainlist', title='Custom Channel', thumbnail=get_thumb('setting_0.png'), viewType='files')) itemlist.append( Item(action="check_quickfixes", channel=CHANNELNAME, folder=False, plot="Versión actual: {}".format( config.get_addon_version(from_xml=True)), thumbnail=get_thumb("update.png"), title="Comprobar actualizaciones urgentes (Actual: Alfa {})". format(config.get_addon_version(from_xml=True)))) itemlist.append( Item(action="update_quasar", channel=CHANNELNAME, folder=False, thumbnail=get_thumb("update.png"), title="Actualizar addon externo Quasar")) itemlist.append( Item( action="reset_trakt", channel=CHANNELNAME, folder=False, plot= "Reinicia la vinculacion, no se pierden los datos de seguimiento", thumbnail= "https://trakt.tv/assets/logos/white-bg@2x-626e9680c03d0542b3e26c3305f58050d2178e5d4222fac7831d83cf37fef42b.png", title="Reiniciar vinculación con Trakt")) itemlist.append( Item(channel=CHANNELNAME, title=config.get_localized_string(60564) + ":", action="", folder=False, text_bold=True, thumbnail=get_thumb("channels.png"))) itemlist.append( Item(channel=CHANNELNAME, title="- {}".format(config.get_localized_string(60565)), action="conf_tools", folder=True, extra="lib_check_datajson", thumbnail=get_thumb("channels.png"))) if config.get_videolibrary_support(): itemlist.append( Item(channel=CHANNELNAME, title=config.get_localized_string(60566) + ":", action="", folder=False, text_bold=True, thumbnail=get_thumb("videolibrary.png"))) itemlist.append( Item(channel=CHANNELNAME, action="overwrite_tools", folder=False, thumbnail=get_thumb("videolibrary.png"), title="- " + config.get_localized_string(60567))) itemlist.append( Item(channel="videolibrary", action="update_videolibrary", folder=False, thumbnail=get_thumb("videolibrary.png"), title="- " + config.get_localized_string(60568))) return itemlist
def getmainlist(view="thumb_"): logger.info() itemlist = list() # Añade los canales que forman el menú principal itemlist.append( Item(title=config.get_localized_string(30130), channel="news", action="mainlist", thumbnail=get_thumb("news.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", context=[{ "title": config.get_localized_string(70285), "channel": "news", "action": "menu_opciones", "goto": True }])) itemlist.append( Item(title=config.get_localized_string(30118), channel="channelselector", action="getchanneltypes", thumbnail=get_thumb("channels.png", view), view=view, category=config.get_localized_string(30119), viewmode="thumbnails")) itemlist.append( Item(title=config.get_localized_string(70527), channel="alfavorites", action="mainlist", thumbnail=get_thumb("mylink.png", view), view=view, category=config.get_localized_string(70527), viewmode="thumbnails")) itemlist.append( Item(title=config.get_localized_string(30103), channel="search", action="mainlist", thumbnail=get_thumb("search.png", view), category=config.get_localized_string(30119), viewmode="list", context=[{ "title": config.get_localized_string(70286), "channel": "search", "action": "opciones", "goto": True }])) itemlist.append( Item(title=config.get_localized_string(30102), channel="favorites", action="mainlist", thumbnail=get_thumb("favorites.png", view), category=config.get_localized_string(30102), viewmode="thumbnails")) if config.get_videolibrary_support(): itemlist.append( Item(title=config.get_localized_string(30131), channel="videolibrary", action="mainlist", thumbnail=get_thumb("videolibrary.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", context=[{ "title": config.get_localized_string(70287), "channel": "videolibrary", "action": "channel_config" }])) itemlist.append( Item(title=config.get_localized_string(30101), channel="downloads", action="mainlist", thumbnail=get_thumb("downloads.png", view), viewmode="list", context=[{ "title": config.get_localized_string(70288), "channel": "setting", "config": "downloads", "action": "channel_config" }])) thumb_setting = "setting_%s.png" % 0 # config.get_setting("plugin_updates_available") itemlist.append( Item(title=config.get_localized_string(30100), channel="setting", action="mainlist", thumbnail=get_thumb(thumb_setting, view), category=config.get_localized_string(30100), viewmode="list")) itemlist.append( Item(title=config.get_localized_string(30104) + " (" + config.get_localized_string(20000) + " " + config.get_addon_version(with_fix=False) + ")", channel="help", action="mainlist", thumbnail=get_thumb("help.png", view), category=config.get_localized_string(30104), viewmode="list")) return itemlist
def init(): logger.info() """ Todo el código añadido al add-on se borra con cada actualización. Esta función permite restaurarlo automáticamente con cada actualización. Esto permite al usuario tener su propio código, bajo su responsabilidad, y restaurarlo al add-on cada vez que se actualiza. El mecanismo funciona copiando el contenido de la carpeta-arbol "./userdata/addon_data/plugin.video.alfa/custom_code/..." sobre las carpetas de código del add-on. No verifica el contenido, solo vuelca(reemplaza) el contenido de "custom_code". El usuario almacenará en las subcarpetas de "custom_code" su código actualizado y listo para ser copiado en cualquier momento. Si no se desea que copie algo, simplemente se borra de "custom_code" y ya no se copiará en la próxima actualización. Los pasos que sigue esta función, son los siguientes: 1.- La función se llama desde videolibrary_service.py, desde la función inicial: # Copia Custom code a las carpetas de Alfa desde la zona de Userdata from platformcode import custom_code custom_code.init() 2.- En el inicio de Kodi, comprueba si existe la carpeta "custom_code" en "./userdata/addon_data/plugin.video.alfa/". Si no existe, la crea y sale sin más, dando al ususario la posibilidad de copiar sobre esa estructura su código, y que la función la vuelque sobre el add-on en el próximo inicio de Kodi. 3.- En el siguiente inicio de Kodi, comprueba si existe el custom_code.json en la carpeta root del add-on. Si no existe, lo crea con el número de versión del add-on vacío, para permitir que se copien los archivos en esta pasada. 4.- Verifica que el número de versión del add-on es diferente de el de custom_code.json. Si es la misma versión, se sale porque ya se realizo la copia anteriormente. Si la versión es distinta, se realiza el volcado de todos los archivos de la carpeta-árbol "custom_code" sobre el add-on. Si la carpeta de destino no existe, dará un error y se cancelará la copia. Se considera que no tienen sentido nuevas carpetas. 5.- Si la copia ha terminado con éxito, se actualiza el custom_code.json con el número de versión del add-on, para que en inicios sucesivos de Kodi no se realicen las copias, hasta que el add-on cambie de versión. En el número de versión del add-on no se considera el número de fix. Tiempos: Copiando 7 archivos de prueba, el proceso ha tardado una décima de segundo. """ try: #Se realizan algunas funciones con cada nueva versión de Alfa if not filetools.exists( filetools.join(config.get_runtime_path(), 'custom_code.json')): config.set_setting( 'cf_assistant_ua', '') # Se limpia CF_UA. Mejora de rendimiento en httptools CF #Comprime la BD de cache de TMDB para evitar que crezca demasiado bd_tmdb_maintenance() if config.get_setting('tmdb_cache_expire', default=4) == 4: config.set_setting('tmdb_cache_expire', 2) #Verifica si es necsario instalar script.alfa-update-helper verify_script_alfa_update_helper() #Borra el .zip de instalación de Alfa de la carpeta Packages, por si está corrupto, y que así se pueda descargar de nuevo version = 'plugin.video.alfa-%s.zip' % config.get_addon_version( with_fix=False) filetools.remove( filetools.join('special://home', 'addons', 'packages', version), True) #Borrar contenido de carpeta de Torrents y de Subtitles filetools.rmdirtree(filetools.join(config.get_videolibrary_path(), 'temp_torrents_Alfa'), silent=True) subtitle_path = config.get_kodi_setting("subtitles.custompath") if subtitle_path and filetools.exists(subtitle_path): for file in filetools.listdir(subtitle_path): if not file.endswith('.srt'): continue file_path = filetools.join(subtitle_path, file) ret = filetools.remove(file_path, silent=True) if not ret: logger.error('ERROR on REMOVING subtitle: ' + file_path) #Verifica si Kodi tiene algún achivo de Base de Datos de Vídeo de versiones anteriores, entonces los borra verify_Kodi_video_DB() #Verifica si la Base de Datos de Vídeo tiene la fuente de CINE con useFolderNames=1 set_Kodi_video_DB_useFolderNames() #LIBTORRENT: se descarga el binario de Libtorrent cada vez que se actualiza Alfa try: threading.Thread(target=update_libtorrent).start( ) # Creamos un Thread independiente, hasta el fin de Kodi time.sleep(2) # Dejamos terminar la inicialización... except: # Si hay problemas de threading, nos vamos logger.error(traceback.format_exc()) #QUASAR: Preguntamos si se hacen modificaciones a Quasar if not filetools.exists(filetools.join(config.get_data_path(), "quasar.json")) \ and not config.get_setting('addon_quasar_update', default=False): question_update_external_addon("quasar") #QUASAR: Hacemos las modificaciones a Quasar, si está permitido, y si está instalado if config.get_setting('addon_quasar_update', default=False) or \ (filetools.exists(filetools.join(config.get_data_path(), \ "quasar.json")) and not xbmc.getCondVisibility('System.HasAddon("plugin.video.quasar")')): if not update_external_addon("quasar"): platformtools.dialog_notification( "Actualización Quasar", "Ha fallado. Consulte el log") #Existe carpeta "custom_code" ? Si no existe se crea y se sale custom_code_dir = filetools.join(config.get_data_path(), 'custom_code') if not filetools.exists(custom_code_dir): create_folder_structure(custom_code_dir) return else: #Existe "custom_code.json" ? Si no existe se crea custom_code_json_path = config.get_runtime_path() custom_code_json = filetools.join(custom_code_json_path, 'custom_code.json') if not filetools.exists(custom_code_json): create_json(custom_code_json_path) #Se verifica si la versión del .json y del add-on son iguales. Si es así se sale. Si no se copia "custom_code" al add-on verify_copy_folders(custom_code_dir, custom_code_json_path) #Si se han quedado "colgadas" descargas con archivos .RAR, se intenta identificarlos y reactivar el UnRar reactivate_unrar(init=True, mute=True) #Inicia un rastreo de vídeos decargados desde .torrent: marca los VISTOS y elimina los controles de los BORRADOS from servers import torrent try: threading.Thread(target=torrent.mark_torrent_as_watched).start( ) # Creamos un Thread independiente, hasta el fin de Kodi time.sleep(2) # Dejamos terminar la inicialización... except: # Si hay problemas de threading, nos vamos logger.error(traceback.format_exc()) except: logger.error(traceback.format_exc())
from core.jsontools import to_utf8 from platformcode import config, logger from platformcode.logger import WebErrorException #Dominios que necesitan Cloudscraper. AÑADIR dominios de canales sólo si es necesario global CF_LIST CF_LIST = list() CF_LIST_PATH = os.path.join(config.get_runtime_path(), "resources", "CF_Domains.txt") if os.path.exists(CF_LIST_PATH): with open(CF_LIST_PATH, "rb") as CF_File: CF_LIST = CF_File.read().splitlines() ## Obtiene la versión del addon __version = config.get_addon_version() cookies_lock = Lock() cj = cookielib.MozillaCookieJar() ficherocookies = os.path.join(config.get_data_path(), "cookies.dat") # Headers por defecto, si no se especifica nada default_headers = dict() # default_headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) Chrome/79.0.3945.117" ver = config.get_setting("chrome_ua_version") ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36" % ver default_headers["User-Agent"] = ua #default_headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
def mainlist(item): logger.info() item.category = config.__addon_name itemlist = [] itemlist.append( item.clone(action='channels', extra='movies', title='Películas', thumbnail=config.get_thumb('movie'))) itemlist.append( item.clone(action='channels', extra='tvshows', title='Series', thumbnail=config.get_thumb('tvshow'))) itemlist.append( item.clone(action='channels', extra='documentaries', title='Documentales', thumbnail=config.get_thumb('documentary'))) itemlist.append( Item(channel='generos', action='mainlist', title='Géneros', thumbnail=config.get_thumb('genres'))) itemlist.append( Item(channel='search', action='mainlist', title='Buscar', thumbnail=config.get_thumb('search'))) itemlist.append( Item(channel='tracking', action='mainlist', title='Enlaces guardados (videoteca)', thumbnail=config.get_thumb('videolibrary'))) itemlist.append( Item(channel='downloads', action='mainlist', title='Descargas', thumbnail=config.get_thumb('downloads'))) itemlist.append( Item(channel='actions', action='open_settings', title='Configuración / Ayuda (Balandro v%s)' % config.get_addon_version(), folder=False, thumbnail=config.get_thumb('settings'))) if config.get_setting('channels_link_main', default=False): itemlist.append( item.clone(action='channels', extra='all', title='Canales', thumbnail=config.get_thumb('stack'))) # Developers: import os if os.path.exists( os.path.join(config.get_runtime_path(), 'modules', 'test.py')): itemlist.append( Item(channel='test', action='mainlist', title='Tests Canales y Servidores', thumbnail=config.get_thumb('dev'))) if os.path.exists( os.path.join(config.get_runtime_path(), 'modules', 'developer.py')): itemlist.append( Item(channel='developer', action='mainlist', title='Gestión de géneros', thumbnail=config.get_thumb('dev'))) return itemlist
def getmainlist(view="thumb_"): logger.info() itemlist = list() # Añade los canales que forman el menú principal itemlist.append( Item(title=config.get_localized_string(30130), channel="news", action="mainlist", thumbnail=get_thumb("news.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", context=[{ "title": config.get_localized_string(70285), "channel": "news", "action": "menu_opciones", "goto": True }])) itemlist.append( Item(title=config.get_localized_string(30118), channel="channelselector", action="getchanneltypes", thumbnail=get_thumb("channels.png", view), view=view, category=config.get_localized_string(30119), viewmode="thumbnails")) itemlist.append( Item(title=config.get_localized_string(70527), channel="alfavorites", action="mainlist", thumbnail=get_thumb("mylink.png", view), view=view, category=config.get_localized_string(70527), viewmode="thumbnails")) itemlist.append( Item(title=config.get_localized_string(30103), channel="search", action="mainlist", thumbnail=get_thumb("search.png", view), category=config.get_localized_string(30119), viewmode="list", context=[{ "title": config.get_localized_string(70286), "channel": "search", "action": "opciones", "goto": True }])) itemlist.append( Item(title=config.get_localized_string(30102), channel="favorites", action="mainlist", thumbnail=get_thumb("favorites.png", view), category=config.get_localized_string(30102), viewmode="thumbnails")) if config.get_videolibrary_support(): itemlist.append( Item(title=config.get_localized_string(30131), channel="videolibrary", action="mainlist", thumbnail=get_thumb("videolibrary.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", context=[{ "title": config.get_localized_string(70287), "channel": "videolibrary", "action": "channel_config" }])) itemlist.append( Item(title=config.get_localized_string(30101), channel="downloads", action="mainlist", thumbnail=get_thumb("downloads.png", view), viewmode="list", context=[{ "title": config.get_localized_string(70288), "channel": "setting", "config": "downloads", "action": "channel_config" }])) thumb_setting = "setting_%s.png" % 0 # config.get_setting("plugin_updates_available") itemlist.append( Item(title=config.get_localized_string(30100), channel="setting", action="mainlist", thumbnail=get_thumb(thumb_setting, view), category=config.get_localized_string(30100), viewmode="list")) if config.is_xbmc(): itemlist.append( Item(title="Reportar un fallo", channel="setting", action="report_menu", thumbnail=get_thumb("error.png", view), category=config.get_localized_string(30104), viewmode="list")) itemlist.append( Item(title=config.get_localized_string(30104) + " (" + config.get_localized_string(20000) + " " + config.get_addon_version(with_fix=False) + ")", channel="help", action="mainlist", thumbnail=os.path.join(config.get_runtime_path(), "resources", 'Screenshot.jpg'), category=config.get_localized_string(30104), viewmode="list")) from lib import generictools browser, res = generictools.call_browser('', lookup=True) if not browser: action = '' itemlist.append( Item( channel="setting", action=action, url='https://alfa-addon.com/foros/tutoriales.11/', title= "Tutoriales relevantes [COLOR gold](Instala un browser externo: Chrome, Firefox, Opera)[/COLOR]:", thumbnail=get_thumb("help.png", view), unify=False, folder=False, category=config.get_localized_string(30104), viewmode="list")) else: action = 'call_browser' itemlist.append( Item( channel="setting", action=action, url='https://alfa-addon.com/foros/tutoriales.11/', title= "Tutoriales relevantes [COLOR limegreen](pincha para usar [I]%s[/I])[/COLOR]:" % browser, thumbnail=get_thumb("help.png", view), unify=False, folder=False, category=config.get_localized_string(30104), viewmode="list")) itemlist.append( Item( channel="setting", action=action, url= 'https://alfa-addon.com/threads/manual-de-alfa-mobile-assistant-herramienta-de-apoyo.3797/', title= "- [COLOR yellow]Manual de Alfa Mobile Assistant (herramienta de apoyo)[/COLOR] " + "https://alfa-addon.com/threads/manual-de-alfa-mobile-assistant-herramienta-de-apoyo.3797/", thumbnail=get_thumb("help.png", view), unify=False, folder=False, category=config.get_localized_string(30104), viewmode="list")) return itemlist
def get_environment(): """ Devuelve las variables de entorno del OS, de Kodi y de Alfa más habituales, necesarias para el diagnóstico de fallos """ try: import base64 import ast PLATFORM = config.get_system_platform() environment = config.get_platform(full_version=True) environment['num_version'] = str(environment['num_version']) environment['python_version'] = '%s (%s, %s)' % (str(platform.python_version()), \ str(sys.api_version), str(platform.python_implementation())) environment['os_release'] = str(platform.release()) environment['prod_model'] = '' try: import multiprocessing environment['proc_num'] = ' (%sx)' % str(multiprocessing.cpu_count()) except: environment['proc_num'] = '' if PLATFORM in ['windows', 'xbox']: environment['os_name'] = PLATFORM.capitalize() try: if platform.platform(): environment['os_release'] = str(platform.platform()).replace('Windows-', '') elif platform._syscmd_ver()[2]: environment['os_release'] = str(platform._syscmd_ver()[2]) command = ["wmic", "cpu", "get", "name"] p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, creationflags=0x08000000) output_cmd, error_cmd = p.communicate() if PY3 and isinstance(output_cmd, bytes): output_cmd = output_cmd.decode() output_cmd = re.sub(r'\n|\r|\s{2}', '', output_cmd) environment['prod_model'] = str(scrapertools.find_single_match(output_cmd, \ '\w+.*?(?i)(?:Intel\(R\))?(?:\s*Core\(TM\))\s*(.*?CPU.*?)\s*(?:\@|$)')) except: pass elif PLATFORM in ['android', 'atv2']: environment['os_name'] = PLATFORM.capitalize() try: for label_a in subprocess.check_output('getprop').split(FF): if PY3 and isinstance(label_a, bytes): label_a = label_a.decode() if 'build.version.release' in label_a: environment['os_release'] = str(scrapertools.find_single_match(label_a, ':\s*\[(.*?)\]$')) if 'product.model' in label_a: environment['prod_model'] = str(scrapertools.find_single_match(label_a, ':\s*\[(.*?)\]$')) except: try: for label_a in filetools.read(os.environ['ANDROID_ROOT'] + '/build.prop').split(): if PY3 and isinstance(label_a, bytes): label_a = label_a.decode() if 'build.version.release' in label_a: environment['os_release'] = str(scrapertools.find_single_match(label_a, '=(.*?)$')) if 'product.model' in label_a: environment['prod_model'] = str(scrapertools.find_single_match(label_a, '=(.*?)$')) except: pass environment['prod_model'] += ' (%s)' % config.is_rooted(silent=True) elif PLATFORM in ['linux']: environment['os_name'] = PLATFORM.capitalize() try: for label_a in subprocess.check_output('hostnamectl').split(FF): if PY3 and isinstance(label_a, bytes): label_a = label_a.decode() if 'Operating' in label_a: environment['os_release'] = str(scrapertools.find_single_match(label_a, 'Operating\s*S\w+:\s*(.*?)\s*$')) break for label_a in subprocess.check_output(['cat', '/proc/cpuinfo']).split(FF): if PY3 and isinstance(label_a, bytes): label_a = label_a.decode() if 'model name' in label_a: environment['prod_model'] = str(scrapertools.find_single_match(label_a, \ 'model.*?:\s*(?i)(?:Intel\(R\))?(?:\s*Core\(TM\))\s*(.*?CPU.*?)\s*(?:\@|$)')) break except: pass elif PLATFORM in ['raspberry']: environment['os_name'] = 'RaspberryPi' else: environment['os_name'] = str(PLATFORM.capitalize()) if not environment['os_release']: environment['os_release'] = str(platform.release()) if environment['proc_num'] and environment['prod_model']: environment['prod_model'] += environment['proc_num'] environment['machine'] = str(platform.machine()) environment['architecture'] = str(sys.maxsize > 2 ** 32 and "64-bit" or "32-bit") environment['language'] = str(xbmc.getInfoLabel('System.Language')) environment['cpu_usage'] = str(xbmc.getInfoLabel('System.CpuUsage')) environment['mem_total'] = str(xbmc.getInfoLabel('System.Memory(total)')).replace('MB', '').replace('KB', '') environment['mem_free'] = str(xbmc.getInfoLabel('System.Memory(free)')).replace('MB', '').replace('KB', '') if not environment['mem_total'] or not environment['mem_free']: try: if environment['os_name'].lower() in ['windows', 'xbox']: kernel32 = ctypes.windll.kernel32 c_ulong = ctypes.c_ulong c_ulonglong = ctypes.c_ulonglong class MEMORYSTATUS(ctypes.Structure): _fields_ = [ ('dwLength', c_ulong), ('dwMemoryLoad', c_ulong), ('dwTotalPhys', c_ulonglong), ('dwAvailPhys', c_ulonglong), ('dwTotalPageFile', c_ulonglong), ('dwAvailPageFile', c_ulonglong), ('dwTotalVirtual', c_ulonglong), ('dwAvailVirtual', c_ulonglong), ('availExtendedVirtual', c_ulonglong) ] memoryStatus = MEMORYSTATUS() memoryStatus.dwLength = ctypes.sizeof(MEMORYSTATUS) kernel32.GlobalMemoryStatus(ctypes.byref(memoryStatus)) environment['mem_total'] = str(old_div(int(memoryStatus.dwTotalPhys), (1024**2))) environment['mem_free'] = str(old_div(int(memoryStatus.dwAvailPhys), (1024**2))) else: with open('/proc/meminfo') as f: meminfo = f.read() environment['mem_total'] = str(old_div(int(re.search(r'MemTotal:\s+(\d+)', meminfo).groups()[0]), 1024)) environment['mem_free'] = str(old_div(int(re.search(r'MemAvailable:\s+(\d+)', meminfo).groups()[0]), 1024)) except: environment['mem_total'] = '' environment['mem_free'] = '' try: environment['kodi_buffer'] = '20' environment['kodi_bmode'] = '0' environment['kodi_rfactor'] = '4.0' if filetools.exists(filetools.join("special://userdata", "advancedsettings.xml")): advancedsettings = filetools.read(filetools.join("special://userdata", "advancedsettings.xml")).split('\n') for label_a in advancedsettings: if 'memorysize' in label_a: environment['kodi_buffer'] = str(old_div(int(scrapertools.find_single_match (label_a, '>(\d+)<\/')), 1024**2)) if 'buffermode' in label_a: environment['kodi_bmode'] = str(scrapertools.find_single_match (label_a, '>(\d+)<\/')) if 'readfactor' in label_a: environment['kodi_rfactor'] = str(scrapertools.find_single_match (label_a, '>(.*?)<\/')) except: pass environment['userdata_path'] = str(config.get_data_path()) environment['userdata_path_perm'] = filetools.file_info(environment['userdata_path']) if not environment['userdata_path_perm']: del environment['userdata_path_perm'] try: if environment['os_name'].lower() in ['windows', 'xbox']: free_bytes = ctypes.c_ulonglong(0) ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(environment['userdata_path']), None, None, ctypes.pointer(free_bytes)) environment['userdata_free'] = str(round(float(free_bytes.value) / (1024**3), 3)) else: disk_space = os.statvfs(environment['userdata_path']) if not disk_space.f_frsize: disk_space.f_frsize = disk_space.f_frsize.f_bsize environment['userdata_free'] = str(round((float(disk_space.f_bavail) / \ (1024**3)) * float(disk_space.f_frsize), 3)) except: environment['userdata_free'] = '?' if environment.get('userdata_path_perm', ''): environment['userdata_path'] = environment['userdata_path_perm'] del environment['userdata_path_perm'] environment['torrent_lang'] = '%s/%s' % (config.get_setting("channel_language", default="").upper(), \ config.get_setting("second_language", default="").upper()) try: environment['videolab_series'] = '?' environment['videolab_episodios'] = '?' environment['videolab_pelis'] = '?' environment['videolab_path'] = str(config.get_videolibrary_path()) environment['videolab_path_perm'] = filetools.file_info(environment['videolab_path']) if not environment['videolab_path_perm']: environment['videolab_path_perm'] = environment['videolab_path'] if filetools.exists(filetools.join(environment['videolab_path'], \ config.get_setting("folder_tvshows"))): environment['videolab_series'] = str(len(filetools.listdir(filetools.join(environment['videolab_path'], \ config.get_setting("folder_tvshows"))))) counter = 0 for root, folders, files in filetools.walk(filetools.join(environment['videolab_path'], \ config.get_setting("folder_tvshows"))): for file in files: if file.endswith('.strm'): counter += 1 environment['videolab_episodios'] = str(counter) if filetools.exists(filetools.join(environment['videolab_path'], \ config.get_setting("folder_movies"))): environment['videolab_pelis'] = str(len(filetools.listdir(filetools.join(environment['videolab_path'], \ config.get_setting("folder_movies"))))) except: pass try: video_updates = ['No', 'Inicio', 'Una vez', 'Inicio+Una vez', 'Dos veces al día'] environment['videolab_update'] = str(video_updates[config.get_setting("update", "videolibrary")]) if config.get_setting("videolibrary_backup_scan", "videolibrary", default=False): environment['videolab_update'] += ' (Solo SCAN)' except: environment['videolab_update'] = '?' try: if environment['os_name'].lower() in ['windows', 'xbox']: free_bytes = ctypes.c_ulonglong(0) ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(environment['videolab_path']), None, None, ctypes.pointer(free_bytes)) environment['videolab_free'] = str(round(float(free_bytes.value) / (1024**3), 3)) else: disk_space = os.statvfs(environment['videolab_path']) if not disk_space.f_frsize: disk_space.f_frsize = disk_space.f_frsize.f_bsize environment['videolab_free'] = str(round((float(disk_space.f_bavail) / \ (1024**3)) * float(disk_space.f_frsize), 3)) except: environment['videolab_free'] = '?' torrent_paths = torrent_dirs() environment['torrent_list'] = [] environment['torrentcli_option'] = '' environment['torrent_error'] = '' environment['torrentcli_rar'] = config.get_setting("mct_rar_unpack", server="torrent", default=True) environment['torrentcli_backgr'] = config.get_setting("mct_background_download", server="torrent", default=True) environment['torrentcli_lib_path'] = config.get_setting("libtorrent_path", server="torrent", default="") if environment['torrentcli_lib_path']: lib_path = 'Activo' else: lib_path = 'Inactivo' if config.get_setting("libtorrent_version", server="torrent", default=""): lib_path += '-%s' % config.get_setting("libtorrent_version", server="torrent", default="") environment['torrentcli_unrar'] = config.get_setting("unrar_path", server="torrent", default="") if environment['torrentcli_unrar']: unrar = config.get_setting("unrar_device", server="torrent", default="").capitalize() else: unrar = 'Inactivo' torrent_id = config.get_setting("torrent_client", server="torrent", default=0) environment['torrentcli_option'] = str(torrent_id) torrent_options = platformtools.torrent_client_installed() if lib_path != 'Inactivo': torrent_options = [': MCT'] + torrent_options torrent_options = [': BT'] + torrent_options environment['torrent_list'].append({'Torrent_opt': str(torrent_id), 'Libtorrent': lib_path, \ 'RAR_Auto': str(environment['torrentcli_rar']), \ 'RAR_backgr': str(environment['torrentcli_backgr']), \ 'UnRAR': unrar}) environment['torrent_error'] = config.get_setting("libtorrent_error", server="torrent", default="") if environment['torrent_error']: environment['torrent_list'].append({'Libtorrent_error': environment['torrent_error']}) for torrent_option in torrent_options: cliente = dict() cliente['D_load_Path'] = '' cliente['Libre'] = '?' cliente['Plug_in'] = scrapertools.find_single_match(torrent_option, ':\s*(\w+)') if cliente['Plug_in'] not in ['BT', 'MCT']: cliente['Plug_in'] = cliente['Plug_in'].capitalize() cliente['D_load_Path'] = torrent_paths[cliente['Plug_in'].upper()] cliente['D_load_Path_perm'] = filetools.file_info(cliente['D_load_Path']) cliente['Buffer'] = str(torrent_paths[cliente['Plug_in'].upper()+'_buffer']) cliente['Version'] = str(torrent_paths[cliente['Plug_in'].upper()+'_version']) if cliente['Plug_in'].upper() == 'TORREST': cliente['Buffer'] = str(int(int(torrent_paths[cliente['Plug_in'].upper()+'_buffer']) /(1024*1024))) bin_path = filetools.join('special://home', 'addons', 'plugin.video.torrest', 'resources', 'bin') if filetools.exists(bin_path): cliente['Platform'] = str(filetools.listdir(bin_path)[0]) else: cliente['Platform'] = 'None' try: __settings__ = xbmcaddon.Addon(id="plugin.video.torrest") cliente['Platform'] += ': %s: %s:%s' % (str(__settings__.getSetting("service_enabled")), \ str(__settings__.getSetting("service_ip")), str(__settings__.getSetting("port"))) except: pass #cliente['Options'] = str(filetools.read(filetools.join('special://masterprofile', \ # 'addon_data', 'plugin.video.torrest', 'settings.xml'))) if torrent_paths.get(cliente['Plug_in'].upper()+'_memory_size', ''): cliente['Memoria'] = str(torrent_paths[cliente['Plug_in'].upper()+'_memory_size']) if cliente.get('D_load_Path', ''): try: if environment['os_name'].lower() in ['windows', 'xbox']: free_bytes = ctypes.c_ulonglong(0) ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(cliente['D_load_Path']), None, None, ctypes.pointer(free_bytes)) cliente['Libre'] = str(round(float(free_bytes.value) / \ (1024**3), 3)).replace('.', ',') else: disk_space = os.statvfs(cliente['D_load_Path']) if not disk_space.f_frsize: disk_space.f_frsize = disk_space.f_frsize.f_bsize cliente['Libre'] = str(round((float(disk_space.f_bavail) / \ (1024**3)) * float(disk_space.f_frsize), 3)).replace('.', ',') except: pass if cliente.get('D_load_Path_perm', ''): cliente['D_load_Path'] = cliente['D_load_Path_perm'] del cliente['D_load_Path_perm'] environment['torrent_list'].append(cliente) environment['proxy_active'] = '' try: proxy_channel_bloqued_str = base64.b64decode(config.get_setting('proxy_channel_bloqued')).decode('utf-8') proxy_channel_bloqued = dict() proxy_channel_bloqued = ast.literal_eval(proxy_channel_bloqued_str) for channel_bloqued, proxy_active in list(proxy_channel_bloqued.items()): if proxy_active != 'OFF': environment['proxy_active'] += channel_bloqued + ', ' except: pass if not environment['proxy_active']: environment['proxy_active'] = 'OFF' environment['proxy_active'] = environment['proxy_active'].rstrip(', ') for root, folders, files in filetools.walk("special://logpath/"): for file in files: if file.lower() in ['kodi.log', 'jarvis.log', 'spmc.log', 'cemc.log', \ 'mygica.log', 'wonderbox.log', 'leiapp,log', \ 'leianmc.log', 'kodiapp.log', 'anmc.log', \ 'latin-anmc.log']: environment['log_path'] = str(filetools.join(root, file)) break else: environment['log_path'] = '' break if environment.get('log_path', ''): environment['log_size_bytes'] = str(filetools.getsize(environment['log_path'])) environment['log_size'] = str(round(float(environment['log_size_bytes']) / \ (1024*1024), 3)) else: environment['log_size_bytes'] = '' environment['log_size'] = '' environment['debug'] = str(config.get_setting('debug')) environment['addon_version'] = '%s (Upd: %s h.)' % (str(config.get_addon_version(from_xml=True)), \ str(config.get_setting("addon_update_timer", default=12)).replace('0', 'No')) environment['assistant_version'] = str(None) if filetools.exists(filetools.join(config.get_data_path(), 'alfa-mobile-assistant.version')): environment['assistant_version'] = filetools.read(filetools.join(config.get_data_path(), 'alfa-mobile-assistant.version')) environment['assistant_version'] += '; Req: %s' % str(config.get_setting('assistant_binary', default=False)) environment['assistant_cf_ua'] = str(config.get_setting('cf_assistant_ua', default=None)) assistant_path = filetools.join(os.getenv('ANDROID_STORAGE'), 'emulated', '0', 'Android', 'data', 'com.alfa.alfamobileassistant') if PLATFORM in ['android', 'atv2'] and filetools.exists(assistant_path): environment['assistant_path'] = str(filetools.file_info(assistant_path)) except: logger.error(traceback.format_exc()) environment = {} environment['log_size'] = '' environment['cpu_usage'] = '' environment['python_version'] = '' environment['log_path'] = '' environment['userdata_free'] = '' environment['mem_total'] = '' environment['machine'] = '' environment['platform'] = '' environment['videolab_path'] = '' environment['num_version'] = '' environment['os_name'] = '' environment['video_db'] = '' environment['userdata_path'] = '' environment['log_size_bytes'] = '' environment['name_version'] = '' environment['language'] = '' environment['mem_free'] = '' environment['prod_model'] = '' environment['proxy_active'] = '' environment['architecture'] = '' environment['os_release'] = '' environment['videolab_free'] = '' environment['kodi_buffer'] = '' environment['kodi_bmode'] = '' environment['kodi_rfactor'] = '' environment['videolab_series'] = '' environment['videolab_episodios'] = '' environment['videolab_pelis'] = '' environment['videolab_update'] = '' environment['videolab_path_perm'] = '' environment['debug'] = '' environment['addon_version'] = '' environment['torrent_list'] = [] environment['torrent_lang'] = '' environment['torrentcli_option'] = '' environment['torrentcli_rar'] = '' environment['torrentcli_lib_path'] = '' environment['torrentcli_unrar'] = '' environment['torrent_error'] = '' environment['assistant_version'] = '' environment['assistant_cf_ua'] = '' return environment
def check_addon_updates(verbose=False): logger.info() # Forzamos la actualización de los repos para facilitar la actualización del addon Alfa xbmc.executebuiltin('UpdateAddonRepos') ADDON_UPDATES_JSON = 'https://extra.alfa-addon.com/addon_updates/updates.json' ADDON_UPDATES_ZIP = 'https://extra.alfa-addon.com/addon_updates/updates.zip' try: get_ua_list() except: pass 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 try: localfilename = os.path.join(config.get_data_path(), 'temp_updates.zip') if os.path.exists(localfilename): os.remove(localfilename) except: pass # Descargar json con las posibles actualizaciones # ----------------------------------------------- resp = httptools.downloadpage(ADDON_UPDATES_JSON, timeout=5, ignore_response_code=True) if not resp.sucess and resp.code != 404: logger.info('ERROR en la descarga de actualizaciones: %s' % resp.code, force=True) if verbose: dialog_notification( 'Alfa: error en la actualización', 'Hay un error al descargar la actualización') return False if not resp.data: logger.info('No se encuentran actualizaciones del addon', force=True) if verbose: dialog_notification('Alfa ya está actualizado', 'No hay ninguna actualización urgente') check_update_to_others( verbose=verbose ) # Comprueba las actualuzaciones de otros productos return False data = jsontools.load(resp.data) if 'addon_version' not in data or 'fix_version' not in data: logger.info('No hay actualizaciones del addon', force=True) if verbose: dialog_notification('Alfa ya está actualizado', 'No hay ninguna actualización urgente') check_update_to_others( verbose=verbose ) # Comprueba las actualuzaciones de otros productos 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, from_xml=True) if current_version != data['addon_version']: logger.info('No hay actualizaciones para la versión %s del addon' % current_version, force=True) if verbose: dialog_notification('Alfa ya está actualizado', 'No hay ninguna actualización urgente') check_update_to_others( verbose=verbose ) # Comprueba las actualuzaciones de otros productos return False if os.path.exists(last_fix_json): try: lastfix = {} with open(last_fix_json, "r") as lfj: lastfix = jsontools.load(lfj.read()) 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']), force=True) if verbose: dialog_notification( 'Alfa ya está actualizado', 'Versión %s.fix%d' % (data['addon_version'], data['fix_version'])) check_update_to_others( verbose=verbose ) # Comprueba las actualuzaciones de otros productos return False except: if lastfix: logger.error('last_fix.json: ERROR en: ' + str(lastfix)) else: logger.error('last_fix.json: ERROR desconocido') lastfix = {} # Descargar zip con las actualizaciones # ------------------------------------- if downloadtools.downloadfile( ADDON_UPDATES_ZIP, localfilename, silent=True) < 0: raise # Descomprimir zip dentro del addon # --------------------------------- try: unzipper = ziptools.ziptools() unzipper.extract(localfilename, config.get_runtime_path()) except: xbmc.executebuiltin('Extract("%s", "%s")' % (localfilename, config.get_runtime_path())) time.sleep(1) # Borrar el zip descargado # ------------------------ try: os.remove(localfilename) except: pass # Si es PY3 se actualizan los módulos marshal # Se reinicia Proxytools try: if PY3: from platformcode.custom_code import marshal_check marshal_check() if not PY3: from core.proxytools import get_proxy_list else: from core.proxytools_py3 import get_proxy_list get_proxy_list(monitor_start=False) except: logger.error('Error Marshalizando e iniciando Proxytools') logger.error(traceback.format_exc()) # Guardar información de la versión fixeada # ----------------------------------------- try: show_update_info(data) except: pass last_id = 0 if isinstance(data["files"], list): last_id = len(data["files"]) elif isinstance(data["files"], dict): for k in data["files"].keys(): if int(k) > last_id: last_id = int(k) if 'files' in data: data.pop('files', None) data["last_id"] = last_id with open(last_fix_json, "w") as lfj: lfj.write(jsontools.dump(data)) # Actualiza la versión del addon en las cabeceras try: httptools.__version = '%s.fix%d' % (data['addon_version'], data['fix_version']) except: pass logger.info('Addon actualizado correctamente a %s.fix%d' % (data['addon_version'], data['fix_version']), force=True) if verbose and not config.get_setting("show_fixes", default=True): dialog_notification( 'Alfa actualizado a', 'Versión %s.fix%d' % (data['addon_version'], data['fix_version'])) check_update_to_others( verbose=verbose ) # Comprueba las actualuzaciones de otros productos return True except: logger.error('Error al comprobar actualizaciones del addon!') logger.error(traceback.format_exc()) if verbose: dialog_notification('Alfa actualizaciones', 'Error al comprobar actualizaciones') check_update_to_others( verbose=verbose ) # Comprueba las actualuzaciones de otros productos return False
# -*- coding: utf-8 -*- # ------------------------------------------------------------ # Canale per altadefinizione01 # ------------------------------------------------------------ from core import servertools, httptools, tmdb, scrapertoolsV2, support from core.item import Item from platformcode import logger, config from specials import autoplay #URL che reindirizza sempre al dominio corrente #host = "https://altadefinizione01.to" __channel__ = "altadefinizione01" host = config.get_addon_version(__channel__) IDIOMAS = {'Italiano': 'IT'} list_language = IDIOMAS.values() list_servers = [ 'openload', 'streamango', 'rapidvideo', 'streamcherry', 'megadrive' ] list_quality = ['default'] checklinks = config.get_setting('checklinks', 'altadefinizione01') checklinks_number = config.get_setting('checklinks_number', 'altadefinizione01') headers = [['Referer', host]] blacklist_categorie = ['Altadefinizione01', 'Altadefinizione.to']
def init(): logger.info() """ Todo el código añadido al add-on se borra con cada actualización. Esta función permite restaurarlo automáticamente con cada actualización. Esto permite al usuario tener su propio código, bajo su responsabilidad, y restaurarlo al add-on cada vez que se actualiza. El mecanismo funciona copiando el contenido de la carpeta-arbol "./userdata/addon_data/plugin.video.alfa/custom_code/..." sobre las carpetas de código del add-on. No verifica el contenido, solo vuelca(reemplaza) el contenido de "custom_code". El usuario almacenará en las subcarpetas de "custom_code" su código actualizado y listo para ser copiado en cualquier momento. Si no se desea que copie algo, simplemente se borra de "custom_code" y ya no se copiará en la próxima actualización. Los pasos que sigue esta función, son los siguientes: 1.- La función se llama desde videolibrary_service.py, desde la función inicial: # Copia Custom code a las carpetas de Alfa desde la zona de Userdata from platformcode import custom_code custom_code.init() 2.- En el inicio de Kodi, comprueba si existe la carpeta "custom_code" en "./userdata/addon_data/plugin.video.alfa/". Si no existe, la crea y sale sin más, dando al ususario la posibilidad de copiar sobre esa estructura su código, y que la función la vuelque sobre el add-on en el próximo inicio de Kodi. 3.- En el siguiente inicio de Kodi, comprueba si existe el custom_code.json en la carpeta root del add-on. Si no existe, lo crea con el número de versión del add-on vacío, para permitir que se copien los archivos en esta pasada. 4.- Verifica que el número de versión del add-on es diferente de el de custom_code.json. Si es la misma versión, se sale porque ya se realizo la copia anteriormente. Si la versión es distinta, se realiza el volcado de todos los archivos de la carpeta-árbol "custom_code" sobre el add-on. Si la carpeta de destino no existe, dará un error y se cancelará la copia. Se considera que no tienen sentido nuevas carpetas. 5.- Si la copia ha terminado con éxito, se actualiza el custom_code.json con el número de versión del add-on, para que en inicios sucesivos de Kodi no se realicen las copias, hasta que el add-on cambie de versión. En el número de versión del add-on no se considera el número de fix. Tiempos: Copiando 7 archivos de prueba, el proceso ha tardado una décima de segundo. """ try: #Borra el .zip de instalación de Alfa de la carpeta Packages, por si está corrupto, y que así se pueda descargar de nuevo version = 'plugin.video.alfa-%s.zip' % config.get_addon_version( with_fix=False) filetools.remove( filetools.join(xbmc.translatePath('special://home'), 'addons', 'packages', version), True) #Verifica si Kodi tiene algún achivo de Base de Datos de Vídeo de versiones anteriores, entonces los borra verify_Kodi_video_DB() #LIBTORRENT: se descarga el binario de Libtorrent cada vez que se actualiza Alfa try: threading.Thread(target=update_libtorrent).start( ) # Creamos un Thread independiente, hasta el fin de Kodi time.sleep(2) # Dejamos terminar la inicialización... except: # Si hay problemas de threading, nos vamos logger.error(traceback.format_exc()) #QUASAR: Preguntamos si se hacen modificaciones a Quasar if not filetools.exists(filetools.join(config.get_data_path(), "quasar.json")) \ and not config.get_setting('addon_quasar_update', default=False): question_update_external_addon("quasar") #QUASAR: Hacemos las modificaciones a Quasar, si está permitido, y si está instalado if config.get_setting('addon_quasar_update', default=False) or \ (filetools.exists(filetools.join(config.get_data_path(), \ "quasar.json")) and not xbmc.getCondVisibility('System.HasAddon("plugin.video.quasar")')): if not update_external_addon("quasar"): platformtools.dialog_notification( "Actualización Quasar", "Ha fallado. Consulte el log") #Existe carpeta "custom_code" ? Si no existe se crea y se sale custom_code_dir = filetools.join(config.get_data_path(), 'custom_code') if not filetools.exists(custom_code_dir): create_folder_structure(custom_code_dir) return else: #Existe "custom_code.json" ? Si no existe se crea custom_code_json_path = config.get_runtime_path() custom_code_json = filetools.join(custom_code_json_path, 'custom_code.json') if not filetools.exists(custom_code_json): create_json(custom_code_json_path) #Se verifica si la versión del .json y del add-on son iguales. Si es así se sale. Si no se copia "custom_code" al add-on verify_copy_folders(custom_code_dir, custom_code_json_path) except: logger.error(traceback.format_exc())
def submenu_tools(item): logger.info() itemlist = list() # Herramientas personalizadas import os channel_custom = os.path.join(config.get_runtime_path(), 'channels', 'custom.py') if not filetools.exists(channel_custom): user_custom = os.path.join(config.get_data_path(), 'custom.py') if filetools.exists(user_custom): filetools.copy(user_custom, channel_custom, silent=True) if filetools.exists(channel_custom): itemlist.append(Item(channel='custom', action='mainlist', title='Custom Channel')) itemlist.append(Item(channel=CHANNELNAME, action="check_quickfixes", folder=False, title=config.get_localized_string(30001), plot="Versión actual: %s" % config.get_addon_version() )) itemlist.append(Item(channel=CHANNELNAME, action="update_quasar", folder=False, title=config.get_localized_string(70569))) itemlist.append(Item(channel=CHANNELNAME, action="", title="", folder=False, thumbnail=get_thumb("setting_0.png"))) itemlist.append(Item(channel=CHANNELNAME, title=config.get_localized_string(60564) + ":", action="", folder=False, text_bold=True, thumbnail=get_thumb("channels.png"))) itemlist.append(Item(channel=CHANNELNAME, title=config.get_localized_string(60565), action="conf_tools", folder=True, extra="lib_check_datajson", thumbnail=get_thumb("channels.png"))) if config.get_videolibrary_support(): itemlist.append(Item(channel=CHANNELNAME, action="", title="", folder=False, thumbnail=get_thumb("setting_0.png"))) itemlist.append(Item(channel=CHANNELNAME, title=config.get_localized_string(60566) + ":", action="", folder=False, text_bold=True, thumbnail=get_thumb("videolibrary.png"))) itemlist.append(Item(channel=CHANNELNAME, action="overwrite_tools", folder=False, thumbnail=get_thumb("videolibrary.png"), title="- " + config.get_localized_string(60567))) itemlist.append(Item(channel="videolibrary", action="update_videolibrary", folder=False, thumbnail=get_thumb("videolibrary.png"), title="- " + config.get_localized_string(60568))) return itemlist
def getmainlist(view="thumb_"): logger.info() itemlist = list() # Añade los canales que forman el menú principal itemlist.append( Item(title=config.get_localized_string(30130), channel="news", action="mainlist", thumbnail=get_thumb("news.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", context=[{ "title": config.get_localized_string(70285), "channel": "news", "action": "news_setting" }])) itemlist.append( Item(title=config.get_localized_string(30118), channel="channelselector", action="getchanneltypes", thumbnail=get_thumb("channels.png", view), view=view, category=config.get_localized_string(30119), viewmode="thumbnails")) itemlist.append( Item(title=config.get_localized_string(70527), channel="alfavorites", action="mainlist", thumbnail=get_thumb("mylink.png", view), view=view, category=config.get_localized_string(70527), viewmode="thumbnails")) itemlist.append( Item(title=config.get_localized_string(30103), channel="search", action="mainlist", thumbnail=get_thumb("search.png", view), category=config.get_localized_string(30119), viewmode="list", context=[{ "title": config.get_localized_string(70286), "channel": "search", "action": "opciones", "goto": True }])) itemlist.append( Item(title=config.get_localized_string(30102), channel="favorites", action="mainlist", thumbnail=get_thumb("favorites.png", view), category=config.get_localized_string(30102), viewmode="thumbnails")) if config.get_videolibrary_support(): itemlist.append( Item(title=config.get_localized_string(30131), channel="videolibrary", action="mainlist", thumbnail=get_thumb("videolibrary.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", context=[{ "title": config.get_localized_string(70287), "channel": "videolibrary", "action": "channel_config" }])) itemlist.append( Item(title=config.get_localized_string(30101), channel="downloads", action="mainlist", thumbnail=get_thumb("downloads.png", view), viewmode="list", context=[{ "title": config.get_localized_string(70288), "channel": "setting", "config": "downloads", "action": "channel_config" }])) thumb_setting = "setting_%s.png" % 0 # config.get_setting("plugin_updates_available") itemlist.append( Item(title=config.get_localized_string(30100), channel="setting", action="mainlist", thumbnail=get_thumb(thumb_setting, view), category=config.get_localized_string(30100), viewmode="list")) if config.is_xbmc(): itemlist.append( Item(title=config.get_localized_string(70761), channel="setting", action="report_menu", thumbnail=get_thumb("error.png", view), category=config.get_localized_string(30104), viewmode="list")) itemlist.append( Item(title=config.get_localized_string(30104) + " (" + config.get_localized_string(20000) + " " + config.get_addon_version(with_fix=False, from_xml=True) + ")", channel="help", action="mainlist", thumbnail=os.path.join(config.get_runtime_path(), "resources", 'Screenshot.jpg'), category=config.get_localized_string(30104), viewmode="list")) from lib import generictools browser, res = generictools.call_browser('', lookup=True) if not browser: action = '' itemlist.append( Item(channel="setting", action=action, url='https://alfa-addon.com/foros/tutoriales.11/', title=config.get_localized_string(70758) + " [COLOR gold](" + config.get_localized_string(70759) + ": Chrome, Firefox, Opera)[/COLOR]:", thumbnail=get_thumb("help.png", view), unify=False, folder=False, category=config.get_localized_string(30104), viewmode="list")) else: action = 'call_browser' itemlist.append( Item(channel="setting", action=action, url='https://alfa-addon.com/foros/tutoriales.11/', title=config.get_localized_string(70758) + (" [COLOR limegreen]" + config.get_localized_string(70760) + "[/COLOR]") % browser, thumbnail=get_thumb("help.png", view), unify=False, folder=False, category=config.get_localized_string(30104), viewmode="list")) itemlist.append( Item( channel="setting", action=action, url= 'https://alfa-addon.com/threads/si-tienes-android-10-y-kodi-19-vas-a-tener-problemas-con-los-torrents.4211/', title= "- [COLOR yellow]Si tienes Android 10+ y Kodi 19+ vas a tener problemas con los torrents[/COLOR] " + "https://alfa-addon.com/threads/si-tienes-android-10-y-kodi-19-vas-a-tener-problemas-con-los-torrents.4211/", thumbnail=get_thumb("help.png", view), unify=False, folder=False, category=config.get_localized_string(30104), viewmode="list")) itemlist.append( Item( channel="setting", action=action, url= 'https://alfa-addon.com/threads/torrest-el-gestor-de-torrents-definitivo.4085/', title= "- [COLOR yellow]Torrest: el gestor de torrents definitivo[/COLOR] " + "https://alfa-addon.com/threads/torrest-el-gestor-de-torrents-definitivo.4085/", thumbnail=get_thumb("help.png", view), unify=False, folder=False, category=config.get_localized_string(30104), viewmode="list")) return itemlist
def getmainlist(view="thumb_"): logger.info() itemlist = list() # Añade los canales que forman el menú principal get_string = config.get_localized_string addon_version = config.get_addon_version(with_fix=False, from_xml=True) itemlist.append( Item( title = get_string(30130), channel = "news", action = "mainlist", thumbnail = get_thumb("news.png", view), category = get_string(30119), viewmode = "thumbnails", context = [ { "title": get_string(70285), "channel": "news", "action":"news_setting" } ] ) ) itemlist.append( Item( title = get_string(30118), channel = "channelselector", action = "getchanneltypes", thumbnail = get_thumb("channels.png", view), view = view, category = get_string(30119), viewmode = "thumbnails" ) ) itemlist.append( Item( title = get_string(80787), channel = "info_popup", action = "mainlist", thumbnail = get_thumb("wishlist.png", view), category = "wishlist", viewmode = "thumbnails", context = [ { "title": get_string(80788), "channel": "info_popup", "action": "show_settings" } ] ) ) itemlist.append( Item( title = get_string(70527), channel = "alfavorites", action ="mainlist", thumbnail = get_thumb("mylink.png", view), view = view, category = get_string(70527), viewmode = "thumbnails" ) ) itemlist.append( Item( title = get_string(30103), channel = "search", action = "mainlist", thumbnail = get_thumb("search.png", view), category = get_string(30119), viewmode = "list", context = [ { "title": get_string(70286), "channel": "search", "action": "opciones", "goto": True } ] ) ) itemlist.append( Item( title = get_string(30102), channel = "favorites", action = "mainlist", thumbnail = get_thumb("favorites.png", view), category = get_string(30102), viewmode = "thumbnails" ) ) if config.get_videolibrary_support(): itemlist.append( Item( title = get_string(30131), channel = "videolibrary", action = "mainlist", thumbnail = get_thumb("videolibrary.png", view), category = get_string(30119), viewmode = "thumbnails", context = [ { "title": get_string(70287), "channel": "videolibrary", "action": "channel_config" } ] ) ) itemlist.append( Item( title = get_string(30101), channel = "downloads", action = "mainlist", thumbnail = get_thumb("downloads.png", view), viewmode = "list", context = [ { "title": get_string(70288), "channel": "setting", "config": "downloads", "action": "channel_config" } ] ) ) # fix = config.get_addon_version_fix() thumb_setting = "setting_%s.png" % 0 # int(fix[4:]) itemlist.append( Item( title = get_string(30100), channel = "setting", action = "mainlist", thumbnail = get_thumb(thumb_setting, view), category = get_string(30100), viewmode = "list" ) ) if config.is_xbmc(): itemlist.append( Item( title = get_string(70761), channel = "report", action = "mainlist", thumbnail = get_thumb("error.png", view), category = get_string(30104), viewmode = "list" ) ) itemlist.append( Item( title = '{} ({} {})'.format(get_string(30104), get_string(20000), addon_version), channel = "help", action = "mainlist", thumbnail = os.path.join(config.get_runtime_path(), "resources", 'Screenshot.jpg'), category = get_string(30104), viewmode = "list" ) ) try: versiones = config.get_versions_from_repo() except: versiones = {} import traceback logger.error(traceback.format_exc()) if versiones and addon_version != versiones.get('plugin.video.alfa', ''): itemlist.append( Item( title = "[COLOR hotpink][B]Actualizar a versión[/B][/COLOR] [COLOR gold][B]%s[/B][/COLOR] (versión instalada: %s)" % (versiones['plugin.video.alfa'], addon_version), channel = "channelselector", action = "install_alfa", thumbnail = os.path.join(config.get_runtime_path(), "resources", 'Screenshot.jpg'), category = get_string(30104), viewmode = "list" ) ) from lib import generictools browser, res = generictools.call_browser('', lookup=True) browser_dict = {} if browser: browser_dict['action'] = 'call_browser' browser_dict['title'] = '{} [COLOR limegreen]{}[/COLOR]'.format(get_string(70758), get_string(70760) % browser) else: browser_dict['action'] = '' browser_dict['title'] = '{} [COLOR gold]({}: Chrome, Firefox, Opera)[/COLOR]:'.format(get_string(70758), get_string(70759)) itemlist.append( Item( channel = "setting", action = browser_dict['action'], url = 'https://alfa-addon.com/foros/tutoriales.11/', title = browser_dict['title'], thumbnail = get_thumb("help.png", view), unify = False, folder = False, category = get_string(30104), viewmode = "list" ) ) itemlist.append( Item( channel = "setting", action = browser_dict['action'], url = 'https://alfa-addon.com/threads/dontorrent-potenciado-con-busquedas-en-btdigg.4798/', title = "- [COLOR yellow]Dontorrent potenciado con búsquedas en [COLOR limegreen]BT[/COLOR][COLOR red]Digg[/COLOR][/COLOR] " + "https://alfa-addon.com/threads/dontorrent-potenciado-con-busquedas-en-btdigg.4798/", thumbnail = get_thumb("on_the_air.png", view), unify = False, folder = False, category = get_string(30104), viewmode = "list" ) ) return itemlist
def check_addon_updates(verbose=False): logger.info() ADDON_UPDATES_JSON = 'https://extra.alfa-addon.com/addon_updates/updates.json' ADDON_UPDATES_ZIP = 'https://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): try: lastfix = {} 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 except: if lastfix: logger.error('last_fix.json: ERROR en: ' + str(lastfix)) else: logger.error('last_fix.json: ERROR desconocido') lastfix = {} # 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 # --------------------------------- try: unzipper = ziptools.ziptools() unzipper.extract(localfilename, config.get_runtime_path()) except: import xbmc xbmc.executebuiltin('XBMC.Extract("%s", "%s")' % (localfilename, config.get_runtime_path())) time.sleep(1) # 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!') logger.error(traceback.format_exc()) if verbose: platformtools.dialog_notification( 'Alfa actualizaciones', 'Error al comprobar actualizaciones') return False
def check_addon_updates(verbose=False): logger.info() # Forzamos la actualización de los repos para facilitar la actualización del addon Alfa xbmc.executebuiltin('UpdateAddonRepos') ADDON_UPDATES_JSON = 'https://extra.alfa-addon.com/addon_updates/updates.json' ADDON_UPDATES_ZIP = 'https://extra.alfa-addon.com/addon_updates/updates.zip' try: get_ua_list() except: pass 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 try: localfilename = os.path.join(config.get_data_path(), 'temp_updates.zip') if os.path.exists(localfilename): os.remove(localfilename) except: pass # Descargar json con las posibles actualizaciones # ----------------------------------------------- data = httptools.downloadpage(ADDON_UPDATES_JSON, timeout=5).data if data == '': logger.info('No se encuentran actualizaciones del addon') if verbose: dialog_notification('Alfa ya está actualizado', 'No hay ninguna actualización urgente') check_update_to_others(verbose=verbose) # Comprueba las actualuzaciones de otros productos 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: dialog_notification('Alfa ya está actualizado', 'No hay ninguna actualización urgente') check_update_to_others(verbose=verbose) # Comprueba las actualuzaciones de otros productos 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, from_xml=True) if current_version != data['addon_version']: logger.info('No hay actualizaciones para la versión %s del addon' % current_version) if verbose: dialog_notification('Alfa ya está actualizado', 'No hay ninguna actualización urgente') check_update_to_others(verbose=verbose) # Comprueba las actualuzaciones de otros productos return False if os.path.exists(last_fix_json): try: lastfix = {} lastfix = jsontools.load(open(last_fix_json, "r").read()) 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: dialog_notification('Alfa ya está actualizado', 'Versión %s.fix%d' % (data['addon_version'], data['fix_version'])) check_update_to_others(verbose=verbose) # Comprueba las actualuzaciones de otros productos return False except: if lastfix: logger.error('last_fix.json: ERROR en: ' + str(lastfix)) else: logger.error('last_fix.json: ERROR desconocido') lastfix = {} # Descargar zip con las actualizaciones # ------------------------------------- downloadtools.downloadfile(ADDON_UPDATES_ZIP, localfilename, silent=True) # Descomprimir zip dentro del addon # --------------------------------- try: unzipper = ziptools.ziptools() unzipper.extract(localfilename, config.get_runtime_path()) except: xbmc.executebuiltin('Extract("%s", "%s")' % (localfilename, config.get_runtime_path())) time.sleep(1) # Borrar el zip descargado # ------------------------ try: os.remove(localfilename) except: pass # Si es PY3 se actualizan los módulos marshal if PY3: from platformcode.custom_code import marshal_check marshal_check() # Guardar información de la versión fixeada # ----------------------------------------- if 'files' in data: data.pop('files', None) open(last_fix_json, "w").write(jsontools.dump(data)) logger.info('Addon actualizado correctamente a %s.fix%d' % (data['addon_version'], data['fix_version'])) if verbose: dialog_notification('Alfa actualizado a', 'Versión %s.fix%d' % (data['addon_version'], data['fix_version'])) check_update_to_others(verbose=verbose) # Comprueba las actualuzaciones de otros productos return True except: logger.error('Error al comprobar actualizaciones del addon!') logger.error(traceback.format_exc()) if verbose: dialog_notification('Alfa actualizaciones', 'Error al comprobar actualizaciones') check_update_to_others(verbose=verbose) # Comprueba las actualuzaciones de otros productos return False
def getmainlist(view="thumb_"): logger.debug() itemlist = list() # Main Menu Channels if addon.getSetting('enable_news_menu') == "true": itemlist.append( Item(title=config.get_localized_string(30130), channel="news", action="mainlist", thumbnail=get_thumb("news.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", context=[{ "title": config.get_localized_string(70285), "channel": "shortcuts", "action": "SettingOnPosition", "category": 7, "setting": 1 }])) if addon.getSetting('enable_channels_menu') == "true": itemlist.append( Item(title=config.get_localized_string(30118), channel="channelselector", action="getchanneltypes", thumbnail=get_thumb("channels.png", view), view=view, category=config.get_localized_string(30119), viewmode="thumbnails")) if addon.getSetting('enable_search_menu') == "true": itemlist.append( Item(title=config.get_localized_string(30103), channel="search", path='special', action="mainlist", thumbnail=get_thumb("search.png", view), category=config.get_localized_string(30119), viewmode="list", context=[{ "title": config.get_localized_string(60412), "action": "setting_channel_new", "channel": "search" }, { "title": config.get_localized_string(70286), "channel": "shortcuts", "action": "SettingOnPosition", "category": 5, "setting": 1 }])) if addon.getSetting('enable_onair_menu') == "true": itemlist.append( Item(channel="filmontv", action="mainlist", title=config.get_localized_string(50001), thumbnail=get_thumb("on_the_air.png"), viewmode="thumbnails")) if addon.getSetting('enable_link_menu') == "true": itemlist.append( Item(title=config.get_localized_string(70527), channel="kodfavorites", action="mainlist", thumbnail=get_thumb("mylink.png", view), view=view, category=config.get_localized_string(70527), viewmode="thumbnails")) if addon.getSetting('enable_fav_menu') == "true": itemlist.append( Item(title=config.get_localized_string(30102), channel="favorites", action="mainlist", thumbnail=get_thumb("favorites.png", view), category=config.get_localized_string(30102), viewmode="thumbnails")) if config.get_videolibrary_support() and addon.getSetting( 'enable_library_menu') == "true": itemlist.append( Item(title=config.get_localized_string(30131), channel="videolibrary", action="mainlist", thumbnail=get_thumb("videolibrary.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", context=[{ "title": config.get_localized_string(70287), "channel": "shortcuts", "action": "SettingOnPosition", "category": 2, "setting": 1 }, { "title": config.get_localized_string(60568), "channel": "videolibrary", "action": "update_videolibrary" }])) if downloadenabled != "false": itemlist.append( Item(title=config.get_localized_string(30101), channel="downloads", action="mainlist", thumbnail=get_thumb("downloads.png", view), viewmode="list", context=[{ "title": config.get_localized_string(70288), "channel": "shortcuts", "action": "SettingOnPosition", "category": 6 }])) thumb_setting = "setting_%s.png" % 0 # config.get_setting("plugin_updates_available") itemlist.append( Item(title=config.get_localized_string(30100), channel="setting", action="settings", thumbnail=get_thumb(thumb_setting, view), category=config.get_localized_string(30100), viewmode="list", folder=False)) itemlist.append( Item(title=config.get_localized_string(30104) + " (v" + config.get_addon_version(with_fix=True) + ")", channel="help", action="mainlist", thumbnail=get_thumb("help.png", view), category=config.get_localized_string(30104), viewmode="list")) return itemlist
import time import os from platformcode import config, logger, platformtools from core import jsontools from core import filetools from core.item import Item from lib.alfa_assistant import execute_binary_from_alfa_assistant json_data_file_name = 'custom_code.json' ADDON_NAME = 'plugin.video.alfa' ADDON_PATH = config.get_runtime_path() ADDON_USERDATA_PATH = config.get_data_path() ADDON_USERDATA_BIN_PATH = filetools.join(ADDON_USERDATA_PATH, 'bin') ADDON_VERSION = config.get_addon_version(with_fix=False, from_xml=True) ADDON_CUSTOMCODE_JSON = filetools.join(ADDON_PATH, json_data_file_name) def init(): logger.info() """ Todo el código añadido al add-on se borra con cada actualización. Esta función permite restaurarlo automáticamente con cada actualización. Esto permite al usuario tener su propio código, bajo su responsabilidad, y restaurarlo al add-on cada vez que se actualiza. El mecanismo funciona copiando el contenido de la carpeta-arbol "./userdata/addon_data/plugin.video.alfa/custom_code/..." sobre las carpetas de código del add-on. No verifica el contenido, solo vuelca(reemplaza) el contenido de "custom_code". El usuario almacenará en las subcarpetas de "custom_code" su código actualizado y listo para ser copiado en cualquier momento. Si no se desea que copie algo, simplemente se borra de "custom_code" y ya no se copiará en la próxima actualización.
def getmainlist(view="thumb_"): logger.info() itemlist = list() # Añade los canales que forman el menú principal itemlist.append( Item(title=config.get_localized_string(30130), channel="news", action="mainlist", thumbnail=get_thumb("news.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", context=[{ "title": config.get_localized_string(70285), "channel": "news", "action": "menu_opciones", "goto": True }])) itemlist.append( Item(title=config.get_localized_string(30118), channel="channelselector", action="getchanneltypes", thumbnail=get_thumb("channels.png", view), view=view, category=config.get_localized_string(30119), viewmode="thumbnails")) itemlist.append( Item(title=config.get_localized_string(70527), channel="alfavorites", action="mainlist", thumbnail=get_thumb("mylink.png", view), view=view, category=config.get_localized_string(70527), viewmode="thumbnails")) itemlist.append( Item(title=config.get_localized_string(30103), channel="search", action="mainlist", thumbnail=get_thumb("search.png", view), category=config.get_localized_string(30119), viewmode="list", context=[{ "title": config.get_localized_string(70286), "channel": "search", "action": "opciones", "goto": True }])) itemlist.append( Item(title=config.get_localized_string(30102), channel="favorites", action="mainlist", thumbnail=get_thumb("favorites.png", view), category=config.get_localized_string(30102), viewmode="thumbnails")) if config.get_videolibrary_support(): itemlist.append( Item(title=config.get_localized_string(30131), channel="videolibrary", action="mainlist", thumbnail=get_thumb("videolibrary.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", context=[{ "title": config.get_localized_string(70287), "channel": "videolibrary", "action": "channel_config" }])) itemlist.append( Item(title=config.get_localized_string(30101), channel="downloads", action="mainlist", thumbnail=get_thumb("downloads.png", view), viewmode="list", context=[{ "title": config.get_localized_string(70288), "channel": "setting", "config": "downloads", "action": "channel_config" }])) thumb_setting = "setting_%s.png" % 0 # config.get_setting("plugin_updates_available") itemlist.append( Item(title=config.get_localized_string(30100), channel="setting", action="mainlist", thumbnail=get_thumb(thumb_setting, view), category=config.get_localized_string(30100), viewmode="list")) if config.is_xbmc(): itemlist.append( Item(title="Reportar un fallo", channel="setting", action="report_menu", thumbnail=get_thumb("error.png", view), category=config.get_localized_string(30104), viewmode="list")) itemlist.append( Item(title=config.get_localized_string(30104) + " (" + config.get_localized_string(20000) + " " + config.get_addon_version(with_fix=False) + ")", channel="help", action="mainlist", thumbnail=get_thumb("help.png", view), category=config.get_localized_string(30104), viewmode="list")) itemlist.append( Item( channel="setting", action="call_chrome", url='https://alfa-addon.com/foros/tutoriales.11/', title= "Tutoriales relevantes [COLOR yellow](pincha si tienes instalado Chrome)[/COLOR]:", thumbnail=get_thumb("help.png", view), unify=False, folder=False, category=config.get_localized_string(30104), viewmode="list")) itemlist.append( Item( channel="setting", action="call_chrome", url= 'https://alfa-addon.com/threads/descargas-gestion-integral-de-clientes-torrent.3526/', title= "- [COLOR yellow]Descargas: Gestión Integral de Clientes Torrent[/COLOR] " + "https://alfa-addon.com/threads/descargas-gestion-integral-de-clientes-torrent.3526/", thumbnail=get_thumb("help.png", view), unify=False, folder=False, category=config.get_localized_string(30104), viewmode="list")) itemlist.append( Item( channel="setting", action="call_chrome", url= 'https://alfa-addon.com/threads/no-se-actualiza-alfa-como-descargarlo-manualmente.3292/', title= "- [COLOR yellow]¿No se ACTUALIZA Alfa? Cómo DESCARGARLO manualmente[/COLOR] " + "https://alfa-addon.com/threads/no-se-actualiza-alfa-como-descargarlo-manualmente.3292/", thumbnail=get_thumb("help.png", view), unify=False, folder=False, category=config.get_localized_string(30104), viewmode="list")) return itemlist