@@ -6,10 +6,12 @@ import (
6
6
"fmt"
7
7
"io"
8
8
"io/ioutil"
9
+ "log"
9
10
"net/http"
10
11
"os"
11
12
"path"
12
13
"strconv"
14
+ "time"
13
15
)
14
16
15
17
type Xkcd struct {
@@ -26,13 +28,40 @@ type Xkcd struct {
26
28
Num int `json:"num"`
27
29
}
28
30
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
+
29
52
var debug = true
53
+ var totalCount = 0
30
54
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
+ }
33
62
}
34
63
35
- func getIssue (num int ) error {
64
+ func getComic (num int ) error {
36
65
var url string
37
66
n := strconv .Itoa (num )
38
67
@@ -42,7 +71,7 @@ func getIssue(num int) error {
42
71
url = "https://xkcd.com/" + n + "/info.0.json"
43
72
}
44
73
45
- fmt .Println ("Fetching url: " + url )
74
+ log .Println ("Fetching url: " + url )
46
75
47
76
r , err := http .Get (url )
48
77
if err != nil {
@@ -58,10 +87,13 @@ func getIssue(num int) error {
58
87
59
88
data , _ := ioutil .ReadAll (r .Body )
60
89
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
+
65
97
var xkcdImg Xkcd
66
98
json .Unmarshal (data , & xkcdImg )
67
99
if n == "0" {
@@ -70,66 +102,115 @@ func getIssue(num int) error {
70
102
71
103
imgName := "xkcd-" + n + "-" + path .Base (xkcdImg .Img )
72
104
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)
75
107
}
76
108
77
109
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 ()
86
129
}
87
- if txt == 0 {
88
- fmt .Println ("Filesize is 0" )
89
- }
90
- f .Sync ()
91
- defer f .Close ()
92
130
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
+
96
146
}
97
- defer img .Body .Close ()
98
- imgfile , err := os .Create (imgName )
99
- _ , err = io .Copy (imgfile , img .Body )
100
147
101
- defer imgfile .Close ()
102
148
return err
103
149
}
104
150
105
151
func main () {
152
+ startTime := time .Now ()
106
153
107
154
var (
108
155
all bool
109
156
specific int
110
157
xrange int
111
158
help bool
112
159
version bool
160
+ from int
161
+ to int
113
162
)
114
163
115
164
flag .BoolVar (& all , "a" , false , "Download all" )
116
165
flag .IntVar (& specific , "n" , 0 , "Download specific number" )
117
166
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" )
118
169
flag .BoolVar (& help , "h" , false , "Display help" )
119
170
flag .BoolVar (& version , "v" , false , "Display version" )
120
171
flag .Parse ()
121
172
122
173
if len (os .Args ) == 1 {
123
- getIssue (0 )
174
+ getComic (0 )
124
175
} else if help == true {
176
+ fmt .Println ("XKCD Downloader v0.1 " )
177
+ fmt .Println ("-------------------- " )
125
178
flag .PrintDefaults ()
126
179
os .Exit (1 )
127
180
} else if version == true {
128
181
fmt .Println ("XKCD Downloader v0.1 " )
129
182
} else if all == true {
130
- downloadAll ()
183
+ //downloadAll()
184
+ from = 1
185
+ to = getLatestCount ()
186
+ getComicRange (from , to )
187
+
131
188
} else if specific != 0 {
132
- getIssue (specific )
189
+ getComic (specific )
133
190
}
134
191
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" )
135
216
}
0 commit comments