-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
117 lines (106 loc) · 2.41 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
package main
import (
"fmt"
"log"
"net/http"
"net/http/cookiejar"
"os"
"path/filepath"
"sort"
"time"
"chronicler/adapter"
"chronicler/adapter/fourchan"
"chronicler/adapter/pikabu"
"chronicler/adapter/reddit"
"chronicler/adapter/twitter"
"chronicler/adapter/web"
"chronicler/common"
opb "chronicler/proto"
"chronicler/resolver"
"chronicler/storage"
"chronicler/viewer"
)
const (
root = "data"
)
func main() {
switch os.Args[1] {
case "list":
list(os.Args[2:])
case "save":
save(os.Args[2:])
case "view":
view(os.Args[2:])
case "export":
export(os.Args[2:])
}
}
func list(_ []string) {
dir, err := os.ReadDir(root)
if err != nil {
return
}
snapshots := []*opb.Snapshot{}
for _, d := range dir {
ls, err := storage.NewLocalStorage(filepath.Join(root, d.Name()))
if err != nil {
continue
}
bs := storage.BlockStorage{Storage: ls}
snapshot := &opb.Snapshot{}
if err = bs.GetObject(&storage.GetRequest{Url: "snapshot.json"}, snapshot); err != nil {
continue
}
snapshots = append(snapshots, snapshot)
}
sort.Slice(snapshots, func(i, j int) bool {
sa := snapshots[i]
sb := snapshots[j]
if sb.FetchTime == nil {
return false
} else if sa.FetchTime == nil {
return true
}
return sa.FetchTime.Seconds < sb.FetchTime.Seconds
})
for i, snapshot := range snapshots {
fetchTime := "?"
if snapshot.FetchTime != nil {
fetchTime = time.Unix(snapshot.FetchTime.Seconds, 0).Format(time.DateTime)
}
fmt.Printf("%03d [%s] %s\n", i, fetchTime, snapshot.Link)
}
}
func view(args []string) {
viewer.NewViewer(root).View(common.UUID4For(&opb.Link{Href: args[0]}))
}
func export(args []string) {
viewer.NewExporter(root, args[1]).Export(common.UUID4For(&opb.Link{Href: args[0]}))
}
func save(args []string) {
jar, err := cookiejar.New(&cookiejar.Options{})
if err != nil {
log.Fatal(err)
}
httpClient := &http.Client{
Jar: jar,
Timeout: 10 * time.Minute,
}
twitterToken := os.Getenv("TWITTER_TOKEN")
redditToken := os.Getenv("REDDIT_TOKEN")
r := resolver.NewResolver(
root,
common.NewHttpDownloader(httpClient),
[]adapter.Adapter{
twitter.NewAdapter(twitter.NewClient(httpClient, twitterToken)),
fourchan.NewAdapter(httpClient),
pikabu.NewAdapter(httpClient),
reddit.NewAdapter(httpClient, &reddit.RedditAuth{AccessToken: redditToken}),
web.NewAdapter(httpClient),
},
)
r.Start()
r.Resolve(&opb.Link{Href: args[0]})
r.Wait()
r.Stop()
}