Skip to content

Commit 56c36fe

Browse files
3.0.5666.2
1 parent aa9cc94 commit 56c36fe

36 files changed

+462
-250
lines changed

MediaBrowser.Api/BaseApiService.cs

+1-3
Original file line numberDiff line numberDiff line change
@@ -344,9 +344,7 @@ protected string DeSlugPersonName(string name, ILibraryManager libraryManager)
344344
return name;
345345
}
346346

347-
return libraryManager.GetAllPeople()
348-
.Select(i => i.Name)
349-
.DistinctNames()
347+
return libraryManager.GetPeopleNames(new InternalPeopleQuery())
350348
.FirstOrDefault(i =>
351349
{
352350
i = _dashReplaceChars.Aggregate(i, (current, c) => current.Replace(c, SlugChar));

MediaBrowser.Api/Movies/MoviesService.cs

+32-12
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public async Task<object> Get(GetMovieRecommendations request)
165165
return ToOptimizedResult(result);
166166
}
167167

168-
private async Task<ItemsResult> GetSimilarItemsResult(BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, BaseItem, ILibraryManager, int> getSimilarityScore)
168+
private async Task<ItemsResult> GetSimilarItemsResult(BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, List<PersonInfo>, List<PersonInfo>, BaseItem, int> getSimilarityScore)
169169
{
170170
var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
171171

@@ -358,12 +358,15 @@ private IEnumerable<RecommendationDto> GetWithDirector(User user, List<BaseItem>
358358

359359
private IEnumerable<RecommendationDto> GetWithActor(User user, List<BaseItem> allMovies, IEnumerable<string> names, int itemLimit, DtoOptions dtoOptions, RecommendationType type)
360360
{
361-
var userId = user.Id;
362-
363361
foreach (var name in names)
364362
{
363+
var itemsWithActor = _libraryManager.GetItemIds(new InternalItemsQuery
364+
{
365+
Person = name
366+
});
367+
365368
var items = allMovies
366-
.Where(i => _libraryManager.GetPeople(i).Any(p => string.Equals(p.Name, name, StringComparison.OrdinalIgnoreCase)))
369+
.Where(i => itemsWithActor.Contains(i.Id))
367370
.Take(itemLimit)
368371
.ToList();
369372

@@ -382,8 +385,6 @@ private IEnumerable<RecommendationDto> GetWithActor(User user, List<BaseItem> al
382385

383386
private IEnumerable<RecommendationDto> GetSimilarTo(User user, List<BaseItem> allMovies, IEnumerable<BaseItem> baselineItems, int itemLimit, DtoOptions dtoOptions, RecommendationType type)
384387
{
385-
var userId = user.Id;
386-
387388
foreach (var item in baselineItems)
388389
{
389390
var similar = SimilarItemsHelper
@@ -406,18 +407,37 @@ private IEnumerable<RecommendationDto> GetSimilarTo(User user, List<BaseItem> al
406407

407408
private IEnumerable<string> GetActors(IEnumerable<BaseItem> items)
408409
{
409-
// Get the two leading actors for all movies
410-
return items
411-
.SelectMany(i => _libraryManager.GetPeople(i).Where(p => !string.Equals(PersonType.Director, p.Type, StringComparison.OrdinalIgnoreCase)).Take(2))
410+
var people = _libraryManager.GetPeople(new InternalPeopleQuery
411+
{
412+
ExcludePersonTypes = new List<string>
413+
{
414+
PersonType.Director
415+
},
416+
MaxListOrder = 3
417+
});
418+
419+
var itemIds = items.Select(i => i.Id).ToList();
420+
421+
return people
422+
.Where(i => itemIds.Contains(i.ItemId))
412423
.Select(i => i.Name)
413424
.DistinctNames();
414425
}
415426

416427
private IEnumerable<string> GetDirectors(IEnumerable<BaseItem> items)
417428
{
418-
return items
419-
.Select(i => _libraryManager.GetPeople(i).FirstOrDefault(p => string.Equals(PersonType.Director, p.Type, StringComparison.OrdinalIgnoreCase)))
420-
.Where(i => i != null)
429+
var people = _libraryManager.GetPeople(new InternalPeopleQuery
430+
{
431+
PersonTypes = new List<string>
432+
{
433+
PersonType.Director
434+
}
435+
});
436+
437+
var itemIds = items.Select(i => i.Id).ToList();
438+
439+
return people
440+
.Where(i => itemIds.Contains(i.ItemId))
421441
.Select(i => i.Name)
422442
.DistinctNames();
423443
}

MediaBrowser.Api/Music/AlbumsService.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using MediaBrowser.Controller.Persistence;
77
using ServiceStack;
88
using System;
9+
using System.Collections.Generic;
910
using System.Linq;
1011

1112
namespace MediaBrowser.Api.Music
@@ -68,12 +69,13 @@ public object Get(GetSimilarAlbums request)
6869
/// Gets the album similarity score.
6970
/// </summary>
7071
/// <param name="item1">The item1.</param>
72+
/// <param name="item1People">The item1 people.</param>
73+
/// <param name="allPeople">All people.</param>
7174
/// <param name="item2">The item2.</param>
72-
/// <param name="libraryManager">The library manager.</param>
7375
/// <returns>System.Int32.</returns>
74-
private int GetAlbumSimilarityScore(BaseItem item1, BaseItem item2, ILibraryManager libraryManager)
76+
private int GetAlbumSimilarityScore(BaseItem item1, List<PersonInfo> item1People, List<PersonInfo> allPeople, BaseItem item2)
7577
{
76-
var points = SimilarItemsHelper.GetSimiliarityScore(item1, item2, libraryManager);
78+
var points = SimilarItemsHelper.GetSimiliarityScore(item1, item1People, allPeople, item2);
7779

7880
var album1 = (MusicAlbum)item1;
7981
var album2 = (MusicAlbum)item2;

MediaBrowser.Api/Playback/BaseStreamingService.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,7 @@ protected string GetOutputSizeParam(StreamState state,
632632
{
633633
var maxHeightParam = request.MaxHeight.Value.ToString(UsCulture);
634634

635-
filters.Add(string.Format("scale=trunc(oh*a*2)/2:min(ih\\,{0})", maxHeightParam));
635+
filters.Add(string.Format("scale=trunc(oh*a/2)*2:min(ih\\,{0})", maxHeightParam));
636636
}
637637

638638
if (string.Equals(outputVideoCodec, "h264_qsv", StringComparison.OrdinalIgnoreCase))

MediaBrowser.Api/SimilarItemsHelper.cs

+15-6
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public static class SimilarItemsHelper
6868
/// <param name="includeInSearch">The include in search.</param>
6969
/// <param name="getSimilarityScore">The get similarity score.</param>
7070
/// <returns>ItemsResult.</returns>
71-
internal static ItemsResult GetSimilarItemsResult(DtoOptions dtoOptions, IUserManager userManager, IItemRepository itemRepository, ILibraryManager libraryManager, IUserDataManager userDataRepository, IDtoService dtoService, ILogger logger, BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, BaseItem, ILibraryManager, int> getSimilarityScore)
71+
internal static ItemsResult GetSimilarItemsResult(DtoOptions dtoOptions, IUserManager userManager, IItemRepository itemRepository, ILibraryManager libraryManager, IUserDataManager userDataRepository, IDtoService dtoService, ILogger logger, BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, List<PersonInfo>, List<PersonInfo>, BaseItem, int> getSimilarityScore)
7272
{
7373
var user = !string.IsNullOrWhiteSpace(request.UserId) ? userManager.GetUserById(request.UserId) : null;
7474

@@ -110,12 +110,17 @@ internal static ItemsResult GetSimilarItemsResult(DtoOptions dtoOptions, IUserMa
110110
/// <param name="inputItems">The input items.</param>
111111
/// <param name="getSimilarityScore">The get similarity score.</param>
112112
/// <returns>IEnumerable{BaseItem}.</returns>
113-
internal static IEnumerable<BaseItem> GetSimilaritems(BaseItem item, ILibraryManager libraryManager, IEnumerable<BaseItem> inputItems, Func<BaseItem, BaseItem, ILibraryManager, int> getSimilarityScore)
113+
internal static IEnumerable<BaseItem> GetSimilaritems(BaseItem item, ILibraryManager libraryManager, IEnumerable<BaseItem> inputItems, Func<BaseItem, List<PersonInfo>, List<PersonInfo>, BaseItem, int> getSimilarityScore)
114114
{
115115
var itemId = item.Id;
116116
inputItems = inputItems.Where(i => i.Id != itemId);
117+
var itemPeople = libraryManager.GetPeople(item);
118+
var allPeople = libraryManager.GetPeople(new InternalPeopleQuery
119+
{
120+
AppearsInItemId = item.Id
121+
});
117122

118-
return inputItems.Select(i => new Tuple<BaseItem, int>(i, getSimilarityScore(item, i, libraryManager)))
123+
return inputItems.Select(i => new Tuple<BaseItem, int>(i, getSimilarityScore(item, itemPeople, allPeople, i)))
119124
.Where(i => i.Item2 > 2)
120125
.OrderByDescending(i => i.Item2)
121126
.Select(i => i.Item1);
@@ -147,9 +152,11 @@ private static IEnumerable<string> GetKeywords(BaseItem item)
147152
/// Gets the similiarity score.
148153
/// </summary>
149154
/// <param name="item1">The item1.</param>
155+
/// <param name="item1People">The item1 people.</param>
156+
/// <param name="allPeople">All people.</param>
150157
/// <param name="item2">The item2.</param>
151158
/// <returns>System.Int32.</returns>
152-
internal static int GetSimiliarityScore(BaseItem item1, BaseItem item2, ILibraryManager libraryManager)
159+
internal static int GetSimiliarityScore(BaseItem item1, List<PersonInfo> item1People, List<PersonInfo> allPeople, BaseItem item2)
153160
{
154161
var points = 0;
155162

@@ -170,11 +177,13 @@ internal static int GetSimiliarityScore(BaseItem item1, BaseItem item2, ILibrary
170177
// Find common studios
171178
points += item1.Studios.Where(i => item2.Studios.Contains(i, StringComparer.OrdinalIgnoreCase)).Sum(i => 3);
172179

173-
var item2PeopleNames = libraryManager.GetPeople(item2).Select(i => i.Name)
180+
var item2PeopleNames = allPeople.Where(i => i.ItemId == item2.Id)
181+
.Select(i => i.Name)
182+
.Where(i => !string.IsNullOrWhiteSpace(i))
174183
.DistinctNames()
175184
.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
176185

177-
points += libraryManager.GetPeople(item1).Where(i => item2PeopleNames.ContainsKey(i.Name)).Sum(i =>
186+
points += item1People.Where(i => item2PeopleNames.ContainsKey(i.Name)).Sum(i =>
178187
{
179188
if (string.Equals(i.Type, PersonType.Director, StringComparison.OrdinalIgnoreCase) || string.Equals(i.Role, PersonType.Director, StringComparison.OrdinalIgnoreCase))
180189
{

MediaBrowser.Api/UserLibrary/PersonsService.cs

+6-9
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using MediaBrowser.Controller.Persistence;
66
using MediaBrowser.Model.Dto;
77
using ServiceStack;
8-
using System;
98
using System.Collections.Generic;
109
using System.Linq;
1110

@@ -151,18 +150,16 @@ protected override IEnumerable<Person> GetAllItems(GetItemsByName request, IEnum
151150
/// <param name="itemsList">The items list.</param>
152151
/// <param name="personTypes">The person types.</param>
153152
/// <returns>IEnumerable{PersonInfo}.</returns>
154-
private IEnumerable<PersonInfo> GetAllPeople(IEnumerable<BaseItem> itemsList, string[] personTypes)
153+
private IEnumerable<PersonInfo> GetAllPeople(IEnumerable<BaseItem> itemsList, IEnumerable<string> personTypes)
155154
{
156-
var people = itemsList.SelectMany(i => LibraryManager.GetPeople(i).OrderBy(p => p.SortOrder ?? int.MaxValue).ThenBy(p => p.Type));
155+
var allIds = itemsList.Select(i => i.Id).ToList();
157156

158-
if (personTypes.Length > 0)
157+
var allPeople = LibraryManager.GetPeople(new InternalPeopleQuery
159158
{
160-
people = people.Where(p =>
161-
personTypes.Contains(p.Type ?? string.Empty, StringComparer.OrdinalIgnoreCase) ||
162-
personTypes.Contains(p.Role ?? string.Empty, StringComparer.OrdinalIgnoreCase));
163-
}
159+
PersonTypes = personTypes.ToList()
160+
});
164161

165-
return people;
162+
return allPeople.Where(i => allIds.Contains(i.ItemId)).OrderBy(p => p.SortOrder ?? int.MaxValue).ThenBy(p => p.Type);
166163
}
167164
}
168165
}

MediaBrowser.Common.Implementations/Logging/NlogManager.cs

+7
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,13 @@ private void UpdateLogLevel(LogSeverity newLevel)
8585
{
8686
rule.EnableLoggingForLevel(level);
8787
}
88+
foreach (var lev in rule.Levels.ToArray())
89+
{
90+
if (lev < level)
91+
{
92+
rule.DisableLoggingForLevel(lev);
93+
}
94+
}
8895
}
8996
}
9097

MediaBrowser.Controller/Entities/IItemByName.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace MediaBrowser.Controller.Entities
66
/// <summary>
77
/// Marker interface
88
/// </summary>
9-
public interface IItemByName
9+
public interface IItemByName : IHasMetadata
1010
{
1111
/// <summary>
1212
/// Gets the tagged items.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace MediaBrowser.Controller.Entities
5+
{
6+
public class InternalPeopleQuery
7+
{
8+
public Guid ItemId { get; set; }
9+
public List<string> PersonTypes { get; set; }
10+
public List<string> ExcludePersonTypes { get; set; }
11+
public int? MaxListOrder { get; set; }
12+
public Guid AppearsInItemId { get; set; }
13+
14+
public InternalPeopleQuery()
15+
{
16+
PersonTypes = new List<string>();
17+
ExcludePersonTypes = new List<string>();
18+
}
19+
}
20+
}

MediaBrowser.Controller/Entities/Person.cs

+2
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ public override bool SupportsPeople
9999
/// </summary>
100100
public class PersonInfo
101101
{
102+
public Guid ItemId { get; set; }
103+
102104
/// <summary>
103105
/// Gets or sets the name.
104106
/// </summary>

MediaBrowser.Controller/Entities/UserViewBuilder.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1698,7 +1698,7 @@ public static bool Filter(BaseItem item, User user, InternalItemsQuery query, IU
16981698
.Select(libraryManager.GetItemById)
16991699
.Select(i => i == null ? "-1" : i.Name)
17001700
.ToList();
1701-
1701+
17021702
if (!(names.Any(v => libraryManager.GetPeople(item).Select(i => i.Name).Contains(v, StringComparer.OrdinalIgnoreCase))))
17031703
{
17041704
return false;

MediaBrowser.Controller/Library/ILibraryManager.cs

+16-2
Original file line numberDiff line numberDiff line change
@@ -420,12 +420,19 @@ IEnumerable<Video> FindExtras(BaseItem owner, List<FileSystemInfo> fileSystemChi
420420
/// <returns>List&lt;PersonInfo&gt;.</returns>
421421
List<PersonInfo> GetPeople(BaseItem item);
422422

423+
/// <summary>
424+
/// Gets the people.
425+
/// </summary>
426+
/// <param name="query">The query.</param>
427+
/// <returns>List&lt;PersonInfo&gt;.</returns>
428+
List<PersonInfo> GetPeople(InternalPeopleQuery query);
429+
423430
/// <summary>
424431
/// Gets the people items.
425432
/// </summary>
426-
/// <param name="item">The item.</param>
433+
/// <param name="query">The query.</param>
427434
/// <returns>List&lt;Person&gt;.</returns>
428-
List<Person> GetPeopleItems(BaseItem item);
435+
List<Person> GetPeopleItems(InternalPeopleQuery query);
429436

430437
/// <summary>
431438
/// Gets all people names.
@@ -447,5 +454,12 @@ IEnumerable<Video> FindExtras(BaseItem owner, List<FileSystemInfo> fileSystemChi
447454
/// <param name="query">The query.</param>
448455
/// <returns>List&lt;Guid&gt;.</returns>
449456
List<Guid> GetItemIds(InternalItemsQuery query);
457+
458+
/// <summary>
459+
/// Gets the people names.
460+
/// </summary>
461+
/// <param name="query">The query.</param>
462+
/// <returns>List&lt;System.String&gt;.</returns>
463+
List<string> GetPeopleNames(InternalPeopleQuery query);
450464
}
451465
}

MediaBrowser.Controller/MediaBrowser.Controller.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@
166166
<Compile Include="Entities\ImageSourceInfo.cs" />
167167
<Compile Include="Entities\IMetadataContainer.cs" />
168168
<Compile Include="Entities\InternalItemsQuery.cs" />
169+
<Compile Include="Entities\InternalPeopleQuery.cs" />
169170
<Compile Include="Entities\ISupportsBoxSetGrouping.cs" />
170171
<Compile Include="Entities\ISupportsPlaceHolders.cs" />
171172
<Compile Include="Entities\ItemImageInfo.cs" />

MediaBrowser.Controller/Persistence/IItemRepository.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,9 @@ public interface IItemRepository : IRepository
151151
/// <summary>
152152
/// Gets the people.
153153
/// </summary>
154-
/// <param name="itemId">The item identifier.</param>
154+
/// <param name="query">The query.</param>
155155
/// <returns>List&lt;PersonInfo&gt;.</returns>
156-
List<PersonInfo> GetPeople(Guid itemId);
156+
List<PersonInfo> GetPeople(InternalPeopleQuery query);
157157

158158
/// <summary>
159159
/// Updates the people.
@@ -166,9 +166,9 @@ public interface IItemRepository : IRepository
166166
/// <summary>
167167
/// Gets the people names.
168168
/// </summary>
169-
/// <param name="itemId">The item identifier.</param>
169+
/// <param name="query">The query.</param>
170170
/// <returns>List&lt;System.String&gt;.</returns>
171-
List<string> GetPeopleNames(Guid itemId);
171+
List<string> GetPeopleNames(InternalPeopleQuery query);
172172
}
173173
}
174174

0 commit comments

Comments
 (0)