@@ -19,10 +19,15 @@ const (
19
19
)
20
20
21
21
const (
22
- missingMultiplier = 1.75
23
- missingCodecMultiplier = 1.25
22
+ missingMultiplier = 2.25
23
+ unavailableMultiplier = 0.18
24
+ diffMultiplier = 0.66
24
25
)
25
26
27
+ func diffVal (f float64 ) float64 {
28
+ return math .Sqrt (f )
29
+ }
30
+
26
31
// DefaultEvaluator uses string similarity to rate subtitles against media files
27
32
type DefaultEvaluator struct {}
28
33
@@ -58,9 +63,7 @@ func (e *DefaultEvaluator) evaluateMovie(media types.Movie, sub types.Movie) flo
58
63
score := smetrics .JaroWinkler (media .MovieName (), sub .MovieName (), 0.7 , 4 )
59
64
60
65
prob .AddScore (score , 0.5 )
61
-
62
66
e .evaluateMetadata (prob , media , sub )
63
- prob .AddEquals (media .Year (), sub .Year (), groupWeight )
64
67
65
68
return float32 (prob .Score ())
66
69
}
@@ -76,38 +79,67 @@ func (e *DefaultEvaluator) evaluateEpisode(media types.Episode, sub types.Episod
76
79
}
77
80
78
81
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
+ }
80
89
90
+ if sub .Quality () == quality .None {
91
+ p .AddScore (0.0 , missingMultiplier * qualityWeight )
92
+ }
81
93
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 () {
85
95
p .AddScore (1.0 , qualityWeight )
86
96
} else {
87
97
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 )
89
108
}
90
109
}
91
110
111
+ if sub .Source () == source .None {
112
+ p .AddScore (0.0 , missingMultiplier * sourceWeight )
113
+ }
92
114
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 () {
96
116
p .AddScore (1.0 , sourceWeight )
97
117
} else {
98
118
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 )
100
127
}
101
128
}
102
129
130
+ if sub .Codec () == codec .None {
131
+ p .AddScore (0.0 , missingMultiplier * codecWeight )
132
+ }
103
133
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 () {
107
135
p .AddScore (1.0 , codecWeight )
108
136
} else {
109
137
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 )
111
143
}
112
144
}
113
145
}
0 commit comments