def download_and_install_package(item): logger.info() from core import updater from platformcode import platformtools if item.package=="plugin": if int(item.version)<updater.get_current_plugin_version(): if not platformtools.dialog_yesno("Installazione versione precedente","Sei sicuro di voler installare una versione precedente?"): return elif int(item.version)==updater.get_current_plugin_version(): if not platformtools.dialog_yesno("Reinstallare versione attuale","Sei sicuro di voler reinstallare la stessa versione già presente?"): return elif int(item.version)>updater.get_current_plugin_version(): if not platformtools.dialog_yesno("Installazione nuova versione","Sei sicuro di voler installare questa nuova versione?"): return else: if not platformtools.dialog_yesno("Pacchetto di installazione","Sei sicuro di voler installare questo pacchetto?"): return local_file_name = os.path.join( config.get_data_path() , item.filename) updater.download_and_install(item.url,local_file_name) if item.package=="channels": updater.set_current_channels_version(item.version) elif item.package=="servers": updater.set_current_servers_version(item.version) elif item.package=="plugin": updater.set_current_plugin_version(item.version) if config.is_xbmc() and config.get_system_platform() != "xbox": import xbmc xbmc.executebuiltin("Container.Refresh")
def download_and_install_package(item): logger.info() from core import updater from core import versiontools if item.package=="plugin": if int(item.version)<versiontools.get_current_plugin_version(): if not platformtools.dialog_yesno("Instalando versión anterior","¿Seguro que quieres instalar una versión anterior?"): return elif int(item.version)==versiontools.get_current_plugin_version(): if not platformtools.dialog_yesno("Reinstalando versión actual","¿Seguro que quieres reinstalar la misma versión que ya tienes?"): return elif int(item.version)>versiontools.get_current_plugin_version(): if not platformtools.dialog_yesno("Instalando nueva versión","¿Seguro que quieres instalar esta nueva versión?"): return else: if not platformtools.dialog_yesno("Instalando paquete","¿Seguro que quieres instalar este paquete?"): return local_file_name = os.path.join( config.get_data_path() , item.filename) updater.download_and_install(item.url,local_file_name) if config.is_xbmc() and config.get_system_platform() != "xbox": import xbmc xbmc.executebuiltin("Container.Refresh")
def recover_advancedsettings(item): logger.info("pelisalacarta.channels.ayuda recover_advancedsettings") fichero_backup = os.path.join(config.get_data_path(), "original_advancedsettings_backup.xml") advancedsettings_kodi = xbmc.translatePath("special://userdata/advancedsettings.xml") if platformtools.dialog_yesno("pelisalacarta", "Deseas restaurar el backup de advancedsettings.xml?") == 1: if os.path.exists(fichero_backup): logger.info("pelisalacarta.channels.ayuda Existe un backup de advancedsettings.xml") f_backup = open(fichero_backup) f_original = open(advancedsettings_kodi, "w") for line in f_backup: f_original.write(line) f_backup.close() f_original.close() platformtools.dialog_ok("pelislacarta", "Backup restaurado correctamente") else: logger.info("pelisalacarta.channels.ayuda No hay ningun backup disponible") if platformtools.dialog_yesno("pelisalacarta", "No hay ningun backup disponible." "Deseas crearlo?") == 1: f_origen = open(advancedsettings_kodi) f_backup = open(fichero_backup, "w") for line in f_origen: f_backup.write(line) f_origen.close() f_backup.close() platformtools.dialog_notification("pelisalacarta", "Backup hecho!") logger.info("pelisalacarta.channels.ayuda Backup terminado!") else: platformtools.dialog_notification("pelisalacarta", "Backup no hecho!") logger.info("pelisalacarta.channels.ayuda Backup no hecho!") else: platformtools.dialog_notification("pelisalacarta", "Operacion cancelada por el usuario") logger.info("pelisalacarta.channels.ayuda Optimizacion de adavancedsettings.xml cancelada!") return []
def eliminar(item): def eliminar_todo(item): filetools.rmdirtree(item.path) if config.is_xbmc(): import xbmc # esperamos 3 segundos para dar tiempo a borrar los ficheros xbmc.sleep(3000) # TODO mirar por qué no funciona al limpiar en la biblioteca de Kodi al añadirle un path # limpiamos la biblioteca de Kodi library.clean() logger.info("Eliminados todos los enlaces") platformtools.itemlist_refresh() logger.info(item.contentTitle) #logger.debug(item.tostring('\n')) if item.contentType == 'movie': heading = "Eliminar película" else: heading = "Eliminar serie" if item.multicanal: # Obtener listado de canales opciones = ["Eliminar solo los enlaces de %s" % k.capitalize() for k in item.library_urls.keys() if k !="descargas"] opciones.insert(0, heading) index = platformtools.dialog_select(config.get_localized_string(30163), opciones) if index == 0: # Seleccionado Eliminar pelicula/serie eliminar_todo(item) elif index > 0: # Seleccionado Eliminar canal X canal = opciones[index].replace("Eliminar solo los enlaces de ", "").lower() num_enlaces= 0 for fd in filetools.listdir(item.path): if fd.endswith(canal + '].json'): if filetools.remove(filetools.join(item.path, fd)): num_enlaces += 1 if num_enlaces > 0: # Actualizar .nfo head_nfo, item_nfo = library.read_nfo(item.nfo) del item_nfo.library_urls[canal] filetools.write(item.nfo, head_nfo + item_nfo.tojson()) msg_txt = "Eliminados %s enlaces del canal %s" % (num_enlaces, canal) logger.info(msg_txt) platformtools.dialog_notification(heading, msg_txt) platformtools.itemlist_refresh() else: if platformtools.dialog_yesno(heading, "¿Realmente desea eliminar '%s' de su biblioteca?" % item.infoLabels['title']): eliminar_todo(item)
def save_download_movie(item): logger.info("contentAction: %s | contentChannel: %s | contentTitle: %s" % ( item.contentAction, item.contentChannel, item.contentTitle)) progreso = platformtools.dialog_progress("Download", "Recupero del film") result = scraper.find_and_set_infoLabels(item) if not result: progreso.close() item.contentType = "video" return save_download_video(item) progreso.update(0, "Aggiunta del film...") item.downloadFilename = filetools.validate_path("%s [%s]" % (item.contentTitle.strip(), item.contentChannel)) write_json(item) progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), "Avviare il download adesso?"): platformtools.dialog_ok(config.get_localized_string(30101), item.contentTitle, config.get_localized_string(30109)) else: start_download(item)
def save_download_tvshow(item): logger.info("contentAction: %s | contentChannel: %s | contentType: %s | contentSerieName: %s" % (item.contentAction, item.contentChannel, item.contentType, item.contentSerieName)) progreso = platformtools.dialog_progress("Descargas", "Obteniendo datos de la serie") tmdb.find_and_set_infoLabels_tmdb(item) item.downloadFilename = item.downloadFilename = "%s [%s]" % (item.contentSerieName, item.contentChannel) progreso.update(0, "Obteniendo episodios...", "conectando con %s..." % item.contentChannel) episodes = get_episodes(item) progreso.update(0, "Añadiendo capitulos...", " ") for x, i in enumerate(episodes): progreso.update(x * 100 / len(episodes), "%dx%0.2d: %s" % (i.contentSeason, i.contentEpisodeNumber, i.contentTitle)) write_json(i) progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), "¿Iniciar la descarga ahora?"): platformtools.dialog_ok(config.get_localized_string(30101), str(len(episodes)) + " capitulos de: " + item.contentSerieName, config.get_localized_string(30109)) else: for i in episodes: res = start_download(i) if res == STATUS_CODES.canceled: break
def save_download_movie(item): logger.info("pelisalacarta.channels.descargas save_download_movie") progreso = platformtools.dialog_progress("Descargas", "Obteniendo datos de la pelicula") tmdb.find_and_set_infoLabels_tmdb(item) progreso.update(0, "Añadiendo pelicula...") item.action = "menu" item.channel = "descargas" item.downloadStatus = 0 item.downloadProgress = 0 item.downloadSize = 0 item.downloadCompleted = 0 item.downloadFilename = "%s [%s]" % (item.contentTitle.strip(), item.contentChannel) if item.text_color: del item.text_color if item.text_bold: del item.text_bold if item.text_italic: del item.text_italic item.path = filetools.encode(os.path.join(config.get_setting("downloadlistpath"), str(time.time()) + ".json")) filetools.write(item.path, item.tojson()) progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), "¿Iniciar la descarga ahora?"): platformtools.dialog_ok(config.get_localized_string(30101), item.contentTitle, config.get_localized_string(30109)) else: start_download(item)
def save_download_tvshow(item): logger.info("contentAction: %s | contentChannel: %s | contentType: %s | contentSerieName: %s" % ( item.contentAction, item.contentChannel, item.contentType, item.contentSerieName)) progreso = platformtools.dialog_progress("Download", "Recupero della serie") scraper.find_and_set_infoLabels(item) item.downloadFilename = filetools.validate_path("%s [%s]" % (item.contentSerieName, item.contentChannel)) progreso.update(0, "Recupero episodi...", "connessione a %s..." % item.contentChannel) episodes = get_episodes(item) progreso.update(0, "Aggiunta capitoli...", " ") for x, i in enumerate(episodes): progreso.update(x * 100 / len(episodes), "%dx%0.2d: %s" % (i.contentSeason, i.contentEpisodeNumber, i.contentTitle)) write_json(i) progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), "Avviare il download adesso?"): platformtools.dialog_ok(config.get_localized_string(30101), str(len(episodes)) + " capitoli di: " + item.contentSerieName, config.get_localized_string(30109)) else: for i in episodes: res = start_download(i) if res == STATUS_CODES.canceled: break
def borrar_filtro(item): logger.info() if item: # OBTENEMOS LOS DATOS DEL JSON dict_series = get_tvshows(item.from_channel) tvshow = item.show.strip().lower() heading = "¿Está seguro que desea eliminar el filtro?" line1 = "Pulse 'Si' para eliminar el filtro de [COLOR blue]{0}[/COLOR], pulse 'No' o cierre la ventana para " \ "no hacer nada.".format(item.show.strip()) if platformtools.dialog_yesno(heading, line1) == 1: lang_selected = dict_series.get(tvshow, {}).get(TAG_LANGUAGE, "") dict_series.pop(tvshow, None) fname, json_data = update_json_data(dict_series, item.from_channel) result = filetools.write(fname, json_data) if result: message = "FILTRO ELIMINADO" else: message = "Error al guardar en disco" heading = "{0} [{1}]".format(item.show.strip(), lang_selected) platformtools.dialog_notification(heading, message)
def save_download_tvshow(item): logger.info("pelisalacarta.channels.descargas save_download_tvshow") logger.info("Tipo: %s" % item.contentType) progreso = platformtools.dialog_progress("Descargas", "Obteniendo datos de la serie") tmdb.find_and_set_infoLabels_tmdb(item) item.downloadFilename = item.downloadFilename = "%s [%s]" % (item.contentSerieName, item.contentChannel) episodes = get_episodes(item) progreso.update(0, "Añadiendo capitulos...") for x, i in enumerate(episodes): progreso.update(x * 100 / len(episodes), os.path.basename(i.downloadFilename)) i.path = os.path.join(config.get_setting("downloadlistpath"), str(time.time()) + ".json") filetools.write(i.path, i.tojson()) time.sleep(0.1) progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), "¿Iniciar la descarga ahora?"): platformtools.dialog_ok(config.get_localized_string(30101), str(len(episodes)) + " capitulos de: " + item.contentSerieName, config.get_localized_string(30109)) else: for i in episodes: res = start_download(i) if res == 1: break
def update_biblio(item): logger.info() # Actualizar las series activas sobreescribiendo import library_service if item.extra == "overwrite_everything": if config.is_xbmc(): seleccion = platformtools.dialog_yesno(config.PLUGIN_NAME, "Avviso: devi attendere.", "Vuoi continuare ?") if seleccion == 1: library_service.check_for_update(overwrite="everything") else: library_service.check_for_update(overwrite="everything") else: library_service.check_for_update(overwrite=True) # Eliminar las carpetas de peliculas que no contengan archivo strm for raiz, subcarpetas, ficheros in filetools.walk(library.MOVIES_PATH): strm = False for f in ficheros: if f.endswith(".strm"): strm = True break if ficheros and not strm: logger.debug("Borrando carpeta de pelicula eliminada: %s" % raiz) filetools.rmdirtree(raiz)
def backups(item): from platformcode import platformtools logger.info("pelisalacarta.channel.configuracion backups") ruta = filetools.join(config.get_data_path(), "backups") ruta_split = "" if "ruta" in item.title: heading = "Ruta de copias de seguridad" if not filetools.exists(ruta): folders = "Carpeta no creada" else: folders = str(len(filetools.listdir(ruta))) + " copia/s de seguridad guardadas" if len(ruta) > 55: ruta_split = ruta[55:] ruta = ruta[:55] platformtools.dialog_ok(heading, ruta, ruta_split, folders) else: if not filetools.exists(ruta): platformtools.dialog_ok("La carpeta no existe", "No hay copias de seguridad guardadas") else: dyesno = platformtools.dialog_yesno("Las copias de seguridad se eliminarán", "¿Está seguro?") if dyesno: import shutil shutil.rmtree(ruta, ignore_errors=True)
def recover_advancedsettings(item): logger.info() fichero_backup = os.path.join(config.get_data_path(), "original_advancedsettings_backup.xml") advancedsettings_kodi = xbmc.translatePath("special://profile/advancedsettings.xml") if platformtools.dialog_yesno("pelisalacarta", "¿Deseas restaurar el backup de advancedsettings.xml?") == 1: if os.path.exists(fichero_backup): logger.info("Existe un backup de advancedsettings.xml") f_backup = open(fichero_backup) open(os.path.join(advancedsettings_kodi), "w").close() f_original = open(os.path.join(advancedsettings_kodi), "w") for line in f_backup: if "</advancedsettings>" in line: line = os.linesep.join([s for s in line.splitlines() if s]) f_original.write(line) f_backup.close() f_original.close() platformtools.dialog_ok("pelislacarta", "Backup restaurado correctamente.") else: logger.info("No hay ningun backup disponible") if platformtools.dialog_yesno("pelisalacarta", "No hay ningun backup disponible. " "¿Deseas crearlo?") == 1: f_origen = open(advancedsettings_kodi) f_backup = open(fichero_backup, "w") for line in f_origen: f_backup.write(line) f_origen.close() f_backup.close() platformtools.dialog_notification("pelisalacarta", "Backup completado") else: platformtools.dialog_notification("pelisalacarta", "Backup no creado") else: platformtools.dialog_notification("pelisalacarta", "Operacion cancelada por el usuario") logger.info("Restauracion de adavancedsettings.xml cancelada")
def elimina_file(item): logger.info("[bibiolteca.py] elimina_file") linea1 = '[COLOR azure]Confermi eliminazione di:[/COLOR]' linea2 = item.title + ' ?' linea3 = '' risposta = platformtools.dialog_yesno('Conferma eliminazione:', linea1, linea2, linea3) return risposta
def extract(self, file, dir, folder_to_extract="", overwrite_question=False, backup=False): logger.info("file=%s" % file) logger.info("dir=%s" % dir) if not dir.endswith(':') and not os.path.exists(dir): os.mkdir(dir) zf = zipfile.ZipFile(file) if not folder_to_extract: self._createstructure(file, dir) num_files = len(zf.namelist()) for name in zf.namelist(): logger.info("name=%s" % name) if not name.endswith('/'): content = zf.read(name) name = name.replace('-master', '') logger.info("no es un directorio") try: (path, filename) = os.path.split(os.path.join(dir, name)) logger.info("path=%s" % path) logger.info("name=%s" % name) if folder_to_extract: if path != os.path.join(dir, folder_to_extract): break else: os.makedirs(path) except: pass if folder_to_extract: outfilename = os.path.join(dir, filename) else: outfilename = os.path.join(dir, name) logger.info("outfilename=%s" % outfilename) try: if os.path.exists(outfilename) and overwrite_question: from platformcode import platformtools dyesno = platformtools.dialog_yesno("Il file esiste già", "Il file %s esiste già" \ ", vuoi sovrascrivere?" \ % os.path.basename(outfilename)) if not dyesno: break if backup: import time import shutil hora_folder = "Copia seguridad [%s]" % time.strftime("%d-%m_%H-%M", time.localtime()) backup = os.path.join(config.get_data_path(), 'backups', hora_folder, folder_to_extract) if not os.path.exists(backup): os.makedirs(backup) shutil.copy2(outfilename, os.path.join(backup, os.path.basename(outfilename))) outfile = open(outfilename, 'wb') outfile.write(content) except: logger.info("Error en fichero " + name)
def ask_set_content(): # Si es la primera vez que se utiliza la biblioteca preguntar si queremos autoconfigurar if config.get_setting("library_ask_set_content") == "true" and config.get_setting("library_set_content") == "false": heading = "Pelisalacarta Auto-configuración" linea1 = "¿Desea que Pelisalacarta auto-configure la biblioteca de Kodi?" linea2 = "Si pulsa 'no' y luego desea dicha integración deberá hacerlo manualmente." if platformtools.dialog_yesno(heading, linea1, linea2): config.set_setting("library_set_content", "true") config.set_setting("library_ask_set_content", "active") config.verify_directories_created() config.set_setting("library_ask_set_content", "false")
def ask_set_content(): # Si es la primera vez que se utiliza la biblioteca preguntar si queremos autoconfigurar if config.get_setting("library_ask_set_content") == "true" and config.get_setting("library_set_content") == "false": heading = "Streamondemand Auto-configurazione" linea1 = "Auto-configura la libreria di Kodi tramite Streamondemand?" linea2 = "E' possibile modifcare i path nelle Preferenze" if platformtools.dialog_yesno(heading, linea1, linea2): config.set_setting("library_set_content", "true") config.set_setting("library_ask_set_content", "active") config.verify_directories_created() config.set_setting("library_ask_set_content", "false")
def update_from_conf(): """ Se trata de una funcion que tiene como objetivo evitar el loop infinito al hacer la llamada desde ayuda.py """ if platformtools.dialog_yesno("pelisalacarta", "Seguro que desea actualizar los enlaces y la biblioteca?") == 1: main() platformtools.dialog_ok("pelisalacarta", "Proceso completado") # TODO: Mejorarlo else: platformtools.dialog_notification("Plugin", "Proceso abortado")
def save_download_video(item): logger.info("contentAction: %s | contentChannel: %s | contentTitle: %s" % (item.contentAction, item.contentChannel, item.contentTitle)) set_movie_title(item) item.downloadFilename = filetools.validate_path("%s [%s]" % (item.contentTitle.strip(), item.contentChannel)) write_json(item) if not platformtools.dialog_yesno(config.get_localized_string(30101), "Avviare il download adesso?"): platformtools.dialog_ok(config.get_localized_string(30101), item.contentTitle, config.get_localized_string(30109)) else: start_download(item)
def check_for_updates(item): from core import updater try: version = updater.checkforupdates() if version: from platformcode import platformtools yes_pressed = platformtools.dialog_yesno("Versión "+version+" disponible", "¿Quieres instalarla?") if yes_pressed: item = Item(version=version) updater.update(item) except: pass
def borrar_filtro(item): logger.info("[filtertools.py] borrar_filtro") if item: # OBTENEMOS LOS DATOS DEL JSON dict_series = get_filtered_tvshows(item.from_channel) tvshow = library.title_to_filename(item.show.strip().lower()) heading = "¿Está seguro que desea eliminar el filtro?" line1 = "Pulse 'Si' para eliminar el filtro de [COLOR blue]{0}[/COLOR], pulse 'No' o cierre la ventana para " \ "no hacer nada.".format(item.show.strip()) if platformtools.dialog_yesno(heading, line1) == 1: lang_selected = dict_series.get(tvshow, {}).get(TAG_LANGUAGE, "") dict_series.pop(tvshow, None) message = "FILTRO ELIMINADO" fname, json_data = update_json_data(dict_series, item.from_channel) message = save_file(json_data, fname, message) heading = "{0} [{1}]".format(item.show.strip(), lang_selected) platformtools.dialog_notification(heading, message)
def borrar(channel, show): logger.info() heading = "¿Está seguro que desea eliminar renumeración?" line1 = "Pulse 'Si' para eliminar la renumeración de [COLOR blue]{0}[/COLOR], pulse 'No' o cierre la ventana " \ "para no hacer nada.".format(show.strip()) if platformtools.dialog_yesno(heading, line1) == 1: dict_series = get_tvshows(channel) dict_series.pop(show, None) fname, json_data = update_json_data(dict_series, channel) result = filetools.write(fname, json_data) if result: message = "FILTRO ELIMINADO" else: message = "Error al guardar en disco" heading = show.strip() platformtools.dialog_notification(heading, message)
def save_download_video(item): logger.info("contentAction: %s | contentChannel: %s | contentTitle: %s" % (item.contentAction, item.contentChannel, item.contentTitle)) progreso = platformtools.dialog_progress("Descargas", "Añadiendo video...") if not item.contentTitle: item.contentTitle = re.sub("\[[^\]]+\]|\([^\)]+\)","",item.fulltitle).strip() if not item.contentTitle: item.contentTitle = re.sub("\[[^\]]+\]|\([^\)]+\)","",item.title).strip() item.downloadFilename = "%s [%s]" % (item.contentTitle.strip(), item.contentChannel) write_json(item) progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), "¿Iniciar la descarga ahora?"): platformtools.dialog_ok(config.get_localized_string(30101), item.contentTitle, config.get_localized_string(30109)) else: start_download(item)
def overwrite_tools(item): import library_service from core import library seleccion = platformtools.dialog_yesno("Sobrescribir toda la biblioteca", "Esto puede llevar algun tiempo.", "¿Desea continuar?") if seleccion == 1: heading = 'Sobrescribiendo biblioteca....' p_dialog = platformtools.dialog_progress_bg('pelisalacarta', heading) p_dialog.update(0, '') show_list = [] for path, folders, files in filetools.walk(library.TVSHOWS_PATH): show_list.extend([filetools.join(path, f) for f in files if f == "tvshow.nfo"]) if show_list: t = float(100) / len(show_list) for i, tvshow_file in enumerate(show_list): head_nfo, serie = library.read_nfo(tvshow_file) path = filetools.dirname(tvshow_file) if not serie.active: # si la serie no esta activa descartar continue # Eliminamos la carpeta con la serie ... filetools.rmdirtree(path) # ... y la volvemos a añadir library_service.update(path, p_dialog, i, t, serie, 3) p_dialog.close()
def save_download_movie(item): logger.info("contentAction: %s | contentChannel: %s | contentTitle: %s" % (item.contentAction, item.contentChannel, item.contentTitle)) progreso = platformtools.dialog_progress("Descargas", "Obteniendo datos de la pelicula") result = tmdb.find_and_set_infoLabels_tmdb(item) if not result: progreso.close() item.contentType = "video" return save_download_video(item) progreso.update(0, "Añadiendo pelicula...") item.downloadFilename = "%s [%s]" % (item.contentTitle.strip(), item.contentChannel) write_json(item) progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), "¿Iniciar la descarga ahora?"): platformtools.dialog_ok(config.get_localized_string(30101), item.contentTitle, config.get_localized_string(30109)) else: start_download(item)
def backups(item): from platformcode import platformtools logger.info() ruta = filetools.join(config.get_data_path(), 'backups') ruta_split = "" if "ruta" in item.title: heading = "Percorso di backup" if not filetools.exists(ruta): folders = "Directory non creata" else: folders = str(len(filetools.listdir(ruta))) + " copia/e di backup" if len(ruta) > 55: ruta_split = ruta[55:] ruta = ruta[:55] platformtools.dialog_ok(heading, ruta, ruta_split, folders) else: if not filetools.exists(ruta): platformtools.dialog_ok("La cartella non esiste", "Nessun backup salvato") else: dyesno = platformtools.dialog_yesno("I backup vengono cancellati", "Sei sicuro?") if dyesno: import shutil shutil.rmtree(ruta, ignore_errors=True)
def novedades(item): logger.info() global list_newest l_hilo = [] list_newest = [] start_time = time.time() multithread = config.get_setting("multithread", "novedades") logger.info("multithread= " + str(multithread)) if not multithread: if platformtools.dialog_yesno( "Multi-thread disattivato", "Il multi-thread consente una miglior performance nella ricerca", "Nei sistemi con poche risorse potrebbe essere imprecisa", "Attivare il multi-thread?"): if config.set_setting("multithread", True, "novedades"): multithread = True progreso = platformtools.dialog_progress(item.category, "Cercando nei canali ...") list_canales = get_list_canales() number_of_channels = len(list_canales[item.extra]) for index, channel in enumerate(list_canales[item.extra]): channel_id, channel_title = channel percentage = index * 100 / number_of_channels # Modo Multi Thread if multithread: t = Thread(target=get_newest, args=[channel_id, item.extra], name=channel_title) t.start() l_hilo.append(t) progreso.update(percentage / 2, "Cercando in '%s' ..." % channel_title) # Modo single Thread else: logger.info("Ottenendo novità da channel_id=" + channel_id) progreso.update(percentage, "Cercando in '%s' ..." % channel_title) get_newest(channel_id, item.extra) # Modo Multi Thread: esperar q todos los hilos terminen if multithread: pendent = [a for a in l_hilo if a.isAlive()] while pendent: percentage = (len(l_hilo) - len(pendent)) * 100 / len(l_hilo) if len(pendent) > 5: progreso.update( percentage, "Cercando in %d/%d canali ..." % (len(pendent), len(l_hilo))) else: list_pendent_names = [a.getName() for a in pendent] mensaje = "Cercando in %s" % (", ".join(list_pendent_names)) progreso.update(percentage, mensaje) logger.debug(mensaje) if progreso.iscanceled(): logger.info("Ricerca di novità annullata") break time.sleep(0.5) pendent = [a for a in l_hilo if a.isAlive()] mensaje = "Risultati ottenuti: %s | Tempo: %2.f secondi" % ( len(list_newest), time.time() - start_time) progreso.update(100, mensaje) logger.info(mensaje) start_time = time.time() # logger.debug(start_time) result_mode = config.get_setting("result_mode", "novedades") if result_mode == 0: # Agrupados por contenido ret = agruparXcontenido(list_newest, item.extra) elif result_mode == 1: # Agrupados por canales ret = agruparXcanal(list_newest, item.extra) else: # Sin agrupar ret = noAgrupar(list_newest, item.extra) while time.time() - start_time < 2: # mostrar cuadro de progreso con el tiempo empleado durante almenos 2 segundos time.sleep(0.5) progreso.close() return ret
def force_creation_advancedsettings(item): # Ruta del advancedsettings advancedsettings_kodi = xbmc.translatePath("special://userdata/advancedsettings.xml") advancedsettings_pelisalacarta = os.path.join(config.get_runtime_path(), "resources", "advancedsettings.xml") fichero_backup = os.path.join(config.get_data_path(), "original_advancedsettings_backup.xml") # Archivos temporales para la modificacion de advancedsettings.xml: advancedsettings_same = os.path.join(config.get_data_path(), "same.txt") advancedsettings_trans = os.path.join(config.get_data_path(), "trans.txt") if os.path.exists(advancedsettings_kodi): logger.info("pelisalacarta.channels.ayuda La ruta de advanced settings del usuario existe!") if platformtools.dialog_yesno("pelisalacarta", "Esto modificara los ajustes avanzados de Kodi. ", "Deseas continuar?") == 1: # Backup del advancedsettings existente, antes de modificarlo. f_origen = open(advancedsettings_kodi) if not os.path.exists(fichero_backup): f_backup = open(fichero_backup, "w") for line in f_origen: f_backup.write(line) f_backup.close() else: if platformtools.dialog_yesno("pelisalacarta", "Backup anterior encontrado. ", "Deseas sobreescribirlo?") == 1: os.remove(fichero_backup) f_backup = open(fichero_backup, "w") for line in f_origen: f_backup.write(line) f_backup.close() platformtools.dialog_notification("pelisalacarta", "Backup terminado!") logger.info("pelisalacarta.channels.ayuda Backup terminado!") else: platformtools.dialog_notification("pelisalacarta", "Backup no modificado") logger.info("pelisalacarta.channels.ayuda Backup no modificado!") f_origen.close() # Edicion de advancedsettings.xml f_mod = open(os.path.join(advancedsettings_pelisalacarta)) f_trans = open(os.path.join(advancedsettings_trans), "w") f_same = open(os.path.join(advancedsettings_same), "w") lines_seen = set() special_lines_seen = set() for line_mod in f_mod: f_orig = open(os.path.join(advancedsettings_kodi)) if (line_mod.startswith(("<advancedsettings>", "</network>", "</advancedsettings>")) and line_mod not in special_lines_seen): f_same.write(line_mod) if not line_mod.startswith("</network>"): f_trans.write(line_mod) special_lines_seen.add(line_mod) for line_orig in f_orig: if (line_orig.startswith(("<advancedsettings>", "</advancedsettings>")) and line_orig not in special_lines_seen and line_orig not in lines_seen): lines_seen.add(line_orig) if (line_orig == line_mod and line_orig not in lines_seen and line_orig not in special_lines_seen): line_same = line_orig f_same.write(line_same) lines_seen.add(line_orig) if (not line_orig.startswith(("<autodetectpingtime>", "<curlclienttimeout>", "<curllowspeedtime>", "<curlretries>", "<disableipv6>", "<cachemembuffersize>")) and line_orig not in lines_seen and line_orig not in special_lines_seen): line_trans = line_orig if line_orig.startswith("<network>"): f_same.write(line_orig) f_trans.write(line_trans) lines_seen.add(line_orig) f_orig.close() f_mod.close() f_trans.close() f_same.close() import filecmp if filecmp.cmp(advancedsettings_pelisalacarta, advancedsettings_same): platformtools.dialog_notification("pelisalacarta", "advancessettings.xml estaba optimizado!") else: platformtools.dialog_notification("pelisalacarta", "advancessettings.xml no estaba optimizado!") # Se vacia advancedsettings.xml open(os.path.join(advancedsettings_kodi)).close nospaces = False f_mod = open(os.path.join(advancedsettings_pelisalacarta)) if filecmp.cmp(advancedsettings_pelisalacarta, advancedsettings_same): platformtools.dialog_ok("pelisalacarta", "advancessettings.xml estaba optimizado!", "(No sera editado)") else: platformtools.dialog_notification("pelisalacarta", "modificando advancedsettings.xml...") f_trans = open(os.path.join(advancedsettings_trans)) f_orig = open(os.path.join(advancedsettings_kodi), "w") for line_trans in f_trans: if line_trans.startswith("<network>"): for line_mod in f_mod: if not line_mod.startswith(("<advancedsettings>", "</network>", "</advancedsettings>")): f_orig.write(line_mod) else: if (line_trans.startswith("</advancedsettings>") or nospaces): line_trans = os.linesep.join([s for s in line_trans.splitlines() if s]) f_orig.write(line_trans) nospaces = True else: f_orig.write(line_trans) if os.path.getsize(advancedsettings_same) == 0: logger.info("UPSSS, ocurrio un error: same.txt esta vacio!") if os.path.getsize(advancedsettings_trans) == 0: logger.info("UPSSS, ocurrio un error: trans.txt esta vacio!") for line_mod in f_mod: f_orig.write(line_mod) f_trans.close() f_orig.close() platformtools.dialog_ok("pelisalacarta", "Se ha modificado el fichero advancedsettings.xml", "con la configuración óptima para el streaming") f_mod.close() if os.path.exists(advancedsettings_same): logger.info("pelisalacarta.channels.ayuda Archivo de comparacion eliminado") os.remove(advancedsettings_same) if os.path.exists(advancedsettings_trans): logger.info("pelisalacarta.channels.ayuda Archivo de translacion eliminado") os.remove(advancedsettings_trans) else: platformtools.dialog_notification("pelisalacarta", "Operacion cancelada por el usuario") else: # Si no hay advancedsettings.xml se copia el advancedsettings.xml desde el directorio # resources al userdata. f_optimo = open(advancedsettings_pelisalacarta) f_original = open(advancedsettings_kodi, "w") for line in f_optimo: f_original.write(line) f_optimo.close() f_original.close() platformtools.dialog_ok("pelisalacarta", "Se ha creado un fichero advancedsettings.xml", "con la configuración óptima para streaming") logger.info("pelisalacarta.channels.ayuda 'force_creation_advancedsettings' method finnished") return []
def extract(self, file, dir, folder_to_extract="", overwrite_question=False, backup=False, update=False): logger.info("file=%s" % file) logger.info("dir=%s" % dir) if update: progreso = platformtools.dialog_progress( "Descomprimiendo", "Extrayendo archivos de la nueva versión") zf = zipfile.ZipFile(file) zf.extractall(dir) progreso.close() return if not dir.endswith(':') and not os.path.exists(dir): os.mkdir(dir) zf = zipfile.ZipFile(file) if not folder_to_extract: self._createstructure(file, dir) num_files = len(zf.namelist()) lenght = len(zf.namelist()) for i, name in enumerate(zf.namelist()): logger.info("name=%s" % name) if not name.endswith('/'): logger.info("no es un directorio") try: (path, filename) = os.path.split(os.path.join(dir, name)) logger.info("path=%s" % path) logger.info("name=%s" % name) if folder_to_extract: if path != os.path.join(dir, folder): break else: os.makedirs(path) except: pass if folder_to_extract: outfilename = os.path.join(dir, filename) else: outfilename = os.path.join(dir, name) logger.info("outfilename=%s" % outfilename) try: if os.path.exists(outfilename) and overwrite_question: dyesno = platformtools.dialog_yesno("El archivo ya existe", "El archivo %s a descomprimir ya existe" \ ", ¿desea sobrescribirlo?" \ % os.path.basename(outfilename)) if not dyesno: break if backup: import time import shutil hora_folder = "Copia seguridad [%s]" % time.strftime( "%d-%m_%H-%M", time.localtime()) backup = os.path.join(config.get_data_path(), 'backups', hora_folder, folder_to_extract) if not os.path.exists(backup): os.makedirs(backup) shutil.copy2( outfilename, os.path.join(backup, os.path.basename(outfilename))) outfile = open(outfilename, 'wb') outfile.write(zf.read(name)) except: logger.info("Error en fichero " + name)
def force_creation_advancedsettings(item): logger.info() # Ruta del advancedsettings advancedsettings_kodi = xbmc.translatePath("special://profile/advancedsettings.xml") advancedsettings_pelisalacarta = os.path.join(config.get_runtime_path(), "resources", "advancedsettings.xml") fichero_backup = os.path.join(config.get_data_path(), "original_advancedsettings_backup.xml") # Archivos temporales para la modificacion de advancedsettings.xml: advancedsettings_same = os.path.join(config.get_data_path(), "same.txt") advancedsettings_trans = os.path.join(config.get_data_path(), "trans.txt") if os.path.exists(advancedsettings_kodi): orig_size = os.path.getsize(advancedsettings_kodi) else: orig_size = 0 indent_1 = "\t" indent_1_p = " " indent_2 = "\t\t" if platformtools.dialog_yesno("AVISO", "No recomendable para equipos lentos y TV-BOX. Razon: ZeroCache", "¿Deseas continuar?") == 1: if os.path.exists(advancedsettings_kodi) and orig_size != 0: logger.info("La ruta de advanced settings del usuario existe!") if platformtools.dialog_yesno("pelisalacarta", "Esto modificará los ajustes avanzados de Kodi.", "¿Deseas continuar?") == 1: # Backup del advancedsettings existente, antes de modificarlo. f_origen = open(advancedsettings_kodi) if not os.path.exists(fichero_backup): f_backup = open(fichero_backup, "w") for line in f_origen: f_backup.write(line) f_backup.close() platformtools.dialog_notification("pelisalacarta", "Backup creado") else: if platformtools.dialog_yesno("pelisalacarta", "Backup anterior encontrado. ", "¿Deseas sobreescribirlo?") == 1: os.remove(fichero_backup) f_backup = open(fichero_backup, "w") for line in f_origen: f_backup.write(line) f_backup.close() platformtools.dialog_notification("pelisalacarta", "¡Backup terminado!") logger.info("Backup terminado") else: platformtools.dialog_notification("pelisalacarta", "Backup no modificado") logger.info("Backup no modificado") f_origen.close() # Edicion de advancedsettings.xml f_mod = open(os.path.join(advancedsettings_pelisalacarta)) f_trans = open(os.path.join(advancedsettings_trans), "w") f_same = open(os.path.join(advancedsettings_same), "w") f_orig = open(os.path.join(advancedsettings_kodi)) lines_seen = set() special_lines_seen = set() for line_mod in f_mod: if (line_mod.startswith(("<advancedsettings>", "</network>", "</advancedsettings>")) and line_mod not in special_lines_seen): f_same.write(line_mod) if not line_mod.startswith("</network>"): f_trans.write(line_mod) special_lines_seen.add(line_mod) for line_orig in f_orig: # Se borra las indentaciones, ya sean puntos o tabulaciones line_orig = line_orig.replace(indent_1, "").replace(indent_1_p, "") if (line_orig.startswith(("<advancedsettings>", "</advancedsettings>")) and line_orig not in special_lines_seen and line_orig not in lines_seen): lines_seen.add(line_orig) if (line_orig == line_mod and line_orig not in lines_seen and line_orig not in special_lines_seen): line_same = line_orig f_same.write(line_same) lines_seen.add(line_orig) if (not line_orig.startswith(("<autodetectpingtime>", "<curlclienttimeout>", "<curllowspeedtime>", "<curlretries>", "<disableipv6>", "<cachemembuffersize>")) and line_orig not in lines_seen and line_orig not in special_lines_seen): line_trans = line_orig if line_orig.startswith("<network>"): f_same.write(line_orig) f_trans.write(line_trans) lines_seen.add(line_orig) f_orig.close() f_mod.close() f_trans.close() f_same.close() import filecmp if filecmp.cmp(advancedsettings_pelisalacarta, advancedsettings_same): platformtools.dialog_ok("pelisalacarta", "¡'advancessettings.xml' estaba optimizado!", "(No sera editado)") else: platformtools.dialog_notification("pelisalacarta", "modificando advancedsettings.xml...") # Se vacia el advancedsettings.xml del usuario open(os.path.join(advancedsettings_kodi), "w").close nospaces = False f_mod = open(os.path.join(advancedsettings_pelisalacarta)) f_trans = open(os.path.join(advancedsettings_trans)) f_orig = open(os.path.join(advancedsettings_kodi), "w") exclusion = ["advancedsettings", "/network"] for line_trans in f_trans: if line_trans.startswith("<network>"): for line_mod in f_mod: i = 0 for w in exclusion: if w in line_mod: i += 1 if i == 0: if "network" in line_mod: indent = indent_1 else: indent = indent_2 f_orig.write(indent + line_mod) logger.info(line_mod) else: if (line_trans.startswith("</advancedsettings>") or nospaces): line_trans = os.linesep.join([s for s in line_trans.splitlines() if s]) # Se convierten puntos a tabulaciones line_trans = line_trans.replace(indent_1_p, indent_1) f_orig.write(line_trans) nospaces = True else: if "network" in line_trans: indent = indent_1 else: indent = "" f_orig.write(indent + line_trans) if os.path.getsize(advancedsettings_trans) == 0: for line_mod in f_mod: if "advancedsettings" in line_mod: indent = "" elif "network" in line_mod: indent = indent_1 else: indent = indent_2 f_orig.write(indent + line_mod) f_trans.close() f_orig.close() platformtools.dialog_notification("pelisalacarta", "Modificacion completada") f_mod.close() if os.path.exists(advancedsettings_same): os.remove(advancedsettings_same) if os.path.exists(advancedsettings_trans): os.remove(advancedsettings_trans) else: platformtools.dialog_notification("pelisalacarta", "Operacion cancelada") else: # Si no hay advancedsettings.xml se copia del directorio resources f_optimo = open(advancedsettings_pelisalacarta) f_original = open(advancedsettings_kodi, "w") for line in f_optimo: if "advancedsettings" in line: indent = "" elif "network" in line: indent = indent_1 else: indent = indent_2 f_original.write(indent + line) f_optimo.close() f_original.close() platformtools.dialog_ok("pelisalacarta", "Se ha creado un fichero advancedsettings.xml", "con la configuración óptima para streaming") logger.info("Optimizacion finalizada") else: platformtools.dialog_notification("pelisalacarta", "Operacion abortada")
def extract(self, file, dir, folder_to_extract="", overwrite_question=False, backup=False): logger.debug("file= %s" % file) logger.debug("dir= %s" % dir) if not dir.endswith(':') and not filetools.exists(dir): filetools.mkdir(dir) zf = zipfile.ZipFile(filetools.file_open(file, vfs=False)) if not folder_to_extract: self._createstructure(file, dir) num_files = len(zf.namelist()) for nameo in zf.namelist(): name = nameo.replace(':', '_').replace('<', '_').replace( '>', '_').replace('|', '_').replace('"', '_').replace('?', '_').replace('*', '_') logger.debug("name=%s" % nameo) if not name.endswith('/'): logger.debug("it's not a directory") try: (path, filename) = filetools.split(filetools.join(dir, name)) logger.debug("path=%s" % path) logger.debug("name=%s" % name) if folder_to_extract: if path != filetools.join(dir, folder_to_extract): break else: filetools.mkdir(path) except: pass if folder_to_extract: outfilename = filetools.join(dir, filename) else: outfilename = filetools.join(dir, name) logger.debug("outfilename=%s" % outfilename) try: if filetools.exists(outfilename) and overwrite_question: from platformcode import platformtools dyesno = platformtools.dialog_yesno( "File already exists ", " File %s to unzip already exists, do you want to overwrite it?" % filetools.basename(outfilename)) if not dyesno: break if backup: import time hora_folder = "Backup [%s]" % time.strftime( "%d-%m_%H-%M", time.localtime()) backup = filetools.join(config.get_data_path(), 'backups', hora_folder, folder_to_extract) if not filetools.exists(backup): filetools.mkdir(backup) filetools.copy( outfilename, filetools.join( backup, filetools.basename(outfilename))) if not filetools.write( outfilename, zf.read(nameo), silent=True, vfs=VFS): #TRUNCA en FINAL en Kodi 19 con VFS logger.error("File error " + nameo) except: import traceback logger.error(traceback.format_exc()) logger.error("File error " + nameo) try: zf.close() except: logger.error("Error closing .zip " + file)
def set_content(content_type, silent=False): """ Procedimiento para auto-configurar la biblioteca de kodi con los valores por defecto @type content_type: str ('CINE' o 'SERIES') @param content_type: tipo de contenido para configurar, series o peliculas """ if config.is_xbmc(): continuar = True msg_text = "" librarypath = config.get_setting("librarypath") if content_type == 'CINE': if not xbmc.getCondVisibility( 'System.HasAddon(metadata.themoviedb.org)'): if not silent: # Preguntar si queremos instalar metadata.themoviedb.org install = platformtools.dialog_yesno( "The Movie Database", "No se ha encontrado el Scraper de películas de TheMovieDB.", "¿Desea instalarlo ahora?") else: install = True if install: try: # Instalar metadata.themoviedb.org xbmc.executebuiltin( 'xbmc.installaddon(metadata.themoviedb.org)', True) logger.info( "Instalado el Scraper de películas de TheMovieDB") except: pass continuar = (install and xbmc.getCondVisibility( 'System.HasAddon(metadata.themoviedb.org)')) if not continuar: msg_text = "The Movie Database no instalado." else: # SERIES # Instalar The TVDB if not xbmc.getCondVisibility( 'System.HasAddon(metadata.tvdb.com)'): if not silent: # Preguntar si queremos instalar metadata.tvdb.com install = platformtools.dialog_yesno( "The TVDB", "No se ha encontrado el Scraper de series de The TVDB.", "¿Desea instalarlo ahora?") else: install = True if install: try: # Instalar metadata.tvdb.com xbmc.executebuiltin( 'xbmc.installaddon(metadata.tvdb.com)', True) logger.info( "Instalado el Scraper de series de The TVDB") except: pass continuar = (install and xbmc.getCondVisibility( 'System.HasAddon(metadata.tvdb.com)')) if not continuar: msg_text = "The TVDB no instalado." # Instalar TheMovieDB if continuar and not xbmc.getCondVisibility( 'System.HasAddon(metadata.tvshows.themoviedb.org)'): continuar = False if not silent: # Preguntar si queremos instalar metadata.tvshows.themoviedb.org install = platformtools.dialog_yesno( "The Movie Database", "No se ha encontrado el Scraper de series de TheMovieDB.", "¿Desea instalarlo ahora?") else: install = True if install: try: # Instalar metadata.tvshows.themoviedb.org # 1º Probar desde el repositorio ... xbmc.executebuiltin( 'xbmc.installaddon(metadata.tvshows.themoviedb.org)', True) if not xbmc.getCondVisibility( 'System.HasAddon(metadata.tvshows.themoviedb.org)' ): # ...si no funciona descargar e instalar desde la web url = "http://mirrors.kodi.tv/addons/jarvis/metadata.tvshows.themoviedb.org/metadata.tvshows.themoviedb.org-1.3.1.zip" path_down = xbmc.translatePath( "special://home/addons/packages/metadata.tvshows.themoviedb.org-1.3.1.zip" ) path_unzip = xbmc.translatePath( "special://home/addons/") header = ( "User-Agent", "Kodi/15.2 (Windows NT 10.0; WOW64) App_Bitness/32 Version/15.2-Git:20151019-02e7013" ) from core import downloadtools from core import ziptools downloadtools.downloadfile(url, path_down, continuar=True, headers=[header]) unzipper = ziptools.ziptools() unzipper.extract(path_down, path_unzip) xbmc.executebuiltin('UpdateLocalAddons') strSettings = '<settings>\n' \ ' <setting id="fanart" value="true" />\n' \ ' <setting id="keeporiginaltitle" value="false" />\n' \ ' <setting id="language" value="es" />\n' \ '</settings>' path_settings = xbmc.translatePath( "special://profile/addon_data/metadata.tvshows.themoviedb.org/settings.xml" ) tv_themoviedb_addon_path = filetools.dirname( path_settings) if not filetools.exists(tv_themoviedb_addon_path): filetools.mkdir(tv_themoviedb_addon_path) if filetools.write(path_settings, strSettings): continuar = True except: pass continuar = (install and continuar) if not continuar: msg_text = "The Movie Database no instalado." idPath = 0 idParentPath = 0 if continuar: continuar = False # Buscamos el idPath sql = 'SELECT MAX(idPath) FROM path' nun_records, records = execute_sql_kodi(sql) if nun_records == 1: idPath = records[0][0] + 1 sql_librarypath = librarypath if sql_librarypath.startswith("special://"): sql_librarypath = sql_librarypath.replace( '/profile/', '/%/').replace('/home/userdata/', '/%/') sep = '/' elif sql_librarypath.startswith("smb://"): sep = '/' else: sep = os.sep if not sql_librarypath.endswith(sep): sql_librarypath += sep # Buscamos el idParentPath sql = 'SELECT idPath, strPath FROM path where strPath LIKE "%s"' % sql_librarypath nun_records, records = execute_sql_kodi(sql) if nun_records == 1: idParentPath = records[0][0] librarypath = records[0][1][:-1] continuar = True else: # No existe librarypath en la BD: la insertamos sql_librarypath = librarypath if not sql_librarypath.endswith(sep): sql_librarypath += sep sql = 'INSERT INTO path (idPath, strPath, scanRecursive, useFolderNames, noUpdate, exclude) VALUES ' \ '(%s, "%s", 0, 0, 0, 0)' % (idPath, sql_librarypath) nun_records, records = execute_sql_kodi(sql) if nun_records == 1: continuar = True idParentPath = idPath idPath += 1 else: msg_text = "Error al fijar librarypath en BD" if continuar: continuar = False # Fijamos strContent, strScraper, scanRecursive y strSettings if content_type == 'CINE': strContent = 'movies' strScraper = 'metadata.themoviedb.org' scanRecursive = 2147483647 strSettings = "<settings><setting id='RatingS' value='TMDb' /><setting id='certprefix' value='Rated ' />" \ "<setting id='fanart' value='true' /><setting id='keeporiginaltitle' value='false' />" \ "<setting id='language' value='es' /><setting id='tmdbcertcountry' value='us' />" \ "<setting id='trailer' value='true' /></settings>" strActualizar = "¿Desea configurar este Scraper en español como opción por defecto para películas?" if not librarypath.endswith(sep): librarypath += sep strPath = librarypath + config.get_setting( "folder_movies") + sep else: strContent = 'tvshows' strScraper = 'metadata.tvdb.com' scanRecursive = 0 strSettings = "<settings><setting id='RatingS' value='TheTVDB' />" \ "<setting id='absolutenumber' value='false' />" \ "<setting id='dvdorder' value='false' />" \ "<setting id='fallback' value='true' />" \ "<setting id='fanart' value='true' />" \ "<setting id='language' value='es' /></settings>" strActualizar = "¿Desea configurar este Scraper en español como opción por defecto para series?" if not librarypath.endswith(sep): librarypath += sep strPath = librarypath + config.get_setting( "folder_tvshows") + sep logger.info("%s: %s" % (content_type, strPath)) # Comprobamos si ya existe strPath en la BD para evitar duplicados sql = 'SELECT idPath FROM path where strPath="%s"' % strPath nun_records, records = execute_sql_kodi(sql) sql = "" if nun_records == 0: # Insertamos el scraper sql = 'INSERT INTO path (idPath, strPath, strContent, strScraper, scanRecursive, useFolderNames, ' \ 'strSettings, noUpdate, exclude, idParentPath) VALUES (%s, "%s", "%s", "%s", %s, 0, ' \ '"%s", 0, 0, %s)' % ( idPath, strPath, strContent, strScraper, scanRecursive, strSettings, idParentPath) else: if not silent: # Preguntar si queremos configurar themoviedb.org como opcion por defecto actualizar = platformtools.dialog_yesno( "The TVDB", strActualizar) else: actualizar = True if actualizar: # Actualizamos el scraper idPath = records[0][0] sql = 'UPDATE path SET strContent="%s", strScraper="%s", scanRecursive=%s, strSettings="%s" ' \ 'WHERE idPath=%s' % (strContent, strScraper, scanRecursive, strSettings, idPath) if sql: nun_records, records = execute_sql_kodi(sql) if nun_records == 1: continuar = True if not continuar: msg_text = "Error al configurar el scraper en la BD." if not continuar: heading = "Biblioteca %s no configurada" % content_type elif content_type == 'SERIES' and not xbmc.getCondVisibility( 'System.HasAddon(metadata.tvshows.themoviedb.org)'): heading = "Biblioteca %s configurada" % content_type msg_text = "Es necesario reiniciar Kodi para que los cambios surtan efecto." else: heading = "Biblioteca %s configurada" % content_type msg_text = "Felicidades la biblioteca de Kodi ha sido configurada correctamente." platformtools.dialog_notification(heading, msg_text, icon=1, time=10000) logger.info("%s: %s" % (heading, msg_text))
def novedades(item): logger.info() global list_newest threads = [] list_newest = [] start_time = time.time() mode = item.mode if mode == '': mode = 'normal' if mode == 'get_cached': if os.path.exists(menu_cache_path): return get_from_cache(item) multithread = config.get_setting("multithread", "news") logger.info("multithread= " + str(multithread)) if not multithread: if platformtools.dialog_yesno( "Búsqueda concurrente desactivada", "La búsqueda concurrente de novedades proporciona", "una mayor velocidad y su desactivación solo es aconsejable en caso de fallo.", "¿Desea activar la búsqueda concurrente ahora?"): if config.set_setting("multithread", True, "news"): multithread = True if mode == 'normal': progreso = platformtools.dialog_progress(item.category, "Buscando canales...") list_canales, any_active = get_channels_list() if mode == 'silent' and any_active and len(list_canales[item.extra]) > 0: side_menu.set_menu_settings(item) aux_list = [] for canal in list_canales[item.extra]: if len(aux_list) < 2: aux_list.append(canal) list_canales[item.extra] = aux_list if mode == 'set_cache': list_canales[item.extra] = list_canales[item.extra][2:] if any_active and len(list_canales[item.extra]) > 0: import math # fix float porque la division se hace mal en python 2.x number_of_channels = float(100) / len(list_canales[item.extra]) for index, channel in enumerate(list_canales[item.extra]): channel_id, channel_title = channel percentage = int(math.ceil((index + 1) * number_of_channels)) # if progreso.iscanceled(): # progreso.close() # logger.info("Búsqueda cancelada") # return itemlist # Modo Multi Thread if multithread: t = Thread(target=get_newest, args=[channel_id, item.extra], name=channel_title) t.start() threads.append(t) if mode == 'normal': progreso.update(percentage, "", "Buscando en '%s'..." % channel_title) # Modo single Thread else: if mode == 'normal': logger.info("Obteniendo novedades de channel_id=" + channel_id) progreso.update(percentage, "", "Buscando en '%s'..." % channel_title) get_newest(channel_id, item.extra) # Modo Multi Thread: esperar q todos los hilos terminen if multithread: pendent = [a for a in threads if a.isAlive()] t = float(100) / len(pendent) while pendent: index = (len(threads) - len(pendent)) + 1 percentage = int(math.ceil(index * t)) list_pendent_names = [a.getName() for a in pendent] if mode == 'normal': mensaje = "Buscando en %s" % ( ", ".join(list_pendent_names)) progreso.update( percentage, "Finalizado en %d/%d canales..." % (len(threads) - len(pendent), len(threads)), mensaje) logger.debug(mensaje) if progreso.iscanceled(): logger.info("Busqueda de novedades cancelada") break time.sleep(0.5) pendent = [a for a in threads if a.isAlive()] if mode == 'normal': mensaje = "Resultados obtenidos: %s | Tiempo: %2.f segundos" % ( len(list_newest), time.time() - start_time) progreso.update(100, mensaje, " ", " ") logger.info(mensaje) start_time = time.time() # logger.debug(start_time) result_mode = config.get_setting("result_mode", "news") if mode != 'normal': result_mode = 0 if result_mode == 0: # Agrupados por contenido ret = group_by_content(list_newest) elif result_mode == 1: # Agrupados por canales ret = group_by_channel(list_newest) else: # Sin agrupar ret = no_group(list_newest) while time.time() - start_time < 2: # mostrar cuadro de progreso con el tiempo empleado durante almenos 2 segundos time.sleep(0.5) if mode == 'normal': progreso.close() if mode == 'silent': set_cache(item) item.mode = 'set_cache' ret = add_menu_items(item, ret) if mode != 'set_cache': return ret else: if mode != 'set_cache': no_channels = platformtools.dialog_ok( 'Novedades - %s' % item.extra, 'No se ha definido ningun canal para la ' 'busqueda.', 'Utilice el menu contextual ' 'para agregar al menos uno') return
def descargar_lista(item, url): logger.info() from core import httptools, scrapertools if 'tinyupload.com/' in url: try: from urllib.parse import urlparse data = httptools.downloadpage(url).data logger.debug(data) down_url, url_name = scrapertools.find_single_match( data, ' href="(download\.php[^"]*)"><b>([^<]*)') url_json = '{uri.scheme}://{uri.netloc}/'.format( uri=urlparse(url)) + down_url except: platformtools.dialog_ok('Alfa', config.get_localized_string(70655), url) return False elif 'zippyshare.com/' in url: from core import servertools video_urls, puedes, motivo = servertools.resolve_video_urls_for_playing( 'zippyshare', url) if not puedes: platformtools.dialog_ok('Alfa', config.get_localized_string(70655), motivo) return False url_json = video_urls[0][ 1] # https://www58.zippyshare.com/d/qPzzQ0UM/25460/kodfavourites-testeanding.json url_name = url_json[url_json.rfind('/') + 1:] elif 'friendpaste.com/' in url: url_json = url if url.endswith('/raw') else url + '/raw' url_name = 'friendpaste' else: url_json = url url_name = url[url.rfind('/') + 1:] # Download json data = httptools.downloadpage(url_json).data # Verificar formato json de kodfavourites y añadir info de la descarga jsondata = jsontools.load(data) if 'user_favorites' not in jsondata or 'info_lista' not in jsondata: logger.debug(data) platformtools.dialog_ok('Alfa', config.get_localized_string(70656)) return False jsondata['info_lista']['downloaded_date'] = fechahora_actual() jsondata['info_lista']['downloaded_from'] = url data = jsontools.dump(jsondata) # Pedir nombre para la lista descargada nombre = get_name_from_filename(url_name) titulo = platformtools.dialog_input( default=nombre, heading=config.get_localized_string(70657)) if titulo is None or titulo == '': return False titulo = text_clean(titulo, blank_char='_') filename = get_filename_from_name(titulo) fullfilename = os.path.join(config.get_data_path(), filename) # Si el nuevo nombre ya existe pedir confirmación para sobrescribir if os.path.exists(fullfilename): if not platformtools.dialog_yesno( 'Alfa', config.get_localized_string(70613), config.get_localized_string(70658), filename): return False if not filetools.write(fullfilename, data): platformtools.dialog_ok('Alfa', config.get_localized_string(70659), filename) platformtools.dialog_ok('Alfa', config.get_localized_string(70660), filename) platformtools.itemlist_refresh() return True
def novedades(item): logger.info() global list_newest threads = [] list_newest = [] start_time = time.time() mode = item.mode if mode == '': mode = 'normal' if mode == 'get_cached': if os.path.exists(menu_cache_path): return get_from_cache(item) multithread = config.get_setting("multithread", "news") logger.info("multithread= " + str(multithread)) if not multithread: if platformtools.dialog_yesno(config.get_localized_string(60515), config.get_localized_string(60516), config.get_localized_string(60517), config.get_localized_string(60518)): if config.set_setting("multithread", True, "news"): multithread = True if mode == 'normal': progreso = platformtools.dialog_progress( item.category, config.get_localized_string(60519)) list_canales, any_active = get_channels_list() if config.is_xbmc(): from channels import side_menu if mode == 'silent' and any_active and len( list_canales[item.extra]) > 0: side_menu.set_menu_settings(item) aux_list = [] for canal in list_canales[item.extra]: if len(aux_list) < 2: aux_list.append(canal) list_canales[item.extra] = aux_list if mode == 'set_cache': list_canales[item.extra] = list_canales[item.extra][2:] if any_active and len(list_canales[item.extra]) > 0: import math # fix float porque la division se hace mal en python 2.x number_of_channels = float(100) / len(list_canales[item.extra]) for index, channel in enumerate(list_canales[item.extra]): channel_id, channel_title = channel percentage = int(math.ceil((index + 1) * number_of_channels)) # if progreso.iscanceled(): # progreso.close() # logger.info("Búsqueda cancelada") # return itemlist # Modo Multi Thread if multithread: t = Thread(target=get_newest, args=[channel_id, item.extra], name=channel_title) t.start() threads.append(t) if mode == 'normal': progreso.update( percentage, "", config.get_localized_string(60520) % channel_title) # Modo single Thread else: if mode == 'normal': logger.info("Obteniendo novedades de channel_id=" + channel_id) progreso.update( percentage, "", config.get_localized_string(60520) % channel_title) get_newest(channel_id, item.extra) # Modo Multi Thread: esperar q todos los hilos terminen if multithread: pendent = [a for a in threads if a.isAlive()] t = float(100) / len(pendent) while pendent: index = (len(threads) - len(pendent)) + 1 percentage = int(math.ceil(index * t)) list_pendent_names = [a.getName() for a in pendent] if mode == 'normal': mensaje = config.get_localized_string(30994) % ( ", ".join(list_pendent_names)) progreso.update( percentage, config.get_localized_string(60521) % (len(threads) - len(pendent), len(threads)), mensaje) logger.debug(mensaje) if progreso.iscanceled(): logger.info("Busqueda de novedades cancelada") break time.sleep(0.5) pendent = [a for a in threads if a.isAlive()] if mode == 'normal': mensaje = config.get_localized_string(60522) % ( len(list_newest), time.time() - start_time) progreso.update(100, mensaje, " ", " ") logger.info(mensaje) start_time = time.time() # logger.debug(start_time) result_mode = config.get_setting("result_mode", "news") if mode != 'normal': result_mode = 0 if result_mode == 0: # Agrupados por contenido ret = group_by_content(list_newest) elif result_mode == 1: # Agrupados por canales ret = group_by_channel(list_newest) else: # Sin agrupar ret = no_group(list_newest) while time.time() - start_time < 2: # mostrar cuadro de progreso con el tiempo empleado durante almenos 2 segundos time.sleep(0.5) if mode == 'normal': progreso.close() if mode == 'silent': set_cache(item) item.mode = 'set_cache' ret = add_menu_items(item, ret) if mode != 'set_cache': return ret else: if mode != 'set_cache': no_channels = platformtools.dialog_ok( config.get_localized_string(30130) + ' - ' + item.extra, config.get_localized_string(70661), config.get_localized_string(70662)) return
def novedades(item): logger.info() global list_newest l_hilo = [] list_newest = [] start_time = time.time() multithread = config.get_setting("multithread", "novedades") logger.info("multithread= " + str(multithread)) if not multithread: if platformtools.dialog_yesno( "Búsqueda concurrente desactivada", "La búsqueda concurrente de novedades proporciona", "una mayor velocidad y su desactivación solo es aconsejable en caso de fallo.", "¿Desea activar la búsqueda concurrente ahora?"): if config.set_setting("multithread", True, "novedades"): multithread = True progreso = platformtools.dialog_progress(item.category, "Buscando canales...") list_canales = get_list_canales() number_of_channels = len(list_canales[item.extra]) for index, channel in enumerate(list_canales[item.extra]): channel_id, channel_title = channel percentage = index * 100 / number_of_channels # Modo Multi Thread if multithread: t = Thread(target=get_newest, args=[channel_id, item.extra], name=channel_title) t.start() l_hilo.append(t) progreso.update(percentage / 2, "Buscando en '%s'..." % channel_title) # Modo single Thread else: logger.info("Obteniendo novedades de channel_id=" + channel_id) progreso.update(percentage, "Buscando en '%s'..." % channel_title) get_newest(channel_id, item.extra) # Modo Multi Thread: esperar q todos los hilos terminen if multithread: pendent = [a for a in l_hilo if a.isAlive()] while pendent: percentage = (len(l_hilo) - len(pendent)) * 100 / len(l_hilo) if len(pendent) > 5: progreso.update( percentage, "Buscando en %d/%d canales..." % (len(pendent), len(l_hilo))) else: list_pendent_names = [a.getName() for a in pendent] mensaje = "Buscando en %s" % (", ".join(list_pendent_names)) progreso.update(percentage, mensaje) logger.debug(mensaje) if progreso.iscanceled(): logger.info("Busqueda de novedades cancelada") break time.sleep(0.5) pendent = [a for a in l_hilo if a.isAlive()] mensaje = "Resultados obtenidos: %s | Tiempo: %2.f segundos" % ( len(list_newest), time.time() - start_time) progreso.update(100, mensaje) logger.info(mensaje) start_time = time.time() #logger.debug(start_time) result_mode = config.get_setting("result_mode", "novedades") if result_mode == 0: # Agrupados por contenido ret = agruparXcontenido(list_newest, item.extra) elif result_mode == 1: # Agrupados por canales ret = agruparXcanal(list_newest, item.extra) else: # Sin agrupar ret = noAgrupar(list_newest, item.extra) while time.time() - start_time < 2: # mostrar cuadro de progreso con el tiempo empleado durante almenos 2 segundos time.sleep(0.5) progreso.close() return ret
def start(itemlist, item): ''' Metodo principal desde donde se reproduce automaticamente los enlaces - En caso la opcion de personalizar activa utilizara las opciones definidas por el usuario. - En caso contrario intentara reproducir cualquier enlace que cuente con el idioma preferido. :param itemlist: list (lista de items listos para reproducir, o sea con action='play') :param item: item (el item principal del canal) :return: intenta autoreproducir, en caso de fallar devuelve el itemlist que recibio en un principio ''' logger.info() global PLAYED global autoplay_node PLAYED = False base_item = item if not config.is_xbmc(): #platformtools.dialog_notification('AutoPlay ERROR', 'Sólo disponible para XBMC/Kodi') return itemlist if not autoplay_node: # Obtiene el nodo AUTOPLAY desde el json autoplay_node = jsontools.get_node_from_file('autoplay', 'AUTOPLAY') channel_id = item.channel if item.channel == 'videolibrary': autoplay_node = jsontools.get_node_from_file('autoplay', 'AUTOPLAY') channel_id = item.contentChannel try: active = autoplay_node['status'] except: active = is_active(item.channel) if not channel_id in autoplay_node or not active: return itemlist # Agrega servidores y calidades que no estaban listados a autoplay_node new_options = check_value(channel_id, itemlist) # Obtiene el nodo del canal desde autoplay_node channel_node = autoplay_node.get(channel_id, {}) # Obtiene los ajustes des autoplay para este canal settings_node = channel_node.get('settings', {}) if get_setting('autoplay') or settings_node['active']: url_list_valid = [] autoplay_list = [] autoplay_b = [] favorite_servers = [] favorite_quality = [] # Guarda el valor actual de "Accion y Player Mode" en preferencias user_config_setting_action = config.get_setting("default_action") user_config_setting_player = config.get_setting("player_mode") # Habilita la accion "Ver en calidad alta" (si el servidor devuelve más de una calidad p.e. gdrive) if user_config_setting_action != 2: config.set_setting("default_action", 2) if user_config_setting_player != 0: config.set_setting("player_mode", 0) # Informa que AutoPlay esta activo #platformtools.dialog_notification('AutoPlay Activo', '', sound=False) # Prioridades a la hora de ordenar itemlist: # 0: Servidores y calidades # 1: Calidades y servidores # 2: Solo servidores # 3: Solo calidades # 4: No ordenar if (settings_node['custom_servers'] and settings_node['custom_quality']): priority = settings_node[ 'priority'] # 0: Servidores y calidades o 1: Calidades y servidores elif settings_node['custom_servers']: priority = 2 # Solo servidores elif settings_node['custom_quality']: priority = 3 # Solo calidades else: priority = 4 # No ordenar # Obtiene las listas servidores, calidades disponibles desde el nodo del json de AutoPlay server_list = channel_node.get('servers', []) for server in server_list: server = server.lower() quality_list = channel_node.get('quality', []) # Si no se definen calidades la se asigna default como calidad unica if len(quality_list) == 0: quality_list = ['default'] # Se guardan los textos de cada servidor y calidad en listas p.e. favorite_servers = ['openload', # 'streamcloud'] for num in range(1, 4): favorite_servers.append( channel_node['servers'][settings_node['server_%s' % num]].lower()) favorite_quality.append( channel_node['quality'][settings_node['quality_%s' % num]]) # Se filtran los enlaces de itemlist y que se correspondan con los valores de autoplay for item in itemlist: autoplay_elem = dict() b_dict = dict() # Comprobamos q se trata de un item de video if 'server' not in item: continue # Agrega la opcion configurar AutoPlay al menu contextual if 'context' not in item: item.context = list() if not filter(lambda x: x['action'] == 'autoplay_config', context): item.context.append({ "title": config.get_localized_string(60071), "action": "autoplay_config", "channel": "autoplay", "from_channel": channel_id }) # Si no tiene calidad definida le asigna calidad 'default' if item.quality == '': item.quality = 'default' # Se crea la lista para configuracion personalizada if priority < 2: # 0: Servidores y calidades o 1: Calidades y servidores # si el servidor y la calidad no se encuentran en las listas de favoritos o la url esta repetida, # descartamos el item if item.server.lower() not in favorite_servers or item.quality not in favorite_quality \ or item.url in url_list_valid: item.type_b = True b_dict['videoitem'] = item autoplay_b.append(b_dict) continue autoplay_elem["indice_server"] = favorite_servers.index( item.server.lower()) autoplay_elem["indice_quality"] = favorite_quality.index( item.quality) elif priority == 2: # Solo servidores # si el servidor no se encuentra en la lista de favoritos o la url esta repetida, # descartamos el item if item.server.lower( ) not in favorite_servers or item.url in url_list_valid: item.type_b = True b_dict['videoitem'] = item autoplay_b.append(b_dict) continue autoplay_elem["indice_server"] = favorite_servers.index( item.server.lower()) elif priority == 3: # Solo calidades # si la calidad no se encuentra en la lista de favoritos o la url esta repetida, # descartamos el item if item.quality not in favorite_quality or item.url in url_list_valid: item.type_b = True b_dict['videoitem'] = item autoplay_b.append(b_dict) continue autoplay_elem["indice_quality"] = favorite_quality.index( item.quality) else: # No ordenar # si la url esta repetida, descartamos el item if item.url in url_list_valid: continue # Si el item llega hasta aqui lo añadimos al listado de urls validas y a autoplay_list url_list_valid.append(item.url) item.plan_b = True autoplay_elem['videoitem'] = item # autoplay_elem['server'] = item.server # autoplay_elem['quality'] = item.quality autoplay_list.append(autoplay_elem) # Ordenamos segun la prioridad if priority == 0: # Servidores y calidades autoplay_list.sort(key=lambda orden: (orden['indice_server'], orden['indice_quality'])) elif priority == 1: # Calidades y servidores autoplay_list.sort(key=lambda orden: (orden['indice_quality'], orden['indice_server'])) elif priority == 2: # Solo servidores autoplay_list.sort(key=lambda orden: orden['indice_server']) elif priority == 3: # Solo calidades autoplay_list.sort(key=lambda orden: orden['indice_quality']) # Se prepara el plan b, en caso de estar activo se agregan los elementos no favoritos al final try: plan_b = settings_node['plan_b'] except: plan_b = True text_b = '' if plan_b: autoplay_list.extend(autoplay_b) # Si hay elementos en la lista de autoplay se intenta reproducir cada elemento, hasta encontrar uno # funcional o fallen todos if autoplay_list or (plan_b and autoplay_b): #played = False max_intentos = 5 max_intentos_servers = {} # Si se esta reproduciendo algo detiene la reproduccion if platformtools.is_playing(): platformtools.stop_video() for autoplay_elem in autoplay_list: play_item = Item # Si no es un elemento favorito si agrega el texto plan b if autoplay_elem['videoitem'].type_b: text_b = '(Plan B)' if not platformtools.is_playing() and not PLAYED: videoitem = autoplay_elem['videoitem'] if videoitem.server.lower() not in max_intentos_servers: max_intentos_servers[ videoitem.server.lower()] = max_intentos # Si se han alcanzado el numero maximo de intentos de este servidor saltamos al siguiente if max_intentos_servers[videoitem.server.lower()] == 0: continue lang = " " if hasattr(videoitem, 'language') and videoitem.language != "": lang = " '%s' " % videoitem.language platformtools.dialog_notification( "AutoPlay %s" % text_b, "%s%s%s" % (videoitem.server.upper(), lang, videoitem.quality.upper()), sound=False) # TODO videoitem.server es el id del server, pero podria no ser el nombre!!! # Intenta reproducir los enlaces # Si el canal tiene metodo play propio lo utiliza channel = __import__('channels.%s' % channel_id, None, None, ["channels.%s" % channel_id]) if hasattr(channel, 'play'): resolved_item = getattr(channel, 'play')(videoitem) if len(resolved_item) > 0: if isinstance(resolved_item[0], list): videoitem.video_urls = resolved_item else: videoitem = resolved_item[0] # Si no directamente reproduce y marca como visto # Verifica si el item viene de la videoteca try: if base_item.contentChannel == 'videolibrary': # Marca como visto from platformcode import xbmc_videolibrary xbmc_videolibrary.mark_auto_as_watched(base_item) # Rellena el video con los datos del item principal y reproduce play_item = base_item.clone(url=videoitem) platformtools.play_video(play_item.url, autoplay=True) else: # Si no viene de la videoteca solo reproduce platformtools.play_video(videoitem, autoplay=True) except: pass sleep(3) try: if platformtools.is_playing(): PLAYED = True break except: logger.debug(str(len(autoplay_list))) # Si hemos llegado hasta aqui es por q no se ha podido reproducir max_intentos_servers[videoitem.server.lower()] -= 1 # Si se han alcanzado el numero maximo de intentos de este servidor # preguntar si queremos seguir probando o lo ignoramos if max_intentos_servers[videoitem.server.lower()] == 0: text = config.get_localized_string( 60072) % videoitem.server.upper() if not platformtools.dialog_yesno( "AutoPlay", text, config.get_localized_string(60073)): max_intentos_servers[ videoitem.server.lower()] = max_intentos # Si no quedan elementos en la lista se informa if autoplay_elem == autoplay_list[-1]: platformtools.dialog_notification( 'AutoPlay', config.get_localized_string(60072)) else: platformtools.dialog_notification( config.get_localized_string(60074), config.get_localized_string(60075)) if new_options: platformtools.dialog_notification( "AutoPlay", config.get_localized_string(60076), sound=False) # Restaura si es necesario el valor previo de "Accion y Player Mode" en preferencias if user_config_setting_action != 2: config.set_setting("default_action", user_config_setting_action) if user_config_setting_player != 0: config.set_setting("player_mode", user_config_setting_player) return itemlist
def addchannel(item): import os import time logger.info() tecleado = platformtools.dialog_input("", "Inserire l'URL") if not tecleado: return logger.info("url=%s" % tecleado) local_folder = config.get_runtime_path() if "canal" in item.title: local_folder = filetools.join(local_folder, 'channels') folder_to_extract = "channels" info_accion = "canal" else: local_folder = filetools.join(local_folder, 'servers') folder_to_extract = "servers" info_accion = "conector" # Detecta si es un enlace a un .py o .xml (pensado sobre todo para enlaces de github) try: extension = tecleado.rsplit(".", 1)[1] except: extension = "" files = [] zip = False if extension == "py" or extension == "xml": filename = tecleado.rsplit("/", 1)[1] localfilename = filetools.join(local_folder, filename) files.append([tecleado, localfilename, filename]) else: import re from core import scrapertools # Comprueba si la url apunta a una carpeta completa (channels o servers) de github if re.search(r'https://github.com/[^\s]+/' + folder_to_extract, tecleado): try: data = scrapertools.downloadpage(tecleado) matches = scrapertools.find_multiple_matches( data, '<td class="content">.*?href="([^"]+)".*?title="([^"]+)"') for url, filename in matches: url = "https://raw.githubusercontent.com" + url.replace( "/blob/", "/") localfilename = filetools.join(local_folder, filename) files.append([url, localfilename, filename]) except: import traceback logger.error("Detalle del error: %s" % traceback.format_exc()) platformtools.dialog_ok( "Errore", "L'URL non è corretto o non disponibile") return else: filename = 'new%s.zip' % info_accion localfilename = filetools.join(config.get_data_path(), filename) files.append([tecleado, localfilename, filename]) zip = True logger.info("localfilename=%s" % localfilename) logger.info("descarga fichero...") try: if len(files) > 1: lista_opciones = ["No", "Si", "Si (Sovrascrivere tutto)"] overwrite_all = False from core import downloadtools for url, localfilename, filename in files: result = downloadtools.downloadfile(url, localfilename, continuar=False) if result == -3: if len(files) == 1: dyesno = platformtools.dialog_yesno( "Il file esiste già", "%s %s esiste già. " "Vuoi sovrascrivere?" % (info_accion, filename)) else: if not overwrite_all: dyesno = platformtools.dialog_select( "Il file %s esiste già, vuoi sovrascrivere?" % filename, lista_opciones) else: dyesno = 1 # Diálogo cancelado if dyesno == -1: return # Caso de carpeta github, opción sobrescribir todos elif dyesno == 2: overwrite_all = True elif dyesno: hora_folder = "Backup [%s]" % time.strftime( "%d-%m_%H-%M", time.localtime()) backup = filetools.join(config.get_data_path(), 'backups', hora_folder, folder_to_extract) if not filetools.exists(backup): os.makedirs(backup) import shutil shutil.copy2(localfilename, filetools.join(backup, filename)) downloadtools.downloadfile(url, localfilename, continuar=True) else: if len(files) == 1: return else: continue except: import traceback logger.info("Detalle del error: %s" % traceback.format_exc()) return if zip: try: # Lo descomprime logger.info("descomprime fichero...") from core import ziptools unzipper = ziptools.ziptools() logger.info("destpathname=%s" % local_folder) unzipper.extract(localfilename, local_folder, folder_to_extract, True, True) except: import traceback logger.error("Detalle del error: %s" % traceback.format_exc()) # Borra el zip descargado filetools.remove(localfilename) platformtools.dialog_ok( "Errore", "C'è stato un errore nell'estrazione del file") return # Borra el zip descargado logger.info("borra fichero...") filetools.remove(localfilename) logger.info("...fichero borrado") platformtools.dialog_ok( "Successo", "Aggiornamento/installazione eseguita correttamente")
def eliminar(item): def eliminar_todo(item): filetools.rmdirtree(item.path) if config.is_xbmc(): import xbmc # esperamos 3 segundos para dar tiempo a borrar los ficheros xbmc.sleep(3000) # TODO mirar por qué no funciona al limpiar en la biblioteca de Kodi al añadirle un path # limpiamos la biblioteca de Kodi from platformcode import xbmc_library xbmc_library.clean() logger.info("Eliminados todos los enlaces") platformtools.itemlist_refresh() logger.info(item.contentTitle) #logger.debug(item.tostring('\n')) if item.contentType == 'movie': heading = "Eliminar película" else: heading = "Eliminar serie" if item.multicanal: # Obtener listado de canales opciones = [ "Eliminar solo los enlaces de %s" % k.capitalize() for k in item.library_urls.keys() if k != "descargas" ] opciones.insert(0, heading) index = platformtools.dialog_select(config.get_localized_string(30163), opciones) if index == 0: # Seleccionado Eliminar pelicula/serie eliminar_todo(item) elif index > 0: # Seleccionado Eliminar canal X canal = opciones[index].replace("Eliminar solo los enlaces de ", "").lower() num_enlaces = 0 for fd in filetools.listdir(item.path): if fd.endswith(canal + '].json'): if filetools.remove(filetools.join(item.path, fd)): num_enlaces += 1 if num_enlaces > 0: # Actualizar .nfo head_nfo, item_nfo = library.read_nfo(item.nfo) del item_nfo.library_urls[canal] filetools.write(item.nfo, head_nfo + item_nfo.tojson()) msg_txt = "Eliminados %s enlaces del canal %s" % (num_enlaces, canal) logger.info(msg_txt) platformtools.dialog_notification(heading, msg_txt) platformtools.itemlist_refresh() else: if platformtools.dialog_yesno( heading, "¿Realmente desea eliminar '%s' de su biblioteca?" % item.infoLabels['title']): eliminar_todo(item)
def overwrite_tools(item): import videolibrary_service from core import videolibrarytools seleccion = platformtools.dialog_yesno(config.get_localized_string(60581), config.get_localized_string(60582), config.get_localized_string(60583)) if seleccion == 1: # tvshows heading = config.get_localized_string(60584) p_dialog = platformtools.dialog_progress_bg( config.get_localized_string(60585), heading) p_dialog.update(0, '') show_list = [] for path, folders, files in filetools.walk( videolibrarytools.TVSHOWS_PATH): show_list.extend( [filetools.join(path, f) for f in files if f == "tvshow.nfo"]) if show_list: t = float(100) / len(show_list) for i, tvshow_file in enumerate(show_list): head_nfo, serie = videolibrarytools.read_nfo(tvshow_file) path = filetools.dirname(tvshow_file) if not serie.active: # si la serie no esta activa descartar continue # Eliminamos la carpeta con la serie ... filetools.rmdirtree(path) # ... y la volvemos a añadir videolibrary_service.update(path, p_dialog, i, t, serie, 3) p_dialog.close() # movies heading = config.get_localized_string(60586) p_dialog2 = platformtools.dialog_progress_bg( config.get_localized_string(60585), heading) p_dialog2.update(0, '') movies_list = [] for path, folders, files in filetools.walk( videolibrarytools.MOVIES_PATH): movies_list.extend([ filetools.join(path, f) for f in files if f.endswith(".json") ]) logger.debug("movies_list %s" % movies_list) if movies_list: t = float(100) / len(movies_list) for i, movie_json in enumerate(movies_list): try: from core import jsontools path = filetools.dirname(movie_json) movie = Item().fromjson(filetools.read(movie_json)) # Eliminamos la carpeta con la pelicula ... filetools.rmdirtree(path) import math heading = config.get_localized_string(60587) p_dialog2.update( int(math.ceil((i + 1) * t)), heading, "%s: %s" % (movie.contentTitle, movie.channel.capitalize())) # ... y la volvemos a añadir videolibrarytools.save_movie(movie) except Exception, ex: logger.error("Error al crear de nuevo la película") template = "An exception of type %s occured. Arguments:\n%r" message = template % (type(ex).__name__, ex.args) logger.error(message) p_dialog2.close()
def extract(self, file, dir, folder_to_extract="", overwrite_question=False, backup=False): logger.info("file=%s" % file) logger.info("dir=%s" % dir) if not dir.endswith(':') and not filetools.exists(dir): filetools.mkdir(dir) zf = zipfile.ZipFile(file) if not folder_to_extract: self._createstructure(file, dir) num_files = len(zf.namelist()) for nameo in zf.namelist(): name = nameo.replace(':', '_').replace('<', '_').replace( '>', '_').replace('|', '_').replace('"', '_').replace('?', '_').replace('*', '_') logger.info("name=%s" % nameo) if not name.endswith('/'): logger.info("no es un directorio") try: (path, filename) = filetools.split(filetools.join(dir, name)) logger.info("path=%s" % path) logger.info("name=%s" % name) if folder_to_extract: if path != filetools.join(dir, folder_to_extract): break else: filetools.mkdir(path) except: pass if folder_to_extract: outfilename = filetools.join(dir, filename) else: outfilename = filetools.join(dir, name) logger.info("outfilename=%s" % outfilename) try: if filetools.exists(outfilename) and overwrite_question: from platformcode import platformtools dyesno = platformtools.dialog_yesno("El archivo ya existe", "El archivo %s a descomprimir ya existe" \ ", ¿desea sobrescribirlo?" \ % filetools.basename(outfilename)) if not dyesno: break if backup: import time hora_folder = "Copia seguridad [%s]" % time.strftime( "%d-%m_%H-%M", time.localtime()) backup = filetools.join(config.get_data_path(), 'backups', hora_folder, folder_to_extract) if not filetools.exists(backup): filetools.mkdir(backup) filetools.copy( outfilename, filetools.join( backup, filetools.basename(outfilename))) outfile = filetools.file_open(outfilename, 'wb') outfile.write(zf.read(nameo)) except: import traceback logger.error(traceback.format_exc()) logger.error("Error en fichero " + nameo)
def run(item=None): logger.debug() if not item: # Extract item from sys.argv if sys.argv[2]: sp = sys.argv[2].split('&') url = sp[0] item = Item().fromurl(url) if len(sp) > 1: for e in sp[1:]: key, val = e.split('=') item.__setattr__(key, val) # If no item, this is mainlist else: if config.get_setting("start_page"): if not config.get_setting("custom_start"): dictCategory = { config.get_localized_string(70137): 'peliculas', config.get_localized_string(30123): 'series', config.get_localized_string(30124): 'anime', config.get_localized_string(60513): 'documentales', config.get_localized_string(70171): 'torrent', } if not config.get_setting( "category") in dictCategory.keys(): config.set_setting('category', config.get_localized_string(70137)) category = dictCategory[config.get_setting("category")] item = Item(channel="news", action="novedades", extra=category, mode='silent') else: from platformcode import side_menu item = Item() item = side_menu.check_user_home(item) item.start = True else: item = Item(channel="channelselector", action="getmainlist", viewmode="movie") if not config.get_setting('show_once'): if not config.get_all_settings_addon(): logger.error('corrupted settings.xml!!') settings_xml = os.path.join(config.get_data_path(), "settings.xml") settings_bak = os.path.join(config.get_data_path(), "settings.bak") if filetools.exists(settings_bak): filetools.copy(settings_bak, settings_xml, True) logger.info('restored settings.xml from backup') else: filetools.write(settings_xml, '<settings version="2">\n</settings>' ) # resetted settings else: from platformcode import xbmc_videolibrary xbmc_videolibrary.ask_set_content(silent=False) config.set_setting('show_once', True) logger.info(item.tostring()) try: if not config.get_setting('tmdb_active'): config.set_setting('tmdb_active', True) # If item has no action, stops here if item.action == "": logger.debug("Item without action") return # Action for main menu in channelselector elif item.action == "getmainlist": import channelselector itemlist = channelselector.getmainlist() platformtools.render_items(itemlist, item) # Action for channel types on channelselector: movies, series, etc. elif item.action == "getchanneltypes": import channelselector itemlist = channelselector.getchanneltypes() platformtools.render_items(itemlist, item) # Action for channel listing on channelselector elif item.action == "filterchannels": import channelselector itemlist = channelselector.filterchannels(item.channel_type) platformtools.render_items(itemlist, item) # Special action for playing a video from the library elif item.action == "play_from_library": play_from_library(item) return elif item.action == "keymap": from platformcode import keymaptools if item.open: return keymaptools.open_shortcut_menu() else: return keymaptools.set_key() elif item.channel == "infoplus": from platformcode import infoplus return infoplus.Main(item) elif config.get_setting( 'new_search' ) and item.channel == "search" and item.action == 'new_search': from platformcode.globalsearch import Search item.contextual = True Search(item) return elif item.channel == "backup": from platformcode import backup return getattr(backup, item.action)(item) elif item.channel == "elementum_download": from platformcode import elementum_download return getattr(elementum_download, item.action)(item) elif item.channel == "shortcuts": from platformcode import shortcuts return getattr(shortcuts, item.action)(item) elif item.channel == "autorenumber": from platformcode import autorenumber return getattr(autorenumber, item.action)(item) elif item.action == "delete_key": from platformcode import keymaptools return keymaptools.delete_key() elif item.action == "script": from core import tmdb if tmdb.drop_bd(): platformtools.dialog_notification( config.get_localized_string(20000), config.get_localized_string(60011), time=2000, sound=False) elif item.action == "itemInfo": platformtools.dialog_textviewer('Item info', item.parent) elif item.action == "open_browser": import webbrowser if not webbrowser.open(item.url): import xbmc if xbmc.getCondVisibility( 'system.platform.linux') and xbmc.getCondVisibility( 'system.platform.android'): # android xbmc.executebuiltin( 'StartAndroidActivity("", "android.intent.action.VIEW", "", "%s")' % (item.url)) else: try: import urllib.request as urllib except ImportError: import urllib short = urllib.urlopen( 'https://u.nu/api.php?action=shorturl&format=simple&url=' + item.url).read().decode('utf-8') platformtools.dialog_ok( config.get_localized_string(20000), config.get_localized_string(70740) % short) # Action in certain channel specified in "action" and "channel" parameters elif item.action == "check_channels": from platformcode import checkhost checkhost.check_channels() else: # Checks if channel exists if os.path.isfile( os.path.join(config.get_runtime_path(), 'channels', item.channel + ".py")): CHANNELS = 'channels' else: CHANNELS = 'specials' channel_file = os.path.join(config.get_runtime_path(), CHANNELS, item.channel + ".py") logger.debug("channel_file= " + channel_file + ' - ' + CHANNELS + ' - ' + item.channel) channel = None if os.path.exists(channel_file): try: channel = __import__('%s.%s' % (CHANNELS, item.channel), None, None, ['%s.%s' % (CHANNELS, item.channel)]) except ImportError: exec("import " + CHANNELS + "." + item.channel + " as channel") logger.info("Running channel %s | %s" % (channel.__name__, channel.__file__)) # Special play action if item.action == "play": # define la info para trakt try: from core import trakt_tools trakt_tools.set_trakt_info(item) except: pass logger.debug("item.action=%s" % item.action.upper()) # logger.debug("item_toPlay: " + "\n" + item.tostring('\n')) # First checks if channel has a "play" function if hasattr(channel, 'play'): logger.debug("Executing channel 'play' method") itemlist = channel.play(item) b_favourite = item.isFavourite # Play should return a list of playable URLS if len(itemlist) > 0 and isinstance(itemlist[0], Item): item = itemlist[0] if b_favourite: item.isFavourite = True platformtools.play_video(item) # Permitir varias calidades desde play en el Channel elif len(itemlist) > 0 and isinstance(itemlist[0], list): item.video_urls = itemlist platformtools.play_video(item) # If not, shows user an error message else: platformtools.dialog_ok( config.get_localized_string(20000), config.get_localized_string(60339)) # If player don't have a "play" function, not uses the standard play from platformtools else: logger.debug("Executing core 'play' method") platformtools.play_video(item) # Special action for findvideos, where the plugin looks for known urls elif item.action == "findvideos": from core import servertools # First checks if channel has a "findvideos" function if hasattr(channel, 'findvideos'): itemlist = getattr(channel, item.action)(item) # If not, uses the generic findvideos function else: logger.debug("No channel 'findvideos' method, " "executing core method") itemlist = servertools.find_video_items(item) if config.get_setting("max_links", "videolibrary") != 0: itemlist = limit_itemlist(itemlist) from platformcode import subtitletools subtitletools.saveSubtitleName(item) platformtools.render_items(itemlist, item) # Special action for adding a movie to the library elif item.action == "add_pelicula_to_library": from core import videolibrarytools videolibrarytools.add_movie(item) # Special action for adding a serie to the library elif item.action == "add_serie_to_library": from core import videolibrarytools videolibrarytools.add_tvshow(item, channel) # Special action for downloading all episodes from a serie elif item.action == "download_all_episodes": from specials import downloads item.action = item.extra del item.extra downloads.save_download(item) # Special action for searching, first asks for the words then call the "search" function elif item.action == "search": # from core.support import dbg;dbg() if filetools.isfile(temp_search_file) and config.get_setting( 'videolibrary_kodi'): itemlist = [] f = filetools.read(temp_search_file) strList = f.split(',') if strList[0] == '[V]' and strList[1] == item.channel: for it in strList: if it and it not in ['[V]', item.channel]: itemlist.append(Item().fromurl(it)) filetools.write(temp_search_file, f[4:]) return platformtools.render_items(itemlist, item) else: filetools.remove(temp_search_file) logger.debug("item.action=%s" % item.action.upper()) from core import channeltools if config.get_setting('last_search'): last_search = channeltools.get_channel_setting( 'Last_searched', 'search', '') else: last_search = '' search_text = platformtools.dialog_input(last_search) if search_text is not None: channeltools.set_channel_setting('Last_searched', search_text, 'search') itemlist = new_search(item.clone(text=search_text), channel) else: return platformtools.render_items(itemlist, item) # For all other actions else: # import web_pdb; web_pdb.set_trace() logger.debug("Executing channel '%s' method" % item.action) itemlist = getattr(channel, item.action)(item) if config.get_setting('trakt_sync'): from core import trakt_tools token_auth = config.get_setting("token_trakt", "trakt") if not token_auth: trakt_tools.auth_trakt() else: import xbmc if not xbmc.getCondVisibility( 'System.HasAddon(script.trakt)' ) and config.get_setting('install_trakt'): trakt_tools.ask_install_script() itemlist = trakt_tools.trakt_check(itemlist) else: config.set_setting('install_trakt', True) platformtools.render_items(itemlist, item) except WebErrorException as e: import traceback from core import scrapertools logger.error(traceback.format_exc()) platformtools.dialog_ok( config.get_localized_string(59985) % e.channel, config.get_localized_string(60013) % e.url) except Exception as e: import traceback from core import scrapertools logger.error(traceback.format_exc()) patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + r'([^.]+)\.py"' Channel = scrapertools.find_single_match(traceback.format_exc(), patron) if Channel or e.__class__ == logger.ChannelScraperException: if item.url: if platformtools.dialog_yesno( config.get_localized_string(60087) % Channel, config.get_localized_string(60014), nolabel='ok', yeslabel=config.get_localized_string(70739)): run(Item(action="open_browser", url=item.url)) else: platformtools.dialog_ok( config.get_localized_string(60087) % Channel, config.get_localized_string(60014)) else: if platformtools.dialog_yesno(config.get_localized_string(60038), config.get_localized_string(60015)): run(Item(channel="setting", action="report_menu"))
def find_and_set_infoLabels(item): """ función que se llama para buscar y setear los infolabels :param item: :return: """ global scraper_global logger.debug("item:\n" + item.tostring('\n')) params = {} if item.contentType == "movie": tipo_contenido = "film" title = item.contentTitle # get scraper pelis scraper = Tmdb() # para tmdb tipo_busqueda = "movie" else: tipo_contenido = "serie" title = item.contentSerieName # get scraper series scraper = Tmdb() # para tmdb tipo_busqueda = "tv" # esto ya está en el scraper tmdb # title = re.sub('\[\\\?(B|I|COLOR)\s?[^\]]*\]', '', title) # Si el titulo incluye el (año) se lo quitamos year = scrapertools.find_single_match(title, "^.+?\s*(\(\d{4}\))$") if year: title = title.replace(year, "").strip() item.infoLabels['year'] = year[1:-1] scraper_result = None results = [] while not scraper_result: # para tmdb if isinstance(scraper, Tmdb): logger.debug("scraper es Tmbdb") params["texto_buscado"] = title params["tipo"] = tipo_busqueda params["year"] = item.infoLabels['year'] if not results: if not item.infoLabels.get("tmdb_id"): if not item.infoLabels.get("imdb_id"): scraper_global = scraper(**params) else: logger.info("tiene imdb") # para tmdb if isinstance(scraper, Tmdb): params["external_id"] = item.infoLabels.get("imdb_id") params["external_source"] = "imdb_id" scraper_global = scraper(**params) elif not scraper_global or scraper_global.result.get( "id") != item.infoLabels['tmdb_id']: # para tmdb if isinstance(scraper, Tmdb): params["id_Tmdb"] = item.infoLabels['tmdb_id'] params["idioma_busqueda"] = "it" scraper_global = scraper(**params) results = scraper_global.get_list_resultados() if len(results) > 1: scraper_result = platformtools.show_video_info( results, item=item, scraper=scraper, caption="[%s]: Selezionare la %s corretta" % (title, tipo_contenido)) elif len(results) > 0: scraper_result = results[0] if scraper_result is None: index = -1 if tipo_contenido == "serie": # Si no lo encuentra la serie por si solo, presentamos una lista de opciones opciones = ["Immettere un altro nome", "Ricerca TheTvDB.com"] index = platformtools.dialog_select( "%s non trovato" % tipo_contenido.capitalize(), opciones) elif platformtools.dialog_yesno("Film non trovato", "Non ho trovato il film:", title, 'Vuoi inserire un altro nome?'): index = 0 if index < 0: logger.debug( "he pulsado 'cancelar' en la ventana '%s no encontrada'" % tipo_contenido.capitalize()) break if index == 0: # "Introducir otro nombre" # Pregunta el titulo it = platformtools.dialog_input( title, "Inserire il nome del %s per la ricerca" % tipo_contenido) if it is not None: title = it item.infoLabels['year'] = "" # reseteamos los resultados results = [] else: logger.debug( "he pulsado 'cancelar' en la ventana 'introduzca el nombre correcto'" ) break if index == 1: # "Buscar en TheTvDB.com" results = tvdb_series_by_title(title) if isinstance(item.infoLabels, InfoLabels): infoLabels = item.infoLabels else: infoLabels = InfoLabels() if scraper_result: if 'id' in scraper_result: # resultados obtenidos de tmdb infoLabels['tmdb_id'] = scraper_result['id'] infoLabels[ 'url_scraper'] = "https://www.themoviedb.org/tv/%s" % infoLabels[ 'tmdb_id'] item.infoLabels = infoLabels tmdb.set_infoLabels_item(item) elif 'tvdb_id' in scraper_result: # resultados obtenidos de tvdb infoLabels.update(scraper_result) item.infoLabels = infoLabels # logger.debug("item:\n" + item.tostring('\n')) return True else: item.infoLabels = infoLabels return False
def novedades(item): logger.info() global list_newest threads = [] list_newest = [] start_time = time.time() multithread = config.get_setting("multithread", "news") logger.info("multithread= " + str(multithread)) if not multithread: if platformtools.dialog_yesno( "Búsqueda concurrente desactivada", "La búsqueda concurrente de novedades proporciona", "una mayor velocidad y su desactivación solo es aconsejable en caso de fallo.", "¿Desea activar la búsqueda concurrente ahora?"): if config.set_setting("multithread", True, "news"): multithread = True progreso = platformtools.dialog_progress(item.category, "Buscando canales...") list_canales = get_channels_list() import math # fix float porque la division se hace mal en python 2.x number_of_channels = float(100) / len(list_canales[item.extra]) for index, channel in enumerate(list_canales[item.extra]): channel_id, channel_title = channel percentage = int(math.ceil((index + 1) * number_of_channels)) # if progreso.iscanceled(): # progreso.close() # logger.info("Búsqueda cancelada") # return itemlist # Modo Multi Thread if multithread: t = Thread(target=get_newest, args=[channel_id, item.extra], name=channel_title) t.start() threads.append(t) progreso.update(percentage, "", "Buscando en '%s'..." % channel_title) # Modo single Thread else: logger.info("Obteniendo novedades de channel_id=" + channel_id) progreso.update(percentage, "", "Buscando en '%s'..." % channel_title) get_newest(channel_id, item.extra) # Modo Multi Thread: esperar q todos los hilos terminen if multithread: pendent = [a for a in threads if a.isAlive()] t = float(100) / len(pendent) while pendent: index = (len(threads) - len(pendent)) + 1 percentage = int(math.ceil(index * t)) list_pendent_names = [a.getName() for a in pendent] mensaje = "Buscando en %s" % (", ".join(list_pendent_names)) progreso.update( percentage, "Finalizado en %d/%d canales..." % (len(threads) - len(pendent), len(threads)), mensaje) logger.debug(mensaje) if progreso.iscanceled(): logger.info("Busqueda de novedades cancelada") break time.sleep(0.5) pendent = [a for a in threads if a.isAlive()] mensaje = "Resultados obtenidos: %s | Tiempo: %2.f segundos" % ( len(list_newest), time.time() - start_time) progreso.update(100, mensaje, " ", " ") logger.info(mensaje) start_time = time.time() # logger.debug(start_time) result_mode = config.get_setting("result_mode", "news") if result_mode == 0: # Agrupados por contenido ret = group_by_content(list_newest) elif result_mode == 1: # Agrupados por canales ret = group_by_channel(list_newest) else: # Sin agrupar ret = no_group(list_newest) while time.time() - start_time < 2: # mostrar cuadro de progreso con el tiempo empleado durante almenos 2 segundos time.sleep(0.5) progreso.close() return ret
def onSettingsChanged(self): logger.debug('settings changed') settings_post = config.get_all_settings_addon() if settings_post: # backup settings filetools.copy( os.path.join(config.get_data_path(), "settings.xml"), os.path.join(config.get_data_path(), "settings.bak"), True) logger.debug({ k: self.settings_pre[k] for k in self.settings_pre if k in settings_post and self.settings_pre[k] != settings_post[k] }) from platformcode import xbmc_videolibrary if self.settings_pre.get('downloadpath', None) != settings_post.get( 'downloadpath', None): xbmc_videolibrary.update_sources( settings_post.get('downloadpath', None), self.settings_pre.get('downloadpath', None)) # If the path of the video library has been changed, we call to check directories so that it creates it and automatically asks if to configure the video library if self.settings_pre.get("videolibrarypath", None) and self.settings_pre.get("videolibrarypath", None) != settings_post.get("videolibrarypath", None) or \ self.settings_pre.get("folder_movies", None) and self.settings_pre.get("folder_movies", None) != settings_post.get("folder_movies", None) or \ self.settings_pre.get("folder_tvshows", None) and self.settings_pre.get("folder_tvshows", None) != settings_post.get("folder_tvshows", None): videolibrary.move_videolibrary( self.settings_pre.get("videolibrarypath", ''), settings_post.get("videolibrarypath", ''), self.settings_pre.get("folder_movies", ''), settings_post.get("folder_movies", ''), self.settings_pre.get("folder_tvshows", ''), settings_post.get("folder_tvshows", '')) # if you want to autoconfigure and the video library directory had been created if not self.settings_pre.get("videolibrary_kodi", None) and settings_post.get( "videolibrary_kodi", None): xbmc_videolibrary.ask_set_content(silent=True) elif self.settings_pre.get( "videolibrary_kodi", None) and not settings_post.get("videolibrary_kodi", None): xbmc_videolibrary.clean() if self.settings_pre.get('addon_update_timer') != settings_post.get( 'addon_update_timer'): schedule.clear('updater') self.scheduleUpdater() if self.update_setting != config.get_setting( "update", "videolibrary") or self.update_hour != config.get_setting( "everyday_delay", "videolibrary") * 4: schedule.clear('videolibrary') self.scheduleVideolibrary() if self.settings_pre.get('elementum_on_seed') != settings_post.get( 'elementum_on_seed') and settings_post.get( 'elementum_on_seed'): if not platformtools.dialog_yesno( config.get_localized_string(70805), config.get_localized_string(70806)): config.set_setting('elementum_on_seed', False) if self.settings_pre.get("shortcut_key", '') != settings_post.get( "shortcut_key", ''): xbmc.executebuiltin('Action(reloadkeymaps)') self.settings_pre = settings_post
def set_content(content_type, silent=False): """ Procedimiento para auto-configurar la videoteca de kodi con los valores por defecto @type content_type: str ('movie' o 'tvshow') @param content_type: tipo de contenido para configurar, series o peliculas """ continuar = True msg_text = "" videolibrarypath = config.get_setting("videolibrarypath") if content_type == 'movie': scraper = [ config.get_localized_string(70093), config.get_localized_string(70096) ] seleccion = platformtools.dialog_select( config.get_localized_string(70094), scraper) # Instalar The Movie Database if seleccion == -1 or seleccion == 0: if not xbmc.getCondVisibility( 'System.HasAddon(metadata.themoviedb.org)'): if not silent: # Preguntar si queremos instalar metadata.themoviedb.org install = platformtools.dialog_yesno( config.get_localized_string(60046)) else: install = True if install: try: # Instalar metadata.themoviedb.org xbmc.executebuiltin( 'InstallAddon(metadata.themoviedb.org)', True) logger.info( "Instalado el Scraper de películas de TheMovieDB") except: pass continuar = (install and xbmc.getCondVisibility( 'System.HasAddon(metadata.themoviedb.org)')) if not continuar: msg_text = config.get_localized_string(60047) if continuar: xbmc.executebuiltin( 'Addon.OpenSettings(metadata.themoviedb.org)', True) # Instalar Universal Movie Scraper elif seleccion == 1: if continuar and not xbmc.getCondVisibility( 'System.HasAddon(metadata.universal)'): continuar = False if not silent: # Preguntar si queremos instalar metadata.universal install = platformtools.dialog_yesno( config.get_localized_string(70095)) else: install = True if install: try: xbmc.executebuiltin('InstallAddon(metadata.universal)', True) if xbmc.getCondVisibility( 'System.HasAddon(metadata.universal)'): continuar = True except: pass continuar = (install and continuar) if not continuar: msg_text = config.get_localized_string(70097) if continuar: xbmc.executebuiltin('Addon.OpenSettings(metadata.universal)', True) else: # SERIES scraper = [ config.get_localized_string(70098), config.get_localized_string(70093) ] seleccion = platformtools.dialog_select( config.get_localized_string(70107), scraper) # Instalar The TVDB if seleccion == -1 or seleccion == 0: if not xbmc.getCondVisibility( 'System.HasAddon(metadata.tvdb.com)'): if not silent: # Preguntar si queremos instalar metadata.tvdb.com install = platformtools.dialog_yesno( config.get_localized_string(60048)) else: install = True if install: try: # Instalar metadata.tvdb.com xbmc.executebuiltin('InstallAddon(metadata.tvdb.com)', True) logger.info( "Instalado el Scraper de series de The TVDB") except: pass continuar = (install and xbmc.getCondVisibility( 'System.HasAddon(metadata.tvdb.com)')) if not continuar: msg_text = config.get_localized_string(70099) if continuar: xbmc.executebuiltin('Addon.OpenSettings(metadata.tvdb.com)', True) # Instalar The Movie Database elif seleccion == 1: if continuar and not xbmc.getCondVisibility( 'System.HasAddon(metadata.tvshows.themoviedb.org)'): continuar = False if not silent: # Preguntar si queremos instalar metadata.tvshows.themoviedb.org install = platformtools.dialog_yesno( config.get_localized_string(70100)) else: install = True if install: try: # Instalar metadata.tvshows.themoviedb.org xbmc.executebuiltin( 'InstallAddon(metadata.tvshows.themoviedb.org)', True) if xbmc.getCondVisibility( 'System.HasAddon(metadata.tvshows.themoviedb.org)' ): continuar = True except: pass continuar = (install and continuar) if not continuar: msg_text = config.get_localized_string(60047) if continuar: xbmc.executebuiltin( 'Addon.OpenSettings(metadata.tvshows.themoviedb.org)', True) idPath = 0 idParentPath = 0 if continuar: continuar = False # Buscamos el idPath sql = 'SELECT MAX(idPath) FROM path' nun_records, records = execute_sql_kodi(sql) if nun_records == 1: idPath = records[0][0] + 1 sql_videolibrarypath = videolibrarypath if sql_videolibrarypath.startswith("special://"): sql_videolibrarypath = sql_videolibrarypath.replace( '/profile/', '/%/').replace('/home/userdata/', '/%/') sep = '/' elif scrapertools.find_single_match(sql_videolibrarypath, '(^\w+:\/\/)'): sep = '/' else: sep = os.sep if not sql_videolibrarypath.endswith(sep): sql_videolibrarypath += sep # Buscamos el idParentPath sql = 'SELECT idPath, strPath FROM path where strPath LIKE "%s"' % sql_videolibrarypath nun_records, records = execute_sql_kodi(sql) if nun_records == 1: idParentPath = records[0][0] videolibrarypath = records[0][1][:-1] continuar = True else: # No existe videolibrarypath en la BD: la insertamos sql_videolibrarypath = videolibrarypath if not sql_videolibrarypath.endswith(sep): sql_videolibrarypath += sep sql = 'INSERT INTO path (idPath, strPath, scanRecursive, useFolderNames, noUpdate, exclude) VALUES ' \ '(%s, "%s", 0, 0, 0, 0)' % (idPath, sql_videolibrarypath) nun_records, records = execute_sql_kodi(sql) if nun_records == 1: continuar = True idParentPath = idPath idPath += 1 else: msg_text = config.get_localized_string(70101) if continuar: continuar = False # Fijamos strContent, strScraper, scanRecursive y strSettings if content_type == 'movie': strContent = 'movies' scanRecursive = 2147483647 useFolderNames = 1 if seleccion == -1 or seleccion == 0: strScraper = 'metadata.themoviedb.org' path_settings = filetools.translatePath( "special://profile/addon_data/metadata.themoviedb.org/settings.xml" ) elif seleccion == 1: strScraper = 'metadata.universal' path_settings = filetools.translatePath( "special://profile/addon_data/metadata.universal/settings.xml" ) settings_data = filetools.read(path_settings) strSettings = ' '.join(settings_data.split()).replace("> <", "><") strSettings = strSettings.replace("\"", "\'") strActualizar = "¿Desea configurar este Scraper en español como opción por defecto para películas?" if not videolibrarypath.endswith(sep): videolibrarypath += sep strPath = videolibrarypath + config.get_setting( "folder_movies") + sep else: strContent = 'tvshows' scanRecursive = 0 useFolderNames = 0 if seleccion == -1 or seleccion == 0: strScraper = 'metadata.tvdb.com' path_settings = filetools.translatePath( "special://profile/addon_data/metadata.tvdb.com/settings.xml" ) elif seleccion == 1: strScraper = 'metadata.tvshows.themoviedb.org' path_settings = filetools.translatePath( "special://profile/addon_data/metadata.tvshows.themoviedb.org/settings.xml" ) settings_data = filetools.read(path_settings) strSettings = ' '.join(settings_data.split()).replace("> <", "><") strSettings = strSettings.replace("\"", "\'") strActualizar = "¿Desea configurar este Scraper en español como opción por defecto para series?" if not videolibrarypath.endswith(sep): videolibrarypath += sep strPath = videolibrarypath + config.get_setting( "folder_tvshows") + sep logger.info("%s: %s" % (content_type, strPath)) # Comprobamos si ya existe strPath en la BD para evitar duplicados sql = 'SELECT idPath FROM path where strPath="%s"' % strPath nun_records, records = execute_sql_kodi(sql) sql = "" if nun_records == 0: # Insertamos el scraper sql = 'INSERT INTO path (idPath, strPath, strContent, strScraper, scanRecursive, useFolderNames, ' \ 'strSettings, noUpdate, exclude, idParentPath) VALUES (%s, "%s", "%s", "%s", %s, %s, ' \ '"%s", 0, 0, %s)' % ( idPath, strPath, strContent, strScraper, scanRecursive, useFolderNames, strSettings, idParentPath) else: if not silent: # Preguntar si queremos configurar themoviedb.org como opcion por defecto actualizar = platformtools.dialog_yesno( config.get_localized_string(70098), strActualizar) else: actualizar = True if actualizar: # Actualizamos el scraper idPath = records[0][0] sql = 'UPDATE path SET strContent="%s", strScraper="%s", scanRecursive=%s, useFolderNames=%s, strSettings="%s" ' \ 'WHERE idPath=%s' % (strContent, strScraper, scanRecursive, useFolderNames, strSettings, idPath) if sql: nun_records, records = execute_sql_kodi(sql) if nun_records == 1: continuar = True if not continuar: msg_text = config.get_localized_string(60055) if not continuar: heading = config.get_localized_string(70102) % content_type elif content_type == 'SERIES' and not xbmc.getCondVisibility( 'System.HasAddon(metadata.tvshows.themoviedb.org)'): heading = config.get_localized_string(70103) % content_type msg_text = config.get_localized_string(60058) else: heading = config.get_localized_string(70103) % content_type msg_text = config.get_localized_string(70104) platformtools.dialog_notification(heading, msg_text, icon=1, time=3000) logger.info("%s: %s" % (heading, msg_text))
def addchannel(item): from platformcode import platformtools import os import time logger.info() tecleado = platformtools.dialog_input("", "Inserire l'URL") if not tecleado: return logger.info("url=%s" % tecleado) local_folder = config.get_runtime_path() if "canal" in item.title: local_folder = filetools.join(local_folder, 'channels') folder_to_extract = "channels" info_accion = "canal" else: local_folder = filetools.join(local_folder, 'servers') folder_to_extract = "servers" info_accion = "conector" # Detecta si es un enlace a un .py o .xml (pensado sobre todo para enlaces de github) try: extension = tecleado.rsplit(".", 1)[1] except: extension = "" files = [] zip = False if extension == "py" or extension == "xml": filename = tecleado.rsplit("/", 1)[1] localfilename = filetools.join(local_folder, filename) files.append([tecleado, localfilename, filename]) else: import re from core import scrapertools # Comprueba si la url apunta a una carpeta completa (channels o servers) de github if re.search(r'https://github.com/[^\s]+/'+folder_to_extract, tecleado): try: data = scrapertools.downloadpage(tecleado) matches = scrapertools.find_multiple_matches(data, '<td class="content">.*?href="([^"]+)".*?title="([^"]+)"') for url, filename in matches: url = "https://raw.githubusercontent.com" + url.replace("/blob/", "/") localfilename = filetools.join(local_folder, filename) files.append([url, localfilename, filename]) except: import traceback logger.info("Detalle del error: %s" % traceback.format_exc()) platformtools.dialog_ok("Errore", "L'URL non è corretto o non disponibile") return else: filename = 'new%s.zip' % info_accion localfilename = filetools.join(config.get_data_path(), filename) files.append([tecleado, localfilename, filename]) zip = True logger.info("localfilename=%s" % localfilename) logger.info("descarga fichero...") try: if len(files) > 1: lista_opciones = ["No", "Si", "Si (Sovrascrivere tutto)"] overwrite_all = False from core import downloadtools for url, localfilename, filename in files: result = downloadtools.downloadfile(url, localfilename, continuar=False) if result == -3: if len(files) == 1: dyesno = platformtools.dialog_yesno("Il file esiste già", "%s %s esiste già. " "Vuoi sovrascrivere?" % (info_accion, filename)) else: if not overwrite_all: dyesno = platformtools.dialog_select("Il file %s esiste già, vuoi sovrascrivere?" % filename, lista_opciones) else: dyesno = 1 # Diálogo cancelado if dyesno == -1: return # Caso de carpeta github, opción sobrescribir todos elif dyesno == 2: overwrite_all = True elif dyesno: hora_folder = "Backup [%s]" % time.strftime("%d-%m_%H-%M", time.localtime()) backup = filetools.join(config.get_data_path(), 'backups', hora_folder, folder_to_extract) if not filetools.exists(backup): os.makedirs(backup) import shutil shutil.copy2(localfilename, filetools.join(backup, filename)) downloadtools.downloadfile(url, localfilename, continuar=True) else: if len(files) == 1: return else: continue except: import traceback logger.info("Detalle del error: %s" % traceback.format_exc()) return if zip: try: # Lo descomprime logger.info("descomprime fichero...") from core import ziptools unzipper = ziptools.ziptools() logger.info("destpathname=%s" % local_folder) unzipper.extract(localfilename, local_folder, folder_to_extract, True, True) except: import traceback logger.error("Detalle del error: %s" % traceback.format_exc()) # Borra el zip descargado filetools.remove(localfilename) platformtools.dialog_ok("Errore", "C'è stato un errore nell'estrazione del file") return # Borra el zip descargado logger.info("borra fichero...") filetools.remove(localfilename) logger.info("...fichero borrado") platformtools.dialog_ok("Successo", "Aggiornamento/installazione eseguita correttamente")
def start(itemlist, item): ''' Metodo principal desde donde se reproduce automaticamente los enlaces - En caso la opcion de personalizar activa utilizara las opciones definidas por el usuario. - En caso contrario intentara reproducir cualquier enlace que cuente con el idioma preferido. :param itemlist: list (lista de items listos para reproducir, o sea con action='play') :param item: item (el item principal del canal) :return: intenta autoreproducir, en caso de fallar devuelve el itemlist que recibio en un principio ''' logger.info() for videoitem in itemlist: #Nos dice de donde viene si del addon o videolibrary if item.contentChannel == 'videolibrary': videoitem.contentEpisodeNumber = item.contentEpisodeNumber videoitem.contentPlot = item.contentPlot videoitem.contentSeason = item.contentSeason videoitem.contentSerieName = item.contentSerieName videoitem.contentTitle = item.contentTitle videoitem.contentType = item.contentType videoitem.episode_id = item.episode_id #videoitem.infoLabels=item.infoLabels videoitem.thumbnail = item.thumbnail #videoitem.title=item.title if not config.is_xbmc(): #platformtools.dialog_notification('AutoPlay ERROR', 'Sólo disponible para XBMC/Kodi') return itemlist global autoplay_node if not autoplay_node: # Obtiene el nodo AUTOPLAY desde el json autoplay_node = jsontools.get_node_from_file('autoplay', 'AUTOPLAY') if not item.channel in autoplay_node: return itemlist # Agrega servidores y calidades que no estaban listados a autoplay_node new_options = check_value(item.channel, itemlist) # Obtiene el nodo del canal desde autoplay_node channel_node = autoplay_node.get(item.channel, {}) # Obtiene los ajustes des autoplay para este canal settings_node = channel_node.get('settings', {}) if settings_node['active']: url_list_valid = [] autoplay_list = [] favorite_servers = [] favorite_quality = [] # Guarda el valor actual de "Accion y Player Mode" en preferencias user_config_setting_action = config.get_setting("default_action") user_config_setting_player = config.get_setting("player_mode") # Habilita la accion "Ver en calidad alta" (si el servidor devuelve más de una calidad p.e. gdrive) if user_config_setting_action != 2: config.set_setting("default_action", 2) if user_config_setting_player != 0: config.set_setting("player_mode", 0) # Informa que AutoPlay esta activo platformtools.dialog_notification('AutoPlay Activo', '', sound=False) # Prioridades a la hora de ordenar itemlist: # 0: Servidores y calidades # 1: Calidades y servidores # 2: Solo servidores # 3: Solo calidades # 4: No ordenar if settings_node['custom_servers'] and settings_node['custom_quality']: priority = settings_node[ 'priority'] # 0: Servidores y calidades o 1: Calidades y servidores elif settings_node['custom_servers']: priority = 2 # Solo servidores elif settings_node['custom_quality']: priority = 3 # Solo calidades else: priority = 4 # No ordenar # Obtiene las listas servidores, calidades disponibles desde el nodo del json de AutoPlay server_list = channel_node.get('servers', []) quality_list = channel_node.get('quality', []) # Si no se definen calidades la se asigna default como calidad unica if len(quality_list) == 0: quality_list = ['default'] # Se guardan los textos de cada servidor y calidad en listas p.e. favorite_servers = ['openload', # 'streamcloud'] for num in range(1, 4): favorite_servers.append( channel_node['servers'][settings_node['server_%s' % num]]) favorite_quality.append( channel_node['quality'][settings_node['quality_%s' % num]]) # Se filtran los enlaces de itemlist y que se correspondan con los valores de autoplay for item in itemlist: autoplay_elem = dict() # Comprobamos q se trata de un item de video if 'server' not in item: continue # Agrega la opcion configurar AutoPlay al menu contextual if 'context' not in item: item.context = list() if not filter(lambda x: x['action'] == 'autoplay_config', context): item.context.append({ "title": "Configurar AutoPlay", "action": "autoplay_config", "channel": "autoplay", "from_channel": item.channel }) # Si no tiene calidad definida le asigna calidad 'default' if item.quality == '': item.quality = 'default' # Se crea la lista para configuracion personalizada if priority < 2: # 0: Servidores y calidades o 1: Calidades y servidores # si el servidor y la calidad no se encuentran en las listas de favoritos o la url esta repetida, # descartamos el item if item.server not in favorite_servers or item.quality not in favorite_quality \ or item.url in url_list_valid: continue autoplay_elem["indice_server"] = favorite_servers.index( item.server) autoplay_elem["indice_quality"] = favorite_quality.index( item.quality) elif priority == 2: # Solo servidores # si el servidor no se encuentra en la lista de favoritos o la url esta repetida, # descartamos el item if item.server not in favorite_servers or item.url in url_list_valid: continue autoplay_elem["indice_server"] = favorite_servers.index( item.server) elif priority == 3: # Solo calidades # si la calidad no se encuentra en la lista de favoritos o la url esta repetida, # descartamos el item if item.quality not in favorite_quality or item.url in url_list_valid: continue autoplay_elem["indice_quality"] = favorite_quality.index( item.quality) else: # No ordenar # si la url esta repetida, descartamos el item if item.url in url_list_valid: continue # Si el item llega hasta aqui lo añadimos al listado de urls validas y a autoplay_list url_list_valid.append(item.url) autoplay_elem['videoitem'] = item # autoplay_elem['server'] = item.server # autoplay_elem['quality'] = item.quality autoplay_list.append(autoplay_elem) # Ordenamos segun la prioridad if priority == 0: # Servidores y calidades autoplay_list.sort(key=lambda orden: (orden['indice_server'], orden['indice_quality'])) elif priority == 1: # Calidades y servidores autoplay_list.sort(key=lambda orden: (orden['indice_quality'], orden['indice_server'])) elif priority == 2: # Solo servidores autoplay_list.sort(key=lambda orden: orden['indice_server']) elif priority == 3: # Solo calidades autoplay_list.sort(key=lambda orden: orden['indice_quality']) # Si hay elementos en la lista de autoplay se intenta reproducir cada elemento, hasta encontrar uno # funcional o fallen todos if autoplay_list: played = False max_intentos = 5 max_intentos_servers = {} # Si se esta reproduciendo algo detiene la reproduccion if platformtools.is_playing(): platformtools.stop_video() for autoplay_elem in autoplay_list: if not platformtools.is_playing() and not played: videoitem = autoplay_elem['videoitem'] if videoitem.server not in max_intentos_servers: max_intentos_servers[videoitem.server] = max_intentos # Si se han alcanzado el numero maximo de intentos de este servidor saltamos al siguiente if max_intentos_servers[videoitem.server] == 0: continue lang = " " if hasattr(videoitem, 'language') and videoitem.language != "": lang = " '%s' " % videoitem.language platformtools.dialog_notification( "AutoPlay", "%s%s%s" % (videoitem.server.upper(), lang, videoitem.quality.upper()), sound=False) # TODO videoitem.server es el id del server, pero podria no ser el nombre!!! # Intenta reproducir los enlaces # Si el canal tiene metodo play propio lo utiliza channel = __import__('channels.%s' % item.channel, None, None, ["channels.%s" % item.channel]) if hasattr(channel, 'play'): resolved_item = getattr(channel, 'play')(videoitem) if len(resolved_item) > 0: if isinstance(resolved_item[0], list): videoitem.video_urls = resolved_item else: videoitem = resolved_item[0] # si no directamente reproduce y marca como visto from platformcode import xbmc_videolibrary xbmc_videolibrary.mark_auto_as_watched(item) #platformtools.play_video(videoitem) videoitem.contentChannel = 'videolibrary' launcher.run(videoitem) try: if platformtools.is_playing(): played = True break except: # TODO evitar el informe de que el conector fallo o el video no se encuentra logger.debug(str(len(autoplay_list))) # Si hemos llegado hasta aqui es por q no se ha podido reproducir max_intentos_servers[videoitem.server] -= 1 # Si se han alcanzado el numero maximo de intentos de este servidor # preguntar si queremos seguir probando o lo ignoramos if max_intentos_servers[videoitem.server] == 0: text = "Parece que los enlaces de %s no estan funcionando." % videoitem.server.upper( ) if not platformtools.dialog_yesno( "AutoPlay", text, "¿Desea ignorar todos los enlaces de este servidor?" ): max_intentos_servers[ videoitem.server] = max_intentos else: platformtools.dialog_notification('AutoPlay No Fue Posible', 'No Hubo Coincidencias') if new_options: platformtools.dialog_notification( "AutoPlay", "Nueva Calidad/Servidor disponible en la " "configuracion", sound=False) # Restaura si es necesario el valor previo de "Accion y Player Mode" en preferencias if user_config_setting_action != 2: config.set_setting("default_action", user_config_setting_action) if user_config_setting_player != 0: config.set_setting("player_mode", user_config_setting_player) # devuelve la lista de enlaces para la eleccion manual return itemlist
def faq(item): if item.extra == "filtrar_enlaces": respuesta = platformtools.dialog_yesno("pelisalacarta", "Puedes configurar el filtro en 'Configuración'>Preferencias'>'Otros'.", "RECOMENDACIÓN: Pon los nombres en minúsculas, " "sin tildes y separados por una coma y un espacio.", "¿Deseas abrir las Preferencias ahora?") if respuesta == 1: from channels import configuracion configuracion.settings("") elif item.extra == "onoff_canales": respuesta = platformtools.dialog_yesno("pelisalacarta", "Esto se puede hacer en 'Configuración'>'Activar/Desactivar canales'. " "Puedes activar/desactivar los canales uno por uno o todos a la vez. ", "¿Deseas gestionar ahora los canales?") if respuesta == 1: from channels import configuracion configuracion.conf_tools(Item(extra='channels_onoff')) elif item.extra == "trakt_sync": respuesta = platformtools.dialog_yesno("pelisalacarta", "Actualmente se puede activar la sincronización (silenciosa) " "tras marcar como visto un episodio (esto se hace automáticamente). " "Esta opción se puede activar en 'Configuración'>'Ajustes " "de la biblioteca'.", "¿Deseas acceder a dichos ajustes?") if respuesta == 1: from channels import biblioteca biblioteca.channel_config(Item(channel='biblioteca')) elif item.extra == "tiempo_enlaces": respuesta = platformtools.dialog_yesno("pelisalacarta", "Esto puede mejorarse limitando el número máximo de " "enlaces o mostrandolos en una ventana emergente. " "Estas opciones se encuentran en 'Configuración'>'Ajustes " "de la biblioteca'.", "¿Deseas acceder a dichos ajustes?") if respuesta == 1: from channels import biblioteca biblioteca.channel_config(Item(channel='biblioteca')) elif item.extra == "prob_busquedacont": title = "pelisalacarta - FAQ - %s" % item.title[6:] text = ("Puede que no hayas escrito la ruta de la librería correctamente en " "'Configuración'>'Preferencias'.\n" "La ruta a específicada debe ser exactamente la misma de la 'fuente' " "introducida en 'Archivos' de la biblioteca de Kodi.\n" "AVANZADO: Esta ruta también se encuentra en 'sources.xml'.\n" "También puedes estar experimentando problemas por estar " "usando algun fork de Kodi y rutas con 'special://'. " "SPMC, por ejemplo, tiene problemas con esto, y no parece tener solución, " "ya que es un problema ajeno a pelisalacarta que existe desde hace mucho.\n" "Puedes intentar subsanar estos problemas en 'Configuración'>'Ajustes de " "la biblioteca', cambiando el ajuste 'Realizar búsqueda de contenido en' " "de 'La carpeta de cada serie' a 'Toda la biblioteca'." "También puedes acudir a 'mimediacenter.info/foro/' en busca de ayuda.") return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text) elif item.extra == "canal_fallo": title = "pelisalacarta - FAQ - %s" % item.title[6:] text = ("Puede ser que la página web del canal no funcione. " "En caso de que funcione la página web puede que no seas el primero" " en haberlo visto y que el canal este arreglado. " "Puedes mirar en 'mimediacenter.info/foro/' o en el " "repositorio de GitHub (github.com/tvalacarta/pelisalacarta). " "Si no encuentras el canal arreglado puedes reportar un " "problema en el foro.") return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text) elif item.extra == "prob_bib": platformtools.dialog_ok("pelisalacarta", "Puede ser que hayas actualizado el plugin recientemente " "y que las actualizaciones no se hayan aplicado del todo " "bien. Puedes probar en 'Configuración'>'Otras herramientas', " "comprobando los archivos *_data.json o " "volviendo a añadir toda la biblioteca.") respuesta = platformtools.dialog_yesno("pelisalacarta", "¿Deseas acceder ahora a esa seccion?") if respuesta == 1: itemlist = [] from channels import configuracion new_item = Item(channel="configuracion", action="submenu_tools", folder=True) itemlist.extend(configuracion.submenu_tools(new_item)) return itemlist elif item.extra == "prob_torrent": title = "pelisalacarta - FAQ - %s" % item.title[6:] text = ("Puedes probar descargando el modulo 'libtorrent' de Kodi o " "instalando algun addon como 'Quasar' o 'Torrenter', " "los cuales apareceran entre las opciones de la ventana emergente " "que aparece al pulsar sobre un enlace torrent. " "'Torrenter' es más complejo pero también más completo " "y siempre funciona.") return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text) elif item.extra == "buscador_juntos": respuesta = platformtools.dialog_yesno("pelisalacarta", "Si. La opcion de mostrar los resultados juntos " "o divididos por canales se encuentra en " "'Configuracion'>'Ajustes del buscador global'>" "'Otros ajustes'.", "¿Deseas acceder a ahora dichos ajustes?") if respuesta == 1: from channels import buscador buscador.settings("") elif item.extra == "report_error": title = "pelisalacarta - FAQ - %s" % item.title[6:] text = ("Para reportar un problema en 'mimediacenter.info/foro/' es necesario:\n" " - Versión que usas de pelisalacarta.\n" " - Versión que usas de kodi, plex, mediaserver, etc.\n" " - Nombre del skin (en el caso que uses Kodi) y si se " "te ha resuelto el problema si al usar el skin por defecto.\n" " - Agregar el log en modo detallado, una vez hecho esto, " "zipea el log y lo puedes adjuntar en un post.\n" " - Descripción del problema y algún caso de prueba.") return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text) else: platformtools.dialog_ok("pelisalacarta", "Tu problema/duda parece no tener una respuesta sencilla. " "Puedes acudir a 'mimediacenter.info/foro/' en busca de ayuda.")
def delete(item): def delete_all(_item): for file in filetools.listdir(_item.path): if file.endswith(".strm") or file.endswith( ".nfo") or file.endswith(".json") or file.endswith( ".torrent"): filetools.remove(filetools.join(_item.path, file)) raiz, carpeta_serie, ficheros = next(filetools.walk(_item.path)) if ficheros == []: filetools.rmdir(_item.path) if config.is_xbmc(): import xbmc # esperamos 3 segundos para dar tiempo a borrar los ficheros xbmc.sleep(3000) # TODO mirar por qué no funciona al limpiar en la videoteca de Kodi al añadirle un path # limpiamos la videoteca de Kodi from platformcode import xbmc_videolibrary xbmc_videolibrary.clean() logger.info("Eliminados todos los enlaces") platformtools.itemlist_refresh() # logger.info(item.contentTitle) # logger.debug(item.tostring('\n')) if item.contentType == 'movie': heading = config.get_localized_string(70084) else: heading = config.get_localized_string(70085) if item.multicanal: # Obtener listado de canales if item.dead == '': opciones = [ config.get_localized_string(70086) % k.capitalize() for k in list(item.library_urls.keys()) if k != "downloads" ] opciones.insert(0, heading) index = platformtools.dialog_select( config.get_localized_string(30163), opciones) if index == 0: # Seleccionado Eliminar pelicula/serie delete_all(item) elif index > 0: # Seleccionado Eliminar canal X canal = opciones[index].replace( config.get_localized_string(70079), "").lower() else: return else: canal = item.dead num_enlaces = 0 for fd in filetools.listdir(item.path): if fd.endswith(canal + '].json') or scrapertools.find_single_match( fd, '%s]_\d+.torrent' % canal): if filetools.remove(filetools.join(item.path, fd)): num_enlaces += 1 if num_enlaces > 0: # Actualizar .nfo head_nfo, item_nfo = videolibrarytools.read_nfo(item.nfo) del item_nfo.library_urls[canal] if item_nfo.emergency_urls and item_nfo.emergency_urls.get( canal, False): del item_nfo.emergency_urls[canal] filetools.write(item.nfo, head_nfo + item_nfo.tojson()) msg_txt = config.get_localized_string(70087) % (num_enlaces, canal) logger.info(msg_txt) platformtools.dialog_notification(heading, msg_txt) platformtools.itemlist_refresh() else: if platformtools.dialog_yesno( heading, config.get_localized_string(70088) % item.infoLabels['title']): delete_all(item)
def faq(item): if item.extra == "onoff_canales": respuesta = platformtools.dialog_yesno( "Alfa", "Esto se puede hacer en 'Configuración'>'Activar/Desactivar canales'. " "Puedes activar/desactivar los canales uno por uno o todos a la vez. ", "¿Deseas gestionar ahora los canales?") if respuesta == 1: from channels import setting setting.conf_tools(Item(extra='channels_onoff')) elif item.extra == "trakt_sync": respuesta = platformtools.dialog_yesno( "Alfa", "Actualmente se puede activar la sincronización (silenciosa) " "tras marcar como visto un episodio (esto se hace automáticamente). " "Esta opción se puede activar en 'Configuración'>'Ajustes " "de la videoteca'.", "¿Deseas acceder a dichos ajustes?") if respuesta == 1: from channels import videolibrary videolibrary.channel_config(Item(channel='videolibrary')) elif item.extra == "tiempo_enlaces": respuesta = platformtools.dialog_yesno( "Alfa", "Esto puede mejorarse limitando el número máximo de " "enlaces o mostrandolos en una ventana emergente. " "Estas opciones se encuentran en 'Configuración'>'Ajustes " "de la videoteca'.", "¿Deseas acceder a dichos ajustes?") if respuesta == 1: from channels import videolibrary videolibrary.channel_config(Item(channel='videolibrary')) elif item.extra == "prob_busquedacont": title = "Alfa - FAQ - %s" % item.title[6:] text = ( "Puede que no hayas escrito la ruta de la librería correctamente en " "'Configuración'>'Preferencias'.\n" "La ruta específicada debe ser exactamente la misma de la 'fuente' " "introducida en 'Archivos' de la videoteca de Kodi.\n" "AVANZADO: Esta ruta también se encuentra en 'sources.xml'.\n" "También puedes estar experimentando problemas por estar " "usando algun fork de Kodi y rutas con 'special://'. " "SPMC, por ejemplo, tiene problemas con esto, y no parece tener solución, " "ya que es un problema ajeno a Alfa que existe desde hace mucho.\n" "Puedes intentar subsanar estos problemas en 'Configuración'>'Ajustes de " "la videoteca', cambiando el ajuste 'Realizar búsqueda de contenido en' " "de 'La carpeta de cada serie' a 'Toda la videoteca'." "También puedes acudir a 'http://alfa-addon.com' en busca de ayuda." ) return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text) elif item.extra == "canal_fallo": title = "Alfa - FAQ - %s" % item.title[6:] text = ( "Puede ser que la página web del canal no funcione. " "En caso de que funcione la página web puede que no seas el primero" " en haberlo visto y que el canal este arreglado. " "Puedes mirar en 'alfa-addon.com' o en el " "repositorio de GitHub (github.com/alfa-addon/addon). " "Si no encuentras el canal arreglado puedes reportar un " "problema en el foro.") return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text) elif item.extra == "prob_bib": platformtools.dialog_ok( "Alfa", "Puede ser que hayas actualizado el plugin recientemente " "y que las actualizaciones no se hayan aplicado del todo " "bien. Puedes probar en 'Configuración'>'Otras herramientas', " "comprobando los archivos *_data.json o " "volviendo a añadir toda la videoteca.") respuesta = platformtools.dialog_yesno( "Alfa", "¿Deseas acceder ahora a esa seccion?") if respuesta == 1: itemlist = [] from channels import setting new_item = Item(channel="setting", action="submenu_tools", folder=True) itemlist.extend(setting.submenu_tools(new_item)) return itemlist elif item.extra == "prob_torrent": title = "Alfa - FAQ - %s" % item.title[6:] text = ( "Puedes probar descargando el modulo 'libtorrent' de Kodi o " "instalando algun addon como 'Quasar' o 'Torrenter', " "los cuales apareceran entre las opciones de la ventana emergente " "que aparece al pulsar sobre un enlace torrent. " "'Torrenter' es más complejo pero también más completo " "y siempre funciona.") return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text) elif item.extra == "buscador_juntos": respuesta = platformtools.dialog_yesno( "Alfa", "Si. La opcion de mostrar los resultados juntos " "o divididos por canales se encuentra en " "'setting'>'Ajustes del buscador global'>" "'Otros ajustes'.", "¿Deseas acceder a ahora dichos ajustes?") if respuesta == 1: from channels import search search.settings("") elif item.extra == "report_error": import xbmc if config.get_platform(True)['num_version'] < 14: log_name = "xbmc.log" else: log_name = "kodi.log" ruta = xbmc.translatePath("special://logpath") + log_name title = "Alfa - FAQ - %s" % item.title[6:] text = ( "Para reportar un problema en 'http://alfa-addon.com' es necesario:\n" " - Versión que usas de Alfa.\n" " - Versión que usas de kodi, mediaserver, etc.\n" " - Versión y nombre del sistema operativo que usas.\n" " - Nombre del skin (en el caso que uses Kodi) y si se " "te ha resuelto el problema al usar el skin por defecto.\n" " - Descripción del problema y algún caso de prueba.\n" " - Agregar el log en modo detallado, una vez hecho esto, " "zipea el log y lo puedes adjuntar en un post.\n\n" "Para activar el log en modo detallado, ingresar a:\n" " - Configuración.\n" " - Preferencias.\n" " - En la pestaña General - Marcar la opción: Generar log detallado.\n\n" "El archivo de log detallado se encuentra en la siguiente ruta: \n\n" "%s" % ruta) return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text) else: platformtools.dialog_ok( "Alfa", "Entérate de novedades, consejos u opciones que desconoces en Telegram: @alfa_addon.\n" "Si tienes problemas o dudas, puedes acudir al Foro: http://alfa-addon.com" )
def list_movies(item, silent=False): logger.info() itemlist = [] dead_list = [] zombie_list = [] for raiz, subcarpetas, ficheros in filetools.walk( videolibrarytools.MOVIES_PATH): for f in ficheros: if f.endswith(".nfo"): nfo_path = filetools.join(raiz, f) #Sincronizamos las películas vistas desde la videoteca de Kodi con la de Alfa try: if config.is_xbmc(): #Si es Kodi, lo hacemos from platformcode import xbmc_videolibrary xbmc_videolibrary.mark_content_as_watched_on_alfa( nfo_path) except: logger.error(traceback.format_exc()) head_nfo, new_item = videolibrarytools.read_nfo(nfo_path) if not new_item: #Si no ha leído bien el .nfo, pasamos a la siguiente logger.error('.nfo erroneo en ' + str(nfo_path)) continue if len(new_item.library_urls) > 1: multicanal = True else: multicanal = False ## verifica la existencia de los canales, en caso de no existir el canal se pregunta si se quieren ## eliminar los enlaces de dicho canal for canal_org in new_item.library_urls: canal = generictools.verify_channel(canal_org) try: channel_verify = __import__( 'channels.%s' % canal, fromlist=["channels.%s" % canal]) logger.debug('El canal %s parece correcto' % channel_verify) except: dead_item = Item( multicanal=multicanal, contentType='movie', dead=canal, path=raiz, nfo=nfo_path, library_urls=new_item.library_urls, infoLabels={'title': new_item.contentTitle}) if canal not in dead_list and canal not in zombie_list: confirm = platformtools.dialog_yesno( 'Videoteca', 'Parece que el canal [COLOR red]%s[/COLOR] ya no existe.' % canal.upper(), 'Deseas eliminar los enlaces de este canal?') elif canal in zombie_list: confirm = False else: confirm = True if confirm: delete(dead_item) if canal not in dead_list: dead_list.append(canal) continue else: if canal not in zombie_list: zombie_list.append(canal) if len(dead_list) > 0: for canal in dead_list: if canal in new_item.library_urls: del new_item.library_urls[canal] new_item.nfo = nfo_path new_item.path = raiz new_item.thumbnail = new_item.contentThumbnail new_item.text_color = "blue" strm_path = new_item.strm_path.replace("\\", "/").rstrip("/") if '/' in new_item.path: new_item.strm_path = strm_path if not filetools.exists( filetools.join(new_item.path, filetools.basename(strm_path))): # Si se ha eliminado el strm desde la bilbioteca de kodi, no mostrarlo continue ###### Redirección al canal NewPct1.py si es un clone, o a otro canal y url si ha intervención judicial try: new_item, new_item, overwrite = generictools.redirect_clone_newpct1( new_item, head_nfo, new_item, raiz) except: logger.error(traceback.format_exc()) # Menu contextual: Marcar como visto/no visto visto = new_item.library_playcounts.get( os.path.splitext(f)[0], 0) new_item.infoLabels["playcount"] = visto if visto > 0: texto_visto = config.get_localized_string(60016) contador = 0 else: texto_visto = config.get_localized_string(60017) contador = 1 # Menu contextual: Eliminar serie/canal num_canales = len(new_item.library_urls) if "downloads" in new_item.library_urls: num_canales -= 1 if num_canales > 1: texto_eliminar = config.get_localized_string(60018) else: texto_eliminar = config.get_localized_string(60019) new_item.context = [{ "title": texto_visto, "action": "mark_content_as_watched", "channel": "videolibrary", "playcount": contador }, { "title": texto_eliminar, "action": "delete", "channel": "videolibrary", "multicanal": multicanal }] # ,{"title": "Cambiar contenido (PENDIENTE)", # "action": "", # "channel": "videolibrary"}] # logger.debug("new_item: " + new_item.tostring('\n')) itemlist.append(new_item) if silent == False: return sorted(itemlist, key=lambda it: it.title.lower()) else: return
def faq(item): if item.extra == "onoff_canales": respuesta = platformtools.dialog_yesno(config.get_localized_string(60457), config.get_localized_string(60458)) if respuesta == 1: from specials import setting setting.conf_tools(Item(extra='channels_onoff')) elif item.extra == "trakt_sync": respuesta = platformtools.dialog_yesno(config.get_localized_string(60457), config.get_localized_string(60459)) if respuesta == 1: from specials import videolibrary videolibrary.channel_config(Item(channel='videolibrary')) elif item.extra == "tiempo_enlaces": respuesta = platformtools.dialog_yesno(config.get_localized_string(60457), config.get_localized_string(60460)) if respuesta == 1: from specials import videolibrary videolibrary.channel_config(Item(channel='videolibrary')) elif item.extra == "prob_busquedacont": title = config.get_localized_string(60461) % item.title[6:] text = config.get_localized_string(60462) return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text) elif item.extra == "canal_fallo": title = config.get_localized_string(60461) % item.title[6:] text = config.get_localized_string(60463) return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text) elif item.extra == "prob_bib": platformtools.dialog_ok(config.get_localized_string(60457), # To check config.get_localized_string(60464)) respuesta = platformtools.dialog_yesno(config.get_localized_string(60457), config.get_localized_string(60465)) if respuesta == 1: itemlist = [] from specials import setting new_item = Item(channel="setting", action="submenu_tools", folder=True) itemlist.extend(setting.submenu_tools(new_item)) return itemlist elif item.extra == "prob_torrent": title = config.get_localized_string(60461) % item.title[6:] text = config.get_localized_string(70279) return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text) elif item.extra == "buscador_juntos": respuesta = platformtools.dialog_yesno(config.get_localized_string(60457), config.get_localized_string(60466)) if respuesta == 1: from specials import search search.settings("") elif item.extra == "report_error": import xbmc if config.get_platform(True)['num_version'] < 14: log_name = "xbmc.log" else: log_name = "kodi.log" ruta = xbmc.translatePath("special://logpath") + log_name title = config.get_localized_string(60461) % item.title[6:] text = config.get_localized_string(60467) % ruta return TextBox("DialogTextViewer.xml", os.getcwd(), "Default", title=title, text=text) else: platformtools.dialog_ok(config.get_localized_string(60457), # To check "Tag telegram" config.get_localized_string(60468))
def list_tvshows(item): logger.info() itemlist = [] dead_list = [] zombie_list = [] # Obtenemos todos los tvshow.nfo de la videoteca de SERIES recursivamente for raiz, subcarpetas, ficheros in filetools.walk( videolibrarytools.TVSHOWS_PATH): for f in ficheros: if f == "tvshow.nfo": tvshow_path = filetools.join(raiz, f) # logger.debug(tvshow_path) #Sincronizamos los episodios vistos desde la videoteca de Kodi con la de Alfa try: if config.is_xbmc(): #Si es Kodi, lo hacemos from platformcode import xbmc_videolibrary xbmc_videolibrary.mark_content_as_watched_on_alfa( tvshow_path) except: logger.error(traceback.format_exc()) head_nfo, item_tvshow = videolibrarytools.read_nfo(tvshow_path) if not item_tvshow: #Si no ha leído bien el .nfo, pasamos a la siguiente logger.error('.nfo erroneo en ' + str(tvshow_path)) continue if len(item_tvshow.library_urls) > 1: multicanal = True else: multicanal = False ## verifica la existencia de los canales, en caso de no existir el canal se pregunta si se quieren ## eliminar los enlaces de dicho canal for canal in item_tvshow.library_urls: canal = generictools.verify_channel(canal) try: channel_verify = __import__( 'channels.%s' % canal, fromlist=["channels.%s" % canal]) logger.debug('El canal %s parece correcto' % channel_verify) except: dead_item = Item( multicanal=multicanal, contentType='tvshow', dead=canal, path=raiz, nfo=tvshow_path, library_urls=item_tvshow.library_urls, infoLabels={'title': item_tvshow.contentTitle}) if canal not in dead_list and canal not in zombie_list: confirm = platformtools.dialog_yesno( 'Videoteca', 'Parece que el canal [COLOR red]%s[/COLOR] ya no existe.' % canal.upper(), 'Deseas eliminar los enlaces de este canal?') elif canal in zombie_list: confirm = False else: confirm = True if confirm: delete(dead_item) if canal not in dead_list: dead_list.append(canal) continue else: if canal not in zombie_list: zombie_list.append(canal) if len(dead_list) > 0: for canal in dead_list: if canal in item_tvshow.library_urls: del item_tvshow.library_urls[canal] ### continua la carga de los elementos de la videoteca try: #A veces da errores aleatorios, por no encontrar el .nfo. Probablemente problemas de timing item_tvshow.title = item_tvshow.contentTitle item_tvshow.path = raiz item_tvshow.nfo = tvshow_path # Menu contextual: Marcar como visto/no visto visto = item_tvshow.library_playcounts.get( item_tvshow.contentTitle, 0) item_tvshow.infoLabels["playcount"] = visto if visto > 0: texto_visto = config.get_localized_string(60020) contador = 0 else: texto_visto = config.get_localized_string(60021) contador = 1 except: logger.error('No encuentra: ' + str(tvshow_path)) logger.error(traceback.format_exc()) continue # Menu contextual: Buscar automáticamente nuevos episodios o no if item_tvshow.active and int(item_tvshow.active) > 0: texto_update = config.get_localized_string(60022) value = 0 item_tvshow.text_color = "green" else: texto_update = config.get_localized_string(60023) value = 1 item_tvshow.text_color = "0xFFDF7401" # Menu contextual: Eliminar serie/canal num_canales = len(item_tvshow.library_urls) if "downloads" in item_tvshow.library_urls: num_canales -= 1 if num_canales > 1: texto_eliminar = config.get_localized_string(60024) else: texto_eliminar = config.get_localized_string(60025) item_tvshow.context = [{ "title": texto_visto, "action": "mark_content_as_watched", "channel": "videolibrary", "playcount": contador }, { "title": texto_update, "action": "mark_tvshow_as_updatable", "channel": "videolibrary", "active": value }, { "title": texto_eliminar, "action": "delete", "channel": "videolibrary", "multicanal": multicanal }, { "title": config.get_localized_string(70269), "action": "update_tvshow", "channel": "videolibrary" }] # ,{"title": "Cambiar contenido (PENDIENTE)", # "action": "", # "channel": "videolibrary"}] # logger.debug("item_tvshow:\n" + item_tvshow.tostring('\n')) ## verifica la existencia de los canales ## if len(item_tvshow.library_urls) > 0: itemlist.append(item_tvshow) if itemlist: itemlist = sorted(itemlist, key=lambda it: it.title.lower()) itemlist.append( Item(channel=item.channel, action="update_videolibrary", thumbnail=item.thumbnail, title=config.get_localized_string(60026), folder=False)) return itemlist
def novedades(item): logger.debug() global list_newest threads = [] list_newest = [] start_time = time.time() mode = item.mode if mode == '': mode = 'normal' if mode == 'get_cached': if os.path.exists(menu_cache_path): return get_from_cache(item) multithread = config.get_setting("multithread", "news") logger.debug("multithread= " + str(multithread)) if not multithread: if platformtools.dialog_yesno( config.get_localized_string(60515), config.get_localized_string(60516) + '\n' + config.get_localized_string(60517) + '\n' + config.get_localized_string(60518)): if config.set_setting("multithread", True, "news"): multithread = True if mode == 'normal': progreso = platformtools.dialog_progress( item.category, config.get_localized_string(60519)) list_canales, any_active = get_channels_list() # if config.is_xbmc(): # from platformcode import side_menu # if mode=='silent' and any_active and len(list_canales[item.extra]) > 0: # side_menu.set_menu_settings(item) # aux_list=[] # for canal in list_canales[item.extra]: # if len(aux_list)<2: # aux_list.append(canal) # list_canales[item.extra]=aux_list if mode == 'set_cache': list_canales[item.extra] = list_canales[item.extra][2:] if any_active and len(list_canales[item.extra]) > 0: import math # fix float because division is done poorly in python 2.x number_of_channels = float(100) / len(list_canales[item.extra]) for index, channel in enumerate(list_canales[item.extra]): channel_id, channel_title = channel percentage = int(math.ceil((index + 1) * number_of_channels)) # if progreso.iscanceled(): # progreso.close() # logger.debug("Búsqueda cancelada") # return itemlist # Modo Multi Thread if multithread: t = Thread(target=get_newest, args=[channel_id, item.extra], name=channel_title) t.start() threads.append(t) if mode == 'normal': progreso.update( percentage, config.get_localized_string(60520) % channel_title) # Modo single Thread else: if mode == 'normal': logger.debug("Obteniendo novedades de channel_id=" + channel_id) progreso.update( percentage, "", config.get_localized_string(60520) % channel_title) get_newest(channel_id, item.extra) # Multi Thread mode: wait for all threads to finish if multithread: pendent = [a for a in threads if a.is_alive()] t = float(100) / len(pendent) while pendent: index = (len(threads) - len(pendent)) + 1 percentage = int(math.ceil(index * t)) list_pendent_names = [a.getName() for a in pendent] if mode == 'normal': mensaje = config.get_localized_string(30994) % ( ", ".join(list_pendent_names)) progreso.update( percentage, config.get_localized_string(60521) % (len(threads) - len(pendent), len(threads)) + '\n' + mensaje) logger.debug(mensaje) if progreso.iscanceled(): logger.debug("Busqueda de novedades cancelada") break time.sleep(0.5) pendent = [a for a in threads if a.is_alive()] if mode == 'normal': mensaje = config.get_localized_string(60522) % ( len(list_newest), time.time() - start_time) progreso.update(100, mensaje) logger.debug(mensaje) start_time = time.time() # logger.debug(start_time) result_mode = config.get_setting("result_mode", "news") if mode != 'normal': result_mode = 0 if result_mode == 0: # Grouped by content ret = group_by_content(list_newest) elif result_mode == 1: # Grouped by channels ret = group_by_channel(list_newest) else: # Ungrouped ret = no_group(list_newest) while time.time() - start_time < 2: # show progress chart with time spent for at least 2 seconds time.sleep(0.5) if mode == 'normal': progreso.close() if mode == 'silent': set_cache(item) item.mode = 'set_cache' ret = add_menu_items(item, ret) if mode != 'set_cache': return ret else: if mode != 'set_cache': no_channels = platformtools.dialog_ok( config.get_localized_string(30130) + ' - ' + item.extra + '\n' + config.get_localized_string(70661) + '\n' + config.get_localized_string(70662)) return
def registerOrLogin(page_url): if config.get_setting('username', server='hdmario') and config.get_setting( 'password', server='hdmario'): if login(): return True if platformtools.dialog_yesno( 'HDmario', 'Questo server necessita di un account, ne hai già uno oppure vuoi tentare una registrazione automatica?', yeslabel='Accedi', nolabel='Tenta registrazione'): from specials import setting from core.item import Item user_pre = config.get_setting('username', server='hdmario') password_pre = config.get_setting('password', server='hdmario') setting.server_config(Item(config='hdmario')) user_post = config.get_setting('username', server='hdmario') password_post = config.get_setting('password', server='hdmario') if user_pre != user_post or password_pre != password_post: return registerOrLogin(page_url) else: return [] else: import random import string logger.debug('Registrazione automatica in corso') mailbox = Gmailnator() randPsw = ''.join( random.choice(string.ascii_letters + string.digits) for i in range(10)) captcha = httptools.downloadpage(baseUrl + '/captchaInfo').json logger.debug('email: ' + mailbox.address) logger.debug('pass: '******'/register/', email=True, password=True, email_default=mailbox.address, password_default=randPsw, captcha_img=captcha['captchaUrl']) if not reg: return False regPost = httptools.downloadpage(baseUrl + '/register/', post={ 'email': reg['email'], 'email_confirmation': reg['email'], 'password': reg['password'], 'password_confirmation': reg['password'], 'captchaUuid': captcha['captchaUuid'], 'captcha': reg['captcha'] }) if '/register' in regPost.url: error = scrapertools.htmlclean( scrapertools.find_single_match( regPost.data, 'Impossibile proseguire.*?</div>')) error = scrapertools.unescape( scrapertools.re.sub('\n\s+', ' ', error)) platformtools.dialog_ok('HDmario', error) return False if reg['email'] == mailbox.address: if "L'indirizzo email è già stato utilizzato" in regPost.data: # httptools.downloadpage(baseUrl + '/forgotPassword', post={'email': reg['email']}) platformtools.dialog_ok('HDmario', 'Indirizzo mail già utilizzato') return False mail = mailbox.waitForMail() if mail: checkUrl = scrapertools.find_single_match( mail.body, 'href="([^"]+)">Premi qui').replace(r'\/', '/') logger.debug('CheckURL: ' + checkUrl) httptools.downloadpage(checkUrl) config.set_setting('username', mailbox.address, server='hdmario') config.set_setting('password', randPsw, server='hdmario') platformtools.dialog_ok( 'HDmario', 'Registrato automaticamente con queste credenziali:\nemail:' + mailbox.address + '\npass: '******'HDmario', 'Impossibile registrarsi automaticamente') return False else: platformtools.dialog_ok( 'HDmario', 'Hai modificato la mail quindi KoD non sarà in grado di effettuare la verifica in autonomia, apri la casella ' + reg['email'] + ' e clicca sul link. Premi ok quando fatto') logger.debug('Registrazione completata') return True
def force_creation_advancedsettings(item): # Ruta del advancedsettings advancedsettings_kodi = xbmc.translatePath( "special://userdata/advancedsettings.xml") advancedsettings_pelisalacarta = os.path.join(config.get_runtime_path(), "resources", "advancedsettings.xml") fichero_backup = os.path.join(config.get_data_path(), "original_advancedsettings_backup.xml") # Archivos temporales para la modificacion de advancedsettings.xml: advancedsettings_same = os.path.join(config.get_data_path(), "same.txt") advancedsettings_trans = os.path.join(config.get_data_path(), "trans.txt") if os.path.exists(advancedsettings_kodi): logger.info( "pelisalacarta.channels.ayuda La ruta de advanced settings del usuario existe!" ) if platformtools.dialog_yesno( "pelisalacarta", "Esto modificara los ajustes avanzados de Kodi. ", "Deseas continuar?") == 1: # Backup del advancedsettings existente, antes de modificarlo. f_origen = open(advancedsettings_kodi) if not os.path.exists(fichero_backup): f_backup = open(fichero_backup, "w") for line in f_origen: f_backup.write(line) f_backup.close() else: if platformtools.dialog_yesno("pelisalacarta", "Backup anterior encontrado. ", "Deseas sobreescribirlo?") == 1: os.remove(fichero_backup) f_backup = open(fichero_backup, "w") for line in f_origen: f_backup.write(line) f_backup.close() platformtools.dialog_notification("pelisalacarta", "Backup terminado!") logger.info( "pelisalacarta.channels.ayuda Backup terminado!") else: platformtools.dialog_notification("pelisalacarta", "Backup no modificado") logger.info( "pelisalacarta.channels.ayuda Backup no modificado!") f_origen.close() # Edicion de advancedsettings.xml f_mod = open(os.path.join(advancedsettings_pelisalacarta)) f_trans = open(os.path.join(advancedsettings_trans), "w") f_same = open(os.path.join(advancedsettings_same), "w") lines_seen = set() special_lines_seen = set() for line_mod in f_mod: f_orig = open(os.path.join(advancedsettings_kodi)) if (line_mod.startswith(("<advancedsettings>", "</network>", "</advancedsettings>")) and line_mod not in special_lines_seen): f_same.write(line_mod) if not line_mod.startswith("</network>"): f_trans.write(line_mod) special_lines_seen.add(line_mod) for line_orig in f_orig: if (line_orig.startswith( ("<advancedsettings>", "</advancedsettings>")) and line_orig not in special_lines_seen and line_orig not in lines_seen): lines_seen.add(line_orig) if (line_orig == line_mod and line_orig not in lines_seen and line_orig not in special_lines_seen): line_same = line_orig f_same.write(line_same) lines_seen.add(line_orig) if (not line_orig.startswith( ("<autodetectpingtime>", "<curlclienttimeout>", "<curllowspeedtime>", "<curlretries>", "<disableipv6>", "<cachemembuffersize>")) and line_orig not in lines_seen and line_orig not in special_lines_seen): line_trans = line_orig if line_orig.startswith("<network>"): f_same.write(line_orig) f_trans.write(line_trans) lines_seen.add(line_orig) f_orig.close() f_mod.close() f_trans.close() f_same.close() import filecmp if filecmp.cmp(advancedsettings_pelisalacarta, advancedsettings_same): platformtools.dialog_notification( "pelisalacarta", "advancessettings.xml estaba optimizado!") else: platformtools.dialog_notification( "pelisalacarta", "advancessettings.xml no estaba optimizado!") # Se vacia advancedsettings.xml open(os.path.join(advancedsettings_kodi)).close nospaces = False f_mod = open(os.path.join(advancedsettings_pelisalacarta)) if filecmp.cmp(advancedsettings_pelisalacarta, advancedsettings_same): platformtools.dialog_ok( "pelisalacarta", "advancessettings.xml estaba optimizado!", "(No sera editado)") else: platformtools.dialog_notification( "pelisalacarta", "modificando advancedsettings.xml...") f_trans = open(os.path.join(advancedsettings_trans)) f_orig = open(os.path.join(advancedsettings_kodi), "w") for line_trans in f_trans: if line_trans.startswith("<network>"): for line_mod in f_mod: if not line_mod.startswith( ("<advancedsettings>", "</network>", "</advancedsettings>")): f_orig.write(line_mod) else: if (line_trans.startswith("</advancedsettings>") or nospaces): line_trans = os.linesep.join( [s for s in line_trans.splitlines() if s]) f_orig.write(line_trans) nospaces = True else: f_orig.write(line_trans) if os.path.getsize(advancedsettings_same) == 0: logger.info( "UPSSS, ocurrio un error: same.txt esta vacio!") if os.path.getsize(advancedsettings_trans) == 0: logger.info( "UPSSS, ocurrio un error: trans.txt esta vacio!") for line_mod in f_mod: f_orig.write(line_mod) f_trans.close() f_orig.close() platformtools.dialog_ok( "pelisalacarta", "Se ha modificado el fichero advancedsettings.xml", "con la configuración óptima para el streaming") f_mod.close() if os.path.exists(advancedsettings_same): logger.info( "pelisalacarta.channels.ayuda Archivo de comparacion eliminado" ) os.remove(advancedsettings_same) if os.path.exists(advancedsettings_trans): logger.info( "pelisalacarta.channels.ayuda Archivo de translacion eliminado" ) os.remove(advancedsettings_trans) else: platformtools.dialog_notification( "pelisalacarta", "Operacion cancelada por el usuario") else: # Si no hay advancedsettings.xml se copia el advancedsettings.xml desde el directorio # resources al userdata. f_optimo = open(advancedsettings_pelisalacarta) f_original = open(advancedsettings_kodi, "w") for line in f_optimo: f_original.write(line) f_optimo.close() f_original.close() platformtools.dialog_ok( "pelisalacarta", "Se ha creado un fichero advancedsettings.xml", "con la configuración óptima para streaming") logger.info( "pelisalacarta.channels.ayuda 'force_creation_advancedsettings' method finnished" ) return []
def semiautomatic_config_item(item): log() # Configurazione Semi Automatica, utile in caso la numerazione automatica fallisca tvdb.find_and_set_infoLabels(item) item.channel = item.from_channel dict_series = jsontools.get_node_from_file(item.channel, TAG_TVSHOW_RENUMERATE) title = item.show # Trova l'ID dellla serie while not item.infoLabels['tvdb_id']: try: item.show = platformtools.dialog_input( default=item.show, heading=config.get_localized_string( 30112)) # <- Enter title to search tvdb.find_and_set_infoLabels(item) except: heading = config.get_localized_string( 70704) # <- TMDB ID (0 to cancel) info = platformtools.dialog_numeric(0, heading) item.infoLabels['tvdb_id'] = '0' if info == '' else info if item.infoLabels['tvdb_id']: ID = item.infoLabels['tvdb_id'] dict_renumerate = {TAG_ID: ID} dict_series[title] = dict_renumerate # Trova la Stagione if any(word in title.lower() for word in ['specials', 'speciali']): heading = config.get_localized_string( 70686 ) # <- Enter the number of the starting season (for specials) season = platformtools.dialog_numeric(0, heading, '0') dict_renumerate[TAG_SEASON] = season elif RepresentsInt(title.split()[-1]): heading = config.get_localized_string( 70686 ) # <- Enter the number of the starting season (for season > 1) season = platformtools.dialog_numeric(0, heading, title.split()[-1]) dict_renumerate[TAG_SEASON] = season else: heading = config.get_localized_string( 70686 ) # <- Enter the number of the starting season (for season 1) season = platformtools.dialog_numeric(0, heading, '1') dict_renumerate[TAG_SEASON] = season ########### PROVVISORIO ################### mode = platformtools.dialog_yesno( config.get_localized_string(70687), config.get_localized_string(70688), nolabel=config.get_localized_string(30023), yeslabel=config.get_localized_string(30022)) if mode == 1: dict_renumerate[TAG_MODE] = False specials = [] stop = False while not stop: heading = config.get_localized_string(70718) + str(specials) special = platformtools.dialog_numeric(0, heading, '') if special: specials.append(int(special)) dict_renumerate[TAG_SPECIAL] = specials else: stop = True dict_renumerate[TAG_MODE] = False # Richede se ci sono speciali nella stagione # mode = platformtools.dialog_yesno(config.get_localized_string(70687), config.get_localized_string(70688), nolabel=config.get_localized_string(30023), yeslabel=config.get_localized_string(30022)) # if mode == 0: dict_renumerate[TAG_MODE] = False # else: # select = platformtools.dialog_yesno(config.get_localized_string(70687), config.get_localized_string(70717), nolabel=config.get_localized_string(30023), yeslabel=config.get_localized_string(30022)) # if select == 0: # dict_renumerate[TAG_MODE] = False # specials = [] # stop = False # while not stop: # heading = config.get_localized_string(70718) + str(specials) # special = platformtools.dialog_numeric(0, heading, '') # if special: # specials.append(int(special)) # dict_renumerate[TAG_SPECIAL] = specials # else: stop = True # else: # dict_renumerate[TAG_MODE] = True ########### PROVVISORIO ################### # Imposta la voce Episode dict_renumerate[TAG_EPISODE] = '' # Scrive nel json jsontools.update_node(dict_series, item.channel, TAG_TVSHOW_RENUMERATE)[0] else: message = config.get_localized_string(60444) heading = item.show.strip() platformtools.dialog_notification(heading, message)