diff --git a/internal/services/media_scanner.go b/internal/services/media_scanner.go index d3564b3..39a9fb3 100644 --- a/internal/services/media_scanner.go +++ b/internal/services/media_scanner.go @@ -2847,8 +2847,10 @@ func (s *MediaScanner) updateMediaItem(ctx context.Context, existing database.Me } // Keep user-customized fields, and keep the override set itself intact. + // MergeOverrides guarantees a non-nil slice: a nil []string would encode + // as SQL NULL and violate metadata_overrides' NOT NULL constraint. utils.ApplyMetadataOverrides(¶ms, existing) - params.MetadataOverrides = existing.MetadataOverrides + params.MetadataOverrides = utils.MergeOverrides(existing.MetadataOverrides) _, err = s.db.UpdateMediaItem(ctx, params) return err @@ -2869,7 +2871,10 @@ func (s *MediaScanner) RescanMediaItem(ctx context.Context, mediaItemID pgtype.U if err := s.db.ClearMediaItemMetadataOverrides(ctx, mediaItemID); err != nil { return fmt.Errorf("failed to clear metadata overrides: %w", err) } - item.MetadataOverrides = nil + // Empty - not nil: pgx encodes a nil []string parameter as SQL NULL, + // which would violate the column's NOT NULL constraint when + // updateMediaItem writes the row back. + item.MetadataOverrides = []string{} } folders, err := s.db.GetLibraryFolders(ctx, item.LibraryID)