2024-01-05 22:16:33 +00:00
|
|
|
package downloader
|
|
|
|
|
|
|
|
import "hash"
|
|
|
|
|
|
|
|
type progressWriter struct {
|
|
|
|
fileName string
|
|
|
|
total int64
|
2024-04-23 07:22:58 +00:00
|
|
|
fileNo int
|
|
|
|
totalFiles int
|
2024-01-05 22:16:33 +00:00
|
|
|
written int64
|
|
|
|
downloadStatus func(string, string, string, float64)
|
|
|
|
hash hash.Hash
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pw *progressWriter) Write(p []byte) (n int, err error) {
|
|
|
|
n, err = pw.hash.Write(p)
|
|
|
|
pw.written += int64(n)
|
|
|
|
|
|
|
|
if pw.total > 0 {
|
|
|
|
percentage := float64(pw.written) / float64(pw.total) * 100
|
2024-04-23 07:22:58 +00:00
|
|
|
if pw.totalFiles > 1 {
|
|
|
|
// This is a multi-file download
|
|
|
|
// so we need to adjust the percentage
|
|
|
|
// to reflect the progress of the whole download
|
|
|
|
// This is the file pw.fileNo of pw.totalFiles files. We assume that
|
|
|
|
// the files before successfully downloaded.
|
|
|
|
percentage = percentage / float64(pw.totalFiles)
|
|
|
|
if pw.fileNo > 1 {
|
|
|
|
percentage += float64(pw.fileNo-1) * 100 / float64(pw.totalFiles)
|
|
|
|
}
|
|
|
|
}
|
2024-01-05 22:16:33 +00:00
|
|
|
//log.Debug().Msgf("Downloading %s: %s/%s (%.2f%%)", pw.fileName, formatBytes(pw.written), formatBytes(pw.total), percentage)
|
|
|
|
pw.downloadStatus(pw.fileName, formatBytes(pw.written), formatBytes(pw.total), percentage)
|
|
|
|
} else {
|
|
|
|
pw.downloadStatus(pw.fileName, formatBytes(pw.written), "", 0)
|
|
|
|
}
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|