-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmedia_types.go
147 lines (125 loc) · 3.24 KB
/
media_types.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
package types
import (
"io"
"os"
"github.com/tympanix/supper/media/meta/codec"
"github.com/tympanix/supper/media/meta/misc"
"github.com/tympanix/supper/media/meta/quality"
"github.com/tympanix/supper/media/meta/source"
"golang.org/x/text/language"
)
// Provider interfaces with subtitles websites to provide subtitles
type Provider interface {
SearchSubtitles(LocalMedia) ([]OnlineSubtitle, error)
ResolveSubtitle(Linker) (Downloadable, error)
}
// Scraper interfaces with 3rd party APIs to scrape meta data
type Scraper interface {
Scrape(Media) (Media, error)
}
// Downloadable is an interface for media that can be downloaded from the internet
type Downloadable interface {
Download() (io.ReadCloser, error)
}
// Evaluator determines how well two media types are alike
type Evaluator interface {
Evaluate(Media, Media) float32
}
// Media is an interface for movies and TV shows
type Media interface {
Meta() Metadata
Merge(Media) error
String() string
Identity() string
Similar(Media) bool
TypeMovie() (Movie, bool)
TypeEpisode() (Episode, bool)
TypeSubtitle() (Subtitle, bool)
}
// Metadata is an interface metadata information
type Metadata interface {
Group() string
Codec() codec.Tag
Quality() quality.Tag
Source() source.Tag
Misc() misc.List
AllTags() []string
}
// MediaReadCloser is an interface for media from streams
type MediaReadCloser interface {
os.FileInfo
Media
io.ReadCloser
}
// MediaArchive is an interface for media sourced from archives
type MediaArchive interface {
Next() (MediaReadCloser, error)
io.Closer
}
// Local is an interface for media content which is stored on disk
type Local interface {
os.FileInfo
Pather
}
// Pather is an interface for resources which can be accessed in a local path
type Pather interface {
Path() string
}
// LocalMedia is an interface for media found locally on disk
type LocalMedia interface {
Local
Media
}
// Video is an interface for media which can have subtitles
type Video interface {
LocalMedia
ExistingSubtitles() (SubtitleList, error)
SaveSubtitle(io.Reader, language.Tag) (LocalSubtitle, error)
}
// Movie interface is for movie type media material
type Movie interface {
Metadata
MovieName() string
Year() int
}
// Episode interface is for TV show type material
type Episode interface {
Metadata
TVShow() string
EpisodeName() string
Episode() int
Season() int
}
// Linker is an object which can be fetched from the internet
type Linker interface {
Link() string
}
// Subtitle can be downloaded
type Subtitle interface {
ForMedia() Media
Language() language.Tag
HearingImpaired() bool
}
// LocalSubtitle is an subtitle which is stored on disk
type LocalSubtitle interface {
Local
Subtitle
}
// Rateable is a interface for types which has been rated by some metric
type Rateable interface {
Score() float32
}
// RatedSubtitle is a subtitle which has been rated by how well it matches
// another media type (i.e. how similar it is so another media item). Subtitles
// with a high score has a high probability of being synchronized with the media
type RatedSubtitle interface {
Rateable
Subtitle() Subtitle
}
// OnlineSubtitle is a subtitle obtained from the internet and can be
// downloaded and stored on disk
type OnlineSubtitle interface {
Linker
Downloadable
Subtitle
}