mirror of https://github.com/rclone/rclone.git
drive: add --drive-alternate-export to fix large doc export - fixes #2243
The official drive APIs seem to have trouble downloading large documents sometimes. This commit adds a --drive-alternate-export flag to use an different, unofficial set of export URLS which seem to download large files OK.
This commit is contained in:
parent
9698a2babb
commit
f073db81b1
|
@ -54,15 +54,16 @@ const (
|
||||||
// Globals
|
// Globals
|
||||||
var (
|
var (
|
||||||
// Flags
|
// Flags
|
||||||
driveAuthOwnerOnly = flags.BoolP("drive-auth-owner-only", "", false, "Only consider files owned by the authenticated user.")
|
driveAuthOwnerOnly = flags.BoolP("drive-auth-owner-only", "", false, "Only consider files owned by the authenticated user.")
|
||||||
driveUseTrash = flags.BoolP("drive-use-trash", "", true, "Send files to the trash instead of deleting permanently.")
|
driveUseTrash = flags.BoolP("drive-use-trash", "", true, "Send files to the trash instead of deleting permanently.")
|
||||||
driveSkipGdocs = flags.BoolP("drive-skip-gdocs", "", false, "Skip google documents in all listings.")
|
driveSkipGdocs = flags.BoolP("drive-skip-gdocs", "", false, "Skip google documents in all listings.")
|
||||||
driveSharedWithMe = flags.BoolP("drive-shared-with-me", "", false, "Only show files that are shared with me")
|
driveSharedWithMe = flags.BoolP("drive-shared-with-me", "", false, "Only show files that are shared with me")
|
||||||
driveTrashedOnly = flags.BoolP("drive-trashed-only", "", false, "Only show files that are in the trash")
|
driveTrashedOnly = flags.BoolP("drive-trashed-only", "", false, "Only show files that are in the trash")
|
||||||
driveExtensions = flags.StringP("drive-formats", "", defaultExtensions, "Comma separated list of preferred formats for downloading Google docs.")
|
driveExtensions = flags.StringP("drive-formats", "", defaultExtensions, "Comma separated list of preferred formats for downloading Google docs.")
|
||||||
driveUseCreatedDate = flags.BoolP("drive-use-created-date", "", false, "Use created date instead of modified date.")
|
driveUseCreatedDate = flags.BoolP("drive-use-created-date", "", false, "Use created date instead of modified date.")
|
||||||
driveListChunk = flags.Int64P("drive-list-chunk", "", 1000, "Size of listing chunk 100-1000. 0 to disable.")
|
driveListChunk = flags.Int64P("drive-list-chunk", "", 1000, "Size of listing chunk 100-1000. 0 to disable.")
|
||||||
driveImpersonate = flags.StringP("drive-impersonate", "", "", "Impersonate this user when using a service account.")
|
driveImpersonate = flags.StringP("drive-impersonate", "", "", "Impersonate this user when using a service account.")
|
||||||
|
driveAlternateExport = flags.BoolP("drive-alternate-export", "", false, "Use alternate export URLs for google documents export.")
|
||||||
// chunkSize is the size of the chunks created during a resumable upload and should be a power of two.
|
// chunkSize is the size of the chunks created during a resumable upload and should be a power of two.
|
||||||
// 1<<18 is the minimum size supported by the Google uploader, and there is no maximum.
|
// 1<<18 is the minimum size supported by the Google uploader, and there is no maximum.
|
||||||
chunkSize = fs.SizeSuffix(8 * 1024 * 1024)
|
chunkSize = fs.SizeSuffix(8 * 1024 * 1024)
|
||||||
|
@ -757,6 +758,18 @@ func (f *Fs) List(dir string) (entries fs.DirEntries, err error) {
|
||||||
}
|
}
|
||||||
obj := o.(*Object)
|
obj := o.(*Object)
|
||||||
obj.url = fmt.Sprintf("%sfiles/%s/export?mimeType=%s", f.svc.BasePath, item.Id, url.QueryEscape(exportMimeType))
|
obj.url = fmt.Sprintf("%sfiles/%s/export?mimeType=%s", f.svc.BasePath, item.Id, url.QueryEscape(exportMimeType))
|
||||||
|
if *driveAlternateExport {
|
||||||
|
switch item.MimeType {
|
||||||
|
case "application/vnd.google-apps.drawing":
|
||||||
|
obj.url = fmt.Sprintf("https://docs.google.com/drawings/d/%s/export/%s", item.Id, extension)
|
||||||
|
case "application/vnd.google-apps.document":
|
||||||
|
obj.url = fmt.Sprintf("https://docs.google.com/document/d/%s/export?format=%s", item.Id, extension)
|
||||||
|
case "application/vnd.google-apps.spreadsheet":
|
||||||
|
obj.url = fmt.Sprintf("https://docs.google.com/spreadsheets/d/%s/export?format=%s", item.Id, extension)
|
||||||
|
case "application/vnd.google-apps.presentation":
|
||||||
|
obj.url = fmt.Sprintf("https://docs.google.com/presentation/d/%s/export/%s", item.Id, extension)
|
||||||
|
}
|
||||||
|
}
|
||||||
obj.isDocument = true
|
obj.isDocument = true
|
||||||
obj.mimeType = exportMimeType
|
obj.mimeType = exportMimeType
|
||||||
obj.bytes = -1
|
obj.bytes = -1
|
||||||
|
|
|
@ -414,6 +414,17 @@ Here are the possible extensions with their corresponding mime types.
|
||||||
| xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | Microsoft Office Spreadsheet |
|
| xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | Microsoft Office Spreadsheet |
|
||||||
| zip | application/zip | A ZIP file of HTML, Images CSS |
|
| zip | application/zip | A ZIP file of HTML, Images CSS |
|
||||||
|
|
||||||
|
#### --drive-alternate-export ####
|
||||||
|
|
||||||
|
If this option is set this instructs rclone to use an alternate set of
|
||||||
|
export URLs for drive documents. Users have reported that the
|
||||||
|
official export URLs can't export large documents, whereas these
|
||||||
|
unofficial ones can.
|
||||||
|
|
||||||
|
See rclone issue [#2243](https://github.com/ncw/rclone/issues/2243) for background,
|
||||||
|
[this google drive issue](https://issuetracker.google.com/issues/36761333) and
|
||||||
|
[this helpful post](https://www.labnol.org/internet/direct-links-for-google-drive/28356/).
|
||||||
|
|
||||||
#### --drive-impersonate user ####
|
#### --drive-impersonate user ####
|
||||||
|
|
||||||
When using a service account, this instructs rclone to impersonate the user passed in.
|
When using a service account, this instructs rclone to impersonate the user passed in.
|
||||||
|
|
Loading…
Reference in New Issue