Last active
May 5, 2023 10:23
-
-
Save michaeldorner/878ab69de7e799d08b2d2c57d1b41b5c to your computer and use it in GitHub Desktop.
Upload large and many files with progress bar to Zenodo via REST API; under MIT
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import argparse | |
import os | |
import requests | |
from urllib3.util.retry import Retry | |
from requests.adapters import HTTPAdapter | |
from tqdm import tqdm | |
from tqdm.utils import CallbackIOWrapper | |
HEADERS = {'Content-Type': 'application/json'} | |
if __name__ == '__main__': | |
parser = argparse.ArgumentParser(description='Upload to Zenodo') | |
parser.add_argument('token', type=str, help='Zenodo API token') | |
parser.add_argument('deposition', type=str, help='Zenodo deposition ID') | |
parser.add_argument('files', nargs='+', default=[], help='File(s) to upload') | |
args = parser.parse_args() | |
params = {'access_token': args.token} | |
with requests.Session() as session: | |
retry = Retry(connect=5, backoff_factor=1) | |
adapter = HTTPAdapter(max_retries=retry) | |
session.mount('http://', adapter) | |
session.mount('https://', adapter) | |
r = session.get(f'https://zenodo.org/api/deposit/depositions/{args.deposition}', params=params, headers=HEADERS) | |
bucket_url = r.json()['links']['bucket'] | |
for file_path in args.files: | |
file_size = os.stat(file_path).st_size | |
file_name = os.path.basename(file_path) | |
with open(file_path, 'rb') as file: | |
with tqdm(total=file_size, unit='B', unit_scale=True, unit_divisor=1024, desc=file_name) as t: | |
wrapped_file = CallbackIOWrapper(t.update, file, 'read') | |
r = session.put(f'{bucket_url}/{file_name}', data=wrapped_file, params=params, timeout=60) | |
r.raise_for_status() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment