Jelajahi Sumber

update icons

Luke Pulverenti 9 tahun lalu
induk
melakukan
6adc668bed

+ 14 - 0
MediaBrowser.Controller/Entities/Audio/MusicArtist.cs

@@ -40,6 +40,20 @@ namespace MediaBrowser.Controller.Entities.Audio
             return !IsAccessedByName;
             return !IsAccessedByName;
         }
         }
 
 
+        public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query)
+        {
+            var itemByNameFilter = GetItemFilter();
+
+            if (query.User != null)
+            {
+                return query.User.RootFolder
+                    .GetRecursiveChildren(query.User, i => !i.IsFolder && itemByNameFilter(i));
+            }
+
+            return LibraryManager.RootFolder
+                .GetRecursiveChildren(i => !i.IsFolder && itemByNameFilter(i));
+        }
+
         protected override IEnumerable<BaseItem> ActualChildren
         protected override IEnumerable<BaseItem> ActualChildren
         {
         {
             get
             get

+ 8 - 0
MediaBrowser.Controller/Entities/Audio/MusicGenre.cs

@@ -79,5 +79,13 @@ namespace MediaBrowser.Controller.Entities.Audio
                 return false;
                 return false;
             }
             }
         }
         }
+
+        public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query)
+        {
+            query.Genres = new[] { Name };
+            query.ExcludeItemTypes = new[] { typeof(MusicVideo).Name, typeof(Audio).Name, typeof(MusicAlbum).Name, typeof(MusicArtist).Name };
+
+            return LibraryManager.GetItemList(query);
+        }
     }
     }
 }
 }

+ 8 - 0
MediaBrowser.Controller/Entities/GameGenre.cs

@@ -62,6 +62,14 @@ namespace MediaBrowser.Controller.Entities
             return i => i is Game && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase);
             return i => i is Game && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase);
         }
         }
 
 
+        public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query)
+        {
+            query.Genres = new[] { Name };
+            query.IncludeItemTypes = new[] { typeof(Game).Name };
+
+            return LibraryManager.GetItemList(query);
+        }
+
         [IgnoreDataMember]
         [IgnoreDataMember]
         public override bool SupportsPeople
         public override bool SupportsPeople
         {
         {

+ 8 - 0
MediaBrowser.Controller/Entities/Genre.cs

@@ -66,6 +66,14 @@ namespace MediaBrowser.Controller.Entities
             return i => !(i is Game) && !(i is IHasMusicGenres) && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase);
             return i => !(i is Game) && !(i is IHasMusicGenres) && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase);
         }
         }
 
 
+        public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query)
+        {
+            query.Genres = new[] { Name };
+            query.ExcludeItemTypes = new[] { typeof(Game).Name, typeof(MusicVideo).Name, typeof(Audio.Audio).Name, typeof(MusicAlbum).Name, typeof(MusicArtist).Name };
+
+            return LibraryManager.GetItemList(query);
+        }
+
         [IgnoreDataMember]
         [IgnoreDataMember]
         public override bool SupportsPeople
         public override bool SupportsPeople
         {
         {

+ 2 - 0
MediaBrowser.Controller/Entities/IItemByName.cs

@@ -20,6 +20,8 @@ namespace MediaBrowser.Controller.Entities
         /// </summary>
         /// </summary>
         /// <returns>Func&lt;BaseItem, System.Boolean&gt;.</returns>
         /// <returns>Func&lt;BaseItem, System.Boolean&gt;.</returns>
         Func<BaseItem, bool> GetItemFilter();
         Func<BaseItem, bool> GetItemFilter();
+
+        IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query);
     }
     }
 
 
     public interface IHasDualAccess : IItemByName
     public interface IHasDualAccess : IItemByName

+ 1 - 0
MediaBrowser.Controller/Entities/InternalItemsQuery.cs

@@ -134,6 +134,7 @@ namespace MediaBrowser.Controller.Entities
 
 
         public string[] AlbumNames { get; set; }
         public string[] AlbumNames { get; set; }
         public string[] ArtistNames { get; set; }
         public string[] ArtistNames { get; set; }
+        public string AncestorWithPresentationUniqueKey { get; set; }
 
 
         public bool GroupByPresentationUniqueKey { get; set; }
         public bool GroupByPresentationUniqueKey { get; set; }
 
 

+ 7 - 0
MediaBrowser.Controller/Entities/Person.cs

@@ -31,6 +31,13 @@ namespace MediaBrowser.Controller.Entities
             return GetItemLookupInfo<PersonLookupInfo>();
             return GetItemLookupInfo<PersonLookupInfo>();
         }
         }
 
 
