2026-06-10 14:58:54 -04:00
|
|
|
package catalog
|
|
|
|
|
|
|
|
|
|
import "github.com/Silo-Server/silo-server/internal/models"
|
|
|
|
|
|
|
|
|
|
// applyItemLocalization merges a localization onto a clone of item. Only
|
|
|
|
|
// non-empty localized fields override the base — localization rows are
|
|
|
|
|
// legitimately partial (an AI translation carries only overview/tagline; a
|
|
|
|
|
// provider row may lack a tagline or logo), and an empty field must fall back
|
|
|
|
|
// to the base value rather than blank it.
|
|
|
|
|
func applyItemLocalization(item *models.MediaItem, loc *models.MediaItemLocalization) *models.MediaItem {
|
|
|
|
|
localized := cloneMediaItem(item)
|
|
|
|
|
if localized == nil || loc == nil {
|
|
|
|
|
return localized
|
|
|
|
|
}
|
|
|
|
|
if loc.Title != "" {
|
|
|
|
|
localized.Title = loc.Title
|
|
|
|
|
}
|
|
|
|
|
if loc.SortTitle != "" {
|
|
|
|
|
localized.SortTitle = loc.SortTitle
|
|
|
|
|
}
|
|
|
|
|
if loc.Overview != "" {
|
|
|
|
|
localized.Overview = loc.Overview
|
|
|
|
|
}
|
|
|
|
|
if loc.Tagline != "" {
|
|
|
|
|
localized.Tagline = loc.Tagline
|
|
|
|
|
}
|
|
|
|
|
if loc.PosterPath != "" {
|
|
|
|
|
localized.PosterPath = loc.PosterPath
|
2026-06-18 10:07:58 -04:00
|
|
|
localized.PosterSourcePath = loc.PosterSourcePath
|
2026-06-10 14:58:54 -04:00
|
|
|
localized.PosterThumbhash = loc.PosterThumbhash
|
|
|
|
|
}
|
|
|
|
|
if loc.BackdropPath != "" {
|
|
|
|
|
localized.BackdropPath = loc.BackdropPath
|
2026-06-18 10:07:58 -04:00
|
|
|
localized.BackdropSourcePath = loc.BackdropSourcePath
|
2026-06-10 14:58:54 -04:00
|
|
|
localized.BackdropThumbhash = loc.BackdropThumbhash
|
|
|
|
|
}
|
|
|
|
|
if loc.LogoPath != "" {
|
|
|
|
|
localized.LogoPath = loc.LogoPath
|
2026-06-18 10:07:58 -04:00
|
|
|
localized.LogoSourcePath = loc.LogoSourcePath
|
2026-06-10 14:58:54 -04:00
|
|
|
}
|
|
|
|
|
return localized
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// applySeasonLocalization merges a localization onto a clone of season; see
|
|
|
|
|
// applyItemLocalization for the empty-field semantics.
|
|
|
|
|
func applySeasonLocalization(season *models.Season, loc *models.SeasonLocalization) *models.Season {
|
|
|
|
|
localized := cloneSeason(season)
|
|
|
|
|
if localized == nil || loc == nil {
|
|
|
|
|
return localized
|
|
|
|
|
}
|
|
|
|
|
if loc.Title != "" {
|
|
|
|
|
localized.Title = loc.Title
|
|
|
|
|
}
|
|
|
|
|
if loc.Overview != "" {
|
|
|
|
|
localized.Overview = loc.Overview
|
|
|
|
|
}
|
|
|
|
|
if loc.PosterPath != "" {
|
|
|
|
|
localized.PosterPath = loc.PosterPath
|
2026-06-18 10:07:58 -04:00
|
|
|
localized.PosterSourcePath = loc.PosterSourcePath
|
2026-06-10 14:58:54 -04:00
|
|
|
localized.PosterThumbhash = loc.PosterThumbhash
|
|
|
|
|
}
|
|
|
|
|
return localized
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// applyEpisodeLocalization merges a localization onto a clone of episode; see
|
|
|
|
|
// applyItemLocalization for the empty-field semantics.
|
|
|
|
|
func applyEpisodeLocalization(episode *models.Episode, loc *models.EpisodeLocalization) *models.Episode {
|
|
|
|
|
localized := cloneEpisode(episode)
|
|
|
|
|
if localized == nil || loc == nil {
|
|
|
|
|
return localized
|
|
|
|
|
}
|
|
|
|
|
if loc.Title != "" {
|
|
|
|
|
localized.Title = loc.Title
|
|
|
|
|
}
|
|
|
|
|
if loc.Overview != "" {
|
|
|
|
|
localized.Overview = loc.Overview
|
|
|
|
|
}
|
|
|
|
|
return localized
|
|
|
|
|
}
|