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

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

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

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

@ -309,6 +309,15 @@ public class MetadataRepository(IDbContextFactory<TvContext> dbContextFactory) : @@ -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(
Core.Domain.Metadata metadata,
Option<Artwork> maybeArtwork,

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

@ -175,15 +175,6 @@ public class OtherVideoRepository : IOtherVideoRepository @@ -175,15 +175,6 @@ public class OtherVideoRepository : IOtherVideoRepository
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(
TvContext dbContext,
int libraryPathId,

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

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

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

@ -22,6 +22,7 @@ public class OtherVideoFolderScanner : LocalFolderScanner, IOtherVideoFolderScan @@ -22,6 +22,7 @@ public class OtherVideoFolderScanner : LocalFolderScanner, IOtherVideoFolderScan
private readonly IClient _client;
private readonly ILibraryRepository _libraryRepository;
private readonly ILocalChaptersProvider _localChaptersProvider;
private readonly IMetadataRepository _metadataRepository;
private readonly IScannerProxy _scannerProxy;
private readonly IFileSystem _fileSystem;
private readonly ILocalFileSystem _localFileSystem;
@ -64,6 +65,7 @@ public class OtherVideoFolderScanner : LocalFolderScanner, IOtherVideoFolderScan @@ -64,6 +65,7 @@ public class OtherVideoFolderScanner : LocalFolderScanner, IOtherVideoFolderScan
_localMetadataProvider = localMetadataProvider;
_localSubtitlesProvider = localSubtitlesProvider;
_localChaptersProvider = localChaptersProvider;
_metadataRepository = metadataRepository;
_otherVideoRepository = otherVideoRepository;
_libraryRepository = libraryRepository;
_mediaItemRepository = mediaItemRepository;
@ -369,7 +371,7 @@ public class OtherVideoFolderScanner : LocalFolderScanner, IOtherVideoFolderScan @@ -369,7 +371,7 @@ public class OtherVideoFolderScanner : LocalFolderScanner, IOtherVideoFolderScan
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