Skip to content

Commit 65ae58e

Browse files
committed
feat: improve score function
1 parent a891539 commit 65ae58e

File tree

1 file changed

+49
-17
lines changed

1 file changed

+49
-17
lines changed

Diff for: score/evaluator.go

+49-17
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,15 @@ const (
1919
)
2020

2121
const (
22-
missingMultiplier = 1.75
23-
missingCodecMultiplier = 1.25
22+
missingMultiplier = 2.25
23+
unavailableMultiplier = 0.18
24+
diffMultiplier = 0.66
2425
)
2526

27+
func diffVal(f float64) float64 {
28+
return math.Sqrt(f)
29+
}
30+
2631
// DefaultEvaluator uses string similarity to rate subtitles against media files
2732
type DefaultEvaluator struct{}
2833

@@ -58,9 +63,7 @@ func (e *DefaultEvaluator) evaluateMovie(media types.Movie, sub types.Movie) flo
5863
score := smetrics.JaroWinkler(media.MovieName(), sub.MovieName(), 0.7, 4)
5964

6065
prob.AddScore(score, 0.5)
61-
6266
e.evaluateMetadata(prob, media, sub)
63-
prob.AddEquals(media.Year(), sub.Year(), groupWeight)
6467

6568
return float32(prob.Score())
6669
}
@@ -76,38 +79,67 @@ func (e *DefaultEvaluator) evaluateEpisode(media types.Episode, sub types.Episod
7679
}
7780

7881
func (e *DefaultEvaluator) evaluateMetadata(p *Weighted, media types.Metadata, sub types.Metadata) {
79-
p.AddEquals(media.Group(), sub.Group(), 1)
82+
if media.Group() != "" {
83+
p.AddEquals(media.Group(), sub.Group(), groupWeight)
84+
} else {
85+
if sub.Group() == "" {
86+
p.AddScore(0.0, unavailableMultiplier*groupWeight)
87+
}
88+
}
8089

90+
if sub.Quality() == quality.None {
91+
p.AddScore(0.0, missingMultiplier*qualityWeight)
92+
}
8193
if media.Quality() != quality.None {
82-
if sub.Quality() == quality.None {
83-
p.AddScore(0.0, missingMultiplier*qualityWeight)
84-
} else if media.Quality() == sub.Quality() {
94+
if media.Quality() == sub.Quality() {
8595
p.AddScore(1.0, qualityWeight)
8696
} else {
8797
diff := math.Abs(float64(media.Quality() - sub.Quality()))
88-
p.AddScore(0.0, diff*qualityWeight)
98+
p.AddScore(0.0, diffVal(diff)*diffMultiplier*qualityWeight)
99+
}
100+
} else {
101+
if sub.Quality() == quality.None {
102+
// unavailable quality, apply penalty
103+
p.AddScore(0.0, unavailableMultiplier*qualityWeight)
104+
} else {
105+
// not comparable, favour 720p
106+
diff := math.Abs(float64(sub.Quality() - quality.HD720p))
107+
p.AddScore(0.0, diffVal(diff)*unavailableMultiplier*diffMultiplier*qualityWeight)
89108
}
90109
}
91110

111+
if sub.Source() == source.None {
112+
p.AddScore(0.0, missingMultiplier*sourceWeight)
113+
}
92114
if media.Source() != source.None {
93-
if sub.Source() == source.None {
94-
p.AddScore(0.0, missingMultiplier*sourceWeight)
95-
} else if media.Source() == sub.Source() {
115+
if media.Source() == sub.Source() {
96116
p.AddScore(1.0, sourceWeight)
97117
} else {
98118
diff := math.Abs(float64(media.Source() - sub.Source()))
99-
p.AddScore(0.0, diff*sourceWeight)
119+
p.AddScore(0.0, diffVal(diff)*diffMultiplier*sourceWeight)
120+
}
121+
} else {
122+
if sub.Source() == source.None {
123+
p.AddScore(0.0, unavailableMultiplier*sourceWeight)
124+
} else {
125+
diff := math.Abs(float64(sub.Source() - source.BluRay))
126+
p.AddScore(0.0, diffVal(diff)*unavailableMultiplier*diffMultiplier*sourceWeight)
100127
}
101128
}
102129

130+
if sub.Codec() == codec.None {
131+
p.AddScore(0.0, missingMultiplier*codecWeight)
132+
}
103133
if media.Codec() != codec.None {
104-
if sub.Codec() == codec.None {
105-
p.AddScore(0.0, missingCodecMultiplier*codecWeight)
106-
} else if media.Codec() == sub.Codec() {
134+
if media.Codec() == sub.Codec() {
107135
p.AddScore(1.0, codecWeight)
108136
} else {
109137
diff := math.Abs(float64(media.Codec() - sub.Codec()))
110-
p.AddScore(0.0, diff*codecWeight)
138+
p.AddScore(0.0, diffVal(diff)*diffMultiplier*codecWeight)
139+
}
140+
} else {
141+
if sub.Codec() == codec.None {
142+
p.AddScore(0.0, unavailableMultiplier*codecWeight)
111143
}
112144
}
113145
}

0 commit comments

Comments
 (0)