public override HealthCheck Check() { var rootFolders = _artistService.AllArtistPaths() .Select(s => _rootFolderService.GetBestRootFolderPath(s.Value)) .Distinct(); var missingRootFolders = rootFolders.Where(s => !_diskProvider.FolderExists(s)) .ToList(); missingRootFolders.AddRange(_importListFactory.All() .Select(s => s.RootFolderPath) .Distinct() .Where(s => !_diskProvider.FolderExists(s)) .ToList()); missingRootFolders = missingRootFolders.Distinct().ToList(); if (missingRootFolders.Any()) { if (missingRootFolders.Count == 1) { return(new HealthCheck(GetType(), HealthCheckResult.Error, "Missing root folder: " + missingRootFolders.First(), "#missing_root_folder")); } var message = string.Format("Multiple root folders are missing: {0}", string.Join(" | ", missingRootFolders)); return(new HealthCheck(GetType(), HealthCheckResult.Error, message, "#missing_root_folder")); } return(new HealthCheck(GetType())); }
protected override bool IsValid(PropertyValidatorContext context) { if (context.PropertyValue == null) { return(true); } return(!_artistService.AllArtistPaths().Any(s => context.PropertyValue.ToString().IsParentPath(s.Value))); }
protected override bool IsValid(PropertyValidatorContext context) { if (context.PropertyValue == null) { return(true); } dynamic instance = context.ParentContext.InstanceToValidate; var instanceId = (int)instance.Id; return(!_artistService.AllArtistPaths().Any(s => s.Value.PathEquals(context.PropertyValue.ToString()) && s.Key != instanceId)); }
public override HealthCheck Check() { // Not best for optimization but due to possible symlinks and junctions, we get mounts based on series path so internals can handle mount resolution. var mounts = _artistService.AllArtistPaths() .Select(path => _diskProvider.GetMount(path.Value)) .Where(m => m != null && m.MountOptions != null && m.MountOptions.IsReadOnly) .DistinctBy(m => m.RootDirectory) .ToList(); if (mounts.Any()) { return(new HealthCheck(GetType(), HealthCheckResult.Error, "Mount containing a artist path is mounted read-only: " + string.Join(",", mounts.Select(m => m.Name)), "#artist_mount_ro")); } return(new HealthCheck(GetType())); }
public void Clean() { if (!_configService.CleanupMetadataImages) { return; } var artists = _artistService.AllArtistPaths(); var imageExtensions = new List <string> { ".jpg", ".png", ".gif" }; foreach (var artist in artists) { var images = _metaFileService.GetFilesByArtist(artist.Key) .Where(c => c.LastUpdated > new DateTime(2014, 12, 27) && imageExtensions.Any(x => c.RelativePath.EndsWith(x, StringComparison.InvariantCultureIgnoreCase))); foreach (var image in images) { try { var path = Path.Combine(artist.Value, image.RelativePath); if (!IsValid(path)) { _logger.Debug("Deleting invalid image file " + path); DeleteMetadata(image.Id, path); } } catch (Exception e) { _logger.Error(e, "Couldn't validate image {0}", image.RelativePath); } } } _configService.CleanupMetadataImages = false; }
public void HandleAsync(ArtistsDeletedEvent message) { if (message.DeleteFiles) { var artists = message.Artists; var allArtists = _artistService.AllArtistPaths(); foreach (var artist in artists) { foreach (var s in allArtists) { if (s.Key == artist.Id) { continue; } if (artist.Path.IsParentPath(s.Value)) { _logger.Error("Artist path: '{0}' is a parent of another artist, not deleting files.", artist.Path); return; } if (artist.Path.PathEquals(s.Value)) { _logger.Error("Artist path: '{0}' is the same as another artist, not deleting files.", artist.Path); return; } } if (_diskProvider.FolderExists(artist.Path)) { _recycleBinProvider.DeleteFolder(artist.Path); } } } }