11 gob.RegisterName("*github.com/Kovensky/go-anidb.Episode", &Episode{})
14 func (e *Episode) Touch() {
18 func (e *Episode) IsStale() bool {
22 return time.Now().Sub(e.Cached) > EpisodeCacheDuration
25 // Unique Episode IDentifier.
28 // Retrieves the Episode corresponding to this EID from the cache.
29 func (eid EID) Episode() *Episode {
31 if cache.Get(&e, "eid", eid) == nil {
37 func cacheEpisode(ep *Episode) {
38 cache.Set(ep.AID, "aid", "by-eid", ep.EID)
39 cache.Set(ep, "eid", ep.EID)
42 // Retrieves an Episode by its EID.
44 // If we know which AID owns this EID, then it's equivalent
45 // to an Anime query. Otherwise, uses both the HTTP and UDP
46 // APIs to retrieve it.
47 func (adb *AniDB) EpisodeByID(eid EID) <-chan *Episode {
48 keys := []cacheKey{"eid", eid}
49 ch := make(chan *Episode, 1)
51 ic := make(chan Cacheable, 1)
52 go func() { ch <- (<-ic).(*Episode); close(ch) }()
53 if intentMap.Intent(ic, keys...) {
57 if !cache.CheckValid(keys...) {
58 intentMap.Notify((*Episode)(nil), keys...)
64 intentMap.Notify(e, keys...)
69 // The UDP API data is worse than the HTTP API anime data,
70 // try and get from the corresponding Anime
73 ok := cache.Get(&aid, "aid", "by-eid", eid) == nil
77 for i := 0; i < 2; i++ {
79 // couldn't get anime and we already ran the EPISODE query
84 // We don't know what the AID is yet.
85 reply := <-adb.udp.SendRecv("EPISODE", paramMap{"eid": eid})
87 if reply.Error() == nil {
88 parts := strings.Split(reply.Lines()[1], "|")
90 if id, err := strconv.ParseInt(parts[1], 10, 32); err == nil {
94 } else if reply.Code() == 340 {
95 cache.MarkInvalid(keys...)
96 cache.Delete(keys...) // deleted EID?
102 a := <-adb.AnimeByID(AID(aid)) // this caches episodes...
103 ep := eid.Episode() // ...so this is now a cache hit
111 // check to see if we looked in the right AID
114 for _, ep := range a.Episodes {
122 // if found, then it's just that the anime is also stale (offline?)
126 // otherwise, the EID<->AID map broke
127 cache.Delete("aid", "by-eid", eid)
131 intentMap.Notify(e, keys...)