aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Api/LibraryService.cs128
-rw-r--r--MediaBrowser.Api/UserLibrary/ItemsService.cs7
-rw-r--r--MediaBrowser.Controller/Entities/MusicVideo.cs23
-rw-r--r--MediaBrowser.Model/ApiClient/IApiClient.cs27
-rw-r--r--MediaBrowser.Model/Querying/ThemeSongsResult.cs17
-rw-r--r--Nuget/MediaBrowser.Common.Internal.nuspec4
-rw-r--r--Nuget/MediaBrowser.Common.nuspec2
-rw-r--r--Nuget/MediaBrowser.Server.Core.nuspec4
8 files changed, 170 insertions, 42 deletions
diff --git a/MediaBrowser.Api/LibraryService.cs b/MediaBrowser.Api/LibraryService.cs
index 17a448c3d..7eed64de1 100644
--- a/MediaBrowser.Api/LibraryService.cs
+++ b/MediaBrowser.Api/LibraryService.cs
@@ -52,7 +52,7 @@ namespace MediaBrowser.Api
/// </summary>
[Route("/Items/{Id}/ThemeSongs", "GET")]
[Api(Description = "Gets theme songs for an item")]
- public class GetThemeSongs : IReturn<ThemeSongsResult>
+ public class GetThemeSongs : IReturn<ThemeMediaResult>
{
/// <summary>
/// Gets or sets the user id.
@@ -67,14 +67,17 @@ namespace MediaBrowser.Api
/// <value>The id.</value>
[ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
public string Id { get; set; }
+
+ [ApiMember(Name = "InheritFromParent", Description = "Determines whether or not parent items should be searched for theme media.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+ public bool InheritFromParent { get; set; }
}
/// <summary>
/// Class GetThemeVideos
/// </summary>
[Route("/Items/{Id}/ThemeVideos", "GET")]
- [Api(Description = "Gets video backdrops for an item")]
- public class GetThemeVideos : IReturn<ThemeVideosResult>
+ [Api(Description = "Gets theme videos for an item")]
+ public class GetThemeVideos : IReturn<ThemeMediaResult>
{
/// <summary>
/// Gets or sets the user id.
@@ -89,6 +92,34 @@ namespace MediaBrowser.Api
/// <value>The id.</value>
[ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
public string Id { get; set; }
+
+ [ApiMember(Name = "InheritFromParent", Description = "Determines whether or not parent items should be searched for theme media.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+ public bool InheritFromParent { get; set; }
+ }
+
+ /// <summary>
+ /// Class GetThemeVideos
+ /// </summary>
+ [Route("/Items/{Id}/ThemeMedia", "GET")]
+ [Api(Description = "Gets theme videos and songs for an item")]
+ public class GetThemeMedia : IReturn<ThemeMediaResult>
+ {
+ /// <summary>
+ /// Gets or sets the user id.
+ /// </summary>
+ /// <value>The user id.</value>
+ [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+ public Guid? UserId { get; set; }
+
+ /// <summary>
+ /// Gets or sets the id.
+ /// </summary>
+ /// <value>The id.</value>
+ [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
+ public string Id { get; set; }
+
+ [ApiMember(Name = "InheritFromParent", Description = "Determines whether or not parent items should be searched for theme media.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+ public bool InheritFromParent { get; set; }
}
[Route("/Library/Refresh", "POST")]
@@ -112,7 +143,7 @@ namespace MediaBrowser.Api
[ApiMember(Name = "UserId", Description = "Optional. Get counts from a specific user's library.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public Guid? UserId { get; set; }
}
-
+
/// <summary>
/// Class LibraryService
/// </summary>
@@ -230,7 +261,7 @@ namespace MediaBrowser.Api
{
throw new InvalidOperationException(string.Format("{0} is currently offline.", item.Name));
}
-
+
if (item.LocationType == LocationType.FileSystem)
{
if (Directory.Exists(item.Path))
@@ -303,6 +334,31 @@ namespace MediaBrowser.Api
return result;
}
+ public object Get(GetThemeMedia request)
+ {
+ var themeSongs = GetThemeSongs(new GetThemeSongs
+ {
+ InheritFromParent = request.InheritFromParent,
+ Id = request.Id,
+ UserId = request.UserId
+
+ }).Result;
+
+ var themeVideos = GetThemeVideos(new GetThemeVideos
+ {
+ InheritFromParent = request.InheritFromParent,
+ Id = request.Id,
+ UserId = request.UserId
+
+ }).Result;
+
+ return ToOptimizedResult(new AllThemeMediaResult
+ {
+ ThemeSongsResult = themeSongs,
+ ThemeVideosResult = themeVideos
+ });
+ }
+
/// <summary>
/// Gets the specified request.
/// </summary>
@@ -310,6 +366,13 @@ namespace MediaBrowser.Api
/// <returns>System.Object.</returns>
public object Get(GetThemeSongs request)
{
+ var result = GetThemeSongs(request).Result;
+
+ return ToOptimizedResult(result);
+ }
+
+ private async Task<ThemeMediaResult> GetThemeSongs(GetThemeSongs request)
+ {
var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
var item = string.IsNullOrEmpty(request.Id)
@@ -318,6 +381,11 @@ namespace MediaBrowser.Api
: (Folder)_libraryManager.RootFolder)
: DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager, request.UserId);
+ while (item.ThemeSongIds.Count == 0 && request.InheritFromParent && item.Parent != null)
+ {
+ item = item.Parent;
+ }
+
// Get everything
var fields = Enum.GetNames(typeof(ItemFields))
.Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
@@ -325,20 +393,18 @@ namespace MediaBrowser.Api
var dtoBuilder = new DtoBuilder(Logger, _libraryManager, _userDataRepository, _itemRepo);
- var items = item.ThemeSongIds.Select(_itemRepo.RetrieveItem)
- .OrderBy(i => i.SortName)
- .Select(i => dtoBuilder.GetBaseItemDto(i, fields, user))
- .Select(t => t.Result)
- .ToArray();
+ var tasks = item.ThemeSongIds.Select(_itemRepo.RetrieveItem)
+ .OrderBy(i => i.SortName)
+ .Select(i => dtoBuilder.GetBaseItemDto(i, fields, user));
+
+ var items = await Task.WhenAll(tasks).ConfigureAwait(false);
- var result = new ThemeSongsResult
+ return new ThemeMediaResult
{
Items = items,
TotalRecordCount = items.Length,
OwnerId = DtoBuilder.GetClientItemId(item)
};
-
- return ToOptimizedResult(result);
}
/// <summary>
@@ -348,6 +414,13 @@ namespace MediaBrowser.Api
/// <returns>System.Object.</returns>
public object Get(GetThemeVideos request)
{
+ var result = GetThemeVideos(request).Result;
+
+ return ToOptimizedResult(result);
+ }
+
+ public async Task<ThemeMediaResult> GetThemeVideos(GetThemeVideos request)
+ {
var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
var item = string.IsNullOrEmpty(request.Id)
@@ -356,6 +429,11 @@ namespace MediaBrowser.Api
: (Folder)_libraryManager.RootFolder)
: DtoBuilder.GetItemByClientId(request.Id, _userManager, _libraryManager, request.UserId);
+ while (item.ThemeVideoIds.Count == 0 && request.InheritFromParent && item.Parent != null)
+ {
+ item = item.Parent;
+ }
+
// Get everything
var fields =
Enum.GetNames(typeof(ItemFields))
@@ -364,22 +442,18 @@ namespace MediaBrowser.Api
var dtoBuilder = new DtoBuilder(Logger, _libraryManager, _userDataRepository, _itemRepo);
- var items =
- item.ThemeVideoIds.Select(_itemRepo.RetrieveItem)
- .OrderBy(i => i.SortName)
- .Select(i => dtoBuilder.GetBaseItemDto(i, fields, user))
- .Select(t => t.Result)
- .ToArray();
+ var tasks = item.ThemeVideoIds.Select(_itemRepo.RetrieveItem)
+ .OrderBy(i => i.SortName)
+ .Select(i => dtoBuilder.GetBaseItemDto(i, fields, user));
- var result = new ThemeVideosResult
- {
- Items = items,
- TotalRecordCount = items.Length,
- OwnerId = DtoBuilder.GetClientItemId(item)
- };
+ var items = await Task.WhenAll(tasks).ConfigureAwait(false);
- return ToOptimizedResult(result);
+ return new ThemeMediaResult
+ {
+ Items = items,
+ TotalRecordCount = items.Length,
+ OwnerId = DtoBuilder.GetClientItemId(item)
+ };
}
-
}
}
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index 8497901f6..b52696efa 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -425,6 +425,13 @@ namespace MediaBrowser.Api.UserLibrary
return artists.Any(album.HasArtist);
}
+ var musicVideo = i as MusicVideo;
+
+ if (musicVideo != null)
+ {
+ return artists.Any(musicVideo.HasArtist);
+ }
+
return false;
});
}
diff --git a/MediaBrowser.Controller/Entities/MusicVideo.cs b/MediaBrowser.Controller/Entities/MusicVideo.cs
index 035709bb4..09f99f500 100644
--- a/MediaBrowser.Controller/Entities/MusicVideo.cs
+++ b/MediaBrowser.Controller/Entities/MusicVideo.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Model.Entities;
+using System;
using System.Runtime.Serialization;
namespace MediaBrowser.Controller.Entities
@@ -6,6 +7,18 @@ namespace MediaBrowser.Controller.Entities
public class MusicVideo : Video
{
/// <summary>
+ /// Gets or sets the artist.
+ /// </summary>
+ /// <value>The artist.</value>
+ public string Artist { get; set; }
+
+ /// <summary>
+ /// Gets or sets the album.
+ /// </summary>
+ /// <value>The album.</value>
+ public string Album { get; set; }
+
+ /// <summary>
/// Should be overridden to return the proper folder where metadata lives
/// </summary>
/// <value>The meta location.</value>
@@ -19,6 +32,16 @@ namespace MediaBrowser.Controller.Entities
}
/// <summary>
+ /// Determines whether the specified name has artist.
+ /// </summary>
+ /// <param name="name">The name.</param>
+ /// <returns><c>true</c> if the specified name has artist; otherwise, <c>false</c>.</returns>
+ public bool HasArtist(string name)
+ {
+ return string.Equals(Artist, name, StringComparison.OrdinalIgnoreCase);
+ }
+
+ /// <summary>
/// Gets the user data key.
/// </summary>
/// <returns>System.String.</returns>
diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs
index 839fb0124..9c4a0f364 100644
--- a/MediaBrowser.Model/ApiClient/IApiClient.cs
+++ b/MediaBrowser.Model/ApiClient/IApiClient.cs
@@ -24,6 +24,33 @@ namespace MediaBrowser.Model.ApiClient
event EventHandler<HttpResponseEventArgs> HttpResponseReceived;
/// <summary>
+ /// Gets the theme songs async.
+ /// </summary>
+ /// <param name="userId">The user id.</param>
+ /// <param name="itemId">The item id.</param>
+ /// <param name="inheritFromParents">if set to <c>true</c> [inherit from parents].</param>
+ /// <returns>Task{ThemeMediaResult}.</returns>
+ Task<ThemeMediaResult> GetThemeSongsAsync(string userId, string itemId, bool inheritFromParents);
+
+ /// <summary>
+ /// Gets the theme videos async.
+ /// </summary>
+ /// <param name="userId">The user id.</param>
+ /// <param name="itemId">The item id.</param>
+ /// <param name="inheritFromParents">if set to <c>true</c> [inherit from parents].</param>
+ /// <returns>Task{ThemeMediaResult}.</returns>
+ Task<ThemeMediaResult> GetThemeVideosAsync(string userId, string itemId, bool inheritFromParents);
+
+ /// <summary>
+ /// Gets all theme media async.
+ /// </summary>
+ /// <param name="userId">The user id.</param>
+ /// <param name="itemId">The item id.</param>
+ /// <param name="inheritFromParents">if set to <c>true</c> [inherit from parents].</param>
+ /// <returns>Task{AllThemeMediaResult}.</returns>
+ Task<AllThemeMediaResult> GetAllThemeMediaAsync(string userId, string itemId, bool inheritFromParents);
+
+ /// <summary>
/// Marks the notifications read.
/// </summary>
/// <param name="userId">The user id.</param>
diff --git a/MediaBrowser.Model/Querying/ThemeSongsResult.cs b/MediaBrowser.Model/Querying/ThemeSongsResult.cs
index 919709f0f..f62219c69 100644
--- a/MediaBrowser.Model/Querying/ThemeSongsResult.cs
+++ b/MediaBrowser.Model/Querying/ThemeSongsResult.cs
@@ -1,11 +1,10 @@
-using System;
-
+
namespace MediaBrowser.Model.Querying
{
/// <summary>
- /// Class ThemeSongsResult
+ /// Class ThemeMediaResult
/// </summary>
- public class ThemeSongsResult : ItemsResult
+ public class ThemeMediaResult : ItemsResult
{
/// <summary>
/// Gets or sets the owner id.
@@ -14,12 +13,10 @@ namespace MediaBrowser.Model.Querying
public string OwnerId { get; set; }
}
- public class ThemeVideosResult : ItemsResult
+ public class AllThemeMediaResult
{
- /// <summary>
- /// Gets or sets the owner id.
- /// </summary>
- /// <value>The owner id.</value>
- public string OwnerId { get; set; }
+ public ThemeMediaResult ThemeVideosResult { get; set; }
+
+ public ThemeMediaResult ThemeSongsResult { get; set; }
}
}
diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec
index 4a86d14e2..3c604133d 100644
--- a/Nuget/MediaBrowser.Common.Internal.nuspec
+++ b/Nuget/MediaBrowser.Common.Internal.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common.Internal</id>
- <version>3.0.144</version>
+ <version>3.0.145</version>
<title>MediaBrowser.Common.Internal</title>
<authors>Luke</authors>
<owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
<description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
<copyright>Copyright © Media Browser 2013</copyright>
<dependencies>
- <dependency id="MediaBrowser.Common" version="3.0.144" />
+ <dependency id="MediaBrowser.Common" version="3.0.145" />
<dependency id="NLog" version="2.0.1.2" />
<dependency id="ServiceStack.Text" version="3.9.45" />
<dependency id="SimpleInjector" version="2.2.3" />
diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec
index cb86b71af..06c1804f1 100644
--- a/Nuget/MediaBrowser.Common.nuspec
+++ b/Nuget/MediaBrowser.Common.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common</id>
- <version>3.0.144</version>
+ <version>3.0.145</version>
<title>MediaBrowser.Common</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>
diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec
index 2048aa173..5624cda40 100644
--- a/Nuget/MediaBrowser.Server.Core.nuspec
+++ b/Nuget/MediaBrowser.Server.Core.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MediaBrowser.Server.Core</id>
- <version>3.0.144</version>
+ <version>3.0.145</version>
<title>Media Browser.Server.Core</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
<description>Contains core components required to build plugins for Media Browser Server.</description>
<copyright>Copyright © Media Browser 2013</copyright>
<dependencies>
- <dependency id="MediaBrowser.Common" version="3.0.144" />
+ <dependency id="MediaBrowser.Common" version="3.0.145" />
</dependencies>
</metadata>
<files>