diff --git a/ErsatzTV.Application/ErsatzTV.Application.csproj b/ErsatzTV.Application/ErsatzTV.Application.csproj
index 3a8644934..b3577cd4c 100644
--- a/ErsatzTV.Application/ErsatzTV.Application.csproj
+++ b/ErsatzTV.Application/ErsatzTV.Application.csproj
@@ -16,7 +16,7 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
diff --git a/ErsatzTV.Core/ErsatzTV.Core.csproj b/ErsatzTV.Core/ErsatzTV.Core.csproj
index 3aebacdfe..df195fdb3 100644
--- a/ErsatzTV.Core/ErsatzTV.Core.csproj
+++ b/ErsatzTV.Core/ErsatzTV.Core.csproj
@@ -22,7 +22,7 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
diff --git a/ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj b/ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj
index c24f15432..2d6cbe5fe 100644
--- a/ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj
+++ b/ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj
@@ -14,7 +14,7 @@
-
+
runtime; build; native; contentfiles; analyzers; buildtransitive
all
diff --git a/ErsatzTV.Infrastructure/Data/Repositories/EmbyMovieRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/EmbyMovieRepository.cs
index 33764b47d..b1c72be6f 100644
--- a/ErsatzTV.Infrastructure/Data/Repositories/EmbyMovieRepository.cs
+++ b/ErsatzTV.Infrastructure/Data/Repositories/EmbyMovieRepository.cs
@@ -185,7 +185,7 @@ public class EmbyMovieRepository : IEmbyMovieRepository
{
try
{
- if (await MediaItemRepository.MediaFileAlreadyExists(movie, dbContext, _logger))
+ if (await MediaItemRepository.MediaFileAlreadyExists(movie, library.Paths.Head().Id, dbContext, _logger))
{
return new MediaFileAlreadyExists();
}
diff --git a/ErsatzTV.Infrastructure/Data/Repositories/EmbyTelevisionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/EmbyTelevisionRepository.cs
index 74132032f..2b79a6d0d 100644
--- a/ErsatzTV.Infrastructure/Data/Repositories/EmbyTelevisionRepository.cs
+++ b/ErsatzTV.Infrastructure/Data/Repositories/EmbyTelevisionRepository.cs
@@ -809,7 +809,7 @@ public class EmbyTelevisionRepository : IEmbyTelevisionRepository
{
try
{
- if (await MediaItemRepository.MediaFileAlreadyExists(episode, dbContext, _logger))
+ if (await MediaItemRepository.MediaFileAlreadyExists(episode, library.Paths.Head().Id, dbContext, _logger))
{
return new MediaFileAlreadyExists();
}
diff --git a/ErsatzTV.Infrastructure/Data/Repositories/JellyfinMovieRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/JellyfinMovieRepository.cs
index c397f5c33..a138caaaa 100644
--- a/ErsatzTV.Infrastructure/Data/Repositories/JellyfinMovieRepository.cs
+++ b/ErsatzTV.Infrastructure/Data/Repositories/JellyfinMovieRepository.cs
@@ -367,7 +367,7 @@ public class JellyfinMovieRepository : IJellyfinMovieRepository
{
try
{
- if (await MediaItemRepository.MediaFileAlreadyExists(movie, dbContext, _logger))
+ if (await MediaItemRepository.MediaFileAlreadyExists(movie, library.Paths.Head().Id, dbContext, _logger))
{
return new MediaFileAlreadyExists();
}
diff --git a/ErsatzTV.Infrastructure/Data/Repositories/JellyfinTelevisionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/JellyfinTelevisionRepository.cs
index 97a10e67b..68c493c26 100644
--- a/ErsatzTV.Infrastructure/Data/Repositories/JellyfinTelevisionRepository.cs
+++ b/ErsatzTV.Infrastructure/Data/Repositories/JellyfinTelevisionRepository.cs
@@ -812,7 +812,7 @@ public class JellyfinTelevisionRepository : IJellyfinTelevisionRepository
{
try
{
- if (await MediaItemRepository.MediaFileAlreadyExists(episode, dbContext, _logger))
+ if (await MediaItemRepository.MediaFileAlreadyExists(episode, library.Paths.Head().Id, dbContext, _logger))
{
return new MediaFileAlreadyExists();
}
diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs
index e95e262e3..b6310d528 100644
--- a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs
+++ b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs
@@ -124,13 +124,13 @@ public class MediaItemRepository : IMediaItemRepository
return Unit.Default;
}
- public static async Task MediaFileAlreadyExists(MediaItem incoming, TvContext dbContext, ILogger logger)
+ public static async Task MediaFileAlreadyExists(MediaItem incoming, int libraryPathId, TvContext dbContext, ILogger logger)
{
string path = incoming.GetHeadVersion().MediaFiles.Head().Path;
- return await MediaFileAlreadyExists(path, dbContext, logger);
+ return await MediaFileAlreadyExists(path, libraryPathId, dbContext, logger);
}
- public static async Task MediaFileAlreadyExists(string path, TvContext dbContext, ILogger logger)
+ public static async Task MediaFileAlreadyExists(string path, int libraryPathId, TvContext dbContext, ILogger logger)
{
Option maybeMediaItemId = await dbContext.Connection
.QuerySingleOrDefaultAsync(
@@ -151,21 +151,40 @@ public class MediaItemRepository : IMediaItemRepository
foreach (MediaItem mediaItem in maybeMediaItem)
{
- string libraryType = mediaItem.LibraryPath.Library switch
- {
- PlexLibrary => "Plex Library",
- EmbyLibrary => "Emby Library",
- JellyfinLibrary => "Jellyfin Library",
- _ => "Local Library"
- };
+ Option maybeIncomingLibrary = await dbContext.Libraries
+ .Filter(l => l.Paths.Any(p => p.Id == libraryPathId))
+ .SingleOrDefaultAsync()
+ .Map(Optional);
- string libraryName = mediaItem.LibraryPath.Library.Name;
- logger.LogWarning(
- "Unable to add media item; {LibraryType} '{LibraryName}' already contains path {Path}",
- libraryType,
- libraryName,
- path);
- return true;
+ foreach (Library incomingLibrary in maybeIncomingLibrary)
+ {
+ string incomingLibraryType = incomingLibrary switch
+ {
+ PlexLibrary => "Plex Library",
+ EmbyLibrary => "Emby Library",
+ JellyfinLibrary => "Jellyfin Library",
+ _ => "Local Library"
+ };
+
+ string existingLibraryType = mediaItem.LibraryPath.Library switch
+ {
+ PlexLibrary => "Plex Library",
+ EmbyLibrary => "Emby Library",
+ JellyfinLibrary => "Jellyfin Library",
+ _ => "Local Library"
+ };
+
+ string libraryName = mediaItem.LibraryPath.Library.Name;
+ logger.LogWarning(
+ "Unable to add media item to {IncomingLibraryType} '{IncomingLibraryName}'; {LibraryType} '{LibraryName}' already contains path {Path}",
+ incomingLibraryType,
+ incomingLibrary.Name,
+ existingLibraryType,
+ libraryName,
+ path);
+
+ return true;
+ }
}
}
diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs
index c12b0cfd1..e60e493f7 100644
--- a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs
+++ b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs
@@ -234,7 +234,7 @@ public class MovieRepository : IMovieRepository
{
try
{
- if (await MediaItemRepository.MediaFileAlreadyExists(path, dbContext, _logger))
+ if (await MediaItemRepository.MediaFileAlreadyExists(path, libraryPathId, dbContext, _logger))
{
return new MediaFileAlreadyExists();
}
diff --git a/ErsatzTV.Infrastructure/Data/Repositories/OtherVideoRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/OtherVideoRepository.cs
index c3838fb7a..c1bcb791c 100644
--- a/ErsatzTV.Infrastructure/Data/Repositories/OtherVideoRepository.cs
+++ b/ErsatzTV.Infrastructure/Data/Repositories/OtherVideoRepository.cs
@@ -1,17 +1,24 @@
using Dapper;
using ErsatzTV.Core;
using ErsatzTV.Core.Domain;
+using ErsatzTV.Core.Errors;
using ErsatzTV.Core.Interfaces.Repositories;
using ErsatzTV.Core.Metadata;
using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Logging;
namespace ErsatzTV.Infrastructure.Data.Repositories;
public class OtherVideoRepository : IOtherVideoRepository
{
private readonly IDbContextFactory _dbContextFactory;
+ private readonly ILogger _logger;
- public OtherVideoRepository(IDbContextFactory dbContextFactory) => _dbContextFactory = dbContextFactory;
+ public OtherVideoRepository(IDbContextFactory dbContextFactory, ILogger logger)
+ {
+ _dbContextFactory = dbContextFactory;
+ _logger = logger;
+ }
public async Task>> GetOrAdd(
LibraryPath libraryPath,
@@ -177,13 +184,18 @@ public class OtherVideoRepository : IOtherVideoRepository
.ToListAsync();
}
- private static async Task>> AddOtherVideo(
+ private async Task>> AddOtherVideo(
TvContext dbContext,
int libraryPathId,
string path)
{
try
{
+ if (await MediaItemRepository.MediaFileAlreadyExists(path, libraryPathId, dbContext, _logger))
+ {
+ return new MediaFileAlreadyExists();
+ }
+
var otherVideo = new OtherVideo
{
LibraryPathId = libraryPathId,
diff --git a/ErsatzTV.Infrastructure/Data/Repositories/PlexMovieRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/PlexMovieRepository.cs
index b06aaef04..7badd336e 100644
--- a/ErsatzTV.Infrastructure/Data/Repositories/PlexMovieRepository.cs
+++ b/ErsatzTV.Infrastructure/Data/Repositories/PlexMovieRepository.cs
@@ -185,7 +185,7 @@ public class PlexMovieRepository : IPlexMovieRepository
{
try
{
- if (await MediaItemRepository.MediaFileAlreadyExists(item, dbContext, _logger))
+ if (await MediaItemRepository.MediaFileAlreadyExists(item, library.Paths.Head().Id, dbContext, _logger))
{
return new MediaFileAlreadyExists();
}
diff --git a/ErsatzTV.Infrastructure/Data/Repositories/PlexTelevisionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/PlexTelevisionRepository.cs
index b1c7809e7..1c6badefe 100644
--- a/ErsatzTV.Infrastructure/Data/Repositories/PlexTelevisionRepository.cs
+++ b/ErsatzTV.Infrastructure/Data/Repositories/PlexTelevisionRepository.cs
@@ -433,7 +433,7 @@ public class PlexTelevisionRepository : IPlexTelevisionRepository
{
try
{
- if (await MediaItemRepository.MediaFileAlreadyExists(item, dbContext, _logger))
+ if (await MediaItemRepository.MediaFileAlreadyExists(item, library.Paths.Head().Id, dbContext, _logger))
{
return new MediaFileAlreadyExists();
}
diff --git a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs
index 5e7fc17f6..80b5568ae 100644
--- a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs
+++ b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs
@@ -686,7 +686,7 @@ public class TelevisionRepository : ITelevisionRepository
{
try
{
- if (await MediaItemRepository.MediaFileAlreadyExists(path, dbContext, _logger))
+ if (await MediaItemRepository.MediaFileAlreadyExists(path, libraryPathId, dbContext, _logger))
{
return new MediaFileAlreadyExists();
}
diff --git a/ErsatzTV.Infrastructure/ErsatzTV.Infrastructure.csproj b/ErsatzTV.Infrastructure/ErsatzTV.Infrastructure.csproj
index 7345f07d3..3e6fdbfb6 100644
--- a/ErsatzTV.Infrastructure/ErsatzTV.Infrastructure.csproj
+++ b/ErsatzTV.Infrastructure/ErsatzTV.Infrastructure.csproj
@@ -11,16 +11,16 @@
-
+
-
-
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/ErsatzTV.Scanner.Tests/ErsatzTV.Scanner.Tests.csproj b/ErsatzTV.Scanner.Tests/ErsatzTV.Scanner.Tests.csproj
index 57e041c99..b92fcc1f3 100644
--- a/ErsatzTV.Scanner.Tests/ErsatzTV.Scanner.Tests.csproj
+++ b/ErsatzTV.Scanner.Tests/ErsatzTV.Scanner.Tests.csproj
@@ -15,7 +15,7 @@
-
+
runtime; build; native; contentfiles; analyzers; buildtransitive
all
diff --git a/ErsatzTV/ErsatzTV.csproj b/ErsatzTV/ErsatzTV.csproj
index 0faaa37f5..9ffaa70d3 100644
--- a/ErsatzTV/ErsatzTV.csproj
+++ b/ErsatzTV/ErsatzTV.csproj
@@ -55,16 +55,16 @@
-
+
-
-
-
-
-
+
+
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
@@ -72,7 +72,7 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+