aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2016-11-21 03:54:53 -0500
committerLuke Pulverenti <luke.pulverenti@gmail.com>2016-11-21 03:54:53 -0500
commitf275d7f3d2f40f5e4cbe2f97df6dbd9be8ec37fe (patch)
tree44d15fc67ebe2b131e77531cd7e14c33bd695370
parent1dc080df8ba5b9af9245788634d56cb155afd2ba (diff)
reduce library queries
-rw-r--r--Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs5
-rw-r--r--Emby.Server.Core/ApplicationHost.cs2
-rw-r--r--Emby.Server.Implementations/Activity/ActivityRepository.cs5
-rw-r--r--Emby.Server.Implementations/Data/BaseSqliteRepository.cs37
-rw-r--r--Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs5
-rw-r--r--Emby.Server.Implementations/Data/SqliteFileOrganizationRepository.cs5
-rw-r--r--Emby.Server.Implementations/Data/SqliteItemRepository.cs96
-rw-r--r--Emby.Server.Implementations/Data/SqliteUserDataRepository.cs5
-rw-r--r--Emby.Server.Implementations/Data/SqliteUserRepository.cs5
-rw-r--r--Emby.Server.Implementations/Dto/DtoService.cs16
-rw-r--r--Emby.Server.Implementations/Library/LibraryManager.cs31
-rw-r--r--Emby.Server.Implementations/Library/UserViewManager.cs30
-rw-r--r--Emby.Server.Implementations/LiveTv/LiveTvManager.cs2
-rw-r--r--Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs11
-rw-r--r--Emby.Server.Implementations/Security/AuthenticationRepository.cs5
-rw-r--r--Emby.Server.Implementations/Social/SharingRepository.cs5
-rw-r--r--Emby.Server.Implementations/Sync/SyncRepository.cs5
-rw-r--r--Emby.Server.Implementations/TV/TVSeriesManager.cs4
-rw-r--r--MediaBrowser.Api/Library/LibraryService.cs2
-rw-r--r--MediaBrowser.Api/Movies/MoviesService.cs17
-rw-r--r--MediaBrowser.Controller/Entities/Audio/Audio.cs6
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs22
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs39
-rw-r--r--MediaBrowser.Controller/Entities/InternalItemsQuery.cs1
-rw-r--r--MediaBrowser.Controller/Entities/TV/Episode.cs6
-rw-r--r--MediaBrowser.Controller/Entities/TV/Season.cs6
-rw-r--r--MediaBrowser.Controller/Entities/TV/Series.cs1
-rw-r--r--MediaBrowser.Controller/Entities/UserViewBuilder.cs10
-rw-r--r--MediaBrowser.Controller/Library/ILibraryManager.cs5
-rw-r--r--MediaBrowser.Controller/TV/ITVSeriesManager.cs2
-rw-r--r--MediaBrowser.Model/System/IEnvironmentInfo.cs1
-rw-r--r--MediaBrowser.Providers/Manager/MetadataService.cs14
32 files changed, 230 insertions, 176 deletions
diff --git a/Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs b/Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs
index c040e3931..ebd596dc4 100644
--- a/Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs
+++ b/Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs
@@ -105,5 +105,10 @@ namespace Emby.Common.Implementations.EnvironmentInfo
{
return null;
}
+
+ public string StackTrace
+ {
+ get { return Environment.StackTrace; }
+ }
}
}
diff --git a/Emby.Server.Core/ApplicationHost.cs b/Emby.Server.Core/ApplicationHost.cs
index 55a851033..d48138080 100644
--- a/Emby.Server.Core/ApplicationHost.cs
+++ b/Emby.Server.Core/ApplicationHost.cs
@@ -551,7 +551,7 @@ namespace Emby.Server.Core
DisplayPreferencesRepository = displayPreferencesRepo;
RegisterSingleInstance(DisplayPreferencesRepository);
- var itemRepo = new SqliteItemRepository(ServerConfigurationManager, JsonSerializer, LogManager.GetLogger("SqliteItemRepository"), MemoryStreamFactory, assemblyInfo, FileSystemManager);
+ var itemRepo = new SqliteItemRepository(ServerConfigurationManager, JsonSerializer, LogManager.GetLogger("SqliteItemRepository"), MemoryStreamFactory, assemblyInfo, FileSystemManager, EnvironmentInfo);
ItemRepository = itemRepo;
RegisterSingleInstance(ItemRepository);
diff --git a/Emby.Server.Implementations/Activity/ActivityRepository.cs b/Emby.Server.Implementations/Activity/ActivityRepository.cs
index 8a7573d66..eef9792de 100644
--- a/Emby.Server.Implementations/Activity/ActivityRepository.cs
+++ b/Emby.Server.Implementations/Activity/ActivityRepository.cs
@@ -29,10 +29,9 @@ namespace Emby.Server.Implementations.Activity
{
connection.ExecuteAll(string.Join(";", new[]
{
+ "PRAGMA page_size=4096",
"pragma default_temp_store = memory",
- "pragma default_synchronous=Normal",
- "pragma temp_store = memory",
- "pragma synchronous=Normal",
+ "pragma temp_store = memory"
}));
string[] queries = {
diff --git a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs
index 382c7f245..d4226ec25 100644
--- a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs
+++ b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs
@@ -40,6 +40,8 @@ namespace Emby.Server.Implementations.Data
private static bool _versionLogged;
+ private string _defaultWal;
+
protected SQLiteDatabaseConnection CreateConnection(bool isReadOnly = false, Action<SQLiteDatabaseConnection> onConnect = null)
{
if (!_versionLogged)
@@ -51,6 +53,15 @@ namespace Emby.Server.Implementations.Data
ConnectionFlags connectionFlags;
+ if (isReadOnly)
+ {
+ //Logger.Info("Opening read connection");
+ }
+ else
+ {
+ //Logger.Info("Opening write connection");
+ }
+
isReadOnly = false;
if (isReadOnly)
@@ -70,12 +81,16 @@ namespace Emby.Server.Implementations.Data
var db = SQLite3.Open(DbFilePath, connectionFlags, null);
+ if (string.IsNullOrWhiteSpace(_defaultWal))
+ {
+ _defaultWal = db.Query("PRAGMA journal_mode").SelectScalarString().First();
+ }
+
var queries = new List<string>
{
+ "PRAGMA default_temp_store=memory",
"pragma temp_store = memory",
- "PRAGMA page_size=4096",
- "PRAGMA journal_mode=WAL",
- "pragma synchronous=Normal",
+ "PRAGMA journal_mode=WAL"
//"PRAGMA cache size=-10000"
};
@@ -90,13 +105,19 @@ namespace Emby.Server.Implementations.Data
//// db.Execute(query);
////}
- using (WriteLock.Write())
- {
- db.ExecuteAll(string.Join(";", queries.ToArray()));
+ //Logger.Info("synchronous: " + db.Query("PRAGMA synchronous").SelectScalarString().First());
+ //Logger.Info("temp_store: " + db.Query("PRAGMA temp_store").SelectScalarString().First());
- if (onConnect != null)
+ //if (!string.Equals(_defaultWal, "wal", StringComparison.OrdinalIgnoreCase) || onConnect != null)
+ {
+ using (WriteLock.Write())
{
- onConnect(db);
+ db.ExecuteAll(string.Join(";", queries.ToArray()));
+
+ if (onConnect != null)
+ {
+ onConnect(db);
+ }
}
}
diff --git a/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs b/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs
index ab927ce86..17afbcfa9 100644
--- a/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs
+++ b/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs
@@ -56,10 +56,9 @@ namespace Emby.Server.Implementations.Data
{
connection.ExecuteAll(string.Join(";", new[]
{
+ "PRAGMA page_size=4096",
"pragma default_temp_store = memory",
- "pragma default_synchronous=Normal",
- "pragma temp_store = memory",
- "pragma synchronous=Normal",
+ "pragma temp_store = memory"
}));
string[] queries = {
diff --git a/Emby.Server.Implementations/Data/SqliteFileOrganizationRepository.cs b/Emby.Server.Implementations/Data/SqliteFileOrganizationRepository.cs
index a71682329..efc0ee2ed 100644
--- a/Emby.Server.Implementations/Data/SqliteFileOrganizationRepository.cs
+++ b/Emby.Server.Implementations/Data/SqliteFileOrganizationRepository.cs
@@ -33,10 +33,9 @@ namespace Emby.Server.Implementations.Data
{
connection.ExecuteAll(string.Join(";", new[]
{
+ "PRAGMA page_size=4096",
"pragma default_temp_store = memory",
- "pragma default_synchronous=Normal",
- "pragma temp_store = memory",
- "pragma synchronous=Normal",
+ "pragma temp_store = memory"
}));
string[] queries = {
diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs
index 754af9640..bc1eca06a 100644
--- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs
+++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs
@@ -29,6 +29,7 @@ using MediaBrowser.Server.Implementations.Devices;
using MediaBrowser.Server.Implementations.Playlists;
using MediaBrowser.Model.Reflection;
using SQLitePCL.pretty;
+using MediaBrowser.Model.System;
namespace Emby.Server.Implementations.Data
{
@@ -66,14 +67,14 @@ namespace Emby.Server.Implementations.Data
private readonly string _criticReviewsPath;
- public const int LatestSchemaVersion = 109;
private readonly IMemoryStreamFactory _memoryStreamProvider;
private readonly IFileSystem _fileSystem;
+ private readonly IEnvironmentInfo _environmentInfo;
/// <summary>
/// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
/// </summary>
- public SqliteItemRepository(IServerConfigurationManager config, IJsonSerializer jsonSerializer, ILogger logger, IMemoryStreamFactory memoryStreamProvider, IAssemblyInfo assemblyInfo, IFileSystem fileSystem)
+ public SqliteItemRepository(IServerConfigurationManager config, IJsonSerializer jsonSerializer, ILogger logger, IMemoryStreamFactory memoryStreamProvider, IAssemblyInfo assemblyInfo, IFileSystem fileSystem, IEnvironmentInfo environmentInfo)
: base(logger)
{
if (config == null)
@@ -89,6 +90,7 @@ namespace Emby.Server.Implementations.Data
_jsonSerializer = jsonSerializer;
_memoryStreamProvider = memoryStreamProvider;
_fileSystem = fileSystem;
+ _environmentInfo = environmentInfo;
_typeMapper = new TypeMapper(assemblyInfo);
_criticReviewsPath = Path.Combine(_config.ApplicationPaths.DataPath, "critic-reviews");
@@ -129,10 +131,9 @@ namespace Emby.Server.Implementations.Data
_connection.ExecuteAll(string.Join(";", new[]
{
- "pragma default_temp_store = memory",
- "pragma default_synchronous=Normal",
- "pragma temp_store = memory",
- "pragma synchronous=Normal",
+ "PRAGMA page_size=4096",
+ "PRAGMA default_temp_store=memory",
+ "PRAGMA temp_store=memory"
}));
var createMediaStreamsTableCommand
@@ -193,7 +194,6 @@ namespace Emby.Server.Implementations.Data
AddColumn(db, "TypedBaseItems", "ProductionYear", "INT", existingColumnNames);
AddColumn(db, "TypedBaseItems", "ParentId", "GUID", existingColumnNames);
AddColumn(db, "TypedBaseItems", "Genres", "Text", existingColumnNames);
- AddColumn(db, "TypedBaseItems", "SchemaVersion", "INT", existingColumnNames);
AddColumn(db, "TypedBaseItems", "SortName", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "RunTimeTicks", "BIGINT", existingColumnNames);
@@ -205,7 +205,6 @@ namespace Emby.Server.Implementations.Data
AddColumn(db, "TypedBaseItems", "DateModified", "DATETIME", existingColumnNames);
AddColumn(db, "TypedBaseItems", "ForcedSortName", "Text", existingColumnNames);
- AddColumn(db, "TypedBaseItems", "IsOffline", "BIT", existingColumnNames);
AddColumn(db, "TypedBaseItems", "LocationType", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "IsSeries", "BIT", existingColumnNames);
@@ -381,7 +380,6 @@ namespace Emby.Server.Implementations.Data
"data",
"StartDate",
"EndDate",
- "IsOffline",
"ChannelId",
"IsMovie",
"IsSports",
@@ -529,7 +527,6 @@ namespace Emby.Server.Implementations.Data
"ParentId",
"Genres",
"InheritedParentalRatingValue",
- "SchemaVersion",
"SortName",
"RunTimeTicks",
"OfficialRatingDescription",
@@ -539,7 +536,6 @@ namespace Emby.Server.Implementations.Data
"DateCreated",
"DateModified",
"ForcedSortName",
- "IsOffline",
"LocationType",
"PreferredMetadataLanguage",
"PreferredMetadataCountryCode",
@@ -790,7 +786,6 @@ namespace Emby.Server.Implementations.Data
}
saveItemStatement.TryBind("@InheritedParentalRatingValue", item.GetInheritedParentalRatingValue() ?? 0);
- saveItemStatement.TryBind("@SchemaVersion", LatestSchemaVersion);
saveItemStatement.TryBind("@SortName", item.SortName);
saveItemStatement.TryBind("@RunTimeTicks", item.RunTimeTicks);
@@ -803,7 +798,6 @@ namespace Emby.Server.Implementations.Data
saveItemStatement.TryBind("@DateModified", item.DateModified);
saveItemStatement.TryBind("@ForcedSortName", item.ForcedSortName);
- saveItemStatement.TryBind("@IsOffline", item.IsOffline);
saveItemStatement.TryBind("@LocationType", item.LocationType.ToString());
saveItemStatement.TryBind("@PreferredMetadataLanguage", item.PreferredMetadataLanguage);
@@ -1182,7 +1176,7 @@ namespace Emby.Server.Implementations.Data
}
CheckDisposed();
-
+ //Logger.Info("Retrieving item {0}", id.ToString("N"));
using (var connection = CreateConnection(true))
{
using (WriteLock.Read())
@@ -1369,64 +1363,72 @@ namespace Emby.Server.Implementations.Data
if (!reader.IsDBNull(4))
{
- item.IsOffline = reader.GetBoolean(4);
+ item.ChannelId = reader.GetString(4);
}
- if (!reader.IsDBNull(5))
- {
- item.ChannelId = reader.GetString(5);
- }
+ var index = 5;
var hasProgramAttributes = item as IHasProgramAttributes;
if (hasProgramAttributes != null)
{
- if (!reader.IsDBNull(6))
+ if (!reader.IsDBNull(index))
{
- hasProgramAttributes.IsMovie = reader.GetBoolean(6);
+ hasProgramAttributes.IsMovie = reader.GetBoolean(index);
}
+ index++;
- if (!reader.IsDBNull(7))
+ if (!reader.IsDBNull(index))
{
- hasProgramAttributes.IsSports = reader.GetBoolean(7);
+ hasProgramAttributes.IsSports = reader.GetBoolean(index);
}
+ index++;
- if (!reader.IsDBNull(8))
+ if (!reader.IsDBNull(index))
{
- hasProgramAttributes.IsKids = reader.GetBoolean(8);
+ hasProgramAttributes.IsKids = reader.GetBoolean(index);
}
+ index++;
- if (!reader.IsDBNull(9))
+ if (!reader.IsDBNull(index))
{
- hasProgramAttributes.IsSeries = reader.GetBoolean(9);
+ hasProgramAttributes.IsSeries = reader.GetBoolean(index);
}
+ index++;
- if (!reader.IsDBNull(10))
+ if (!reader.IsDBNull(index))
{
- hasProgramAttributes.IsLive = reader.GetBoolean(10);
+ hasProgramAttributes.IsLive = reader.GetBoolean(index);
}
+ index++;
- if (!reader.IsDBNull(11))
+ if (!reader.IsDBNull(index))
{
- hasProgramAttributes.IsNews = reader.GetBoolean(11);
+ hasProgramAttributes.IsNews = reader.GetBoolean(index);
}
+ index++;
- if (!reader.IsDBNull(12))
+ if (!reader.IsDBNull(index))
{
- hasProgramAttributes.IsPremiere = reader.GetBoolean(12);
+ hasProgramAttributes.IsPremiere = reader.GetBoolean(index);
}
+ index++;
- if (!reader.IsDBNull(13))
+ if (!reader.IsDBNull(index))
{
- hasProgramAttributes.EpisodeTitle = reader.GetString(13);
+ hasProgramAttributes.EpisodeTitle = reader.GetString(index);
}
+ index++;
- if (!reader.IsDBNull(14))
+ if (!reader.IsDBNull(index))
{
- hasProgramAttributes.IsRepeat = reader.GetBoolean(14);
+ hasProgramAttributes.IsRepeat = reader.GetBoolean(index);
}
+ index++;
+ }
+ else
+ {
+ index += 9;
}
-
- var index = 15;
if (!reader.IsDBNull(index))
{
@@ -2368,6 +2370,8 @@ namespace Emby.Server.Implementations.Data
CheckDisposed();
+ //Logger.Info("GetItemList: " + _environmentInfo.StackTrace);
+
var now = DateTime.UtcNow;
var list = new List<BaseItem>();
@@ -2533,6 +2537,7 @@ namespace Emby.Server.Implementations.Data
TotalRecordCount = returnList.Count
};
}
+ //Logger.Info("GetItems: " + _environmentInfo.StackTrace);
var now = DateTime.UtcNow;
@@ -2770,6 +2775,7 @@ namespace Emby.Server.Implementations.Data
}
CheckDisposed();
+ //Logger.Info("GetItemIdsList: " + _environmentInfo.StackTrace);
var now = DateTime.UtcNow;
@@ -2928,6 +2934,7 @@ namespace Emby.Server.Implementations.Data
TotalRecordCount = returnList.Count
};
}
+ //Logger.Info("GetItemIds: " + _environmentInfo.StackTrace);
var now = DateTime.UtcNow;
@@ -3053,14 +3060,6 @@ namespace Emby.Server.Implementations.Data
statement.TryBind("@IsLocked", query.IsLocked);
}
}
- if (query.IsOffline.HasValue)
- {
- whereClauses.Add("IsOffline=@IsOffline");
- if (statement != null)
- {
- statement.TryBind("@IsOffline", query.IsOffline);
- }
- }
var exclusiveProgramAttribtues = !(query.IsMovie ?? true) ||
!(query.IsSports ?? true) ||
@@ -4721,7 +4720,7 @@ namespace Emby.Server.Implementations.Data
using (var connection = CreateConnection(true))
{
- using (WriteLock.Write())
+ using (WriteLock.Read())
{
foreach (var row in connection.Query(commandText))
{
@@ -4750,6 +4749,7 @@ namespace Emby.Server.Implementations.Data
}
CheckDisposed();
+ //Logger.Info("GetItemValues: " + _environmentInfo.StackTrace);
var now = DateTime.UtcNow;
diff --git a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs
index 0b4768c14..9f7cce13b 100644
--- a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs
+++ b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs
@@ -45,10 +45,9 @@ namespace Emby.Server.Implementations.Data
{
connection.ExecuteAll(string.Join(";", new[]
{
+ "PRAGMA page_size=4096",
"pragma default_temp_store = memory",
- "pragma default_synchronous=Normal",
- "pragma temp_store = memory",
- "pragma synchronous=Normal",
+ "pragma temp_store = memory"
}));
string[] queries = {
diff --git a/Emby.Server.Implementations/Data/SqliteUserRepository.cs b/Emby.Server.Implementations/Data/SqliteUserRepository.cs
index 0a2f9e7cd..f902d981f 100644
--- a/Emby.Server.Implementations/Data/SqliteUserRepository.cs
+++ b/Emby.Server.Implementations/Data/SqliteUserRepository.cs
@@ -52,10 +52,9 @@ namespace Emby.Server.Implementations.Data
{
connection.ExecuteAll(string.Join(";", new[]
{
+ "PRAGMA page_size=4096",
"pragma default_temp_store = memory",
- "pragma default_synchronous=Normal",
- "pragma temp_store = memory",
- "pragma synchronous=Normal",
+ "pragma temp_store = memory"
}));
string[] queries = {
diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs
index 85549439b..438fc55d7 100644
--- a/Emby.Server.Implementations/Dto/DtoService.cs
+++ b/Emby.Server.Implementations/Dto/DtoService.cs
@@ -482,7 +482,7 @@ namespace Emby.Server.Implementations.Dto
{
if (dtoOptions.EnableUserData)
{
- dto.UserData = _userDataRepository.GetUserDataDto(item, user).Result;
+ dto.UserData = await _userDataRepository.GetUserDataDto(item, user).ConfigureAwait(false);
}
}
@@ -1450,11 +1450,19 @@ namespace Emby.Server.Implementations.Dto
private void AddInheritedImages(BaseItemDto dto, BaseItem item, DtoOptions options, BaseItem owner)
{
+ if (!item.SupportsInheritedParentImages)
+ {
+ return;
+ }
+
var logoLimit = options.GetImageLimit(ImageType.Logo);
var artLimit = options.GetImageLimit(ImageType.Art);
var thumbLimit = options.GetImageLimit(ImageType.Thumb);
var backdropLimit = options.GetImageLimit(ImageType.Backdrop);
+ // For now. Emby apps are not using this
+ artLimit = 0;
+
if (logoLimit == 0 && artLimit == 0 && thumbLimit == 0 && backdropLimit == 0)
{
return;
@@ -1515,6 +1523,12 @@ namespace Emby.Server.Implementations.Dto
}
isFirst = false;
+
+ if (!parent.SupportsInheritedParentImages)
+ {
+ break;
+ }
+
parent = parent.GetParent();
}
}
diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs
index 13c6485e5..283d193dd 100644
--- a/Emby.Server.Implementations/Library/LibraryManager.cs
+++ b/Emby.Server.Implementations/Library/LibraryManager.cs
@@ -339,11 +339,6 @@ namespace Emby.Server.Implementations.Library
{
throw new ArgumentNullException("item");
}
- RegisterItem(item.Id, item);
- }
-
- private void RegisterItem(Guid id, BaseItem item)
- {
if (item is IItemByName)
{
if (!(item is MusicArtist))
@@ -354,13 +349,13 @@ namespace Emby.Server.Implementations.Library
if (item.IsFolder)
{
- if (!(item is ICollectionFolder) && !(item is UserView) && !(item is Channel) && !(item is AggregateFolder))
- {
- if (item.SourceType != SourceType.Library)
- {
- return;
- }
- }
+ //if (!(item is ICollectionFolder) && !(item is UserView) && !(item is Channel) && !(item is AggregateFolder))
+ //{
+ // if (item.SourceType != SourceType.Library)
+ // {
+ // return;
+ // }
+ //}
}
else
{
@@ -370,7 +365,7 @@ namespace Emby.Server.Implementations.Library
}
}
- LibraryItemsCache.AddOrUpdate(id, item, delegate { return item; });
+ LibraryItemsCache.AddOrUpdate(item.Id, item, delegate { return item; });
}
public async Task DeleteItem(BaseItem item, DeleteOptions options)
@@ -822,7 +817,7 @@ namespace Emby.Server.Implementations.Library
return _userRootFolder;
}
-
+
public BaseItem FindByPath(string path, bool? isFolder)
{
// If this returns multiple items it could be tricky figuring out which one is correct.
@@ -836,7 +831,7 @@ namespace Emby.Server.Implementations.Library
SortOrder = SortOrder.Descending,
Limit = 1
};
-
+
return GetItemList(query)
.FirstOrDefault();
}
@@ -1273,10 +1268,8 @@ namespace Emby.Server.Implementations.Library
return ItemRepository.GetItemList(query);
}
- public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query, IEnumerable<string> parentIds)
+ public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query, List<BaseItem> parents)
{
- var parents = parentIds.Select(i => GetItemById(new Guid(i))).Where(i => i != null).ToList();
-
SetTopParentIdsOrAncestors(query, parents);
if (query.AncestorIds.Length == 0 && query.TopParentIds.Length == 0)
@@ -1536,7 +1529,7 @@ namespace Emby.Server.Implementations.Library
}
// Handle grouping
- if (user != null && !string.IsNullOrWhiteSpace(view.ViewType) && UserView.IsEligibleForGrouping(view.ViewType))
+ if (user != null && !string.IsNullOrWhiteSpace(view.ViewType) && UserView.IsEligibleForGrouping(view.ViewType) && user.Configuration.GroupedFolders.Length > 0)
{
return user.RootFolder
.GetChildren(user, true)
diff --git a/Emby.Server.Implementations/Library/UserViewManager.cs b/Emby.Server.Implementations/Library/UserViewManager.cs
index b93f565a3..f7cc8bb73 100644
--- a/Emby.Server.Implementations/Library/UserViewManager.cs
+++ b/Emby.Server.Implementations/Library/UserViewManager.cs
@@ -245,20 +245,26 @@ namespace Emby.Server.Implementations.Library
var includeItemTypes = request.IncludeItemTypes;
var limit = request.Limit ?? 10;
- var parentIds = string.IsNullOrEmpty(parentId)
- ? new string[] { }
- : new[] { parentId };
+ var parents = new List<BaseItem>();
- if (parentIds.Length == 0)
+ if (!string.IsNullOrWhiteSpace(parentId))
{
- parentIds = user.RootFolder.GetChildren(user, true)
- .OfType<Folder>()
- .Select(i => i.Id.ToString("N"))
- .Where(i => !user.Configuration.LatestItemsExcludes.Contains(i))
- .ToArray();
+ var parent = _libraryManager.GetItemById(parentId) as Folder;
+ if (parent != null)
+ {
+ parents.Add(parent);
+ }
+ }
+
+ if (parents.Count == 0)
+ {
+ parents = user.RootFolder.GetChildren(user, true)
+ .Where(i => i is Folder)
+ .Where(i => !user.Configuration.LatestItemsExcludes.Contains(i.Id.ToString("N")))
+ .ToList();
}
- if (parentIds.Length == 0)
+ if (parents.Count == 0)
{
return new List<BaseItem>();
}
@@ -283,10 +289,10 @@ namespace Emby.Server.Implementations.Library
ExcludeItemTypes = excludeItemTypes,
ExcludeLocationTypes = new[] { LocationType.Virtual },
Limit = limit * 5,
- SourceTypes = parentIds.Length == 0 ? new[] { SourceType.Library } : new SourceType[] { },
+ SourceTypes = parents.Count == 0 ? new[] { SourceType.Library } : new SourceType[] { },
IsPlayed = request.IsPlayed
- }, parentIds);
+ }, parents);
}
}
}
diff --git a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs
index 3a6f23fe9..faf9687f4 100644
--- a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs
+++ b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs
@@ -491,7 +491,7 @@ namespace Emby.Server.Implementations.LiveTv
var id = _tvDtoService.GetInternalChannelId(serviceName, channelInfo.Id);
- var item = _itemRepo.RetrieveItem(id) as LiveTvChannel;
+ var item = _libraryManager.GetItemById(id) as LiveTvChannel;
if (item == null)
{
diff --git a/Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs b/Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs
index 5fc691527..66ef5d5d1 100644
--- a/Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs
+++ b/Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs
@@ -31,10 +31,9 @@ namespace Emby.Server.Implementations.Notifications
{
connection.ExecuteAll(string.Join(";", new[]
{
+ "PRAGMA page_size=4096",
"pragma default_temp_store = memory",
- "pragma default_synchronous=Normal",
- "pragma temp_store = memory",
- "pragma synchronous=Normal",
+ "pragma temp_store = memory"
}));
string[] queries = {
@@ -57,9 +56,9 @@ namespace Emby.Server.Implementations.Notifications
{
var result = new NotificationResult();
- using (WriteLock.Read())
+ using (var connection = CreateConnection(true))
{
- using (var connection = CreateConnection(true))
+ //using (WriteLock.Read())
{
var clauses = new List<string>();
var paramList = new List<object>();
@@ -114,7 +113,7 @@ namespace Emby.Server.Implementations.Notifications
using (var connection = CreateConnection(true))
{
- using (WriteLock.Read())
+ //using (WriteLock.Read())
{
using (var statement = connection.PrepareStatement("select Level from Notifications where UserId=@UserId and IsRead=@IsRead"))
{
diff --git a/Emby.Server.Implementations/Security/AuthenticationRepository.cs b/Emby.Server.Implementations/Security/AuthenticationRepository.cs
index 0a598e9a7..dad05718c 100644
--- a/Emby.Server.Implementations/Security/AuthenticationRepository.cs
+++ b/Emby.Server.Implementations/Security/AuthenticationRepository.cs
@@ -32,10 +32,9 @@ namespace Emby.Server.Implementations.Security
{
connection.ExecuteAll(string.Join(";", new[]
{
+ "PRAGMA page_size=4096",
"pragma default_temp_store = memory",
- "pragma default_synchronous=Normal",
- "pragma temp_store = memory",
- "pragma synchronous=Normal",
+ "pragma temp_store = memory"
}));
string[] queries = {
diff --git a/Emby.Server.Implementations/Social/SharingRepository.cs b/Emby.Server.Implementations/Social/SharingRepository.cs
index e0ee62780..6dab54bc6 100644
--- a/Emby.Server.Implementations/Social/SharingRepository.cs
+++ b/Emby.Server.Implementations/Social/SharingRepository.cs
@@ -29,10 +29,9 @@ namespace Emby.Server.Implementations.Social
{
connection.ExecuteAll(string.Join(";", new[]
{
+ "PRAGMA page_size=4096",
"pragma default_temp_store = memory",
- "pragma default_synchronous=Normal",
- "pragma temp_store = memory",
- "pragma synchronous=Normal",
+ "pragma temp_store = memory"
}));
string[] queries = {
diff --git a/Emby.Server.Implementations/Sync/SyncRepository.cs b/Emby.Server.Implementations/Sync/SyncRepository.cs
index 36558142b..308c3bd00 100644
--- a/Emby.Server.Implementations/Sync/SyncRepository.cs
+++ b/Emby.Server.Implementations/Sync/SyncRepository.cs
@@ -45,10 +45,9 @@ namespace Emby.Server.Implementations.Sync
{
connection.ExecuteAll(string.Join(";", new[]
{
+ "PRAGMA page_size=4096",
"pragma default_temp_store = memory",
- "pragma default_synchronous=Normal",
- "pragma temp_store = memory",
- "pragma synchronous=Normal",
+ "pragma temp_store = memory"
}));
string[] queries = {
diff --git a/Emby.Server.Implementations/TV/TVSeriesManager.cs b/Emby.Server.Implementations/TV/TVSeriesManager.cs
index a47aaa305..fd576e081 100644
--- a/Emby.Server.Implementations/TV/TVSeriesManager.cs
+++ b/Emby.Server.Implementations/TV/TVSeriesManager.cs
@@ -72,7 +72,7 @@ namespace Emby.Server.Implementations.TV
return GetResult(episodes, null, request);
}
- public QueryResult<BaseItem> GetNextUp(NextUpQuery request, IEnumerable<Folder> parentsFolders)
+ public QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders)
{
var user = _userManager.GetUserById(request.UserId);
@@ -106,7 +106,7 @@ namespace Emby.Server.Implementations.TV
PresentationUniqueKey = presentationUniqueKey,
Limit = limit
- }, parentsFolders.Select(i => i.Id.ToString("N"))).Cast<Series>();
+ }, parentsFolders.Cast<BaseItem>().ToList()).Cast<Series>();
// Avoid implicitly captured closure
var episodes = GetNextUpEpisodes(request, user, items);
diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs
index 36a58cc20..695718a25 100644
--- a/MediaBrowser.Api/Library/LibraryService.cs
+++ b/MediaBrowser.Api/Library/LibraryService.cs
@@ -369,7 +369,7 @@ namespace MediaBrowser.Api.Library
if (item is Movie || (program != null && program.IsMovie) || item is Trailer)
{
- return new MoviesService(_userManager, _userDataManager, _libraryManager, _itemRepo, _dtoService, _config, _authContext)
+ return new MoviesService(_userManager, _libraryManager, _dtoService, _config, _authContext)
{
Request = Request,
diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs
index 1b2fa4fff..b5c6f52fc 100644
--- a/MediaBrowser.Api/Movies/MoviesService.cs
+++ b/MediaBrowser.Api/Movies/MoviesService.cs
@@ -78,16 +78,8 @@ namespace MediaBrowser.Api.Movies
/// </summary>
private readonly IUserManager _userManager;
- /// <summary>
- /// The _user data repository
- /// </summary>
- private readonly IUserDataManager _userDataRepository;
- /// <summary>
- /// The _library manager
- /// </summary>
private readonly ILibraryManager _libraryManager;
- private readonly IItemRepository _itemRepo;
private readonly IDtoService _dtoService;
private readonly IServerConfigurationManager _config;
private readonly IAuthorizationContext _authContext;
@@ -95,17 +87,10 @@ namespace MediaBrowser.Api.Movies
/// <summary>
/// Initializes a new instance of the <see cref="MoviesService" /> class.
/// </summary>
- /// <param name="userManager">The user manager.</param>
- /// <param name="userDataRepository">The user data repository.</param>
- /// <param name="libraryManager">The library manager.</param>
- /// <param name="itemRepo">The item repo.</param>
- /// <param name="dtoService">The dto service.</param>
- public MoviesService(IUserManager userManager, IUserDataManager userDataRepository, ILibraryManager libraryManager, IItemRepository itemRepo, IDtoService dtoService, IServerConfigurationManager config, IAuthorizationContext authContext)
+ public MoviesService(IUserManager userManager, ILibraryManager libraryManager, IDtoService dtoService, IServerConfigurationManager config, IAuthorizationContext authContext)
{
_userManager = userManager;
- _userDataRepository = userDataRepository;
_libraryManager = libraryManager;
- _itemRepo = itemRepo;
_dtoService = dtoService;
_config = config;
_authContext = authContext;
diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs
index 539cc5f22..e4f638cb6 100644
--- a/MediaBrowser.Controller/Entities/Audio/Audio.cs
+++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs
@@ -62,6 +62,12 @@ namespace MediaBrowser.Controller.Entities.Audio
}
[IgnoreDataMember]
+ public override bool SupportsInheritedParentImages
+ {
+ get { return true; }
+ }
+
+ [IgnoreDataMember]
protected override bool SupportsOwnedItems
{
get
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index cd61d2cce..b7ea7a92d 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -1569,6 +1569,12 @@ namespace MediaBrowser.Controller.Entities
return IsVisibleStandaloneInternal(user, true);
}
+ [IgnoreDataMember]
+ public virtual bool SupportsInheritedParentImages
+ {
+ get { return false; }
+ }
+
protected bool IsVisibleStandaloneInternal(User user, bool checkFolders)
{
if (!IsVisible(user))
@@ -2329,17 +2335,25 @@ namespace MediaBrowser.Controller.Entities
{
get
{
- if (GetParent() is AggregateFolder || this is BasePluginFolder || this is Channel)
+ if (this is BasePluginFolder || this is Channel)
{
return true;
}
var view = this as UserView;
- if (view != null && string.Equals(view.ViewType, CollectionType.LiveTv, StringComparison.OrdinalIgnoreCase))
+ if (view != null)
{
- return true;
+ if (string.Equals(view.ViewType, CollectionType.LiveTv, StringComparison.OrdinalIgnoreCase))
+ {
+ return true;
+ }
+ if (string.Equals(view.ViewType, CollectionType.Channels, StringComparison.OrdinalIgnoreCase))
+ {
+ return true;
+ }
}
- if (view != null && string.Equals(view.ViewType, CollectionType.Channels, StringComparison.OrdinalIgnoreCase))
+
+ if (GetParent() is AggregateFolder)
{
return true;
}
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 3df77673f..d4ddab7b2 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -1383,6 +1383,15 @@ namespace MediaBrowser.Controller.Entities
{
return false;
}
+ var iItemByName = this as IItemByName;
+ if (iItemByName != null)
+ {
+ var hasDualAccess = this as IHasDualAccess;
+ if (hasDualAccess == null || hasDualAccess.IsAccessedByName)
+ {
+ return false;
+ }
+ }
return true;
}
@@ -1395,17 +1404,6 @@ namespace MediaBrowser.Controller.Entities
return;
}
- var unplayedQueryResult = await GetItems(new InternalItemsQuery(user)
- {
- Recursive = true,
- IsFolder = false,
- IsVirtualItem = false,
- EnableTotalRecordCount = true,
- Limit = 0,
- IsPlayed = false
-
- }).ConfigureAwait(false);
-
var allItemsQueryResult = await GetItems(new InternalItemsQuery(user)
{
Recursive = true,
@@ -1415,17 +1413,28 @@ namespace MediaBrowser.Controller.Entities
Limit = 0
}).ConfigureAwait(false);
+ var recursiveItemCount = allItemsQueryResult.TotalRecordCount;
if (itemDto != null)
{
itemDto.RecursiveItemCount = allItemsQueryResult.TotalRecordCount;
}
- var recursiveItemCount = allItemsQueryResult.TotalRecordCount;
- double unplayedCount = unplayedQueryResult.TotalRecordCount;
-
- if (recursiveItemCount > 0)
+ if (recursiveItemCount > 0 && SupportsPlayedStatus)
{
+ var unplayedQueryResult = recursiveItemCount > 0 ? await GetItems(new InternalItemsQuery(user)
+ {
+ Recursive = true,
+ IsFolder = false,
+ IsVirtualItem = false,
+ EnableTotalRecordCount = true,
+ Limit = 0,
+ IsPlayed = false
+
+ }).ConfigureAwait(false) : new QueryResult<BaseItem>();
+
+ double unplayedCount = unplayedQueryResult.TotalRecordCount;
+
var unplayedPercentage = (unplayedCount / recursiveItemCount) * 100;
dto.PlayedPercentage = 100 - unplayedPercentage;
dto.Played = dto.PlayedPercentage.Value >= 100;
diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
index 94baacf13..be6e95ddd 100644
--- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
+++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
@@ -124,7 +124,6 @@ namespace MediaBrowser.Controller.Entities
public int? MaxParentalRating { get; set; }
public bool? HasDeadParentId { get; set; }
- public bool? IsOffline { get; set; }
public bool? IsVirtualItem { get; set; }
public Guid? ParentId { get; set; }
diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs
index 99abf5611..29a63f317 100644
--- a/MediaBrowser.Controller/Entities/TV/Episode.cs
+++ b/MediaBrowser.Controller/Entities/TV/Episode.cs
@@ -71,6 +71,12 @@ namespace MediaBrowser.Controller.Entities.TV
{
return IsStacked || MediaSourceCount > 1;
}
+ }
+
+ [IgnoreDataMember]
+ public override bool SupportsInheritedParentImages
+ {
+ get { return true; }
}
[IgnoreDataMember]
diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs
index d8a9a16c1..2663a9dd5 100644
--- a/MediaBrowser.Controller/Entities/TV/Season.cs
+++ b/MediaBrowser.Controller/Entities/TV/Season.cs
@@ -40,6 +40,12 @@ namespace MediaBrowser.Controller.Entities.TV
}
[IgnoreDataMember]
+ public override bool SupportsInheritedParentImages
+ {
+ get { return true; }
+ }
+
+ [IgnoreDataMember]
public override Guid? DisplayParentId
{
get
diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs
index a997d3476..69a3a67c8 100644
--- a/MediaBrowser.Controller/Entities/TV/Series.cs
+++ b/MediaBrowser.Controller/Entities/TV/Series.cs
@@ -135,7 +135,6 @@ namespace MediaBrowser.Controller.Entities.TV
{
AncestorWithPresentationUniqueKey = GetUniqueSeriesKey(this),
IncludeItemTypes = new[] { typeof(Season).Name },
- SortBy = new[] { ItemSortBy.SortName },
IsVirtualItem = false,
Limit = 0
});
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index 3820de83d..d5781d21e 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -1812,7 +1812,7 @@ namespace MediaBrowser.Controller.Entities
.Where(i => user.IsFolderGrouped(i.Id) && UserView.IsEligibleForGrouping(i));
}
- private IEnumerable<Folder> GetMediaFolders(User user, IEnumerable<string> viewTypes)
+ private List<Folder> GetMediaFolders(User user, IEnumerable<string> viewTypes)
{
if (user == null)
{
@@ -1822,7 +1822,7 @@ namespace MediaBrowser.Controller.Entities
var folder = i as ICollectionFolder;
return folder != null && viewTypes.Contains(folder.CollectionType ?? string.Empty, StringComparer.OrdinalIgnoreCase);
- });
+ }).ToList();
}
return GetMediaFolders(user)
.Where(i =>
@@ -1830,17 +1830,17 @@ namespace MediaBrowser.Controller.Entities
var folder = i as ICollectionFolder;
return folder != null && viewTypes.Contains(folder.CollectionType ?? string.Empty, StringComparer.OrdinalIgnoreCase);
- });
+ }).ToList();
}
- private IEnumerable<Folder> GetMediaFolders(Folder parent, User user, IEnumerable<string> viewTypes)
+ private List<Folder> GetMediaFolders(Folder parent, User user, IEnumerable<string> viewTypes)
{
if (parent == null || parent is UserView)
{
return GetMediaFolders(user, viewTypes);
}
- return new[] { parent };
+ return new List<Folder> { parent };
}
private IEnumerable<BaseItem> GetRecursiveChildren(Folder parent, User user, IEnumerable<string> viewTypes)
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index acdd9a042..955230b8a 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -538,10 +538,7 @@ namespace MediaBrowser.Controller.Library
/// <summary>
/// Gets the items.
/// </summary>
- /// <param name="query">The query.</param>
- /// <param name="parentIds">The parent ids.</param>
- /// <returns>List&lt;BaseItem&gt;.</returns>
- IEnumerable<BaseItem> GetItemList(InternalItemsQuery query, IEnumerable<string> parentIds);
+ IEnumerable<BaseItem> GetItemList(InternalItemsQuery query, List<BaseItem> parents);
/// <summary>
/// Gets the items result.
diff --git a/MediaBrowser.Controller/TV/ITVSeriesManager.cs b/MediaBrowser.Controller/TV/ITVSeriesManager.cs
index 3d6e87474..771fa602a 100644
--- a/MediaBrowser.Controller/TV/ITVSeriesManager.cs
+++ b/MediaBrowser.Controller/TV/ITVSeriesManager.cs
@@ -19,6 +19,6 @@ namespace MediaBrowser.Controller.TV
/// <param name="request">The request.</param>
/// <param name="parentsFolders">The parents folders.</param>
/// <returns>QueryResult&lt;BaseItem&gt;.</returns>
- QueryResult<BaseItem> GetNextUp(NextUpQuery request, IEnumerable<Folder> parentsFolders);
+ QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders);
}
}
diff --git a/MediaBrowser.Model/System/IEnvironmentInfo.cs b/MediaBrowser.Model/System/IEnvironmentInfo.cs
index 7e7d81e30..f9795a568 100644
--- a/MediaBrowser.Model/System/IEnvironmentInfo.cs
+++ b/MediaBrowser.Model/System/IEnvironmentInfo.cs
@@ -14,6 +14,7 @@ namespace MediaBrowser.Model.System
Architecture SystemArchitecture { get; }
string GetEnvironmentVariable(string name);
string GetUserId();
+ string StackTrace { get; }
}
public enum OperatingSystem
diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs
index 3046fc395..0491e800f 100644
--- a/MediaBrowser.Providers/Manager/MetadataService.cs
+++ b/MediaBrowser.Providers/Manager/MetadataService.cs
@@ -536,7 +536,7 @@ namespace MediaBrowser.Providers.Manager
refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataImport;
// Only one local provider allowed per item
- if (item.IsLocked || IsFullLocalMetadata(localItem.Item))
+ if (item.IsLocked || localItem.Item.IsLocked || IsFullLocalMetadata(localItem.Item))
{
hasLocalMetadata = true;
}
@@ -573,14 +573,16 @@ namespace MediaBrowser.Providers.Manager
{
if (refreshResult.UpdateType > ItemUpdateType.None)
{
- // If no local metadata, take data from item itself
- if (!hasLocalMetadata)
+ if (hasLocalMetadata)
+ {
+ MergeData(temp, metadata, item.LockedFields, true, true);
+ }
+ else
{
// TODO: If the new metadata from above has some blank data, this can cause old data to get filled into those empty fields
- MergeData(metadata, temp, new List<MetadataFields>(), false, true);
+ MergeData(metadata, temp, new List<MetadataFields>(), false, false);
+ MergeData(temp, metadata, item.LockedFields, true, false);
}
-
- MergeData(temp, metadata, item.LockedFields, true, true);
}
}