Browse Source

clean up old local movie artwork

pull/2778/head
Jason Dove 7 months ago
parent
commit
dabd920eab
No known key found for this signature in database
  1. 1
      ErsatzTV.Core/Interfaces/Repositories/IMetadataRepository.cs
  2. 1
      ErsatzTV.Core/Interfaces/Repositories/IOtherVideoRepository.cs
  3. 96
      ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs
  4. 9
      ErsatzTV.Infrastructure/Data/Repositories/MetadataRepository.cs
  5. 9
      ErsatzTV.Infrastructure/Data/Repositories/OtherVideoRepository.cs
  6. 17
      ErsatzTV.Scanner/Core/Metadata/MovieFolderScanner.cs
  7. 4
      ErsatzTV.Scanner/Core/Metadata/OtherVideoFolderScanner.cs

1
ErsatzTV.Core/Interfaces/Repositories/IMetadataRepository.cs

@ -16,6 +16,7 @@ public interface IMetadataRepository
Task<bool> UpdateStatistics(MediaItem mediaItem, MediaVersion incoming, bool updateVersion = true); Task<bool> UpdateStatistics(MediaItem mediaItem, MediaVersion incoming, bool updateVersion = true);
Task<Unit> UpdateArtworkPath(Artwork artwork); Task<Unit> UpdateArtworkPath(Artwork artwork);
Task<Unit> AddArtwork(Domain.Metadata metadata, Artwork artwork); Task<Unit> AddArtwork(Domain.Metadata metadata, Artwork artwork);
Task<bool> RemoveArtworkWithKind(Domain.Metadata metadata, ArtworkKind artworkKind);
Task<bool> CloneArtwork( Task<bool> CloneArtwork(
Domain.Metadata metadata, Domain.Metadata metadata,

1
ErsatzTV.Core/Interfaces/Repositories/IOtherVideoRepository.cs

@ -19,5 +19,4 @@ public interface IOtherVideoRepository
Task<bool> AddActor(OtherVideoMetadata metadata, Actor actor); Task<bool> AddActor(OtherVideoMetadata metadata, Actor actor);
Task<bool> AddDirector(OtherVideoMetadata metadata, Director director); Task<bool> AddDirector(OtherVideoMetadata metadata, Director director);
Task<bool> AddWriter(OtherVideoMetadata metadata, Writer writer); Task<bool> AddWriter(OtherVideoMetadata metadata, Writer writer);
Task<bool> RemoveArtwork(OtherVideoMetadata metadata, ArtworkKind artworkKind);
} }

96
ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs

