from
__future__
import
print_function
import
pickle
import
os.path
import
io
import
shutil
import
requests
from
mimetypes
import
MimeTypes
from
googleapiclient.discovery
import
build
from
google_auth_oauthlib.flow
import
InstalledAppFlow
from
google.auth.transport.requests
import
Request
from
googleapiclient.http
import
MediaIoBaseDownload, MediaFileUpload
class
DriveAPI:
global
SCOPES
def
__init__[
self
]:
self
.creds
=
None
if
os.path.exists[
'token.pickle'
]:
with
open
[
'token.pickle'
,
'rb'
] as token:
self
.creds
=
pickle.load[token]
if
not
self
.creds
or
not
self
.creds.valid:
if
self
.creds
and
self
.creds.expired
and
self
.creds.refresh_token:
self
.creds.refresh[Request[]]
else
:
flow
=
InstalledAppFlow.from_client_secrets_file[
'credentials.json'
, SCOPES]
self
.creds
=
flow.run_local_server[port
=
0
]
with
open
[
'token.pickle'
,
'wb'
] as token:
pickle.dump[
self
.creds, token]
self
.service
=
build[
'drive'
,
'v3'
, credentials
=
self
.creds]
results
=
self
.service.files[].
list
[
pageSize
=
100
, fields
=
"files[id, name]"
].execute[]
items
=
results.get[
'files'
, []]
print
[
"Here's a list of files: \n"
]
print
[
*
items, sep
=
"\n"
, end
=
"\n\n"
]
def
FileDownload[
self
, file_id, file_name]:
request
=
self
.service.files[].get_media[fileId
=
file_id]
fh
=
io.BytesIO[]
downloader
=
MediaIoBaseDownload[fh, request, chunksize
=
204800
]
done
=
False
try
:
while
not
done:
status, done
=
downloader.next_chunk[]
fh.seek[
0
]
with
open
[file_name,
'wb'
] as f:
shutil.copyfileobj[fh, f]
print
[
"File Downloaded"
]
return
True
except
:
print
[
"Something went wrong."
]
return
False
def
FileUpload[
self
, filepath]:
name
=
filepath.split[
'/'
][
-
1
]
mimetype
=
MimeTypes[].guess_type[name][
0
]
file_metadata
=
{
'name'
: name}
try
:
media
=
MediaFileUpload[filepath, mimetype
=
mimetype]
file
=
self
.service.files[].create[
body
=
file_metadata, media_body
=
media, fields
=
'id'
].execute[]
print
[
"File Uploaded."
]
except
:
raise
UploadError[
"Can't Upload File."
]
if
__name__
=
=
"__main__"
:
obj
=
DriveAPI[]
i
=
int
[
input
["Enter your choice:
"1 - Download file, 2- Upload File, 3- Exit.\n"
]]
if
i
=
=
1
:
f_id
=
input
[
"Enter file id: "
]
f_name
=
input
[
"Enter file name: "
]
obj.FileDownload[f_id, f_name]
elif
i
=
=
2
:
f_path
=
input
[
"Enter full file path: "
]
obj.FileUpload[f_path]
else
:
exit[]