|
|
|
@ -6,6 +6,7 @@ using MediaBrowser.Controller.Library;
|
|
|
|
|
using MediaBrowser.Model.Entities;
|
|
|
|
|
using MediaBrowser.Model.Logging;
|
|
|
|
|
using MediaBrowser.Server.Implementations.ScheduledTasks;
|
|
|
|
|
using Microsoft.Win32;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Concurrent;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
@ -24,7 +25,7 @@ namespace MediaBrowser.Server.Implementations.IO
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The file system watchers
|
|
|
|
|
/// </summary>
|
|
|
|
|
private readonly ConcurrentDictionary<string, FileSystemWatcher> _fileSystemWatchers = new ConcurrentDictionary<string,FileSystemWatcher>(StringComparer.OrdinalIgnoreCase);
|
|
|
|
|
private readonly ConcurrentDictionary<string, FileSystemWatcher> _fileSystemWatchers = new ConcurrentDictionary<string, FileSystemWatcher>(StringComparer.OrdinalIgnoreCase);
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The update timer
|
|
|
|
|
/// </summary>
|
|
|
|
@ -100,6 +101,19 @@ namespace MediaBrowser.Server.Implementations.IO
|
|
|
|
|
TaskManager = taskManager;
|
|
|
|
|
Logger = logManager.GetLogger("DirectoryWatchers");
|
|
|
|
|
ConfigurationManager = configurationManager;
|
|
|
|
|
|
|
|
|
|
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Handles the PowerModeChanged event of the SystemEvents control.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sender">The source of the event.</param>
|
|
|
|
|
/// <param name="e">The <see cref="PowerModeChangedEventArgs"/> instance containing the event data.</param>
|
|
|
|
|
void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Stop();
|
|
|
|
|
Start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -288,47 +302,14 @@ namespace MediaBrowser.Server.Implementations.IO
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sender">The source of the event.</param>
|
|
|
|
|
/// <param name="e">The <see cref="ErrorEventArgs" /> instance containing the event data.</param>
|
|
|
|
|
async void watcher_Error(object sender, ErrorEventArgs e)
|
|
|
|
|
void watcher_Error(object sender, ErrorEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var ex = e.GetException();
|
|
|
|
|
var dw = (FileSystemWatcher)sender;
|
|
|
|
|
|
|
|
|
|
Logger.ErrorException("Error in Directory watcher for: " + dw.Path, ex);
|
|
|
|
|
|
|
|
|
|
//Network either dropped or, we are coming out of sleep and it hasn't reconnected yet - wait and retry
|
|
|
|
|
var retries = 0;
|
|
|
|
|
var success = false;
|
|
|
|
|
while (!success && retries < 10)
|
|
|
|
|
{
|
|
|
|
|
await Task.Delay(500).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
dw.EnableRaisingEvents = false;
|
|
|
|
|
dw.EnableRaisingEvents = true;
|
|
|
|
|
success = true;
|
|
|
|
|
}
|
|
|
|
|
catch (ObjectDisposedException)
|
|
|
|
|
{
|
|
|
|
|
RemoveWatcherFromList(dw);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
catch (IOException)
|
|
|
|
|
{
|
|
|
|
|
Logger.Warn("Network still unavailable...");
|
|
|
|
|
retries++;
|
|
|
|
|
}
|
|
|
|
|
catch (ApplicationException)
|
|
|
|
|
{
|
|
|
|
|
Logger.Warn("Network still unavailable...");
|
|
|
|
|
retries++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!success)
|
|
|
|
|
{
|
|
|
|
|
Logger.Warn("Unable to access network. Giving up.");
|
|
|
|
|
DisposeWatcher(dw);
|
|
|
|
|
}
|
|
|
|
|
DisposeWatcher(dw);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -348,7 +329,7 @@ namespace MediaBrowser.Server.Implementations.IO
|
|
|
|
|
|
|
|
|
|
var nameFromFullPath = Path.GetFileName(e.FullPath);
|
|
|
|
|
// Ignore certain files
|
|
|
|
|
if (!string.IsNullOrEmpty(nameFromFullPath) && _alwaysIgnoreFiles.Contains(nameFromFullPath, StringComparer.OrdinalIgnoreCase))
|
|
|
|
|
if (!string.IsNullOrEmpty(nameFromFullPath) && _alwaysIgnoreFiles.Contains(nameFromFullPath, StringComparer.OrdinalIgnoreCase))
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|