aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2015-07-08 12:10:34 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2015-07-08 12:10:34 -0400
commit0291df3193f6fd23806a6ec1e87bf1aa7ed49c25 (patch)
treeafc3c6c48119ea644f6111e2c3686e3aae3db637 /MediaBrowser.Server.Implementations
parentdfa17aec70652d8a21d43c889f08f8c0fd805d09 (diff)
3.0.5666.2
Diffstat (limited to 'MediaBrowser.Server.Implementations')
-rw-r--r--MediaBrowser.Server.Implementations/Dto/DtoService.cs35
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs24
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs23
-rw-r--r--MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs92
5 files changed, 142 insertions, 36 deletions
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
index d147777bd..bdc758d8e 100644
--- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs
+++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
@@ -132,13 +132,7 @@ namespace MediaBrowser.Server.Implementations.Dto
{
if (options.Fields.Contains(ItemFields.ItemCounts))
{
- var itemFilter = byName.GetItemFilter();
-
- var libraryItems = user != null ?
- user.RootFolder.GetRecursiveChildren(user, itemFilter) :
- _libraryManager.RootFolder.GetRecursiveChildren(itemFilter);
-
- SetItemByNameInfo(item, dto, libraryItems.ToList(), user);
+ SetItemByNameInfo(item, dto, GetTaggedItems(byName, user), user);
}
FillSyncInfo(dto, item, options, user, syncProgress);
@@ -150,6 +144,33 @@ namespace MediaBrowser.Server.Implementations.Dto
return dto;
}
+ private List<BaseItem> GetTaggedItems(IItemByName byName, User user)
+ {
+ var person = byName as Person;
+
+ if (person != null)
+ {
+ var items = _libraryManager.GetItems(new InternalItemsQuery
+ {
+ Person = byName.Name
+
+ }).Items;
+
+ if (user != null)
+ {
+ return items.Where(i => i.IsVisibleStandalone(user)).ToList();
+ }
+
+ return items.ToList();
+ }
+
+ var itemFilter = byName.GetItemFilter();
+
+ return user != null ?
+ user.RootFolder.GetRecursiveChildren(user, itemFilter).ToList() :
+ _libraryManager.RootFolder.GetRecursiveChildren(itemFilter).ToList();
+ }
+
private SyncedItemProgress[] GetSyncedItemProgress(DtoOptions options)
{
if (!options.Fields.Contains(ItemFields.SyncInfo))
diff --git a/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs b/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs
index 955c4ed2d..5558c24d7 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs
@@ -1,6 +1,6 @@
using MediaBrowser.Model.Logging;
using System;
-using System.Net;
+using System.Globalization;
using System.Text;
namespace MediaBrowser.Server.Implementations.HttpServer
@@ -23,7 +23,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
//log.AppendLine("Headers: " + string.Join(",", response.Headers.AllKeys.Select(k => k + "=" + response.Headers[k])));
- var responseTime = string.Format(". Response time: {0} ms.", duration.TotalMilliseconds);
+ var responseTime = string.Format(". Response time: {0} ms.", duration.TotalMilliseconds.ToString(CultureInfo.InvariantCulture));
var msg = "HTTP Response " + statusCode + " to " + endPoint + responseTime;
diff --git a/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs b/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs
index f19668d5d..db9841f9d 100644
--- a/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs
+++ b/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs
@@ -71,6 +71,12 @@ namespace MediaBrowser.Server.Implementations.Intros
var candidates = new List<ItemWithTrailer>();
+ var itemPeople = _libraryManager.GetPeople(item);
+ var allPeople = _libraryManager.GetPeople(new InternalPeopleQuery
+ {
+ AppearsInItemId = item.Id
+ });
+
if (config.EnableIntrosFromMoviesInLibrary)
{
var itemsWithTrailers = user.RootFolder
@@ -94,6 +100,8 @@ namespace MediaBrowser.Server.Implementations.Intros
Type = ItemWithTrailerType.ItemWithTrailer,
User = user,
WatchingItem = item,
+ WatchingItemPeople = itemPeople,
+ AllPeople = allPeople,
Random = random,
LibraryManager = _libraryManager
}));
@@ -135,6 +143,8 @@ namespace MediaBrowser.Server.Implementations.Intros
Type = ItemWithTrailerType.ChannelTrailer,
User = user,
WatchingItem = item,
+ WatchingItemPeople = itemPeople,
+ AllPeople = allPeople,
Random = random,
LibraryManager = _libraryManager
}));
@@ -241,7 +251,7 @@ namespace MediaBrowser.Server.Implementations.Intros
return true;
}
- internal static int GetSimiliarityScore(BaseItem item1, BaseItem item2, Random random, ILibraryManager libraryManager)
+ internal static int GetSimiliarityScore(BaseItem item1, List<PersonInfo> item1People, List<PersonInfo> allPeople, BaseItem item2, Random random, ILibraryManager libraryManager)
{
var points = 0;
@@ -262,11 +272,13 @@ namespace MediaBrowser.Server.Implementations.Intros
// Find common studios
points += item1.Studios.Where(i => item2.Studios.Contains(i, StringComparer.OrdinalIgnoreCase)).Sum(i => 5);
- var item2PeopleNames = libraryManager.GetPeople(item2).Select(i => i.Name)
- .Distinct(StringComparer.OrdinalIgnoreCase)
+ var item2PeopleNames = allPeople.Where(i => i.ItemId == item2.Id)
+ .Select(i => i.Name)
+ .Where(i => !string.IsNullOrWhiteSpace(i))
+ .DistinctNames()
.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
- points += libraryManager.GetPeople(item1).Where(i => item2PeopleNames.ContainsKey(i.Name)).Sum(i =>
+ points += item1People.Where(i => item2PeopleNames.ContainsKey(i.Name)).Sum(i =>
{
if (string.Equals(i.Type, PersonType.Director, StringComparison.OrdinalIgnoreCase) || string.Equals(i.Role, PersonType.Director, StringComparison.OrdinalIgnoreCase))
{
@@ -341,6 +353,8 @@ namespace MediaBrowser.Server.Implementations.Intros
internal ItemWithTrailerType Type;
internal User User;
internal BaseItem WatchingItem;
+ internal List<PersonInfo> WatchingItemPeople;
+ internal List<PersonInfo> AllPeople;
internal Random Random;
internal ILibraryManager LibraryManager;
@@ -364,7 +378,7 @@ namespace MediaBrowser.Server.Implementations.Intros
{
if (!_score.HasValue)
{
- _score = GetSimiliarityScore(WatchingItem, Item, Random, LibraryManager);
+ _score = GetSimiliarityScore(WatchingItem, WatchingItemPeople, AllPeople, Item, Random, LibraryManager);
}
return _score.Value;
}
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index a4be54f27..995a7fabd 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -2062,14 +2062,22 @@ namespace MediaBrowser.Server.Implementations.Library
}
}
+ public List<PersonInfo> GetPeople(InternalPeopleQuery query)
+ {
+ return ItemRepository.GetPeople(query);
+ }
+
public List<PersonInfo> GetPeople(BaseItem item)
{
- return item.People ?? ItemRepository.GetPeople(item.Id);
+ return item.People ?? GetPeople(new InternalPeopleQuery
+ {
+ ItemId = item.Id
+ });
}
- public List<Person> GetPeopleItems(BaseItem item)
+ public List<Person> GetPeopleItems(InternalPeopleQuery query)
{
- return ItemRepository.GetPeopleNames(item.Id).Select(i =>
+ return ItemRepository.GetPeopleNames(query).Select(i =>
{
try
{
@@ -2084,11 +2092,14 @@ namespace MediaBrowser.Server.Implementations.Library
}).Where(i => i != null).ToList();
}
+ public List<string> GetPeopleNames(InternalPeopleQuery query)
+ {
+ return ItemRepository.GetPeopleNames(query);
+ }
+
public List<PersonInfo> GetAllPeople()
{
- return RootFolder.GetRecursiveChildren()
- .SelectMany(GetPeople)
- .Where(i => !string.IsNullOrWhiteSpace(i.Name))
+ return GetPeople(new InternalPeopleQuery())
.DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase)
.ToList();
}
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
index a247bbbe3..cc4b7f074 100644
--- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
@@ -135,8 +135,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
_connection.RunQueries(queries, _logger);
- _connection.AddColumn(_logger, "TypedBaseItems", "Path", "Text");
- _connection.AddColumn(_logger, "TypedBaseItems", "StartDate", "DATETIME");
+ _connection.AddColumn(_logger, "TypedBaseItems", "Path", "Text");
+ _connection.AddColumn(_logger, "TypedBaseItems", "StartDate", "DATETIME");
_connection.AddColumn(_logger, "TypedBaseItems", "EndDate", "DATETIME");
_connection.AddColumn(_logger, "TypedBaseItems", "ChannelId", "Text");
_connection.AddColumn(_logger, "TypedBaseItems", "IsMovie", "BIT");
@@ -286,9 +286,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
_saveItemCommand.GetParameter(index++).Value = item.GetType().FullName;
_saveItemCommand.GetParameter(index++).Value = _jsonSerializer.SerializeToBytes(item);
- _saveItemCommand.GetParameter(index++).Value = item.Path;
+ _saveItemCommand.GetParameter(index++).Value = item.Path;
- var hasStartDate = item as IHasStartDate;
+ var hasStartDate = item as IHasStartDate;
if (hasStartDate != null)
{
_saveItemCommand.GetParameter(index++).Value = hasStartDate.StartDate;
@@ -329,7 +329,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
_saveItemCommand.GetParameter(index++).Value = item.ParentIndexNumber;
_saveItemCommand.GetParameter(index++).Value = item.PremiereDate;
_saveItemCommand.GetParameter(index++).Value = item.ProductionYear;
-
+
_saveItemCommand.Transaction = transaction;
_saveItemCommand.ExecuteNonQuery();
@@ -1009,7 +1009,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
_deletePeopleCommand.GetParameter(0).Value = id;
_deletePeopleCommand.Transaction = transaction;
_deletePeopleCommand.ExecuteNonQuery();
-
+
// Delete the item
_deleteItemCommand.GetParameter(0).Value = id;
_deleteItemCommand.Transaction = transaction;
@@ -1133,20 +1133,27 @@ namespace MediaBrowser.Server.Implementations.Persistence
return _mediaStreamsRepository.SaveMediaStreams(id, streams, cancellationToken);
}
- public List<string> GetPeopleNames(Guid itemId)
+ public List<string> GetPeopleNames(InternalPeopleQuery query)
{
- if (itemId == Guid.Empty)
+ if (query == null)
{
- throw new ArgumentNullException("itemId");
+ throw new ArgumentNullException("query");
}
CheckDisposed();
using (var cmd = _connection.CreateCommand())
{
- cmd.CommandText = "select Distinct Name from People where ItemId=@ItemId order by ListOrder";
+ cmd.CommandText = "select Distinct Name from People";
- cmd.Parameters.Add(cmd, "@ItemId", DbType.Guid).Value = itemId;
+ var whereClauses = GetPeopleWhereClauses(query, cmd);
+
+ if (whereClauses.Count > 0)
+ {
+ cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray());
+ }
+
+ cmd.CommandText += " order by ListOrder";
var list = new List<string>();
@@ -1162,20 +1169,27 @@ namespace MediaBrowser.Server.Implementations.Persistence
}
}
- public List<PersonInfo> GetPeople(Guid itemId)
+ public List<PersonInfo> GetPeople(InternalPeopleQuery query)
{
- if (itemId == Guid.Empty)
+ if (query == null)
{
- throw new ArgumentNullException("itemId");
+ throw new ArgumentNullException("query");
}
CheckDisposed();
using (var cmd = _connection.CreateCommand())
{
- cmd.CommandText = "select ItemId, Name, Role, PersonType, SortOrder from People where ItemId=@ItemId order by ListOrder";
+ cmd.CommandText = "select ItemId, Name, Role, PersonType, SortOrder from People";
+
+ var whereClauses = GetPeopleWhereClauses(query, cmd);
+
+ if (whereClauses.Count > 0)
+ {
+ cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray());
+ }
- cmd.Parameters.Add(cmd, "@ItemId", DbType.Guid).Value = itemId;
+ cmd.CommandText += " order by ListOrder";
var list = new List<PersonInfo>();
@@ -1191,6 +1205,51 @@ namespace MediaBrowser.Server.Implementations.Persistence
}
}
+ private List<string> GetPeopleWhereClauses(InternalPeopleQuery query, IDbCommand cmd)
+ {
+ var whereClauses = new List<string>();
+
+ if (query.ItemId != Guid.Empty)
+ {
+ whereClauses.Add("ItemId=@ItemId");
+ cmd.Parameters.Add(cmd, "@ItemId", DbType.Guid).Value = query.ItemId;
+ }
+ if (query.AppearsInItemId != Guid.Empty)
+ {
+ whereClauses.Add("Name in (Select Name from People where ItemId=@AppearsInItemId)");
+ cmd.Parameters.Add(cmd, "@AppearsInItemId", DbType.Guid).Value = query.AppearsInItemId;
+ }
+ if (query.PersonTypes.Count == 1)
+ {
+ whereClauses.Add("PersonType=@PersonType");
+ cmd.Parameters.Add(cmd, "@PersonType", DbType.String).Value = query.PersonTypes[0];
+ }
+ if (query.PersonTypes.Count > 1)
+ {
+ var val = string.Join(",", query.PersonTypes.Select(i => "'" + i + "'").ToArray());
+
+ whereClauses.Add("PersonType in (" + val + ")");
+ }
+ if (query.ExcludePersonTypes.Count == 1)
+ {
+ whereClauses.Add("PersonType<>@PersonType");
+ cmd.Parameters.Add(cmd, "@PersonType", DbType.String).Value = query.ExcludePersonTypes[0];
+ }
+ if (query.ExcludePersonTypes.Count > 1)
+ {
+ var val = string.Join(",", query.ExcludePersonTypes.Select(i => "'" + i + "'").ToArray());
+
+ whereClauses.Add("PersonType not in (" + val + ")");
+ }
+ if (query.MaxListOrder.HasValue)
+ {
+ whereClauses.Add("ListOrder<=@MaxListOrder");
+ cmd.Parameters.Add(cmd, "@MaxListOrder", DbType.Int32).Value = query.MaxListOrder.Value;
+ }
+
+ return whereClauses;
+ }
+
public async Task UpdatePeople(Guid itemId, List<PersonInfo> people)
{
if (itemId == Guid.Empty)
@@ -1277,6 +1336,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
{
var item = new PersonInfo();
+ item.ItemId = reader.GetGuid(0);
item.Name = reader.GetString(1);
if (!reader.IsDBNull(2))