| import time | |
| import logging | |
| LOGGER = logging.getLogger() | |
| def driveIter(root, drive, mimeType): | |
| params = { | |
| "pageToken": None, | |
| "supportsAllDrives": True, | |
| "includeItemsFromAllDrives": True, | |
| "fields": "files(id,name,mimeType,parents,shortcutDetails), incompleteSearch, nextPageToken", | |
| "q": "'%s' in parents and trashed = false and (mimeType = 'application/vnd.google-apps.folder' or mimeType = 'application/vnd.google-apps.shortcut' or mimeType contains '%s')" | |
| % (root["id"], mimeType), | |
| "orderBy": "name", | |
| } | |
| while True: | |
| try: | |
| response = drive.files().list(**params).execute() | |
| except Exception as e: | |
| response = {"files": []} | |
| LOGGER.error( | |
| "\033[31mERROR RETRIEVING FILE '%s'!\033[0m" % (root["id"]), | |
| ) | |
| LOGGER.error(str(e)) | |
| for file in response["files"]: | |
| if mimeType in file["mimeType"]: | |
| file["type"] = "file" | |
| yield file | |
| elif file["mimeType"] == "application/vnd.google-apps.folder": | |
| file["type"] = "directory" | |
| yield file | |
| elif file["mimeType"] == "application/vnd.google-apps.shortcut": | |
| tmp_file = { | |
| "id": file["shortcutDetails"]["targetId"], | |
| "name": file["name"], | |
| "mimeType": file["shortcutDetails"]["targetMimeType"], | |
| "parents": file["parents"], | |
| } | |
| if tmp_file["mimeType"] == "application/vnd.google-apps.folder": | |
| tmp_file["type"] = "directory" | |
| file = tmp_file | |
| yield file | |
| elif mimeType in tmp_file["mimeType"]: | |
| tmp_file["type"] = "file" | |
| file = tmp_file | |
| yield file | |
| try: | |
| params["pageToken"] = response["nextPageToken"] | |
| except KeyError: | |
| return | |
| def driveWalk(root, drive, walk, mimeType): | |
| if root.get("mimeType") == "application/vnd.google-apps.folder": | |
| for item in driveIter(root, drive, mimeType): | |
| driveWalk(item, drive, walk, mimeType) | |
| elif mimeType in root.get("mimeType"): | |
| walk["children"].append(root) | |
| else: | |
| return | |
| return walk | |
| def driveTree(root, drive, mimeType): | |
| if root.get("mimeType") == "application/vnd.google-apps.folder": | |
| tree = root | |
| tree["children"] = [ | |
| driveTree(item, drive, mimeType) | |
| for item in driveIter(root, drive, mimeType) | |
| ] | |
| elif mimeType in root.get("mimeType"): | |
| tree = root | |
| else: | |
| return | |
| return tree | |