def download_file(client, path, task, options): download_tool = lixian_download_tools.get_tool(options['tool']) resuming = options.get('resuming') overwrite = options.get('overwrite') mini_hash = options.get('mini_hash') no_hash = options.get('no_hash') url = str(task['xunlei_url']) if options['node']: if options['node'] == 'best' or options['node'] == 'fastest': from lixian_util import parse_size if task['size'] >= parse_size(options['node_detection_threshold']): url = lixian_nodes.use_fastest_node(url, options['vod_nodes'], client.get_gdriveid()) else: url = lixian_nodes.switch_node(url, options['node'], client.get_gdriveid()) def download1(download, path): if not os.path.exists(path): download() elif not resuming: if overwrite: download() else: raise Exception('%s already exists. Please try --continue or --overwrite' % path) else: if download.finished(): pass else: download() def download1_checked(client, url, path, size): download = download_tool(client=client, url=url, path=path, size=size, resuming=resuming) checked = 0 while checked < 10: download1(download, path) if download.finished(): break else: checked += 1 assert os.path.getsize(path) == size, 'incorrect downloaded file size (%s != %s)' % (os.path.getsize(path), size) def download2(client, url, path, task): size = task['size'] if mini_hash and resuming and verify_mini_hash(path, task): return download1_checked(client, url, path, size) verify = verify_basic_hash if no_hash else verify_hash if not verify(path, task): with colors(options.get('colors')).yellow(): print 'hash error, redownloading...' os.rename(path, path + '.error') download1_checked(client, url, path, size) if not verify(path, task): raise Exception('hash check failed') download2(client, url, path, task)
def download_file(client, path, task, options): download_tool = lixian_download_tools.get_tool(options['tool']) resuming = options.get('resuming') overwrite = options.get('overwrite') mini_hash = options.get('mini_hash') no_hash = options.get('no_hash') url = str(task['xunlei_url']) if options['node']: if options['node'] == 'best' or options['node'] == 'fastest': from lixian_util import parse_size if task['size'] >= parse_size(options['node_detection_threshold']): url = lixian_nodes.use_fastest_node(url, options['vod_nodes'], client.get_gdriveid()) elif options['node'] == 'fast': from lixian_util import parse_size if task['size'] >= parse_size(options['node_detection_threshold']): url = lixian_nodes.use_fast_node(url, options['vod_nodes'], parse_size(options['node_detection_acceptable']), client.get_gdriveid()) else: url = lixian_nodes.switch_node(url, options['node'], client.get_gdriveid()) def download1(download, path): if not os.path.exists(path): download() elif not resuming: if overwrite: download() else: raise Exception('%s already exists. Please try --continue or --overwrite' % path) else: if download.finished(): pass else: download() def download1_checked(client, url, path, size): download = download_tool(client=client, url=url, path=path, size=size, resuming=resuming) checked = 0 while checked < 10: download1(download, path) if download.finished(): break else: checked += 1 assert os.path.getsize(path) == size, 'incorrect downloaded file size (%s != %s)' % (os.path.getsize(path), size) def download2(client, url, path, task): size = task['size'] if mini_hash and resuming and verify_mini_hash(path, task): return download1_checked(client, url, path, size) verify = verify_basic_hash if no_hash else verify_hash if not verify(path, task): with colors(options.get('colors')).yellow(): print 'hash error, redownloading...' os.rename(path, path + '.error') download1_checked(client, url, path, size) if not verify(path, task): raise Exception('hash check failed') download2(client, url, path, task)