fix(metadata): refresh items missing tmdb ids

This commit is contained in:
Silo Server Migration
2026-05-24 23:08:05 -04:00
parent 8a8ed6998d
commit dbb33c630d
4 changed files with 52 additions and 0 deletions
+7
View File
@@ -110,6 +110,13 @@ func (l *PGLibraryRefreshItemLister) ListLibraryItems(ctx context.Context, libra
OR COALESCE(mi.logo_path, '') LIKE '%//logo/%'
OR mi.refresh_failures > 0
OR mi.episode_metadata_incomplete = TRUE
OR (
COALESCE(mi.tmdb_id, '') = ''
AND (
COALESCE(mi.tvdb_id, '') <> ''
OR COALESCE(mi.imdb_id, '') <> ''
)
)
OR EXISTS (
SELECT 1
FROM stale_media_ids smi
+16
View File
@@ -10,6 +10,7 @@ import (
const (
RefreshDebtReasonEpisodeIncomplete int64 = 1 << iota
RefreshDebtReasonStaleProviderID
RefreshDebtReasonProviderIDIncomplete
RefreshDebtReasonRefreshFailure
RefreshDebtReasonCoreMetadataIncomplete
)
@@ -43,6 +44,8 @@ func refreshDebtPriority(reasonMask int64) int {
return 300
case hasRefreshDebtReason(reasonMask, RefreshDebtReasonStaleProviderID):
return 250
case hasRefreshDebtReason(reasonMask, RefreshDebtReasonProviderIDIncomplete):
return 240
case hasRefreshDebtReason(reasonMask, RefreshDebtReasonRefreshFailure):
return 200
case hasRefreshDebtReason(reasonMask, RefreshDebtReasonCoreMetadataIncomplete):
@@ -95,12 +98,25 @@ func refreshDebtReasonsForItem(item *models.MediaItem) int64 {
if hasCoreMetadataRefreshDebt(item) {
reasonMask |= RefreshDebtReasonCoreMetadataIncomplete
}
if hasProviderIDRefreshDebt(item) {
reasonMask |= RefreshDebtReasonProviderIDIncomplete
}
if item.RefreshFailures > 0 && strings.EqualFold(strings.TrimSpace(item.Status), "matched") {
reasonMask |= RefreshDebtReasonRefreshFailure
}
return reasonMask
}
func hasProviderIDRefreshDebt(item *models.MediaItem) bool {
if item == nil || !strings.EqualFold(strings.TrimSpace(item.Status), "matched") {
return false
}
if strings.TrimSpace(item.TmdbID) != "" {
return false
}
return strings.TrimSpace(item.TvdbID) != "" || strings.TrimSpace(item.ImdbID) != ""
}
func hasCoreMetadataRefreshDebt(item *models.MediaItem) bool {
if item == nil || !strings.EqualFold(strings.TrimSpace(item.Status), "matched") {
return false
+1
View File
@@ -448,6 +448,7 @@ func (r *RefreshDebtRepository) GetMetrics(ctx context.Context, sampleLimit int)
}{
{reason: "episode_incomplete", mask: RefreshDebtReasonEpisodeIncomplete},
{reason: "stale_provider_id", mask: RefreshDebtReasonStaleProviderID},
{reason: "provider_id_incomplete", mask: RefreshDebtReasonProviderIDIncomplete},
{reason: "refresh_failure", mask: RefreshDebtReasonRefreshFailure},
{reason: "core_metadata_incomplete", mask: RefreshDebtReasonCoreMetadataIncomplete},
}
+28
View File
@@ -39,6 +39,34 @@ func TestRefreshDebtReasonsForItemSkipsUnmatchedFailureOnly(t *testing.T) {
}
}
func TestRefreshDebtReasonsForItemFlagsMissingTMDBWithOtherProviderIDs(t *testing.T) {
item := &models.MediaItem{
Type: "series",
Status: "matched",
TvdbID: "420105",
ImdbID: "tt18076310",
TmdbID: "",
}
mask := refreshDebtReasonsForItem(item)
if !hasRefreshDebtReason(mask, RefreshDebtReasonProviderIDIncomplete) {
t.Fatalf("reason mask = %d, want provider id incomplete", mask)
}
}
func TestRefreshDebtReasonsForItemDoesNotFlagProviderIDIncompleteWithoutAlternateIDs(t *testing.T) {
item := &models.MediaItem{
Type: "series",
Status: "matched",
TmdbID: "",
}
mask := refreshDebtReasonsForItem(item)
if hasRefreshDebtReason(mask, RefreshDebtReasonProviderIDIncomplete) {
t.Fatalf("reason mask = %d, did not want provider id incomplete", mask)
}
}
func TestNextRefreshDelayEpisodeSchedule(t *testing.T) {
reasonMask := RefreshDebtReasonEpisodeIncomplete
cases := []struct {