blob: 62074cb160cd2168384b10094fd26ba45cd7127f [file] [log] [blame]
Ilia Sergachev51463352018-04-04 13:18:35 +02001import shutil
2import pathlib
3import os
4import argparse
5import hashlib
6import pprint
7import requests
8
9API_ENDPOINT = 'https://cloud-api.yandex.net/v1/disk/public/resources/{}?public_key={}'
10
11
12def md5sum(filename):
13 md5 = hashlib.md5()
14 with open(filename, 'rb') as f:
15 for chunk in iter(lambda: f.read(128 * md5.block_size), b''):
16 md5.update(chunk)
17 return md5.hexdigest()
18
19
20def check_and_download_file(url, path, size, checksum, dry):
21 if os.path.isfile(path):
22 if size == os.path.getsize(path):
23 if checksum == md5sum(path):
24 print('skipping correctly downloaded file {}'.format(path))
25 return
26 if not dry:
27 print('downloading {}'.format(path))
28 r = requests.get(url, stream=True)
29 with open(path, 'wb') as f:
30 shutil.copyfileobj(r.raw, f)
31
32
33def download_directory(url, save_path, dry):
34 pathlib.Path(save_path).mkdir(parents=True, exist_ok=True)
35 items = requests.get(API_ENDPOINT.format('', url)).json()['_embedded']['items']
36 for i in items:
37 # pprint.pprint(i)
38 new_path = os.path.join(save_path, i['name'])
39 if 'file' in i:
40 check_and_download_file(i['file'], new_path, i['size'], i['md5'], dry)
41 else:
42 print('entering folder {}'.format(new_path))
43 download_directory(i['public_url'], new_path, dry)
44
45
46parser = argparse.ArgumentParser(description='Yandex.Disk downloader.')
47parser.add_argument('url')
48parser.add_argument('-o', dest='output_path', default='output')
49parser.add_argument('--dry', action='store_const', const=True, default=False)
50args = parser.parse_args()
51
52download_directory(args.url, args.output_path, args.dry)