benten download_zip
目的
- 複数ファイルのダウンロードを行います。
- 複数ファイルを zipファイルで纏めてダウンロードします。
Warning
事前にログイン認証を行う必要があります。
概要
- データ検索条件にマッチした複数のファイルをダウンロードします。
- ダウンロードできるファイルは認証時のアカウントでアクセスが許可されたファイルのみ対象となります。
- ダウンロードはZIPファイルにまとめて行います。
- ZIP圧縮の方法は modeにより切り替えることができます。
mode値 | 圧縮方法 | 注 |
---|---|---|
normal | file capttionが binaryの場合を除いてZIP圧縮 | デフォルト設定 |
stored | ZIP無圧縮 | |
deflared | ZIP圧縮 |
- ダウンロードは非同期で実行します。
- デフォルト設定ではすぐに返答を取得します。
- 上記返答に含まれる uuid を指定し、ジョブ進行状況を download_zip_queueコマンドで逐次確認することができます。
- ジョブ完了の際はdownload_zip_queueのコマンド応答に含まれるstatus値が SUCCESSとなります。
- その後、download_zip_fileコマンドを用いてで生成されたZIPファイルをダウンロードすることができます。
-
download_zipコマンドでは timeout設定を行うことができます。timeout時間内では、内部でdownload_zip_queue, download_zip_fileコマンドを呼び出してジョブ進行状況を確認し、ジョブ完了後にダウンロード処理まで統括して行うことができます。
Note
timeout値が負の場合にはZIPダウンロード処理をずっと待ち続けます。
利用例
- Help
$ benten.py download_zip -h usage: benten download_zip [-h] [--register_name [REGISTER_NAME]] [--file [FILE]] [--flag_recursive] [--flag_own] [--mode [{normal,stored,deflated}]] [--timeout [TIMEOUT]] [--flag_not_download] [--flag_unzip] [--out_directory [OUT_DIRECTORY]] optional arguments: -h, --help show this help message and exit --register_name [REGISTER_NAME], -r [REGISTER_NAME] register_name --file [FILE], -f [FILE] file or directory --flag_recursive, -s download file_list with recursive search for directory --flag_own, -o output with own file_list --mode [{normal,stored,deflated}], -m [{normal,stored,deflated}] mode for zip file compression --timeout [TIMEOUT], -t [TIMEOUT] timeout (sec) --flag_not_download, -n not download file if the file is available --flag_unzip, -u unzip file if the file is available --out_directory [OUT_DIRECTORY], -d [OUT_DIRECTORY] directory for output file if the file is available
- 登録名を指定してダウンロード実行 (待ち時間なし )
$ benten.py download_zip -r "/SPring-8/BL14B2/test/test" ### benten download_zip ### [Repository::authorize] access_token = 579773811dc7401ea1307c99d2a88a82 ==> response { "status":"PENDING", "uuid":"b476fddb-14ca-4291-b8c5-0829091dc755" }
- 登録名を指定してダウンロード実行 (待ち時間あり)
$ benten.py download_zip -r "/SPring-8/BL14B2/test/test" -t -1 ### benten download_zip ### [Repository::authorize] access_token = 579773811dc7401ea1307c99d2a88a82 ==> response { "file_list":[ { "size":44, "name":"/SPring-8/BL14B2/test/test.json", "time":"2018-08-15 18:14:05", "hash":"4cdb2c555c08a9d787a2e61103dff0f8", "uuid_name":"9e28d9d3-f3e9-441b-b9f2-152e68c310a9" }, { "size":425, "name":"/SPring-8/BL14B2/test/test.system.json", "time":"2019-03-09 21:18:35", "hash":"49b71db137ce7da3b8ce26f62f643722", "uuid_name":"933c7d86-94f7-448f-8f37-7199d64acca9" } ], "status":"SUCCESS", "uuid":"a4115c6c-659a-4747-abed-59925d41e11b" } ==> downloaded with file = a4115c6c-659a-4747-abed-59925d41e11b.zip ==> elaspted time = 2 sec
- 登録名を指定してダウンロード実行 (待ち時間あり, unzip、出力ディレクトリ指定)
$ benten.py download_zip -r "/SPring-8/BL14B2/test/test" -t -1 -u -d out ### benten download_zip ### [Repository::authorize] access_token = 579773811dc7401ea1307c99d2a88a82 ==> response { "file_list":[ { "size":44, "name":"/SPring-8/BL14B2/test/test.json", "time":"2018-08-15 18:14:05", "hash":"4cdb2c555c08a9d787a2e61103dff0f8", "uuid_name":"9e28d9d3-f3e9-441b-b9f2-152e68c310a9" }, { "size":425, "name":"/SPring-8/BL14B2/test/test.system.json", "time":"2019-03-09 21:18:35", "hash":"49b71db137ce7da3b8ce26f62f643722", "uuid_name":"933c7d86-94f7-448f-8f37-7199d64acca9" } ], "status":"SUCCESS", "uuid":"0adb3d37-b82b-4bc3-9322-c49d29f10ea4" } ==> downloaded with file = out/0adb3d37-b82b-4bc3-9322-c49d29f10ea4.zip ==> unzip file under out ==> remove file = out/0adb3d37-b82b-4bc3-9322-c49d29f10ea4.zip ==> elaspted time = 2 sec
Pythonモジュールとの対応
- benten_client.rest_download.Main を非同期ダウンロード命令実行で利用
- benten_client.rest_download.Queue を非同期ダウンロード指令のqueue確認で利用
- benten_client.rest_download.File(getの方)を 非同期ダウンロード命令で生成したZIPファイルダウンロードに利用
- 利用例 (example/benten_download_zip.pyから)
#!/usr/bin/env python ''' example: download_zip usage: python benten_download_zip.py ... ''' import benten_client import time import argparse from logging import getLogger, StreamHandler, DEBUG logger = getLogger(__name__) handler = StreamHandler() handler.setLevel(DEBUG) logger.setLevel(DEBUG) logger.addHandler(handler) logger.propagate = False # ... parameters parser = argparse.ArgumentParser(description="example: download_zip") parser.add_argument("--register_name", "-r", nargs="?", action="append", help="register_name") parser.add_argument("--file", "-f", nargs="?", action="append", help="file or directory") parser.add_argument("--flag_recursive", "-s", action="store_const", const=1, help="download file_list with recursive search for directory") parser.add_argument("--flag_own", "-o", action="store_const", const=1, help="output with own file_list") parser.add_argument("--mode", "-m", nargs="?", choices=["normal", "stored", "deflated"], default="normal", help="mode for zip file compression") parser.add_argument("--timeout", "-t", nargs="?", help="timeout (sec)") parser.add_argument("--flag_not_download", "-n", action="store_const", const=1, help="not download file if the file is available") parser.add_argument("--flag_unzip", "-u", action="store_const", const=1, help="unzip file if the file is available") parser.add_argument("--out_directory", "-d", nargs="?", help="directory for output file if the file is available") args = parser.parse_args() register_name_list = args.register_name file_list = args.file try: timeout = int(args.timeout) except: timeout = 0 flag_recursive = args.flag_recursive flag_own = args.flag_own mode = args.mode flag_not_download = args.flag_not_download flag_unzip = args.flag_unzip out_directory = args.out_directory timeout_threshold = 30 # 30 sec timeout_interval = 2 # 2 sec flag_loop = False v = {} if register_name_list is not None: v["register_name_list"] = register_name_list if file_list is not None: v["file_list"] = file_list if flag_recursive is not None: v["flag_recursive"] = flag_recursive if flag_own is not None: v["flag_own"] = flag_own if mode is not None: v["mode"] = mode if timeout is not None: if (timeout>=0) and (timeout<=timeout_threshold): v["timeout"] = timeout else: flag_loop = True t_begin = time.time() repo = benten_client.Repository() logger.debug("# set access token") repo.authorize(benten_client.access_token()) logger.debug("# download_zip") ret_dict = repo.download.post(**v) uuid_file = ret_dict.get("uuid") t0 = time.time() if flag_loop and ret_dict.get("status") != "SUCCESS": while True: time.sleep(timeout_interval) ret_dict = repo.download.queue.get(uuid_file) if ret_dict.get("status") == "SUCCESS": break t1 = time.time() dt = int(t1 - t0) benten_client.log("[download_monitor] check status (timeout={} sec, dt={} sec)".format(timeout, dt), flush=True) if (timeout>=0) and (dt>timeout): break benten_client.log("==> response") benten_client.out_json(ret_dict) if flag_not_download != 1: if ret_dict.get("status") == "SUCCESS": repo.download.file.get( uuid_file, out_directory=out_directory, unzip=flag_unzip) t_end = time.time() dt = int(t_end - t_begin) benten_client.log("==> elaspted time = {} sec".format(dt))