Files
silo-server/internal/playback/track_signatures.go
T

54 lines
1.5 KiB
Go

package playback
import (
"strings"
"github.com/Silo-Server/silo-server/internal/models"
"github.com/Silo-Server/silo-server/internal/userstore"
)
// AudioTrackSignatureFromTrack converts a probed audio track into the stable
// signature persisted for series-level sticky audio preferences.
func AudioTrackSignatureFromTrack(track models.AudioTrack) *userstore.AudioTrackSignature {
sig := &userstore.AudioTrackSignature{
Language: strings.TrimSpace(track.Language),
Title: strings.TrimSpace(track.Title),
EmbeddedTitle: strings.TrimSpace(track.EmbeddedTitle),
Codec: strings.TrimSpace(track.Codec),
Layout: strings.TrimSpace(track.Layout),
Channels: track.Channels,
}
if sig.IsZero() {
return nil
}
return sig
}
func findExactAudioTrack(tracks []models.AudioTrack, sig *userstore.AudioTrackSignature) int {
if sig == nil || sig.IsZero() {
return -1
}
for i, track := range tracks {
if audioTrackMatchesSignature(track, sig) {
return i
}
}
return -1
}
func audioTrackMatchesSignature(track models.AudioTrack, sig *userstore.AudioTrackSignature) bool {
if sig == nil || sig.IsZero() {
return false
}
return langMatch(track.Language, sig.Language) &&
trackStringEqual(track.Title, sig.Title) &&
trackStringEqual(track.EmbeddedTitle, sig.EmbeddedTitle) &&
trackStringEqual(track.Codec, sig.Codec) &&
trackStringEqual(track.Layout, sig.Layout) &&
track.Channels == sig.Channels
}
func trackStringEqual(a, b string) bool {
return strings.EqualFold(strings.TrimSpace(a), strings.TrimSpace(b))
}