浏览代码

update series queries

Luke Pulverenti 8 年之前
父节点
当前提交
016d8301f5

+ 30 - 2
Emby.Server.Implementations/Data/SqliteItemRepository.cs

@@ -291,6 +291,7 @@ namespace Emby.Server.Implementations.Data
                     AddColumn(db, "TypedBaseItems", "Artists", "Text", existingColumnNames);
                     AddColumn(db, "TypedBaseItems", "AlbumArtists", "Text", existingColumnNames);
                     AddColumn(db, "TypedBaseItems", "ExternalId", "Text", existingColumnNames);
+                    AddColumn(db, "TypedBaseItems", "SeriesPresentationUniqueKey", "Text", existingColumnNames);
 
                     existingColumnNames = GetColumnNames(db, "ItemValues");
                     AddColumn(db, "ItemValues", "CleanValue", "Text", existingColumnNames);
@@ -341,6 +342,7 @@ namespace Emby.Server.Implementations.Data
                 "drop index if exists Idx_ProviderIds1",
                 "drop table if exists Images",
                 "drop index if exists idx_Images",
+                "drop index if exists idx_TypeSeriesPresentationUniqueKey",
 
                 "create index if not exists idx_PathTypedBaseItems on TypedBaseItems(Path)",
                 "create index if not exists idx_ParentIdTypedBaseItems on TypedBaseItems(ParentId)",
@@ -353,6 +355,9 @@ namespace Emby.Server.Implementations.Data
                 // covering index
                 "create index if not exists idx_TopParentIdGuid on TypedBaseItems(TopParentId,Guid)",
 
+                // series
+                "create index if not exists idx_TypeSeriesPresentationUniqueKey1 on TypedBaseItems(Type,SeriesPresentationUniqueKey,PresentationUniqueKey,SortName)",
+
                 // live tv programs
                 "create index if not exists idx_TypeTopParentIdStartDate on TypedBaseItems(Type,TopParentId,StartDate)",
 
@@ -488,7 +493,8 @@ namespace Emby.Server.Implementations.Data
             "ExtraType",
             "Artists",
             "AlbumArtists",
-            "ExternalId"
+            "ExternalId",
+            "SeriesPresentationUniqueKey"
         };
 
         private readonly string[] _mediaStreamSaveColumns =
@@ -619,7 +625,8 @@ namespace Emby.Server.Implementations.Data
                 "ExtraType",
                 "Artists",
                 "AlbumArtists",
-                "ExternalId"
+                "ExternalId",
+            "SeriesPresentationUniqueKey"
             };
 
             var saveItemCommandCommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (";
@@ -1024,11 +1031,13 @@ namespace Emby.Server.Implementations.Data
             {
                 saveItemStatement.TryBind("@SeriesId", hasSeries.SeriesId);
                 saveItemStatement.TryBind("@SeriesSortName", hasSeries.SeriesSortName);
+                saveItemStatement.TryBind("@SeriesPresentationUniqueKey", hasSeries.SeriesPresentationUniqueKey);
             }
             else
             {
                 saveItemStatement.TryBindNull("@SeriesId");
                 saveItemStatement.TryBindNull("@SeriesSortName");
+                saveItemStatement.TryBindNull("@SeriesPresentationUniqueKey");
             }
 
             saveItemStatement.TryBind("@ExternalSeriesId", item.ExternalSeriesId);
@@ -1983,6 +1992,15 @@ namespace Emby.Server.Implementations.Data
             }
             index++;
 
+            if (hasSeries != null)
+            {
+                if (!reader.IsDBNull(index))
+                {
+                    hasSeries.SeriesPresentationUniqueKey = reader.GetString(index);
+                }
+            }
+            index++;
+
             if (string.IsNullOrWhiteSpace(item.Tagline))
             {
                 var movie = item as Movie;
@@ -4292,6 +4310,16 @@ namespace Emby.Server.Implementations.Data
                 }
             }
 
