package anidb
import (
+ "fmt"
"github.com/Kovensky/go-anidb/misc"
"strconv"
"time"
AID AID // The Anime ID.
R18 bool // Whether this anime is considered porn.
- Type AnimeType // Production/distribution type.
- TotalEpisodes int // Total number of regular episodes.
- EpisodeCount EpisodeCount // Known numbers of the various types of episodes.
+ Type AnimeType // Production/distribution type.
+ TotalEpisodes int // Total number of regular episodes.
+ EpisodeCount misc.EpisodeCount // Known numbers of the various types of episodes.
StartDate time.Time // Date of first episode release, if available.
EndDate time.Time // Date of last episode release, if available.
TemporaryVotes Rating // Votes from people who are still watching this.
Reviews Rating // Votes from reviewers.
- Episodes Episodes // List of episodes.
+ Episodes []*Episode // List of episodes.
Awards []string
Resources Resources
- Incomplete bool // Set if the only the UDP API part of the query failed
- Updated time.Time // When the data was last modified in the server
- Cached time.Time // When the data was retrieved from the server
-}
-
-type EpisodeCount struct {
- RegularCount int
- SpecialCount int
- CreditsCount int
- OtherCount int
- TrailerCount int
- ParodyCount int
+ Incomplete bool // Set if the UDP API part of the query failed.
+ Updated time.Time // When the data was last modified in the server.
+ Cached time.Time // When the data was retrieved from the server.
}
// Convenience method that runs AnimeByID on the result of
return adb.AnimeByID(SearchAnimeFold(name))
}
+// Returns a list of all Episodes in this Anime's Episodes list
+// that are contained by the given EpisodeContainer.
+func (a *Anime) EpisodeList(c misc.EpisodeContainer) (eps []*Episode) {
+ if a == nil || c == nil {
+ return nil
+ }
+
+ for i, e := range a.Episodes {
+ if c.ContainsEpisodes(&e.Episode) {
+ eps = append(eps, a.Episodes[i])
+ }
+ }
+ return
+}
+
// Searches for the given Episode in this Anime's Episodes list
// and returns the match.
//
// Returns nil if there is no match.
func (a *Anime) Episode(ep *misc.Episode) *Episode {
- for i, e := range a.Episodes {
- if ep.ContainsEpisodes(&e.Episode) {
- return &a.Episodes[i]
- }
+ switch list := a.EpisodeList(ep); len(list) {
+ case 0:
+ return nil
+ case 1:
+ return list[0]
+ default:
+ panic(fmt.Sprintf("Single episode search returned more than one result (wanted %v, got %v)", ep, list))
}
- return nil
}
// Convenience method that parses the string into an Episode
func (a *Anime) EpisodeByNumber(number int) *Episode {
return a.EpisodeByString(strconv.Itoa(number))
}
+
+func (a *Anime) EpisodeByEID(eid EID) *Episode {
+ if a == nil {
+ return nil
+ }
+ for _, ep := range a.Episodes {
+ if ep.EID == eid {
+ return ep
+ }
+ }
+ return nil
+}