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 }