@ -44,10 +44,11 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat
{ {
MetadataKind = MetadataKind.Fallback, MetadataKind = MetadataKind.Fallback,
Title = fileName ?? showFolder, Title = fileName ?? showFolder,
Genres = new List<Genre>(), Genres = [],
Tags = new List<Tag>(), Tags = [],
Studios = new List<Studio>(), Studios = [],
Actors = new List<Actor>() Actors = [],
Artwork = []
}; };
return GetTelevisionShowMetadata(fileName, metadata); return GetTelevisionShowMetadata(fileName, metadata);
} }
@ -69,18 +70,18 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat
Title = Path.GetFileNameWithoutExtension(path) ?? path, Title = Path.GetFileNameWithoutExtension(path) ?? path,
DateAdded = DateTime.UtcNow, DateAdded = DateTime.UtcNow,
EpisodeNumber = 0, EpisodeNumber = 0,
Actors = new List<Actor>(), Actors = [],
Artwork = new List<Artwork>(), Artwork = [],
Directors = new List<Director>(), Directors = [],
Genres = new List<Genre>(), Genres = [],
Guids = new List<MetadataGuid>(), Guids = [],
Studios = new List<Studio>(), Studios = [],
Tags = new List<Tag>(), Tags = [],
Writers = new List<Writer>() Writers = []
}; };
return fileName != null return fileName != null
? GetEpisodeMetadata(fileName, baseMetadata) ? GetEpisodeMetadata(fileName, baseMetadata)
: new List<EpisodeMetadata> { baseMetadata }; : [baseMetadata];
} }
public MovieMetadata GetFallbackMetadata(Movie movie) public MovieMetadata GetFallbackMetadata(Movie movie)
@ -91,13 +92,14 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat
{ {
MetadataKind = MetadataKind.Fallback, MetadataKind = MetadataKind.Fallback,
Title = Path.GetFileNameWithoutExtension(path) ?? path, Title = Path.GetFileNameWithoutExtension(path) ?? path,
Genres = new List<Genre>(), Artwork = [],
Tags = new List<Tag>(), Genres = [],
Studios = new List<Studio>(), Tags = [],
Actors = new List<Actor>(), Studios = [],
Directors = new List<Director>(), Actors = [],
Writers = new List<Writer>(), Directors = [],
Guids = new List<MetadataGuid>() Writers = [],
Guids = []
}; };
return fileName != null ? GetMovieMetadata(fileName, metadata) : metadata; return fileName != null ? GetMovieMetadata(fileName, metadata) : metadata;
@ -125,13 +127,14 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat
MetadataKind = MetadataKind.Fallback, MetadataKind = MetadataKind.Fallback,
Title = fileName ?? path, Title = fileName ?? path,
OtherVideo = otherVideo, OtherVideo = otherVideo,
Genres = new List<Genre>(), Artwork = [],
Tags = new List<Tag>(), Genres = [],
Studios = new List<Studio>(), Tags = [],
Actors = new List<Actor>(), Studios = [],
Directors = new List<Director>(), Actors = [],
Writers = new List<Writer>(), Directors = [],
Guids = new List<MetadataGuid>() Writers = [],
Guids = []
}; };
return GetOtherVideoMetadata(path, metadata); return GetOtherVideoMetadata(path, metadata);
@ -160,6 +163,7 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat
MetadataKind = MetadataKind.Fallback, MetadataKind = MetadataKind.Fallback,
Title = fileName ?? path, Title = fileName ?? path,
Image = image, Image = image,
Artwork = [],
Genres = [], Genres = [],
Tags = [], Tags = [],
Studios = [], Studios = [],
@ -179,6 +183,7 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat
MetadataKind = MetadataKind.Fallback, MetadataKind = MetadataKind.Fallback,
Title = fileName ?? path, Title = fileName ?? path,
RemoteStream = remoteStream, RemoteStream = remoteStream,
Artwork = [],
Genres = [], Genres = [],
Tags = [], Tags = [],
Studios = [], Studios = [],
@ -232,14 +237,14 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat
DateAdded = baseMetadata.DateAdded, DateAdded = baseMetadata.DateAdded,
DateUpdated = baseMetadata.DateAdded, DateUpdated = baseMetadata.DateAdded,
Title = baseMetadata.Title, Title = baseMetadata.Title,
Actors = new List<Actor>(), Actors = [],
Artwork = new List<Artwork>(), Artwork = [],
Directors = new List<Director>(), Directors = [],
Genres = new List<Genre>(), Genres = [],
Guids = new List<MetadataGuid>(), Guids = [],
Studios = new List<Studio>(), Studios = [],
Tags = new List<Tag>(), Tags = [],
Writers = new List<Writer>() Writers = []
}; };
result.Add(metadata); result.Add(metadata);
@ -290,6 +295,7 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat
? match.Groups[2].Value.Trim() ? match.Groups[2].Value.Trim()
: Path.GetFileNameWithoutExtension(fileName); : Path.GetFileNameWithoutExtension(fileName);
metadata.Artists = []; metadata.Artists = [];
metadata.Artwork = [];
metadata.Genres = []; metadata.Genres = [];
metadata.Tags = []; metadata.Tags = [];
metadata.Studios = []; metadata.Studios = [];
@ -326,11 +332,11 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat
.Map(t => new Tag { Name = t }) .Map(t => new Tag { Name = t })
.ToList(); .ToList();
metadata.Artwork = new List<Artwork>(); metadata.Actors = [];
metadata.Actors = new List<Actor>(); metadata.Artwork = [];
metadata.Genres = new List<Genre>(); metadata.Genres = [];
metadata.Tags = tags; metadata.Tags = tags;
metadata.Studios = new List<Studio>(); metadata.Studios = [];
metadata.DateUpdated = DateTime.UtcNow; metadata.DateUpdated = DateTime.UtcNow;
metadata.OriginalTitle = Path.GetRelativePath(libraryPath, path); metadata.OriginalTitle = Path.GetRelativePath(libraryPath, path);
@ -364,8 +370,8 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat
.Map(t => new Tag { Name = t }) .Map(t => new Tag { Name = t })
.ToList(); .ToList();
metadata.Artwork = [];
metadata.Actors = []; metadata.Actors = [];
metadata.Artwork = [];
metadata.Genres = []; metadata.Genres = [];
metadata.Tags = tags; metadata.Tags = tags;
metadata.Studios = []; metadata.Studios = [];
@ -402,8 +408,8 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat
.Map(t => new Tag { Name = t }) .Map(t => new Tag { Name = t })
.ToList(); .ToList();
metadata.Artwork = [];
metadata.Actors = []; metadata.Actors = [];
metadata.Artwork = [];
metadata.Genres = []; metadata.Genres = [];
metadata.Tags = tags; metadata.Tags = tags;
metadata.Studios = []; metadata.Studios = [];
@ -440,11 +446,11 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat
.Map(t => new Tag { Name = t }) .Map(t => new Tag { Name = t })
.ToList(); .ToList();
metadata.Artwork = new List<Artwork>(); metadata.Actors = [];
metadata.Actors = new List<Actor>(); metadata.Artwork = [];
metadata.Genres = new List<Genre>(); metadata.Genres = [];
metadata.Tags = tags; metadata.Tags = tags;
metadata.Studios = new List<Studio>(); metadata.Studios = [];
metadata.DateUpdated = DateTime.UtcNow; metadata.DateUpdated = DateTime.UtcNow;
metadata.OriginalTitle = Path.GetRelativePath(libraryPath, path); metadata.OriginalTitle = Path.GetRelativePath(libraryPath, path);

