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
}
// 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()
}