aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/IO
diff options
context:
space:
mode:
authorBond_009 <bond.009@outlook.com>2023-09-13 17:30:50 +0200
committerBond_009 <bond.009@outlook.com>2023-09-13 17:30:50 +0200
commit767a42fbdbbb2db30313d0935f322f162ebeced4 (patch)
tree91b187902579eac2fd25d731310f729e9803c148 /Emby.Server.Implementations/IO
parent3f19befc594670d72c2611f103e703633960e0aa (diff)
Minor LibraryMonitor improvements
* Enable nullable * Add a fast return to ReportFileSystemChanged when path should be ignored * Use Span overloads of Path.* functions where possible * IFileSystem: remove NormalizePath as Path.TrimEndingDirectorySeparator already checks if it's a root path
Diffstat (limited to 'Emby.Server.Implementations/IO')
-rw-r--r--Emby.Server.Implementations/IO/FileRefresher.cs9
-rw-r--r--Emby.Server.Implementations/IO/LibraryMonitor.cs68
-rw-r--r--Emby.Server.Implementations/IO/ManagedFileSystem.cs18
-rw-r--r--Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs11
4 files changed, 40 insertions, 66 deletions
diff --git a/Emby.Server.Implementations/IO/FileRefresher.cs b/Emby.Server.Implementations/IO/FileRefresher.cs
index 0ad81b653..15b1836eb 100644
--- a/Emby.Server.Implementations/IO/FileRefresher.cs
+++ b/Emby.Server.Implementations/IO/FileRefresher.cs
@@ -85,7 +85,7 @@ namespace Emby.Server.Implementations.IO
}
}
- public void ResetPath(string path, string affectedFile)
+ public void ResetPath(string path, string? affectedFile)
{
lock (_timerLock)
{
@@ -148,13 +148,6 @@ namespace Emby.Server.Implementations.IO
{
item.ChangedExternally();
}
- catch (IOException ex)
- {
- // For now swallow and log.
- // Research item: If an IOException occurs, the item may be in a disconnected state (media unavailable)
- // Should we remove it from it's parent?
- _logger.LogError(ex, "Error refreshing {Name}", item.Name);
- }
catch (Exception ex)
{
_logger.LogError(ex, "Error refreshing {Name}", item.Name);
diff --git a/Emby.Server.Implementations/IO/LibraryMonitor.cs b/Emby.Server.Implementations/IO/LibraryMonitor.cs
index f67a02be8..1b6e45487 100644
--- a/Emby.Server.Implementations/IO/LibraryMonitor.cs
+++ b/Emby.Server.Implementations/IO/LibraryMonitor.cs
@@ -1,5 +1,3 @@
-#nullable disable
-
#pragma warning disable CS1591
using System;
@@ -160,7 +158,7 @@ namespace Emby.Server.Implementations.IO
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
- private void OnLibraryManagerItemRemoved(object sender, ItemChangeEventArgs e)
+ private void OnLibraryManagerItemRemoved(object? sender, ItemChangeEventArgs e)
{
if (e.Parent is AggregateFolder)
{
@@ -173,7 +171,7 @@ namespace Emby.Server.Implementations.IO
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
- private void OnLibraryManagerItemAdded(object sender, ItemChangeEventArgs e)
+ private void OnLibraryManagerItemAdded(object? sender, ItemChangeEventArgs e)
{
if (e.Parent is AggregateFolder)
{
@@ -189,19 +187,28 @@ namespace Emby.Server.Implementations.IO
/// <param name="path">The path.</param>
/// <returns><c>true</c> if [contains parent folder] [the specified LST]; otherwise, <c>false</c>.</returns>
/// <exception cref="ArgumentNullException"><paramref name="path"/> is <c>null</c>.</exception>
- private static bool ContainsParentFolder(IEnumerable<string> lst, string path)
+ private static bool ContainsParentFolder(IReadOnlyList<string> lst, ReadOnlySpan<char> path)
{
- ArgumentException.ThrowIfNullOrEmpty(path);
+ if (path.IsEmpty)
+ {
+ throw new ArgumentException("Path can't be empty", nameof(path));
+ }
path = path.TrimEnd(Path.DirectorySeparatorChar);
- return lst.Any(str =>
+ foreach (var str in lst)
{
// this should be a little quicker than examining each actual parent folder...
- var compare = str.TrimEnd(Path.DirectorySeparatorChar);
+ var compare = str.AsSpan().TrimEnd(Path.DirectorySeparatorChar);
- return path.Equals(compare, StringComparison.OrdinalIgnoreCase) || (path.StartsWith(compare, StringComparison.OrdinalIgnoreCase) && path[compare.Length] == Path.DirectorySeparatorChar);
- });
+ if (path.Equals(compare, StringComparison.OrdinalIgnoreCase)
+ || (path.StartsWith(compare, StringComparison.OrdinalIgnoreCase) && path[compare.Length] == Path.DirectorySeparatorChar))
+ {
+ return true;
+ }
+ }
+
+ return false;
}
/// <summary>
@@ -349,21 +356,19 @@ namespace Emby.Server.Implementations.IO
{
ArgumentException.ThrowIfNullOrEmpty(path);
- var monitorPath = !IgnorePatterns.ShouldIgnore(path);
+ if (IgnorePatterns.ShouldIgnore(path))
+ {
+ return;
+ }
// Ignore certain files, If the parent of an ignored path has a change event, ignore that too
- if (_tempIgnoredPaths.Keys.Any(i =>
+ foreach (var i in _tempIgnoredPaths.Keys)
{
- if (_fileSystem.AreEqual(i, path))
- {
- _logger.LogDebug("Ignoring change to {Path}", path);
- return true;
- }
-
- if (_fileSystem.ContainsSubPath(i, path))
+ if (_fileSystem.AreEqual(i, path)
+ || _fileSystem.ContainsSubPath(i, path))
{
_logger.LogDebug("Ignoring change to {Path}", path);
- return true;
+ return;
}
// Go up a level
@@ -371,20 +376,12 @@ namespace Emby.Server.Implementations.IO
if (!string.IsNullOrEmpty(parent) && _fileSystem.AreEqual(parent, path))
{
_logger.LogDebug("Ignoring change to {Path}", path);
- return true;
+ return;
}
-
- return false;
- }))
- {
- monitorPath = false;
}
- if (monitorPath)
- {
- // Avoid implicitly captured closure
- CreateRefresher(path);
- }
+ // Avoid implicitly captured closure
+ CreateRefresher(path);
}
private void CreateRefresher(string path)
@@ -417,7 +414,7 @@ namespace Emby.Server.Implementations.IO
}
// They are siblings. Rebase the refresher to the parent folder.
- if (string.Equals(parentPath, Path.GetDirectoryName(refresher.Path), StringComparison.Ordinal))
+ if (parentPath is not null && string.Equals(parentPath, Path.GetDirectoryName(refresher.Path), StringComparison.Ordinal))
{
refresher.ResetPath(parentPath, path);
return;
@@ -430,8 +427,13 @@ namespace Emby.Server.Implementations.IO
}
}
- private void OnNewRefresherCompleted(object sender, EventArgs e)
+ private void OnNewRefresherCompleted(object? sender, EventArgs e)
{
+ if (sender is null)
+ {
+ return;
+ }
+
var refresher = (FileRefresher)sender;
DisposeRefresher(refresher);
}
diff --git a/Emby.Server.Implementations/IO/ManagedFileSystem.cs b/Emby.Server.Implementations/IO/ManagedFileSystem.cs
index 0ba4a488b..3aa5233ed 100644
--- a/Emby.Server.Implementations/IO/ManagedFileSystem.cs
+++ b/Emby.Server.Implementations/IO/ManagedFileSystem.cs
@@ -486,24 +486,10 @@ namespace Emby.Server.Implementations.IO
}
/// <inheritdoc />
- public virtual string NormalizePath(string path)
- {
- ArgumentException.ThrowIfNullOrEmpty(path);
-
- if (path.EndsWith(":\\", StringComparison.OrdinalIgnoreCase))
- {
- return path;
- }
-
- return Path.TrimEndingDirectorySeparator(path);
- }
-
- /// <inheritdoc />
public virtual bool AreEqual(string path1, string path2)
{
- return string.Equals(
- NormalizePath(path1),
- NormalizePath(path2),
+ return Path.TrimEndingDirectorySeparator(path1).Equals(
+ Path.TrimEndingDirectorySeparator(path2),
_isEnvironmentCaseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
}
diff --git a/Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs b/Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs
index c2aab3879..5776c7a7c 100644
--- a/Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs
+++ b/Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs
@@ -8,24 +8,17 @@ namespace Emby.Server.Implementations.IO
{
public class MbLinkShortcutHandler : IShortcutHandler
{
- private readonly IFileSystem _fileSystem;
-
- public MbLinkShortcutHandler(IFileSystem fileSystem)
- {
- _fileSystem = fileSystem;
- }
-
public string Extension => ".mblink";
public string? Resolve(string shortcutPath)
{
ArgumentException.ThrowIfNullOrEmpty(shortcutPath);
- if (string.Equals(Path.GetExtension(shortcutPath), ".mblink", StringComparison.OrdinalIgnoreCase))
+ if (Path.GetExtension(shortcutPath.AsSpan()).Equals(".mblink", StringComparison.OrdinalIgnoreCase))
{
var path = File.ReadAllText(shortcutPath);
- return _fileSystem.NormalizePath(path);
+ return Path.TrimEndingDirectorySeparator(path);
}
return null;