added movie and tv genre pages

pull/702/head
Luke Pulverenti 12 years ago
parent 8f643ad771
commit e3f7dcac19

@ -62,7 +62,12 @@ namespace MediaBrowser.Api.UserLibrary
items = new[] { item }; items = new[] { item };
} }
items = FilterItems(request, items, user);
items = ItemsService.ApplySortOrder(request, items, user, LibraryManager);
var ibnItemsArray = GetAllItems(request, items, user).ToArray(); var ibnItemsArray = GetAllItems(request, items, user).ToArray();
IEnumerable<Tuple<string, Func<int>>> ibnItems = ibnItemsArray; IEnumerable<Tuple<string, Func<int>>> ibnItems = ibnItemsArray;
var result = new ItemsResult var result = new ItemsResult
@ -84,7 +89,7 @@ namespace MediaBrowser.Api.UserLibrary
} }
var fields = GetItemFields(request).ToList(); var fields = request.GetItemFields().ToList();
var tasks = ibnItems.Select(i => GetDto(i, user, fields)); var tasks = ibnItems.Select(i => GetDto(i, user, fields));
@ -96,20 +101,28 @@ namespace MediaBrowser.Api.UserLibrary
} }
/// <summary> /// <summary>
/// Gets the item fields. /// Filters the items.
/// </summary> /// </summary>
/// <param name="request">The request.</param> /// <param name="request">The request.</param>
/// <returns>IEnumerable{ItemFields}.</returns> /// <param name="items">The items.</param>
private IEnumerable<ItemFields> GetItemFields(GetItemsByName request) /// <param name="user">The user.</param>
/// <returns>IEnumerable{BaseItem}.</returns>
private IEnumerable<BaseItem> FilterItems(GetItemsByName request, IEnumerable<BaseItem> items, User user)
{ {
var val = request.Fields; items = items.AsParallel();
if (string.IsNullOrEmpty(val)) items = ItemsService.ApplyAdditionalFilters(request, items);
// Apply filters
// Run them starting with the ones that are likely to reduce the list the most
foreach (var filter in request.GetFilters().OrderByDescending(f => (int)f))
{ {
return new ItemFields[] { }; items = ItemsService.ApplyFilter(items, filter, user, UserManager);
} }
return val.Split(',').Select(v => (ItemFields)Enum.Parse(typeof(ItemFields), v, true)); items = items.AsEnumerable();
return items;
} }
/// <summary> /// <summary>

