9 type EpisodeContainer interface {
10 // Returns true if this EpisodeContainer is equivalent or a superset of the given EpisodeContainer
11 ContainsEpisodes(EpisodeContainer) bool
14 type Formatter interface {
15 // Returns a string where the number portion is 0-padded to fit 'width' digits
16 Format(width int) string
22 EpisodeTypeRegular = EpisodeType(1 + iota)
23 EpisodeTypeSpecial // "S" episode
24 EpisodeTypeCredits // "C" episode
25 EpisodeTypeTrailer // "T" episode
26 EpisodeTypeParody // "P" episode
27 EpisodeTypeOther // "O" episode
30 func parseEpisodeType(typ string) EpisodeType {
33 return EpisodeTypeRegular
35 return EpisodeTypeSpecial
37 return EpisodeTypeCredits
39 return EpisodeTypeTrailer
41 return EpisodeTypeParody
43 return EpisodeTypeOther
48 func (et EpisodeType) String() string {
50 case EpisodeTypeRegular:
52 case EpisodeTypeSpecial:
54 case EpisodeTypeCredits:
56 case EpisodeTypeTrailer:
58 case EpisodeTypeParody:
60 case EpisodeTypeOther:
73 // Converts the Episode into AniDB API episode format.
74 func (ep *Episode) String() string {
78 // returns how many digits are needed to represent this episode
79 func (ep *Episode) scale() int {
83 return 1 + int(math.Floor(math.Log10(float64(ep.Number))))
86 // Returns true if ec is an Episode and is identical to this episode,
87 // or if ec is a single episode EpisodeRange / EpisodeList that
88 // contain only this episode.
89 func (ep *Episode) ContainsEpisodes(ec EpisodeContainer) bool {
90 switch e := ec.(type) {
92 return ep != nil && ep.Type == e.Type && ep.Number == e.Number
95 return EpisodeList{&EpisodeRange{Type: ep.Type, Start: ep, End: ep}}.ContainsEpisodes(ep)
101 func (ep *Episode) Format(width int) string {
102 return fmt.Sprintf("%s%0"+strconv.Itoa(width)+"d", ep.Type, ep.Number)
105 // Parses a string in the usual AniDB API episode format and converts into
107 func ParseEpisode(s string) *Episode {
108 if no, err := strconv.ParseInt(s, 10, 32); err == nil {
109 return &Episode{Type: EpisodeTypeRegular, Number: int(no)}
110 } else if len(s) < 1 {
112 } else if no, err = strconv.ParseInt(s[1:], 10, 30); err == nil {
113 return &Episode{Type: parseEpisodeType(s[:1]), Number: int(no)}