diff --git a/Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs b/Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
index 299da07445..0e771cbecc 100644
--- a/Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
+++ b/Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
@@ -260,7 +260,7 @@ namespace Emby.Server.Implementations.EntryPoints
LibraryUpdateTimer.Change(LibraryUpdateDuration, Timeout.Infinite);
}
- var parent = e.Item.GetParent() as Folder;
+ var parent = e.Parent as Folder;
if (parent != null)
{
_foldersRemovedFrom.Add(parent);
@@ -363,10 +363,16 @@ namespace Emby.Server.Implementations.EntryPoints
/// The folders removed from.
/// The user id.
/// LibraryUpdateInfo.
- private LibraryUpdateInfo GetLibraryUpdateInfo(IEnumerable itemsAdded, IEnumerable itemsUpdated, IEnumerable itemsRemoved, IEnumerable foldersAddedTo, IEnumerable foldersRemovedFrom, Guid userId)
+ private LibraryUpdateInfo GetLibraryUpdateInfo(List itemsAdded, List itemsUpdated, List itemsRemoved, List foldersAddedTo, List foldersRemovedFrom, Guid userId)
{
var user = _userManager.GetUserById(userId);
+ var newAndRemoved = new List();
+ newAndRemoved.AddRange(foldersAddedTo);
+ newAndRemoved.AddRange(foldersRemovedFrom);
+
+ var allUserRootChildren = _libraryManager.GetUserRootFolder().GetChildren(user, true).OfType().ToList();
+
return new LibraryUpdateInfo
{
ItemsAdded = itemsAdded.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user)).Select(i => i.Id.ToString("N")).Distinct().ToArray(),
@@ -377,7 +383,9 @@ namespace Emby.Server.Implementations.EntryPoints
FoldersAddedTo = foldersAddedTo.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user)).Select(i => i.Id.ToString("N")).Distinct().ToArray(),
- FoldersRemovedFrom = foldersRemovedFrom.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user)).Select(i => i.Id.ToString("N")).Distinct().ToArray()
+ FoldersRemovedFrom = foldersRemovedFrom.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user)).Select(i => i.Id.ToString("N")).Distinct().ToArray(),
+
+ CollectionFolders = GetTopParentIds(newAndRemoved, user, allUserRootChildren).ToArray()
};
}
@@ -396,6 +404,28 @@ namespace Emby.Server.Implementations.EntryPoints
return item.SourceType == SourceType.Library;
}
+ private IEnumerable GetTopParentIds(List items, User user, List allUserRootChildren)
+ {
+ var list = new List();
+
+ foreach (var item in items)
+ {
+ // If the physical root changed, return the user root
+ if (item is AggregateFolder)
+ {
+ continue;
+ }
+
+ var collectionFolders = _libraryManager.GetCollectionFolders(item, allUserRootChildren);
+ foreach (var folder in allUserRootChildren)
+ {
+ list.Add(folder.Id.ToString("N"));
+ }
+ }
+
+ return list.Distinct(StringComparer.Ordinal);
+ }
+
///
/// Translates the physical item to user library.
///
diff --git a/Emby.Server.Implementations/IO/LibraryMonitor.cs b/Emby.Server.Implementations/IO/LibraryMonitor.cs
index c99b601c90..a2abb2a5c9 100644
--- a/Emby.Server.Implementations/IO/LibraryMonitor.cs
+++ b/Emby.Server.Implementations/IO/LibraryMonitor.cs
@@ -237,7 +237,7 @@ namespace Emby.Server.Implementations.IO
/// The instance containing the event data.
void LibraryManager_ItemRemoved(object sender, ItemChangeEventArgs e)
{
- if (e.Item.GetParent() is AggregateFolder)
+ if (e.Parent is AggregateFolder)
{
StopWatchingPath(e.Item.Path);
}
@@ -250,7 +250,7 @@ namespace Emby.Server.Implementations.IO
/// The instance containing the event data.
void LibraryManager_ItemAdded(object sender, ItemChangeEventArgs e)
{
- if (e.Item.GetParent() is AggregateFolder)
+ if (e.Parent is AggregateFolder)
{
StartWatching(e.Item);
}
@@ -320,7 +320,8 @@ namespace Emby.Server.Implementations.IO
IncludeSubdirectories = true
};
- if (_environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Windows)
+ if (_environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Windows ||
+ _environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.OSX)
{
newWatcher.InternalBufferSize = 32767;
}
diff --git a/Emby.Server.Implementations/IO/ManagedFileSystem.cs b/Emby.Server.Implementations/IO/ManagedFileSystem.cs
index 125d9e980f..c8e4031a90 100644
--- a/Emby.Server.Implementations/IO/ManagedFileSystem.cs
+++ b/Emby.Server.Implementations/IO/ManagedFileSystem.cs
@@ -473,6 +473,11 @@ namespace Emby.Server.Implementations.IO
public void SetHidden(string path, bool isHidden)
{
+ if (_environmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows)
+ {
+ return;
+ }
+
if (_sharpCifsFileSystem.IsEnabledForPath(path))
{
_sharpCifsFileSystem.SetHidden(path, isHidden);
@@ -498,6 +503,11 @@ namespace Emby.Server.Implementations.IO
public void SetReadOnly(string path, bool isReadOnly)
{
+ if (_environmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows)
+ {
+ return;
+ }
+
if (_sharpCifsFileSystem.IsEnabledForPath(path))
{
_sharpCifsFileSystem.SetReadOnly(path, isReadOnly);
@@ -523,6 +533,11 @@ namespace Emby.Server.Implementations.IO
public void SetAttributes(string path, bool isHidden, bool isReadOnly)
{
+ if (_environmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows)
+ {
+ return;
+ }
+
if (_sharpCifsFileSystem.IsEnabledForPath(path))
{
_sharpCifsFileSystem.SetAttributes(path, isHidden, isReadOnly);
diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs
index f71e2714ac..2934a51479 100644
--- a/Emby.Server.Implementations/Library/LibraryManager.cs
+++ b/Emby.Server.Implementations/Library/LibraryManager.cs
@@ -443,7 +443,7 @@ namespace Emby.Server.Implementations.Library
BaseItem removed;
_libraryItemsCache.TryRemove(item.Id, out removed);
- ReportItemRemoved(item);
+ ReportItemRemoved(item, parent);
}
private IEnumerable GetMetadataPaths(BaseItem item, IEnumerable children)
@@ -1804,7 +1804,7 @@ namespace Emby.Server.Implementations.Library
/// Task.
public void CreateItem(BaseItem item, CancellationToken cancellationToken)
{
- CreateItems(new[] { item }, cancellationToken);
+ CreateItems(new[] { item }, item.GetParent(), cancellationToken);
}
///
@@ -1813,7 +1813,7 @@ namespace Emby.Server.Implementations.Library
/// The items.
/// The cancellation token.
/// Task.
- public void CreateItems(IEnumerable items, CancellationToken cancellationToken)
+ public void CreateItems(IEnumerable items, BaseItem parent, CancellationToken cancellationToken)
{
var list = items.ToList();
@@ -1830,7 +1830,11 @@ namespace Emby.Server.Implementations.Library
{
try
{
- ItemAdded(this, new ItemChangeEventArgs { Item = item });
+ ItemAdded(this, new ItemChangeEventArgs
+ {
+ Item = item,
+ Parent = parent ?? item.GetParent()
+ });
}
catch (Exception ex)
{
@@ -1878,6 +1882,7 @@ namespace Emby.Server.Implementations.Library
ItemUpdated(this, new ItemChangeEventArgs
{
Item = item,
+ Parent = item.GetParent(),
UpdateReason = updateReason
});
}
@@ -1892,13 +1897,17 @@ namespace Emby.Server.Implementations.Library
/// Reports the item removed.
///
/// The item.
- public void ReportItemRemoved(BaseItem item)
+ public void ReportItemRemoved(BaseItem item, BaseItem parent)
{
if (ItemRemoved != null)
{
try
{
- ItemRemoved(this, new ItemChangeEventArgs { Item = item });
+ ItemRemoved(this, new ItemChangeEventArgs
+ {
+ Item = item,
+ Parent = parent
+ });
}
catch (Exception ex)
{
diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
index a4c5645e74..35d2d3c0ab 100644
--- a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
+++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
@@ -1512,6 +1512,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
}
}
+ DeleteFileIfEmpty(recordPath);
+
TriggerRefresh(recordPath);
_libraryMonitor.ReportFileSystemChangeComplete(recordPath, false);
@@ -1542,6 +1544,23 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
}
}
+ private void DeleteFileIfEmpty(string path)
+ {
+ var file = _fileSystem.GetFileInfo(path);
+
+ if (file.Exists && file.Length == 0)
+ {
+ try
+ {
+ _fileSystem.DeleteFile(path);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error deleting 0-byte failed recording file {0}", ex, path);
+ }
+ }
+ }
+
private void TriggerRefresh(string path)
{
_logger.Info("Triggering refresh on {0}", path);
diff --git a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs
index 7e72d1b1a1..7e27877e7c 100644
--- a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs
+++ b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs
@@ -1421,7 +1421,7 @@ namespace Emby.Server.Implementations.LiveTv
if (newPrograms.Count > 0)
{
- _libraryManager.CreateItems(newPrograms, cancellationToken);
+ _libraryManager.CreateItems(newPrograms, null, cancellationToken);
}
// TODO: Do this in bulk
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index f6a8f1d5a4..98899253e1 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -2236,7 +2236,7 @@ namespace MediaBrowser.Controller.Entities
}
var filename = System.IO.Path.GetFileNameWithoutExtension(Path);
- var extensions = new List { ".nfo", ".xml", ".srt" };
+ var extensions = new List { ".nfo", ".xml", ".srt", ".vtt", ".sub", ".idx", ".txt", ".edl" };
extensions.AddRange(SupportedImageExtensions);
return FileSystem.GetFiles(FileSystem.GetDirectoryName(Path), extensions.ToArray(extensions.Count), false, false)
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 504d03a276..08b6a123d9 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -466,11 +466,11 @@ namespace MediaBrowser.Controller.Entities
item.SetParent(null);
await LibraryManager.DeleteItem(item, new DeleteOptions { DeleteFileLocation = false }).ConfigureAwait(false);
- LibraryManager.ReportItemRemoved(item);
+ LibraryManager.ReportItemRemoved(item, this);
}
}
- LibraryManager.CreateItems(newItems, cancellationToken);
+ LibraryManager.CreateItems(newItems, this, cancellationToken);
}
}
else
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index 37e0d56616..9ef372eb66 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -195,16 +195,12 @@ namespace MediaBrowser.Controller.Library
///
/// Creates the item.
///
- /// The item.
- /// The cancellation token.
void CreateItem(BaseItem item, CancellationToken cancellationToken);
///
/// Creates the items.
///
- /// The items.
- /// The cancellation token.
- void CreateItems(IEnumerable items, CancellationToken cancellationToken);
+ void CreateItems(IEnumerable items, BaseItem parent, CancellationToken cancellationToken);
///
/// Updates the item.
@@ -237,8 +233,7 @@ namespace MediaBrowser.Controller.Library
///
/// Reports the item removed.
///
- /// The item.
- void ReportItemRemoved(BaseItem item);
+ void ReportItemRemoved(BaseItem item, BaseItem parent);
///
/// Finds the type of the collection.
diff --git a/MediaBrowser.Controller/Library/ItemChangeEventArgs.cs b/MediaBrowser.Controller/Library/ItemChangeEventArgs.cs
index a2951f548e..e671490d3c 100644
--- a/MediaBrowser.Controller/Library/ItemChangeEventArgs.cs
+++ b/MediaBrowser.Controller/Library/ItemChangeEventArgs.cs
@@ -13,6 +13,8 @@ namespace MediaBrowser.Controller.Library
/// The item.
public BaseItem Item { get; set; }
+ public BaseItem Parent { get; set; }
+
///
/// Gets or sets the item.
///
diff --git a/MediaBrowser.Model/Entities/LibraryUpdateInfo.cs b/MediaBrowser.Model/Entities/LibraryUpdateInfo.cs
index b3d3be70e8..8995e08883 100644
--- a/MediaBrowser.Model/Entities/LibraryUpdateInfo.cs
+++ b/MediaBrowser.Model/Entities/LibraryUpdateInfo.cs
@@ -35,6 +35,8 @@ namespace MediaBrowser.Model.Entities
/// The items updated.
public string[] ItemsUpdated { get; set; }
+ public string[] CollectionFolders { get; set; }
+
///
/// Initializes a new instance of the class.
///
@@ -45,6 +47,7 @@ namespace MediaBrowser.Model.Entities
ItemsAdded = new string[] { };
ItemsRemoved = new string[] { };
ItemsUpdated = new string[] { };
+ CollectionFolders = new string[] { };
}
}
}
diff --git a/SharedVersion.cs b/SharedVersion.cs
index 463ec3ae3c..90e6929e2a 100644
--- a/SharedVersion.cs
+++ b/SharedVersion.cs
@@ -1,3 +1,3 @@
using System.Reflection;
-[assembly: AssemblyVersion("3.2.40.2")]
+[assembly: AssemblyVersion("3.2.40.3")]