]> git.lizzy.rs Git - go-anidb.git/blob - titlecache.go
anidb: Implement MyListAdd / MyListEdit / MyListDel
[go-anidb.git] / titlecache.go
1 package anidb
2
3 import (
4         "bytes"
5         "github.com/Kovensky/go-anidb/titles"
6         "io"
7         "log"
8         "net/http"
9         "os"
10         "time"
11 )
12
13 var titlesDB = &titles.TitlesDatabase{}
14
15 // Loads the database from anime-titles.dat.gz in the cache dir.
16 func RefreshTitles() error {
17         if lock, err := Cache.Lock("anime-titles.dat.gz"); err != nil {
18                 return err
19         } else {
20                 defer lock.Unlock()
21         }
22
23         fh, err := Cache.Open("anime-titles.dat.gz")
24         if err != nil {
25                 return err
26         }
27         defer fh.Close()
28
29         titlesDB.LoadDB(fh)
30         return nil
31 }
32
33 // Returns true if the titles database is up-to-date (newer than 24 hours).
34 func TitlesUpToDate() (ok bool) {
35         return time.Now().Sub(titlesDB.UpdateTime) < 24*time.Hour
36 }
37
38 // Downloads a new anime-titles database if the database is outdated.
39 //
40 // Saves the database as anime-titles.dat.gz in the cache dir.
41 func UpdateTitles() error {
42         // too new, no need to update
43         if TitlesUpToDate() {
44                 return nil
45         }
46
47         switch lock, err := Cache.Lock("anime-titles.dat.gz"); {
48         case os.IsNotExist(err):
49                 // we're creating it now
50         case err == nil:
51                 defer lock.Unlock()
52         default:
53                 return err
54         }
55
56         c := &http.Client{Transport: &http.Transport{DisableCompression: true}}
57
58         log.Printf("HTTP>>> %s", titles.DataDumpURL)
59
60         resp, err := c.Get(titles.DataDumpURL)
61         if err != nil {
62                 log.Printf("HTTP<<< %s", resp.Status)
63                 return err
64         }
65         defer resp.Body.Close()
66
67         buf := bytes.Buffer{}
68         log.Printf("HTTP--- %s", resp.Status)
69
70         _, err = io.Copy(&buf, resp.Body)
71         if err != nil {
72                 log.Printf("HTTP--- %v", err)
73                 return err
74         }
75
76         fh, err := Cache.Create("anime-titles.dat.gz")
77         if err != nil {
78                 return err
79         }
80
81         _, err = io.Copy(fh, &buf)
82         if err != nil {
83                 return err
84         }
85
86         defer func() {
87                 log.Printf("HTTP<<< Titles version %s", titlesDB.UpdateTime)
88         }()
89         return RefreshTitles()
90 }