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モジュールとの対応

#!/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))