]> git.lizzy.rs Git - go-anidb.git/blob - file.go
anidb: Allow setting the Logger to use for logging traffic
[go-anidb.git] / file.go
1 package anidb
2
3 import (
4         "encoding/json"
5         "fmt"
6         "github.com/Kovensky/go-anidb/misc"
7         "image"
8         "strconv"
9         "time"
10 )
11
12 type FileVersion int
13
14 func (v FileVersion) String() string {
15         if v == 1 {
16                 return ""
17         }
18         return fmt.Sprintf("v%d", int(v))
19 }
20
21 type FileSource string
22
23 type AudioStream struct {
24         Codec    string
25         Bitrate  int
26         Language Language
27 }
28
29 type VideoInfo struct {
30         Codec      string
31         Bitrate    int
32         Resolution image.Rectangle
33         ColorDepth int
34 }
35
36 type File struct {
37         FID FID
38
39         AID AID
40         EID EID
41         GID GID
42         LID LIDMap
43
44         EpisodeString string
45         EpisodeNumber misc.EpisodeList
46
47         Incomplete bool
48
49         Deprecated bool
50         CRCMatch   bool
51         BadCRC     bool
52         Version    FileVersion
53         Uncensored bool // Meaning unclear, may not be simply !Censored
54         Censored   bool // Meaning unclear, may not be simply !Uncensored
55
56         Filesize int64
57         Ed2kHash string
58         SHA1Hash string
59         CRC32    string
60
61         Length  time.Duration
62         AirDate time.Time
63
64         AudioStreams      []AudioStream
65         SubtitleLanguages []Language
66         VideoInfo         VideoInfo
67         FileExtension     string
68
69         Source FileSource
70
71         // Map of related EIDs to percentages (range 0.0-1.0).
72         // The percentage indicates how much of the EID is covered by this file.
73         RelatedEpisodes RelatedEpisodes
74
75         Cached time.Time
76 }
77
78 func (f *File) Anime() *Anime {
79         return f.AID.Anime()
80 }
81
82 func (f *File) Episode() *Episode {
83         return f.EID.Episode()
84 }
85
86 func (f *File) Group() *Group {
87         return f.GID.Group()
88 }
89
90 func (f *File) MyList() {
91         _ = f.LID[0]
92 }
93
94 type RelatedEpisodes map[EID]float32
95
96 func (er RelatedEpisodes) MarshalJSON() ([]byte, error) {
97         generic := make(map[string]float32, len(er))
98         for k, v := range er {
99                 generic[strconv.Itoa(int(k))] = v
100         }
101         return json.Marshal(generic)
102 }
103
104 func (er RelatedEpisodes) UnmarshalJSON(b []byte) error {
105         var generic map[string]float32
106         if err := json.Unmarshal(b, &generic); err != nil {
107                 return err
108         }
109         for k, v := range generic {
110                 ik, err := strconv.ParseInt(k, 10, 32)
111                 if err != nil {
112                         return err
113                 }
114
115                 er[EID(ik)] = v
116         }
117
118         return nil
119 }
120
121 type LIDMap map[UID]LID
122
123 func (m LIDMap) MarshalJSON() ([]byte, error) {
124         generic := make(map[string]int, len(m))
125         for k, v := range m {
126                 generic[strconv.Itoa(int(k))] = int(v)
127         }
128         return json.Marshal(generic)
129 }
130
131 func (m LIDMap) UnmarshalJSON(b []byte) error {
132         var generic map[string]int
133         if err := json.Unmarshal(b, &generic); err != nil {
134                 return err
135         }
136         for k, v := range generic {
137                 ik, err := strconv.ParseInt(k, 10, 32)
138                 if err != nil {
139                         return err
140                 }
141
142                 m[UID(ik)] = LID(v)
143         }
144
145         return nil
146 }