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}
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
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