/
loader.go
125 lines (106 loc) · 3.23 KB
/
loader.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
package sites
import (
"errors"
"fmt"
"regexp"
"strconv"
"strings"
"github.com/Girbons/comics-downloader/internal/flag/parser"
"github.com/Girbons/comics-downloader/pkg/config"
"github.com/Girbons/comics-downloader/pkg/core"
"github.com/Girbons/comics-downloader/pkg/util"
)
func initializeCollection(issues []string, options *config.Options, base BaseSite) ([]*core.Comic, error) {
var collection []*core.Comic
var err error
if len(issues) == 0 {
return collection, errors.New("No issues found")
}
var startRange, endRange float64
if options.All && options.IssuesRange != "" {
start, end, err := parser.ParseIssuesRange(options.IssuesRange)
if err != nil {
return collection, err
}
startRange = start
endRange = end
}
for _, url := range issues {
name, issueNumber := base.GetInfo(url)
name = util.Parse(name)
if len(options.CustomComicName) > 0 {
name = options.CustomComicName
}
issueNumber = util.Parse(issueNumber)
if notInIssuesRange(issueNumber, startRange, endRange) {
continue
}
dir, _ := util.PathSetup(options.CreateDefaultPath, options.OutputFolder, options.Source, name)
fileName := util.GetPathToFile(dir, name, issueNumber, options.Format, options.IssueNumberNameOnly)
if util.DirectoryOrFileDoesNotExist(fileName) || options.ImagesOnly {
comic := &core.Comic{
Name: name,
IssueNumber: issueNumber,
URLSource: url,
Source: options.Source,
Format: options.Format,
ImagesFormat: options.ImagesFormat,
}
if err = base.Initialize(comic); err != nil {
return collection, err
}
collection = append(collection, comic)
}
}
return collection, nil
}
var onlyNumbers = regexp.MustCompile("[^0-9]+[^.][^0-9]+")
func notInIssuesRange(issueNumber string, start, end float64) bool {
if start == 0 || end == 0 {
return false
}
normalizedNumber := onlyNumbers.ReplaceAllString(issueNumber, "")
if normalizedNumber == "" {
return true
}
number, err := strconv.ParseFloat(normalizedNumber, 64)
if err != nil {
return true
}
return number < start || number > end
}
// LoadComicFromSource will return an `comic` instance initialized based on the source
func LoadComicFromSource(options *config.Options) ([]*core.Comic, error) {
var (
base BaseSite
issues []string
collection []*core.Comic
err error
)
switch {
case strings.Contains(options.Source, "readcomiconline"):
base = NewReadComiconline(options)
case strings.Contains(options.Source, "comicextra"):
base = NewComicextra(options)
case strings.Contains(options.Source, "mangareader"):
base = NewMangareader(options)
case strings.Contains(options.Source, "mangatown"):
base = NewMangatown(options)
case strings.Contains(options.Source, "mangadex"):
base = NewMangadex(options)
case strings.Contains(options.Source, "readallcomics"):
base = NewReadallcomics(options)
case strings.Contains(options.Source, "mangakakalot"):
base = NewMangaKakalot(options)
case strings.Contains(options.Source, "manganato"):
base = NewManganato(options)
default:
err = fmt.Errorf("source unknown")
return collection, err
}
issues, err = base.RetrieveIssueLinks()
if err != nil {
return collection, err
}
return initializeCollection(issues, options, base)
}