This repository has been archived by the owner on Apr 6, 2024. It is now read-only.
/
main.go
148 lines (118 loc) · 3.93 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
143
144
145
146
147
148
package main
import (
"flag"
"fmt"
"log"
"os"
"path/filepath"
"runtime/debug"
"time"
"go.mlcdf.fr/sc-backup/internal/backend"
"go.mlcdf.fr/sc-backup/internal/backup"
"go.mlcdf.fr/sc-backup/internal/domain"
"go.mlcdf.fr/sc-backup/internal/format"
"go.mlcdf.fr/sc-backup/internal/logx"
)
const usage = `Usage:
sc-backup --collection [USERNAME]
sc-backup --list [URL]
Options:
-c, --collection USERNAME Backup a user's collection
-l, --list URL Backup a list
-o, --output PATH Directory at which to backup the data. Defaults to ./output
-f, --format json|csv Export format. Defaults to json
-p, --pretty Prettify the JSON exports
-v, --verbose Print verbose output
-V, --version Print version
Examples:
sc-backup --collection mlcdf
sc-backup --list https://www.senscritique.com/liste/Vu_au_cinema/363578
`
// Version can be set at link time to override debug.BuildInfo.Main.Version,
// which is "(devel)" when building from within the module. See
// golang.org/issue/29814 and golang.org/issue/29228.
var Version string
func main() {
log.SetFlags(0)
flag.Usage = func() { fmt.Fprintf(os.Stderr, usage) }
if len(os.Args) == 1 {
flag.Usage()
os.Exit(0)
}
var (
isVerboseFlag bool
listFlag string
collectionFlag string
outputFlag string = "output"
formatFlag string = "json"
prettyFlag bool
versionFlag bool
)
flag.BoolVar(&versionFlag, "version", versionFlag, "print the version")
flag.BoolVar(&versionFlag, "V", versionFlag, "print the version")
flag.BoolVar(&isVerboseFlag, "verbose", isVerboseFlag, "enable verbose output")
flag.BoolVar(&isVerboseFlag, "v", isVerboseFlag, "enable verbose output")
flag.StringVar(&listFlag, "list", listFlag, "Download list")
flag.StringVar(&listFlag, "l", listFlag, "Download list")
flag.StringVar(&collectionFlag, "collection", collectionFlag, "Download user collection")
flag.StringVar(&collectionFlag, "c", collectionFlag, "Download user collection")
flag.StringVar(&outputFlag, "output", outputFlag, "Output directory")
flag.StringVar(&outputFlag, "o", outputFlag, "Output directory")
flag.StringVar(&formatFlag, "format", formatFlag, "Output format. Either json or csv. Default to json.")
flag.StringVar(&formatFlag, "f", formatFlag, "Output format. Either json or csv. Default to json.")
flag.BoolVar(&prettyFlag, "pretty", prettyFlag, "Pretty output")
flag.BoolVar(&prettyFlag, "p", prettyFlag, "Pretty output")
flag.Parse()
if versionFlag {
if Version != "" {
fmt.Println(Version)
return
}
if buildInfo, ok := debug.ReadBuildInfo(); ok {
fmt.Println(buildInfo.Main.Version)
return
}
fmt.Println("(unknown)")
return
}
start := time.Now()
if collectionFlag != "" && listFlag != "" {
log.Fatalln("error: you can't set --list and --collection at the same time")
}
if collectionFlag == "" && listFlag == "" {
log.Fatalln("error: at least one of --list or --collection is required")
}
if formatFlag == "csv" && prettyFlag {
logx.Info("warning: -p/--pretty is useless with -f/--format csv. CSV won't be prettified.")
}
if isVerboseFlag {
logx.EnableVerboseOutput()
}
var back domain.Backend
var err error
var formatter domain.Formatter
switch formatFlag {
case "json":
formatter = format.NewJSON(prettyFlag)
case "csv":
formatter = &format.CSV{}
default:
log.Fatalf("invalid format %s: it should be json|csv|html", formatFlag)
}
if collectionFlag != "" {
back = backend.NewFS(filepath.Join(outputFlag, collectionFlag), formatter)
err = backup.Collection(collectionFlag, back)
}
if listFlag != "" {
back = backend.NewFS(outputFlag, formatter)
err = backup.List(listFlag, back)
}
if err != nil {
log.Fatalf("error: %s", err)
}
to, err := filepath.Abs(back.Location())
if err != nil {
to = back.Location()
}
logx.Info("Saved to %s in %s", to, time.Since(start).Round(time.Millisecond).String())
}