]> git.lizzy.rs Git - go-anidb.git/blob - titlecache.go
anidb: New caching mechanism
[go-anidb.git] / titlecache.go
1 package anidb
2
3 import (
4         "github.com/Kovensky/go-anidb/titles"
5         "io"
6         "net/http"
7         "time"
8 )
9
10 var titlesDB = &titles.TitlesDatabase{}
11
12 // Reloads titles from the cache.
13 func RefreshTitles() error {
14         flock := lockFile(cachePath("anime-titles.dat.gz"))
15         flock.Lock()
16         defer flock.Unlock()
17
18         fh, err := cache.Open("anime-titles.dat.gz")
19         if err != nil {
20                 return err
21         }
22         defer fh.Close()
23
24         titlesDB.LoadDB(fh)
25         return nil
26 }
27
28 // Returns true if the titles database is up-to-date (newer than 24 hours).
29 func TitlesUpToDate() (ok bool) {
30         return time.Now().Sub(titlesDB.UpdateTime) < 24*time.Hour
31 }
32
33 // Downloads a new anime-titles database if the database is outdated.
34 //
35 // Caches the contents on memory, which gets saved by DumpCaches.
36 func UpdateTitles() error {
37         // too new, no need to update
38         if TitlesUpToDate() {
39                 return nil
40         }
41
42         flock := lockFile(cachePath("anime-titles.dat.gz"))
43         flock.Lock()
44         defer flock.Unlock()
45
46         c := &http.Client{Transport: &http.Transport{DisableCompression: true}}
47
48         resp, err := c.Get(titles.DataDumpURL)
49         if err != nil {
50                 return err
51         }
52         defer resp.Body.Close()
53
54         fh, err := cache.Create("anime-titles.dat.gz")
55         if err != nil {
56                 return err
57         }
58
59         _, err = io.Copy(fh, resp.Body)
60         if err != nil {
61                 return err
62         }
63
64         return RefreshTitles()
65 }