Browse Source

Fixed Scan saving library items

JPVenson 6 months ago
parent
commit
e43e34eab8

+ 29 - 31
Jellyfin.Server.Implementations/Item/BaseItemRepository.cs

@@ -1219,15 +1219,23 @@ public sealed class BaseItemRepository(
     /// <inheritdoc cref="IItemRepository" />
     public void SaveImages(BaseItemDto item)
     {
-        ArgumentNullException.ThrowIfNull(item);
+        try
+        {
+            ArgumentNullException.ThrowIfNull(item);
 
-        var images = item.ImageInfos.Select(e => Map(item.Id, e));
-        using var context = dbProvider.CreateDbContext();
-        using var transaction = context.Database.BeginTransaction();
-        context.BaseItemImageInfos.Where(e => e.ItemId == item.Id).ExecuteDelete();
-        context.BaseItemImageInfos.AddRange(images);
-        context.SaveChanges();
-        transaction.Commit();
+            var images = item.ImageInfos.Select(e => Map(item.Id, e));
+            using var context = dbProvider.CreateDbContext();
+            using var transaction = context.Database.BeginTransaction();
+            context.BaseItemImageInfos.Where(e => e.ItemId == item.Id).ExecuteDelete();
+            context.BaseItemImageInfos.AddRange(images);
+            context.SaveChanges();
+            transaction.Commit();
+        }
+        catch (System.Exception ex)
+        {
+            System.Console.WriteLine(ex);
+            throw;
+        }
     }
 
     /// <inheritdoc cref="IItemRepository" />
@@ -1291,40 +1299,30 @@ public sealed class BaseItemRepository(
 
             var itemValuesToSave = GetItemValuesToSave(item.Item, item.InheritedTags);
             context.ItemValuesMap.Where(e => e.ItemId == entity.Id).ExecuteDelete();
-            entity.ItemValues = new List<ItemValueMap>();
-
             foreach (var itemValue in itemValuesToSave)
             {
                 var refValue = context.ItemValues
                     .Where(f => f.CleanValue == GetCleanValue(itemValue.Value) && (int)f.Type == itemValue.MagicNumber)
                     .Select(e => e.ItemValueId)
                     .FirstOrDefault();
-                if (!refValue.IsEmpty())
+                if (refValue.IsEmpty())
                 {
-                    entity.ItemValues.Add(new ItemValueMap()
+                    context.ItemValues.Add(new ItemValue()
                     {
-                        Item = entity,
-                        ItemId = entity.Id,
-                        ItemValue = null!,
-                        ItemValueId = refValue
+                        CleanValue = GetCleanValue(itemValue.Value),
+                        Type = (ItemValueType)itemValue.MagicNumber,
+                        ItemValueId = refValue = Guid.NewGuid(),
+                        Value = itemValue.Value
                     });
                 }
-                else
+
+                context.ItemValuesMap.Add(new ItemValueMap()
                 {
-                    entity.ItemValues.Add(new ItemValueMap()
-                    {
-                        Item = entity,
-                        ItemId = entity.Id,
-                        ItemValue = new ItemValue()
-                        {
-                            CleanValue = GetCleanValue(itemValue.Value),
-                            Type = (ItemValueType)itemValue.MagicNumber,
-                            ItemValueId = Guid.NewGuid(),
-                            Value = itemValue.Value
-                        },
-                        ItemValueId = Guid.Empty
-                    });
-                }
+                    Item = null!,
+                    ItemId = entity.Id,
+                    ItemValue = null!,
+                    ItemValueId = refValue
+                });
             }
         }
 

+ 1 - 5
Jellyfin.Server.Implementations/Item/PeopleRepository.cs

@@ -61,7 +61,7 @@ public class PeopleRepository(IDbContextFactory<JellyfinDbContext> dbProvider, I
         using var transaction = context.Database.BeginTransaction();
 
         context.PeopleBaseItemMap.Where(e => e.ItemId == itemId).ExecuteDelete();
-        foreach (var item in people)
+        foreach (var item in people.DistinctBy(e => e.Id)) // yes for __SOME__ reason there can be duplicates.
         {
             var personEntity = Map(item);
             var existingEntity = context.Peoples.FirstOrDefault(e => e.Id == personEntity.Id);
@@ -70,10 +70,6 @@ public class PeopleRepository(IDbContextFactory<JellyfinDbContext> dbProvider, I
                 context.Peoples.Add(personEntity);
                 existingEntity = personEntity;
             }
-            else
-            {
-                context.Peoples.Attach(personEntity).State = EntityState.Modified;
-            }
 
             context.PeopleBaseItemMap.Add(new PeopleBaseItemMap()
             {