From ac3a94f5a1dbb94b374e0160c344fcf99af9b696 Mon Sep 17 00:00:00 2001 From: LukePulverenti Date: Sun, 3 Mar 2013 01:58:04 -0500 Subject: moved resolvers to implementations, trimmed nuget package a bit --- .../Library/Resolvers/Audio/AudioResolver.cs | 80 +++++++++++++++++++ .../Library/Resolvers/Audio/MusicAlbumResolver.cs | 92 ++++++++++++++++++++++ .../Library/Resolvers/Audio/MusicArtistResolver.cs | 39 +++++++++ 3 files changed, 211 insertions(+) create mode 100644 MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs create mode 100644 MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs create mode 100644 MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs (limited to 'MediaBrowser.Server.Implementations/Library/Resolvers/Audio') diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs new file mode 100644 index 0000000000..f8e0acb5a5 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs @@ -0,0 +1,80 @@ +using MediaBrowser.Controller.IO; +using MediaBrowser.Controller.Library; +using System; +using System.IO; +using System.Linq; + +namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio +{ + /// + /// Class AudioResolver + /// + public class AudioResolver : ItemResolver + { + /// + /// Gets the priority. + /// + /// The priority. + public override ResolverPriority Priority + { + get { return ResolverPriority.Last; } + } + + /// + /// Resolves the specified args. + /// + /// The args. + /// Entities.Audio.Audio. + protected override Controller.Entities.Audio.Audio Resolve(ItemResolveArgs args) + { + // Return audio if the path is a file and has a matching extension + + if (!args.IsDirectory) + { + if (IsAudioFile(args)) + { + return new Controller.Entities.Audio.Audio(); + } + } + + return null; + } + + /// + /// The audio file extensions + /// + public static readonly string[] AudioFileExtensions = new[] { + ".mp3", + ".flac", + ".wma", + ".aac", + ".acc", + ".m4a", + ".m4b", + ".wav", + ".ape", + ".ogg", + ".oga" + }; + + /// + /// Determines whether [is audio file] [the specified args]. + /// + /// The args. + /// true if [is audio file] [the specified args]; otherwise, false. + public static bool IsAudioFile(ItemResolveArgs args) + { + return AudioFileExtensions.Contains(Path.GetExtension(args.Path), StringComparer.OrdinalIgnoreCase); + } + + /// + /// Determines whether [is audio file] [the specified file]. + /// + /// The file. + /// true if [is audio file] [the specified file]; otherwise, false. + public static bool IsAudioFile(WIN32_FIND_DATA file) + { + return AudioFileExtensions.Contains(Path.GetExtension(file.Path), StringComparer.OrdinalIgnoreCase); + } + } +} diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs new file mode 100644 index 0000000000..31016e2fc8 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs @@ -0,0 +1,92 @@ +using System.Collections.Generic; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.IO; +using MediaBrowser.Controller.Library; + +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; + } + } +} diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs new file mode 100644 index 0000000000..e48ad96c6a --- /dev/null +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs @@ -0,0 +1,39 @@ +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Library; +using System.Linq; + +namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio +{ + /// + /// Class MusicArtistResolver + /// + public class MusicArtistResolver : 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. + /// MusicArtist. + protected override MusicArtist 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; + + // If we contain an album assume we are an artist folder + return args.FileSystemChildren.Any(MusicAlbumResolver.IsMusicAlbum) ? new MusicArtist() : null; + } + + } +} -- cgit v1.2.3