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)));
        }
Exemple #3
0
        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));
        }
Exemple #4
0
        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()));
        }
Exemple #5
0
        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);
                    }
                }
            }
        }