|
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
|
|
|