commit
acc17634a4
|
@ -260,7 +260,7 @@ namespace Emby.Server.Implementations.EntryPoints
|
||||||
LibraryUpdateTimer.Change(LibraryUpdateDuration, Timeout.Infinite);
|
LibraryUpdateTimer.Change(LibraryUpdateDuration, Timeout.Infinite);
|
||||||
}
|
}
|
||||||
|
|
||||||
var parent = e.Item.GetParent() as Folder;
|
var parent = e.Parent as Folder;
|
||||||
if (parent != null)
|
if (parent != null)
|
||||||
{
|
{
|
||||||
_foldersRemovedFrom.Add(parent);
|
_foldersRemovedFrom.Add(parent);
|
||||||
|
@ -363,10 +363,16 @@ namespace Emby.Server.Implementations.EntryPoints
|
||||||
/// <param name="foldersRemovedFrom">The folders removed from.</param>
|
/// <param name="foldersRemovedFrom">The folders removed from.</param>
|
||||||
/// <param name="userId">The user id.</param>
|
/// <param name="userId">The user id.</param>
|
||||||
/// <returns>LibraryUpdateInfo.</returns>
|
/// <returns>LibraryUpdateInfo.</returns>
|
||||||
private LibraryUpdateInfo GetLibraryUpdateInfo(IEnumerable<BaseItem> itemsAdded, IEnumerable<BaseItem> itemsUpdated, IEnumerable<BaseItem> itemsRemoved, IEnumerable<Folder> foldersAddedTo, IEnumerable<Folder> foldersRemovedFrom, Guid userId)
|
private LibraryUpdateInfo GetLibraryUpdateInfo(List<BaseItem> itemsAdded, List<BaseItem> itemsUpdated, List<BaseItem> itemsRemoved, List<Folder> foldersAddedTo, List<Folder> foldersRemovedFrom, Guid userId)
|
||||||
{
|
{
|
||||||
var user = _userManager.GetUserById(userId);
|
var user = _userManager.GetUserById(userId);
|
||||||
|
|
||||||
|
var newAndRemoved = new List<BaseItem>();
|
||||||
|
newAndRemoved.AddRange(foldersAddedTo);
|
||||||
|
newAndRemoved.AddRange(foldersRemovedFrom);
|
||||||
|
|
||||||
|
var allUserRootChildren = _libraryManager.GetUserRootFolder().GetChildren(user, true).OfType<Folder>().ToList();
|
||||||
|
|
||||||
return new LibraryUpdateInfo
|
return new LibraryUpdateInfo
|
||||||
{
|
{
|
||||||
ItemsAdded = itemsAdded.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user)).Select(i => i.Id.ToString("N")).Distinct().ToArray(),
|
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(),
|
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;
|
return item.SourceType == SourceType.Library;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IEnumerable<string> GetTopParentIds(List<BaseItem> items, User user, List<Folder> allUserRootChildren)
|
||||||
|
{
|
||||||
|
var list = new List<string>();
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Translates the physical item to user library.
|
/// Translates the physical item to user library.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -237,7 +237,7 @@ namespace Emby.Server.Implementations.IO
|
||||||
/// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
|
/// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
|
||||||
void LibraryManager_ItemRemoved(object sender, ItemChangeEventArgs e)
|
void LibraryManager_ItemRemoved(object sender, ItemChangeEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.Item.GetParent() is AggregateFolder)
|
if (e.Parent is AggregateFolder)
|
||||||
{
|
{
|
||||||
StopWatchingPath(e.Item.Path);
|
StopWatchingPath(e.Item.Path);
|
||||||
}
|
}
|
||||||
|
@ -250,7 +250,7 @@ namespace Emby.Server.Implementations.IO
|
||||||
/// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
|
/// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
|
||||||
void LibraryManager_ItemAdded(object sender, ItemChangeEventArgs e)
|
void LibraryManager_ItemAdded(object sender, ItemChangeEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.Item.GetParent() is AggregateFolder)
|
if (e.Parent is AggregateFolder)
|
||||||
{
|
{
|
||||||
StartWatching(e.Item);
|
StartWatching(e.Item);
|
||||||
}
|
}
|
||||||
|
@ -320,7 +320,8 @@ namespace Emby.Server.Implementations.IO
|
||||||
IncludeSubdirectories = true
|
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;
|
newWatcher.InternalBufferSize = 32767;
|
||||||
}
|
}
|
||||||
|
|
|
@ -473,6 +473,11 @@ namespace Emby.Server.Implementations.IO
|
||||||
|
|
||||||
public void SetHidden(string path, bool isHidden)
|
public void SetHidden(string path, bool isHidden)
|
||||||
{
|
{
|
||||||
|
if (_environmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (_sharpCifsFileSystem.IsEnabledForPath(path))
|
if (_sharpCifsFileSystem.IsEnabledForPath(path))
|
||||||
{
|
{
|
||||||
_sharpCifsFileSystem.SetHidden(path, isHidden);
|
_sharpCifsFileSystem.SetHidden(path, isHidden);
|
||||||
|
@ -498,6 +503,11 @@ namespace Emby.Server.Implementations.IO
|
||||||
|
|
||||||
public void SetReadOnly(string path, bool isReadOnly)
|
public void SetReadOnly(string path, bool isReadOnly)
|
||||||
{
|
{
|
||||||
|
if (_environmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (_sharpCifsFileSystem.IsEnabledForPath(path))
|
if (_sharpCifsFileSystem.IsEnabledForPath(path))
|
||||||
{
|
{
|
||||||
_sharpCifsFileSystem.SetReadOnly(path, isReadOnly);
|
_sharpCifsFileSystem.SetReadOnly(path, isReadOnly);
|
||||||
|
@ -523,6 +533,11 @@ namespace Emby.Server.Implementations.IO
|
||||||
|
|
||||||
public void SetAttributes(string path, bool isHidden, bool isReadOnly)
|
public void SetAttributes(string path, bool isHidden, bool isReadOnly)
|
||||||
{
|
{
|
||||||
|
if (_environmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (_sharpCifsFileSystem.IsEnabledForPath(path))
|
if (_sharpCifsFileSystem.IsEnabledForPath(path))
|
||||||
{
|
{
|
||||||
_sharpCifsFileSystem.SetAttributes(path, isHidden, isReadOnly);
|
_sharpCifsFileSystem.SetAttributes(path, isHidden, isReadOnly);
|
||||||
|
|
|
@ -443,7 +443,7 @@ namespace Emby.Server.Implementations.Library
|
||||||
BaseItem removed;
|
BaseItem removed;
|
||||||
_libraryItemsCache.TryRemove(item.Id, out removed);
|
_libraryItemsCache.TryRemove(item.Id, out removed);
|
||||||
|
|
||||||
ReportItemRemoved(item);
|
ReportItemRemoved(item, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<string> GetMetadataPaths(BaseItem item, IEnumerable<BaseItem> children)
|
private IEnumerable<string> GetMetadataPaths(BaseItem item, IEnumerable<BaseItem> children)
|
||||||
|
@ -1804,7 +1804,7 @@ namespace Emby.Server.Implementations.Library
|
||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
public void CreateItem(BaseItem item, CancellationToken cancellationToken)
|
public void CreateItem(BaseItem item, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
CreateItems(new[] { item }, cancellationToken);
|
CreateItems(new[] { item }, item.GetParent(), cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1813,7 +1813,7 @@ namespace Emby.Server.Implementations.Library
|
||||||
/// <param name="items">The items.</param>
|
/// <param name="items">The items.</param>
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
public void CreateItems(IEnumerable<BaseItem> items, CancellationToken cancellationToken)
|
public void CreateItems(IEnumerable<BaseItem> items, BaseItem parent, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var list = items.ToList();
|
var list = items.ToList();
|
||||||
|
|
||||||
|
@ -1830,7 +1830,11 @@ namespace Emby.Server.Implementations.Library
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ItemAdded(this, new ItemChangeEventArgs { Item = item });
|
ItemAdded(this, new ItemChangeEventArgs
|
||||||
|
{
|
||||||
|
Item = item,
|
||||||
|
Parent = parent ?? item.GetParent()
|
||||||
|
});
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -1878,6 +1882,7 @@ namespace Emby.Server.Implementations.Library
|
||||||
ItemUpdated(this, new ItemChangeEventArgs
|
ItemUpdated(this, new ItemChangeEventArgs
|
||||||
{
|
{
|
||||||
Item = item,
|
Item = item,
|
||||||
|
Parent = item.GetParent(),
|
||||||
UpdateReason = updateReason
|
UpdateReason = updateReason
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1892,13 +1897,17 @@ namespace Emby.Server.Implementations.Library
|
||||||
/// Reports the item removed.
|
/// Reports the item removed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="item">The item.</param>
|
/// <param name="item">The item.</param>
|
||||||
public void ReportItemRemoved(BaseItem item)
|
public void ReportItemRemoved(BaseItem item, BaseItem parent)
|
||||||
{
|
{
|
||||||
if (ItemRemoved != null)
|
if (ItemRemoved != null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ItemRemoved(this, new ItemChangeEventArgs { Item = item });
|
ItemRemoved(this, new ItemChangeEventArgs
|
||||||
|
{
|
||||||
|
Item = item,
|
||||||
|
Parent = parent
|
||||||
|
});
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1512,6 +1512,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DeleteFileIfEmpty(recordPath);
|
||||||
|
|
||||||
TriggerRefresh(recordPath);
|
TriggerRefresh(recordPath);
|
||||||
_libraryMonitor.ReportFileSystemChangeComplete(recordPath, false);
|
_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)
|
private void TriggerRefresh(string path)
|
||||||
{
|
{
|
||||||
_logger.Info("Triggering refresh on {0}", path);
|
_logger.Info("Triggering refresh on {0}", path);
|
||||||
|
|
|
@ -1421,7 +1421,7 @@ namespace Emby.Server.Implementations.LiveTv
|
||||||
|
|
||||||
if (newPrograms.Count > 0)
|
if (newPrograms.Count > 0)
|
||||||
{
|
{
|
||||||
_libraryManager.CreateItems(newPrograms, cancellationToken);
|
_libraryManager.CreateItems(newPrograms, null, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Do this in bulk
|
// TODO: Do this in bulk
|
||||||
|
|
|
@ -2236,7 +2236,7 @@ namespace MediaBrowser.Controller.Entities
|
||||||
}
|
}
|
||||||
|
|
||||||
var filename = System.IO.Path.GetFileNameWithoutExtension(Path);
|
var filename = System.IO.Path.GetFileNameWithoutExtension(Path);
|
||||||
var extensions = new List<string> { ".nfo", ".xml", ".srt" };
|
var extensions = new List<string> { ".nfo", ".xml", ".srt", ".vtt", ".sub", ".idx", ".txt", ".edl" };
|
||||||
extensions.AddRange(SupportedImageExtensions);
|
extensions.AddRange(SupportedImageExtensions);
|
||||||
|
|
||||||
return FileSystem.GetFiles(FileSystem.GetDirectoryName(Path), extensions.ToArray(extensions.Count), false, false)
|
return FileSystem.GetFiles(FileSystem.GetDirectoryName(Path), extensions.ToArray(extensions.Count), false, false)
|
||||||
|
|
|
@ -466,11 +466,11 @@ namespace MediaBrowser.Controller.Entities
|
||||||
|
|
||||||
item.SetParent(null);
|
item.SetParent(null);
|
||||||
await LibraryManager.DeleteItem(item, new DeleteOptions { DeleteFileLocation = false }).ConfigureAwait(false);
|
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
|
else
|
||||||
|
|
|
@ -195,16 +195,12 @@ namespace MediaBrowser.Controller.Library
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates the item.
|
/// Creates the item.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="item">The item.</param>
|
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
|
||||||
void CreateItem(BaseItem item, CancellationToken cancellationToken);
|
void CreateItem(BaseItem item, CancellationToken cancellationToken);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates the items.
|
/// Creates the items.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="items">The items.</param>
|
void CreateItems(IEnumerable<BaseItem> items, BaseItem parent, CancellationToken cancellationToken);
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
|
||||||
void CreateItems(IEnumerable<BaseItem> items, CancellationToken cancellationToken);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates the item.
|
/// Updates the item.
|
||||||
|
@ -237,8 +233,7 @@ namespace MediaBrowser.Controller.Library
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Reports the item removed.
|
/// Reports the item removed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="item">The item.</param>
|
void ReportItemRemoved(BaseItem item, BaseItem parent);
|
||||||
void ReportItemRemoved(BaseItem item);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Finds the type of the collection.
|
/// Finds the type of the collection.
|
||||||
|
|
|
@ -13,6 +13,8 @@ namespace MediaBrowser.Controller.Library
|
||||||
/// <value>The item.</value>
|
/// <value>The item.</value>
|
||||||
public BaseItem Item { get; set; }
|
public BaseItem Item { get; set; }
|
||||||
|
|
||||||
|
public BaseItem Parent { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the item.
|
/// Gets or sets the item.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -35,6 +35,8 @@ namespace MediaBrowser.Model.Entities
|
||||||
/// <value>The items updated.</value>
|
/// <value>The items updated.</value>
|
||||||
public string[] ItemsUpdated { get; set; }
|
public string[] ItemsUpdated { get; set; }
|
||||||
|
|
||||||
|
public string[] CollectionFolders { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="LibraryUpdateInfo"/> class.
|
/// Initializes a new instance of the <see cref="LibraryUpdateInfo"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -45,6 +47,7 @@ namespace MediaBrowser.Model.Entities
|
||||||
ItemsAdded = new string[] { };
|
ItemsAdded = new string[] { };
|
||||||
ItemsRemoved = new string[] { };
|
ItemsRemoved = new string[] { };
|
||||||
ItemsUpdated = new string[] { };
|
ItemsUpdated = new string[] { };
|
||||||
|
CollectionFolders = new string[] { };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
[assembly: AssemblyVersion("3.2.40.2")]
|
[assembly: AssemblyVersion("3.2.40.3")]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user