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")
Пример #2
0
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")
Пример #3
0
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 []
Пример #4
0
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)
Пример #6
0
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
Пример #7
0
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
Пример #9
0
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)
Пример #10
0
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)
Пример #12
0
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)
Пример #13
0
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
Пример #15
0
    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)
Пример #16
0
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")
Пример #18
0
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")
Пример #19
0
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)
Пример #20
0
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
Пример #21
0
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)
Пример #22
0
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)
Пример #23
0
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)
Пример #24
0
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()
Пример #25
0
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)
Пример #27
0
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
Пример #28
0
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 []
Пример #29
0
    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)
Пример #30
0
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")
Пример #31
0
    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)
Пример #32
0
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))
Пример #33
0
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
Пример #34
0
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
Пример #35
0
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
Пример #36
0
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
Пример #37
0
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
Пример #38
0
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")
Пример #39
0
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)
Пример #40
0
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()
Пример #41
0
    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)
Пример #42
0
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"))
Пример #43
0
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
Пример #44
0
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
Пример #45
0
    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
Пример #46
0
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")
Пример #48
0
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
Пример #49
0
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.")
Пример #50
0
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)
Пример #51
0
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"
        )
Пример #52
0
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
Пример #53
0
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))
Пример #54
0
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
Пример #55
0
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
Пример #56
0
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
Пример #57
0
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 []
Пример #58
0
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)