|
@@ -127,7 +127,7 @@ namespace MediaBrowser.Controller.Entities
|
|
|
/// <returns>IEnumerable{BaseItem}.</returns>
|
|
|
protected IEnumerable<BaseItem> GetIndexByPerformer(User user)
|
|
|
{
|
|
|
- return GetIndexByPerson(user, new List<string> { PersonType.Actor, PersonType.MusicArtist, PersonType.GuestStar }, LocalizedStrings.Instance.GetString("PerformerDispPref"));
|
|
|
+ return GetIndexByPerson(user, new List<string> { PersonType.Actor, PersonType.GuestStar }, true, LocalizedStrings.Instance.GetString("PerformerDispPref"));
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -137,7 +137,7 @@ namespace MediaBrowser.Controller.Entities
|
|
|
/// <returns>IEnumerable{BaseItem}.</returns>
|
|
|
protected IEnumerable<BaseItem> GetIndexByDirector(User user)
|
|
|
{
|
|
|
- return GetIndexByPerson(user, new List<string> { PersonType.Director }, LocalizedStrings.Instance.GetString("DirectorDispPref"));
|
|
|
+ return GetIndexByPerson(user, new List<string> { PersonType.Director }, false, LocalizedStrings.Instance.GetString("DirectorDispPref"));
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -145,9 +145,10 @@ namespace MediaBrowser.Controller.Entities
|
|
|
/// </summary>
|
|
|
/// <param name="user">The user.</param>
|
|
|
/// <param name="personTypes">The person types we should match on</param>
|
|
|
+ /// <param name="includeAudio">if set to <c>true</c> [include audio].</param>
|
|
|
/// <param name="indexName">Name of the index.</param>
|
|
|
/// <returns>IEnumerable{BaseItem}.</returns>
|
|
|
- protected IEnumerable<BaseItem> GetIndexByPerson(User user, List<string> personTypes, string indexName)
|
|
|
+ private IEnumerable<BaseItem> GetIndexByPerson(User user, List<string> personTypes, bool includeAudio, string indexName)
|
|
|
{
|
|
|
|
|
|
// Even though this implementation means multiple iterations over the target list - it allows us to defer
|
|
@@ -158,9 +159,12 @@ namespace MediaBrowser.Controller.Entities
|
|
|
var currentIndexName = indexName;
|
|
|
|
|
|
var us = this;
|
|
|
- var candidates = RecursiveChildren.Where(i => i.IncludeInIndex && i.AllPeople != null).ToList();
|
|
|
+ var recursiveChildren = GetRecursiveChildren(user).Where(i => i.IncludeInIndex).ToList();
|
|
|
|
|
|
- return candidates.AsParallel().SelectMany(i => i.AllPeople.Where(p => personTypes.Contains(p.Type))
|
|
|
+ // Get the candidates, but handle audio separately
|
|
|
+ var candidates = recursiveChildren.Where(i => i.AllPeople != null && !(i is Audio.Audio)).ToList();
|
|
|
+
|
|
|
+ var indexFolders = candidates.AsParallel().SelectMany(i => i.AllPeople.Where(p => personTypes.Contains(p.Type))
|
|
|
.Select(a => a.Name))
|
|
|
.Distinct()
|
|
|
.Select(i =>
|
|
@@ -183,8 +187,38 @@ namespace MediaBrowser.Controller.Entities
|
|
|
.Where(i => i != null)
|
|
|
.Select(a => new IndexFolder(us, a,
|
|
|
candidates.Where(i => i.AllPeople.Any(p => personTypes.Contains(p.Type) && p.Name.Equals(a.Name, StringComparison.OrdinalIgnoreCase))
|
|
|
- ), currentIndexName));
|
|
|
+ ), currentIndexName)).AsEnumerable();
|
|
|
+
|
|
|
+ if (includeAudio)
|
|
|
+ {
|
|
|
+ var songs = recursiveChildren.OfType<Audio.Audio>().ToList();
|
|
|
+
|
|
|
+ indexFolders = songs.SelectMany(i => i.Artists)
|
|
|
+ .Distinct()
|
|
|
+ .Select(i =>
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ return LibraryManager.GetArtist(i).Result;
|
|
|
+ }
|
|
|
+ catch (IOException ex)
|
|
|
+ {
|
|
|
+ Logger.ErrorException("Error getting artist {0}", ex, i);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ catch (AggregateException ex)
|
|
|
+ {
|
|
|
+ Logger.ErrorException("Error getting artist {0}", ex, i);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .Where(i => i != null)
|
|
|
+ .Select(a => new IndexFolder(us, a,
|
|
|
+ songs.Where(i => i.Artists.Contains(a.Name, StringComparer.OrdinalIgnoreCase)
|
|
|
+ ), currentIndexName)).Concat(indexFolders);
|
|
|
+ }
|
|
|
|
|
|
+ return indexFolders;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -201,7 +235,7 @@ namespace MediaBrowser.Controller.Entities
|
|
|
{
|
|
|
var indexName = LocalizedStrings.Instance.GetString("StudioDispPref");
|
|
|
|
|
|
- var candidates = RecursiveChildren.Where(i => i.IncludeInIndex && i.Studios != null).ToList();
|
|
|
+ var candidates = GetRecursiveChildren(user).Where(i => i.IncludeInIndex && i.Studios != null).ToList();
|
|
|
|
|
|
return candidates.AsParallel().SelectMany(i => i.Studios)
|
|
|
.Distinct()
|
|
@@ -241,7 +275,7 @@ namespace MediaBrowser.Controller.Entities
|
|
|
var indexName = LocalizedStrings.Instance.GetString("GenreDispPref");
|
|
|
|
|
|
//we need a copy of this so we don't double-recurse
|
|
|
- var candidates = RecursiveChildren.Where(i => i.IncludeInIndex && i.Genres != null).ToList();
|
|
|
+ var candidates = GetRecursiveChildren(user).Where(i => i.IncludeInIndex && i.Genres != null).ToList();
|
|
|
|
|
|
return candidates.AsParallel().SelectMany(i => i.Genres)
|
|
|
.Distinct()
|
|
@@ -282,7 +316,7 @@ namespace MediaBrowser.Controller.Entities
|
|
|
var indexName = LocalizedStrings.Instance.GetString("YearDispPref");
|
|
|
|
|
|
//we need a copy of this so we don't double-recurse
|
|
|
- var candidates = RecursiveChildren.Where(i => i.IncludeInIndex && i.ProductionYear.HasValue).ToList();
|
|
|
+ var candidates = GetRecursiveChildren(user).Where(i => i.IncludeInIndex && i.ProductionYear.HasValue).ToList();
|
|
|
|
|
|
return candidates.AsParallel().Select(i => i.ProductionYear.Value)
|
|
|
.Distinct()
|