@@ -15,12 +15,12 @@ class GoogleDriveDownloader:
1515
1616 def __init__ (self , ids : List [str ]):
1717 self .ids = ids
18- scopes = ['https://www.googleapis.com/auth/drive.readonly' ]
19-
18+ scopes = ["https://www.googleapis.com/auth/drive.readonly" ]
2019
2120 credentials = service_account .Credentials .from_service_account_file (
22- self .client_secrets , scopes = scopes )
23- self .drive_service = build ('drive' , 'v3' , credentials = credentials )
21+ self .client_secrets , scopes = scopes
22+ )
23+ self .drive_service = build ("drive" , "v3" , credentials = credentials )
2424
2525 def download_all (self ):
2626 for ggid in self .ids :
@@ -33,11 +33,11 @@ def download_folder_recursive(self, ggid):
3333 return
3434
3535 for item in items :
36- item_name = item [' name' ]
37- item_id = item ['id' ]
38- item_mime = item [' mimeType' ]
36+ item_name = item [" name" ]
37+ item_id = item ["id" ]
38+ item_mime = item [" mimeType" ]
3939
40- if item_mime == ' application/vnd.google-apps.folder' :
40+ if item_mime == " application/vnd.google-apps.folder" :
4141 # recurse into subfolder
4242 self .download_folder_recursive (item_id )
4343 else :
@@ -48,60 +48,69 @@ def download_folder_recursive(self, ggid):
4848
4949 def download_file (self , file_id , file_name , mime_type ):
5050 # Determine extension and export mime type if Google Docs editors file
51- if mime_type .startswith ('application/vnd.google-apps.' ):
52- if mime_type == 'application/vnd.google-apps.document' :
53- export_mime = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
54- ext = '.docx'
55- elif mime_type == 'application/vnd.google-apps.spreadsheet' :
56- export_mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
57- ext = '.xlsx'
58- elif mime_type == 'application/vnd.google-apps.presentation' :
59- export_mime = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
60- ext = '.pptx'
51+ if mime_type .startswith ("application/vnd.google-apps." ):
52+ if mime_type == "application/vnd.google-apps.document" :
53+ export_mime = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
54+ ext = ".docx"
55+ elif mime_type == "application/vnd.google-apps.spreadsheet" :
56+ export_mime = (
57+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
58+ )
59+ ext = ".xlsx"
60+ elif mime_type == "application/vnd.google-apps.presentation" :
61+ export_mime = "application/vnd.openxmlformats-officedocument.presentationml.presentation"
62+ ext = ".pptx"
6163 else :
62- print (f"Skipping unsupported Google Docs mime type: { mime_type } for file { file_name } " )
64+ print (
65+ f"Skipping unsupported Google Docs mime type: { mime_type } for file { file_name } "
66+ )
6367 return None , None
6468 file_name += ext
65- request = self .drive_service .files ().export_media (fileId = file_id , mimeType = export_mime )
69+ request = self .drive_service .files ().export_media (
70+ fileId = file_id , mimeType = export_mime
71+ )
6672 else :
67- ext = os .path .splitext (file_name )[1 ].lower () or ' .bin'
73+ ext = os .path .splitext (file_name )[1 ].lower () or " .bin"
6874 request = self .drive_service .files ().get_media (fileId = file_id )
6975
7076 # Create folder for this extension
71- folder_name = ext .lstrip ('.' ) if ext else ' unknown'
77+ folder_name = ext .lstrip ("." ) if ext else " unknown"
7278 download_dir = os .path .join (self .download_dir , folder_name )
7379 os .makedirs (download_dir , exist_ok = True )
7480 full_path = os .path .join (download_dir , os .path .basename (file_name ))
7581
76- fh = io .FileIO (full_path , 'wb' )
82+ fh = io .FileIO (full_path , "wb" )
7783 downloader = MediaIoBaseDownload (fh , request )
7884 done = False
7985 while not done :
8086 status , done = downloader .next_chunk ()
81- print (f"Downloading { file_name } into { download_dir } : { int (status .progress () * 100 )} %" )
87+ print (
88+ f"Downloading { file_name } into { download_dir } : { int (status .progress () * 100 )} %"
89+ )
8290 fh .close ()
8391 return full_path , folder_name
8492
8593 def list_files_in_folder (self , folder_id ):
8694 query = f"'{ folder_id } ' in parents and trashed=false"
87- results = self .drive_service .files ().list (
88- q = query ,
89- fields = "nextPageToken, files(id, name, mimeType)" ).execute ()
90- return results .get ('files' , [])
95+ results = (
96+ self .drive_service .files ()
97+ .list (q = query , fields = "nextPageToken, files(id, name, mimeType)" )
98+ .execute ()
99+ )
100+ return results .get ("files" , [])
91101
92102 def remove_downloads (self ):
93103 if os .path .exists (self .download_dir ):
94104 shutil .rmtree (self .download_dir )
95105
96106
97-
98107def get_folder_id_from_url (url ):
99108 parsed = urlparse (url )
100- path_parts = parsed .path .split ('/' )
101- if ' folders' in path_parts :
102- folder_index = path_parts .index (' folders' )
109+ path_parts = parsed .path .split ("/" )
110+ if " folders" in path_parts :
111+ folder_index = path_parts .index (" folders" )
103112 return path_parts [folder_index + 1 ]
104113 query_params = parse_qs (parsed .query )
105- if 'id' in query_params :
106- return query_params ['id' ][0 ]
114+ if "id" in query_params :
115+ return query_params ["id" ][0 ]
107116 raise ValueError ("Could not extract folder ID from the URL" )
0 commit comments