]> git.lizzy.rs Git - go-anidb.git/blob - titlecache.go
anime: Make cached Anime expire earlier if they're Incomplete
[go-anidb.git] / titlecache.go
1 package anidb
2
3 import (
4         "bytes"
5         "github.com/Kovensky/go-anidb/titles"
6         "io"
7         "net/http"
8         "sync"
9         "time"
10 )
11
12 var titlesFileData []byte
13 var titlesFileDataLock sync.Mutex
14 var titlesDB = &titles.TitlesDatabase{}
15
16 // Loads the anime-titles database from the given io.Reader.
17 //
18 // Caches the io.Reader's contents on memory, which gets saved
19 // by DumpCaches.
20 func LoadTitles(src io.Reader) error {
21         buf := bytes.Buffer{}
22         _, err := io.Copy(&buf, src)
23         if err != nil && err != io.EOF {
24                 return err
25         }
26
27         titlesFileDataLock.Lock()
28         defer titlesFileDataLock.Unlock()
29
30         titlesFileData = buf.Bytes()
31
32         titlesDB.LoadDB(bytes.NewReader(titlesFileData))
33
34         return nil
35 }
36
37 // Saves the currently cached anime-titles database to the given io.Writer.
38 func DumpTitles(dst io.Writer) (int64, error) {
39         return io.Copy(dst, bytes.NewReader(titlesFileData))
40 }
41
42 // Returns true if the titles database is up-to-date (newer than 24 hours).
43 func TitlesUpToDate() (ok bool) {
44         return time.Now().Sub(titlesDB.UpdateTime) < 24*time.Hour
45 }
46
47 // Downloads a new anime-titles database if the database is outdated.
48 //
49 // Caches the contents on memory, which gets saved by DumpCaches.
50 func UpdateTitles() error {
51         // too new, no need to update
52         if TitlesUpToDate() {
53                 return nil
54         }
55
56         resp, err := http.Get(titles.DataDumpURL)
57         if err != nil {
58                 return err
59         }
60         defer resp.Body.Close()
61
62         return LoadTitles(resp.Body)
63 }