diff --git a/backend/drive/drive.go b/backend/drive/drive.go index 27c227645..e80364868 100644 --- a/backend/drive/drive.go +++ b/backend/drive/drive.go @@ -54,15 +54,16 @@ const ( // Globals var ( // Flags - 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.") - 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") - 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.") - 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.") - driveImpersonate = flags.StringP("drive-impersonate", "", "", "Impersonate this user when using a service account.") + 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.") + 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") + 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.") + 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.") + 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. // 1<<18 is the minimum size supported by the Google uploader, and there is no maximum. 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.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.mimeType = exportMimeType obj.bytes = -1 diff --git a/docs/content/drive.md b/docs/content/drive.md index beda94534..4114a2844 100644 --- a/docs/content/drive.md +++ b/docs/content/drive.md @@ -414,6 +414,17 @@ Here are the possible extensions with their corresponding mime types. | xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | Microsoft Office Spreadsheet | | 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 #### When using a service account, this instructs rclone to impersonate the user passed in.