|  | @@ -6,6 +6,7 @@ using System;
 | 
	
		
			
				|  |  |  using System.Collections.Generic;
 | 
	
		
			
				|  |  |  using System.Linq;
 | 
	
		
			
				|  |  |  using System.Runtime.Serialization;
 | 
	
		
			
				|  |  | +using System.Threading.Tasks;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  namespace MediaBrowser.Controller.Playlists
 | 
	
		
			
				|  |  |  {
 | 
	
	
		
			
				|  | @@ -50,12 +51,12 @@ namespace MediaBrowser.Controller.Playlists
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            return GetPlayableItems(user);
 | 
	
		
			
				|  |  | +            return GetPlayableItems(user).Result;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          public override IEnumerable<BaseItem> GetRecursiveChildren(User user, Func<BaseItem, bool> filter)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            var items = GetPlayableItems(user);
 | 
	
		
			
				|  |  | +            var items = GetPlayableItems(user).Result;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if (filter != null)
 | 
	
		
			
				|  |  |              {
 | 
	
	
		
			
				|  | @@ -70,23 +71,30 @@ namespace MediaBrowser.Controller.Playlists
 | 
	
		
			
				|  |  |              return GetLinkedChildrenInfos();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private IEnumerable<BaseItem> GetPlayableItems(User user)
 | 
	
		
			
				|  |  | +        private Task<IEnumerable<BaseItem>> GetPlayableItems(User user)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              return GetPlaylistItems(MediaType, base.GetChildren(user, true), user);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        public static IEnumerable<BaseItem> GetPlaylistItems(string playlistMediaType, IEnumerable<BaseItem> inputItems, User user)
 | 
	
		
			
				|  |  | +        public static async Task<IEnumerable<BaseItem>> GetPlaylistItems(string playlistMediaType, IEnumerable<BaseItem> inputItems, User user)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              if (user != null)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  inputItems = inputItems.Where(i => i.IsVisible(user));
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            return inputItems.SelectMany(i => GetPlaylistItems(i, user))
 | 
	
		
			
				|  |  | -                .Where(m => string.Equals(m.MediaType, playlistMediaType, StringComparison.OrdinalIgnoreCase));
 | 
	
		
			
				|  |  | +            var list = new List<BaseItem>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            foreach (var item in inputItems)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                var playlistItems = await GetPlaylistItems(item, user, playlistMediaType).ConfigureAwait(false);
 | 
	
		
			
				|  |  | +                list.AddRange(playlistItems);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            return list;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private static IEnumerable<BaseItem> GetPlaylistItems(BaseItem item, User user)
 | 
	
		
			
				|  |  | +        private static async Task<IEnumerable<BaseItem>> GetPlaylistItems(BaseItem item, User user, string mediaType)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              var musicGenre = item as MusicGenre;
 | 
	
		
			
				|  |  |              if (musicGenre != null)
 | 
	
	
		
			
				|  | @@ -119,15 +127,18 @@ namespace MediaBrowser.Controller.Playlists
 | 
	
		
			
				|  |  |              var folder = item as Folder;
 | 
	
		
			
				|  |  |              if (folder != null)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                var items = user == null
 | 
	
		
			
				|  |  | -                    ? folder.GetRecursiveChildren(m => !m.IsFolder)
 | 
	
		
			
				|  |  | -                    : folder.GetRecursiveChildren(user, m => !m.IsFolder);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                if (folder.IsPreSorted)
 | 
	
		
			
				|  |  | +                var query = new InternalItemsQuery(user)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    return items;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                return LibraryManager.Sort(items, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending);
 | 
	
		
			
				|  |  | +                    Recursive = true,
 | 
	
		
			
				|  |  | +                    IsFolder = false,
 | 
	
		
			
				|  |  | +                    SortBy = new[] { ItemSortBy.SortName },
 | 
	
		
			
				|  |  | +                    MediaTypes = new[] { mediaType }
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                var itemsResult = await folder.GetItems(query).ConfigureAwait(false);
 | 
	
		
			
				|  |  | +                var items = itemsResult.Items;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                return items;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              return new[] { item };
 |