-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
142 lines (106 loc) · 2.9 KB
/
main.go
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package main
import (
"code.google.com/p/goauth2/oauth"
drive "code.google.com/p/google-api-go-client/drive/v2"
"flag"
"fmt"
"io"
"log"
"net/http"
"os"
"os/exec"
"path/filepath"
)
// OAuth
var client *http.Client
var config = &oauth.Config{
ClientId: "", // Set by --clientid
ClientSecret: "", // Set by --secret
Scope: "", // filled in per-API
AuthURL: "https://accounts.google.com/o/oauth2/auth",
TokenURL: "https://accounts.google.com/o/oauth2/token",
}
var service *drive.Service
// Flags
var (
clientId = flag.String("clientid", "", "OAuth Client ID")
secret = flag.String("secret", "", "OAuth Client Secret")
mimeType = flag.String("mimeType", "text/html", "MIME type to download")
cacheToken = flag.Bool("cachetoken", true, "cache the OAuth token")
)
func usage() {
fmt.Fprintf(os.Stderr, "Usage: gdriver [flags] <fileId>\n")
os.Exit(2)
}
// DownloadFile downloads the content of a given file object
func DownloadFile(url string, out io.WriteCloser) {
// Make the request.
r, err := client.Get(url)
if err != nil {
log.Fatal("Get:", err)
}
defer r.Body.Close()
// Write the response to standard output.
io.Copy(out, r.Body)
}
func getExportLink(file *drive.File, mimeType string) string {
// TODO - return file.ExportLinks[*mimeType]
var format string
switch mimeType {
case "text/html":
format = "html"
}
return fmt.Sprintf("https://docs.google.com/feeds/download/documents/export/Export?id=%s&exportFormat=%s", file.Id, format)
}
func renderFile(file *drive.File, outFile string) {
downloadUrl := getExportLink(file, *mimeType)
inFormat := "html"
cmd := exec.Command("pandoc", "-f", inFormat, "-o", outFile)
pandocIn, err := cmd.StdinPipe()
if err != nil {
log.Fatal(err)
}
if err := cmd.Start(); err != nil {
log.Fatal(err)
}
log.Printf("Downloading %s ...", downloadUrl)
DownloadFile(downloadUrl, pandocIn)
pandocIn.Close()
log.Printf("Creating %s ...", outFile)
if err := cmd.Wait(); err != nil {
log.Fatal(err)
}
}
func renderFiles(fileId string, path string) {
// Get the file
file, _ := service.Files.Get(fileId).Do()
//log.Printf("File: \n %#v", file)
// Check if this is a folder
if file.MimeType == "application/vnd.google-apps.folder" {
path = filepath.Join(path, file.Title)
log.Printf("Got folder %s", path)
// create the directory
os.Mkdir(path, 0700)
childList, _ := service.Children.List(file.Id).Do()
for _, ref := range childList.Items {
renderFiles(ref.Id, path)
}
} else {
log.Printf("Got file %s/%s", path, file.Title)
outFile := filepath.Join(path, fmt.Sprintf("%s.pdf", file.Title))
renderFile(file, outFile)
}
}
func main() {
flag.Parse()
if flag.NArg() == 0 {
usage()
}
fileId := flag.Arg(0)
config.Scope = drive.DriveScope
config.ClientId = *clientId
config.ClientSecret = *secret
client = getOAuthClient(config)
service, _ = drive.New(client)
renderFiles(fileId, ".")
}