Merge pull request #1857 from MediaBrowser/dev

Dev
This commit is contained in:
Luke 2016-06-17 09:22:31 -04:00 committed by GitHub
commit 718981f3f8
36 changed files with 748 additions and 175 deletions

View File

@ -114,7 +114,7 @@ namespace MediaBrowser.Api
config.EnableStandaloneMusicKeys = true; config.EnableStandaloneMusicKeys = true;
config.EnableCaseSensitiveItemIds = true; config.EnableCaseSensitiveItemIds = true;
config.EnableFolderView = true; config.EnableFolderView = true;
config.SchemaVersion = 92; config.SchemaVersion = 95;
} }
public void Post(UpdateStartupConfiguration request) public void Post(UpdateStartupConfiguration request)

View File

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Dto; using System;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
@ -8,6 +9,8 @@ using MediaBrowser.Model.Dto;
using ServiceStack; using ServiceStack;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
namespace MediaBrowser.Api.UserLibrary namespace MediaBrowser.Api.UserLibrary
{ {
@ -100,7 +103,12 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>System.Object.</returns> /// <returns>System.Object.</returns>
public object Get(GetArtists request) public object Get(GetArtists request)
{ {
var result = GetResult(request); if (string.IsNullOrWhiteSpace(request.IncludeItemTypes))
{
//request.IncludeItemTypes = "Audio,MusicVideo";
}
var result = GetResultSlim(request);
return ToOptimizedResult(result); return ToOptimizedResult(result);
} }
@ -112,11 +120,26 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>System.Object.</returns> /// <returns>System.Object.</returns>
public object Get(GetAlbumArtists request) public object Get(GetAlbumArtists request)
{ {
var result = GetResult(request); if (string.IsNullOrWhiteSpace(request.IncludeItemTypes))
{
//request.IncludeItemTypes = "Audio,MusicVideo";
}
var result = GetResultSlim(request);
return ToOptimizedResult(result); return ToOptimizedResult(result);
} }
protected override QueryResult<Tuple<BaseItem, ItemCounts>> GetItems(GetItemsByName request, InternalItemsQuery query)
{
if (request is GetAlbumArtists)
{
return LibraryManager.GetAlbumArtists(query);
}
return LibraryManager.GetArtists(query);
}
/// <summary> /// <summary>
/// Gets all items. /// Gets all items.
/// </summary> /// </summary>
@ -125,16 +148,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns>
protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items) protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items)
{ {
if (request is GetAlbumArtists) throw new NotImplementedException();
{
return LibraryManager.GetAlbumArtists(items
.Where(i => !i.IsFolder)
.OfType<IHasAlbumArtist>());
}
return LibraryManager.GetArtists(items
.Where(i => !i.IsFolder)
.OfType<IHasArtist>());
} }
} }
} }

View File

@ -8,6 +8,7 @@ using ServiceStack;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using MediaBrowser.Model.Dto;
namespace MediaBrowser.Api.UserLibrary namespace MediaBrowser.Api.UserLibrary
{ {
@ -83,6 +84,137 @@ namespace MediaBrowser.Api.UserLibrary
return null; return null;
} }
protected ItemsResult GetResultSlim(GetItemsByName request)
{
var dtoOptions = GetDtoOptions(request);
User user = null;
BaseItem parentItem;
if (!string.IsNullOrWhiteSpace(request.UserId))
{
user = UserManager.GetUserById(request.UserId);
parentItem = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : LibraryManager.GetItemById(request.ParentId);
}
else
{
parentItem = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : LibraryManager.GetItemById(request.ParentId);
}
var excludeItemTypes = request.GetExcludeItemTypes();
var includeItemTypes = request.GetIncludeItemTypes();
var mediaTypes = request.GetMediaTypes();
var query = new InternalItemsQuery(user)
{
ExcludeItemTypes = excludeItemTypes,
IncludeItemTypes = includeItemTypes,
MediaTypes = mediaTypes,
StartIndex = request.StartIndex,
Limit = request.Limit,
IsFavorite = request.IsFavorite,
NameLessThan = request.NameLessThan,
NameStartsWith = request.NameStartsWith,
NameStartsWithOrGreater = request.NameStartsWithOrGreater,
AlbumArtistStartsWithOrGreater = request.AlbumArtistStartsWithOrGreater,
Tags = request.GetTags(),
OfficialRatings = request.GetOfficialRatings(),
Genres = request.GetGenres(),
GenreIds = request.GetGenreIds(),
Studios = request.GetStudios(),
StudioIds = request.GetStudioIds(),
Person = request.Person,
PersonIds = request.GetPersonIds(),
PersonTypes = request.GetPersonTypes(),
Years = request.GetYears(),
MinCommunityRating = request.MinCommunityRating
};
if (!string.IsNullOrWhiteSpace(request.ParentId))
{
if (parentItem is Folder)
{
query.AncestorIds = new[] { request.ParentId };
}
else
{
query.ItemIds = new[] { request.ParentId };
}
}
foreach (var filter in request.GetFilters())
{
switch (filter)
{
case ItemFilter.Dislikes:
query.IsLiked = false;
break;
case ItemFilter.IsFavorite:
query.IsFavorite = true;
break;
case ItemFilter.IsFavoriteOrLikes:
query.IsFavoriteOrLiked = true;
break;
case ItemFilter.IsFolder:
query.IsFolder = true;
break;
case ItemFilter.IsNotFolder:
query.IsFolder = false;
break;
case ItemFilter.IsPlayed:
query.IsPlayed = true;
break;
case ItemFilter.IsRecentlyAdded:
break;
case ItemFilter.IsResumable:
query.IsResumable = true;
break;
case ItemFilter.IsUnplayed:
query.IsPlayed = false;
break;
case ItemFilter.Likes:
query.IsLiked = true;
break;
}
}
var result = GetItems(request, query);
var dtos = result.Items.Select(i =>
{
var dto = DtoService.GetItemByNameDto(i.Item1, dtoOptions, null, user);
if (!string.IsNullOrWhiteSpace(request.IncludeItemTypes))
{
SetItemCounts(dto, i.Item2);
}
return dto;
});
return new ItemsResult
{
Items = dtos.ToArray(),
TotalRecordCount = result.TotalRecordCount
};
}
protected virtual QueryResult<Tuple<BaseItem, ItemCounts>> GetItems(GetItemsByName request, InternalItemsQuery query)
{
return new QueryResult<Tuple<BaseItem, ItemCounts>>();
}
private void SetItemCounts(BaseItemDto dto, ItemCounts counts)
{
dto.ChildCount = counts.ItemCount;
dto.SeriesCount = counts.SeriesCount;
dto.EpisodeCount = counts.EpisodeCount;
dto.MovieCount = counts.MovieCount;
dto.TrailerCount = counts.TrailerCount;
dto.AlbumCount = counts.AlbumCount;
dto.SongCount = counts.SongCount;
dto.GameCount = counts.GameCount;
}
/// <summary> /// <summary>
/// Gets the specified request. /// Gets the specified request.
/// </summary> /// </summary>
@ -374,7 +506,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <param name="includeItemTypes">The include item types.</param> /// <param name="includeItemTypes">The include item types.</param>
/// <param name="mediaTypes">The media types.</param> /// <param name="mediaTypes">The media types.</param>
/// <returns>IEnumerable{BaseItem}.</returns> /// <returns>IEnumerable{BaseItem}.</returns>
protected bool FilterItem(GetItemsByName request, BaseItem f, string[] excludeItemTypes, string[] includeItemTypes, string[] mediaTypes) private bool FilterItem(GetItemsByName request, BaseItem f, string[] excludeItemTypes, string[] includeItemTypes, string[] mediaTypes)
{ {
// Exclude item types // Exclude item types
if (excludeItemTypes.Length > 0) if (excludeItemTypes.Length > 0)

View File

@ -9,6 +9,7 @@ using ServiceStack;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using MediaBrowser.Model.Querying;
namespace MediaBrowser.Api.UserLibrary namespace MediaBrowser.Api.UserLibrary
{ {
@ -87,11 +88,16 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>System.Object.</returns> /// <returns>System.Object.</returns>
public object Get(GetGameGenres request) public object Get(GetGameGenres request)
{ {
var result = GetResult(request); var result = GetResultSlim(request);
return ToOptimizedSerializedResultUsingCache(result); return ToOptimizedSerializedResultUsingCache(result);
} }
protected override QueryResult<Tuple<BaseItem, ItemCounts>> GetItems(GetItemsByName request, InternalItemsQuery query)
{
return LibraryManager.GetGameGenres(query);
}
/// <summary> /// <summary>
/// Gets all items. /// Gets all items.
/// </summary> /// </summary>
@ -100,22 +106,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns>
protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items) protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items)
{ {
return items throw new NotImplementedException();
.SelectMany(i => i.Genres)
.DistinctNames()
.Select(name =>
{
try
{
return LibraryManager.GetGameGenre(name);
}
catch (Exception ex)
{
Logger.ErrorException("Error getting genre {0}", ex, name);
return null;
}
})
.Where(i => i != null);
} }
} }
} }

View File

@ -9,6 +9,7 @@ using ServiceStack;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using MediaBrowser.Model.Querying;
namespace MediaBrowser.Api.UserLibrary namespace MediaBrowser.Api.UserLibrary
{ {
@ -92,11 +93,28 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>System.Object.</returns> /// <returns>System.Object.</returns>
public object Get(GetGenres request) public object Get(GetGenres request)
{ {
var result = GetResult(request); var result = GetResultSlim(request);
return ToOptimizedSerializedResultUsingCache(result); return ToOptimizedSerializedResultUsingCache(result);
} }
protected override QueryResult<Tuple<BaseItem, ItemCounts>> GetItems(GetItemsByName request, InternalItemsQuery query)
{
var viewType = GetParentItemViewType(request);
if (string.Equals(viewType, CollectionType.Music) || string.Equals(viewType, CollectionType.MusicVideos))
{
return LibraryManager.GetMusicGenres(query);
}
if (string.Equals(viewType, CollectionType.Games))
{
return LibraryManager.GetGameGenres(query);
}
return LibraryManager.GetGenres(query);
}
/// <summary> /// <summary>
/// Gets all items. /// Gets all items.
/// </summary> /// </summary>
@ -105,52 +123,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns>
protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items) protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items)
{ {
var viewType = GetParentItemViewType(request); throw new NotImplementedException();
if (string.Equals(viewType, CollectionType.Music) || string.Equals(viewType, CollectionType.MusicVideos))
{
return items
.SelectMany(i => i.Genres)
.DistinctNames()
.Select(name => LibraryManager.GetMusicGenre(name));
}
if (string.Equals(viewType, CollectionType.Games))
{
return items
.SelectMany(i => i.Genres)
.DistinctNames()
.Select(name =>
{
try
{
return LibraryManager.GetGameGenre(name);
}
catch (Exception ex)
{
Logger.ErrorException("Error getting genre {0}", ex, name);
return null;
}
})
.Where(i => i != null);
}
return items
.SelectMany(i => i.Genres)
.DistinctNames()
.Select(name =>
{
try
{
return LibraryManager.GetGenre(name);
}
catch (Exception ex)
{
Logger.ErrorException("Error getting genre {0}", ex, name);
return null;
}
})
.Where(i => i != null);
} }
} }
} }

View File

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Dto; using System;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
@ -8,6 +9,8 @@ using MediaBrowser.Model.Dto;
using ServiceStack; using ServiceStack;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
namespace MediaBrowser.Api.UserLibrary namespace MediaBrowser.Api.UserLibrary
{ {
@ -86,11 +89,16 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>System.Object.</returns> /// <returns>System.Object.</returns>
public object Get(GetMusicGenres request) public object Get(GetMusicGenres request)
{ {
var result = GetResult(request); var result = GetResultSlim(request);
return ToOptimizedSerializedResultUsingCache(result); return ToOptimizedSerializedResultUsingCache(result);
} }
protected override QueryResult<Tuple<BaseItem, ItemCounts>> GetItems(GetItemsByName request, InternalItemsQuery query)
{
return LibraryManager.GetMusicGenres(query);
}
/// <summary> /// <summary>
/// Gets all items. /// Gets all items.
/// </summary> /// </summary>
@ -99,10 +107,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns>
protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items) protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items)
{ {
return items throw new NotImplementedException();
.SelectMany(i => i.Genres)
.DistinctNames()
.Select(name => LibraryManager.GetMusicGenre(name));
} }
} }
} }

