MCPcopy Create free account
hub / github.com/FloatTech/AnimeAPI / Download

Method Download

pixiv/download.go:44–162  ·  view source on GitHub ↗

Download 多线程下载 page 页到 filepath, 返回 error

(page int, path string)

Source from the content-addressed store, hash-verified

42
43// Download 多线程下载 page 页到 filepath, 返回 error
44func (i *Illust) Download(page int, path string) error {
45 const slicecap int64 = 65536
46 u := i.ImageUrls[page]
47 // 获取IP地址
48 domain, err := url.Parse(u)
49 if err != nil {
50 return err
51 }
52
53 header := http.Header{
54 "Host": []string{domain.Host},
55 "Referer": []string{"https://www.pixiv.net/"},
56 "User-Agent": []string{"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0"},
57 "Cache-Control": []string{"no-cache"},
58 }
59
60 // 请求 Header
61 headreq, err := http.NewRequest("HEAD", u, nil)
62 if err != nil {
63 return err
64 }
65 headreq.Header = header.Clone()
66 client := web.NewPixivClient()
67 headresp, err := client.Do(headreq)
68 if err != nil {
69 return err
70 }
71
72 contentlength, err := strconv.ParseInt(headresp.Header.Get("Content-Length"), 10, 64)
73 _ = headresp.Body.Close()
74 if err != nil {
75 return err
76 }
77
78 // 多线程下载
79 var wg sync.WaitGroup
80 var start int64
81 errs := make(chan error, 8)
82 buf := make(net.Buffers, 0, contentlength/slicecap+1)
83 writers := make([]*binary.Writer, 0, contentlength/slicecap+1)
84 index := 0
85 for end := math.Min(start+slicecap, contentlength); ; end += slicecap {
86 wg.Add(1)
87 buf = append(buf, nil)
88 writers = append(writers, nil)
89 if end > contentlength {
90 end = contentlength
91 }
92 go func(start int64, end int64, index int) {
93 // fmt.Println(contentlength, start, end)
94 for failedtimes := 0; failedtimes < 3; failedtimes++ {
95 req, err := http.NewRequest("GET", u, nil)
96 if err != nil {
97 errs <- err
98 process.SleepAbout1sTo2s()
99 continue
100 }
101 req.Header = header.Clone()

Callers 1

DownloadToCacheMethod · 0.95

Calls 1

SetMethod · 0.80

Tested by

no test coverage detected