diff options
| author | Petter Rasmussen | 2015-05-23 14:15:33 +0200 | 
|---|---|---|
| committer | Petter Rasmussen | 2015-05-23 14:15:33 +0200 | 
| commit | dd1adb7b4abeeea1ba92bd23851f46382a618d60 (patch) | |
| tree | a5746baba7be29ada6aab9cb3be9d4c1a984e67c | |
| parent | ed6dc064c3d4f08e6046236e67994c5cb27d426e (diff) | |
| download | gdrive-dd1adb7b4abeeea1ba92bd23851f46382a618d60.tar.bz2 | |
Show available formats for given file. Change export arg to --format
| -rw-r--r-- | cli/cli.go | 9 | ||||
| -rw-r--r-- | drive.go | 6 | ||||
| -rw-r--r-- | util/drive.go | 96 | ||||
| -rw-r--r-- | util/generic.go | 10 | 
4 files changed, 70 insertions, 51 deletions
| @@ -331,14 +331,7 @@ func Download(d *gdrive.Drive, fileId string, stdout, deleteAfterDownload bool,  		return fmt.Errorf("An error occurred: %v\n", err)  	} -	downloadUrl := info.DownloadUrl -	extension := "" - -	if downloadUrl == "" && format == "" { -		return fmt.Errorf("Document has no download url. Try to specify an export format.") -	} - -	downloadUrl, extension, err = util.ExportFormat(info, format) +	downloadUrl, extension, err := util.InternalDownloadUrlAndExtension(info, format)  	if err != nil {  		return err  	} @@ -53,7 +53,7 @@ type Options struct {  	Download struct {  		FileId string `goptions:"-i, --id, mutexgroup='download', obligatory, description='File Id'"` -		Export string `goptions:"-e, --export, description='Export file format for google docs'"` +		Format string `goptions:"--format, description='Download file in a specified format (needed for google docs)'"`  		Stdout bool   `goptions:"-s, --stdout, description='Write file content to stdout'"`  		Force  bool   `goptions:"--force, description='Overwrite existing file'"`  		Pop    bool   `goptions:"--pop, mutexgroup='download', description='Download latest file, and remove it from google drive'"` @@ -123,9 +123,9 @@ func main() {  	case "download":  		args := opts.Download  		if args.Pop { -			err = cli.DownloadLatest(drive, args.Stdout, args.Export, args.Force) +			err = cli.DownloadLatest(drive, args.Stdout, args.Format, args.Force)  		} else { -			err = cli.Download(drive, args.FileId, args.Stdout, false, args.Export, args.Force) +			err = cli.Download(drive, args.FileId, args.Stdout, false, args.Format, args.Force)  		}  	case "delete": diff --git a/util/drive.go b/util/drive.go index c4ba137..259912f 100644 --- a/util/drive.go +++ b/util/drive.go @@ -25,44 +25,60 @@ func ParentList(parents []*drive.ParentReference) string {  	return strings.Join(ids, ", ")  } -func ExportFormat(info *drive.File, format string) (downloadUrl string, extension string, err error) { -	// See https://developers.google.com/drive/web/manage-downloads#downloading_google_documents -	switch format { -	case "docx": -		extension = ".docx" -		downloadUrl = info.ExportLinks["application/vnd.openxmlformats-officedocument.wordprocessingml.document"] -	case "xlsx": -		extension = ".xlsx" -		downloadUrl = info.ExportLinks["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"] -	case "pptx": -		extension = ".pptx" -		downloadUrl = info.ExportLinks["application/application/vnd.openxmlformats-officedocument.presentationml.presentation"] -	case "odf": -		extension = ".odf" -		downloadUrl = info.ExportLinks["application/vnd.oasis.opendocument.text"] -	case "ods": -		extension = ".ods" -		downloadUrl = info.ExportLinks["application/x-vnd.oasis.opendocument.spreadsheet"] -	case "pdf": -		extension = ".pdf" -		downloadUrl = info.ExportLinks["application/pdf"] -	case "rtf": -		extension = ".rtf" -		downloadUrl = info.ExportLinks["application/rtf"] -	case "csv": -		extension = ".csv" -		downloadUrl = info.ExportLinks["text/csv"] -	case "html": -		extension = ".html" -		downloadUrl = info.ExportLinks["text/html"] -	case "txt": -		extension = ".txt" -		downloadUrl = info.ExportLinks["text/plain"] -	case "json": -		extension = ".json" -		downloadUrl = info.ExportLinks["application/vnd.google-apps.script+json"] -	default: -		err = fmt.Errorf("Unknown export format: %s. Known formats: docx, xlsx, pptx, odf, ods, pdf, rtf, csv, txt, html, json", format) -	} -	return +func InternalDownloadUrlAndExtension(info *drive.File, format string) (downloadUrl string, extension string, err error) { +    // Make a list of available mime types for this file +    availableMimeTypes := make([]string, 0) +    for mime, _ := range info.ExportLinks { +        availableMimeTypes = append(availableMimeTypes, mime) +    } + +    mimeExtensions := map[string]string{ +        "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "docx", +        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "xlsx", +        "application/application/vnd.openxmlformats-officedocument.presentationml.presentation": "pptx", +        "application/vnd.oasis.opendocument.text": "odf", +        "application/x-vnd.oasis.opendocument.spreadsheet": "ods", +        "application/pdf": "pdf", +        "application/rtf": "rtf", +        "text/csv": "csv", +        "text/html": "html", +        "text/plain": "txt", +        "application/vnd.google-apps.script+json": "json", +    } + +    // Make a list of available formats for this file +    availableFormats :=  make([]string, 0) +    for _, mime := range availableMimeTypes { +        if ext, ok := mimeExtensions[mime]; ok { +            availableFormats = append(availableFormats, ext) +        } +    } + +    // Return DownloadUrl if no format is specified +    if format == "" { +        if info.DownloadUrl == "" { +            return "", "", fmt.Errorf("A format needs to be specified to download this file (--format). Available formats: %s", strings.Join(availableFormats, ", ")) +        } +        return info.DownloadUrl, "", nil +    } + +    // Ensure that the specified format is available +    if !inArray(format, availableFormats) { +        if len(availableFormats) > 0 { +            return "", "", fmt.Errorf("Invalid format. Available formats: %s", strings.Join(availableFormats, ", ")) +        } else { +            return "", "", fmt.Errorf("No export formats are available for this file") +        } +    } + +    // Grab download url +    for mime, f := range mimeExtensions { +        if f == format { +            downloadUrl = info.ExportLinks[mime] +            break +        } +    } + +    extension = "." + format +    return  } diff --git a/util/generic.go b/util/generic.go index 2b26d60..a4b92be 100644 --- a/util/generic.go +++ b/util/generic.go @@ -197,3 +197,13 @@ func columnPadder(items []map[string]string, key string, spacing int) func(strin  		return column  	}  } + +func inArray(needle string, haystack []string) bool { +    for _, x := range haystack { +        if needle == x { +            return true +        } +    } + +    return false +} | 
