diff options
| author | Petter Rasmussen | 2016-01-25 22:34:58 +0100 |
|---|---|---|
| committer | Petter Rasmussen | 2016-01-25 22:34:58 +0100 |
| commit | 35bbe302d53346426541f63f134cb02a11c50e78 (patch) | |
| tree | 61d27cc6c6d211d1c09c8fb1ebe4d60a52539ef6 | |
| parent | 3a669be42beacbde675088f4be12a7a9b078acd7 (diff) | |
| download | gdrive-35bbe302d53346426541f63f134cb02a11c50e78.tar.bz2 | |
Implement import
| -rw-r--r-- | drive/import.go | 57 | ||||
| -rw-r--r-- | drive/upload.go | 11 | ||||
| -rw-r--r-- | gdrive.go | 27 | ||||
| -rw-r--r-- | handlers_drive.go | 12 |
4 files changed, 102 insertions, 5 deletions
diff --git a/drive/import.go b/drive/import.go new file mode 100644 index 0000000..cb82508 --- /dev/null +++ b/drive/import.go @@ -0,0 +1,57 @@ +package drive + +import ( + "io" + "io/ioutil" + "fmt" + "strings" + "mime" + "path/filepath" +) + +type ImportArgs struct { + Out io.Writer + Progress io.Writer + Path string + Share bool + Parents []string +} + +func (self *Drive) Import(args ImportArgs) error { + fromMime := getMimeType(args.Path) + if fromMime == "" { + return fmt.Errorf("Could not determine mime type of file") + } + + about, err := self.service.About.Get().Fields("importFormats").Do() + if err != nil { + return fmt.Errorf("Failed to get about: %s", err) + } + + toMimes, ok := about.ImportFormats[fromMime] + if !ok || len(toMimes) == 0 { + return fmt.Errorf("Mime type '%s' is not supported for import", fromMime) + } + + f, err := self.uploadFile(UploadArgs{ + Out: ioutil.Discard, + Progress: args.Progress, + Path: args.Path, + Parents: args.Parents, + Mime: toMimes[0], + Share: args.Share, + }) + if err != nil { + return err + } + + fmt.Fprintf(args.Out, "[document] id: %s, name: %s\n", f.Id, f.Name) + fmt.Fprintf(args.Out, "Imported %s with mime type: '%s'\n", args.Path, toMimes[0]) + + return nil +} + +func getMimeType(path string) string { + t := mime.TypeByExtension(filepath.Ext(path)) + return strings.Split(t, ";")[0] +} diff --git a/drive/upload.go b/drive/upload.go index 5e70dd8..1e145f7 100644 --- a/drive/upload.go +++ b/drive/upload.go @@ -48,7 +48,8 @@ func (self *Drive) upload(args UploadArgs) error { args.Name = "" return self.uploadDirectory(args) } else { - return self.uploadFile(args) + _, err := self.uploadFile(args) + return err } } @@ -91,10 +92,10 @@ func (self *Drive) uploadDirectory(args UploadArgs) error { return nil } -func (self *Drive) uploadFile(args UploadArgs) error { +func (self *Drive) uploadFile(args UploadArgs) (*drive.File, error) { srcFile, srcFileInfo, err := openFile(args.Path) if err != nil { - return err + return nil, err } // Instantiate empty drive file @@ -128,7 +129,7 @@ func (self *Drive) uploadFile(args UploadArgs) error { f, err := self.service.Files.Create(dstFile).Fields("id", "name", "size", "md5Checksum").Media(srcReader, chunkSize).Do() if err != nil { - return fmt.Errorf("Failed to upload file: %s", err) + return nil, fmt.Errorf("Failed to upload file: %s", err) } // Calculate average upload rate @@ -136,7 +137,7 @@ func (self *Drive) uploadFile(args UploadArgs) error { fmt.Fprintf(args.Out, "[file] id: %s, md5: %s, name: %s\n", f.Id, f.Md5Checksum, f.Name) fmt.Fprintf(args.Out, "Uploaded '%s' at %s/s, total %s\n", f.Name, formatSize(rate, false), formatSize(f.Size, false)) - return nil + return f, nil } type UploadStreamArgs struct { @@ -311,6 +311,33 @@ func main() { }, }, &cli.Handler{ + Pattern: "[global] import [options] <path>", + Description: "Upload and convert file to a google document, see 'about import' for available conversions", + Callback: importHandler, + Flags: cli.Flags{ + "global": globalFlags, + "options": []cli.Flag{ + cli.StringSliceFlag{ + Name: "parent", + Patterns: []string{"-p", "--parent"}, + Description: "Parent id, used to upload file to a specific directory, can be specified multiple times to give many parents", + }, + cli.BoolFlag{ + Name: "noProgress", + Patterns: []string{"--no-progress"}, + Description: "Hide progress", + OmitValue: true, + }, + cli.BoolFlag{ + Name: "share", + Patterns: []string{"--share"}, + Description: "Share file", + OmitValue: true, + }, + }, + }, + }, + &cli.Handler{ Pattern: "[global] export [options] <id>", Description: "Export a google document", Callback: exportHandler, diff --git a/handlers_drive.go b/handlers_drive.go index 38c1e1c..a8303ed 100644 --- a/handlers_drive.go +++ b/handlers_drive.go @@ -112,6 +112,18 @@ func infoHandler(ctx cli.Context) { checkErr(err) } +func importHandler(ctx cli.Context) { + args := ctx.Args() + err := newDrive(args).Import(drive.ImportArgs{ + Out: os.Stdout, + Path: args.String("path"), + Parents: args.StringSlice("parent"), + Share: args.Bool("share"), + Progress: progressWriter(args.Bool("noProgress")), + }) + checkErr(err) +} + func exportHandler(ctx cli.Context) { args := ctx.Args() err := newDrive(args).Export(drive.ExportArgs{ |
