diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 5d7c02f482..41329608e4 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -464,6 +464,8 @@ namespace MediaBrowser.Controller.Entities
return sortable;
}
+ public Guid ParentId { get; set; }
+
///
/// Gets or sets the parent.
///
@@ -471,6 +473,12 @@ namespace MediaBrowser.Controller.Entities
[IgnoreDataMember]
public Folder Parent { get; set; }
+ public void SetParent(Folder parent)
+ {
+ Parent = parent;
+ ParentId = parent == null ? Guid.Empty : parent.Id;
+ }
+
[IgnoreDataMember]
public IEnumerable Parents
{
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 821e6b5caf..22efb09e15 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -134,7 +134,7 @@ namespace MediaBrowser.Controller.Entities
/// Unable to add + item.Name
public async Task AddChild(BaseItem item, CancellationToken cancellationToken)
{
- item.Parent = this;
+ item.SetParent(this);
if (item.Id == Guid.Empty)
{
@@ -230,7 +230,7 @@ namespace MediaBrowser.Controller.Entities
{
RemoveChildrenInternal(new[] { item });
- item.Parent = null;
+ item.SetParent(null);
return ItemRepository.SaveChildren(Id, ActualChildren.Select(i => i.Id).ToList(), cancellationToken);
}
@@ -783,11 +783,11 @@ namespace MediaBrowser.Controller.Entities
return LibraryManager.GetOrAddByReferenceItem(item);
}
- item.Parent = this;
+ item.SetParent(this);
}
else
{
- child.Parent = this;
+ child.SetParent(this);
LibraryManager.RegisterItem(child);
item = child;
}
diff --git a/MediaBrowser.Model/Entities/MediaStream.cs b/MediaBrowser.Model/Entities/MediaStream.cs
index f842a9e3a0..0aaa8035cd 100644
--- a/MediaBrowser.Model/Entities/MediaStream.cs
+++ b/MediaBrowser.Model/Entities/MediaStream.cs
@@ -1,5 +1,4 @@
-using System.Collections.Generic;
-using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Extensions;
using System.Diagnostics;
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index ffc33fb23c..14009a94f5 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -485,12 +485,11 @@ namespace MediaBrowser.Providers.Manager
// Give it a dummy path just so that it looks like a file system item
var dummy = new T()
{
- Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy"),
-
- // Dummy this up to fool the local trailer check
- Parent = new Folder()
+ Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy")
};
+ dummy.SetParent(new Folder());
+
var options = GetMetadataOptions(dummy);
var summary = new MetadataPluginSummary
@@ -727,12 +726,11 @@ namespace MediaBrowser.Providers.Manager
// Give it a dummy path just so that it looks like a file system item
var dummy = new TItemType
{
- Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy"),
-
- // Dummy this up to fool the local trailer check
- Parent = new Folder()
+ Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy")
};
+ dummy.SetParent(new Folder());
+
var options = GetMetadataOptions(dummy);
var providers = GetMetadataProvidersInternal(dummy, options, searchInfo.IncludeDisabledProviders)
diff --git a/MediaBrowser.Providers/TV/DummySeasonProvider.cs b/MediaBrowser.Providers/TV/DummySeasonProvider.cs
index fb52825510..426ff43187 100644
--- a/MediaBrowser.Providers/TV/DummySeasonProvider.cs
+++ b/MediaBrowser.Providers/TV/DummySeasonProvider.cs
@@ -111,10 +111,11 @@ namespace MediaBrowser.Providers.TV
{
Name = seasonName,
IndexNumber = seasonNumber,
- Parent = series,
Id = (series.Id + (seasonNumber ?? -1).ToString(_usCulture) + seasonName).GetMBId(typeof(Season))
};
+ season.SetParent(series);
+
await series.AddChild(season, cancellationToken).ConfigureAwait(false);
await season.RefreshMetadata(new MetadataRefreshOptions(), cancellationToken).ConfigureAwait(false);
diff --git a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs
index d451282887..9573456078 100644
--- a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs
+++ b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs
@@ -406,10 +406,11 @@ namespace MediaBrowser.Providers.TV
Name = name,
IndexNumber = episodeNumber,
ParentIndexNumber = seasonNumber,
- Parent = season,
Id = (series.Id + seasonNumber.ToString(_usCulture) + name).GetMBId(typeof(Episode))
};
+ episode.SetParent(season);
+
await season.AddChild(episode, cancellationToken).ConfigureAwait(false);
await episode.RefreshMetadata(new MetadataRefreshOptions
diff --git a/MediaBrowser.Providers/TV/SeriesMetadataService.cs b/MediaBrowser.Providers/TV/SeriesMetadataService.cs
index 779e3c39dc..0b2aaa5a07 100644
--- a/MediaBrowser.Providers/TV/SeriesMetadataService.cs
+++ b/MediaBrowser.Providers/TV/SeriesMetadataService.cs
@@ -7,6 +7,7 @@ using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
+using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
@@ -30,7 +31,14 @@ namespace MediaBrowser.Providers.TV
{
var provider = new DummySeasonProvider(ServerConfigurationManager, Logger, _localization, LibraryManager);
- await provider.Run(item, CancellationToken.None).ConfigureAwait(false);
+ try
+ {
+ await provider.Run(item, CancellationToken.None).ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ Logger.ErrorException("Error in DummySeasonProvider", ex);
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
index 796d5f6515..04f82db6ff 100644
--- a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
+++ b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
@@ -75,7 +75,6 @@ namespace MediaBrowser.Server.Implementations.Collections
var collection = new BoxSet
{
Name = name,
- Parent = parentFolder,
Path = path,
IsLocked = options.IsLocked,
ProviderIds = options.ProviderIds,
diff --git a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs
index b6a93408ad..dac6580951 100644
--- a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs
+++ b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs
@@ -34,7 +34,7 @@ namespace MediaBrowser.Server.Implementations.Library
// If the resolver didn't specify this
if (parent != null)
{
- item.Parent = parent;
+ item.SetParent(parent);
}
item.Id = libraryManager.GetNewItemId(item.Path, item.GetType());
@@ -68,7 +68,7 @@ namespace MediaBrowser.Server.Implementations.Library
// If the resolver didn't specify this
if (args.Parent != null)
{
- item.Parent = args.Parent;
+ item.SetParent(args.Parent);
}
item.Id = libraryManager.GetNewItemId(item.Path, item.GetType());
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
index cc4b7f0744..b65ea50f49 100644
--- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
@@ -1,4 +1,3 @@
-using System.Runtime.Serialization;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
@@ -14,6 +13,7 @@ using System.Data;
using System.Globalization;
using System.IO;
using System.Linq;
+using System.Runtime.Serialization;
using System.Threading;
using System.Threading.Tasks;
@@ -154,6 +154,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
_connection.AddColumn(_logger, "TypedBaseItems", "ParentIndexNumber", "INT");
_connection.AddColumn(_logger, "TypedBaseItems", "PremiereDate", "DATETIME");
_connection.AddColumn(_logger, "TypedBaseItems", "ProductionYear", "INT");
+ _connection.AddColumn(_logger, "TypedBaseItems", "ParentId", "GUID");
PrepareStatements();
@@ -193,10 +194,11 @@ namespace MediaBrowser.Server.Implementations.Persistence
"Overview",
"ParentIndexNumber",
"PremiereDate",
- "ProductionYear"
+ "ProductionYear",
+ "ParentId"
};
_saveItemCommand = _connection.CreateCommand();
- _saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15, @16, @17, @18, @19, @20, @21)";
+ _saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15, @16, @17, @18, @19, @20, @21, @22)";
for (var i = 1; i <= saveColumns.Count; i++)
{
_saveItemCommand.Parameters.Add(_saveItemCommand, "@" + i.ToString(CultureInfo.InvariantCulture));
@@ -330,6 +332,15 @@ namespace MediaBrowser.Server.Implementations.Persistence
_saveItemCommand.GetParameter(index++).Value = item.PremiereDate;
_saveItemCommand.GetParameter(index++).Value = item.ProductionYear;
+ if (item.ParentId == Guid.Empty)
+ {
+ _saveItemCommand.GetParameter(index++).Value = null;
+ }
+ else
+ {
+ _saveItemCommand.GetParameter(index++).Value = item.ParentId;
+ }
+
_saveItemCommand.Transaction = transaction;
_saveItemCommand.ExecuteNonQuery();
diff --git a/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs b/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs
index a5cc0e0de3..311cb9b516 100644
--- a/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs
+++ b/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs
@@ -113,7 +113,6 @@ namespace MediaBrowser.Server.Implementations.Playlists
var playlist = new Playlist
{
Name = name,
- Parent = parentFolder,
Path = path
};
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index a87707ba58..7552065362 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -193,6 +193,9 @@
PreserveNewest
+
+ PreserveNewest
+
PreserveNewest
@@ -202,6 +205,9 @@
PreserveNewest
+
+ PreserveNewest
+
PreserveNewest