-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathimages.go
96 lines (76 loc) · 1.92 KB
/
images.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package main
import (
"fmt"
"io"
"log"
"mime"
"os"
"path"
"strconv"
"time"
"github.com/cheggaaa/pb/v3"
)
func (d *Downloader) GetChaptersImages(downloadData []*ChapterDownloadData, mangaDir string) error {
// Make sure master subfolder exists
err := DirExists(path.Join(d.OutputDir, mangaDir))
if err != nil {
return err
}
for _, dd := range downloadData {
log.Printf("retrieving %s...\n", dd.Name)
bar := pb.StartNew(len(dd.Urls))
err = d.GetChapterImages(dd, mangaDir, func() {
bar.Increment()
})
bar.Finish()
if err != nil {
return err
}
}
return nil
}
func (d *Downloader) GetChapterImages(downloadData *ChapterDownloadData, mangaDir string, update func()) error {
// Create padded format string for image names
nameFmtStr := fmt.Sprintf("%%0%dd%%s", len(strconv.Itoa(len(downloadData.Urls))))
// Get images
for i, url := range downloadData.Urls {
res, err := d.GetPageRaw(url, nil)
if err != nil {
return err
}
// Get extension (if extension corresponding to content-type exists
extension := ".png" // Default to .png
if content_type, exists := res.Header["Content-Type"]; exists {
if len(content_type) > 0 {
extensions, err := mime.ExtensionsByType(content_type[0])
if err != nil {
return err
}
if extensions != nil && len(extensions) > 0 {
extension = extensions[0]
}
}
}
// Get os friendly folder name
chapDir := GetDirName(downloadData.Name)
// Make sure subfolder exists
err = DirExists(path.Join(d.OutputDir, mangaDir, chapDir))
if err != nil {
return err
}
// Create and write file
file, err := os.Create(path.Join(d.OutputDir, mangaDir, chapDir, fmt.Sprintf(nameFmtStr, i+1, extension)))
if err != nil {
return err
}
_, err = io.Copy(file, res.Body)
if err != nil {
return err
}
// Update progress bar
update()
// Don't trigger DDOS protection or something
time.Sleep(d.Delay)
}
return nil
}