diff options
10 files changed, 77 insertions, 28 deletions
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 288b67057..c9218c6b5 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -126,6 +126,9 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "NameStartsWithOrGreater", Description = "Optional filter by items whose name is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string NameStartsWithOrGreater { get; set; } + [ApiMember(Name = "AlbumArtistStartsWithOrGreater", Description = "Optional filter by items whose album artist is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public string AlbumArtistStartsWithOrGreater { get; set; } + /// <summary> /// Gets or sets the air days. /// </summary> @@ -576,6 +579,13 @@ namespace MediaBrowser.Api.UserLibrary items = items.Where(i => string.Compare(request.NameStartsWithOrGreater, i.SortName, StringComparison.CurrentCultureIgnoreCase) < 1); } + if (!string.IsNullOrEmpty(request.AlbumArtistStartsWithOrGreater)) + { + items = items.OfType<IHasAlbumArtist>() + .Where(i => string.Compare(request.AlbumArtistStartsWithOrGreater, i.AlbumArtist, StringComparison.CurrentCultureIgnoreCase) < 1) + .Cast<BaseItem>(); + } + // Filter by Series Status if (!string.IsNullOrEmpty(request.SeriesStatus)) { diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs index 7c226864b..ff632c981 100644 --- a/MediaBrowser.Controller/Entities/Audio/Audio.cs +++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs @@ -9,7 +9,7 @@ namespace MediaBrowser.Controller.Entities.Audio /// <summary> /// Class Audio /// </summary> - public class Audio : BaseItem, IHasMediaStreams + public class Audio : BaseItem, IHasMediaStreams, IHasAlbumArtist { public Audio() { diff --git a/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs b/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs new file mode 100644 index 000000000..d9dac077f --- /dev/null +++ b/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs @@ -0,0 +1,8 @@ + +namespace MediaBrowser.Controller.Entities.Audio +{ + public interface IHasAlbumArtist + { + string AlbumArtist { get; } + } +} diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs index 7bfbbaf19..834fc6943 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs @@ -6,7 +6,7 @@ namespace MediaBrowser.Controller.Entities.Audio /// <summary> /// Class MusicAlbum /// </summary> - public class MusicAlbum : Folder + public class MusicAlbum : Folder, IHasAlbumArtist { public string LastFmImageUrl { get; set; } @@ -62,6 +62,17 @@ namespace MediaBrowser.Controller.Entities.Audio { return RecursiveChildren.OfType<Audio>().Any(i => i.HasArtist(artist)); } + + public string AlbumArtist + { + get + { + return RecursiveChildren + .OfType<Audio>() + .Select(i => i.AlbumArtist) + .FirstOrDefault(i => !string.IsNullOrEmpty(i)); + } + } } public class MusicAlbumDisc : Folder diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 2c33cceb1..3546b8b04 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -73,6 +73,7 @@ </Compile> <Compile Include="Dto\IDtoService.cs" /> <Compile Include="Entities\AdultVideo.cs" /> + <Compile Include="Entities\Audio\IHasAlbumArtist.cs" /> <Compile Include="Entities\Book.cs" /> <Compile Include="Configuration\IServerConfigurationManager.cs" /> <Compile Include="Entities\Audio\MusicGenre.cs" /> diff --git a/MediaBrowser.Model/Querying/ItemSortBy.cs b/MediaBrowser.Model/Querying/ItemSortBy.cs index edf94197d..de0bd72e1 100644 --- a/MediaBrowser.Model/Querying/ItemSortBy.cs +++ b/MediaBrowser.Model/Querying/ItemSortBy.cs @@ -46,6 +46,7 @@ namespace MediaBrowser.Model.Querying /// The sort name /// </summary> public const string SortName = "SortName"; + public const string Name = "Name"; /// <summary> /// The random /// </summary> diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 4ad2479e6..46dfd0ba3 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -892,7 +892,6 @@ namespace MediaBrowser.Server.Implementations.Dto if (audio != null) { dto.Album = audio.Album; - dto.AlbumArtist = audio.AlbumArtist; dto.Artists = audio.Artists.ToArray(); var albumParent = audio.FindParent<MusicAlbum>(); @@ -916,14 +915,19 @@ namespace MediaBrowser.Server.Implementations.Dto { var songs = album.RecursiveChildren.OfType<Audio>().ToList(); - dto.AlbumArtist = songs.Select(i => i.AlbumArtist).FirstOrDefault(i => !string.IsNullOrEmpty(i)); - dto.Artists = songs.SelectMany(i => i.Artists) .Distinct(StringComparer.OrdinalIgnoreCase) .ToArray(); } + var hasAlbumArtist = item as IHasAlbumArtist; + + if (hasAlbumArtist != null) + { + dto.AlbumArtist = hasAlbumArtist.AlbumArtist; + } + // Add video info var video = item as Video; if (video != null) diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 7bae2bd85..0f26dcdd1 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -178,6 +178,7 @@ <Compile Include="Sorting\DatePlayedComparer.cs" /> <Compile Include="Sorting\IsFolderComparer.cs" /> <Compile Include="Sorting\IsUnplayedComparer.cs" /> + <Compile Include="Sorting\NameComparer.cs" /> <Compile Include="Sorting\OfficialRatingComparer.cs" /> <Compile Include="Sorting\PlayCountComparer.cs" /> <Compile Include="Sorting\PremiereDateComparer.cs" /> diff --git a/MediaBrowser.Server.Implementations/Sorting/AlbumArtistComparer.cs b/MediaBrowser.Server.Implementations/Sorting/AlbumArtistComparer.cs index 583280f0f..df8003dec 100644 --- a/MediaBrowser.Server.Implementations/Sorting/AlbumArtistComparer.cs +++ b/MediaBrowser.Server.Implementations/Sorting/AlbumArtistComparer.cs @@ -1,5 +1,4 @@ -using System.Linq; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Sorting; using MediaBrowser.Model.Querying; @@ -30,28 +29,9 @@ namespace MediaBrowser.Server.Implementations.Sorting /// <returns>System.String.</returns> private string GetValue(BaseItem x) { - var audio = x as Audio; + var audio = x as IHasAlbumArtist; - if (audio != null) - { - return audio.AlbumArtist; - } - - var album = x as MusicAlbum; - - if (album != null) - { - var song = album.RecursiveChildren - .OfType<Audio>() - .FirstOrDefault(i => !string.IsNullOrEmpty(i.AlbumArtist)); - - if (song != null) - { - return song.AlbumArtist; - } - } - - return null; + return audio != null ? audio.AlbumArtist : null; } /// <summary> diff --git a/MediaBrowser.Server.Implementations/Sorting/NameComparer.cs b/MediaBrowser.Server.Implementations/Sorting/NameComparer.cs new file mode 100644 index 000000000..49f86c485 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Sorting/NameComparer.cs @@ -0,0 +1,33 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Sorting; +using MediaBrowser.Model.Querying; +using System; + +namespace MediaBrowser.Server.Implementations.Sorting +{ + /// <summary> + /// Class NameComparer + /// </summary> + public class NameComparer : IBaseItemComparer + { + /// <summary> + /// Compares the specified x. + /// </summary> + /// <param name="x">The x.</param> + /// <param name="y">The y.</param> + /// <returns>System.Int32.</returns> + public int Compare(BaseItem x, BaseItem y) + { + return string.Compare(x.Name, y.Name, StringComparison.CurrentCultureIgnoreCase); + } + + /// <summary> + /// Gets the name. + /// </summary> + /// <value>The name.</value> + public string Name + { + get { return ItemSortBy.Name; } + } + } +} |
