Created
June 10, 2020 22:23
-
-
Save Aluriak/f45f61ad69e7b861dc4ffd090a3db66e to your computer and use it in GitHub Desktop.
Little helper to upload a file or a set of file in a library of a seafile instance.
This file contains 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
#!/usr/bin/python3 | |
"""Little helper to upload a file or a set of file in a library of a seafile instance, | |
using requests. | |
""" | |
import os | |
import glob | |
import json | |
import argparse | |
import getpass | |
import requests | |
def parse_cli(): | |
"""Simpler version""" | |
parser = argparse.ArgumentParser(description=__doc__) | |
parser.add_argument('files', nargs='+', type=str, help='file(s)') | |
parser.add_argument('lib', type=str, help='library to populate') | |
parser.add_argument('--indir', '-i', default='/', type=str, help='directory to create in the library in which the files will be added') | |
parser.add_argument('--user', '-u', default='[email protected]', type=str, help='username') | |
parser.add_argument('--password', '-p', type=str, help='password', default=None) | |
parser.add_argument('--seafile-port', type=int, help='local seafile instance port', default=8082) | |
parser.add_argument('--seafile-url', '-s', type=str, help='local seafile instance url', default='https://example.seafile.com/') | |
return parser.parse_args() | |
def upload_files(args): | |
# let's get the token allowing us to do things | |
url = f'https://{args.seafile_url}/api2/' | |
data = {'username': args.user, 'password': args.password or getpass.getpass()} | |
ret = requests.post(url + 'auth-token/', data=data) | |
if 'token' not in ret.json(): | |
print('failure:', ret, '\n', ret.json()) | |
return | |
token = {'Authorization': f'Token {ret.json()["token"]}'} | |
print(f'Connected with token {ret.json()["token"]}') | |
# let's find the requested library | |
ret = requests.get(url + 'repos/', headers=token) | |
if 'detail' in ret.json(): | |
print('failure:', ret, '\n', ret.json()) | |
return | |
# print('success:', ret, '\n', ret.json()) | |
for lib in ret.json(): | |
if lib['name'] == args.lib: | |
lib_id = lib['id'] | |
if 'w' not in lib['permission']: | |
print(f"Library named \"{args.lib}\" found, but you don't have write access on it.") | |
return | |
break | |
else: # none found | |
print(f"No library named \"{args.lib}\" found. Maybe you don't have access ?") | |
return | |
# add, if given, a directory | |
# TODO | |
# get an upload link | |
ret = requests.get(url + f'repos/{lib_id}/upload-link/', headers=token) | |
if 'detail' in ret.json(): | |
print('failure:', ret, '\n', ret.json()) | |
return | |
# print('success:', ret, '\n', ret.json()) | |
upload_url = ret.json() | |
print(f'Upload will be sent to "{upload_url}"') | |
# upload the files | |
if not args.indir.startswith('/'): # absolute path needed | |
args.indir = '/' + args.indir | |
if args.indir != '/': | |
print('For a mysterious reason, uploading files to specific directory is not functional.') | |
if input('Continue nonetheless ? [y/N]').lower() not in {'o', 'y', 'yes'}: | |
return | |
for glob_fname in args.files: | |
at_least_one_file = False | |
for fname in glob.glob(glob_fname): | |
at_least_one_file = True | |
print(f'Sending "{fname}"…', end='', flush=False) | |
files = {'filename': os.path.basename(fname), 'file': open(fname, 'rb'), 'parent_dir': args.indir} | |
# print('', files, end='', flush=False) | |
ret = requests.post(upload_url, headers=token, files=files) | |
print(' OK:', ret.text) | |
if not at_least_one_file: | |
print(f'No file matched by glob "{glob_fname}"') | |
return ret.text | |
if __name__ == "__main__": | |
upload_files(parse_cli()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment