]> git.lizzy.rs Git - go-anidb.git/blob - file.go
d80a19224e550b2f9e323ca52348ce39608ed964
[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         EpisodeNumber misc.EpisodeList
45
46         Incomplete bool
47
48         Deprecated bool
49         CRCMatch   bool
50         BadCRC     bool
51         Version    FileVersion
52         Uncensored bool // Meaning unclear, may not be simply !Censored
53         Censored   bool // Meaning unclear, may not be simply !Uncensored
54
55         Filesize int64
56         Ed2kHash string
57         SHA1Hash string
58         CRC32    string
59
60         Length  time.Duration
61         AirDate time.Time
62
63         AudioStreams      []AudioStream
64         SubtitleLanguages []Language
65         VideoInfo         VideoInfo
66         FileExtension     string
67
68         Source FileSource
69
70         // Map of related EIDs to percentages (range 0.0-1.0).
71         // The percentage indicates how much of the EID is covered by this file.
72         RelatedEpisodes RelatedEpisodes
73
74         Cached time.Time
75 }
76
77 func (f *File) Anime() *Anime {
78         return f.AID.Anime()
79 }
80
81 func (f *File) Episode() *Episode {
82         return f.EID.Episode()
83 }
84
85 func (f *File) Group() *Group {
86         return f.GID.Group()
87 }
88
89 func (f *File) MyList() {
90         _ = f.LID[0]
91 }
92
93 type RelatedEpisodes map[EID]float32
94
95 func (er RelatedEpisodes) MarshalJSON() ([]byte, error) {
96         generic := make(map[string]float32, len(er))
97         for k, v := range er {
98                 generic[strconv.Itoa(int(k))] = v
99         }
100         return json.Marshal(generic)
101 }
102
103 func (er RelatedEpisodes) UnmarshalJSON(b []byte) error {
104         var generic map[string]float32
105         if err := json.Unmarshal(b, &generic); err != nil {
106                 return err
107         }
108         for k, v := range generic {
109                 ik, err := strconv.ParseInt(k, 10, 32)
110                 if err != nil {
111                         return err
112                 }
113
114                 er[EID(ik)] = v
115         }
116
117         return nil
118 }
119
120 type LIDMap map[UID]LID
121
122 func (m LIDMap) MarshalJSON() ([]byte, error) {
123         generic := make(map[string]int, len(m))
124         for k, v := range m {
125                 generic[strconv.Itoa(int(k))] = int(v)
126         }
127         return json.Marshal(generic)
128 }
129
130 func (m LIDMap) UnmarshalJSON(b []byte) error {
131         var generic map[string]int
132         if err := json.Unmarshal(b, &generic); err != nil {
133                 return err
134         }
135         for k, v := range generic {
136                 ik, err := strconv.ParseInt(k, 10, 32)
137                 if err != nil {
138                         return err
139                 }
140
141                 m[UID(ik)] = LID(v)
142         }
143
144         return nil
145 }