fix: refresh stale scan-derived media metadata

This commit is contained in:
ShukeBta
2026-06-25 03:40:50 +08:00
parent 5eb0d4c8af
commit 4e00c4c14d
11 changed files with 248 additions and 41 deletions
+78 -1
View File
@@ -1,6 +1,22 @@
package service
import "strings"
import (
"strings"
"github.com/ShukeBta/MediaStationGo/internal/model"
)
type scanDerivedMetadata struct {
Title string
ScrapeStatus string
Year int
TMDbID int
BangumiID int
DoubanID string
TheTVDBID string
SeasonNum int
EpisodeNum int
}
func cloudMetadataNeedsRefresh(existing existingCloudMedia, localMeta *LocalMetadata) bool {
if localMeta == nil {
@@ -157,6 +173,67 @@ func localMetadataNeedsRefresh(existing existingLocalMedia, local *LocalMetadata
return local.NSFW && !existing.NSFW
}
func cloudDerivedMetadataNeedsRefresh(existing existingCloudMedia, incoming *model.Media) bool {
if incoming == nil {
return false
}
return scanDerivedMetadataNeedsRefresh(scanDerivedMetadata{
Title: existing.Title,
ScrapeStatus: existing.ScrapeStatus,
Year: existing.Year,
TMDbID: existing.TMDbID,
BangumiID: existing.BangumiID,
DoubanID: existing.DoubanID,
TheTVDBID: existing.TheTVDBID,
SeasonNum: existing.SeasonNum,
EpisodeNum: existing.EpisodeNum,
}, incoming)
}
func localDerivedMetadataNeedsRefresh(existing existingLocalMedia, incoming *model.Media) bool {
if incoming == nil {
return false
}
return scanDerivedMetadataNeedsRefresh(scanDerivedMetadata{
Title: existing.Title,
ScrapeStatus: existing.ScrapeStatus,
Year: existing.Year,
TMDbID: existing.TMDbID,
BangumiID: existing.BangumiID,
DoubanID: existing.DoubanID,
TheTVDBID: existing.TheTVDBID,
SeasonNum: existing.SeasonNum,
EpisodeNum: existing.EpisodeNum,
}, incoming)
}
func scanDerivedMetadataNeedsRefresh(existing scanDerivedMetadata, incoming *model.Media) bool {
status := strings.TrimSpace(existing.ScrapeStatus)
enrichable := status == "" || status == "pending" || status == "no_match"
if enrichable && strings.TrimSpace(incoming.Title) != "" && !strings.EqualFold(strings.TrimSpace(existing.Title), strings.TrimSpace(incoming.Title)) {
return true
}
if enrichable && incoming.Year > 0 && existing.Year != incoming.Year {
return true
}
if (incoming.SeasonNum > 0 || incoming.EpisodeNum > 0) && existing.SeasonNum != incoming.SeasonNum {
return true
}
if incoming.EpisodeNum > 0 && existing.EpisodeNum != incoming.EpisodeNum {
return true
}
if incoming.TMDbID > 0 && existing.TMDbID != incoming.TMDbID {
return true
}
if incoming.BangumiID > 0 && existing.BangumiID != incoming.BangumiID {
return true
}
if strings.TrimSpace(incoming.DoubanID) != "" && strings.TrimSpace(existing.DoubanID) != strings.TrimSpace(incoming.DoubanID) {
return true
}
return strings.TrimSpace(incoming.TheTVDBID) != "" && strings.TrimSpace(existing.TheTVDBID) != strings.TrimSpace(incoming.TheTVDBID)
}
func cloudSeriesTitleFromMediaPath(mediaPath string) (string, int) {
displayPath := strings.TrimSpace(mediaPath)
if strings.HasPrefix(strings.ToLower(displayPath), "cloud://") {