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