Files
MeBox/internal/handler/metadata_enrich_subscription.go
T
2026-06-27 02:58:26 +08:00

101 lines
3.0 KiB
Go

package handler
import (
"context"
"strings"
"go.uber.org/zap"
"github.com/ShukeBta/MediaStationGo/internal/model"
"github.com/ShukeBta/MediaStationGo/internal/service"
)
func enrichSubscriptionArtwork(ctx context.Context, svc *service.Container, sub *model.Subscription) {
if svc == nil || sub == nil {
return
}
// 已有图片且媒体展示字段也齐全时才跳过;否则仍需查一次补 年份/评分/类型 等
// 富通知字段(老订阅只存了 poster/overview 的情况)。
if strings.TrimSpace(sub.PosterURL) != "" && strings.TrimSpace(sub.BackdropURL) != "" &&
sub.Year > 0 && sub.Rating > 0 && strings.TrimSpace(sub.Genres) != "" {
return
}
meta := lookupDisplayMetadata(ctx, svc, sub.Name, sub.Filter, sub.MediaType)
if meta.Title == "" && meta.PosterURL == "" && meta.BackdropURL == "" && meta.Overview == "" {
return
}
if strings.TrimSpace(sub.Source) == "" {
sub.Source = meta.Source
}
if strings.TrimSpace(sub.PosterURL) == "" {
sub.PosterURL = meta.PosterURL
}
if strings.TrimSpace(sub.BackdropURL) == "" {
sub.BackdropURL = meta.BackdropURL
}
if strings.TrimSpace(sub.Overview) == "" {
sub.Overview = meta.Overview
}
if strings.TrimSpace(sub.OriginalName) == "" {
sub.OriginalName = meta.OriginalName
}
if strings.TrimSpace(sub.OriginalLanguage) == "" {
sub.OriginalLanguage = meta.OriginalLanguage
}
if sub.Year <= 0 && meta.Year > 0 {
sub.Year = meta.Year
}
if sub.Rating <= 0 && meta.Rating > 0 {
sub.Rating = meta.Rating
}
if strings.TrimSpace(sub.Genres) == "" {
sub.Genres = meta.Genres
}
}
func enrichAndPersistSubscriptions(ctx context.Context, svc *service.Container, items []model.Subscription) {
for i := range items {
before := items[i]
enrichSubscriptionArtwork(ctx, svc, &items[i])
updates := subscriptionMetadataUpdates(before, items[i])
if len(updates) == 0 {
continue
}
if err := svc.Repo.DB.WithContext(ctx).Model(&model.Subscription{}).Where("id = ?", items[i].ID).Updates(updates).Error; err != nil {
svc.Log.Debug("subscription artwork backfill failed", zap.String("id", items[i].ID), zap.Error(err))
}
}
}
func subscriptionMetadataUpdates(before, after model.Subscription) map[string]any {
updates := map[string]any{}
if before.Source != after.Source {
updates["source"] = after.Source
}
if before.PosterURL != after.PosterURL {
updates["poster_url"] = after.PosterURL
}
if before.BackdropURL != after.BackdropURL {
updates["backdrop_url"] = after.BackdropURL
}
if before.Overview != after.Overview {
updates["overview"] = after.Overview
}
if before.OriginalName != after.OriginalName {
updates["original_name"] = after.OriginalName
}
if before.OriginalLanguage != after.OriginalLanguage {
updates["original_language"] = after.OriginalLanguage
}
if before.Year != after.Year {
updates["year"] = after.Year
}
if before.Rating != after.Rating {
updates["rating"] = after.Rating
}
if before.Genres != after.Genres {
updates["genres"] = after.Genres
}
return updates
}