| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Linq;
 
- namespace MediaBrowser.Model.Entities
 
- {
 
-     public class Folder : BaseItem
 
-     {
 
-         public override bool IsFolder
 
-         {
 
-             get
 
-             {
 
-                 return true;
 
-             }
 
-         }
 
-         public bool IsRoot { get; set; }
 
-         public bool IsVirtualFolder
 
-         {
 
-             get
 
-             {
 
-                 return Parent != null && Parent.IsRoot;
 
-             }
 
-         }
 
-         public IEnumerable<BaseItem> Children { get; set; }
 
-         /// <summary>
 
-         /// Gets allowed children of an item
 
-         /// </summary>
 
-         public IEnumerable<BaseItem> GetParentalAllowedChildren(User user)
 
-         {
 
-             return Children.Where(c => c.IsParentalAllowed(user));
 
-         }
 
-         /// <summary>
 
-         /// Gets allowed recursive children of an item
 
-         /// </summary>
 
-         public IEnumerable<BaseItem> GetParentalAllowedRecursiveChildren(User user)
 
-         {
 
-             foreach (var item in GetParentalAllowedChildren(user))
 
-             {
 
-                 yield return item;
 
-                 var subFolder = item as Folder;
 
-                 if (subFolder != null)
 
-                 {
 
-                     foreach (var subitem in subFolder.GetParentalAllowedRecursiveChildren(user))
 
-                     {
 
-                         yield return subitem;
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// Since it can be slow to make all of these calculations at once, this method will provide a way to get them all back together
 
-         /// </summary>
 
-         public ItemSpecialCounts GetSpecialCounts(User user)
 
-         {
 
-             ItemSpecialCounts counts = new ItemSpecialCounts();
 
-             IEnumerable<BaseItem> recursiveChildren = GetParentalAllowedRecursiveChildren(user);
 
-             counts.RecentlyAddedItemCount = GetRecentlyAddedItems(recursiveChildren, user).Count();
 
-             counts.RecentlyAddedUnPlayedItemCount = GetRecentlyAddedUnplayedItems(recursiveChildren, user).Count();
 
-             counts.InProgressItemCount = GetInProgressItems(recursiveChildren, user).Count();
 
-             counts.PlayedPercentage = GetPlayedPercentage(recursiveChildren, user);
 
-             return counts;
 
-         }
 
-         /// <summary>
 
-         /// Finds all recursive items within a top-level parent that contain the given genre and are allowed for the current user
 
-         /// </summary>
 
-         public IEnumerable<BaseItem> GetItemsWithGenre(string genre, User user)
 
-         {
 
-             return GetParentalAllowedRecursiveChildren(user).Where(f => f.Genres != null && f.Genres.Any(s => s.Equals(genre, StringComparison.OrdinalIgnoreCase)));
 
-         }
 
-         /// <summary>
 
-         /// Finds all recursive items within a top-level parent that contain the given year and are allowed for the current user
 
-         /// </summary>
 
-         public IEnumerable<BaseItem> GetItemsWithYear(int year, User user)
 
-         {
 
-             return GetParentalAllowedRecursiveChildren(user).Where(f => f.ProductionYear.HasValue && f.ProductionYear == year);
 
-         }
 
-         /// <summary>
 
-         /// Finds all recursive items within a top-level parent that contain the given studio and are allowed for the current user
 
-         /// </summary>
 
-         public IEnumerable<BaseItem> GetItemsWithStudio(string studio, User user)
 
-         {
 
-             return GetParentalAllowedRecursiveChildren(user).Where(f => f.Studios != null && f.Studios.Any(s => s.Equals(studio, StringComparison.OrdinalIgnoreCase)));
 
-         }
 
-         /// <summary>
 
-         /// Finds all recursive items within a top-level parent that contain the given person and are allowed for the current user
 
-         /// </summary>
 
-         public IEnumerable<BaseItem> GetItemsWithPerson(string person, User user)
 
-         {
 
-             return GetParentalAllowedRecursiveChildren(user).Where(c =>
 
-             {
 
-                 if (c.People != null)
 
-                 {
 
-                     return c.People.ContainsKey(person);
 
-                 }
 
-                 return false;
 
-             });
 
-         }
 
-         /// <summary>
 
-         /// Finds all recursive items within a top-level parent that contain the given person and are allowed for the current user
 
-         /// </summary>
 
-         /// <param name="personType">Specify this to limit results to a specific PersonType</param>
 
-         public IEnumerable<BaseItem> GetItemsWithPerson(string person, string personType, User user)
 
-         {
 
-             return GetParentalAllowedRecursiveChildren(user).Where(c =>
 
-             {
 
-                 if (c.People != null)
 
-                 {
 
-                     return c.People.ContainsKey(person) && c.People[person].Type.Equals(personType, StringComparison.OrdinalIgnoreCase);
 
-                 }
 
-                 return false;
 
-             });
 
-         }
 
-         /// <summary>
 
-         /// Gets all recently added items (recursive) within a folder, based on configuration and parental settings
 
-         /// </summary>
 
-         public IEnumerable<BaseItem> GetRecentlyAddedItems(User user)
 
-         {
 
-             return GetRecentlyAddedItems(GetParentalAllowedRecursiveChildren(user), user);
 
-         }
 
-         /// <summary>
 
-         /// Gets all recently added unplayed items (recursive) within a folder, based on configuration and parental settings
 
-         /// </summary>
 
-         public IEnumerable<BaseItem> GetRecentlyAddedUnplayedItems(User user)
 
-         {
 
-             return GetRecentlyAddedUnplayedItems(GetParentalAllowedRecursiveChildren(user), user);
 
-         }
 
-         /// <summary>
 
-         /// Gets all in-progress items (recursive) within a folder
 
-         /// </summary>
 
-         public IEnumerable<BaseItem> GetInProgressItems(User user)
 
-         {
 
-             return GetInProgressItems(GetParentalAllowedRecursiveChildren(user), user);
 
-         }
 
-         private static IEnumerable<BaseItem> GetRecentlyAddedItems(IEnumerable<BaseItem> itemSet, User user)
 
-         {
 
-             return itemSet.Where(i => !(i.IsFolder) && i.IsRecentlyAdded(user));
 
-         }
 
-         private static IEnumerable<BaseItem> GetRecentlyAddedUnplayedItems(IEnumerable<BaseItem> itemSet, User user)
 
-         {
 
-             return GetRecentlyAddedItems(itemSet, user).Where(i =>
 
-             {
 
-                 var userdata = i.GetUserData(user);
 
-                 return userdata == null || userdata.PlayCount == 0;
 
-             });
 
-         }
 
-         private static IEnumerable<BaseItem> GetInProgressItems(IEnumerable<BaseItem> itemSet, User user)
 
-         {
 
-             return itemSet.Where(i =>
 
-             {
 
-                 if (i.IsFolder)
 
-                 {
 
-                     return false;
 
-                 }
 
-                 var userdata = i.GetUserData(user);
 
-                 return userdata != null && userdata.PlaybackPositionTicks > 0;
 
-             });
 
-         }
 
-         private static decimal GetPlayedPercentage(IEnumerable<BaseItem> itemSet, User user)
 
-         {
 
-             itemSet = itemSet.Where(i => !(i.IsFolder));
 
-             if (!itemSet.Any())
 
-             {
 
-                 return 0;
 
-             }
 
-             decimal totalPercent = 0;
 
-             foreach (BaseItem item in itemSet)
 
-             {
 
-                 UserItemData data = item.GetUserData(user);
 
-                 if (data == null)
 
-                 {
 
-                     continue;
 
-                 }
 
-                 if (data.PlayCount > 0)
 
-                 {
 
-                     totalPercent += 100;
 
-                 }
 
-                 else if (data.PlaybackPositionTicks > 0 && item.RunTimeTicks.HasValue)
 
-                 {
 
-                     decimal itemPercent = data.PlaybackPositionTicks;
 
-                     itemPercent /= item.RunTimeTicks.Value;
 
-                     totalPercent += itemPercent;
 
-                 }
 
-             }
 
-             return totalPercent / itemSet.Count();
 
-         }
 
-         /// <summary>
 
-         /// Finds an item by ID, recursively
 
-         /// </summary>
 
-         public override BaseItem FindItemById(Guid id)
 
-         {
 
-             var result = base.FindItemById(id);
 
-             if (result != null)
 
-             {
 
-                 return result;
 
-             }
 
-             foreach (BaseItem item in Children)
 
-             {
 
-                 result = item.FindItemById(id);
 
-                 if (result != null)
 
-                 {
 
-                     return result;
 
-                 }
 
-             }
 
-             return null;
 
-         }
 
-         /// <summary>
 
-         /// Finds an item by path, recursively
 
-         /// </summary>
 
-         public BaseItem FindByPath(string path)
 
-         {
 
-             if (Path.Equals(path, StringComparison.OrdinalIgnoreCase))
 
-             {
 
-                 return this;
 
-             }
 
-             foreach (BaseItem item in Children)
 
-             {
 
-                 var folder = item as Folder;
 
-                 if (folder != null)
 
-                 {
 
-                     var foundItem = folder.FindByPath(path);
 
-                     if (foundItem != null)
 
-                     {
 
-                         return foundItem;
 
-                     }
 
-                 }
 
-                 else if (item.Path.Equals(path, StringComparison.OrdinalIgnoreCase))
 
-                 {
 
-                     return item;
 
-                 }
 
-             }
 
-             return null;
 
-         }
 
-     }
 
- }
 
 
  |