add google drive support
This commit is contained in:
parent
12e78b5ca1
commit
db0a1ee3f1
37
by_url.go
37
by_url.go
|
@ -1,37 +0,0 @@
|
||||||
package download
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
func ByURL(url, location string) (err error) {
|
|
||||||
// Create the file
|
|
||||||
out, err := os.Create(location)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer out.Close()
|
|
||||||
|
|
||||||
// Get the data
|
|
||||||
resp, err := http.Get(url)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
// Check server response
|
|
||||||
if resp.StatusCode != http.StatusOK {
|
|
||||||
return fmt.Errorf("bad status: %s", resp.Status)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writer the body to file
|
|
||||||
_, err = io.Copy(out, resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -4,8 +4,9 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"github.com/kr/pretty"
|
"net/http"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/tanaikech/go-getfilelist"
|
"github.com/tanaikech/go-getfilelist"
|
||||||
|
|
||||||
|
@ -15,8 +16,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type GoogleDrive struct {
|
type GoogleDrive struct {
|
||||||
APIKey string
|
apiKey string
|
||||||
|
|
||||||
svc *drive.Service
|
svc *drive.Service
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,19 +25,21 @@ type GoogleDriveFile struct {
|
||||||
Name string
|
Name string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g GoogleDrive) Init() (err error) {
|
var ggdrive GoogleDrive
|
||||||
if g.APIKey == "" {
|
|
||||||
err = errors.New("missing google api key")
|
func Init(apiKey string) (*GoogleDrive, error) {
|
||||||
|
if apiKey == "" {
|
||||||
|
err := errors.New("missing google api key")
|
||||||
logger.Error("validation", logger.LogData{
|
logger.Error("validation", logger.LogData{
|
||||||
Source: "download.google_drive.Init",
|
Source: "download.google_drive.Init",
|
||||||
Message: err.Error(),
|
Message: err.Error(),
|
||||||
Data: nil,
|
Data: nil,
|
||||||
})
|
})
|
||||||
return
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// init google drive
|
// init google drive
|
||||||
svc, err := drive.NewService(context.Background(), option.WithAPIKey(g.APIKey))
|
svc, err := drive.NewService(context.Background(), option.WithAPIKey(apiKey))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fmt.Errorf("unable to retrieve Drive: %v", err)
|
err = fmt.Errorf("unable to retrieve Drive: %v", err)
|
||||||
logger.Error("init google drive service", logger.LogData{
|
logger.Error("init google drive service", logger.LogData{
|
||||||
|
@ -45,13 +47,14 @@ func (g GoogleDrive) Init() (err error) {
|
||||||
Message: err.Error(),
|
Message: err.Error(),
|
||||||
Data: nil,
|
Data: nil,
|
||||||
})
|
})
|
||||||
return
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// assign
|
// assign
|
||||||
g.svc = svc
|
ggdrive.apiKey = apiKey
|
||||||
|
ggdrive.svc = svc
|
||||||
|
|
||||||
return
|
return &ggdrive, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g GoogleDrive) GetFilesByFolderID(folderID string) ([]GoogleDriveFile, error) {
|
func (g GoogleDrive) GetFilesByFolderID(folderID string) ([]GoogleDriveFile, error) {
|
||||||
|
@ -70,12 +73,66 @@ func (g GoogleDrive) GetFilesByFolderID(folderID string) ([]GoogleDriveFile, err
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// if there is no files
|
// if there is more than 1 subfolder
|
||||||
//if len(res.FileList) == 0 {
|
if len(res.FileList) != 1 {
|
||||||
// return result, nil
|
err := fmt.Errorf("folder %s have more than 1 subfolder", folderID)
|
||||||
//}
|
logger.Error("", logger.LogData{
|
||||||
|
Source: "download.google_drive.GetFilesByFolderID",
|
||||||
|
Message: err.Error(),
|
||||||
|
Data: logger.Map{"folder": folderID},
|
||||||
|
})
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|
||||||
pretty.Println("res", res)
|
// check list files
|
||||||
|
fol := res.FileList[0]
|
||||||
|
if len(fol.Files) == 0 {
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// collect files
|
||||||
|
for _, f := range fol.Files {
|
||||||
|
result = append(result, GoogleDriveFile{
|
||||||
|
ID: f.Id,
|
||||||
|
Name: f.Name,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//pretty.Println("res", res)
|
||||||
|
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g GoogleDrive) DownloadByFileID(id, name, location string) (err error) {
|
||||||
|
fmt.Printf("[google drive] start download file %s \n", name)
|
||||||
|
defer fmt.Printf("[google drive] done download file %s \n", name)
|
||||||
|
|
||||||
|
url := fmt.Sprintf("https://drive.google.com/uc?export=download&id=%s", id)
|
||||||
|
|
||||||
|
// Create the file
|
||||||
|
out, err := os.Create(location)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer out.Close()
|
||||||
|
|
||||||
|
// Get the data
|
||||||
|
resp, err := http.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
// Check server response
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
return fmt.Errorf("bad status: %s", resp.Status)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Writer the body to file
|
||||||
|
_, err = io.Copy(out, resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue