using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Resolvers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using System; using System.IO; using System.Linq; namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio { /// /// Class MusicArtistResolver /// public class MusicArtistResolver : ItemResolver { private readonly ILogger _logger; private readonly IFileSystem _fileSystem; private readonly ILibraryManager _libraryManager; public MusicArtistResolver(ILogger logger, IFileSystem fileSystem, ILibraryManager libraryManager) { _logger = logger; _fileSystem = fileSystem; _libraryManager = libraryManager; } /// /// Gets the priority. /// /// The priority. public override ResolverPriority Priority { get { // Behind special folder resolver return ResolverPriority.Second; } } /// /// Resolves the specified args. /// /// The args. /// MusicArtist. protected override MusicArtist Resolve(ItemResolveArgs args) { if (!args.IsDirectory) return null; // Avoid mis-identifying top folders if (args.Parent.IsRoot) return null; // Don't allow nested artists if (args.HasParent() || args.HasParent()) { return null; } var collectionType = args.GetCollectionType(); var isMusicMediaFolder = string.Equals(collectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase); // If there's a collection type and it's not music, it can't be a series if (!isMusicMediaFolder) { return null; } var directoryService = args.DirectoryService; // If we contain an album assume we are an artist folder return args.FileSystemChildren.Where(i => (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory).Any(i => MusicAlbumResolver.IsMusicAlbum(i.FullName, directoryService, _logger, _fileSystem, _libraryManager)) ? new MusicArtist() : null; } } }