-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgdrive_cloud.py
More file actions
63 lines (50 loc) · 2.17 KB
/
Copy pathgdrive_cloud.py
File metadata and controls
63 lines (50 loc) · 2.17 KB
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
from apiclient.discovery import build
from google.oauth2 import service_account
from googleapiclient.http import MediaIoBaseDownload
import os
import shutil
import io
from . import plotplot_config
SCOPES = ['https://www.googleapis.com/auth/drive.readonly']
class PlotplotGdrive():
def __init__(self):
creds = service_account.Credentials.from_service_account_file(plotplot_config.get_plotplot_config()['google drive']['google_drive_key_json_path'], scopes=SCOPES)
# Build the service object.
self.service = build('drive', 'v3', credentials=creds)
def list_files(self):
# NGS folder
topFolderId = plotplot_config.get_plotplot_config()['google drive']['google_drive_folder_id']
items = []
pageToken = ""
while pageToken is not None:
response = self.service.files().list(
q="'" + topFolderId + "' in parents",
pageSize=1000,
pageToken=pageToken,
fields="nextPageToken, files(id, name, size, mimeType)"
).execute()
items.extend(response.get('files', []))
pageToken = response.get('nextPageToken')
# sort by name
items.sort(key=lambda x: x['name'])
return items
def get_file_info(self, file_id):
return self.service.files().get(fileId=file_id,
fields="id, name, size").execute()
def download_file(self, file_id, output_path, progress_callback):
request = self.service.files().get_media(fileId=file_id)
fh = io.BytesIO()
chunk_size = 1024 * 1024 * 10
downloader = MediaIoBaseDownload(fh, request, chunksize=chunk_size)
done = False
downloaded_bytes = 0
while done is False:
status, done = downloader.next_chunk()
downloaded_bytes += chunk_size
progress_callback(
[min(0.999, status.progress()), downloaded_bytes])
# The file has been downloaded into RAM, now save it in a file
fh.seek(0)
with open(output_path, 'wb') as f:
shutil.copyfileobj(fh, f, length=131072)
progress_callback([1, downloaded_bytes])