/
mangareader.go
128 lines (100 loc) · 2.97 KB
/
mangareader.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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package sites
import (
"fmt"
"strings"
"github.com/Girbons/comics-downloader/pkg/config"
"github.com/Girbons/comics-downloader/pkg/core"
"github.com/Girbons/comics-downloader/pkg/util"
"github.com/anaskhan96/soup"
)
// Mangareader represents a Mangareader instance
type Mangareader struct {
options *config.Options
}
// NewMangareader returns a mangareader instance.
func NewMangareader(options *config.Options) *Mangareader {
return &Mangareader{
options: options,
}
}
func (m *Mangareader) retrieveImageLinks(comic *core.Comic) ([]string, error) {
var links []string
response, err := soup.Get(comic.URLSource)
if err != nil {
return nil, err
}
doc := soup.HTMLParse(response)
for _, t := range doc.FindAll("img") {
imageURL := t.Attrs()["data-src"]
if util.IsURLValid(imageURL) {
links = append(links, imageURL)
}
}
if m.options.Debug {
m.options.Logger.Debug(fmt.Sprintf("Image Links found: %s", strings.Join(links, " ")))
}
return links, err
}
func (m *Mangareader) isSingleIssue(url string) bool {
return len(util.TrimAndSplitURL(url)) >= 5
}
func (m *Mangareader) retrieveLastIssue(url string) (string, error) {
url = strings.Join(util.TrimAndSplitURL(url)[:4], "/")
response, err := soup.Get(url)
if err != nil {
return "", err
}
doc := soup.HTMLParse(response)
lastIssue := doc.Find("ul", "class", "d44").FindAll("li")[0].Find("a").Attrs()["href"]
lastIssueURL := "https://mangareader.tv" + lastIssue
return lastIssueURL, nil
}
// RetrieveIssueLinks gets a slice of urls for all issues in a comic
func (m *Mangareader) RetrieveIssueLinks() ([]string, error) {
url := m.options.URL
if m.options.Last {
lastIssue, err := m.retrieveLastIssue(url)
return []string{lastIssue}, err
}
if m.options.All && m.isSingleIssue(url) {
url = strings.Join(util.TrimAndSplitURL(url)[:4], "/")
} else if m.isSingleIssue(url) {
return []string{url}, nil
}
var links []string
response, err := soup.Get(url)
if err != nil {
return nil, err
}
doc := soup.HTMLParse(response)
nodes := doc.Find("table", "class", "d48").FindAll("tr")
for _, node := range nodes {
element := node.Find("a")
if !strings.Contains(element.NodeValue, "not found") && element.Pointer != nil {
url := "https://mangareader.tv" + element.Attrs()["href"]
if util.IsURLValid(url) {
links = append(links, url)
}
}
}
if m.options.Debug {
m.options.Logger.Debug(fmt.Sprintf("Issues Links found: %s", strings.Join(links, " ")))
}
return links, err
}
// GetInfo extracts the basic info from the given URL.
func (m *Mangareader) GetInfo(url string) (string, string) {
parts := util.TrimAndSplitURL(url)
name := parts[3]
issueNumber := parts[4]
return name, issueNumber
}
// Initialize loads links and metadata from mangareader
func (m *Mangareader) Initialize(comic *core.Comic) error {
name, issueNumber := m.GetInfo(comic.URLSource)
comic.Name = name
comic.IssueNumber = issueNumber
links, err := m.retrieveImageLinks(comic)
comic.Links = links
return err
}