@@ -123,8 +123,9 @@ func partCalculate(par int64, len int64, url string) []Part {
123
123
// Padding 0 before path name as filename will be sorted as string
124
124
fname := fmt .Sprintf ("%s.part%06d" , file , j )
125
125
path := filepath .Join (folder , fname ) // ~/.hget/download-file-name/part-name
126
- ret [j ] = Part {Url : url , Path : path , RangeFrom : from , RangeTo : to }
126
+ ret [j ] = Part {Index : j , Url : url , Path : path , RangeFrom : from , RangeTo : to }
127
127
}
128
+
128
129
return ret
129
130
}
130
131
@@ -134,25 +135,31 @@ func (d *HttpDownloader) Do(doneChan chan bool, fileChan chan string, errorChan
134
135
var barpool * pb.Pool
135
136
var err error
136
137
137
- if DisplayProgressBar () {
138
- bars = make ([]* pb.ProgressBar , 0 )
139
- for i , part := range d .parts {
140
- newbar := pb .New64 (part .RangeTo - part .RangeFrom ).SetUnits (pb .U_BYTES ).Prefix (color .YellowString (fmt .Sprintf ("%s-%d" , d .file , i )))
141
- bars = append (bars , newbar )
138
+ for _ , p := range d .parts {
139
+
140
+ if p .RangeTo <= p .RangeFrom {
141
+ fileChan <- p .Path
142
+ stateSaveChan <- Part {
143
+ Index : p .Index ,
144
+ Url : d .url ,
145
+ Path : p .Path ,
146
+ RangeFrom : p .RangeFrom ,
147
+ RangeTo : p .RangeTo ,
148
+ }
149
+
150
+ continue
151
+ }
152
+
153
+ var bar * pb.ProgressBar
154
+
155
+ if DisplayProgressBar () {
156
+ bar = pb .New64 (p .RangeTo - p .RangeFrom ).SetUnits (pb .U_BYTES ).Prefix (color .YellowString (fmt .Sprintf ("%s-%d" , d .file , p .Index )))
157
+ bars = append (bars , bar )
142
158
}
143
- barpool , err = pb .StartPool (bars ... )
144
- FatalCheck (err )
145
- }
146
159
147
- for i , p := range d .parts {
148
160
ws .Add (1 )
149
- go func (d * HttpDownloader , loop int64 , part Part ) {
161
+ go func (d * HttpDownloader , bar * pb. ProgressBar , part Part ) {
150
162
defer ws .Done ()
151
- var bar * pb.ProgressBar
152
-
153
- if DisplayProgressBar () {
154
- bar = bars [loop ]
155
- }
156
163
157
164
var ranges string
158
165
if part .RangeTo != d .len {
@@ -214,20 +221,27 @@ func (d *HttpDownloader) Do(doneChan chan bool, fileChan chan string, errorChan
214
221
// interrupt download by forcefully close the input stream
215
222
resp .Body .Close ()
216
223
<- finishDownloadChan
217
- stateSaveChan <- Part {
218
- Url : d .url ,
219
- Path : part .Path ,
220
- RangeFrom : current + part .RangeFrom ,
221
- RangeTo : part .RangeTo ,
222
- }
223
224
case <- finishDownloadChan :
224
225
}
225
226
226
- bar .Update ()
227
- bar .Finish ()
228
- }(d , int64 (i ), p )
227
+ stateSaveChan <- Part {
228
+ Index : part .Index ,
229
+ Url : d .url ,
230
+ Path : part .Path ,
231
+ RangeFrom : current + part .RangeFrom ,
232
+ RangeTo : part .RangeTo ,
233
+ }
234
+
235
+ if DisplayProgressBar () {
236
+ bar .Update ()
237
+ bar .Finish ()
238
+ }
239
+ }(d , bar , p )
229
240
}
230
241
242
+ barpool , err = pb .StartPool (bars ... )
243
+ FatalCheck (err )
244
+
231
245
ws .Wait ()
232
246
doneChan <- true
233
247
barpool .Stop ()
0 commit comments