]> git.lizzy.rs Git - go-anidb.git/blobdiff - titlecache.go
misc: Make the iterator part of EpisodeContainer interface
[go-anidb.git] / titlecache.go
index 1100df085bc1eed4c4fa23863821e7529ce8dc7a..a69a5e458ea92fc135b93b770f616ac8e641fd11 100644 (file)
@@ -1,21 +1,26 @@
 package anidb
 
 import (
+       "bytes"
        "github.com/Kovensky/go-anidb/titles"
        "io"
+       "log"
        "net/http"
+       "os"
        "time"
 )
 
 var titlesDB = &titles.TitlesDatabase{}
 
-// Reloads titles from the cache.
+// Loads the database from anime-titles.dat.gz in the cache dir.
 func RefreshTitles() error {
-       flock := lockFile(cachePath("anime-titles.dat.gz"))
-       flock.Lock()
-       defer flock.Unlock()
+       if lock, err := Cache.Lock("anime-titles.dat.gz"); err != nil {
+               return err
+       } else {
+               defer lock.Unlock()
+       }
 
-       fh, err := cache.Open("anime-titles.dat.gz")
+       fh, err := Cache.Open("anime-titles.dat.gz")
        if err != nil {
                return err
        }
@@ -32,34 +37,54 @@ func TitlesUpToDate() (ok bool) {
 
 // Downloads a new anime-titles database if the database is outdated.
 //
-// Caches the contents on memory, which gets saved by DumpCaches.
+// Saves the database as anime-titles.dat.gz in the cache dir.
 func UpdateTitles() error {
        // too new, no need to update
        if TitlesUpToDate() {
                return nil
        }
 
-       flock := lockFile(cachePath("anime-titles.dat.gz"))
-       flock.Lock()
-       defer flock.Unlock()
+       switch lock, err := Cache.Lock("anime-titles.dat.gz"); {
+       case os.IsNotExist(err):
+               // we're creating it now
+       case err == nil:
+               defer lock.Unlock()
+       default:
+               return err
+       }
 
        c := &http.Client{Transport: &http.Transport{DisableCompression: true}}
 
+       log.Printf("HTTP>>> %s", titles.DataDumpURL)
+
        resp, err := c.Get(titles.DataDumpURL)
        if err != nil {
+               log.Printf("HTTP<<< %s", resp.Status)
                return err
        }
        defer resp.Body.Close()
 
-       fh, err := cache.Create("anime-titles.dat.gz")
+       buf := bytes.Buffer{}
+       log.Printf("HTTP--- %s", resp.Status)
+
+       _, err = io.Copy(&buf, resp.Body)
+       if err != nil {
+               log.Printf("HTTP--- %v", err)
+               return err
+       }
+
+       fh, err := Cache.Create("anime-titles.dat.gz")
        if err != nil {
                return err
        }
 
-       _, err = io.Copy(fh, resp.Body)
+       _, err = io.Copy(fh, &buf)
        if err != nil {
                return err
        }
 
+       defer func() {
+               log.Printf("HTTP<<< Titles version %s", titlesDB.UpdateTime)
+       }()
        return RefreshTitles()
 }