]> git.lizzy.rs Git - go-anidb.git/blob - titlecache.go
anidb: Delete invalid cache data
[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 // Loads the database from anime-titles.dat.gz in the cache dir.
13 func RefreshTitles() error {
14         if flock := lockFile(cachePath("anime-titles.dat.gz")); flock != nil {
15                 flock.Lock()
16                 defer flock.Unlock()
17         }
18
19         fh, err := cache.Open("anime-titles.dat.gz")
20         if err != nil {
21                 return err
22         }
23         defer fh.Close()
24
25         titlesDB.LoadDB(fh)
26         return nil
27 }
28
29 // Returns true if the titles database is up-to-date (newer than 24 hours).
30 func TitlesUpToDate() (ok bool) {
31         return time.Now().Sub(titlesDB.UpdateTime) < 24*time.Hour
32 }
33
34 // Downloads a new anime-titles database if the database is outdated.
35 //
36 // Saves the database as anime-titles.dat.gz in the cache dir.
37 func UpdateTitles() error {
38         // too new, no need to update
39         if TitlesUpToDate() {
40                 return nil
41         }
42
43         if flock := lockFile(cachePath("anime-titles.dat.gz")); flock != nil {
44                 flock.Lock()
45                 defer flock.Unlock()
46         }
47
48         c := &http.Client{Transport: &http.Transport{DisableCompression: true}}
49
50         resp, err := c.Get(titles.DataDumpURL)
51         if err != nil {
52                 return err
53         }
54         defer resp.Body.Close()
55
56         fh, err := cache.Create("anime-titles.dat.gz")
57         if err != nil {
58                 return err
59         }
60
61         _, err = io.Copy(fh, resp.Body)
62         if err != nil {
63                 return err
64         }
65
66         return RefreshTitles()
67 }