downloader/torrent_parse.go

53 lines
1.5 KiB
Go

package main
import (
"errors"
"fmt"
"os"
"git.milar.in/milarin/adverr"
"git.milar.in/nyaanime/logic"
"git.milar.in/nyaanime/model"
"git.milar.in/nyaanime/parsers"
"github.com/fatih/color"
)
func ParseTorrent(torrent *model.Torrent) (*model.ParsedTorrent, error) {
for _, parser := range parsers.Parsers {
parsedTorrent, ok := parser.TorrentParser(&parser, torrent)
if ok {
anime, err := logic.SearchAnimeByTitle(parsedTorrent.OriginalAnimeTitle)
if err != nil {
return parsedTorrent, ErrTorrentParseFailed.Wrap(err, torrent.ID, parser.String())
}
parsedTorrent.Anime = anime
return parsedTorrent, nil
}
}
return nil, ErrNoSuitableParser.New(torrent.ID)
}
func ParseTorrentsByAnimeEp(torrents []model.Torrent) map[model.AnimeEpisode][]*model.ParsedTorrent {
torrentsByAnimeEp := map[model.AnimeEpisode][]*model.ParsedTorrent{}
for _, torrent := range torrents {
torrent := torrent
parsedTorrent, err := ParseTorrent(&torrent)
if err != nil {
if errors.Is(err, logic.ErrAnimeNotFound) {
fmt.Fprintln(os.Stderr, color.RedString("torrent with ID %s could not be parsed because anime was not found: \"%s\"", torrent.ID, parsedTorrent.OriginalAnimeTitle))
} else if !errors.Is(err, ErrNoSuitableParser) {
adverr.Println(err)
}
continue
}
animeEp := GetAnimeEpisode(parsedTorrent.Anime, parsedTorrent.Episode)
torrentsByAnimeEp[animeEp] = append(torrentsByAnimeEp[animeEp], parsedTorrent)
}
return torrentsByAnimeEp
}