func Quota(d *gdrive.Drive, sizeInBytes bool) error { info, err := d.About.Get().Do() if err != nil { return fmt.Errorf("An error occurred: %v\n", err) } fmt.Printf("Used: %s\n", util.FileSizeFormat(info.QuotaBytesUsed, sizeInBytes)) fmt.Printf("Free: %s\n", util.FileSizeFormat(info.QuotaBytesTotal-info.QuotaBytesUsed, sizeInBytes)) fmt.Printf("Total: %s\n", util.FileSizeFormat(info.QuotaBytesTotal, sizeInBytes)) return nil }
// Upload file to drive func UploadStdin(d *gdrive.Drive, input io.ReadCloser, title string, parentId string, share bool, mimeType string, convert bool) error { // File instance f := &drive.File{Title: title} // Set parent (if provided) if parentId != "" { p := &drive.ParentReference{Id: parentId} f.Parents = []*drive.ParentReference{p} } getRate := util.MeasureTransferRate() if convert { fmt.Printf("Converting to Google Docs format enabled\n") } info, err := d.Files.Insert(f).Convert(convert).Media(input).Do() if err != nil { return fmt.Errorf("An error occurred uploading the document: %v\n", err) } // Total bytes transferred bytes := info.FileSize // Print information about uploaded file printInfo(d, info, false) fmt.Printf("MIME Type: %s\n", mimeType) fmt.Printf("Uploaded '%s' at %s, total %s\n", info.Title, getRate(bytes), util.FileSizeFormat(bytes, false)) // Share file if the share flag was provided if share { err = Share(d, info.Id) } return err }
func printInfo(d *gdrive.Drive, f *drive.File, sizeInBytes bool) { fields := map[string]string{ "Id": f.Id, "Title": f.Title, "Description": f.Description, "Size": util.FileSizeFormat(f.FileSize, sizeInBytes), "Created": util.ISODateToLocal(f.CreatedDate), "Modified": util.ISODateToLocal(f.ModifiedDate), "Owner": strings.Join(f.OwnerNames, ", "), "Md5sum": f.Md5Checksum, "Shared": util.FormatBool(isShared(d, f.Id)), "Parents": util.ParentList(f.Parents), } order := []string{ "Id", "Title", "Description", "Size", "Created", "Modified", "Owner", "Md5sum", "Shared", "Parents", } util.Print(fields, order) }
// Download file from drive func Download(d *gdrive.Drive, fileId string, stdout, deleteAfterDownload bool, format string, force bool) error { // Get file info info, err := d.Files.Get(fileId).Do() if err != nil { return fmt.Errorf("An error occurred: %v\n", err) } downloadUrl, extension, err := util.InternalDownloadUrlAndExtension(info, format) if err != nil { return err } // Measure transfer rate getRate := util.MeasureTransferRate() // GET the download url res, err := d.Client().Get(downloadUrl) if err != nil { return fmt.Errorf("An error occurred: %v", err) } // Close body on function exit defer res.Body.Close() // Write file content to stdout if stdout { io.Copy(os.Stdout, res.Body) return nil } fileName := fmt.Sprintf("%s%s", info.Title, extension) // Check if file exists if !force && util.FileExists(fileName) { return fmt.Errorf("An error occurred: '%s' already exists", fileName) } // Create a new file outFile, err := os.Create(fileName) if err != nil { return fmt.Errorf("An error occurred: %v\n", err) } // Close file on function exit defer outFile.Close() // Save file to disk bytes, err := io.Copy(outFile, res.Body) if err != nil { return fmt.Errorf("An error occurred: %s", err) } fmt.Printf("Downloaded '%s' at %s, total %s\n", fileName, getRate(bytes), util.FileSizeFormat(bytes, false)) if deleteAfterDownload { err = Delete(d, fileId) } return err }
func List(d *gdrive.Drive, query, titleFilter string, maxResults int, sharedStatus, noHeader, includeDocs, sizeInBytes bool) error { caller := d.Files.List() if maxResults > 0 { caller.MaxResults(int64(maxResults)) } if titleFilter != "" { q := fmt.Sprintf("title contains '%s'", titleFilter) caller.Q(q) } if query != "" { caller.Q(query) } list, err := caller.Do() if err != nil { return err } items := make([]map[string]string, 0, 0) for _, f := range list.Items { if f.DownloadUrl == "" && !includeDocs { if f.MimeType != "application/vnd.google-apps.folder" { continue } } if f.Labels.Trashed { continue } items = append(items, map[string]string{ "Id": f.Id, "Title": util.TruncateString(f.Title, 40), "Size": util.FileSizeFormat(f.FileSize, sizeInBytes), "Created": util.ISODateToLocal(f.CreatedDate), }) } columnOrder := []string{"Id", "Title", "Size", "Created"} if sharedStatus { addSharedStatus(d, items) columnOrder = append(columnOrder, "Shared") } util.PrintColumns(items, columnOrder, 3, noHeader) return nil }
func uploadFileWorker(id int, jobs <-chan JobInfo, results chan<- int) error { time.Sleep(time.Second) for j := range jobs { fmt.Println("Accepted job") if j.title == "" { j.title = filepath.Base(j.inputInfo.Name()) } if j.mimeType == "" { j.mimeType = mime.TypeByExtension(filepath.Ext(j.title)) } // File instance f := &drive.File{Title: j.title, MimeType: j.mimeType} // Set parent (if provided) if j.parentId != "" { p := &drive.ParentReference{Id: j.parentId} f.Parents = []*drive.ParentReference{p} } getRate := util.MeasureTransferRate() if j.convert { fmt.Printf("Converting to Google Docs format enabled\n") } info, err := j.d.Files.Insert(f).Convert(j.convert).ResumableMedia(context.Background(), j.input, j.inputInfo.Size(), j.mimeType).Do() if err != nil { return fmt.Errorf("An error occurred uploading the document: %v\n", err) } // Total bytes transferred bytes := info.FileSize // Print information about uploaded file printInfo(j.d, info, false) fmt.Printf("MIME Type: %s\n", j.mimeType) fmt.Printf("Uploaded '%s' at %s, total %s\n", info.Title, getRate(bytes), util.FileSizeFormat(bytes, false)) // Placeholder for results results <- 1 // Share file if the share flag was provided if j.share { err = Share(j.d, info.Id) } } fmt.Println("Worker terminating") return nil }
func uploadFile(d *gdrive.Drive, input *os.File, inputInfo os.FileInfo, fileId string, title string, parentId string, share bool, mimeType string, convert bool) error { if title == "" { title = filepath.Base(inputInfo.Name()) } if mimeType == "" { mimeType = mime.TypeByExtension(filepath.Ext(title)) } // File instance f := &drive.File{Title: title, MimeType: mimeType} // Set parent (if provided) if parentId != "" { p := &drive.ParentReference{Id: parentId} f.Parents = []*drive.ParentReference{p} } getRate := util.MeasureTransferRate() if convert { fmt.Printf("Converting to Google Docs format enabled\n") } var info *drive.File var err error if fileId == "" { info, err = d.Files.Insert(f).Convert(convert).ResumableMedia(context.Background(), input, inputInfo.Size(), mimeType).Do() } else { info, err = d.Files.Update(fileId, f).Convert(convert).Media(input).Do() } if err != nil { return fmt.Errorf("An error occurred uploading the document: %v\n", err) } // Total bytes transferred bytes := info.FileSize // Print information about uploaded file printInfo(d, info, false) fmt.Printf("MIME Type: %s\n", mimeType) fmt.Printf("Uploaded '%s' at %s, total %s\n", info.Title, getRate(bytes), util.FileSizeFormat(bytes, false)) // Share file if the share flag was provided if share { err = Share(d, info.Id) } return err }
func List(d *gdrive.Drive, query, titleFilter string, maxResults int, sharedStatus, noHeader, includeDocs, sizeInBytes bool) error { caller := d.Files.List() queryList := []string{} if maxResults > 0 { caller.MaxResults(int64(maxResults)) } if titleFilter != "" { q := fmt.Sprintf("title contains '%s'", titleFilter) queryList = append(queryList, q) } if query != "" { queryList = append(queryList, query) } else { // Skip trashed files queryList = append(queryList, "trashed = false") // Skip google docs if !includeDocs { for _, mime := range googleMimeTypes { q := fmt.Sprintf("mimeType != '%s'", mime) queryList = append(queryList, q) } } } if len(queryList) > 0 { q := strings.Join(queryList, " and ") caller.Q(q) } list, err := caller.Do() if err != nil { return err } files := list.Items for list.NextPageToken != "" { if maxResults > 0 && len(files) > maxResults { break } caller.PageToken(list.NextPageToken) list, err = caller.Do() if err != nil { return err } files = append(files, list.Items...) } items := make([]map[string]string, 0, 0) for _, f := range files { if maxResults > 0 && len(items) >= maxResults { break } items = append(items, map[string]string{ "Id": f.Id, "Title": util.TruncateString(f.Title, 40), "Size": util.FileSizeFormat(f.FileSize, sizeInBytes), "Created": util.ISODateToLocal(f.CreatedDate), }) } columnOrder := []string{"Id", "Title", "Size", "Created"} if sharedStatus { addSharedStatus(d, items) columnOrder = append(columnOrder, "Shared") } util.PrintColumns(items, columnOrder, 3, noHeader) return nil }