X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=titlecache.go;h=c87dac38671781e54263c88829bda865219446d3;hb=8abb9a3deded3f0929c5f3b86c7b3bc5ff4f37ee;hp=c4ff40450cd178c1eb6382a41a98920769f1900f;hpb=59218ebf4cf9c2353dfa2cb416ee7d2542a3b9b9;p=go-anidb.git diff --git a/titlecache.go b/titlecache.go index c4ff404..c87dac3 100644 --- a/titlecache.go +++ b/titlecache.go @@ -2,62 +2,95 @@ package anidb import ( "bytes" - "github.com/Kovensky/go-anidb/titles" + "github.com/EliasFleckenstein03/go-anidb/titles" "io" "net/http" - "sync" + "os" "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 { +// Loads the database from anime-titles.dat.gz in the cache dir. +func RefreshTitles() error { + if lock, err := Cache.Lock("anime-titles.dat.gz"); err != nil { return err + } else { + defer lock.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 } +// Returns the number of anime in the titles database +func AnimeCount() int { + return len(titlesDB.AnimeMap) +} + // Downloads a new anime-titles database if the database is outdated. // -// Caches the contents on memory, which gets saved by DumpCaches. -func UpdateTitles() error { +// Saves the database as anime-titles.dat.gz in the cache dir. +func (adb *AniDB) UpdateTitles() error { + // needs the AniDB for the Logger + // too new, no need to update if TitlesUpToDate() { return nil } - resp, err := http.Get(titles.DataDumpURL) + 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}} + + adb.Logger.Printf("HTTP>>> %s", titles.DataDumpURL) + + resp, err := c.Get(titles.DataDumpURL) if err != nil { + adb.Logger.Printf("HTTP<<< %s", resp.Status) return err } defer resp.Body.Close() - return LoadTitles(resp.Body) + buf := bytes.Buffer{} + adb.Logger.Printf("HTTP--- %s", resp.Status) + + _, err = io.Copy(&buf, resp.Body) + if err != nil { + adb.Logger.Printf("HTTP--- %v", err) + return err + } + + fh, err := Cache.Create("anime-titles.dat.gz") + if err != nil { + return err + } + + _, err = io.Copy(fh, &buf) + if err != nil { + return err + } + + defer func() { + adb.Logger.Printf("HTTP<<< Titles version %s", titlesDB.UpdateTime) + }() + return RefreshTitles() }