Refactoring operations on SunXdccProvider

main
Stefano Scafiti 2022-10-22 12:18:58 +02:00
parent 3c554922c8
commit aaed716ed3
1 changed files with 39 additions and 30 deletions

View File

@ -135,7 +135,7 @@ func (p *XdccEuProvider) Search(keywords []string) ([]XdccFileInfo, error) {
defer res.Body.Close() defer res.Body.Close()
if res.StatusCode != http.StatusOK { if res.StatusCode != http.StatusOK {
return nil, errors.New(fmt.Sprintf("status code error: %d %s", res.StatusCode, res.Status)) return nil, fmt.Errorf("status code error: %d %s", res.StatusCode, res.Status)
} }
// Load the HTML document // Load the HTML document
@ -169,13 +169,14 @@ func (p *XdccEuProvider) Search(keywords []string) ([]XdccFileInfo, error) {
return fileInfos, nil return fileInfos, nil
} }
const (
SunXdccURL = "http://sunxdcc.com/deliver.php"
SunXdccNumberOfEntries = 8
)
type SunXdccProvider struct{} type SunXdccProvider struct{}
const SunXdccURL = "http://sunxdcc.com/deliver.php" func (p *SunXdccProvider) parseFields(entry *SunXdccEntry, index int) (*XdccFileInfo, error) {
const SunXdccNumberOfEntries = 8
func (p *SunXdccProvider) parseFields(entry SunXdccEntry, index int) (*XdccFileInfo, error) {
fInfo := &XdccFileInfo{} fInfo := &XdccFileInfo{}
fInfo.Network = entry.Network[index] fInfo.Network = entry.Network[index]
@ -219,7 +220,7 @@ type SunXdccEntry struct {
func (p *SunXdccProvider) Search(keywords []string) ([]XdccFileInfo, error) { func (p *SunXdccProvider) Search(keywords []string) ([]XdccFileInfo, error) {
keywordString := strings.Join(keywords, " ") keywordString := strings.Join(keywords, " ")
searchkey := strings.Join(strings.Fields(keywordString), "+") searchkey := strings.Join(strings.Fields(keywordString), "+")
// for API definition use https://sunxdcc.com/#api // see https://sunxdcc.com/#api for API definition
res, err := http.Get(SunXdccURL + "?sterm=" + searchkey) res, err := http.Get(SunXdccURL + "?sterm=" + searchkey)
if err != nil { if err != nil {
@ -229,18 +230,30 @@ func (p *SunXdccProvider) Search(keywords []string) ([]XdccFileInfo, error) {
defer res.Body.Close() defer res.Body.Close()
if res.StatusCode != http.StatusOK { if res.StatusCode != http.StatusOK {
return nil, errors.New(fmt.Sprintf("status code error: %d %s", res.StatusCode, res.Status)) return nil, fmt.Errorf("status code error: %d %s", res.StatusCode, res.Status)
} }
// Load the JSON Response document entry, err := p.parseResponse(res)
if err != nil {
var entry SunXdccEntry
decoder := json.NewDecoder(res.Body)
if err := decoder.Decode(&entry); err != nil {
return nil, err return nil, err
} }
var sizes = [8]int{ if !p.validateResult(entry) {
return nil, fmt.Errorf("Parse Error, not all fields have the same size")
}
fileInfos := make([]XdccFileInfo, 0)
for i := 0; i < len(entry.Botrec); i++ {
info, err := p.parseFields(entry, i)
if err == nil {
fileInfos = append(fileInfos, *info)
}
}
return fileInfos, nil
}
func (*SunXdccProvider) validateResult(entry *SunXdccEntry) bool {
sizes := [8]int{
len(entry.Botrec), len(entry.Botrec),
len(entry.Network), len(entry.Network),
len(entry.Bot), len(entry.Bot),
@ -248,25 +261,21 @@ func (p *SunXdccProvider) Search(keywords []string) ([]XdccFileInfo, error) {
len(entry.Packnum), len(entry.Packnum),
len(entry.Gets), len(entry.Gets),
len(entry.Fsize), len(entry.Fsize),
len(entry.Fname)} len(entry.Fname),
}
var length = sizes[0] length := sizes[0]
for _, l := range sizes { for _, l := range sizes {
if length != l { if length != l {
log.Fatalf("Parse Error, not all fields have the same size") return false
return nil, errors.New("Parse Error, not all fields have the same size")
} }
} }
return true
}
fileInfos := make([]XdccFileInfo, 0) func (*SunXdccProvider) parseResponse(res *http.Response) (*SunXdccEntry, error) {
entry := &SunXdccEntry{}
for i := 0; i < len(entry.Botrec); i++ { decoder := json.NewDecoder(res.Body)
err := decoder.Decode(entry)
info, err := p.parseFields(entry, i) return entry, err
if err == nil {
fileInfos = append(fileInfos, *info)
}
}
return fileInfos, nil
} }