1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
package drive
import (
"fmt"
"io"
"mime"
"os"
"path/filepath"
"google.golang.org/api/drive/v3"
"golang.org/x/net/context"
)
func (self *Drive) List(args ListFilesArgs) {
fileList, err := self.service.Files.List().PageSize(args.MaxFiles).Q(args.Query).Fields("nextPageToken", "files(id,name,size,createdTime)").Do()
errorF(err, "Failed listing files: %s\n", err)
for _, f := range fileList.Files {
fmt.Printf("%s %s %d %s\n", f.Id, f.Name, f.Size, f.CreatedTime)
}
}
func (self *Drive) Download(args DownloadFileArgs) {
getFile := self.service.Files.Get(args.Id)
f, err := getFile.Do()
errorF(err, "Failed to get file: %s", err)
res, err := getFile.Download()
errorF(err, "Failed to download file: %s", err)
// Close body on function exit
defer res.Body.Close()
if args.Stdout {
// Write file content to stdout
io.Copy(os.Stdout, res.Body)
return
}
// Check if file exists
if !args.Force && fileExists(f.Name) {
exitF("File '%s' already exists, use --force to overwrite", f.Name)
}
// Create new file
outFile, err := os.Create(f.Name)
errorF(err, "Unable to create new file: %s", err)
// Close file on function exit
defer outFile.Close()
// Save file to disk
bytes, err := io.Copy(outFile, res.Body)
errorF(err, "Failed saving file: %s", err)
fmt.Printf("Downloaded '%s' at %s, total %d\n", f.Name, "x/s", bytes)
//if deleteSourceFile {
// self.Delete(args.Id)
//}
}
func (self *Drive) Upload(args UploadFileArgs) {
//if args.Stdin {
// self.uploadStdin()
//}
srcFile, err := os.Open(args.Path)
errorF(err, "Failed to open file: %s", err)
srcFileInfo, err := srcFile.Stat()
errorF(err, "Failed to read file metadata: %s", err)
// Instantiate empty drive file
dstFile := &drive.File{}
// Use provided file name or use filename
if args.Name == "" {
dstFile.Name = filepath.Base(srcFileInfo.Name())
} else {
dstFile.Name = args.Name
}
// Set provided mime type or get type based on file extension
if args.Mime == "" {
dstFile.MimeType = mime.TypeByExtension(filepath.Ext(dstFile.Name))
} else {
dstFile.MimeType = args.Mime
}
// Set parent folder if provided
if args.Parent != "" {
dstFile.Parents = []string{args.Parent}
}
f, err := self.service.Files.Create(dstFile).ResumableMedia(context.Background(), srcFile, srcFileInfo.Size(), dstFile.MimeType).Do()
errorF(err, "Failed to upload file: %s", err)
fmt.Printf("Uploaded '%s' at %s, total %d\n", f.Name, "x/s", f.Size)
//if args.Share {
// self.Share(TODO)
//}
}
func (self *Drive) Info(args FileInfoArgs) {
f, err := self.service.Files.Get(args.Id).Fields("id", "name", "size", "createdTime", "modifiedTime", "md5Checksum", "mimeType", "parents", "shared", "description").Do()
errorF(err, "Failed to get file: %s", err)
PrintFileInfo(PrintFileInfoArgs{
File: f,
SizeInBytes: args.SizeInBytes,
})
}
//func newFile(args UploadFileArgs) *drive.File {
//
//}
|