package anidb
import (
- "bytes"
"github.com/Kovensky/go-anidb/titles"
"io"
"net/http"
- "sync"
"time"
)
-var titlesFileData []byte
-var titlesFileDataLock sync.Mutex
var titlesDB = &titles.TitlesDatabase{}
-// Loads the anime-titles database from the given io.Reader.
-//
-// Caches the io.Reader's contents on memory, which gets saved
-// by DumpCaches.
-func LoadTitles(src io.Reader) error {
- buf := bytes.Buffer{}
- _, err := io.Copy(&buf, src)
- if err != nil && err != io.EOF {
- return err
+// Loads the database from anime-titles.dat.gz in the cache dir.
+func RefreshTitles() error {
+ if flock := lockFile(cachePath("anime-titles.dat.gz")); flock != nil {
+ flock.Lock()
+ defer flock.Unlock()
}
- titlesFileDataLock.Lock()
- defer titlesFileDataLock.Unlock()
-
- titlesFileData = buf.Bytes()
-
- titlesDB.LoadDB(bytes.NewReader(titlesFileData))
+ fh, err := cache.Open("anime-titles.dat.gz")
+ if err != nil {
+ return err
+ }
+ defer fh.Close()
+ titlesDB.LoadDB(fh)
return nil
}
-// Saves the currently cached anime-titles database to the given io.Writer.
-func (adb *AniDB) SaveCurrentTitles(dst io.Writer) (int64, error) {
- return io.Copy(dst, bytes.NewReader(titlesFileData))
-}
-
// Returns true if the titles database is up-to-date (newer than 24 hours).
func TitlesUpToDate() (ok bool) {
return time.Now().Sub(titlesDB.UpdateTime) < 24*time.Hour
// 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
}
- resp, err := http.Get(titles.DataDumpURL)
+ if flock := lockFile(cachePath("anime-titles.dat.gz")); flock != nil {
+ flock.Lock()
+ defer flock.Unlock()
+ }
+
+ c := &http.Client{Transport: &http.Transport{DisableCompression: true}}
+
+ resp, err := c.Get(titles.DataDumpURL)
if err != nil {
return err
}
defer resp.Body.Close()
- return LoadTitles(resp.Body)
+ fh, err := cache.Create("anime-titles.dat.gz")
+ if err != nil {
+ return err
+ }
+
+ _, err = io.Copy(fh, resp.Body)
+ if err != nil {
+ return err
+ }
+
+ return RefreshTitles()
}