using System.Collections.Generic; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Resolvers; namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio { /// /// Class MusicAlbumResolver /// public class MusicAlbumResolver : ItemResolver { /// /// Gets the priority. /// /// The priority. public override ResolverPriority Priority { get { return ResolverPriority.Third; } // we need to be ahead of the generic folder resolver but behind the movie one } /// /// Resolves the specified args. /// /// The args. /// MusicAlbum. protected override MusicAlbum Resolve(ItemResolveArgs args) { if (!args.IsDirectory) return null; //Avoid mis-identifying top folders if (args.Parent == null) return null; if (args.Parent.IsRoot) return null; return IsMusicAlbum(args) ? new MusicAlbum() : null; } /// /// Determine if the supplied file data points to a music album /// /// The data. /// true if [is music album] [the specified data]; otherwise, false. public static bool IsMusicAlbum(WIN32_FIND_DATA data) { return ContainsMusic(FileSystem.GetFiles(data.Path)); } /// /// Determine if the supplied reslove args should be considered a music album /// /// The args. /// true if [is music album] [the specified args]; otherwise, false. public static bool IsMusicAlbum(ItemResolveArgs args) { // Args points to an album if parent is an Artist folder or it directly contains music if (args.IsDirectory) { //if (args.Parent is MusicArtist) return true; //saves us from testing children twice if (ContainsMusic(args.FileSystemChildren)) return true; } return false; } /// /// Determine if the supplied list contains what we should consider music /// /// The list. /// true if the specified list contains music; otherwise, false. public static bool ContainsMusic(IEnumerable list) { // If list contains at least 2 audio files or at least one and no video files consider it to contain music var foundAudio = 0; var foundVideo = 0; foreach (var file in list) { if (AudioResolver.IsAudioFile(file)) foundAudio++; if (foundAudio >= 2) { return true; } if (EntityResolutionHelper.IsVideoFile(file.Path)) foundVideo++; } // or a single audio file and no video files if (foundAudio > 0 && foundVideo == 0) return true; return false; } } }