@ -1,4 +1,7 @@
using MediaBrowser.Model.Entities; using System.Collections.Generic;
using System.Linq;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
using ServiceStack.ServiceHost; using ServiceStack.ServiceHost;
using System; using System;
@ -13,6 +16,13 @@ namespace MediaBrowser.Api.UserLibrary
[ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
public Guid UserId { get; set; } public Guid UserId { get; set; }
/// <summary>
/// What to sort the results by
/// </summary>
/// <value>The sort by.</value>
[ApiMember(Name = "SortBy", Description = "Optional. Specify one or more sort orders, comma delimeted. Options: Album, AlbumArtist, Artist, CommunityRating, DateCreated, DatePlayed, PlayCount, PremiereDate, ProductionYear, SortName, Random, Runtime", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string SortBy { get; set; }
/// <summary> /// <summary>
/// Skips over a given number of items within the results. Use for paging. /// Skips over a given number of items within the results. Use for paging.
/// </summary> /// </summary>
@ -54,5 +64,74 @@ namespace MediaBrowser.Api.UserLibrary
/// <value>The fields.</value> /// <value>The fields.</value>
[ApiMember(Name = "Fields", Description = "Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: AudioInfo, Chapters, DateCreated, DisplayMediaType, DisplayPreferences, Genres, ItemCounts, IndexOptions, MediaStreams, Overview, OverviewHtml, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, SeriesInfo, SortName, Studios, Taglines, TrailerUrls, UserData", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] [ApiMember(Name = "Fields", Description = "Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: AudioInfo, Chapters, DateCreated, DisplayMediaType, DisplayPreferences, Genres, ItemCounts, IndexOptions, MediaStreams, Overview, OverviewHtml, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, SeriesInfo, SortName, Studios, Taglines, TrailerUrls, UserData", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string Fields { get; set; } public string Fields { get; set; }
/// <summary>
/// Gets or sets the exclude item types.
/// </summary>
/// <value>The exclude item types.</value>
[ApiMember(Name = "ExcludeItemTypes", Description = "Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string ExcludeItemTypes { get; set; }
/// <summary>
/// Gets or sets the include item types.
/// </summary>
/// <value>The include item types.</value>
[ApiMember(Name = "IncludeItemTypes", Description = "Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string IncludeItemTypes { get; set; }
/// <summary>
/// Filters to apply to the results
/// </summary>
/// <value>The filters.</value>
[ApiMember(Name = "Filters", Description = "Optional. Specify additional filters to apply. This allows multiple, comma delimeted. Options: IsFolder, IsNotFolder, IsUnplayed, IsPlayed, IsFavorite, IsRecentlyAdded, IsResumable, Likes, Dislikes", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string Filters { get; set; }
/// <summary>
/// Gets the filters.
/// </summary>
/// <returns>IEnumerable{ItemFilter}.</returns>
public IEnumerable<ItemFilter> GetFilters()
{
var val = Filters;
if (string.IsNullOrEmpty(val))
{
return new ItemFilter[] { };
}
return val.Split(',').Select(v => (ItemFilter)Enum.Parse(typeof(ItemFilter), v, true));
}
/// <summary>
/// Gets the item fields.
/// </summary>
/// <returns>IEnumerable{ItemFields}.</returns>
public IEnumerable<ItemFields> GetItemFields()
{
var val = Fields;
if (string.IsNullOrEmpty(val))
{
return new ItemFields[] { };
}
return val.Split(',').Select(v => (ItemFields)Enum.Parse(typeof(ItemFields), v, true));
}
/// <summary>
/// Gets the order by.
/// </summary>
/// <returns>IEnumerable{ItemSortBy}.</returns>
public IEnumerable<string> GetOrderBy()
{
var val = SortBy;
if (string.IsNullOrEmpty(val))
{
return new string[] { };
}
return val.Split(',');
}
} }
} }

@ -45,20 +45,6 @@ namespace MediaBrowser.Api.UserLibrary
/// <value>The index by.</value> /// <value>The index by.</value>
public string IndexBy { get; set; } public string IndexBy { get; set; }
/// <summary>
/// What to sort the results by
/// </summary>
/// <value>The sort by.</value>
[ApiMember(Name = "SortBy", Description = "Optional. Specify one or more sort orders, comma delimeted. Options: Album, AlbumArtist, Artist, CommunityRating, DateCreated, DatePlayed, PlayCount, PremiereDate, ProductionYear, SortName, Random, Runtime", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string SortBy { get; set; }
/// <summary>
/// Filters to apply to the results
/// </summary>
/// <value>The filters.</value>
[ApiMember(Name = "Filters", Description = "Optional. Specify additional filters to apply. This allows multiple, comma delimeted. Options: IsFolder, IsNotFolder, IsUnplayed, IsPlayed, IsFavorite, IsRecentlyAdded, IsResumable, Likes, Dislikes", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string Filters { get; set; }
/// <summary> /// <summary>
/// Limit results to items containing specific genres /// Limit results to items containing specific genres
/// </summary> /// </summary>
@ -73,20 +59,6 @@ namespace MediaBrowser.Api.UserLibrary
[ApiMember(Name = "Studios", Description = "Optional. If specified, results will be filtered based on studio. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] [ApiMember(Name = "Studios", Description = "Optional. If specified, results will be filtered based on studio. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string Studios { get; set; } public string Studios { get; set; }
/// <summary>
/// Gets or sets the exclude item types.
/// </summary>
/// <value>The exclude item types.</value>
[ApiMember(Name = "ExcludeItemTypes", Description = "Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string ExcludeItemTypes { get; set; }
/// <summary>
/// Gets or sets the include item types.
/// </summary>
/// <value>The include item types.</value>
[ApiMember(Name = "IncludeItemTypes", Description = "Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string IncludeItemTypes { get; set; }
/// <summary> /// <summary>
/// Limit results to items containing specific years /// Limit results to items containing specific years
/// </summary> /// </summary>
@ -202,22 +174,22 @@ namespace MediaBrowser.Api.UserLibrary
// Apply filters // Apply filters
// Run them starting with the ones that are likely to reduce the list the most // Run them starting with the ones that are likely to reduce the list the most
foreach (var filter in GetFilters(request).OrderByDescending(f => (int)f)) foreach (var filter in request.GetFilters().OrderByDescending(f => (int)f))
{ {
items = ApplyFilter(items, filter, user); items = ApplyFilter(items, filter, user, _userManager);
} }
items = items.AsEnumerable(); items = items.AsEnumerable();
items = ApplySearchTerm(request, items); items = ApplySearchTerm(request, items);
items = ApplySortOrder(request, items, user); items = ApplySortOrder(request, items, user, _libraryManager);
var itemsArray = items.ToArray(); var itemsArray = items.ToArray();
var pagedItems = ApplyPaging(request, itemsArray); var pagedItems = ApplyPaging(request, itemsArray);
var fields = GetItemFields(request).ToList(); var fields = request.GetItemFields().ToList();
var dtoBuilder = new DtoBuilder(Logger, _libraryManager, _userManager); var dtoBuilder = new DtoBuilder(Logger, _libraryManager, _userManager);
@ -264,12 +236,13 @@ namespace MediaBrowser.Api.UserLibrary
/// <param name="request">The request.</param> /// <param name="request">The request.</param>
/// <param name="items">The items.</param> /// <param name="items">The items.</param>
/// <param name="user">The user.</param> /// <param name="user">The user.</param>
/// <param name="libraryManager">The library manager.</param>
/// <returns>IEnumerable{BaseItem}.</returns> /// <returns>IEnumerable{BaseItem}.</returns>
private IEnumerable<BaseItem> ApplySortOrder(GetItems request, IEnumerable<BaseItem> items, User user) internal static IEnumerable<BaseItem> ApplySortOrder(BaseItemsRequest request, IEnumerable<BaseItem> items, User user, ILibraryManager libraryManager)
{ {
var orderBy = GetOrderBy(request).ToArray(); var orderBy = request.GetOrderBy().ToArray();
return orderBy.Length == 0 ? items : _libraryManager.Sort(items, user, orderBy, request.SortOrder ?? SortOrder.Ascending); return orderBy.Length == 0 ? items : libraryManager.Sort(items, user, orderBy, request.SortOrder ?? SortOrder.Ascending);
} }
/// <summary> /// <summary>
@ -278,8 +251,9 @@ namespace MediaBrowser.Api.UserLibrary
/// <param name="items">The items.</param> /// <param name="items">The items.</param>
/// <param name="filter">The filter.</param> /// <param name="filter">The filter.</param>
/// <param name="user">The user.</param> /// <param name="user">The user.</param>
/// <param name="userManager">The user manager.</param>
/// <returns>IEnumerable{BaseItem}.</returns> /// <returns>IEnumerable{BaseItem}.</returns>
private IEnumerable<BaseItem> ApplyFilter(IEnumerable<BaseItem> items, ItemFilter filter, User user) internal static IEnumerable<BaseItem> ApplyFilter(IEnumerable<BaseItem> items, ItemFilter filter, User user, IUserManager userManager)
{ {
// Avoids implicitly captured closure // Avoids implicitly captured closure
var currentUser = user; var currentUser = user;
@ -289,7 +263,7 @@ namespace MediaBrowser.Api.UserLibrary
case ItemFilter.Likes: case ItemFilter.Likes:
return items.Where(item => return items.Where(item =>
{ {
var userdata = _userManager.GetUserData(user.Id, item.UserDataId).Result; var userdata = userManager.GetUserData(user.Id, item.UserDataId).Result;
return userdata != null && userdata.Likes.HasValue && userdata.Likes.Value; return userdata != null && userdata.Likes.HasValue && userdata.Likes.Value;
}); });
@ -297,7 +271,7 @@ namespace MediaBrowser.Api.UserLibrary
case ItemFilter.Dislikes: case ItemFilter.Dislikes:
return items.Where(item => return items.Where(item =>
{ {
var userdata = _userManager.GetUserData(user.Id, item.UserDataId).Result; var userdata = userManager.GetUserData(user.Id, item.UserDataId).Result;
return userdata != null && userdata.Likes.HasValue && !userdata.Likes.Value; return userdata != null && userdata.Likes.HasValue && !userdata.Likes.Value;
}); });
@ -305,7 +279,7 @@ namespace MediaBrowser.Api.UserLibrary
case ItemFilter.IsFavorite: case ItemFilter.IsFavorite:
return items.Where(item => return items.Where(item =>
{ {
var userdata = _userManager.GetUserData(user.Id, item.UserDataId).Result; var userdata = userManager.GetUserData(user.Id, item.UserDataId).Result;
return userdata != null && userdata.IsFavorite; return userdata != null && userdata.IsFavorite;
}); });
@ -316,7 +290,7 @@ namespace MediaBrowser.Api.UserLibrary
case ItemFilter.IsResumable: case ItemFilter.IsResumable:
return items.Where(item => return items.Where(item =>
{ {
var userdata = _userManager.GetUserData(user.Id, item.UserDataId).Result; var userdata = userManager.GetUserData(user.Id, item.UserDataId).Result;
return userdata != null && userdata.PlaybackPositionTicks > 0; return userdata != null && userdata.PlaybackPositionTicks > 0;
}); });
@ -324,7 +298,7 @@ namespace MediaBrowser.Api.UserLibrary
case ItemFilter.IsPlayed: case ItemFilter.IsPlayed:
return items.Where(item => return items.Where(item =>
{ {
var userdata = _userManager.GetUserData(user.Id, item.UserDataId).Result; var userdata = userManager.GetUserData(user.Id, item.UserDataId).Result;
return userdata != null && userdata.PlayCount > 0; return userdata != null && userdata.PlayCount > 0;
}); });
@ -332,7 +306,7 @@ namespace MediaBrowser.Api.UserLibrary
case ItemFilter.IsUnplayed: case ItemFilter.IsUnplayed:
return items.Where(item => return items.Where(item =>
{ {
var userdata = _userManager.GetUserData(user.Id, item.UserDataId).Result; var userdata = userManager.GetUserData(user.Id, item.UserDataId).Result;
return userdata == null || userdata.PlayCount == 0; return userdata == null || userdata.PlayCount == 0;
}); });
@ -350,11 +324,32 @@ namespace MediaBrowser.Api.UserLibrary
/// <summary> /// <summary>
/// Applies the additional filters. /// Applies the additional filters.
/// </summary> /// </summary>
/// <param name="request">The request.</param> /// <param name="itemsRequest">The items request.</param>
/// <param name="items">The items.</param> /// <param name="items">The items.</param>
/// <returns>IEnumerable{BaseItem}.</returns> /// <returns>IEnumerable{BaseItem}.</returns>
private IEnumerable<BaseItem> ApplyAdditionalFilters(GetItems request, IEnumerable<BaseItem> items) internal static IEnumerable<BaseItem> ApplyAdditionalFilters(BaseItemsRequest itemsRequest, IEnumerable<BaseItem> items)
{ {
// Exclude item types
if (!string.IsNullOrEmpty(itemsRequest.ExcludeItemTypes))
{
var vals = itemsRequest.ExcludeItemTypes.Split(',');
items = items.Where(f => !vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase));
}
// Include item types
if (!string.IsNullOrEmpty(itemsRequest.IncludeItemTypes))
{
var vals = itemsRequest.IncludeItemTypes.Split(',');
items = items.Where(f => vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase));
}
var request = itemsRequest as GetItems;
if (request == null)
{
return items;
}
// Filter by Series Status // Filter by Series Status
if (!string.IsNullOrEmpty(request.SeriesStatus)) if (!string.IsNullOrEmpty(request.SeriesStatus))
{ {
@ -400,21 +395,6 @@ namespace MediaBrowser.Api.UserLibrary
items = items.Where(item => imageTypes.Any(imageType => HasImage(item, imageType))); items = items.Where(item => imageTypes.Any(imageType => HasImage(item, imageType)));
} }
// Exclude item types
var excludeItemTypes = request.ExcludeItemTypes;
if (!string.IsNullOrEmpty(excludeItemTypes))
{
var vals = excludeItemTypes.Split(',');
items = items.Where(f => !vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase));
}
var includeItemTypes = request.IncludeItemTypes;
if (!string.IsNullOrEmpty(includeItemTypes))
{
var vals = includeItemTypes.Split(',');
items = items.Where(f => vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase));
}
var genres = request.Genres; var genres = request.Genres;
// Apply genre filter // Apply genre filter
@ -463,7 +443,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="imageType">Type of the image.</param> /// <param name="imageType">Type of the image.</param>
/// <returns><c>true</c> if the specified item has image; otherwise, <c>false</c>.</returns> /// <returns><c>true</c> if the specified item has image; otherwise, <c>false</c>.</returns>
private bool HasImage(BaseItem item, ImageType imageType) private static bool HasImage(BaseItem item, ImageType imageType)
{ {
if (imageType == ImageType.Backdrop) if (imageType == ImageType.Backdrop)
{ {
@ -531,63 +511,12 @@ namespace MediaBrowser.Api.UserLibrary
return items; return items;
} }
/// <summary>
/// Gets the filters.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>IEnumerable{ItemFilter}.</returns>
private IEnumerable<ItemFilter> GetFilters(GetItems request)
{
var val = request.Filters;
if (string.IsNullOrEmpty(val))
{
return new ItemFilter[] { };
}
return val.Split(',').Select(v => (ItemFilter)Enum.Parse(typeof(ItemFilter), v, true));
}
/// <summary>
/// Gets the item fields.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>IEnumerable{ItemFields}.</returns>
private IEnumerable<ItemFields> GetItemFields(GetItems request)
{
var val = request.Fields;
if (string.IsNullOrEmpty(val))
{
return new ItemFields[] { };
}
return val.Split(',').Select(v => (ItemFields)Enum.Parse(typeof(ItemFields), v, true));
}
/// <summary>
/// Gets the order by.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>IEnumerable{ItemSortBy}.</returns>
private IEnumerable<string> GetOrderBy(GetItems request)
{
var val = request.SortBy;
if (string.IsNullOrEmpty(val))
{
return new string[] { };
}
return val.Split(',');
}
/// <summary> /// <summary>
/// Gets the image types. /// Gets the image types.
/// </summary> /// </summary>
/// <param name="request">The request.</param> /// <param name="request">The request.</param>
/// <returns>IEnumerable{ImageType}.</returns> /// <returns>IEnumerable{ImageType}.</returns>
private IEnumerable<ImageType> GetImageTypes(GetItems request) private static IEnumerable<ImageType> GetImageTypes(GetItems request)
{ {
var val = request.ImageTypes; var val = request.ImageTypes;

@ -461,12 +461,18 @@ namespace MediaBrowser.WebDashboard.Api
"mediaplayer.js", "mediaplayer.js",
"metadataconfigurationpage.js", "metadataconfigurationpage.js",
"metadataimagespage.js", "metadataimagespage.js",
"moviegenres.js",
"movies.js", "movies.js",
"moviesrecommended.js", "moviesrecommended.js",
"playlist.js",
"pluginspage.js", "pluginspage.js",
"pluginupdatespage.js", "pluginupdatespage.js",
"scheduledtaskpage.js", "scheduledtaskpage.js",
"scheduledtaskspage.js", "scheduledtaskspage.js",
"supporterkeypage.js",
"supporterpage.js",
"tvgenres.js",
"tvseries.js",
"tvrecommended.js", "tvrecommended.js",
"tvshows.js", "tvshows.js",
"updatepasswordpage.js", "updatepasswordpage.js",
@ -474,11 +480,7 @@ namespace MediaBrowser.WebDashboard.Api
"userprofilespage.js", "userprofilespage.js",
"wizardfinishpage.js", "wizardfinishpage.js",
"wizardstartpage.js", "wizardstartpage.js",
"wizarduserpage.js", "wizarduserpage.js"
"supporterkeypage.js",
"supporterpage.js",
"playlist.js",
"tvseries.js"
}; };
var memoryStream = new MemoryStream(); var memoryStream = new MemoryStream();

@ -1498,7 +1498,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout) {
}; };
/** /**
* Gets items based on a query, typicall for children of a folder * Gets items based on a query, typically for children of a folder
* @param {String} userId * @param {String} userId
* @param {Object} options * @param {Object} options
* Options accepts the following properties: * Options accepts the following properties:
@ -1529,6 +1529,52 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout) {
}); });
}; };
/**
Gets genres from an item
*/
self.getGenres = function (userId, options) {
if (!userId) {
throw new Error("null userId");
}
var parentId = options.parentId || "root";
// Don't put these on the query string
delete options.parentId;
var url = self.getUrl("Users/" + userId + "/Items/" + parentId + "/Genres", options);
return self.ajax({
type: "GET",
url: url,
dataType: "json"
});
};
/**
Gets studios from an item
*/
self.getStudios = function (userId, options) {
if (!userId) {
throw new Error("null userId");
}
var parentId = options.parentId || "root";
// Don't put these on the query string
delete options.parentId;
var url = self.getUrl("Users/" + userId + "/Items/" + parentId + "/Studios", options);
return self.ajax({
type: "GET",
url: url,
dataType: "json"
});
};
/** /**
* Gets local trailers for an item * Gets local trailers for an item
*/ */

@ -198,6 +198,9 @@
</Content> </Content>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="dashboard-ui\moviegenres.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\movies.html"> <Content Include="dashboard-ui\movies.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
@ -219,6 +222,9 @@
<Content Include="dashboard-ui\scripts\itembynamedetailpage.js"> <Content Include="dashboard-ui\scripts\itembynamedetailpage.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="dashboard-ui\scripts\moviegenres.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\scripts\playlist.js"> <Content Include="dashboard-ui\scripts\playlist.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
@ -254,6 +260,9 @@
<Content Include="dashboard-ui\itembynamedetails.html"> <Content Include="dashboard-ui\itembynamedetails.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="dashboard-ui\scripts\tvgenres.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\scripts\tvrecommended.js"> <Content Include="dashboard-ui\scripts\tvrecommended.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
@ -275,6 +284,9 @@
<Content Include="dashboard-ui\thirdparty\jplayer\jquery.jplayer.min.js"> <Content Include="dashboard-ui\thirdparty\jplayer\jquery.jplayer.min.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="dashboard-ui\tvgenres.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\tvrecommended.html"> <Content Include="dashboard-ui\tvrecommended.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="MediaBrowser.ApiClient.Javascript" version="3.0.71" targetFramework="net45" /> <package id="MediaBrowser.ApiClient.Javascript" version="3.0.72" targetFramework="net45" />
<package id="ServiceStack.Common" version="3.9.43" targetFramework="net45" /> <package id="ServiceStack.Common" version="3.9.43" targetFramework="net45" />
<package id="ServiceStack.Text" version="3.9.43" targetFramework="net45" /> <package id="ServiceStack.Text" version="3.9.43" targetFramework="net45" />
</packages> </packages>
Loading…
Cancel
Save