-
Notifications
You must be signed in to change notification settings - Fork 0
/
preview.go
103 lines (89 loc) · 2.22 KB
/
preview.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
97
98
99
100
101
102
103
package yes24
import (
"encoding/json"
"errors"
"fmt"
"github.com/librarios/cli/internal/pkg/net"
"log/slog"
"os"
"path/filepath"
"regexp"
"strings"
)
func getPreviewHtml(id string) (string, error) {
url := fmt.Sprintf("https://www.yes24.com/Product/Viewer/Preview/%s", id)
return net.GetHtml(url)
}
type PreviewInput struct {
Pages struct {
Page []PagePreview `json:"PAGE"`
}
PageDomain string `json:"pagedomain"`
GoodsNo string `json:"goodsno"`
}
type PagePreview struct {
GoodsNo int32
OrderNo int8
OriginalName string
SmallImage PreviewImage
MiddleImage PreviewImage
LargeImage PreviewImage
Bookmark string
}
type PreviewImage struct {
Name string
Width int16
Height int16
FileSize int16
}
func extractPreviewImageUrls(html string) ([]string, error) {
// find preview definition block
re := regexp.MustCompile(`(?m)var input = ({(\n|.)*?});`)
matches := re.FindStringSubmatch(html)
if len(matches) == 0 {
return nil, errors.New("page preview info not found in html")
}
// parse preview definition JSON
inputJson := matches[1]
inputJson = strings.ReplaceAll(inputJson, "'isonepagemode': onepagemode,", "")
inputJson = strings.ReplaceAll(inputJson, "'", "\"")
var input PreviewInput
if err := json.Unmarshal([]byte(inputJson), &input); err != nil {
return nil, err
}
// create preview image URL list
var urls []string
for _, preview := range input.Pages.Page {
url := fmt.Sprintf("%s/%s", input.PageDomain, preview.LargeImage.Name)
urls = append(urls, url)
}
return urls, nil
}
func DownloadPreviewImages(id string, dir string) error {
html, err := getPreviewHtml(id)
if err != nil {
return err
}
urls, err := extractPreviewImageUrls(html)
if err != nil {
return err
}
if err = os.MkdirAll(dir, 0777); err != nil {
return err
}
count := len(urls)
for i, url := range urls {
ext := filepath.Ext(url)
filenameNo := i + 1
if filenameNo == count {
filenameNo = 999
}
outputFilename := filepath.Join(dir, fmt.Sprintf("%03d%s", filenameNo, ext))
if err = net.Download(url, outputFilename); err != nil {
return fmt.Errorf("failed to download %s : %+v", url, err)
} else {
slog.Info("downloaded", "filename", outputFilename)
}
}
return nil
}