Exemple #1
0
def download_from_url(url, item):
    logger.info("Intentando descargar: %s" % (url))
    if url.lower().endswith(".m3u8") or url.lower().startswith("rtmp"):
        save_server_statistics(item.server, 0, False)
        return {"downloadStatus": STATUS_CODES.error}

    # Obtenemos la ruta de descarga y el nombre del archivo
    item.downloadFilename = item.downloadFilename.replace('/','-')
    download_path = filetools.dirname(filetools.join(DOWNLOAD_PATH, item.downloadFilename))
    file_name = filetools.basename(filetools.join(DOWNLOAD_PATH, item.downloadFilename))

    # Creamos la carpeta si no existe

    if not filetools.exists(download_path):
        filetools.mkdir(download_path)

    # Lanzamos la descarga
    d = Downloader(url, download_path, file_name,
                   max_connections=1 + int(config.get_setting("max_connections", "downloads")),
                   block_size=2 ** (17 + int(config.get_setting("block_size", "downloads"))),
                   part_size=2 ** (20 + int(config.get_setting("part_size", "downloads"))),
                   max_buffer=2 * int(config.get_setting("max_buffer", "downloads")))
    d.start_dialog(config.get_localized_string(60332))

    # Descarga detenida. Obtenemos el estado:
    # Se ha producido un error en la descarga   
    if d.state == d.states.error:
        logger.info("Error al intentar descargar %s" % (url))
        status = STATUS_CODES.error

    # La descarga se ha detenifdo
    elif d.state == d.states.stopped:
        logger.info("Descarga detenida")
        status = STATUS_CODES.canceled

    # La descarga ha finalizado
    elif d.state == d.states.completed:
        logger.info("Descargado correctamente")
        status = STATUS_CODES.completed

        if item.downloadSize and item.downloadSize != d.size[0]:
            status = STATUS_CODES.error

    save_server_statistics(item.server, d.speed[0], d.state != d.states.error)

    dir = os.path.dirname(item.downloadFilename)
    file = filetools.join(dir, d.filename)

    if status == STATUS_CODES.completed:
        move_to_libray(item.clone(downloadFilename=file))

    return {"downloadUrl": d.download_url, "downloadStatus": status, "downloadSize": d.size[0],
            "downloadProgress": d.progress, "downloadCompleted": d.downloaded[0], "downloadFilename": file}
Exemple #2
0
def download_url(url, item, path=None, filename=None, resume=False):
    logger.trace()

    if url.lower().endswith(".m3u8") or url.lower().startswith(
            "rtmp") or item.server == 'torrent':
        logger.debug('Servidor o tipo de medio no soportado')
        return {"status": 3}

    download_path = settings.get_setting('download_path', __file__)

    if path:
        path = filetools.join(download_path, path)
    else:
        path = download_path

    if not filetools.isdir(path):
        filetools.makedirs(path)

    d = Downloader(
        url=url,
        path=filetools.validate_path(path),
        filename=filetools.validate_path(filename),
        resume=resume,
        max_connections=1 + settings.get_setting("max_connections", __file__),
        block_size=2**(17 + settings.get_setting("block_size", __file__)),
        part_size=2**(20 + settings.get_setting("part_size", __file__)),
        max_buffer=2 * settings.get_setting("max_buffer", __file__))

    d.start_dialog("Descargas [%s]" % item.servername or item.server)

    result = {
        'download_size': d.size[0],
        'download_progress': d.progress,
        'download_filename': d.filename,
        'download_path': path
    }

    if d.state == d.states.error:
        logger.debug("Error al intentar descargar %s" % url)
        result['download_status'] = 3

    elif d.state == d.states.stopped:
        logger.debug("Descarga detenida")
        result['download_status'] = 2

    elif d.state == d.states.completed:
        logger.debug("Descargado correctamente")
        result['download_status'] = 1

    return result
Exemple #3
0
def do_download(mediaurl,
                download_path,
                file_name,
                headers=[],
                silent=False,
                resume=True):

    # Crear carpeta de destino si no existe
    if not filetools.exists(download_path):
        filetools.mkdir(download_path)

    # Limpiar caracteres para nombre de fichero válido
    file_name = config.text_clean(file_name)

    # Lanzamos la descarga
    d = Downloader(mediaurl,
                   download_path,
                   file_name,
                   headers=headers,
                   resume=resume,
                   max_connections=1 +
                   int(config.get_setting("max_connections")),
                   block_size=2**(17 + int(config.get_setting("block_size"))),
                   part_size=2**(20 + int(config.get_setting("part_size"))),
                   max_buffer=2 * int(config.get_setting("max_buffer")))

    if silent:
        d.start()
        # bucle hasta terminar
        import xbmc
        while not xbmc.Monitor().abortRequested() and d.state not in [
                d.states.error, d.states.stopped, d.states.completed
        ]:
            xbmc.sleep(100)
    else:
        d.start_dialog()

    # Descarga detenida, verificar estado: {"stopped": 0, "connecting": 1, "downloading": 2, "completed": 3, "error": 4, "saving": 5})
    if d.state == d.states.error:
        logger.info('Error en la descarga %s' % mediaurl)
        status = STATUS_CODES.error

    elif d.state == d.states.stopped:
        logger.info("Descarga detenida")
        status = STATUS_CODES.canceled

    elif d.state == d.states.completed:
        logger.info("Descargada finalizada")
        status = STATUS_CODES.completed

    else:
        logger.error("Estado de descarga no previsto! %d" % d.state)
        status = STATUS_CODES.stopped

    params = {
        'downloadStatus': status,  # 3:error / 1:canceled / 2:completed
        'downloadSize': d.size[0],  # total bytes de la descarga
        'downloadCompleted': d.downloaded[0],  # bytes descargados
        'downloadProgress': d.progress,  # porcentaje descargado (float)
        'downloadUrl': d.download_url,  # url origen
        'downloadFilename': d.filename  # nombre del fichero (sin path)
    }

    return params