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