9
ErsatzTV.Infrastructure/Data/Repositories/MetadataRepository.cs

@ -309,6 +309,15 @@ public class MetadataRepository(IDbContextFactory<TvContext> dbContextFactory) :
}; };
} }
public async Task<bool> RemoveArtworkWithKind(Core.Domain.Metadata metadata, ArtworkKind artworkKind)
{
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync();
var ids = metadata.Artwork.Where(a => a.ArtworkKind == artworkKind).Select(a => a.Id).ToHashSet();
return await dbContext.Artwork
.Where(a => ids.Contains(a.Id))
.ExecuteDeleteAsync() > 0;
}
public async Task<bool> CloneArtwork( public async Task<bool> CloneArtwork(
Core.Domain.Metadata metadata, Core.Domain.Metadata metadata,
Option<Artwork> maybeArtwork, Option<Artwork> maybeArtwork,

9
ErsatzTV.Infrastructure/Data/Repositories/OtherVideoRepository.cs

@ -175,15 +175,6 @@ public class OtherVideoRepository : IOtherVideoRepository
new { writer.Name, MetadataId = metadata.Id }).Map(result => result > 0); new { writer.Name, MetadataId = metadata.Id }).Map(result => result > 0);
} }
public async Task<bool> RemoveArtwork(OtherVideoMetadata metadata, ArtworkKind artworkKind)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();
var ids = metadata.Artwork.Where(a => a.ArtworkKind == artworkKind).Select(a => a.Id).ToHashSet();
return await dbContext.Artwork
.Where(a => ids.Contains(a.Id))
.ExecuteDeleteAsync() > 0;
}
private async Task<Either<BaseError, MediaItemScanResult<OtherVideo>>> AddOtherVideo( private async Task<Either<BaseError, MediaItemScanResult<OtherVideo>>> AddOtherVideo(
TvContext dbContext, TvContext dbContext,
int libraryPathId, int libraryPathId,

17
ErsatzTV.Scanner/Core/Metadata/MovieFolderScanner.cs

@ -27,6 +27,7 @@ public class MovieFolderScanner : LocalFolderScanner, IMovieFolderScanner
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly ILocalFileSystem _localFileSystem; private readonly ILocalFileSystem _localFileSystem;
private readonly ILocalMetadataProvider _localMetadataProvider; private readonly ILocalMetadataProvider _localMetadataProvider;
private readonly IMetadataRepository _metadataRepository;
private readonly ILocalSubtitlesProvider _localSubtitlesProvider; private readonly ILocalSubtitlesProvider _localSubtitlesProvider;
private readonly ILogger<MovieFolderScanner> _logger; private readonly ILogger<MovieFolderScanner> _logger;
private readonly IMediaItemRepository _mediaItemRepository; private readonly IMediaItemRepository _mediaItemRepository;
@ -67,6 +68,7 @@ public class MovieFolderScanner : LocalFolderScanner, IMovieFolderScanner
_localSubtitlesProvider = localSubtitlesProvider; _localSubtitlesProvider = localSubtitlesProvider;
_localChaptersProvider = localChaptersProvider; _localChaptersProvider = localChaptersProvider;
_localMetadataProvider = localMetadataProvider; _localMetadataProvider = localMetadataProvider;
_metadataRepository = metadataRepository;
_libraryRepository = libraryRepository; _libraryRepository = libraryRepository;
_mediaItemRepository = mediaItemRepository; _mediaItemRepository = mediaItemRepository;
_client = client; _client = client;
@ -312,11 +314,18 @@ public class MovieFolderScanner : LocalFolderScanner, IMovieFolderScanner
try try
{ {
Movie movie = result.Item; Movie movie = result.Item;
Option<string> maybeArtwork = LocateArtwork(movie, artworkKind); foreach (var metadata in movie.MovieMetadata.HeadOrNone())
foreach (string posterFile in maybeArtwork)
{ {
MovieMetadata metadata = movie.MovieMetadata.Head(); Option<string> maybeArtwork = LocateArtwork(movie, artworkKind);
await RefreshArtwork(posterFile, metadata, artworkKind, None, None, cancellationToken); foreach (string posterFile in maybeArtwork)
{
await RefreshArtwork(posterFile, metadata, artworkKind, None, None, cancellationToken);
}
if (maybeArtwork.IsNone && metadata.Artwork.Any(a => a.ArtworkKind == artworkKind))
{
await _metadataRepository.RemoveArtworkWithKind(metadata, artworkKind);
}
} }
return result; return result;

4
ErsatzTV.Scanner/Core/Metadata/OtherVideoFolderScanner.cs

@ -22,6 +22,7 @@ public class OtherVideoFolderScanner : LocalFolderScanner, IOtherVideoFolderScan
private readonly IClient _client; private readonly IClient _client;
private readonly ILibraryRepository _libraryRepository; private readonly ILibraryRepository _libraryRepository;
private readonly ILocalChaptersProvider _localChaptersProvider; private readonly ILocalChaptersProvider _localChaptersProvider;
private readonly IMetadataRepository _metadataRepository;
private readonly IScannerProxy _scannerProxy; private readonly IScannerProxy _scannerProxy;
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly ILocalFileSystem _localFileSystem; private readonly ILocalFileSystem _localFileSystem;
@ -64,6 +65,7 @@ public class OtherVideoFolderScanner : LocalFolderScanner, IOtherVideoFolderScan
_localMetadataProvider = localMetadataProvider; _localMetadataProvider = localMetadataProvider;
_localSubtitlesProvider = localSubtitlesProvider; _localSubtitlesProvider = localSubtitlesProvider;
_localChaptersProvider = localChaptersProvider; _localChaptersProvider = localChaptersProvider;
_metadataRepository = metadataRepository;
_otherVideoRepository = otherVideoRepository; _otherVideoRepository = otherVideoRepository;
_libraryRepository = libraryRepository; _libraryRepository = libraryRepository;
_mediaItemRepository = mediaItemRepository; _mediaItemRepository = mediaItemRepository;
@ -369,7 +371,7 @@ public class OtherVideoFolderScanner : LocalFolderScanner, IOtherVideoFolderScan
if (maybeThumbnail.IsNone && metadata.Artwork.Any(a => a.ArtworkKind is ArtworkKind.Thumbnail)) if (maybeThumbnail.IsNone && metadata.Artwork.Any(a => a.ArtworkKind is ArtworkKind.Thumbnail))
{ {
await _otherVideoRepository.RemoveArtwork(metadata, ArtworkKind.Thumbnail); await _metadataRepository.RemoveArtworkWithKind(metadata, ArtworkKind.Thumbnail);
} }
} }

Loading…
Cancel
Save