Lidarr/src/NzbDrone.Core/Housekeeping/Housekeepers/DeleteBadMediaCovers.cs

88 lines
2.9 KiB
C#
Raw Normal View History

2017-10-08 20:07:54 +00:00
using System;
2015-01-02 18:57:51 +00:00
using System.IO;
using System.Linq;
using NLog;
using NzbDrone.Common.Disk;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Extras.Metadata.Files;
2017-10-08 20:07:54 +00:00
using NzbDrone.Core.Music;
2015-01-02 18:57:51 +00:00
namespace NzbDrone.Core.Housekeeping.Housekeepers
{
public class DeleteBadMediaCovers : IHousekeepingTask
{
private readonly IMetadataFileService _metaFileService;
2017-10-08 20:07:54 +00:00
private readonly IArtistService _artistService;
2015-01-02 18:57:51 +00:00
private readonly IDiskProvider _diskProvider;
private readonly IConfigService _configService;
private readonly Logger _logger;
public DeleteBadMediaCovers(IMetadataFileService metaFileService,
2017-10-08 20:07:54 +00:00
IArtistService artistService,
IDiskProvider diskProvider,
IConfigService configService,
Logger logger)
2015-01-02 18:57:51 +00:00
{
_metaFileService = metaFileService;
2017-10-08 20:07:54 +00:00
_artistService = artistService;
2015-01-02 18:57:51 +00:00
_diskProvider = diskProvider;
_configService = configService;
_logger = logger;
}
public void Clean()
{
if (!_configService.CleanupMetadataImages) return;
2017-10-08 20:07:54 +00:00
var artists = _artistService.GetAllArtists();
2015-01-02 18:57:51 +00:00
2017-10-08 20:07:54 +00:00
foreach (var artist in artists)
2015-01-02 18:57:51 +00:00
{
var images = _metaFileService.GetFilesByArtist(artist.Id)
2015-01-02 18:57:51 +00:00
.Where(c => c.LastUpdated > new DateTime(2014, 12, 27) && c.RelativePath.EndsWith(".jpg", StringComparison.InvariantCultureIgnoreCase));
foreach (var image in images)
{
try
{
2017-10-08 20:07:54 +00:00
var path = Path.Combine(artist.Path, image.RelativePath);
2015-01-02 18:57:51 +00:00
if (!IsValid(path))
{
_logger.Debug("Deleting invalid image file " + path);
DeleteMetadata(image.Id, path);
}
}
catch (Exception e)
{
2017-01-05 23:32:17 +00:00
_logger.Error(e, "Couldn't validate image {0}", image.RelativePath);
2015-01-02 18:57:51 +00:00
}
}
}
_configService.CleanupMetadataImages = false;
}
private void DeleteMetadata(int id, string path)
{
_metaFileService.Delete(id);
2015-01-02 18:57:51 +00:00
_diskProvider.DeleteFile(path);
}
private bool IsValid(string path)
{
var buffer = new byte[10];
using (var imageStream = _diskProvider.OpenReadStream(path))
2015-01-02 18:57:51 +00:00
{
if (imageStream.Length < buffer.Length) return false;
imageStream.Read(buffer, 0, buffer.Length);
}
var text = System.Text.Encoding.Default.GetString(buffer);
return !text.ToLowerInvariant().Contains("html");
}
}
2017-10-08 20:07:54 +00:00
}