]> git.lizzy.rs Git - go-anidb.git/blob - titlecache.go
anidb: Log UDP traffic
[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         "time"
10 )
11
12 var titlesDB = &titles.TitlesDatabase{}
13
14 // Loads the database from anime-titles.dat.gz in the cache dir.
15 func RefreshTitles() error {
16         if flock := lockFile(cachePath("anime-titles.dat.gz")); flock != nil {
17                 flock.Lock()
18                 defer flock.Unlock()
19         }
20
21         fh, err := cache.Open("anime-titles.dat.gz")
22         if err != nil {
23                 return err
24         }
25         defer fh.Close()
26
27         titlesDB.LoadDB(fh)
28         return nil
29 }
30
31 // Returns true if the titles database is up-to-date (newer than 24 hours).
32 func TitlesUpToDate() (ok bool) {
33         return time.Now().Sub(titlesDB.UpdateTime) < 24*time.Hour
34 }
35
36 // Downloads a new anime-titles database if the database is outdated.
37 //
38 // Saves the database as anime-titles.dat.gz in the cache dir.
39 func UpdateTitles() error {
40         // too new, no need to update
41         if TitlesUpToDate() {
42                 return nil
43         }
44
45         if flock := lockFile(cachePath("anime-titles.dat.gz")); flock != nil {
46                 flock.Lock()
47                 defer flock.Unlock()
48         }
49
50         c := &http.Client{Transport: &http.Transport{DisableCompression: true}}
51
52         log.Printf("HTTP>>> %s", titles.DataDumpURL)
53
54         resp, err := c.Get(titles.DataDumpURL)
55         if err != nil {
56                 log.Printf("HTTP<<< %s", resp.Status)
57                 return err
58         }
59         defer resp.Body.Close()
60
61         buf := bytes.Buffer{}
62         log.Printf("HTTP--- %s", resp.Status)
63
64         _, err = io.Copy(&buf, resp.Body)
65         if err != nil {
66                 log.Printf("HTTP--- %v", err)
67                 return err
68         }
69
70         fh, err := cache.Create("anime-titles.dat.gz")
71         if err != nil {
72                 return err
73         }
74
75         _, err = io.Copy(fh, &buf)
76         if err != nil {
77                 return err
78         }
79
80         defer func() {
81                 log.Printf("HTTP<<< Titles version %s", titlesDB.UpdateTime)
82         }()
83         return RefreshTitles()
84 }