Skip to content

Commit a587ed8

Browse files
committed
added from/to options. Timer
1 parent 00b843b commit a587ed8

File tree

2 files changed

+121
-33
lines changed

2 files changed

+121
-33
lines changed

main.go

+114-33
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ import (
66
"fmt"
77
"io"
88
"io/ioutil"
9+
"log"
910
"net/http"
1011
"os"
1112
"path"
1213
"strconv"
14+
"time"
1315
)
1416

1517
type Xkcd struct {
@@ -26,13 +28,40 @@ type Xkcd struct {
2628
Num int `json:"num"`
2729
}
2830

31+
type Latest struct {
32+
Num int `json:"num"`
33+
}
34+
35+
func getLatestCount() int {
36+
r, err := http.Get("https://xkcd.com/info.0.json")
37+
if err != nil {
38+
log.Fatal("Error getting latest count")
39+
}
40+
defer r.Body.Close()
41+
42+
latest, _ := ioutil.ReadAll(r.Body)
43+
var l Latest
44+
json.Unmarshal(latest, &l)
45+
if debug == true {
46+
log.Println("Total count is : " + strconv.Itoa(l.Num))
47+
}
48+
totalCount = l.Num
49+
return l.Num
50+
}
51+
2952
var debug = true
53+
var totalCount = 0
3054

31-
func downloadAll() {
32-
fmt.Println("Getting ALL issues till date")
55+
func getComicRange(from int, to int) {
56+
log.Println("Getting ALL issues till date")
57+
log.Println("Total counts is ", to)
58+
59+
for i := from; i <= to; i++ {
60+
getComic(i)
61+
}
3362
}
3463

35-
func getIssue(num int) error {
64+
func getComic(num int) error {
3665
var url string
3766
n := strconv.Itoa(num)
3867

@@ -42,7 +71,7 @@ func getIssue(num int) error {
4271
url = "https://xkcd.com/" + n + "/info.0.json"
4372
}
4473

45-
fmt.Println("Fetching url: " + url)
74+
log.Println("Fetching url: " + url)
4675

4776
r, err := http.Get(url)
4877
if err != nil {
@@ -58,10 +87,13 @@ func getIssue(num int) error {
5887

5988
data, _ := ioutil.ReadAll(r.Body)
6089

61-
if debug == true {
62-
fmt.Println("JSON data is:")
63-
fmt.Println(string(data))
64-
}
90+
/*
91+
if debug == true {
92+
log.Println("JSON data is:")
93+
log.Println(string(data))
94+
}
95+
*/
96+
6597
var xkcdImg Xkcd
6698
json.Unmarshal(data, &xkcdImg)
6799
if n == "0" {
@@ -70,66 +102,115 @@ func getIssue(num int) error {
70102

71103
imgName := "xkcd-" + n + "-" + path.Base(xkcdImg.Img)
72104
if debug == true {
73-
fmt.Println("Img Path: " + imgName)
74-
fmt.Println(xkcdImg.Alt)
105+
log.Println("Img Path: " + imgName)
106+
//log.Println(xkcdImg.Alt)
75107
}
76108

77109
fname := "xkcd-" + n + ".txt"
78-
fmt.Println("filename: " + fname)
79-
f, err := os.Create(fname)
80-
if err != nil {
81-
return err
82-
}
83-
txt, err := f.WriteString(xkcdImg.Alt)
84-
if err != nil {
85-
return err
110+
log.Println("filename: " + fname)
111+
112+
if _, err := os.Stat(fname); err == nil {
113+
log.Println("Txt description already saved. ")
114+
} else if os.IsNotExist(err) {
115+
116+
f, err := os.Create(fname)
117+
if err != nil {
118+
return err
119+
}
120+
txt, err := f.WriteString(xkcdImg.Alt)
121+
if err != nil {
122+
return err
123+
}
124+
if txt == 0 {
125+
log.Fatal("Filesize is 0")
126+
}
127+
f.Sync()
128+
defer f.Close()
86129
}
87-
if txt == 0 {
88-
fmt.Println("Filesize is 0")
89-
}
90-
f.Sync()
91-
defer f.Close()
92130

93-
img, err := http.Get(xkcdImg.Img)
94-
if err != nil {
95-
return err
131+
if _, err := os.Stat(imgName); err == nil {
132+
log.Println("File " + imgName + " exists. Skipping...")
133+
134+
} else if os.IsNotExist(err) {
135+
136+
img, err := http.Get(xkcdImg.Img)
137+
if err != nil {
138+
return err
139+
}
140+
defer img.Body.Close()
141+
imgfile, err := os.Create(imgName)
142+
_, err = io.Copy(imgfile, img.Body)
143+
144+
defer imgfile.Close()
145+
96146
}
97-
defer img.Body.Close()
98-
imgfile, err := os.Create(imgName)
99-
_, err = io.Copy(imgfile, img.Body)
100147

101-
defer imgfile.Close()
102148
return err
103149
}
104150

105151
func main() {
152+
startTime := time.Now()
106153

107154
var (
108155
all bool
109156
specific int
110157
xrange int
111158
help bool
112159
version bool
160+
from int
161+
to int
113162
)
114163

115164
flag.BoolVar(&all, "a", false, "Download all")
116165
flag.IntVar(&specific, "n", 0, "Download specific number")
117166
flag.IntVar(&xrange, "r", 0, "Download a range From To")
167+
flag.IntVar(&from, "f", 0, "Download all images starting From")
168+
flag.IntVar(&to, "t", 0, "Download all images up To")
118169
flag.BoolVar(&help, "h", false, "Display help")
119170
flag.BoolVar(&version, "v", false, "Display version")
120171
flag.Parse()
121172

122173
if len(os.Args) == 1 {
123-
getIssue(0)
174+
getComic(0)
124175
} else if help == true {
176+
fmt.Println("XKCD Downloader v0.1 ")
177+
fmt.Println("-------------------- ")
125178
flag.PrintDefaults()
126179
os.Exit(1)
127180
} else if version == true {
128181
fmt.Println("XKCD Downloader v0.1 ")
129182
} else if all == true {
130-
downloadAll()
183+
//downloadAll()
184+
from = 1
185+
to = getLatestCount()
186+
getComicRange(from, to)
187+
131188
} else if specific != 0 {
132-
getIssue(specific)
189+
getComic(specific)
133190
}
134191

192+
if from != 0 && to != 0 && from > to {
193+
from, to = to, from
194+
}
195+
196+
if to != 0 && from == 0 {
197+
from = 1
198+
}
199+
200+
if from != 0 && to == 0 {
201+
to = getLatestCount()
202+
}
203+
204+
if from != 0 {
205+
log.Println("Starting from " + strconv.Itoa(from))
206+
}
207+
if to != 0 {
208+
log.Println("Ending up to " + strconv.Itoa(to))
209+
}
210+
211+
getComicRange(from, to)
212+
213+
endTime := time.Now()
214+
diff := endTime.Sub(startTime)
215+
fmt.Println("Total time taken: ", diff.Seconds(), " seconds")
135216
}

xkcd-1608-comics

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<html>
2+
<head><title>403 Forbidden</title></head>
3+
<body bgcolor="white">
4+
<center><h1>403 Forbidden</h1></center>
5+
<hr><center>nginx</center>
6+
</body>
7+
</html>

0 commit comments

Comments
 (0)