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
|
package main
import (
"encoding/json"
"flag"
"fmt"
"log"
"math/rand"
"time"
"framagit.org/andinus/cetus/pkg/background"
"framagit.org/andinus/cetus/pkg/bing"
"framagit.org/andinus/cetus/pkg/cetus"
)
type photo struct {
startDate string `json:"startdate"`
fullStartDate string `json:"fullstartdate"`
endDate string `json:"enddate"`
url string `json:"url"`
urlBase string `json:"urlbase"`
copyright string `json:"copyright"`
copyrightLink string `json:"copyrightlink"`
title string `json:"title"`
hsh string `json:"hsh"`
}
type bpod struct {
photos []photo `json:"images"`
}
var (
t time.Duration
api string
dump bool
quiet bool
random bool
version bool
pathOnly bool
fetchOnly bool
)
func main() {
parseFlags()
if version {
cetus.Version()
return
}
rand.Seed(time.Now().Unix())
// Convert timeout to seconds
t = t * time.Second
body, err := bpodBody()
if dump {
fmt.Println(body)
return
}
bpod := bpod{}
err = json.Unmarshal([]byte(body), &bpod)
errChk("body unmarshal failed", err)
// if random was set then bpodRes holds list of multiple
// responses, choose a random response from the list
var i int = rand.Intn(len(bpod.photos))
bpodPhoto := bpod.photos[i]
// correct image path
bpodPhoto.url = fmt.Sprintf("%s%s", "https://www.bing.com", bpodPhoto.url)
// correct date format
dt, err := time.Parse("20060102", bpodPhoto.startDate)
errChk("bpodPhoto.startDate parse failed", err)
bpodPhoto.startDate = dt.Format("2006-01-02")
printDetails(bpodPhoto)
// if fetchOnly is true then don't set background
if fetchOnly {
return
}
err = background.Set(bpodPhoto.url)
errChk("setting background failed", err)
}
func parseFlags() {
flag.BoolVar(&quiet, "quiet", false, "No output")
flag.BoolVar(&version, "version", false, "Cetus version")
flag.BoolVar(&fetchOnly, "fetch-only", false, "Don't set background, only fetch info")
flag.BoolVar(&dump, "dump", false, "Only dump received response")
flag.BoolVar(&random, "random", false, "Choose a random image (from 7 images)")
flag.BoolVar(&pathOnly, "path-only", false, "Print only path of the image")
flag.StringVar(&api, "api", "https://www.bing.com/HPImageArchive.aspx", "BPOD API URL")
flag.DurationVar(&t, "timeout", 32*time.Second, "Timeout for http client in seconds")
flag.Parse()
}
func printDetails(bpodPhoto photo) {
if quiet {
return
}
if pathOnly {
cetus.PrintPath(bpodPhoto.url)
return
}
fmt.Printf("Title: %s\n\n", bpodPhoto.title)
fmt.Printf("Copyright: %s\n", bpodPhoto.copyright)
fmt.Printf("Copyright Link: %s\n", bpodPhoto.copyrightLink)
fmt.Printf("Date: %s\n\n", bpodPhoto.startDate)
fmt.Printf("URL: %s\n", bpodPhoto.url)
}
func bpodBody() (string, error) {
reqInfo := make(map[string]string)
reqInfo["api"] = api
if random {
reqInfo["random"] = "true"
}
body, err := bing.GetBpodJson(reqInfo, t)
return body, err
}
func errChk(ctx string, err error) {
log.Println(ctx)
log.Fatal(err)
}
|