aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Library/LibraryManager.cs')
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs77
1 files changed, 77 insertions, 0 deletions
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index a06e03c4a..656e0993f 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -408,6 +408,83 @@ namespace MediaBrowser.Server.Implementations.Library
LibraryItemsCache.AddOrUpdate(item.Id, item, delegate { return item; });
}
+ public async Task DeleteItem(BaseItem item)
+ {
+ var parent = item.Parent;
+
+ var locationType = item.LocationType;
+
+ var children = item.IsFolder
+ ? ((Folder)item).RecursiveChildren.ToList()
+ : new List<BaseItem>();
+
+ foreach (var metadataPath in GetMetadataPaths(item, children))
+ {
+ _logger.Debug("Deleting path {0}", metadataPath);
+
+ try
+ {
+ Directory.Delete(metadataPath, true);
+ }
+ catch (DirectoryNotFoundException)
+ {
+
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error deleting {0}", ex, metadataPath);
+ }
+ }
+
+ if (locationType == LocationType.FileSystem || locationType == LocationType.Offline)
+ {
+ foreach (var path in item.GetDeletePaths().ToList())
+ {
+ if (Directory.Exists(path))
+ {
+ _logger.Debug("Deleting path {0}", path);
+ Directory.Delete(path, true);
+ }
+ else if (File.Exists(path))
+ {
+ _logger.Debug("Deleting path {0}", path);
+ File.Delete(path);
+ }
+ }
+
+ if (parent != null)
+ {
+ await parent.ValidateChildren(new Progress<double>(), CancellationToken.None)
+ .ConfigureAwait(false);
+ }
+ }
+ else if (parent != null)
+ {
+ await parent.RemoveChild(item, CancellationToken.None).ConfigureAwait(false);
+ }
+ else
+ {
+ throw new InvalidOperationException("Don't know how to delete " + item.Name);
+ }
+
+ foreach (var child in children)
+ {
+ await ItemRepository.DeleteItem(child.Id, CancellationToken.None).ConfigureAwait(false);
+ }
+ }
+
+ private IEnumerable<string> GetMetadataPaths(BaseItem item, IEnumerable<BaseItem> children)
+ {
+ var list = new List<string>
+ {
+ ConfigurationManager.ApplicationPaths.GetInternalMetadataPath(item.Id)
+ };
+
+ list.AddRange(children.Select(i => ConfigurationManager.ApplicationPaths.GetInternalMetadataPath(i.Id)));
+
+ return list;
+ }
+
/// <summary>
/// Resolves the item.
/// </summary>