| 307 | } |
| 308 | |
| 309 | func DownloadMedia(client *bilibili.BiliClient, _url string, task *Task, mediaType string) error { |
| 310 | var resp *http.Response |
| 311 | var err error |
| 312 | for i := 0; i < 5; i++ { |
| 313 | resp, err = client.SimpleGET(_url, nil) |
| 314 | if err == nil { |
| 315 | break |
| 316 | } |
| 317 | } |
| 318 | |
| 319 | if err != nil { |
| 320 | return err |
| 321 | } |
| 322 | |
| 323 | filename := strconv.FormatInt(task.ID, 10) + "." + mediaType |
| 324 | filepath := filepath.Join(task.Folder, filename) |
| 325 | |
| 326 | progress := newProgressBar(resp.ContentLength) |
| 327 | |
| 328 | file, err := os.Create(filepath) |
| 329 | if err != nil { |
| 330 | return err |
| 331 | } |
| 332 | defer file.Close() |
| 333 | reader := io.TeeReader(resp.Body, file) |
| 334 | buf := make([]byte, 1024) |
| 335 | for { |
| 336 | n, err := reader.Read(buf) |
| 337 | if err != nil && err != io.EOF { |
| 338 | return err |
| 339 | } |
| 340 | if n == 0 { |
| 341 | break |
| 342 | } |
| 343 | |
| 344 | progress.add(n) |
| 345 | GlobalTaskMux.Lock() |
| 346 | if mediaType == "video" { |
| 347 | task.VideoProgress = progress.percent() |
| 348 | } else { |
| 349 | task.AudioProgress = progress.percent() |
| 350 | } |
| 351 | GlobalTaskMux.Unlock() |
| 352 | } |
| 353 | return nil |
| 354 | } |
| 355 | |
| 356 | type progressBar struct { |
| 357 | total int64 |