]> git.lizzy.rs Git - go-anidb.git/blobdiff - animecache.go
anidb: Support FilesByGroup/FilesByGID
[go-anidb.git] / animecache.go
index 3299034051b2ecedf4e10c176919a3f2462bcdd4..64581a0cdbe486f4f9f4515d4f9407ae0eefadd0 100644 (file)
@@ -6,6 +6,7 @@ import (
        "github.com/Kovensky/go-anidb/http"
        "github.com/Kovensky/go-anidb/misc"
        "github.com/Kovensky/go-anidb/udp"
+       "log"
        "sort"
        "strconv"
        "strings"
@@ -71,19 +72,20 @@ func (adb *AniDB) AnimeByID(aid AID) <-chan *Anime {
        }
 
        if !cache.CheckValid(keys...) {
-               intentMap.Notify((*Anime)(nil), keys...)
+               intentMap.NotifyClose((*Anime)(nil), keys...)
                return ch
        }
 
        anime := aid.Anime()
        if !anime.IsStale() {
-               intentMap.Notify(anime, keys...)
+               intentMap.NotifyClose(anime, keys...)
                return ch
        }
 
        go func() {
                httpChan := make(chan httpAnimeResponse, 1)
                go func() {
+                       log.Printf("HTTP>>> Anime %d", aid)
                        a, err := httpapi.GetAnime(int(aid))
                        httpChan <- httpAnimeResponse{anime: a, err: err}
                }()
@@ -106,13 +108,25 @@ func (adb *AniDB) AnimeByID(aid AID) <-chan *Anime {
                for i := 0; i < 2; i++ {
                        select {
                        case <-timeout:
-                               ok = false
+                               // HTTP API timeout
+                               if httpChan != nil {
+                                       log.Printf("HTTP<<< Timeout")
+                                       close(httpChan)
+                               }
                        case resp := <-httpChan:
                                if resp.err != nil {
+                                       log.Printf("HTTP<<< %v", resp.err)
                                        ok = false
                                        break Loop
                                }
-                               if !anime.populateFromHTTP(resp.anime) {
+
+                               if resp.anime.Error != "" {
+                                       log.Printf("HTTP<<< Error %q", resp.anime.Error)
+                               }
+
+                               if anime.populateFromHTTP(resp.anime) {
+                                       log.Printf("HTTP<<< Anime %q", anime.PrimaryTitle)
+                               } else {
                                        // HTTP ok but parsing not ok
                                        if anime.PrimaryTitle == "" {
                                                cache.MarkInvalid(keys...)
@@ -146,9 +160,9 @@ func (adb *AniDB) AnimeByID(aid AID) <-chan *Anime {
                        if ok {
                                cache.Set(anime, keys...)
                        }
-                       intentMap.Notify(anime, keys...)
+                       intentMap.NotifyClose(anime, keys...)
                } else {
-                       intentMap.Notify((*Anime)(nil), keys...)
+                       intentMap.NotifyClose((*Anime)(nil), keys...)
                }
        }()
        return ch