mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-04-20 17:14:42 +01:00
3.0.5666.2
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -2062,14 +2062,22 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
}
|
||||
}
|
||||
|
||||
public List<PersonInfo> GetPeople(BaseItem item)
|
||||
public List<PersonInfo> GetPeople(InternalPeopleQuery query)
|
||||
{
|
||||
return item.People ?? ItemRepository.GetPeople(item.Id);
|
||||
return ItemRepository.GetPeople(query);
|
||||
}
|
||||
|
||||
public List<Person> GetPeopleItems(BaseItem item)
|
||||
public List<PersonInfo> GetPeople(BaseItem item)
|
||||
{
|
||||
return ItemRepository.GetPeopleNames(item.Id).Select(i =>
|
||||
return item.People ?? GetPeople(new InternalPeopleQuery
|
||||
{
|
||||
ItemId = item.Id
|
||||
});
|
||||
}
|
||||
|
||||
public List<Person> GetPeopleItems(InternalPeopleQuery query)
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
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<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))
|
||||
|
||||
Reference in New Issue
Block a user