-
Notifications
You must be signed in to change notification settings - Fork 0
/
drive.py
117 lines (91 loc) · 2.75 KB
/
drive.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import os
import json
from pathlib import Path
from googleapiclient.discovery import build
from google.oauth2 import service_account
def service():
"""
Return base service object.
"""
creds = service_account.Credentials.from_service_account_info(
info=json.loads(os.environ['GOOGLE_SERVICE_ACCOUNT_JSON']),
)
return build('drive', 'v3', credentials=creds)
def ls(q=None):
"""
List files.
"""
# TODO support paginatikon
page_token = None
svc = service()
files = []
while True:
result = svc.files().list(q=q, pageToken=page_token).execute()
files += result['files']
page_token = result.get('nextPageToken')
if not page_token:
return files
def folders():
"""
"""
return ls(q="mimeType = 'application/vnd.google-apps.folder'")
def files(folder_id):
"""
List files in given folder.
"""
return ls(q=f"'{folder_id}' in parents")
def get(file_id):
"""
Get contents of file.
"""
svc = service()
return svc.files().get_media(fileId=file_id).execute()
def download_file(file_id, file_name, target_dir, decode=False, binary=True):
file_contents = get(file_id)
if decode: # needed for csv files etc
file_contents = file_contents.decode()
target_path = Path(target_dir) / Path(file_name)
print(f'Downloading: {str(target_path)}')
write_options = 'w'
if binary: # needed for image files (as opposed to csv)
write_options = 'wb'
with open(target_path, write_options) as f:
f.write(file_contents)
def download_folder(folder_name, target_dir):
folder_id = next(f['id'] for f in folders() if f['name'] == folder_name)
for f in files(folder_id):
download_file(
file_id=f['id'],
file_name=f['name'].lower().replace(' - ', ' ').replace(' ','-'),
target_dir=target_dir,
)
def public_url(file_id):
return f"https://lh3.googleusercontent.com/d/{file_id}"
def download_all():
"""
"""
pngs = [x for x in ls() if x['mimeType'] == 'image/png']
for png in pngs:
download_file(
file_id=png['id'],
file_name=png['name'].lower().replace(' - ', ' ').replace(' ','-'),
target_dir='books/candide'
)
def structure():
"""
Return json blob of directory structure.
"""
output = {}
for folder in folders():
name = folder['name']
if name == 'Book Highlights':
continue
folder_id = folder['id']
output[name] = [
public_url(f['id'])
for f in sorted(files(folder_id), key=lambda x: x['name'])
]
return output
if __name__ == '__main__':
output = structure()
print(json.dumps(output))