+        public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query)
+        {
+            query.Person = Name;
+
+            return LibraryManager.GetItemList(query);
+        }
+
         /// <summary>
         /// <summary>
         /// Returns the folder containing the item.
         /// Returns the folder containing the item.
         /// If the item is a folder, it returns the folder itself
         /// If the item is a folder, it returns the folder itself

+ 0 - 9
MediaBrowser.Controller/Entities/PhotoAlbum.cs

@@ -7,15 +7,6 @@ namespace MediaBrowser.Controller.Entities
 {
 {
     public class PhotoAlbum : Folder
     public class PhotoAlbum : Folder
     {
     {
-        [IgnoreDataMember]
-        public override bool SupportsLocalMetadata
-        {
-            get
-            {
-                return false;
-            }
-        }
-
         [IgnoreDataMember]
         [IgnoreDataMember]
         public override bool AlwaysScanInternalMetadataPath
         public override bool AlwaysScanInternalMetadataPath
         {
         {

+ 7 - 0
MediaBrowser.Controller/Entities/Studio.cs

@@ -65,6 +65,13 @@ namespace MediaBrowser.Controller.Entities
             return i => i.Studios.Contains(Name, StringComparer.OrdinalIgnoreCase);
             return i => i.Studios.Contains(Name, StringComparer.OrdinalIgnoreCase);
         }
         }
 
 
+        public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query)
+        {
+            query.Studios = new[] { Name };
+
+            return LibraryManager.GetItemList(query);
+        }
+
         [IgnoreDataMember]
         [IgnoreDataMember]
         public override bool SupportsPeople
         public override bool SupportsPeople
         {
         {

+ 4 - 12
MediaBrowser.Controller/Entities/TV/Series.cs

@@ -9,6 +9,7 @@ using System.Linq;
 using System.Runtime.Serialization;
 using System.Runtime.Serialization;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using MoreLinq;
 
 
 namespace MediaBrowser.Controller.Entities.TV
 namespace MediaBrowser.Controller.Entities.TV
 {
 {
@@ -180,7 +181,7 @@ namespace MediaBrowser.Controller.Entities.TV
             else
             else
             {
             {
                 items = query.Recursive
                 items = query.Recursive
-                   ? GetRecursiveChildren(user, filter)
+                   ? GetSeasons(user).Cast<BaseItem>().Concat(GetEpisodes(user)).Where(filter)
                    : GetSeasons(user).Where(filter);
                    : GetSeasons(user).Where(filter);
             }
             }
 
 
@@ -211,7 +212,7 @@ namespace MediaBrowser.Controller.Entities.TV
             }
             }
             else
             else
             {
             {
-                seasons = base.GetChildren(user, true).OfType<Season>();
+                seasons = LibraryManager.Sort(base.GetChildren(user, true), user, new[] { ItemSortBy.SortName }, SortOrder.Ascending).OfType<Season>();
             }
             }
 
 
             if (!includeMissingSeasons && !includeVirtualUnaired)
             if (!includeMissingSeasons && !includeVirtualUnaired)
@@ -250,17 +251,8 @@ namespace MediaBrowser.Controller.Entities.TV
             // Specials could appear twice based on above - once in season 0, once in the aired season
             // Specials could appear twice based on above - once in season 0, once in the aired season
             // This depends on settings for that series
             // This depends on settings for that series
             // When this happens, remove the duplicate from season 0
             // When this happens, remove the duplicate from season 0
-            var returnList = new List<Episode>();
 
 
-            foreach (var episode in allEpisodes)
-            {
-                if (!returnList.Contains(episode))
-                {
-                    returnList.Insert(0, episode);
-                }
-            }
-
-            return returnList;
+            return allEpisodes.DistinctBy(i => i.Id).Reverse();
         }
         }
 
 
         public async Task RefreshAllMetadata(MetadataRefreshOptions refreshOptions, IProgress<double> progress, CancellationToken cancellationToken)
         public async Task RefreshAllMetadata(MetadataRefreshOptions refreshOptions, IProgress<double> progress, CancellationToken cancellationToken)

+ 16 - 0
MediaBrowser.Controller/Entities/Year.cs

@@ -70,6 +70,22 @@ namespace MediaBrowser.Controller.Entities
             return inputItems.Where(i => i.ProductionYear.HasValue && i.ProductionYear.Value == year);
             return inputItems.Where(i => i.ProductionYear.HasValue && i.ProductionYear.Value == year);
         }
         }
 
 
+        public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query)
+        {
+            int year;
+
+            var usCulture = new CultureInfo("en-US");
+
+            if (!int.TryParse(Name, NumberStyles.Integer, usCulture, out year))
+            {
+                return new List<BaseItem>();
+            }
+
+            query.Years = new[] { year };
+
+            return LibraryManager.GetItemList(query);
+        }
+
         public int? GetYearValue()
         public int? GetYearValue()
         {
         {
             int i;
             int i;

+ 6 - 5
MediaBrowser.Controller/Playlists/Playlist.cs

@@ -99,11 +99,12 @@ namespace MediaBrowser.Controller.Playlists
             var musicGenre = item as MusicGenre;
             var musicGenre = item as MusicGenre;
             if (musicGenre != null)
             if (musicGenre != null)
             {
             {
-                Func<BaseItem, bool> filter = i => i is Audio && i.Genres.Contains(musicGenre.Name, StringComparer.OrdinalIgnoreCase);
-
-                var items = user == null
-                    ? LibraryManager.RootFolder.GetRecursiveChildren(filter)
-                    : user.RootFolder.GetRecursiveChildren(user, filter);
+                var items = LibraryManager.GetItemList(new InternalItemsQuery(user)
+                {
+                    Recursive = true,
+                    IncludeItemTypes = new[] { typeof(Audio).Name },
+                    Genres = new[] { musicGenre.Name }
+                });
 
 
                 return LibraryManager.Sort(items, user, new[] { ItemSortBy.AlbumArtist, ItemSortBy.Album, ItemSortBy.SortName }, SortOrder.Ascending);
                 return LibraryManager.Sort(items, user, new[] { ItemSortBy.AlbumArtist, ItemSortBy.Album, ItemSortBy.SortName }, SortOrder.Ascending);
             }
             }

+ 1 - 1
MediaBrowser.Server.Implementations/Library/MusicManager.cs

@@ -55,7 +55,7 @@ namespace MediaBrowser.Server.Implementations.Library
         public IEnumerable<Audio> GetInstantMixFromFolder(Folder item, User user)
         public IEnumerable<Audio> GetInstantMixFromFolder(Folder item, User user)
         {
         {
             var genres = item
             var genres = item
-                .GetRecursiveChildren(user, i => i is Audio)
+               .GetRecursiveChildren(user, i => i is Audio)
                .Cast<Audio>()
                .Cast<Audio>()
                .SelectMany(i => i.Genres)
                .SelectMany(i => i.Genres)
                .Concat(item.Genres)
                .Concat(item.Genres)

+ 6 - 0
MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs

@@ -2334,6 +2334,12 @@ namespace MediaBrowser.Server.Implementations.Persistence
                 var inClause = string.Join(",", query.AncestorIds.Select(i => "'" + new Guid(i).ToString("N") + "'").ToArray());
                 var inClause = string.Join(",", query.AncestorIds.Select(i => "'" + new Guid(i).ToString("N") + "'").ToArray());
                 whereClauses.Add(string.Format("Guid in (select itemId from AncestorIds where AncestorIdText in ({0}))", inClause));
                 whereClauses.Add(string.Format("Guid in (select itemId from AncestorIds where AncestorIdText in ({0}))", inClause));
             }
             }
+            if (!string.IsNullOrWhiteSpace(query.AncestorWithPresentationUniqueKey))
+            {
+                var inClause = "select guid from TypedBaseItems where PresentationUniqueKey=@AncestorWithPresentationUniqueKey";
+                whereClauses.Add(string.Format("Guid in (select itemId from AncestorIds where AncestorId in ({0}))", inClause));
+                cmd.Parameters.Add(cmd, "@AncestorWithPresentationUniqueKey", DbType.String).Value = query.AncestorWithPresentationUniqueKey;
+            }
 
 
             if (query.BlockUnratedItems.Length == 1)
             if (query.BlockUnratedItems.Length == 1)
             {
             {

+ 15 - 0
MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs

@@ -109,6 +109,21 @@ namespace MediaBrowser.Server.Implementations.Photos
 
 
         protected async Task<ItemUpdateType> FetchAsync(IHasImages item, ImageType imageType, MetadataRefreshOptions options, CancellationToken cancellationToken)
         protected async Task<ItemUpdateType> FetchAsync(IHasImages item, ImageType imageType, MetadataRefreshOptions options, CancellationToken cancellationToken)
         {
         {
+            var image = item.GetImageInfo(imageType, 0);
+
+            if (image != null)
+            {
+                if (!image.IsLocalFile)
+                {
+                    return ItemUpdateType.None;
+                }
+
+                if (!FileSystem.ContainsSubPath(item.GetInternalMetadataPath(), image.Path))
+                {
+                    return ItemUpdateType.None;
+                }
+            }
+
             var items = await GetItemsWithImages(item).ConfigureAwait(false);
             var items = await GetItemsWithImages(item).ConfigureAwait(false);
 
 
             return await FetchToFileInternal(item, items, imageType, cancellationToken).ConfigureAwait(false);
             return await FetchToFileInternal(item, items, imageType, cancellationToken).ConfigureAwait(false);

+ 14 - 11
MediaBrowser.Server.Implementations/Session/SessionManager.cs

@@ -848,7 +848,7 @@ namespace MediaBrowser.Server.Implementations.Session
             if (!playbackFailed)
             if (!playbackFailed)
             {
             {
                 var data = _userDataRepository.GetUserData(userId, item);
                 var data = _userDataRepository.GetUserData(userId, item);
-                
+
                 if (positionTicks.HasValue)
                 if (positionTicks.HasValue)
                 {
                 {
                     playedToCompletion = _userDataRepository.UpdatePlayState(item, data, positionTicks.Value);
                     playedToCompletion = _userDataRepository.UpdatePlayState(item, data, positionTicks.Value);
@@ -1026,11 +1026,11 @@ namespace MediaBrowser.Server.Implementations.Session
 
 
             if (byName != null)
             if (byName != null)
             {
             {
-                var itemFilter = byName.GetItemFilter();
-
-                var items = user == null ?
-                    _libraryManager.RootFolder.GetRecursiveChildren(i => !i.IsFolder && itemFilter(i)) :
-                    user.RootFolder.GetRecursiveChildren(user, i => !i.IsFolder && itemFilter(i));
+                var items = byName.GetTaggedItems(new InternalItemsQuery(user)
+                {
+                    IsFolder = false,
+                    Recursive = true
+                });
 
 
                 return FilterToSingleMediaType(items)
                 return FilterToSingleMediaType(items)
                     .OrderBy(i => i.SortName);
                     .OrderBy(i => i.SortName);
@@ -1040,9 +1040,12 @@ namespace MediaBrowser.Server.Implementations.Session
             {
             {
                 var folder = (Folder)item;
                 var folder = (Folder)item;
 
 
-                var items = user == null ?
-                    folder.GetRecursiveChildren(i => !i.IsFolder) :
-                    folder.GetRecursiveChildren(user, i => !i.IsFolder);
+                var items = folder.GetItems(new InternalItemsQuery(user)
+                {
+                    Recursive = true,
+                    IsFolder = false
+
+                }).Result.Items;
 
 
                 return FilterToSingleMediaType(items)
                 return FilterToSingleMediaType(items)
                     .OrderBy(i => i.SortName);
                     .OrderBy(i => i.SortName);
@@ -1367,8 +1370,8 @@ namespace MediaBrowser.Server.Implementations.Session
                 ServerId = _appHost.SystemId
                 ServerId = _appHost.SystemId
             };
             };
         }
         }
-        
-        
+
+
         private async Task<string> GetAuthorizationToken(string userId, string deviceId, string app, string appVersion, string deviceName)
         private async Task<string> GetAuthorizationToken(string userId, string deviceId, string app, string appVersion, string deviceName)
         {
         {
             var existing = _authRepo.Get(new AuthenticationInfoQuery
             var existing = _authRepo.Get(new AuthenticationInfoQuery

+ 12 - 18
MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs

@@ -326,32 +326,26 @@ namespace MediaBrowser.Server.Implementations.Sync
             var itemByName = item as IItemByName;
             var itemByName = item as IItemByName;
             if (itemByName != null)
             if (itemByName != null)
             {
             {
-                var itemByNameFilter = itemByName.GetItemFilter();
-
-                return user.RootFolder
-                    .GetRecursiveChildren(user, i => !i.IsFolder && itemByNameFilter(i));
-            }
-
-            var series = item as Series;
-            if (series != null)
-            {
-                return series.GetEpisodes(user, false, false);
-            }
-
-            var season = item as Season;
-            if (season != null)
-            {
-                return season.GetEpisodes(user, false, false);
+                return itemByName.GetTaggedItems(new InternalItemsQuery(user)
+                {
+                    IsFolder = false,
+                    Recursive = true
+                });
             }
             }
 
 
             if (item.IsFolder)
             if (item.IsFolder)
             {
             {
                 var folder = (Folder)item;
                 var folder = (Folder)item;
-                var items = folder.GetRecursiveChildren(user, i => !i.IsFolder);
+                var items = folder.GetItems(new InternalItemsQuery(user)
+                {
+                    Recursive = true,
+                    IsFolder = false
+
+                }).Result.Items;
 
 
                 if (!folder.IsPreSorted)
                 if (!folder.IsPreSorted)
                 {
                 {
-                    items = items.OrderBy(i => i.SortName);
+                    items = items.OrderBy(i => i.SortName).ToArray();
                 }
                 }
 
 
                 return items;
                 return items;