+            if (!string.IsNullOrWhiteSpace(query.SeriesPresentationUniqueKey))
+            {
+                whereClauses.Add("SeriesPresentationUniqueKey=@SeriesPresentationUniqueKey");
+
+                if (statement != null)
+                {
+                    statement.TryBind("@SeriesPresentationUniqueKey", query.SeriesPresentationUniqueKey);
+                }
+            }
+
             if (query.BlockUnratedItems.Length == 1)
             {
                 whereClauses.Add("(InheritedParentalRatingValue > 0 or UnratedType <> @UnratedType)");

+ 9 - 2
Emby.Server.Implementations/Library/LibraryManager.cs

@@ -1057,6 +1057,12 @@ namespace Emby.Server.Implementations.Library
             try
             {
                 await PerformLibraryValidation(progress, cancellationToken).ConfigureAwait(false);
+
+                if (!ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey)
+                {
+                    ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey = true;
+                    ConfigurationManager.SaveConfiguration();
+                }
             }
             finally
             {
@@ -1478,8 +1484,9 @@ namespace Emby.Server.Implementations.Library
                 !query.ParentId.HasValue &&
                 query.ChannelIds.Length == 0 &&
                 query.TopParentIds.Length == 0 &&
-                string.IsNullOrWhiteSpace(query.AncestorWithPresentationUniqueKey)
-                && query.ItemIds.Length == 0)
+                string.IsNullOrWhiteSpace(query.AncestorWithPresentationUniqueKey) &&
+                string.IsNullOrWhiteSpace(query.SeriesPresentationUniqueKey) &&
+                query.ItemIds.Length == 0)
             {
                 var userViews = _userviewManager().GetUserViews(new UserViewQuery
                 {

+ 7 - 2
Emby.Server.Implementations/TV/TVSeriesManager.cs

@@ -158,9 +158,13 @@ namespace Emby.Server.Implementations.TV
         /// <returns>Task{Episode}.</returns>
         private Tuple<DateTime, Func<Episode>> GetNextUp(Series series, User user)
         {
+            var enableSeriesPresentationKey = _config.Configuration.EnableSeriesPresentationUniqueKey;
+            var seriesKey = GetUniqueSeriesKey(series);
+
             var lastWatchedEpisode = _libraryManager.GetItemList(new InternalItemsQuery(user)
             {
-                AncestorWithPresentationUniqueKey = GetUniqueSeriesKey(series),
+                AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey,
+                SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null,
                 IncludeItemTypes = new[] { typeof(Episode).Name },
                 SortBy = new[] { ItemSortBy.SortName },
                 SortOrder = SortOrder.Descending,
@@ -174,7 +178,8 @@ namespace Emby.Server.Implementations.TV
             {
                 return _libraryManager.GetItemList(new InternalItemsQuery(user)
                 {
-                    AncestorWithPresentationUniqueKey = GetUniqueSeriesKey(series),
+                    AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey,
+                    SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null,
                     IncludeItemTypes = new[] { typeof(Episode).Name },
                     SortBy = new[] { ItemSortBy.SortName },
                     SortOrder = SortOrder.Ascending,

+ 1 - 0
MediaBrowser.Api/StartupWizardService.cs

@@ -119,6 +119,7 @@ namespace MediaBrowser.Api
             config.SkipDeserializationForBasicTypes = true;
             config.SkipDeserializationForPrograms = true;
             config.SkipDeserializationForAudio = true;
+            config.EnableSeriesPresentationUniqueKey = true;
         }
 
         public void Post(UpdateStartupConfiguration request)

+ 6 - 0
MediaBrowser.Controller/Entities/Book.cs

@@ -18,6 +18,8 @@ namespace MediaBrowser.Controller.Entities
             }
         }
 
+        [IgnoreDataMember]
+        public string SeriesPresentationUniqueKey { get; set; }
         [IgnoreDataMember]
         public string SeriesName { get; set; }
         [IgnoreDataMember]
@@ -33,6 +35,10 @@ namespace MediaBrowser.Controller.Entities
         {
             return SeriesName;
         }
+        public string FindSeriesPresentationUniqueKey()
+        {
+            return SeriesPresentationUniqueKey;
+        }
 
         [IgnoreDataMember]
         public override bool EnableRefreshOnDateModifiedChange

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

@@ -15,5 +15,7 @@ namespace MediaBrowser.Controller.Entities
         string FindSeriesSortName();
         Guid? SeriesId { get; set; }
         Guid? FindSeriesId();
+        string SeriesPresentationUniqueKey { get; set; }
+        string FindSeriesPresentationUniqueKey();
     }
 }

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

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

+ 11 - 2
MediaBrowser.Controller/Entities/TV/Episode.cs

@@ -165,13 +165,22 @@ namespace MediaBrowser.Controller.Entities.TV
             {
                 return FindParent<Season>() != null;
             }
-        }
+        }
+
+        [IgnoreDataMember]
+        public string SeriesPresentationUniqueKey { get; set; }
 
         [IgnoreDataMember]
         public string SeriesName { get; set; }
 
         [IgnoreDataMember]
-        public string SeasonName { get; set; }
+        public string SeasonName { get; set; }
+
+        public string FindSeriesPresentationUniqueKey()
+        {
+            var series = Series;
+            return series == null ? null : series.PresentationUniqueKey;
+        }
 
         public string FindSeasonName()
         {

+ 9 - 0
MediaBrowser.Controller/Entities/TV/Season.cs

@@ -207,12 +207,21 @@ namespace MediaBrowser.Controller.Entities.TV
             return UnratedItem.Series;
         }
 
+        [IgnoreDataMember]
+        public string SeriesPresentationUniqueKey { get; set; }
+
         [IgnoreDataMember]
         public string SeriesName { get; set; }
 
         [IgnoreDataMember]
         public Guid? SeriesId { get; set; }
 
+        public string FindSeriesPresentationUniqueKey()
+        {
+            var series = Series;
+            return series == null ? null : series.PresentationUniqueKey;
+        }
+
         public string FindSeriesName()
         {
             var series = Series;

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

@@ -95,12 +95,16 @@ namespace MediaBrowser.Controller.Entities.TV
 
         public override string CreatePresentationUniqueKey()
         {
-            var userdatakeys = GetUserDataKeys();
-
-            if (userdatakeys.Count > 1)
+            if (LibraryManager.GetLibraryOptions(this).EnableAutomaticSeriesGrouping)
             {
-                return AddLibrariesToPresentationUniqueKey(userdatakeys[0]);
+                var userdatakeys = GetUserDataKeys();
+
+                if (userdatakeys.Count > 1)
+                {
+                    return AddLibrariesToPresentationUniqueKey(userdatakeys[0]);
+                }
             }
+
             return base.CreatePresentationUniqueKey();
         }
 
@@ -131,9 +135,13 @@ namespace MediaBrowser.Controller.Entities.TV
 
         public override int GetChildCount(User user)
         {
+            var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey;
+            var seriesKey = GetUniqueSeriesKey(this);
+
             var result = LibraryManager.GetItemsResult(new InternalItemsQuery(user)
             {
-                AncestorWithPresentationUniqueKey = GetUniqueSeriesKey(this),
+                AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey,
+                SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null,
                 IncludeItemTypes = new[] { typeof(Season).Name },
                 IsVirtualItem = false,
                 Limit = 0
@@ -144,9 +152,15 @@ namespace MediaBrowser.Controller.Entities.TV
 
         public override int GetRecursiveChildCount(User user)
         {
-            var query = new InternalItemsQuery(user);
+            var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey;
+            var seriesKey = GetUniqueSeriesKey(this);
+
+            var query = new InternalItemsQuery(user)
+            {
+                AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey,
+                SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null,
+            };
 
-            query.AncestorWithPresentationUniqueKey = GetUniqueSeriesKey(this);
             if (query.SortBy.Length == 0)
             {
                 query.SortBy = new[] { ItemSortBy.SortName };
@@ -223,11 +237,13 @@ namespace MediaBrowser.Controller.Entities.TV
         {
             var config = user.Configuration;
 
+            var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey;
             var seriesKey = GetUniqueSeriesKey(this);
 
             var query = new InternalItemsQuery(user)
             {
-                AncestorWithPresentationUniqueKey = seriesKey,
+                AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey,
+                SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null,
                 IncludeItemTypes = new[] { typeof(Season).Name },
                 SortBy = new[] { ItemSortBy.SortName }
             };
@@ -259,7 +275,11 @@ namespace MediaBrowser.Controller.Entities.TV
 
             if (query.Recursive)
             {
-                query.AncestorWithPresentationUniqueKey = GetUniqueSeriesKey(this);
+                var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey;
+                var seriesKey = GetUniqueSeriesKey(this);
+
+                query.AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey;
+                query.SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null;
                 if (query.SortBy.Length == 0)
                 {
                     query.SortBy = new[] { ItemSortBy.SortName };
@@ -281,11 +301,13 @@ namespace MediaBrowser.Controller.Entities.TV
 
         public IEnumerable<Episode> GetEpisodes(User user)
         {
+            var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey;
             var seriesKey = GetUniqueSeriesKey(this);
 
             var query = new InternalItemsQuery(user)
             {
-                AncestorWithPresentationUniqueKey = seriesKey,
+                AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey,
+                SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null,
                 IncludeItemTypes = new[] { typeof(Episode).Name, typeof(Season).Name },
                 SortBy = new[] { ItemSortBy.SortName }
             };
@@ -387,14 +409,19 @@ namespace MediaBrowser.Controller.Entities.TV
 
         public IEnumerable<Episode> GetSeasonEpisodes(Season parentSeason, User user)
         {
+            var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey;
+
+            var queryFromSeries = ConfigurationManager.Configuration.DisplaySpecialsWithinSeasons;
+
             // add optimization when this setting is not enabled
-            var seriesKey = ConfigurationManager.Configuration.DisplaySpecialsWithinSeasons ?
+            var seriesKey = queryFromSeries ?
                 GetUniqueSeriesKey(this) :
                 GetUniqueSeriesKey(parentSeason);
 
             var query = new InternalItemsQuery(user)
             {
-                AncestorWithPresentationUniqueKey = seriesKey,
+                AncestorWithPresentationUniqueKey = queryFromSeries && enableSeriesPresentationKey ? null : seriesKey,
+                SeriesPresentationUniqueKey = queryFromSeries && enableSeriesPresentationKey ? seriesKey : null,
                 IncludeItemTypes = new[] { typeof(Episode).Name },
                 SortBy = new[] { ItemSortBy.SortName }
             };

+ 2 - 0
MediaBrowser.Model/Configuration/LibraryOptions.cs

@@ -14,6 +14,7 @@
         public bool SaveLocalMetadata { get; set; }
         public bool EnableInternetProviders { get; set; }
         public bool ImportMissingEpisodes { get; set; }
+        public bool EnableAutomaticSeriesGrouping { get; set; }
 
         public LibraryOptions()
         {
@@ -21,6 +22,7 @@
             EnableRealtimeMonitor = true;
             PathInfos = new MediaPathInfo[] { };
             EnableInternetProviders = true;
+            EnableAutomaticSeriesGrouping = true;
         }
     }
 

+ 1 - 0
MediaBrowser.Model/Configuration/ServerConfiguration.cs

@@ -46,6 +46,7 @@ namespace MediaBrowser.Model.Configuration
         /// </summary>
         /// <value><c>true</c> if [use HTTPS]; otherwise, <c>false</c>.</value>
         public bool EnableHttps { get; set; }
+        public bool EnableSeriesPresentationUniqueKey { get; set; }
 
         /// <summary>
         /// Gets or sets the value pointing to the file system where the ssl certiifcate is located..

+ 7 - 0
MediaBrowser.Providers/TV/EpisodeMetadataService.cs

@@ -55,6 +55,13 @@ namespace MediaBrowser.Providers.TV
                 updateType |= ItemUpdateType.MetadataImport;
             }
 
+            var seriesPresentationUniqueKey = item.FindSeriesPresentationUniqueKey();
+            if (!string.Equals(item.SeriesPresentationUniqueKey, seriesPresentationUniqueKey, StringComparison.Ordinal))
+            {
+                item.SeriesPresentationUniqueKey = seriesPresentationUniqueKey;
+                updateType |= ItemUpdateType.MetadataImport;
+            }
+
             return updateType;
         }
 

+ 7 - 0
MediaBrowser.Providers/TV/SeasonMetadataService.cs

@@ -51,6 +51,13 @@ namespace MediaBrowser.Providers.TV
                 updateType |= ItemUpdateType.MetadataImport;
             }
 
+            var seriesPresentationUniqueKey = item.FindSeriesPresentationUniqueKey();
+            if (!string.Equals(item.SeriesPresentationUniqueKey, seriesPresentationUniqueKey, StringComparison.Ordinal))
+            {
+                item.SeriesPresentationUniqueKey = seriesPresentationUniqueKey;
+                updateType |= ItemUpdateType.MetadataImport;
+            }
+
             var seriesId = item.FindSeriesId();
             if (item.SeriesId != seriesId)
             {

+ 0 - 6
MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj

@@ -693,9 +693,6 @@
     <Content Include="dashboard-ui\files\dummy.mp4">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
-    <Content Include="dashboard-ui\librarypathmapping.html">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
     <Content Include="dashboard-ui\metadatanfo.html">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
@@ -876,9 +873,6 @@
     <Content Include="dashboard-ui\scripts\librarymenu.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
-    <Content Include="dashboard-ui\scripts\librarypathmapping.js">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
     <Content Include="dashboard-ui\scripts\metadatanfo.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>