View File

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Dto; using System;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Net;
@ -7,6 +8,7 @@ using MediaBrowser.Model.Dto;
using ServiceStack; using ServiceStack;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using MediaBrowser.Model.Querying;
namespace MediaBrowser.Api.UserLibrary namespace MediaBrowser.Api.UserLibrary
{ {
@ -90,11 +92,16 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>System.Object.</returns> /// <returns>System.Object.</returns>
public object Get(GetStudios request) public object Get(GetStudios request)
{ {
var result = GetResult(request); var result = GetResultSlim(request);
return ToOptimizedSerializedResultUsingCache(result); return ToOptimizedSerializedResultUsingCache(result);
} }
protected override QueryResult<Tuple<BaseItem, ItemCounts>> GetItems(GetItemsByName request, InternalItemsQuery query)
{
return LibraryManager.GetStudios(query);
}
/// <summary> /// <summary>
/// Gets all items. /// Gets all items.
/// </summary> /// </summary>

View File

@ -26,8 +26,6 @@ namespace MediaBrowser.Controller.Entities.Audio
{ {
public List<ChannelMediaInfo> ChannelMediaSources { get; set; } public List<ChannelMediaInfo> ChannelMediaSources { get; set; }
public long? Size { get; set; }
public string Container { get; set; }
public int? TotalBitrate { get; set; } public int? TotalBitrate { get; set; }
public ExtraType? ExtraType { get; set; } public ExtraType? ExtraType { get; set; }

View File

@ -9,6 +9,7 @@ using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Common.Extensions;
namespace MediaBrowser.Controller.Entities.Audio namespace MediaBrowser.Controller.Entities.Audio
{ {
@ -79,6 +80,15 @@ namespace MediaBrowser.Controller.Entities.Audio
} }
} }
public override int GetChildCount(User user)
{
if (IsAccessedByName)
{
return 0;
}
return base.GetChildCount(user);
}
public override bool IsSaveLocalMetadataEnabled() public override bool IsSaveLocalMetadataEnabled()
{ {
if (IsAccessedByName) if (IsAccessedByName)
@ -156,10 +166,17 @@ namespace MediaBrowser.Controller.Entities.Audio
list.Add("Artist-Musicbrainz-" + id); list.Add("Artist-Musicbrainz-" + id);
} }
list.Add("Artist-" + item.Name); list.Add("Artist-" + (item.Name ?? string.Empty).RemoveDiacritics());
return list; return list;
} }
public override string PresentationUniqueKey
{
get
{
return "Artist-" + (Name ?? string.Empty).RemoveDiacritics();
}
}
protected override bool GetBlockUnratedValue(UserPolicy config) protected override bool GetBlockUnratedValue(UserPolicy config)
{ {
return config.BlockUnratedItems.Contains(UnratedItem.Music); return config.BlockUnratedItems.Contains(UnratedItem.Music);

View File

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using MediaBrowser.Common.Extensions;
namespace MediaBrowser.Controller.Entities.Audio namespace MediaBrowser.Controller.Entities.Audio
{ {
@ -14,10 +15,18 @@ namespace MediaBrowser.Controller.Entities.Audio
{ {
var list = base.GetUserDataKeys(); var list = base.GetUserDataKeys();
list.Insert(0, "MusicGenre-" + Name); list.Insert(0, GetType().Name + "-" + (Name ?? string.Empty).RemoveDiacritics());
return list; return list;
} }
public override string PresentationUniqueKey
{
get
{
return GetUserDataKeys()[0];
}
}
[IgnoreDataMember] [IgnoreDataMember]
public override bool SupportsAddingToPlaylist public override bool SupportsAddingToPlaylist
{ {

View File

@ -69,6 +69,10 @@ namespace MediaBrowser.Controller.Entities
[IgnoreDataMember] [IgnoreDataMember]
public string PreferredMetadataLanguage { get; set; } public string PreferredMetadataLanguage { get; set; }
public long? Size { get; set; }
public string Container { get; set; }
public string ShortOverview { get; set; }
public List<ItemImageInfo> ImageInfos { get; set; } public List<ItemImageInfo> ImageInfos { get; set; }
[IgnoreDataMember] [IgnoreDataMember]

View File

@ -216,7 +216,7 @@ namespace MediaBrowser.Controller.Entities
{ {
get get
{ {
return LoadChildren().Select(LibraryManager.GetItemById).Where(i => i != null); return LoadChildren();
} }
} }
@ -270,7 +270,7 @@ namespace MediaBrowser.Controller.Entities
/// Loads our children. Validation will occur externally. /// Loads our children. Validation will occur externally.
/// We want this sychronous. /// We want this sychronous.
/// </summary> /// </summary>
protected virtual IEnumerable<Guid> LoadChildren() protected virtual IEnumerable<BaseItem> LoadChildren()
{ {
//just load our children from the repo - the library will be validated and maintained in other processes //just load our children from the repo - the library will be validated and maintained in other processes
return GetCachedChildren(); return GetCachedChildren();
@ -657,9 +657,9 @@ namespace MediaBrowser.Controller.Entities
/// Get our children from the repo - stubbed for now /// Get our children from the repo - stubbed for now
/// </summary> /// </summary>
/// <returns>IEnumerable{BaseItem}.</returns> /// <returns>IEnumerable{BaseItem}.</returns>
protected IEnumerable<Guid> GetCachedChildren() protected IEnumerable<BaseItem> GetCachedChildren()
{ {
return ItemRepository.GetItemIdsList(new InternalItemsQuery return ItemRepository.GetItemList(new InternalItemsQuery
{ {
ParentId = Id, ParentId = Id,
GroupByPresentationUniqueKey = false GroupByPresentationUniqueKey = false

View File

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using MediaBrowser.Common.Extensions;
namespace MediaBrowser.Controller.Entities namespace MediaBrowser.Controller.Entities
{ {
@ -11,10 +12,18 @@ namespace MediaBrowser.Controller.Entities
{ {
var list = base.GetUserDataKeys(); var list = base.GetUserDataKeys();
list.Insert(0, "GameGenre-" + Name); list.Insert(0, GetType().Name + "-" + (Name ?? string.Empty).RemoveDiacritics());
return list; return list;
} }
public override string PresentationUniqueKey
{
get
{
return GetUserDataKeys()[0];
}
}
/// <summary> /// <summary>
/// Returns the folder containing the item. /// Returns the folder containing the item.
/// If the item is a folder, it returns the folder itself /// If the item is a folder, it returns the folder itself

View File

@ -3,6 +3,7 @@ using MediaBrowser.Controller.Entities.Audio;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using MediaBrowser.Common.Extensions;
namespace MediaBrowser.Controller.Entities namespace MediaBrowser.Controller.Entities
{ {
@ -15,10 +16,18 @@ namespace MediaBrowser.Controller.Entities
{ {
var list = base.GetUserDataKeys(); var list = base.GetUserDataKeys();
list.Insert(0, "Genre-" + Name); list.Insert(0, GetType().Name + "-" + (Name ?? string.Empty).RemoveDiacritics());
return list; return list;
} }
public override string PresentationUniqueKey
{
get
{
return GetUserDataKeys()[0];
}
}
/// <summary> /// <summary>
/// Returns the folder containing the item. /// Returns the folder containing the item.
/// If the item is a folder, it returns the folder itself /// If the item is a folder, it returns the folder itself

View File

@ -3,6 +3,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Entities namespace MediaBrowser.Controller.Entities
@ -22,10 +23,18 @@ namespace MediaBrowser.Controller.Entities
{ {
var list = base.GetUserDataKeys(); var list = base.GetUserDataKeys();
list.Insert(0, "Person-" + Name); list.Insert(0, GetType().Name + "-" + (Name ?? string.Empty).RemoveDiacritics());
return list; return list;
} }
public override string PresentationUniqueKey
{
get
{
return GetUserDataKeys()[0];
}
}
public PersonLookupInfo GetLookupInfo() public PersonLookupInfo GetLookupInfo()
{ {
return GetItemLookupInfo<PersonLookupInfo>(); return GetItemLookupInfo<PersonLookupInfo>();

View File

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using MediaBrowser.Common.Extensions;
namespace MediaBrowser.Controller.Entities namespace MediaBrowser.Controller.Entities
{ {
@ -14,10 +15,18 @@ namespace MediaBrowser.Controller.Entities
{ {
var list = base.GetUserDataKeys(); var list = base.GetUserDataKeys();
list.Insert(0, "Studio-" + Name); list.Insert(0, GetType().Name + "-" + (Name ?? string.Empty).RemoveDiacritics());
return list; return list;
} }
public override string PresentationUniqueKey
{
get
{
return GetUserDataKeys()[0];
}
}
/// <summary> /// <summary>
/// Returns the folder containing the item. /// Returns the folder containing the item.
/// If the item is a folder, it returns the folder itself /// If the item is a folder, it returns the folder itself

View File

@ -58,10 +58,7 @@ namespace MediaBrowser.Controller.Entities
} }
} }
public long? Size { get; set; }
public string Container { get; set; }
public int? TotalBitrate { get; set; } public int? TotalBitrate { get; set; }
public string ShortOverview { get; set; }
public ExtraType? ExtraType { get; set; } public ExtraType? ExtraType { get; set; }
/// <summary> /// <summary>

View File

@ -11,6 +11,7 @@ using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using CommonIO; using CommonIO;
using MediaBrowser.Model.Dto;
namespace MediaBrowser.Controller.Library namespace MediaBrowser.Controller.Library
{ {
@ -567,5 +568,12 @@ namespace MediaBrowser.Controller.Library
void RemoveVirtualFolder(string name, bool refreshLibrary); void RemoveVirtualFolder(string name, bool refreshLibrary);
void AddMediaPath(string virtualFolderName, string path); void AddMediaPath(string virtualFolderName, string path);
void RemoveMediaPath(string virtualFolderName, string path); void RemoveMediaPath(string virtualFolderName, string path);
QueryResult<Tuple<BaseItem, ItemCounts>> GetGenres(InternalItemsQuery query);
QueryResult<Tuple<BaseItem, ItemCounts>> GetMusicGenres(InternalItemsQuery query);
QueryResult<Tuple<BaseItem, ItemCounts>> GetGameGenres(InternalItemsQuery query);
QueryResult<Tuple<BaseItem, ItemCounts>> GetStudios(InternalItemsQuery query);
QueryResult<Tuple<BaseItem, ItemCounts>> GetArtists(InternalItemsQuery query);
QueryResult<Tuple<BaseItem, ItemCounts>> GetAlbumArtists(InternalItemsQuery query);
} }
} }

View File

@ -4,6 +4,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Querying; using MediaBrowser.Model.Querying;
namespace MediaBrowser.Controller.Persistence namespace MediaBrowser.Controller.Persistence
@ -161,6 +162,13 @@ namespace MediaBrowser.Controller.Persistence
/// <param name="cancellationToken">The cancellation token.</param> /// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns> /// <returns>Task.</returns>
Task UpdateInheritedValues(CancellationToken cancellationToken); Task UpdateInheritedValues(CancellationToken cancellationToken);
QueryResult<Tuple<BaseItem, ItemCounts>> GetGenres(InternalItemsQuery query);
QueryResult<Tuple<BaseItem, ItemCounts>> GetMusicGenres(InternalItemsQuery query);
QueryResult<Tuple<BaseItem, ItemCounts>> GetGameGenres(InternalItemsQuery query);
QueryResult<Tuple<BaseItem, ItemCounts>> GetStudios(InternalItemsQuery query);
QueryResult<Tuple<BaseItem, ItemCounts>> GetArtists(InternalItemsQuery query);
QueryResult<Tuple<BaseItem, ItemCounts>> GetAlbumArtists(InternalItemsQuery query);
} }
} }

View File

@ -599,9 +599,6 @@
<Compile Include="..\MediaBrowser.Model\Entities\Video3DFormat.cs"> <Compile Include="..\MediaBrowser.Model\Entities\Video3DFormat.cs">
<Link>Entities\Video3DFormat.cs</Link> <Link>Entities\Video3DFormat.cs</Link>
</Compile> </Compile>
<Compile Include="..\MediaBrowser.Model\Entities\VideoSize.cs">
<Link>Entities\VideoSize.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Entities\VideoType.cs"> <Compile Include="..\MediaBrowser.Model\Entities\VideoType.cs">
<Link>Entities\VideoType.cs</Link> <Link>Entities\VideoType.cs</Link>
</Compile> </Compile>

View File

@ -573,9 +573,6 @@
<Compile Include="..\MediaBrowser.Model\Entities\Video3DFormat.cs"> <Compile Include="..\MediaBrowser.Model\Entities\Video3DFormat.cs">
<Link>Entities\Video3DFormat.cs</Link> <Link>Entities\Video3DFormat.cs</Link>
</Compile> </Compile>
<Compile Include="..\MediaBrowser.Model\Entities\VideoSize.cs">
<Link>Entities\VideoSize.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Entities\VideoType.cs"> <Compile Include="..\MediaBrowser.Model\Entities\VideoType.cs">
<Link>Entities\VideoType.cs</Link> <Link>Entities\VideoType.cs</Link>
</Compile> </Compile>

View File

@ -60,5 +60,6 @@
/// </summary> /// </summary>
/// <value>The book count.</value> /// <value>The book count.</value>
public int BookCount { get; set; } public int BookCount { get; set; }
public int ItemCount { get; set; }
} }
} }

View File

@ -5,6 +5,5 @@ namespace MediaBrowser.Model.Entities
{ {
public string Url { get; set; } public string Url { get; set; }
public string Name { get; set; } public string Name { get; set; }
public VideoSize? VideoSize { get; set; }
} }
} }

View File

@ -1,8 +0,0 @@
namespace MediaBrowser.Model.Entities
{
public enum VideoSize
{
StandardDefinition,
HighDefinition
}
}

View File

@ -227,7 +227,6 @@
<Compile Include="Entities\ProviderIdsExtensions.cs" /> <Compile Include="Entities\ProviderIdsExtensions.cs" />
<Compile Include="Entities\ScrollDirection.cs" /> <Compile Include="Entities\ScrollDirection.cs" />
<Compile Include="Entities\SortOrder.cs" /> <Compile Include="Entities\SortOrder.cs" />
<Compile Include="Entities\VideoSize.cs" />
<Compile Include="Events\GenericEventArgs.cs" /> <Compile Include="Events\GenericEventArgs.cs" />
<Compile Include="Extensions\DoubleHelper.cs" /> <Compile Include="Extensions\DoubleHelper.cs" />
<Compile Include="Extensions\IHasPropertyChangedEvent.cs" /> <Compile Include="Extensions\IHasPropertyChangedEvent.cs" />

View File

@ -326,8 +326,7 @@ namespace MediaBrowser.Providers.Movies
hasTrailers.RemoteTrailers = movieData.trailers.youtube.Select(i => new MediaUrl hasTrailers.RemoteTrailers = movieData.trailers.youtube.Select(i => new MediaUrl
{ {
Url = string.Format("https://www.youtube.com/watch?v={0}", i.source), Url = string.Format("https://www.youtube.com/watch?v={0}", i.source),
Name = i.name, Name = i.name
VideoSize = string.Equals("hd", i.size, StringComparison.OrdinalIgnoreCase) ? VideoSize.HighDefinition : VideoSize.StandardDefinition
}).ToList(); }).ToList();
} }

View File

@ -418,7 +418,7 @@ namespace MediaBrowser.Server.Implementations.Dto
var dto = GetBaseItemDtoInternal(item, options, GetSyncedItemProgressDictionary(syncProgress), user); var dto = GetBaseItemDtoInternal(item, options, GetSyncedItemProgressDictionary(syncProgress), user);
if (options.Fields.Contains(ItemFields.ItemCounts)) if (taggedItems != null && options.Fields.Contains(ItemFields.ItemCounts))
{ {
SetItemByNameInfo(item, dto, taggedItems, user); SetItemByNameInfo(item, dto, taggedItems, user);
} }

View File

@ -33,6 +33,7 @@ using System.Net;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using CommonIO; using CommonIO;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Extensions; using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.Library; using MediaBrowser.Model.Library;
using MediaBrowser.Model.Net; using MediaBrowser.Model.Net;
@ -1278,7 +1279,7 @@ namespace MediaBrowser.Server.Implementations.Library
private bool EnableCaching private bool EnableCaching
{ {
get { return true; } get { return false; }
} }
public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query) public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query)
@ -1326,6 +1327,99 @@ namespace MediaBrowser.Server.Implementations.Library
return ItemRepository.GetItemIdsList(query); return ItemRepository.GetItemIdsList(query);
} }
public QueryResult<Tuple<BaseItem, ItemCounts>> GetStudios(InternalItemsQuery query)
{
if (query.User != null)
{
AddUserToQuery(query, query.User);
}
SetTopParentOrAncestorIds(query);
return ItemRepository.GetStudios(query);
}
public QueryResult<Tuple<BaseItem, ItemCounts>> GetGenres(InternalItemsQuery query)
{
if (query.User != null)
{
AddUserToQuery(query, query.User);
}
SetTopParentOrAncestorIds(query);
return ItemRepository.GetGenres(query);
}
public QueryResult<Tuple<BaseItem, ItemCounts>> GetGameGenres(InternalItemsQuery query)
{
if (query.User != null)
{
AddUserToQuery(query, query.User);
}
SetTopParentOrAncestorIds(query);
return ItemRepository.GetGameGenres(query);
}
public QueryResult<Tuple<BaseItem, ItemCounts>> GetMusicGenres(InternalItemsQuery query)
{
if (query.User != null)
{
AddUserToQuery(query, query.User);
}
SetTopParentOrAncestorIds(query);
return ItemRepository.GetMusicGenres(query);
}
public QueryResult<Tuple<BaseItem, ItemCounts>> GetArtists(InternalItemsQuery query)
{
if (query.User != null)
{
AddUserToQuery(query, query.User);
}
SetTopParentOrAncestorIds(query);
return ItemRepository.GetArtists(query);
}
private void SetTopParentOrAncestorIds(InternalItemsQuery query)
{
if (query.AncestorIds.Length == 0)
{
return;
}
var parents = query.AncestorIds.Select(i => GetItemById(new Guid(i))).ToList();
if (parents.All(i =>
{
if (i is ICollectionFolder || i is UserView)
{
return true;
}
_logger.Debug("Query requires ancestor query due to type: " + i.GetType().Name);
return false;
}))
{
// Optimize by querying against top level views
query.TopParentIds = parents.SelectMany(i => GetTopParentsForQuery(i, query.User)).Select(i => i.Id.ToString("N")).ToArray();
query.AncestorIds = new string[] { };
}
}
public QueryResult<Tuple<BaseItem, ItemCounts>> GetAlbumArtists(InternalItemsQuery query)
{
if (query.User != null)
{
AddUserToQuery(query, query.User);
}
SetTopParentOrAncestorIds(query);
return ItemRepository.GetAlbumArtists(query);
}
public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query, IEnumerable<string> parentIds) public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query, IEnumerable<string> parentIds)
{ {
var parents = parentIds.Select(i => GetItemById(new Guid(i))).Where(i => i != null).ToList(); var parents = parentIds.Select(i => GetItemById(new Guid(i))).Where(i => i != null).ToList();

View File

@ -126,7 +126,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
} }
else else
{ {
var videoInfo = parser.ResolveFile(args.Path); var videoInfo = parser.Resolve(args.Path, false, false);
if (videoInfo == null) if (videoInfo == null)
{ {

View File

@ -56,8 +56,8 @@
<Reference Include="Interfaces.IO"> <Reference Include="Interfaces.IO">
<HintPath>..\packages\Interfaces.IO.1.0.0.5\lib\portable-net45+sl4+wp71+win8+wpa81\Interfaces.IO.dll</HintPath> <HintPath>..\packages\Interfaces.IO.1.0.0.5\lib\portable-net45+sl4+wp71+win8+wpa81\Interfaces.IO.dll</HintPath>
</Reference> </Reference>
<Reference Include="MediaBrowser.Naming, Version=1.0.5996.42016, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="MediaBrowser.Naming, Version=1.0.6012.15754, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MediaBrowser.Naming.1.0.0.51\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll</HintPath> <HintPath>..\packages\MediaBrowser.Naming.1.0.0.52\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="MoreLinq"> <Reference Include="MoreLinq">

View File

@ -15,6 +15,7 @@ using System.Threading.Tasks;
using CommonIO; using CommonIO;
using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Localization;
using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Net;
using MediaBrowser.Server.Implementations.ScheduledTasks; using MediaBrowser.Server.Implementations.ScheduledTasks;
@ -145,7 +146,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
{ {
var itemIds = _libraryManager.GetItemIds(new InternalItemsQuery var itemIds = _libraryManager.GetItemIds(new InternalItemsQuery
{ {
IsCurrentSchema = false IsCurrentSchema = false,
ExcludeItemTypes = new[] { typeof(LiveTvProgram).Name }
}); });
var numComplete = 0; var numComplete = 0;
@ -236,14 +238,14 @@ namespace MediaBrowser.Server.Implementations.Persistence
// These have their own cleanup routines // These have their own cleanup routines
ExcludeItemTypes = new[] ExcludeItemTypes = new[]
{ {
typeof(Person).Name, typeof(Person).Name,
typeof(Genre).Name, typeof(Genre).Name,
typeof(MusicGenre).Name, typeof(MusicGenre).Name,
typeof(GameGenre).Name, typeof(GameGenre).Name,
typeof(Studio).Name, typeof(Studio).Name,
typeof(Year).Name, typeof(Year).Name,
typeof(Channel).Name, typeof(Channel).Name,
typeof(AggregateFolder).Name, typeof(AggregateFolder).Name,
typeof(CollectionFolder).Name typeof(CollectionFolder).Name
} }
}); });
@ -313,8 +315,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
public IEnumerable<ITaskTrigger> GetDefaultTriggers() public IEnumerable<ITaskTrigger> GetDefaultTriggers()
{ {
return new ITaskTrigger[] return new ITaskTrigger[]
{ {
new IntervalTrigger{ Interval = TimeSpan.FromHours(24)} new IntervalTrigger{ Interval = TimeSpan.FromHours(24)}
}; };
} }

View File

@ -22,6 +22,7 @@ using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Playlists; using MediaBrowser.Controller.Playlists;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.LiveTv; using MediaBrowser.Model.LiveTv;
namespace MediaBrowser.Server.Implementations.Persistence namespace MediaBrowser.Server.Implementations.Persistence
@ -94,7 +95,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
private IDbCommand _updateInheritedRatingCommand; private IDbCommand _updateInheritedRatingCommand;
private IDbCommand _updateInheritedTagsCommand; private IDbCommand _updateInheritedTagsCommand;
public const int LatestSchemaVersion = 92; public const int LatestSchemaVersion = 95;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="SqliteItemRepository"/> class. /// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
@ -157,7 +158,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
"create table if not exists UserDataKeys (ItemId GUID, UserDataKey TEXT, PRIMARY KEY (ItemId, UserDataKey))", "create table if not exists UserDataKeys (ItemId GUID, UserDataKey TEXT, PRIMARY KEY (ItemId, UserDataKey))",
"create index if not exists idx_UserDataKeys1 on UserDataKeys(ItemId)", "create index if not exists idx_UserDataKeys1 on UserDataKeys(ItemId)",
"create table if not exists ItemValues (ItemId GUID, Type INT, Value TEXT)", "create table if not exists ItemValues (ItemId GUID, Type INT, Value TEXT, CleanValue TEXT)",
"create index if not exists idx_ItemValues on ItemValues(ItemId)", "create index if not exists idx_ItemValues on ItemValues(ItemId)",
"create index if not exists idx_ItemValues2 on ItemValues(ItemId,Type)", "create index if not exists idx_ItemValues2 on ItemValues(ItemId,Type)",
@ -263,6 +264,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
_connection.AddColumn(Logger, "TypedBaseItems", "SeriesName", "Text"); _connection.AddColumn(Logger, "TypedBaseItems", "SeriesName", "Text");
_connection.AddColumn(Logger, "UserDataKeys", "Priority", "INT"); _connection.AddColumn(Logger, "UserDataKeys", "Priority", "INT");
_connection.AddColumn(Logger, "ItemValues", "CleanValue", "Text");
string[] postQueries = string[] postQueries =
{ {
@ -568,10 +570,11 @@ namespace MediaBrowser.Server.Implementations.Persistence
_deleteItemValuesCommand.Parameters.Add(_deleteItemValuesCommand, "@Id"); _deleteItemValuesCommand.Parameters.Add(_deleteItemValuesCommand, "@Id");
_saveItemValuesCommand = _connection.CreateCommand(); _saveItemValuesCommand = _connection.CreateCommand();
_saveItemValuesCommand.CommandText = "insert into ItemValues (ItemId, Type, Value) values (@ItemId, @Type, @Value)"; _saveItemValuesCommand.CommandText = "insert into ItemValues (ItemId, Type, Value, CleanValue) values (@ItemId, @Type, @Value, @CleanValue)";
_saveItemValuesCommand.Parameters.Add(_saveItemValuesCommand, "@ItemId"); _saveItemValuesCommand.Parameters.Add(_saveItemValuesCommand, "@ItemId");
_saveItemValuesCommand.Parameters.Add(_saveItemValuesCommand, "@Type"); _saveItemValuesCommand.Parameters.Add(_saveItemValuesCommand, "@Type");
_saveItemValuesCommand.Parameters.Add(_saveItemValuesCommand, "@Value"); _saveItemValuesCommand.Parameters.Add(_saveItemValuesCommand, "@Value");
_saveItemValuesCommand.Parameters.Add(_saveItemValuesCommand, "@CleanValue");
// provider ids // provider ids
_deleteProviderIdsCommand = _connection.CreateCommand(); _deleteProviderIdsCommand = _connection.CreateCommand();
@ -905,7 +908,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
UpdateUserDataKeys(item.Id, item.GetUserDataKeys().Distinct(StringComparer.OrdinalIgnoreCase).ToList(), transaction); UpdateUserDataKeys(item.Id, item.GetUserDataKeys().Distinct(StringComparer.OrdinalIgnoreCase).ToList(), transaction);
UpdateImages(item.Id, item.ImageInfos, transaction); UpdateImages(item.Id, item.ImageInfos, transaction);
UpdateProviderIds(item.Id, item.ProviderIds, transaction); UpdateProviderIds(item.Id, item.ProviderIds, transaction);
UpdateItemValues(item.Id, GetItemValues(item), transaction); UpdateItemValues(item.Id, GetItemValuesToSave(item), transaction);
} }
transaction.Commit(); transaction.Commit();
@ -2019,7 +2022,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
} }
if (string.Equals(name, ItemSortBy.SeriesDatePlayed, StringComparison.OrdinalIgnoreCase)) if (string.Equals(name, ItemSortBy.SeriesDatePlayed, StringComparison.OrdinalIgnoreCase))
{ {
return new Tuple<string, bool>("(Select MAX(LastPlayedDate) from TypedBaseItems B"+ GetJoinUserDataText(query) + " where B.Guid in (Select ItemId from AncestorIds where AncestorId in (select guid from typedbaseitems c where C.Type = 'MediaBrowser.Controller.Entities.TV.Series' And C.Guid in (Select AncestorId from AncestorIds where ItemId=A.Guid))))", false); return new Tuple<string, bool>("(Select MAX(LastPlayedDate) from TypedBaseItems B" + GetJoinUserDataText(query) + " where B.Guid in (Select ItemId from AncestorIds where AncestorId in (select guid from typedbaseitems c where C.Type = 'MediaBrowser.Controller.Entities.TV.Series' And C.Guid in (Select AncestorId from AncestorIds where ItemId=A.Guid))))", false);
} }
return new Tuple<string, bool>(name, false); return new Tuple<string, bool>(name, false);
@ -2245,7 +2248,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
} }
} }
private List<string> GetWhereClauses(InternalItemsQuery query, IDbCommand cmd) private List<string> GetWhereClauses(InternalItemsQuery query, IDbCommand cmd, string paramSuffix = "")
{ {
var whereClauses = new List<string>(); var whereClauses = new List<string>();
@ -2321,8 +2324,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
var includeTypes = query.IncludeItemTypes.SelectMany(MapIncludeItemTypes).ToArray(); var includeTypes = query.IncludeItemTypes.SelectMany(MapIncludeItemTypes).ToArray();
if (includeTypes.Length == 1) if (includeTypes.Length == 1)
{ {
whereClauses.Add("type=@type"); whereClauses.Add("type=@type" + paramSuffix);
cmd.Parameters.Add(cmd, "@type", DbType.String).Value = includeTypes[0]; cmd.Parameters.Add(cmd, "@type" + paramSuffix, DbType.String).Value = includeTypes[0];
} }
else if (includeTypes.Length > 1) else if (includeTypes.Length > 1)
{ {
@ -2626,8 +2629,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
var index = 0; var index = 0;
foreach (var artist in query.ArtistNames) foreach (var artist in query.ArtistNames)
{ {
clauses.Add("@ArtistName" + index + " in (select value from itemvalues where ItemId=Guid and Type <= 1)"); clauses.Add("@ArtistName" + index + " in (select CleanValue from itemvalues where ItemId=Guid and Type <= 1)");
cmd.Parameters.Add(cmd, "@ArtistName" + index, DbType.String).Value = artist; cmd.Parameters.Add(cmd, "@ArtistName" + index, DbType.String).Value = artist.RemoveDiacritics();
index++; index++;
} }
var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")"; var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")";
@ -2640,8 +2643,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
var index = 0; var index = 0;
foreach (var item in query.Genres) foreach (var item in query.Genres)
{ {
clauses.Add("@Genre" + index + " in (select value from itemvalues where ItemId=Guid and Type=2)"); clauses.Add("@Genre" + index + " in (select CleanValue from itemvalues where ItemId=Guid and Type=2)");
cmd.Parameters.Add(cmd, "@Genre" + index, DbType.String).Value = item; cmd.Parameters.Add(cmd, "@Genre" + index, DbType.String).Value = item.RemoveDiacritics();
index++; index++;
} }
var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")"; var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")";
@ -2654,8 +2657,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
var index = 0; var index = 0;
foreach (var item in query.Tags) foreach (var item in query.Tags)
{ {
clauses.Add("@Tag" + index + " in (select value from itemvalues where ItemId=Guid and Type=4)"); clauses.Add("@Tag" + index + " in (select CleanValue from itemvalues where ItemId=Guid and Type=4)");
cmd.Parameters.Add(cmd, "@Tag" + index, DbType.String).Value = item; cmd.Parameters.Add(cmd, "@Tag" + index, DbType.String).Value = item.RemoveDiacritics();
index++; index++;
} }
var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")"; var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")";
@ -2668,8 +2671,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
var index = 0; var index = 0;
foreach (var item in query.Studios) foreach (var item in query.Studios)
{ {
clauses.Add("@Studio" + index + " in (select value from itemvalues where ItemId=Guid and Type=3)"); clauses.Add("@Studio" + index + " in (select CleanValue from itemvalues where ItemId=Guid and Type=3)");
cmd.Parameters.Add(cmd, "@Studio" + index, DbType.String).Value = item; cmd.Parameters.Add(cmd, "@Studio" + index, DbType.String).Value = item.RemoveDiacritics();
index++; index++;
} }
var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")"; var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")";
@ -2682,8 +2685,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
var index = 0; var index = 0;
foreach (var item in query.Keywords) foreach (var item in query.Keywords)
{ {
clauses.Add("@Keyword" + index + " in (select value from itemvalues where ItemId=Guid and Type=5)"); clauses.Add("@Keyword" + index + " in (select CleanValue from itemvalues where ItemId=Guid and Type=5)");
cmd.Parameters.Add(cmd, "@Keyword" + index, DbType.String).Value = item; cmd.Parameters.Add(cmd, "@Keyword" + index, DbType.String).Value = item.RemoveDiacritics();
index++; index++;
} }
var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")"; var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")";
@ -2812,6 +2815,20 @@ namespace MediaBrowser.Server.Implementations.Persistence
whereClauses.Add("MediaType in (" + val + ")"); whereClauses.Add("MediaType in (" + val + ")");
} }
if (query.ItemIds.Length > 0)
{
var excludeIds = new List<string>();
var index = 0;
foreach (var id in query.ItemIds)
{
excludeIds.Add("Guid = @IncludeId" + index);
cmd.Parameters.Add(cmd, "@IncludeId" + index, DbType.Guid).Value = new Guid(id);
index++;
}
whereClauses.Add(string.Join(" OR ", excludeIds.ToArray()));
}
if (query.ExcludeItemIds.Length > 0) if (query.ExcludeItemIds.Length > 0)
{ {
var excludeIds = new List<string>(); var excludeIds = new List<string>();
@ -3478,7 +3495,292 @@ namespace MediaBrowser.Server.Implementations.Persistence
} }
} }
private List<Tuple<int, string>> GetItemValues(BaseItem item) public QueryResult<Tuple<BaseItem, ItemCounts>> GetArtists(InternalItemsQuery query)
{
return GetItemValues(query, 0, typeof(MusicArtist).FullName);
}
public QueryResult<Tuple<BaseItem, ItemCounts>> GetAlbumArtists(InternalItemsQuery query)
{
return GetItemValues(query, 1, typeof(MusicArtist).FullName);
}
public QueryResult<Tuple<BaseItem, ItemCounts>> GetStudios(InternalItemsQuery query)
{
return GetItemValues(query, 3, typeof(Studio).FullName);
}
public QueryResult<Tuple<BaseItem, ItemCounts>> GetGenres(InternalItemsQuery query)
{
return GetItemValues(query, 2, typeof(Genre).FullName);
}
public QueryResult<Tuple<BaseItem, ItemCounts>> GetGameGenres(InternalItemsQuery query)
{
return GetItemValues(query, 2, typeof(GameGenre).FullName);
}
public QueryResult<Tuple<BaseItem, ItemCounts>> GetMusicGenres(InternalItemsQuery query)
{
return GetItemValues(query, 2, typeof(MusicGenre).FullName);
}
private QueryResult<Tuple<BaseItem, ItemCounts>> GetItemValues(InternalItemsQuery query, int itemValueType, string returnType)
{
if (query == null)
{
throw new ArgumentNullException("query");
}
if (!query.Limit.HasValue)
{
query.EnableTotalRecordCount = false;
}
CheckDisposed();
var now = DateTime.UtcNow;
using (var cmd = _connection.CreateCommand())
{
var itemCountColumns = new List<Tuple<string, string>>();
var typesToCount = query.IncludeItemTypes.ToList();
if (typesToCount.Count == 0)
{
//typesToCount.Add("Item");
}
foreach (var type in typesToCount)
{
var itemCountColumnQuery = "Select Count(Value) from ItemValues where ItemValues.CleanValue=CleanName AND Type=@ItemValueType AND ItemId in (";
itemCountColumnQuery += "select guid" + GetFromText();
var typeSubQuery = new InternalItemsQuery(query.User)
{
ExcludeItemTypes = query.ExcludeItemTypes,
MediaTypes = query.MediaTypes,
AncestorIds = query.AncestorIds,
ExcludeItemIds = query.ExcludeItemIds,
ItemIds = query.ItemIds,
TopParentIds = query.TopParentIds,
ParentId = query.ParentId,
IsPlayed = query.IsPlayed
};
if (string.Equals(type, "Item", StringComparison.OrdinalIgnoreCase))
{
typeSubQuery.IncludeItemTypes = query.IncludeItemTypes;
}
else
{
typeSubQuery.IncludeItemTypes = new[] { type };
}
var whereClauses = GetWhereClauses(typeSubQuery, cmd, type);
var typeWhereText = whereClauses.Count == 0 ?
string.Empty :
" where " + string.Join(" AND ", whereClauses.ToArray());
itemCountColumnQuery += typeWhereText;
itemCountColumnQuery += ")";
var columnName = type + "Count";
itemCountColumns.Add(new Tuple<string, string>(columnName, "(" + itemCountColumnQuery + ") as " + columnName));
}
var columns = _retriveItemColumns.ToList();
columns.AddRange(itemCountColumns.Select(i => i.Item2).ToArray());
cmd.CommandText = "select " + string.Join(",", GetFinalColumnsToSelect(query, columns.ToArray(), cmd)) + GetFromText();
cmd.CommandText += GetJoinUserDataText(query);
var innerQuery = new InternalItemsQuery(query.User)
{
ExcludeItemTypes = query.ExcludeItemTypes,
IncludeItemTypes = query.IncludeItemTypes,
MediaTypes = query.MediaTypes,
AncestorIds = query.AncestorIds,
ExcludeItemIds = query.ExcludeItemIds,
ItemIds = query.ItemIds,
TopParentIds = query.TopParentIds,
ParentId = query.ParentId,
IsPlayed = query.IsPlayed
};
var innerWhereClauses = GetWhereClauses(innerQuery, cmd);
var innerWhereText = innerWhereClauses.Count == 0 ?
string.Empty :
" where " + string.Join(" AND ", innerWhereClauses.ToArray());
var whereText = " where Type=@SelectType";
whereText += " And CleanName In (Select CleanValue from ItemValues where Type=@ItemValueType AND ItemId in (select guid from TypedBaseItems" + innerWhereText + "))";
cmd.CommandText += whereText;
var outerQuery = new InternalItemsQuery(query.User)
{
IsFavorite = query.IsFavorite,
IsFavoriteOrLiked = query.IsFavoriteOrLiked,
IsLiked = query.IsLiked,
IsLocked = query.IsLocked,
NameLessThan = query.NameLessThan,
NameStartsWith = query.NameStartsWith,
NameStartsWithOrGreater = query.NameStartsWithOrGreater,
AlbumArtistStartsWithOrGreater = query.AlbumArtistStartsWithOrGreater,
Tags = query.Tags,
OfficialRatings = query.OfficialRatings,
Genres = query.GenreIds,
Years = query.Years
};
var outerWhereClauses = GetWhereClauses(outerQuery, cmd);
var outerWhereText = outerWhereClauses.Count == 0 ?
string.Empty :
" AND " + string.Join(" AND ", outerWhereClauses.ToArray());
cmd.CommandText += outerWhereText;
cmd.Parameters.Add(cmd, "@SelectType", DbType.String).Value = returnType;
cmd.Parameters.Add(cmd, "@ItemValueType", DbType.Int32).Value = itemValueType;
if (EnableJoinUserData(query))
{
cmd.Parameters.Add(cmd, "@UserId", DbType.Guid).Value = query.User.Id;
}
//cmd.CommandText += GetGroupBy(query);
cmd.CommandText += " group by PresentationUniqueKey";
cmd.CommandText += " order by SortName";
if (query.Limit.HasValue || query.StartIndex.HasValue)
{
var limit = query.Limit ?? int.MaxValue;
cmd.CommandText += " LIMIT " + limit.ToString(CultureInfo.InvariantCulture);
if (query.StartIndex.HasValue)
{
cmd.CommandText += " OFFSET " + query.StartIndex.Value.ToString(CultureInfo.InvariantCulture);
}
}
cmd.CommandText += ";";
var isReturningZeroItems = query.Limit.HasValue && query.Limit <= 0;
if (isReturningZeroItems)
{
cmd.CommandText = "";
}
if (query.EnableTotalRecordCount)
{
cmd.CommandText += "select count (guid)" + GetFromText();
cmd.CommandText += GetJoinUserDataText(query);
cmd.CommandText += whereText;
}
else
{
cmd.CommandText = cmd.CommandText.TrimEnd(';');
}
var list = new List<Tuple<BaseItem, ItemCounts>>();
var count = 0;
var commandBehavior = isReturningZeroItems || !query.EnableTotalRecordCount
? (CommandBehavior.SequentialAccess | CommandBehavior.SingleResult)
: CommandBehavior.SequentialAccess;
using (var reader = cmd.ExecuteReader(commandBehavior))
{
LogQueryTime("GetItemValues", cmd, now);
if (isReturningZeroItems)
{
if (reader.Read())
{
count = reader.GetInt32(0);
}
}
else
{
while (reader.Read())
{
var item = GetItem(reader);
if (item != null)
{
var countStartColumn = columns.Count - typesToCount.Count;
list.Add(new Tuple<BaseItem, ItemCounts>(item, GetItemCounts(reader, countStartColumn, typesToCount)));
}
}
if (reader.NextResult() && reader.Read())
{
count = reader.GetInt32(0);
}
}
}
if (count == 0)
{
count = list.Count;
}
return new QueryResult<Tuple<BaseItem, ItemCounts>>
{
Items = list.ToArray(),
TotalRecordCount = count
};
}
}
private ItemCounts GetItemCounts(IDataReader reader, int countStartColumn, List<string> typesToCount)
{
var counts = new ItemCounts();
for (var i = 0; i < typesToCount.Count; i++)
{
var value = reader.GetInt32(countStartColumn + i);
var type = typesToCount[i];
if (string.Equals(type, "Series", StringComparison.OrdinalIgnoreCase))
{
counts.SeriesCount = value;
}
else if (string.Equals(type, "Episode", StringComparison.OrdinalIgnoreCase))
{
counts.EpisodeCount = value;
}
else if (string.Equals(type, "Movie", StringComparison.OrdinalIgnoreCase))
{
counts.MovieCount = value;
}
else if (string.Equals(type, "MusicAlbum", StringComparison.OrdinalIgnoreCase))
{
counts.AlbumCount = value;
}
else if (string.Equals(type, "Audio", StringComparison.OrdinalIgnoreCase))
{
counts.SongCount = value;
}
else if (string.Equals(type, "Game", StringComparison.OrdinalIgnoreCase))
{
counts.GameCount = value;
}
counts.ItemCount += value;
}
return counts;
}
private List<Tuple<int, string>> GetItemValuesToSave(BaseItem item)
{ {
var list = new List<Tuple<int, string>>(); var list = new List<Tuple<int, string>>();
@ -3604,6 +3906,14 @@ namespace MediaBrowser.Server.Implementations.Persistence
_saveItemValuesCommand.GetParameter(0).Value = itemId; _saveItemValuesCommand.GetParameter(0).Value = itemId;
_saveItemValuesCommand.GetParameter(1).Value = pair.Item1; _saveItemValuesCommand.GetParameter(1).Value = pair.Item1;
_saveItemValuesCommand.GetParameter(2).Value = pair.Item2; _saveItemValuesCommand.GetParameter(2).Value = pair.Item2;
if (pair.Item2 == null)
{
_saveItemValuesCommand.GetParameter(3).Value = null;
}
else
{
_saveItemValuesCommand.GetParameter(3).Value = pair.Item2.RemoveDiacritics();
}
_saveItemValuesCommand.Transaction = transaction; _saveItemValuesCommand.Transaction = transaction;
_saveItemValuesCommand.ExecuteNonQuery(); _saveItemValuesCommand.ExecuteNonQuery();

View File

@ -4,7 +4,7 @@
<package id="Emby.XmlTv" version="1.0.0.53" targetFramework="net45" /> <package id="Emby.XmlTv" version="1.0.0.53" targetFramework="net45" />
<package id="ini-parser" version="2.3.0" targetFramework="net45" /> <package id="ini-parser" version="2.3.0" targetFramework="net45" />
<package id="Interfaces.IO" version="1.0.0.5" targetFramework="net45" /> <package id="Interfaces.IO" version="1.0.0.5" targetFramework="net45" />
<package id="MediaBrowser.Naming" version="1.0.0.51" targetFramework="net45" /> <package id="MediaBrowser.Naming" version="1.0.0.52" targetFramework="net45" />
<package id="Mono.Nat" version="1.2.24.0" targetFramework="net45" /> <package id="Mono.Nat" version="1.2.24.0" targetFramework="net45" />
<package id="morelinq" version="1.4.0" targetFramework="net45" /> <package id="morelinq" version="1.4.0" targetFramework="net45" />
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" /> <package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />

View File

@ -8,7 +8,6 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
public string FFProbeFilename { get; set; } public string FFProbeFilename { get; set; }
public string ArchiveType { get; set; } public string ArchiveType { get; set; }
public string[] DownloadUrls { get; set; } public string[] DownloadUrls { get; set; }
public bool IsEmbedded { get; set; }
public FFMpegInstallInfo() public FFMpegInstallInfo()
{ {

View File

@ -197,22 +197,6 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
private async Task DownloadFFMpeg(FFMpegInstallInfo downloadinfo, string directory, IProgress<double> progress) private async Task DownloadFFMpeg(FFMpegInstallInfo downloadinfo, string directory, IProgress<double> progress)
{ {
if (downloadinfo.IsEmbedded)
{
var tempFile = Path.Combine(_appPaths.TempDirectory, Guid.NewGuid().ToString());
_fileSystem.CreateDirectory(Path.GetDirectoryName(tempFile));
using (var stream = _ownerAssembly.GetManifestResourceStream(downloadinfo.DownloadUrls[0]))
{
using (var fs = _fileSystem.GetFileStream(tempFile, FileMode.Create, FileAccess.Write, FileShare.Read, true))
{
await stream.CopyToAsync(fs).ConfigureAwait(false);
}
}
ExtractFFMpeg(downloadinfo, tempFile, directory);
return;
}
foreach (var url in downloadinfo.DownloadUrls) foreach (var url in downloadinfo.DownloadUrls)
{ {
progress.Report(0); progress.Report(0);

View File

@ -160,7 +160,6 @@ namespace MediaBrowser.ServerApplication.Native
info.FFProbeFilename = "ffprobe.exe"; info.FFProbeFilename = "ffprobe.exe";
info.Version = "20160410"; info.Version = "20160410";
info.ArchiveType = "7z"; info.ArchiveType = "7z";
info.IsEmbedded = false;
info.DownloadUrls = GetDownloadUrls(); info.DownloadUrls = GetDownloadUrls();
return info; return info;
@ -214,15 +213,17 @@ namespace MediaBrowser.ServerApplication.Native
case Architecture.X86_X64: case Architecture.X86_X64:
return new[] return new[]
{ {
"https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/windows/ffmpeg-20160410-win64.7z",
"https://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-20160409-git-0c90b2e-win64-static.7z" "https://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-20160409-git-0c90b2e-win64-static.7z"
}; };
case Architecture.X86: case Architecture.X86:
return new[] return new[]
{ {
"https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/windows/ffmpeg-20160410-win32.7z",
"https://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20160409-git-0c90b2e-win32-static.7z" "https://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20160409-git-0c90b2e-win32-static.7z"
}; };
} }
return new string[] { }; return new string[] { };
} }
} }
} }