From 48296834028bdfaf782132258d87fdab42f528eb Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 22 Oct 2016 17:41:18 -0400 Subject: switch to portable lib --- .../MediaBrowser.Server.Implementations.csproj | 2 +- MediaBrowser.Server.Implementations/packages.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 5dcdcc54b7..f301032dec 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -47,7 +47,7 @@ ..\packages\CommonIO.1.0.0.9\lib\net45\CommonIO.dll - ..\packages\Emby.XmlTv.1.0.0.56\lib\net45\Emby.XmlTv.dll + ..\packages\Emby.XmlTv.1.0.0.57\lib\portable-net46+win10\Emby.XmlTv.dll True diff --git a/MediaBrowser.Server.Implementations/packages.config b/MediaBrowser.Server.Implementations/packages.config index 8f6ddb039e..bc449fd64f 100644 --- a/MediaBrowser.Server.Implementations/packages.config +++ b/MediaBrowser.Server.Implementations/packages.config @@ -1,7 +1,7 @@  - + -- cgit v1.2.3 From 07791d46a571d3d6eed23e98ec0fe1c46ea0d37f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 23 Oct 2016 15:14:57 -0400 Subject: rework scheduled tasks in preparation of common project going portable --- MediaBrowser.Api/Dlna/DlnaServerService.cs | 1 + .../ScheduledTasks/ScheduledTaskService.cs | 16 +-- .../BaseApplicationHost.cs | 39 +++++- .../Cryptography/CryptographyProvider.cs | 18 +++ .../HttpClientManager/HttpClientManager.cs | 1 + .../IO/MemoryStreamProvider.cs | 1 + .../MediaBrowser.Common.Implementations.csproj | 6 + .../ScheduledTasks/DailyTrigger.cs | 91 +++++++++++++ .../ScheduledTasks/IntervalTrigger.cs | 112 ++++++++++++++++ .../ScheduledTasks/ScheduledTaskWorker.cs | 148 ++++++++++++++++++--- .../ScheduledTasks/StartupTrigger.cs | 67 ++++++++++ .../ScheduledTasks/SystemEventTrigger.cs | 84 ++++++++++++ .../ScheduledTasks/Tasks/DeleteCacheFileTask.cs | 20 ++- .../ScheduledTasks/Tasks/DeleteLogFileTask.cs | 18 ++- .../ScheduledTasks/Tasks/ReloadLoggerFileTask.cs | 12 +- .../ScheduledTasks/WeeklyTrigger.cs | 116 ++++++++++++++++ MediaBrowser.Common/Extensions/BaseExtensions.cs | 19 +-- MediaBrowser.Common/IApplicationHost.cs | 2 +- MediaBrowser.Common/IO/IMemoryStreamProvider.cs | 11 -- MediaBrowser.Common/IO/StreamDefaults.cs | 19 --- MediaBrowser.Common/MediaBrowser.Common.csproj | 11 -- MediaBrowser.Common/Plugins/BasePlugin.cs | 87 +++--------- MediaBrowser.Common/Plugins/IPlugin.cs | 12 -- MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs | 91 ------------- .../ScheduledTasks/IConfigurableScheduledTask.cs | 21 --- MediaBrowser.Common/ScheduledTasks/IHasKey.cs | 7 - .../ScheduledTasks/IScheduledTask.cs | 45 ------- .../ScheduledTasks/IScheduledTaskWorker.cs | 3 +- MediaBrowser.Common/ScheduledTasks/ITaskManager.cs | 1 + MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs | 2 - .../ScheduledTasks/IntervalTrigger.cs | 112 ---------------- .../ScheduledTasks/ScheduledTaskHelpers.cs | 143 +------------------- .../ScheduledTasks/StartupTrigger.cs | 67 ---------- .../ScheduledTasks/SystemEventTrigger.cs | 84 ------------ .../ScheduledTasks/TaskExecutionOptions.cs | 11 -- .../ScheduledTasks/WeeklyTrigger.cs | 116 ---------------- .../Entities/Audio/MusicArtist.cs | 1 + .../Entities/Audio/MusicGenre.cs | 1 + MediaBrowser.Controller/Entities/BaseItem.cs | 1 + MediaBrowser.Controller/Entities/GameGenre.cs | 1 + MediaBrowser.Controller/Entities/Genre.cs | 1 + MediaBrowser.Controller/Entities/Person.cs | 1 + MediaBrowser.Controller/Entities/Studio.cs | 1 + .../Extensions/BaseExtensions.cs | 25 ++++ MediaBrowser.Controller/Library/NameExtensions.cs | 1 + .../MediaBrowser.Controller.csproj | 1 + .../Probing/ProbeResultNormalizer.cs | 1 + .../Subtitles/SubtitleEncoder.cs | 1 + .../Cryptography/ICryptographyProvider.cs | 9 ++ MediaBrowser.Model/Entities/MediaStream.cs | 2 +- MediaBrowser.Model/IO/IMemoryStreamProvider.cs | 11 ++ MediaBrowser.Model/IO/StreamDefaults.cs | 19 +++ MediaBrowser.Model/MediaBrowser.Model.csproj | 6 + .../Tasks/IConfigurableScheduledTask.cs | 18 +++ MediaBrowser.Model/Tasks/IScheduledTask.cs | 47 +++++++ MediaBrowser.Model/Tasks/TaskExecutionOptions.cs | 11 ++ MediaBrowser.Model/Tasks/TaskTriggerInfo.cs | 6 + MediaBrowser.Providers/Manager/ImageSaver.cs | 1 + MediaBrowser.Providers/Manager/ProviderManager.cs | 1 + .../MediaInfo/SubtitleDownloader.cs | 2 +- .../MediaInfo/SubtitleScheduledTask.cs | 17 ++- .../Channels/RefreshChannelsScheduledTask.cs | 20 ++- .../EntryPoints/ActivityLogEntryPoint.cs | 8 +- .../FileOrganization/OrganizerScheduledTask.cs | 20 ++- .../HttpServer/HttpListenerHost.cs | 1 + .../HttpServer/ServerFactory.cs | 1 + .../SocketSharp/WebSocketSharpListener.cs | 1 + .../SocketSharp/WebSocketSharpRequest.cs | 1 + .../Library/SearchEngine.cs | 1 + .../LiveTv/RefreshChannelsScheduledTask.cs | 21 ++- .../Persistence/CleanDatabaseScheduledTask.cs | 19 ++- .../Persistence/DataExtensions.cs | 1 + .../SqliteDisplayPreferencesRepository.cs | 1 + .../Persistence/SqliteItemRepository.cs | 2 + .../Persistence/SqliteUserRepository.cs | 1 + .../ScheduledTasks/ChapterImagesTask.cs | 27 ++-- .../ScheduledTasks/PeopleValidationTask.cs | 18 ++- .../ScheduledTasks/PluginUpdateTask.cs | 14 +- .../ScheduledTasks/RefreshMediaLibraryTask.cs | 19 ++- .../ScheduledTasks/SystemUpdateTask.cs | 12 +- .../ServerManager/ServerManager.cs | 1 + .../ServerManager/WebSocketConnection.cs | 1 + .../Sync/ServerSyncScheduledTask.cs | 23 +++- .../Sync/SyncConvertScheduledTask.cs | 28 ++-- .../Sync/SyncJobProcessor.cs | 1 + .../Sync/SyncManager.cs | 1 + .../Sync/TargetDataProvider.cs | 1 + Nuget/MediaBrowser.Server.Core.nuspec | 1 - 88 files changed, 1067 insertions(+), 978 deletions(-) create mode 100644 MediaBrowser.Common.Implementations/Cryptography/CryptographyProvider.cs create mode 100644 MediaBrowser.Common.Implementations/ScheduledTasks/DailyTrigger.cs create mode 100644 MediaBrowser.Common.Implementations/ScheduledTasks/IntervalTrigger.cs create mode 100644 MediaBrowser.Common.Implementations/ScheduledTasks/StartupTrigger.cs create mode 100644 MediaBrowser.Common.Implementations/ScheduledTasks/SystemEventTrigger.cs create mode 100644 MediaBrowser.Common.Implementations/ScheduledTasks/WeeklyTrigger.cs delete mode 100644 MediaBrowser.Common/IO/IMemoryStreamProvider.cs delete mode 100644 MediaBrowser.Common/IO/StreamDefaults.cs delete mode 100644 MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs delete mode 100644 MediaBrowser.Common/ScheduledTasks/IConfigurableScheduledTask.cs delete mode 100644 MediaBrowser.Common/ScheduledTasks/IHasKey.cs delete mode 100644 MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs delete mode 100644 MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs delete mode 100644 MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs delete mode 100644 MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs delete mode 100644 MediaBrowser.Common/ScheduledTasks/TaskExecutionOptions.cs delete mode 100644 MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs create mode 100644 MediaBrowser.Controller/Extensions/BaseExtensions.cs create mode 100644 MediaBrowser.Model/Cryptography/ICryptographyProvider.cs create mode 100644 MediaBrowser.Model/IO/IMemoryStreamProvider.cs create mode 100644 MediaBrowser.Model/IO/StreamDefaults.cs create mode 100644 MediaBrowser.Model/Tasks/IConfigurableScheduledTask.cs create mode 100644 MediaBrowser.Model/Tasks/IScheduledTask.cs create mode 100644 MediaBrowser.Model/Tasks/TaskExecutionOptions.cs (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Api/Dlna/DlnaServerService.cs b/MediaBrowser.Api/Dlna/DlnaServerService.cs index b2c7e5532a..da3e3bad4c 100644 --- a/MediaBrowser.Api/Dlna/DlnaServerService.cs +++ b/MediaBrowser.Api/Dlna/DlnaServerService.cs @@ -9,6 +9,7 @@ using System.Linq; using System.Threading.Tasks; using MediaBrowser.Common.IO; using MediaBrowser.Controller.IO; +using MediaBrowser.Model.IO; namespace MediaBrowser.Api.Dlna { diff --git a/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs b/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs index d2da2ee846..287b87f776 100644 --- a/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs +++ b/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs @@ -198,17 +198,13 @@ namespace MediaBrowser.Api.ScheduledTasks throw new ResourceNotFoundException("Task not found"); } - var hasKey = task.ScheduledTask as IHasKey; - if (hasKey != null) + if (string.Equals(task.ScheduledTask.Key, "SystemUpdateTask", StringComparison.OrdinalIgnoreCase)) { - if (string.Equals(hasKey.Key, "SystemUpdateTask", StringComparison.OrdinalIgnoreCase)) + // This is a hack for now just to get the update application function to work when auto-update is disabled + if (!_config.Configuration.EnableAutoUpdate) { - // This is a hack for now just to get the update application function to work when auto-update is disabled - if (!_config.Configuration.EnableAutoUpdate) - { - _config.Configuration.EnableAutoUpdate = true; - _config.SaveConfiguration(); - } + _config.Configuration.EnableAutoUpdate = true; + _config.SaveConfiguration(); } } @@ -252,7 +248,7 @@ namespace MediaBrowser.Api.ScheduledTasks var triggerInfos = request; - task.Triggers = triggerInfos.Select(ScheduledTaskHelpers.GetTrigger); + task.Triggers = triggerInfos.ToArray(); } } } diff --git a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs index e68fee829d..b1e6a04533 100644 --- a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs +++ b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs @@ -26,11 +26,16 @@ using System.IO; using System.Linq; using System.Net; using System.Reflection; +using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using CommonIO; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Implementations.Cryptography; using MediaBrowser.Common.IO; +using MediaBrowser.Model.Cryptography; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Common.Implementations { @@ -67,7 +72,7 @@ namespace MediaBrowser.Common.Implementations /// Gets or sets the plugins. /// /// The plugins. - public IEnumerable Plugins { get; protected set; } + public IPlugin[] Plugins { get; protected set; } /// /// Gets or sets the log manager. @@ -174,6 +179,8 @@ namespace MediaBrowser.Common.Implementations /// true if this instance is running as service; otherwise, false. public abstract bool IsRunningAsService { get; } + protected ICryptographyProvider CryptographyProvider = new CryptographyProvider(); + private DeviceId _deviceId; public string SystemId { @@ -202,7 +209,10 @@ namespace MediaBrowser.Common.Implementations ILogManager logManager, IFileSystem fileSystem) { - XmlSerializer = new XmlSerializer (fileSystem, logManager.GetLogger("XmlSerializer")); + // hack alert, until common can target .net core + BaseExtensions.CryptographyProvider = CryptographyProvider; + + XmlSerializer = new XmlSerializer (fileSystem, logManager.GetLogger("XmlSerializer")); FailedAssemblies = new List(); ApplicationPaths = applicationPaths; @@ -430,7 +440,28 @@ namespace MediaBrowser.Common.Implementations RegisterModules(); ConfigurationManager.AddParts(GetExports()); - Plugins = GetExports(); + Plugins = GetExports().Select(LoadPlugin).Where(i => i != null).ToArray(); + } + + private IPlugin LoadPlugin(IPlugin plugin) + { + var assemblyPlugin = plugin as IPluginAssembly; + + if (assemblyPlugin != null) + { + var assembly = plugin.GetType().Assembly; + var assemblyName = assembly.GetName(); + + var attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0]; + var assemblyId = new Guid(attribute.Value); + + var assemblyFileName = assemblyName.Name + ".dll"; + var assemblyFilePath = Path.Combine(ApplicationPaths.PluginsPath, assemblyFileName); + + assemblyPlugin.SetAttributes(assemblyFilePath, assemblyFileName, assemblyName.Version, assemblyId); + } + + return plugin; } /// @@ -747,7 +778,7 @@ namespace MediaBrowser.Common.Implementations { var list = Plugins.ToList(); list.Remove(plugin); - Plugins = list; + Plugins = list.ToArray(); } /// diff --git a/MediaBrowser.Common.Implementations/Cryptography/CryptographyProvider.cs b/MediaBrowser.Common.Implementations/Cryptography/CryptographyProvider.cs new file mode 100644 index 0000000000..81cbaa3aae --- /dev/null +++ b/MediaBrowser.Common.Implementations/Cryptography/CryptographyProvider.cs @@ -0,0 +1,18 @@ +using System; +using System.Security.Cryptography; +using System.Text; +using MediaBrowser.Model.Cryptography; + +namespace MediaBrowser.Common.Implementations.Cryptography +{ + public class CryptographyProvider : ICryptographyProvider + { + public Guid GetMD5(string str) + { + using (var provider = MD5.Create()) + { + return new Guid(provider.ComputeHash(Encoding.Unicode.GetBytes(str))); + } + } + } +} diff --git a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs index 063529cfc8..bad8c5ce5d 100644 --- a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs +++ b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs @@ -18,6 +18,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using CommonIO; +using MediaBrowser.Model.IO; namespace MediaBrowser.Common.Implementations.HttpClientManager { diff --git a/MediaBrowser.Common.Implementations/IO/MemoryStreamProvider.cs b/MediaBrowser.Common.Implementations/IO/MemoryStreamProvider.cs index c429474816..cc3bf07884 100644 --- a/MediaBrowser.Common.Implementations/IO/MemoryStreamProvider.cs +++ b/MediaBrowser.Common.Implementations/IO/MemoryStreamProvider.cs @@ -1,5 +1,6 @@ using System.IO; using MediaBrowser.Common.IO; +using MediaBrowser.Model.IO; using Microsoft.IO; namespace MediaBrowser.Common.Implementations.IO diff --git a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj index ebe9ac5c4b..44e4f88bdd 100644 --- a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj +++ b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj @@ -91,6 +91,7 @@ + @@ -101,11 +102,16 @@ + + + + + diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/DailyTrigger.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/DailyTrigger.cs new file mode 100644 index 0000000000..3d33e958de --- /dev/null +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/DailyTrigger.cs @@ -0,0 +1,91 @@ +using MediaBrowser.Model.Events; +using MediaBrowser.Model.Tasks; +using System; +using System.Globalization; +using System.Threading; +using MediaBrowser.Model.Logging; + +namespace MediaBrowser.Common.ScheduledTasks +{ + /// + /// Represents a task trigger that fires everyday + /// + public class DailyTrigger : ITaskTrigger + { + /// + /// Get the time of day to trigger the task to run + /// + /// The time of day. + public TimeSpan TimeOfDay { get; set; } + + /// + /// Gets or sets the timer. + /// + /// The timer. + private Timer Timer { get; set; } + + /// + /// Gets the execution properties of this task. + /// + /// + /// The execution properties of this task. + /// + public TaskExecutionOptions TaskOptions { get; set; } + + /// + /// Stars waiting for the trigger action + /// + /// The last result. + /// if set to true [is application startup]. + public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) + { + DisposeTimer(); + + var now = DateTime.Now; + + var triggerDate = now.TimeOfDay > TimeOfDay ? now.Date.AddDays(1) : now.Date; + triggerDate = triggerDate.Add(TimeOfDay); + + var dueTime = triggerDate - now; + + logger.Info("Daily trigger for {0} set to fire at {1}, which is {2} minutes from now.", taskName, triggerDate.ToString(), dueTime.TotalMinutes.ToString(CultureInfo.InvariantCulture)); + + Timer = new Timer(state => OnTriggered(), null, dueTime, TimeSpan.FromMilliseconds(-1)); + } + + /// + /// Stops waiting for the trigger action + /// + public void Stop() + { + DisposeTimer(); + } + + /// + /// Disposes the timer. + /// + private void DisposeTimer() + { + if (Timer != null) + { + Timer.Dispose(); + } + } + + /// + /// Occurs when [triggered]. + /// + public event EventHandler> Triggered; + + /// + /// Called when [triggered]. + /// + private void OnTriggered() + { + if (Triggered != null) + { + Triggered(this, new GenericEventArgs(TaskOptions)); + } + } + } +} diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/IntervalTrigger.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/IntervalTrigger.cs new file mode 100644 index 0000000000..8038d5551d --- /dev/null +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/IntervalTrigger.cs @@ -0,0 +1,112 @@ +using MediaBrowser.Model.Events; +using MediaBrowser.Model.Tasks; +using System; +using System.Linq; +using System.Threading; +using MediaBrowser.Model.Logging; + +namespace MediaBrowser.Common.ScheduledTasks +{ + /// + /// Represents a task trigger that runs repeatedly on an interval + /// + public class IntervalTrigger : ITaskTrigger + { + /// + /// Gets or sets the interval. + /// + /// The interval. + public TimeSpan Interval { get; set; } + + /// + /// Gets or sets the timer. + /// + /// The timer. + private Timer Timer { get; set; } + + /// + /// Gets the execution properties of this task. + /// + /// + /// The execution properties of this task. + /// + public TaskExecutionOptions TaskOptions { get; set; } + + private DateTime _lastStartDate; + + /// + /// Stars waiting for the trigger action + /// + /// The last result. + /// if set to true [is application startup]. + public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) + { + DisposeTimer(); + + DateTime triggerDate; + + if (lastResult == null) + { + // Task has never been completed before + triggerDate = DateTime.UtcNow.AddHours(1); + } + else + { + triggerDate = new[] { lastResult.EndTimeUtc, _lastStartDate }.Max().Add(Interval); + } + + if (DateTime.UtcNow > triggerDate) + { + triggerDate = DateTime.UtcNow.AddMinutes(1); + } + + var dueTime = triggerDate - DateTime.UtcNow; + var maxDueTime = TimeSpan.FromDays(7); + + if (dueTime > maxDueTime) + { + dueTime = maxDueTime; + } + + Timer = new Timer(state => OnTriggered(), null, dueTime, TimeSpan.FromMilliseconds(-1)); + } + + /// + /// Stops waiting for the trigger action + /// + public void Stop() + { + DisposeTimer(); + } + + /// + /// Disposes the timer. + /// + private void DisposeTimer() + { + if (Timer != null) + { + Timer.Dispose(); + } + } + + /// + /// Occurs when [triggered]. + /// + public event EventHandler> Triggered; + + /// + /// Called when [triggered]. + /// + private void OnTriggered() + { + DisposeTimer(); + + if (Triggered != null) + { + _lastStartDate = DateTime.UtcNow; + Triggered(this, new GenericEventArgs(TaskOptions)); + } + } + } +} diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs index ced85780f8..f3ed95c812 100644 --- a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs @@ -232,13 +232,12 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks /// /// The _triggers /// - private List _triggers; + private Tuple[] _triggers; /// /// Gets the triggers that define when the task will run /// /// The triggers. - /// value - public IEnumerable Triggers + private Tuple[] InternalTriggers { get { @@ -257,11 +256,33 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks DisposeTriggers(); } - _triggers = value.ToList(); + _triggers = value.ToArray(); ReloadTriggerEvents(false); + } + } - SaveTriggers(_triggers); + /// + /// Gets the triggers that define when the task will run + /// + /// The triggers. + /// value + public TaskTriggerInfo[] Triggers + { + get + { + return InternalTriggers.Select(i => i.Item1).ToArray(); + } + set + { + if (value == null) + { + throw new ArgumentNullException("value"); + } + + SaveTriggers(value); + + InternalTriggers = value.Select(i => new Tuple(i, GetTrigger(i))).ToArray(); } } @@ -304,8 +325,10 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks /// if set to true [is application startup]. private void ReloadTriggerEvents(bool isApplicationStartup) { - foreach (var trigger in Triggers) + foreach (var triggerInfo in InternalTriggers) { + var trigger = triggerInfo.Item2; + trigger.Stop(); trigger.Triggered -= trigger_Triggered; @@ -507,23 +530,29 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks /// Loads the triggers. /// /// IEnumerable{BaseTaskTrigger}. - private List LoadTriggers() + private Tuple[] LoadTriggers() + { + var settings = LoadTriggerSettings(); + + return settings.Select(i => new Tuple(i, GetTrigger(i))).ToArray(); + } + + private TaskTriggerInfo[] LoadTriggerSettings() { try { return JsonSerializer.DeserializeFromFile>(GetConfigurationFilePath()) - .Select(ScheduledTaskHelpers.GetTrigger) - .ToList(); + .ToArray(); } catch (FileNotFoundException) { // File doesn't exist. No biggie. Return defaults. - return ScheduledTask.GetDefaultTriggers().ToList(); + return ScheduledTask.GetDefaultTriggers().ToArray(); } catch (DirectoryNotFoundException) { // File doesn't exist. No biggie. Return defaults. - return ScheduledTask.GetDefaultTriggers().ToList(); + return ScheduledTask.GetDefaultTriggers().ToArray(); } } @@ -531,13 +560,13 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks /// Saves the triggers. /// /// The triggers. - private void SaveTriggers(IEnumerable triggers) + private void SaveTriggers(TaskTriggerInfo[] triggers) { var path = GetConfigurationFilePath(); _fileSystem.CreateDirectory(Path.GetDirectoryName(path)); - JsonSerializer.SerializeToFile(triggers.Select(ScheduledTaskHelpers.GetTriggerInfo), path); + JsonSerializer.SerializeToFile(triggers, path); } /// @@ -561,11 +590,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks Id = Id }; - var hasKey = ScheduledTask as IHasKey; - if (hasKey != null) - { - result.Key = hasKey.Key; - } + result.Key = ScheduledTask.Key; if (ex != null) { @@ -655,13 +680,98 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks } } + /// + /// Converts a TaskTriggerInfo into a concrete BaseTaskTrigger + /// + /// The info. + /// BaseTaskTrigger. + /// + /// Invalid trigger type: + info.Type + public static ITaskTrigger GetTrigger(TaskTriggerInfo info) + { + var options = new TaskExecutionOptions + { + MaxRuntimeMs = info.MaxRuntimeMs + }; + + if (info.Type.Equals(typeof(DailyTrigger).Name, StringComparison.OrdinalIgnoreCase)) + { + if (!info.TimeOfDayTicks.HasValue) + { + throw new ArgumentNullException(); + } + + return new DailyTrigger + { + TimeOfDay = TimeSpan.FromTicks(info.TimeOfDayTicks.Value), + TaskOptions = options + }; + } + + if (info.Type.Equals(typeof(WeeklyTrigger).Name, StringComparison.OrdinalIgnoreCase)) + { + if (!info.TimeOfDayTicks.HasValue) + { + throw new ArgumentNullException(); + } + + if (!info.DayOfWeek.HasValue) + { + throw new ArgumentNullException(); + } + + return new WeeklyTrigger + { + TimeOfDay = TimeSpan.FromTicks(info.TimeOfDayTicks.Value), + DayOfWeek = info.DayOfWeek.Value, + TaskOptions = options + }; + } + + if (info.Type.Equals(typeof(IntervalTrigger).Name, StringComparison.OrdinalIgnoreCase)) + { + if (!info.IntervalTicks.HasValue) + { + throw new ArgumentNullException(); + } + + return new IntervalTrigger + { + Interval = TimeSpan.FromTicks(info.IntervalTicks.Value), + TaskOptions = options + }; + } + + if (info.Type.Equals(typeof(SystemEventTrigger).Name, StringComparison.OrdinalIgnoreCase)) + { + if (!info.SystemEvent.HasValue) + { + throw new ArgumentNullException(); + } + + return new SystemEventTrigger + { + SystemEvent = info.SystemEvent.Value, + TaskOptions = options + }; + } + + if (info.Type.Equals(typeof(StartupTrigger).Name, StringComparison.OrdinalIgnoreCase)) + { + return new StartupTrigger(); + } + + throw new ArgumentException("Unrecognized trigger type: " + info.Type); + } + /// /// Disposes each trigger /// private void DisposeTriggers() { - foreach (var trigger in Triggers) + foreach (var triggerInfo in InternalTriggers) { + var trigger = triggerInfo.Item2; trigger.Triggered -= trigger_Triggered; trigger.Stop(); } diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/StartupTrigger.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/StartupTrigger.cs new file mode 100644 index 0000000000..41f58a7ad5 --- /dev/null +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/StartupTrigger.cs @@ -0,0 +1,67 @@ +using MediaBrowser.Model.Events; +using MediaBrowser.Model.Tasks; +using System; +using System.Threading.Tasks; +using MediaBrowser.Model.Logging; + +namespace MediaBrowser.Common.ScheduledTasks +{ + /// + /// Class StartupTaskTrigger + /// + public class StartupTrigger : ITaskTrigger + { + public int DelayMs { get; set; } + + /// + /// Gets the execution properties of this task. + /// + /// + /// The execution properties of this task. + /// + public TaskExecutionOptions TaskOptions { get; set; } + + public StartupTrigger() + { + DelayMs = 3000; + } + + /// + /// Stars waiting for the trigger action + /// + /// The last result. + /// if set to true [is application startup]. + public async void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) + { + if (isApplicationStartup) + { + await Task.Delay(DelayMs).ConfigureAwait(false); + + OnTriggered(); + } + } + + /// + /// Stops waiting for the trigger action + /// + public void Stop() + { + } + + /// + /// Occurs when [triggered]. + /// + public event EventHandler> Triggered; + + /// + /// Called when [triggered]. + /// + private void OnTriggered() + { + if (Triggered != null) + { + Triggered(this, new GenericEventArgs(TaskOptions)); + } + } + } +} diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/SystemEventTrigger.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/SystemEventTrigger.cs new file mode 100644 index 0000000000..9972dc8044 --- /dev/null +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/SystemEventTrigger.cs @@ -0,0 +1,84 @@ +using MediaBrowser.Model.Events; +using MediaBrowser.Model.Tasks; +using Microsoft.Win32; +using System; +using System.Threading.Tasks; +using MediaBrowser.Model.Logging; + +namespace MediaBrowser.Common.ScheduledTasks +{ + /// + /// Class SystemEventTrigger + /// + public class SystemEventTrigger : ITaskTrigger + { + /// + /// Gets or sets the system event. + /// + /// The system event. + public SystemEvent SystemEvent { get; set; } + + /// + /// Gets the execution properties of this task. + /// + /// + /// The execution properties of this task. + /// + public TaskExecutionOptions TaskOptions { get; set; } + + /// + /// Stars waiting for the trigger action + /// + /// The last result. + /// if set to true [is application startup]. + public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) + { + switch (SystemEvent) + { + case SystemEvent.WakeFromSleep: + SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; + break; + } + } + + /// + /// Stops waiting for the trigger action + /// + public void Stop() + { + SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged; + } + + /// + /// Handles the PowerModeChanged event of the SystemEvents control. + /// + /// The source of the event. + /// The instance containing the event data. + async void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) + { + if (e.Mode == PowerModes.Resume && SystemEvent == SystemEvent.WakeFromSleep) + { + // This value is a bit arbitrary, but add a delay to help ensure network connections have been restored before running the task + await Task.Delay(10000).ConfigureAwait(false); + + OnTriggered(); + } + } + + /// + /// Occurs when [triggered]. + /// + public event EventHandler> Triggered; + + /// + /// Called when [triggered]. + /// + private void OnTriggered() + { + if (Triggered != null) + { + Triggered(this, new GenericEventArgs(TaskOptions)); + } + } + } +} diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs index 0a2b9222a0..3d07047812 100644 --- a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using CommonIO; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks { @@ -40,13 +41,12 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks /// Creates the triggers that define when the task will run /// /// IEnumerable{BaseTaskTrigger}. - public IEnumerable GetDefaultTriggers() + public IEnumerable GetDefaultTriggers() { - // Until we can vary these default triggers per server and MBT, we need something that makes sense for both - return new ITaskTrigger[] { + return new[] { // Every so often - new IntervalTrigger { Interval = TimeSpan.FromHours(24)} + new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(24).Ticks} }; } @@ -95,7 +95,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks /// The progress. private void DeleteCacheFilesFromDirectory(CancellationToken cancellationToken, string directory, DateTime minDateModified, IProgress progress) { - var filesToDelete = _fileSystem.GetFiles(directory, true) + var filesToDelete = _fileSystem.GetFiles(directory, true) .Where(f => _fileSystem.GetLastWriteTimeUtc(f) < minDateModified) .ToList(); @@ -168,6 +168,11 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks get { return "Cache file cleanup"; } } + public string Key + { + get { return "DeleteCacheFiles"; } + } + /// /// Gets the description. /// @@ -202,5 +207,10 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks { get { return true; } } + + public bool IsLogged + { + get { return true; } + } } } diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs index b18ea03b1e..f7cbe8dcba 100644 --- a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using CommonIO; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks { @@ -36,13 +37,12 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks /// Creates the triggers that define when the task will run /// /// IEnumerable{BaseTaskTrigger}. - public IEnumerable GetDefaultTriggers() + public IEnumerable GetDefaultTriggers() { - // Until we can vary these default triggers per server and MBT, we need something that makes sense for both - return new ITaskTrigger[] { + return new[] { // Every so often - new IntervalTrigger { Interval = TimeSpan.FromHours(24)} + new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(24).Ticks} }; } @@ -82,6 +82,11 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks return Task.FromResult(true); } + public string Key + { + get { return "CleanLogFiles"; } + } + /// /// Gets the name of the task /// @@ -125,5 +130,10 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks { get { return true; } } + + public bool IsLogged + { + get { return true; } + } } } diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/ReloadLoggerFileTask.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/ReloadLoggerFileTask.cs index 78f60632fa..3c33df832e 100644 --- a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/ReloadLoggerFileTask.cs +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/ReloadLoggerFileTask.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks { @@ -39,9 +40,9 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks /// Gets the default triggers. /// /// IEnumerable{BaseTaskTrigger}. - public IEnumerable GetDefaultTriggers() + public IEnumerable GetDefaultTriggers() { - var trigger = new DailyTrigger { TimeOfDay = TimeSpan.FromHours(0) }; //12am + var trigger = new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerDaily, TimeOfDayTicks = TimeSpan.FromHours(0).Ticks }; //12am return new[] { trigger }; } @@ -74,6 +75,8 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks get { return "Start new log file"; } } + public string Key { get; } + /// /// Gets the description. /// @@ -101,5 +104,10 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks { get { return true; } } + + public bool IsLogged + { + get { return true; } + } } } diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/WeeklyTrigger.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/WeeklyTrigger.cs new file mode 100644 index 0000000000..318802e07d --- /dev/null +++ b/MediaBrowser.Common.Implementations/ScheduledTasks/WeeklyTrigger.cs @@ -0,0 +1,116 @@ +using System; +using System.Threading; +using MediaBrowser.Model.Events; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Tasks; + +namespace MediaBrowser.Common.ScheduledTasks +{ + /// + /// Represents a task trigger that fires on a weekly basis + /// + public class WeeklyTrigger : ITaskTrigger + { + /// + /// Get the time of day to trigger the task to run + /// + /// The time of day. + public TimeSpan TimeOfDay { get; set; } + + /// + /// Gets or sets the day of week. + /// + /// The day of week. + public DayOfWeek DayOfWeek { get; set; } + + /// + /// Gets the execution properties of this task. + /// + /// + /// The execution properties of this task. + /// + public TaskExecutionOptions TaskOptions { get; set; } + + /// + /// Gets or sets the timer. + /// + /// The timer. + private Timer Timer { get; set; } + + /// + /// Stars waiting for the trigger action + /// + /// The last result. + /// if set to true [is application startup]. + public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) + { + DisposeTimer(); + + var triggerDate = GetNextTriggerDateTime(); + + Timer = new Timer(state => OnTriggered(), null, triggerDate - DateTime.Now, TimeSpan.FromMilliseconds(-1)); + } + + /// + /// Gets the next trigger date time. + /// + /// DateTime. + private DateTime GetNextTriggerDateTime() + { + var now = DateTime.Now; + + // If it's on the same day + if (now.DayOfWeek == DayOfWeek) + { + // It's either later today, or a week from now + return now.TimeOfDay < TimeOfDay ? now.Date.Add(TimeOfDay) : now.Date.AddDays(7).Add(TimeOfDay); + } + + var triggerDate = now.Date; + + // Walk the date forward until we get to the trigger day + while (triggerDate.DayOfWeek != DayOfWeek) + { + triggerDate = triggerDate.AddDays(1); + } + + // Return the trigger date plus the time offset + return triggerDate.Add(TimeOfDay); + } + + /// + /// Stops waiting for the trigger action + /// + public void Stop() + { + DisposeTimer(); + } + + /// + /// Disposes the timer. + /// + private void DisposeTimer() + { + if (Timer != null) + { + Timer.Dispose(); + } + } + + /// + /// Occurs when [triggered]. + /// + public event EventHandler> Triggered; + + /// + /// Called when [triggered]. + /// + private void OnTriggered() + { + if (Triggered != null) + { + Triggered(this, new GenericEventArgs(TaskOptions)); + } + } + } +} diff --git a/MediaBrowser.Common/Extensions/BaseExtensions.cs b/MediaBrowser.Common/Extensions/BaseExtensions.cs index 22dfa378fc..09f6e8706b 100644 --- a/MediaBrowser.Common/Extensions/BaseExtensions.cs +++ b/MediaBrowser.Common/Extensions/BaseExtensions.cs @@ -1,9 +1,7 @@ using System; using System.Globalization; -using System.Linq; -using System.Security.Cryptography; -using System.Text; using System.Text.RegularExpressions; +using MediaBrowser.Model.Cryptography; namespace MediaBrowser.Common.Extensions { @@ -12,6 +10,7 @@ namespace MediaBrowser.Common.Extensions /// public static class BaseExtensions { + public static ICryptographyProvider CryptographyProvider { get; set; } /// /// Strips the HTML. @@ -26,15 +25,6 @@ namespace MediaBrowser.Common.Extensions return Regex.Replace(htmlString, pattern, string.Empty).Trim(); } - public static string RemoveDiacritics(this string text) - { - return String.Concat( - text.Normalize(NormalizationForm.FormD) - .Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch) != - UnicodeCategory.NonSpacingMark) - ).Normalize(NormalizationForm.FormC); - } - /// /// Gets the M d5. /// @@ -42,10 +32,7 @@ namespace MediaBrowser.Common.Extensions /// Guid. public static Guid GetMD5(this string str) { - using (var provider = MD5.Create()) - { - return new Guid(provider.ComputeHash(Encoding.Unicode.GetBytes(str))); - } + return CryptographyProvider.GetMD5(str); } /// diff --git a/MediaBrowser.Common/IApplicationHost.cs b/MediaBrowser.Common/IApplicationHost.cs index c843e828b2..8353eccdde 100644 --- a/MediaBrowser.Common/IApplicationHost.cs +++ b/MediaBrowser.Common/IApplicationHost.cs @@ -142,7 +142,7 @@ namespace MediaBrowser.Common /// Gets the plugins. /// /// The plugins. - IEnumerable Plugins { get; } + IPlugin[] Plugins { get; } /// /// Removes the plugin. diff --git a/MediaBrowser.Common/IO/IMemoryStreamProvider.cs b/MediaBrowser.Common/IO/IMemoryStreamProvider.cs deleted file mode 100644 index 1c0e98018e..0000000000 --- a/MediaBrowser.Common/IO/IMemoryStreamProvider.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.IO; - -namespace MediaBrowser.Common.IO -{ - public interface IMemoryStreamProvider - { - MemoryStream CreateNew(); - MemoryStream CreateNew(int capacity); - MemoryStream CreateNew(byte[] buffer); - } -} diff --git a/MediaBrowser.Common/IO/StreamDefaults.cs b/MediaBrowser.Common/IO/StreamDefaults.cs deleted file mode 100644 index 8b16d89b3b..0000000000 --- a/MediaBrowser.Common/IO/StreamDefaults.cs +++ /dev/null @@ -1,19 +0,0 @@ - -namespace MediaBrowser.Common.IO -{ - /// - /// Class StreamDefaults - /// - public static class StreamDefaults - { - /// - /// The default copy to buffer size - /// - public const int DefaultCopyToBufferSize = 81920; - - /// - /// The default file stream buffer size - /// - public const int DefaultFileStreamBufferSize = 81920; - } -} diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj index 9ee91684f9..94ebf8dc94 100644 --- a/MediaBrowser.Common/MediaBrowser.Common.csproj +++ b/MediaBrowser.Common/MediaBrowser.Common.csproj @@ -57,9 +57,7 @@ - - @@ -69,22 +67,13 @@ - - - - - - - - - diff --git a/MediaBrowser.Common/Plugins/BasePlugin.cs b/MediaBrowser.Common/Plugins/BasePlugin.cs index b75accf9b0..89ebeb6db1 100644 --- a/MediaBrowser.Common/Plugins/BasePlugin.cs +++ b/MediaBrowser.Common/Plugins/BasePlugin.cs @@ -3,8 +3,6 @@ using MediaBrowser.Model.Plugins; using MediaBrowser.Model.Serialization; using System; using System.IO; -using System.Reflection; -using System.Runtime.InteropServices; namespace MediaBrowser.Common.Plugins { @@ -12,7 +10,7 @@ namespace MediaBrowser.Common.Plugins /// Provides a common base class for all plugins /// /// The type of the T configuration type. - public abstract class BasePlugin : IPlugin + public abstract class BasePlugin : IPlugin, IPluginAssembly where TConfigurationType : BasePluginConfiguration { /// @@ -57,69 +55,33 @@ namespace MediaBrowser.Common.Plugins get { return typeof(TConfigurationType); } } - /// - /// The _assembly name - /// - private AssemblyName _assemblyName; - /// - /// Gets the name of the assembly. - /// - /// The name of the assembly. - protected AssemblyName AssemblyName + public void SetAttributes(string assemblyFilePath, string assemblyFileName, Version assemblyVersion, Guid assemblyId) { - get - { - return _assemblyName ?? (_assemblyName = GetType().Assembly.GetName()); - } - } + AssemblyFilePath = assemblyFilePath; + AssemblyFileName = assemblyFileName; + Version = assemblyVersion; + Id = assemblyId; - /// - /// The _unique id - /// - private Guid? _uniqueId; + IsFirstRun = !File.Exists(ConfigurationFilePath); + } /// /// Gets the unique id. /// /// The unique id. - public Guid Id - { - get - { - - if (!_uniqueId.HasValue) - { - var attribute = (GuidAttribute)GetType().Assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0]; - _uniqueId = new Guid(attribute.Value); - } - - return _uniqueId.Value; - } - } + public Guid Id { get; private set; } /// /// Gets the plugin version /// /// The version. - public Version Version - { - get - { - return AssemblyName.Version; - } - } + public Version Version { get; private set; } /// /// Gets the name the assembly file /// /// The name of the assembly file. - public string AssemblyFileName - { - get - { - return AssemblyName.Name + ".dll"; - } - } + protected string AssemblyFileName { get; private set; } /// /// Gets the last date modified of the configuration @@ -136,29 +98,11 @@ namespace MediaBrowser.Common.Plugins } } - /// - /// Gets the last date modified of the plugin - /// - /// The assembly date last modified. - public DateTime AssemblyDateLastModified - { - get - { - return File.GetLastWriteTimeUtc(AssemblyFilePath); - } - } - /// /// Gets the path to the assembly file /// /// The assembly file path. - public string AssemblyFilePath - { - get - { - return Path.Combine(ApplicationPaths.PluginsPath, AssemblyFileName); - } - } + public string AssemblyFilePath { get; private set; } /// /// The _configuration sync lock @@ -272,8 +216,6 @@ namespace MediaBrowser.Common.Plugins { ApplicationPaths = applicationPaths; XmlSerializer = xmlSerializer; - - IsFirstRun = !File.Exists(ConfigurationFilePath); } /// @@ -349,4 +291,9 @@ namespace MediaBrowser.Common.Plugins get { return Configuration; } } } + + public interface IPluginAssembly + { + void SetAttributes(string assemblyFilePath, string assemblyFileName, Version assemblyVersion, Guid assemblyId); + } } diff --git a/MediaBrowser.Common/Plugins/IPlugin.cs b/MediaBrowser.Common/Plugins/IPlugin.cs index 5a1252d1cd..3feeebb6b2 100644 --- a/MediaBrowser.Common/Plugins/IPlugin.cs +++ b/MediaBrowser.Common/Plugins/IPlugin.cs @@ -38,12 +38,6 @@ namespace MediaBrowser.Common.Plugins /// The version. Version Version { get; } - /// - /// Gets the name the assembly file - /// - /// The name of the assembly file. - string AssemblyFileName { get; } - /// /// Gets a value indicating whether this instance is first run. /// @@ -56,12 +50,6 @@ namespace MediaBrowser.Common.Plugins /// The configuration date last modified. DateTime ConfigurationDateLastModified { get; } - /// - /// Gets the last date modified of the plugin - /// - /// The assembly date last modified. - DateTime AssemblyDateLastModified { get; } - /// /// Gets the path to the assembly file /// diff --git a/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs b/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs deleted file mode 100644 index 3d33e958de..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs +++ /dev/null @@ -1,91 +0,0 @@ -using MediaBrowser.Model.Events; -using MediaBrowser.Model.Tasks; -using System; -using System.Globalization; -using System.Threading; -using MediaBrowser.Model.Logging; - -namespace MediaBrowser.Common.ScheduledTasks -{ - /// - /// Represents a task trigger that fires everyday - /// - public class DailyTrigger : ITaskTrigger - { - /// - /// Get the time of day to trigger the task to run - /// - /// The time of day. - public TimeSpan TimeOfDay { get; set; } - - /// - /// Gets or sets the timer. - /// - /// The timer. - private Timer Timer { get; set; } - - /// - /// Gets the execution properties of this task. - /// - /// - /// The execution properties of this task. - /// - public TaskExecutionOptions TaskOptions { get; set; } - - /// - /// Stars waiting for the trigger action - /// - /// The last result. - /// if set to true [is application startup]. - public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) - { - DisposeTimer(); - - var now = DateTime.Now; - - var triggerDate = now.TimeOfDay > TimeOfDay ? now.Date.AddDays(1) : now.Date; - triggerDate = triggerDate.Add(TimeOfDay); - - var dueTime = triggerDate - now; - - logger.Info("Daily trigger for {0} set to fire at {1}, which is {2} minutes from now.", taskName, triggerDate.ToString(), dueTime.TotalMinutes.ToString(CultureInfo.InvariantCulture)); - - Timer = new Timer(state => OnTriggered(), null, dueTime, TimeSpan.FromMilliseconds(-1)); - } - - /// - /// Stops waiting for the trigger action - /// - public void Stop() - { - DisposeTimer(); - } - - /// - /// Disposes the timer. - /// - private void DisposeTimer() - { - if (Timer != null) - { - Timer.Dispose(); - } - } - - /// - /// Occurs when [triggered]. - /// - public event EventHandler> Triggered; - - /// - /// Called when [triggered]. - /// - private void OnTriggered() - { - if (Triggered != null) - { - Triggered(this, new GenericEventArgs(TaskOptions)); - } - } - } -} diff --git a/MediaBrowser.Common/ScheduledTasks/IConfigurableScheduledTask.cs b/MediaBrowser.Common/ScheduledTasks/IConfigurableScheduledTask.cs deleted file mode 100644 index 6989dea06b..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/IConfigurableScheduledTask.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace MediaBrowser.Common.ScheduledTasks -{ - public interface IConfigurableScheduledTask - { - /// - /// Gets a value indicating whether this instance is hidden. - /// - /// true if this instance is hidden; otherwise, false. - bool IsHidden { get; } - /// - /// Gets a value indicating whether this instance is enabled. - /// - /// true if this instance is enabled; otherwise, false. - bool IsEnabled { get; } - } - - public interface IScheduledTaskActivityLog - { - bool IsActivityLogged { get; } - } -} \ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/IHasKey.cs b/MediaBrowser.Common/ScheduledTasks/IHasKey.cs deleted file mode 100644 index 5736cb6162..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/IHasKey.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MediaBrowser.Common.ScheduledTasks -{ - public interface IHasKey - { - string Key { get; } - } -} \ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs b/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs deleted file mode 100644 index 351e96c7d5..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Common.ScheduledTasks -{ - /// - /// Interface IScheduledTaskWorker - /// - public interface IScheduledTask - { - /// - /// Gets the name of the task - /// - /// The name. - string Name { get; } - - /// - /// Gets the description. - /// - /// The description. - string Description { get; } - - /// - /// Gets the category. - /// - /// The category. - string Category { get; } - - /// - /// Executes the task - /// - /// The cancellation token. - /// The progress. - /// Task. - Task Execute(CancellationToken cancellationToken, IProgress progress); - - /// - /// Gets the default triggers. - /// - /// IEnumerable{BaseTaskTrigger}. - IEnumerable GetDefaultTriggers(); - } -} diff --git a/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs b/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs index 0b9a5e276a..a3a28684dd 100644 --- a/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs +++ b/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs @@ -1,7 +1,6 @@ using MediaBrowser.Model.Events; using MediaBrowser.Model.Tasks; using System; -using System.Collections.Generic; namespace MediaBrowser.Common.ScheduledTasks { @@ -62,7 +61,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// /// The triggers. /// value - IEnumerable Triggers { get; set; } + TaskTriggerInfo[] Triggers { get; set; } /// /// Gets the unique id. diff --git a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs index f1809c4516..e557a6b2c3 100644 --- a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs +++ b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Common.ScheduledTasks { diff --git a/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs b/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs index ef1ea9d387..d6ca63ad7e 100644 --- a/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs +++ b/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs @@ -18,8 +18,6 @@ namespace MediaBrowser.Common.ScheduledTasks /// /// Stars waiting for the trigger action /// - /// The last result. - /// if set to true [is application startup]. void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup); /// diff --git a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs b/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs deleted file mode 100644 index 8038d5551d..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs +++ /dev/null @@ -1,112 +0,0 @@ -using MediaBrowser.Model.Events; -using MediaBrowser.Model.Tasks; -using System; -using System.Linq; -using System.Threading; -using MediaBrowser.Model.Logging; - -namespace MediaBrowser.Common.ScheduledTasks -{ - /// - /// Represents a task trigger that runs repeatedly on an interval - /// - public class IntervalTrigger : ITaskTrigger - { - /// - /// Gets or sets the interval. - /// - /// The interval. - public TimeSpan Interval { get; set; } - - /// - /// Gets or sets the timer. - /// - /// The timer. - private Timer Timer { get; set; } - - /// - /// Gets the execution properties of this task. - /// - /// - /// The execution properties of this task. - /// - public TaskExecutionOptions TaskOptions { get; set; } - - private DateTime _lastStartDate; - - /// - /// Stars waiting for the trigger action - /// - /// The last result. - /// if set to true [is application startup]. - public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) - { - DisposeTimer(); - - DateTime triggerDate; - - if (lastResult == null) - { - // Task has never been completed before - triggerDate = DateTime.UtcNow.AddHours(1); - } - else - { - triggerDate = new[] { lastResult.EndTimeUtc, _lastStartDate }.Max().Add(Interval); - } - - if (DateTime.UtcNow > triggerDate) - { - triggerDate = DateTime.UtcNow.AddMinutes(1); - } - - var dueTime = triggerDate - DateTime.UtcNow; - var maxDueTime = TimeSpan.FromDays(7); - - if (dueTime > maxDueTime) - { - dueTime = maxDueTime; - } - - Timer = new Timer(state => OnTriggered(), null, dueTime, TimeSpan.FromMilliseconds(-1)); - } - - /// - /// Stops waiting for the trigger action - /// - public void Stop() - { - DisposeTimer(); - } - - /// - /// Disposes the timer. - /// - private void DisposeTimer() - { - if (Timer != null) - { - Timer.Dispose(); - } - } - - /// - /// Occurs when [triggered]. - /// - public event EventHandler> Triggered; - - /// - /// Called when [triggered]. - /// - private void OnTriggered() - { - DisposeTimer(); - - if (Triggered != null) - { - _lastStartDate = DateTime.UtcNow; - Triggered(this, new GenericEventArgs(TaskOptions)); - } - } - } -} diff --git a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs index 4ad33341ad..fe45f16213 100644 --- a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs +++ b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs @@ -25,17 +25,9 @@ namespace MediaBrowser.Common.ScheduledTasks isHidden = configurableTask.IsHidden; } - string key = null; - - var hasKey = task.ScheduledTask as IHasKey; - - if (hasKey != null) - { - key = hasKey.Key; - } + string key = task.ScheduledTask.Key; var triggers = task.Triggers - .Select(GetTriggerInfo) .OrderBy(i => i.Type) .ThenBy(i => i.DayOfWeek ?? DayOfWeek.Sunday) .ThenBy(i => i.TimeOfDayTicks ?? 0) @@ -57,138 +49,5 @@ namespace MediaBrowser.Common.ScheduledTasks Key = key }; } - - /// - /// Gets the trigger info. - /// - /// The trigger. - /// TaskTriggerInfo. - public static TaskTriggerInfo GetTriggerInfo(ITaskTrigger trigger) - { - var info = new TaskTriggerInfo - { - Type = trigger.GetType().Name - }; - - var dailyTrigger = trigger as DailyTrigger; - - if (dailyTrigger != null) - { - info.TimeOfDayTicks = dailyTrigger.TimeOfDay.Ticks; - } - - var weeklyTaskTrigger = trigger as WeeklyTrigger; - - if (weeklyTaskTrigger != null) - { - info.TimeOfDayTicks = weeklyTaskTrigger.TimeOfDay.Ticks; - info.DayOfWeek = weeklyTaskTrigger.DayOfWeek; - } - - var intervalTaskTrigger = trigger as IntervalTrigger; - - if (intervalTaskTrigger != null) - { - info.IntervalTicks = intervalTaskTrigger.Interval.Ticks; - } - - var systemEventTrigger = trigger as SystemEventTrigger; - - if (systemEventTrigger != null) - { - info.SystemEvent = systemEventTrigger.SystemEvent; - } - - if (trigger.TaskOptions != null) - { - info.MaxRuntimeMs = trigger.TaskOptions.MaxRuntimeMs; - } - - return info; - } - - /// - /// Converts a TaskTriggerInfo into a concrete BaseTaskTrigger - /// - /// The info. - /// BaseTaskTrigger. - /// - /// Invalid trigger type: + info.Type - public static ITaskTrigger GetTrigger(TaskTriggerInfo info) - { - var options = new TaskExecutionOptions - { - MaxRuntimeMs = info.MaxRuntimeMs - }; - - if (info.Type.Equals(typeof(DailyTrigger).Name, StringComparison.OrdinalIgnoreCase)) - { - if (!info.TimeOfDayTicks.HasValue) - { - throw new ArgumentNullException(); - } - - return new DailyTrigger - { - TimeOfDay = TimeSpan.FromTicks(info.TimeOfDayTicks.Value), - TaskOptions = options - }; - } - - if (info.Type.Equals(typeof(WeeklyTrigger).Name, StringComparison.OrdinalIgnoreCase)) - { - if (!info.TimeOfDayTicks.HasValue) - { - throw new ArgumentNullException(); - } - - if (!info.DayOfWeek.HasValue) - { - throw new ArgumentNullException(); - } - - return new WeeklyTrigger - { - TimeOfDay = TimeSpan.FromTicks(info.TimeOfDayTicks.Value), - DayOfWeek = info.DayOfWeek.Value, - TaskOptions = options - }; - } - - if (info.Type.Equals(typeof(IntervalTrigger).Name, StringComparison.OrdinalIgnoreCase)) - { - if (!info.IntervalTicks.HasValue) - { - throw new ArgumentNullException(); - } - - return new IntervalTrigger - { - Interval = TimeSpan.FromTicks(info.IntervalTicks.Value), - TaskOptions = options - }; - } - - if (info.Type.Equals(typeof(SystemEventTrigger).Name, StringComparison.OrdinalIgnoreCase)) - { - if (!info.SystemEvent.HasValue) - { - throw new ArgumentNullException(); - } - - return new SystemEventTrigger - { - SystemEvent = info.SystemEvent.Value, - TaskOptions = options - }; - } - - if (info.Type.Equals(typeof(StartupTrigger).Name, StringComparison.OrdinalIgnoreCase)) - { - return new StartupTrigger(); - } - - throw new ArgumentException("Unrecognized trigger type: " + info.Type); - } } } diff --git a/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs b/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs deleted file mode 100644 index 41f58a7ad5..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs +++ /dev/null @@ -1,67 +0,0 @@ -using MediaBrowser.Model.Events; -using MediaBrowser.Model.Tasks; -using System; -using System.Threading.Tasks; -using MediaBrowser.Model.Logging; - -namespace MediaBrowser.Common.ScheduledTasks -{ - /// - /// Class StartupTaskTrigger - /// - public class StartupTrigger : ITaskTrigger - { - public int DelayMs { get; set; } - - /// - /// Gets the execution properties of this task. - /// - /// - /// The execution properties of this task. - /// - public TaskExecutionOptions TaskOptions { get; set; } - - public StartupTrigger() - { - DelayMs = 3000; - } - - /// - /// Stars waiting for the trigger action - /// - /// The last result. - /// if set to true [is application startup]. - public async void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) - { - if (isApplicationStartup) - { - await Task.Delay(DelayMs).ConfigureAwait(false); - - OnTriggered(); - } - } - - /// - /// Stops waiting for the trigger action - /// - public void Stop() - { - } - - /// - /// Occurs when [triggered]. - /// - public event EventHandler> Triggered; - - /// - /// Called when [triggered]. - /// - private void OnTriggered() - { - if (Triggered != null) - { - Triggered(this, new GenericEventArgs(TaskOptions)); - } - } - } -} diff --git a/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs b/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs deleted file mode 100644 index 9972dc8044..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs +++ /dev/null @@ -1,84 +0,0 @@ -using MediaBrowser.Model.Events; -using MediaBrowser.Model.Tasks; -using Microsoft.Win32; -using System; -using System.Threading.Tasks; -using MediaBrowser.Model.Logging; - -namespace MediaBrowser.Common.ScheduledTasks -{ - /// - /// Class SystemEventTrigger - /// - public class SystemEventTrigger : ITaskTrigger - { - /// - /// Gets or sets the system event. - /// - /// The system event. - public SystemEvent SystemEvent { get; set; } - - /// - /// Gets the execution properties of this task. - /// - /// - /// The execution properties of this task. - /// - public TaskExecutionOptions TaskOptions { get; set; } - - /// - /// Stars waiting for the trigger action - /// - /// The last result. - /// if set to true [is application startup]. - public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) - { - switch (SystemEvent) - { - case SystemEvent.WakeFromSleep: - SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; - break; - } - } - - /// - /// Stops waiting for the trigger action - /// - public void Stop() - { - SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged; - } - - /// - /// Handles the PowerModeChanged event of the SystemEvents control. - /// - /// The source of the event. - /// The instance containing the event data. - async void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) - { - if (e.Mode == PowerModes.Resume && SystemEvent == SystemEvent.WakeFromSleep) - { - // This value is a bit arbitrary, but add a delay to help ensure network connections have been restored before running the task - await Task.Delay(10000).ConfigureAwait(false); - - OnTriggered(); - } - } - - /// - /// Occurs when [triggered]. - /// - public event EventHandler> Triggered; - - /// - /// Called when [triggered]. - /// - private void OnTriggered() - { - if (Triggered != null) - { - Triggered(this, new GenericEventArgs(TaskOptions)); - } - } - } -} diff --git a/MediaBrowser.Common/ScheduledTasks/TaskExecutionOptions.cs b/MediaBrowser.Common/ScheduledTasks/TaskExecutionOptions.cs deleted file mode 100644 index 41b33b1c26..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/TaskExecutionOptions.cs +++ /dev/null @@ -1,11 +0,0 @@ - -namespace MediaBrowser.Common.ScheduledTasks -{ - /// - /// A class that encomposases all common task run properties. - /// - public class TaskExecutionOptions - { - public int? MaxRuntimeMs { get; set; } - } -} diff --git a/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs b/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs deleted file mode 100644 index 318802e07d..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System; -using System.Threading; -using MediaBrowser.Model.Events; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Tasks; - -namespace MediaBrowser.Common.ScheduledTasks -{ - /// - /// Represents a task trigger that fires on a weekly basis - /// - public class WeeklyTrigger : ITaskTrigger - { - /// - /// Get the time of day to trigger the task to run - /// - /// The time of day. - public TimeSpan TimeOfDay { get; set; } - - /// - /// Gets or sets the day of week. - /// - /// The day of week. - public DayOfWeek DayOfWeek { get; set; } - - /// - /// Gets the execution properties of this task. - /// - /// - /// The execution properties of this task. - /// - public TaskExecutionOptions TaskOptions { get; set; } - - /// - /// Gets or sets the timer. - /// - /// The timer. - private Timer Timer { get; set; } - - /// - /// Stars waiting for the trigger action - /// - /// The last result. - /// if set to true [is application startup]. - public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup) - { - DisposeTimer(); - - var triggerDate = GetNextTriggerDateTime(); - - Timer = new Timer(state => OnTriggered(), null, triggerDate - DateTime.Now, TimeSpan.FromMilliseconds(-1)); - } - - /// - /// Gets the next trigger date time. - /// - /// DateTime. - private DateTime GetNextTriggerDateTime() - { - var now = DateTime.Now; - - // If it's on the same day - if (now.DayOfWeek == DayOfWeek) - { - // It's either later today, or a week from now - return now.TimeOfDay < TimeOfDay ? now.Date.Add(TimeOfDay) : now.Date.AddDays(7).Add(TimeOfDay); - } - - var triggerDate = now.Date; - - // Walk the date forward until we get to the trigger day - while (triggerDate.DayOfWeek != DayOfWeek) - { - triggerDate = triggerDate.AddDays(1); - } - - // Return the trigger date plus the time offset - return triggerDate.Add(TimeOfDay); - } - - /// - /// Stops waiting for the trigger action - /// - public void Stop() - { - DisposeTimer(); - } - - /// - /// Disposes the timer. - /// - private void DisposeTimer() - { - if (Timer != null) - { - Timer.Dispose(); - } - } - - /// - /// Occurs when [triggered]. - /// - public event EventHandler> Triggered; - - /// - /// Called when [triggered]. - /// - private void OnTriggered() - { - if (Triggered != null) - { - Triggered(this, new GenericEventArgs(TaskOptions)); - } - } - } -} diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs index a31f04fc4f..07cf43c5bb 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs @@ -10,6 +10,7 @@ using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Extensions; namespace MediaBrowser.Controller.Entities.Audio { diff --git a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs index bd991d9f47..a111166aca 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Extensions; namespace MediaBrowser.Controller.Entities.Audio { diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index e1a7741c94..9aad91a28c 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -24,6 +24,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using CommonIO; +using MediaBrowser.Controller.Extensions; using MediaBrowser.Controller.Sorting; using MediaBrowser.Model.LiveTv; using MediaBrowser.Model.Providers; diff --git a/MediaBrowser.Controller/Entities/GameGenre.cs b/MediaBrowser.Controller/Entities/GameGenre.cs index 6448828fb3..2987a9a077 100644 --- a/MediaBrowser.Controller/Entities/GameGenre.cs +++ b/MediaBrowser.Controller/Entities/GameGenre.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Extensions; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/Genre.cs b/MediaBrowser.Controller/Entities/Genre.cs index 1736ba8c76..cde9c6ce41 100644 --- a/MediaBrowser.Controller/Entities/Genre.cs +++ b/MediaBrowser.Controller/Entities/Genre.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Extensions; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/Person.cs b/MediaBrowser.Controller/Entities/Person.cs index f21bc0a71e..d7acdb65ec 100644 --- a/MediaBrowser.Controller/Entities/Person.cs +++ b/MediaBrowser.Controller/Entities/Person.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Extensions; using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Entities diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs index 04b09b7442..773250ad9e 100644 --- a/MediaBrowser.Controller/Entities/Studio.cs +++ b/MediaBrowser.Controller/Entities/Studio.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Extensions; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Extensions/BaseExtensions.cs b/MediaBrowser.Controller/Extensions/BaseExtensions.cs new file mode 100644 index 0000000000..84a9b1524e --- /dev/null +++ b/MediaBrowser.Controller/Extensions/BaseExtensions.cs @@ -0,0 +1,25 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Text; +using MediaBrowser.Model.Cryptography; + +namespace MediaBrowser.Controller.Extensions +{ + /// + /// Class BaseExtensions + /// + public static class BaseExtensions + { + public static ICryptographyProvider CryptographyProvider { get; set; } + + public static string RemoveDiacritics(this string text) + { + return String.Concat( + text.Normalize(NormalizationForm.FormD) + .Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch) != + UnicodeCategory.NonSpacingMark) + ).Normalize(NormalizationForm.FormC); + } + } +} diff --git a/MediaBrowser.Controller/Library/NameExtensions.cs b/MediaBrowser.Controller/Library/NameExtensions.cs index 19d0fc772f..5f52a93c94 100644 --- a/MediaBrowser.Controller/Library/NameExtensions.cs +++ b/MediaBrowser.Controller/Library/NameExtensions.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; +using MediaBrowser.Controller.Extensions; using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Library diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index c14e25030c..46277a7839 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -165,6 +165,7 @@ + diff --git a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs index 9f51dcf667..cf162ac773 100644 --- a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs +++ b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs @@ -12,6 +12,7 @@ using CommonIO; using MediaBrowser.Common.IO; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; +using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.MediaInfo; diff --git a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs index 6dda49a554..45bffa2df5 100644 --- a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs +++ b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs @@ -20,6 +20,7 @@ using System.Threading.Tasks; using CommonIO; using MediaBrowser.Common.IO; using MediaBrowser.Controller.IO; +using MediaBrowser.Model.IO; using UniversalDetector; namespace MediaBrowser.MediaEncoding.Subtitles diff --git a/MediaBrowser.Model/Cryptography/ICryptographyProvider.cs b/MediaBrowser.Model/Cryptography/ICryptographyProvider.cs new file mode 100644 index 0000000000..5899f03d57 --- /dev/null +++ b/MediaBrowser.Model/Cryptography/ICryptographyProvider.cs @@ -0,0 +1,9 @@ +using System; + +namespace MediaBrowser.Model.Cryptography +{ + public interface ICryptographyProvider + { + Guid GetMD5(string str); + } +} diff --git a/MediaBrowser.Model/Entities/MediaStream.cs b/MediaBrowser.Model/Entities/MediaStream.cs index 6d3e2ce4c3..b56d7df15c 100644 --- a/MediaBrowser.Model/Entities/MediaStream.cs +++ b/MediaBrowser.Model/Entities/MediaStream.cs @@ -118,7 +118,7 @@ namespace MediaBrowser.Model.Entities private string AddLanguageIfNeeded(string title) { - if (!string.IsNullOrEmpty(Language) && title.IndexOf(Language, StringComparison.OrdinalIgnoreCase) == -1) + if (!string.IsNullOrEmpty(Language) && !string.Equals(Language, "und", StringComparison.OrdinalIgnoreCase) && title.IndexOf(Language, StringComparison.OrdinalIgnoreCase) == -1) { title = StringHelper.FirstToUpper(Language) + " " + title; } diff --git a/MediaBrowser.Model/IO/IMemoryStreamProvider.cs b/MediaBrowser.Model/IO/IMemoryStreamProvider.cs new file mode 100644 index 0000000000..82a758d9a1 --- /dev/null +++ b/MediaBrowser.Model/IO/IMemoryStreamProvider.cs @@ -0,0 +1,11 @@ +using System.IO; + +namespace MediaBrowser.Model.IO +{ + public interface IMemoryStreamProvider + { + MemoryStream CreateNew(); + MemoryStream CreateNew(int capacity); + MemoryStream CreateNew(byte[] buffer); + } +} diff --git a/MediaBrowser.Model/IO/StreamDefaults.cs b/MediaBrowser.Model/IO/StreamDefaults.cs new file mode 100644 index 0000000000..1e99ff4b55 --- /dev/null +++ b/MediaBrowser.Model/IO/StreamDefaults.cs @@ -0,0 +1,19 @@ + +namespace MediaBrowser.Model.IO +{ + /// + /// Class StreamDefaults + /// + public static class StreamDefaults + { + /// + /// The default copy to buffer size + /// + public const int DefaultCopyToBufferSize = 81920; + + /// + /// The default file stream buffer size + /// + public const int DefaultFileStreamBufferSize = 81920; + } +} diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index 6c9197c164..e5aac6c061 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -98,6 +98,7 @@ + @@ -133,6 +134,8 @@ + + @@ -384,6 +387,9 @@ + + + diff --git a/MediaBrowser.Model/Tasks/IConfigurableScheduledTask.cs b/MediaBrowser.Model/Tasks/IConfigurableScheduledTask.cs new file mode 100644 index 0000000000..ed981a905b --- /dev/null +++ b/MediaBrowser.Model/Tasks/IConfigurableScheduledTask.cs @@ -0,0 +1,18 @@ +namespace MediaBrowser.Model.Tasks +{ + public interface IConfigurableScheduledTask + { + /// + /// Gets a value indicating whether this instance is hidden. + /// + /// true if this instance is hidden; otherwise, false. + bool IsHidden { get; } + /// + /// Gets a value indicating whether this instance is enabled. + /// + /// true if this instance is enabled; otherwise, false. + bool IsEnabled { get; } + + bool IsLogged { get; } + } +} \ No newline at end of file diff --git a/MediaBrowser.Model/Tasks/IScheduledTask.cs b/MediaBrowser.Model/Tasks/IScheduledTask.cs new file mode 100644 index 0000000000..81ba239ad8 --- /dev/null +++ b/MediaBrowser.Model/Tasks/IScheduledTask.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Model.Tasks +{ + /// + /// Interface IScheduledTaskWorker + /// + public interface IScheduledTask + { + /// + /// Gets the name of the task + /// + /// The name. + string Name { get; } + + string Key { get; } + + /// + /// Gets the description. + /// + /// The description. + string Description { get; } + + /// + /// Gets the category. + /// + /// The category. + string Category { get; } + + /// + /// Executes the task + /// + /// The cancellation token. + /// The progress. + /// Task. + Task Execute(CancellationToken cancellationToken, IProgress progress); + + /// + /// Gets the default triggers. + /// + /// IEnumerable{BaseTaskTrigger}. + IEnumerable GetDefaultTriggers(); + } +} diff --git a/MediaBrowser.Model/Tasks/TaskExecutionOptions.cs b/MediaBrowser.Model/Tasks/TaskExecutionOptions.cs new file mode 100644 index 0000000000..faba35b222 --- /dev/null +++ b/MediaBrowser.Model/Tasks/TaskExecutionOptions.cs @@ -0,0 +1,11 @@ + +namespace MediaBrowser.Model.Tasks +{ + /// + /// A class that encomposases all common task run properties. + /// + public class TaskExecutionOptions + { + public int? MaxRuntimeMs { get; set; } + } +} diff --git a/MediaBrowser.Model/Tasks/TaskTriggerInfo.cs b/MediaBrowser.Model/Tasks/TaskTriggerInfo.cs index aacd56e655..69578c41d0 100644 --- a/MediaBrowser.Model/Tasks/TaskTriggerInfo.cs +++ b/MediaBrowser.Model/Tasks/TaskTriggerInfo.cs @@ -42,5 +42,11 @@ namespace MediaBrowser.Model.Tasks /// /// The maximum runtime ms. public int? MaxRuntimeMs { get; set; } + + public const string TriggerDaily = "DailyTrigger"; + public const string TriggerWeekly = "WeeklyTrigger"; + public const string TriggerInterval = "IntervalTrigger"; + public const string TriggerSystemEvent = "SystemEventTrigger"; + public const string TriggerStartup = "StartupTrigger"; } } diff --git a/MediaBrowser.Providers/Manager/ImageSaver.cs b/MediaBrowser.Providers/Manager/ImageSaver.cs index 767c034ee6..3b7e24e3a5 100644 --- a/MediaBrowser.Providers/Manager/ImageSaver.cs +++ b/MediaBrowser.Providers/Manager/ImageSaver.cs @@ -17,6 +17,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using CommonIO; +using MediaBrowser.Model.IO; namespace MediaBrowser.Providers.Manager { diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index dfeceed7d4..43598e29d8 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -21,6 +21,7 @@ using System.Threading; using System.Threading.Tasks; using CommonIO; using MediaBrowser.Common.IO; +using MediaBrowser.Model.IO; using MediaBrowser.Model.Serialization; namespace MediaBrowser.Providers.Manager diff --git a/MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs b/MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs index 9ae8413d19..b69e371364 100644 --- a/MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs +++ b/MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs @@ -139,7 +139,7 @@ namespace MediaBrowser.Providers.MediaInfo request.IndexNumberEnd = episode.IndexNumberEnd; request.SeriesName = episode.SeriesName; } - + try { var searchResults = await _subtitleManager.SearchSubtitles(request, cancellationToken).ConfigureAwait(false); diff --git a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs index dd88026895..f05bf3ab81 100644 --- a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs +++ b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs @@ -16,6 +16,7 @@ using System.Threading; using System.Threading.Tasks; using System.IO; using MediaBrowser.Model.Serialization; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Providers.MediaInfo { @@ -184,12 +185,18 @@ namespace MediaBrowser.Providers.MediaInfo return false; } - public IEnumerable GetDefaultTriggers() + public IEnumerable GetDefaultTriggers() { - return new ITaskTrigger[] - { - new IntervalTrigger{ Interval = TimeSpan.FromHours(8)} - }; + return new[] { + + // Every so often + new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(24).Ticks} + }; + } + + public string Key + { + get { return "DownloadSubtitles"; } } } } diff --git a/MediaBrowser.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs b/MediaBrowser.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs index 5ac3da3db6..4202870bd6 100644 --- a/MediaBrowser.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs +++ b/MediaBrowser.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs @@ -5,10 +5,11 @@ using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; using System.Threading.Tasks; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.Channels { - class RefreshChannelsScheduledTask : IScheduledTask, IConfigurableScheduledTask + class RefreshChannelsScheduledTask : IScheduledTask { private readonly IChannelManager _channelManager; private readonly IUserManager _userManager; @@ -48,14 +49,23 @@ namespace MediaBrowser.Server.Implementations.Channels .ConfigureAwait(false); } - public IEnumerable GetDefaultTriggers() + /// + /// Creates the triggers that define when the task will run + /// + public IEnumerable GetDefaultTriggers() { - return new ITaskTrigger[] - { - new IntervalTrigger{ Interval = TimeSpan.FromHours(24)} + return new[] { + + // Every so often + new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(24).Ticks} }; } + public string Key + { + get { return "RefreshInternetChannels"; } + } + public bool IsHidden { get { return false; } diff --git a/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs b/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs index a36583a412..6e4451d96a 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs @@ -401,8 +401,8 @@ namespace MediaBrowser.Server.Implementations.EntryPoints { var task = e.Argument; - var activityTask = task.ScheduledTask as IScheduledTaskActivityLog; - if (activityTask != null && !activityTask.IsActivityLogged) + var activityTask = task.ScheduledTask as IConfigurableScheduledTask; + if (activityTask != null && !activityTask.IsLogged) { return; } @@ -419,8 +419,8 @@ namespace MediaBrowser.Server.Implementations.EntryPoints var result = e.Result; var task = e.Task; - var activityTask = task.ScheduledTask as IScheduledTaskActivityLog; - if (activityTask != null && !activityTask.IsActivityLogged) + var activityTask = task.ScheduledTask as IConfigurableScheduledTask; + if (activityTask != null && !activityTask.IsLogged) { return; } diff --git a/MediaBrowser.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs b/MediaBrowser.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs index de98b83ef2..2cc8d0ea54 100644 --- a/MediaBrowser.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs +++ b/MediaBrowser.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs @@ -10,10 +10,11 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using CommonIO; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.FileOrganization { - public class OrganizerScheduledTask : IScheduledTask, IConfigurableScheduledTask, IScheduledTaskActivityLog, IHasKey + public class OrganizerScheduledTask : IScheduledTask, IConfigurableScheduledTask { private readonly ILibraryMonitor _libraryMonitor; private readonly ILibraryManager _libraryManager; @@ -63,12 +64,17 @@ namespace MediaBrowser.Server.Implementations.FileOrganization } } - public IEnumerable GetDefaultTriggers() + /// + /// Creates the triggers that define when the task will run + /// + /// IEnumerable{BaseTaskTrigger}. + public IEnumerable GetDefaultTriggers() { - return new ITaskTrigger[] - { - new IntervalTrigger{ Interval = TimeSpan.FromMinutes(5)} - }; + return new[] { + + // Every so often + new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromMinutes(5).Ticks} + }; } public bool IsHidden @@ -81,7 +87,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization get { return GetAutoOrganizeOptions().TvOptions.IsEnabled; } } - public bool IsActivityLogged + public bool IsLogged { get { return false; } } diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs index b3d3ec13cc..21522a9dab 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -23,6 +23,7 @@ using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Common.Security; using MediaBrowser.Model.Extensions; +using MediaBrowser.Model.IO; namespace MediaBrowser.Server.Implementations.HttpServer { diff --git a/MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs b/MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs index 8a7c14eb66..b2cbf2387e 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/ServerFactory.cs @@ -3,6 +3,7 @@ using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Net; +using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using ServiceStack.Logging; diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs index b090c97c6e..5509eb6271 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using MediaBrowser.Common.IO; +using MediaBrowser.Model.IO; namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp { diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs index b5c8d01075..59e0b2a9b2 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs @@ -4,6 +4,7 @@ using System.IO; using System.Text; using Funq; using MediaBrowser.Common.IO; +using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using ServiceStack; using ServiceStack.Host; diff --git a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs index 40cca7baba..3dff16e24a 100644 --- a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs +++ b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs @@ -10,6 +10,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using MediaBrowser.Controller.Extensions; namespace MediaBrowser.Server.Implementations.Library { diff --git a/MediaBrowser.Server.Implementations/LiveTv/RefreshChannelsScheduledTask.cs b/MediaBrowser.Server.Implementations/LiveTv/RefreshChannelsScheduledTask.cs index 3fb1d96614..ad7f839e8c 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/RefreshChannelsScheduledTask.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/RefreshChannelsScheduledTask.cs @@ -6,10 +6,11 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.LiveTv { - public class RefreshChannelsScheduledTask : IScheduledTask, IConfigurableScheduledTask, IHasKey + public class RefreshChannelsScheduledTask : IScheduledTask, IConfigurableScheduledTask { private readonly ILiveTvManager _liveTvManager; private readonly IConfigurationManager _config; @@ -42,11 +43,16 @@ namespace MediaBrowser.Server.Implementations.LiveTv return manager.RefreshChannels(progress, cancellationToken); } - public IEnumerable GetDefaultTriggers() + /// + /// Creates the triggers that define when the task will run + /// + /// IEnumerable{BaseTaskTrigger}. + public IEnumerable GetDefaultTriggers() { - return new ITaskTrigger[] - { - new IntervalTrigger{ Interval = TimeSpan.FromHours(12)} + return new[] { + + // Every so often + new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(12).Ticks} }; } @@ -65,6 +71,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv get { return true; } } + public bool IsLogged + { + get { return true; } + } + public string Key { get { return "RefreshGuide"; } diff --git a/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs b/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs index c1394ee1c3..0916f19f79 100644 --- a/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs +++ b/MediaBrowser.Server.Implementations/Persistence/CleanDatabaseScheduledTask.cs @@ -18,6 +18,7 @@ using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Net; +using MediaBrowser.Model.Tasks; using MediaBrowser.Server.Implementations.ScheduledTasks; namespace MediaBrowser.Server.Implementations.Persistence @@ -337,12 +338,22 @@ namespace MediaBrowser.Server.Implementations.Persistence } } - public IEnumerable GetDefaultTriggers() + /// + /// Creates the triggers that define when the task will run + /// + /// IEnumerable{BaseTaskTrigger}. + public IEnumerable GetDefaultTriggers() { - return new ITaskTrigger[] - { - new IntervalTrigger{ Interval = TimeSpan.FromHours(24)} + return new[] { + + // Every so often + new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(24).Ticks} }; } + + public string Key + { + get { return "CleanDatabase"; } + } } } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Persistence/DataExtensions.cs b/MediaBrowser.Server.Implementations/Persistence/DataExtensions.cs index 028465354c..86ecbd24d9 100644 --- a/MediaBrowser.Server.Implementations/Persistence/DataExtensions.cs +++ b/MediaBrowser.Server.Implementations/Persistence/DataExtensions.cs @@ -5,6 +5,7 @@ using System; using System.Data; using System.IO; using MediaBrowser.Common.IO; +using MediaBrowser.Model.IO; namespace MediaBrowser.Server.Implementations.Persistence { diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs index 1726a77a6b..3d20cad36c 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs @@ -11,6 +11,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.IO; +using MediaBrowser.Model.IO; namespace MediaBrowser.Server.Implementations.Persistence { diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs index f33b18389a..c76cbf8aea 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs @@ -23,8 +23,10 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Collections; using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Extensions; using MediaBrowser.Controller.Playlists; using MediaBrowser.Model.Dto; +using MediaBrowser.Model.IO; using MediaBrowser.Model.LiveTv; using MediaBrowser.Server.Implementations.Devices; using MediaBrowser.Server.Implementations.Playlists; diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs index 31fa78806c..c3cf4acc44 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs @@ -10,6 +10,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.IO; +using MediaBrowser.Model.IO; namespace MediaBrowser.Server.Implementations.Persistence { diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs index 607a043a64..9ff1172f34 100644 --- a/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs +++ b/MediaBrowser.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs @@ -13,6 +13,7 @@ using System.Threading; using System.Threading.Tasks; using CommonIO; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.ScheduledTasks { @@ -62,20 +63,22 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks /// /// Creates the triggers that define when the task will run /// - /// IEnumerable{BaseTaskTrigger}. - public IEnumerable GetDefaultTriggers() + public IEnumerable GetDefaultTriggers() { - return new ITaskTrigger[] + return new[] { + + new TaskTriggerInfo { - new DailyTrigger - { - TimeOfDay = TimeSpan.FromHours(1), - TaskOptions = new TaskExecutionOptions - { - MaxRuntimeMs = Convert.ToInt32(TimeSpan.FromHours(4).TotalMilliseconds) - } - } - }; + Type = TaskTriggerInfo.TriggerDaily, + TimeOfDayTicks = TimeSpan.FromHours(1).Ticks, + MaxRuntimeMs = Convert.ToInt32(TimeSpan.FromHours(4).TotalMilliseconds) + } + }; + } + + public string Key + { + get { return "RefreshChapterImages"; } } /// diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/PeopleValidationTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/PeopleValidationTask.cs index 05c3db63c8..0315410cdd 100644 --- a/MediaBrowser.Server.Implementations/ScheduledTasks/PeopleValidationTask.cs +++ b/MediaBrowser.Server.Implementations/ScheduledTasks/PeopleValidationTask.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Controller; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.ScheduledTasks { @@ -33,16 +34,21 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks /// /// Creates the triggers that define when the task will run /// - /// IEnumerable{BaseTaskTrigger}. - public IEnumerable GetDefaultTriggers() + public IEnumerable GetDefaultTriggers() { // Randomize the default start hour because this operation can really hammer internet metadata providers var startHour = new Random(_appHost.SystemId.GetHashCode()).Next(0, 8); - return new ITaskTrigger[] - { - new DailyTrigger { TimeOfDay = TimeSpan.FromHours(startHour) }, - }; + return new[] { + + // Every so often + new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerDaily, TimeOfDayTicks = TimeSpan.FromHours(startHour).Ticks} + }; + } + + public string Key + { + get { return "RefreshPeople"; } } /// diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/PluginUpdateTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/PluginUpdateTask.cs index ff0960259c..a2d587087f 100644 --- a/MediaBrowser.Server.Implementations/ScheduledTasks/PluginUpdateTask.cs +++ b/MediaBrowser.Server.Implementations/ScheduledTasks/PluginUpdateTask.cs @@ -9,6 +9,7 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.ScheduledTasks { @@ -37,18 +38,23 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks /// Creates the triggers that define when the task will run /// /// IEnumerable{BaseTaskTrigger}. - public IEnumerable GetDefaultTriggers() + public IEnumerable GetDefaultTriggers() { - return new ITaskTrigger[] { + return new[] { // At startup - new StartupTrigger(), + new TaskTriggerInfo {Type = TaskTriggerInfo.TriggerStartup}, // Every so often - new IntervalTrigger { Interval = TimeSpan.FromHours(24)} + new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(24).Ticks} }; } + public string Key + { + get { return "PluginUpdates"; } + } + /// /// Update installed plugins /// diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshMediaLibraryTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshMediaLibraryTask.cs index 64ae249cd4..e8e557e76b 100644 --- a/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshMediaLibraryTask.cs +++ b/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshMediaLibraryTask.cs @@ -7,13 +7,14 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.ScheduledTasks { /// /// Class RefreshMediaLibraryTask /// - public class RefreshMediaLibraryTask : IScheduledTask, IHasKey + public class RefreshMediaLibraryTask : IScheduledTask { /// /// The _library manager @@ -32,18 +33,16 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks } /// - /// Gets the default triggers. + /// Creates the triggers that define when the task will run /// /// IEnumerable{BaseTaskTrigger}. - public IEnumerable GetDefaultTriggers() + public IEnumerable GetDefaultTriggers() { - var list = new ITaskTrigger[] { - - new IntervalTrigger{ Interval = TimeSpan.FromHours(12)} - - }.ToList(); - - return list; + return new[] { + + // Every so often + new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(12).Ticks} + }; } /// diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/SystemUpdateTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/SystemUpdateTask.cs index 0ba9d4f324..34a75c0c79 100644 --- a/MediaBrowser.Server.Implementations/ScheduledTasks/SystemUpdateTask.cs +++ b/MediaBrowser.Server.Implementations/ScheduledTasks/SystemUpdateTask.cs @@ -6,13 +6,14 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.ScheduledTasks { /// /// Plugin Update Task /// - public class SystemUpdateTask : IScheduledTask, IHasKey + public class SystemUpdateTask : IScheduledTask { /// /// The _app host @@ -47,16 +48,15 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks /// Creates the triggers that define when the task will run /// /// IEnumerable{BaseTaskTrigger}. - public IEnumerable GetDefaultTriggers() + public IEnumerable GetDefaultTriggers() { - // Until we can vary these default triggers per server and MBT, we need something that makes sense for both - return new ITaskTrigger[] { + return new[] { // At startup - new StartupTrigger(), + new TaskTriggerInfo {Type = TaskTriggerInfo.TriggerStartup}, // Every so often - new IntervalTrigger { Interval = TimeSpan.FromHours(24)} + new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(24).Ticks} }; } diff --git a/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs b/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs index 893592fa38..a9b6ad6a5f 100644 --- a/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs +++ b/MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs @@ -14,6 +14,7 @@ using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.IO; +using MediaBrowser.Model.IO; namespace MediaBrowser.Server.Implementations.ServerManager { diff --git a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs index 60b04cf82f..a1c23edf1d 100644 --- a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs +++ b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs @@ -10,6 +10,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.IO; +using MediaBrowser.Model.IO; using UniversalDetector; namespace MediaBrowser.Server.Implementations.ServerManager diff --git a/MediaBrowser.Server.Implementations/Sync/ServerSyncScheduledTask.cs b/MediaBrowser.Server.Implementations/Sync/ServerSyncScheduledTask.cs index 28813c715d..def156dfb6 100644 --- a/MediaBrowser.Server.Implementations/Sync/ServerSyncScheduledTask.cs +++ b/MediaBrowser.Server.Implementations/Sync/ServerSyncScheduledTask.cs @@ -9,10 +9,11 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using CommonIO; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.Sync { - class ServerSyncScheduledTask : IScheduledTask, IConfigurableScheduledTask, IHasKey + class ServerSyncScheduledTask : IScheduledTask, IConfigurableScheduledTask { private readonly ISyncManager _syncManager; private readonly ILogger _logger; @@ -58,14 +59,17 @@ namespace MediaBrowser.Server.Implementations.Sync get { return ((SyncManager)_syncManager).ServerSyncProviders; } } - public IEnumerable GetDefaultTriggers() + /// + /// Creates the triggers that define when the task will run + /// + public IEnumerable GetDefaultTriggers() { - return new ITaskTrigger[] - { - new IntervalTrigger { Interval = TimeSpan.FromHours(3) } - }; + return new[] { + + // Every so often + new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(3).Ticks} + }; } - public bool IsHidden { get { return !IsEnabled; } @@ -76,6 +80,11 @@ namespace MediaBrowser.Server.Implementations.Sync get { return ServerSyncProviders.Any(); } } + public bool IsLogged + { + get { return true; } + } + public string Key { get { return "ServerSync"; } diff --git a/MediaBrowser.Server.Implementations/Sync/SyncConvertScheduledTask.cs b/MediaBrowser.Server.Implementations/Sync/SyncConvertScheduledTask.cs index 3f9eb76918..8601e36109 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncConvertScheduledTask.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncConvertScheduledTask.cs @@ -10,10 +10,11 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using CommonIO; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.Sync { - public class SyncConvertScheduledTask : IScheduledTask, IConfigurableScheduledTask, IHasKey + public class SyncConvertScheduledTask : IScheduledTask { private readonly ILibraryManager _libraryManager; private readonly ISyncRepository _syncRepo; @@ -66,22 +67,17 @@ namespace MediaBrowser.Server.Implementations.Sync .Sync(progress, cancellationToken); } - public IEnumerable GetDefaultTriggers() + /// + /// Creates the triggers that define when the task will run + /// + /// IEnumerable{BaseTaskTrigger}. + public IEnumerable GetDefaultTriggers() { - return new ITaskTrigger[] - { - new IntervalTrigger { Interval = TimeSpan.FromHours(3) } - }; - } - - public bool IsHidden - { - get { return false; } - } - - public bool IsEnabled - { - get { return true; } + return new[] { + + // Every so often + new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(3).Ticks} + }; } public string Key diff --git a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs index ff5f1a64e0..c1eeec26b3 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs @@ -25,6 +25,7 @@ using System.Threading; using System.Threading.Tasks; using CommonIO; using MediaBrowser.Model.Extensions; +using MediaBrowser.Model.IO; namespace MediaBrowser.Server.Implementations.Sync { diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs index a40e3e258c..eaf129e637 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs @@ -30,6 +30,7 @@ using System.Threading; using System.Threading.Tasks; using CommonIO; using MediaBrowser.Common.IO; +using MediaBrowser.Model.IO; namespace MediaBrowser.Server.Implementations.Sync { diff --git a/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs b/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs index 32a6003719..5edc56722d 100644 --- a/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs +++ b/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs @@ -13,6 +13,7 @@ using System.Threading.Tasks; using CommonIO; using Interfaces.IO; using MediaBrowser.Common.IO; +using MediaBrowser.Model.IO; namespace MediaBrowser.Server.Implementations.Sync { diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 6a54bbf4f7..ce414a12f4 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -13,7 +13,6 @@ Copyright © Emby 2013 - -- cgit v1.2.3 From 0f8ccfaf496c3c761c06285574048f8866ef692c Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 23 Oct 2016 15:47:34 -0400 Subject: prep for portable common --- .../ScheduledTasks/ScheduledTaskService.cs | 1 - .../ScheduledTasksWebSocketListener.cs | 3 +- .../BaseApplicationHost.cs | 32 +++++---- MediaBrowser.Common/MediaBrowser.Common.csproj | 10 +-- .../ScheduledTasks/IScheduledTaskWorker.cs | 77 -------------------- MediaBrowser.Common/ScheduledTasks/ITaskManager.cs | 81 ---------------------- MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs | 36 ---------- .../ScheduledTasks/ScheduledTaskHelpers.cs | 53 -------------- .../ScheduledTasks/TaskCompletionEventArgs.cs | 12 ---- .../Entities/Audio/MusicArtist.cs | 1 + .../Entities/Audio/MusicGenre.cs | 1 + MediaBrowser.Controller/Entities/BaseItem.cs | 1 + MediaBrowser.Controller/Entities/GameGenre.cs | 1 + MediaBrowser.Controller/Entities/Genre.cs | 1 + MediaBrowser.Controller/Entities/Person.cs | 1 + MediaBrowser.Controller/Entities/Studio.cs | 1 + .../Extensions/BaseExtensions.cs | 25 ------- .../Extensions/StringExtensions.cs | 22 ++++++ .../MediaBrowser.Controller.csproj | 2 +- MediaBrowser.Model/Dlna/ConditionProcessor.cs | 6 +- MediaBrowser.Model/Dlna/StreamBuilder.cs | 2 +- MediaBrowser.Model/Drawing/ImageSize.cs | 6 +- MediaBrowser.Model/Extensions/BoolHelper.cs | 16 ----- MediaBrowser.Model/Extensions/DoubleHelper.cs | 21 ------ MediaBrowser.Model/Extensions/FloatHelper.cs | 18 ----- MediaBrowser.Model/MediaBrowser.Model.csproj | 8 ++- MediaBrowser.Model/Tasks/IScheduledTaskWorker.cs | 76 ++++++++++++++++++++ MediaBrowser.Model/Tasks/ITaskManager.cs | 80 +++++++++++++++++++++ MediaBrowser.Model/Tasks/ITaskTrigger.cs | 35 ++++++++++ MediaBrowser.Model/Tasks/ScheduledTaskHelpers.cs | 52 ++++++++++++++ .../Tasks/TaskCompletionEventArgs.cs | 11 +++ .../MediaInfo/SubtitleScheduledTask.cs | 1 - MediaBrowser.Providers/TV/SeriesPostScanTask.cs | 2 +- .../EntryPoints/ServerEventNotifier.cs | 1 + .../FileOrganization/FileOrganizationNotifier.cs | 1 + .../FileOrganization/FileOrganizationService.cs | 1 + .../IO/FileRefresher.cs | 1 + .../IO/LibraryMonitor.cs | 1 + .../Library/LibraryManager.cs | 1 + .../Library/SearchEngine.cs | 1 + .../LiveTv/LiveTvManager.cs | 1 + .../Persistence/SqliteItemRepository.cs | 1 + .../Sync/SyncManager.cs | 1 + .../Migrations/DbMigration.cs | 1 + 44 files changed, 332 insertions(+), 374 deletions(-) delete mode 100644 MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs delete mode 100644 MediaBrowser.Common/ScheduledTasks/ITaskManager.cs delete mode 100644 MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs delete mode 100644 MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs delete mode 100644 MediaBrowser.Common/ScheduledTasks/TaskCompletionEventArgs.cs delete mode 100644 MediaBrowser.Controller/Extensions/BaseExtensions.cs create mode 100644 MediaBrowser.Controller/Extensions/StringExtensions.cs delete mode 100644 MediaBrowser.Model/Extensions/BoolHelper.cs delete mode 100644 MediaBrowser.Model/Extensions/DoubleHelper.cs delete mode 100644 MediaBrowser.Model/Extensions/FloatHelper.cs create mode 100644 MediaBrowser.Model/Tasks/IScheduledTaskWorker.cs create mode 100644 MediaBrowser.Model/Tasks/ITaskManager.cs create mode 100644 MediaBrowser.Model/Tasks/ITaskTrigger.cs create mode 100644 MediaBrowser.Model/Tasks/ScheduledTaskHelpers.cs create mode 100644 MediaBrowser.Model/Tasks/TaskCompletionEventArgs.cs (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs b/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs index 287b87f776..29b3988ade 100644 --- a/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs +++ b/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs @@ -1,5 +1,4 @@ using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Tasks; using ServiceStack; diff --git a/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs b/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs index 5d3465c580..6e64345b9f 100644 --- a/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs +++ b/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.ScheduledTasks; -using MediaBrowser.Controller.Net; +using MediaBrowser.Controller.Net; using MediaBrowser.Model.Events; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Tasks; diff --git a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs index b1e6a04533..baf6d85af6 100644 --- a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs +++ b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs @@ -445,20 +445,28 @@ namespace MediaBrowser.Common.Implementations private IPlugin LoadPlugin(IPlugin plugin) { - var assemblyPlugin = plugin as IPluginAssembly; - - if (assemblyPlugin != null) + try { - var assembly = plugin.GetType().Assembly; - var assemblyName = assembly.GetName(); + var assemblyPlugin = plugin as IPluginAssembly; - var attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0]; - var assemblyId = new Guid(attribute.Value); + if (assemblyPlugin != null) + { + var assembly = plugin.GetType().Assembly; + var assemblyName = assembly.GetName(); - var assemblyFileName = assemblyName.Name + ".dll"; - var assemblyFilePath = Path.Combine(ApplicationPaths.PluginsPath, assemblyFileName); + var attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0]; + var assemblyId = new Guid(attribute.Value); - assemblyPlugin.SetAttributes(assemblyFilePath, assemblyFileName, assemblyName.Version, assemblyId); + var assemblyFileName = assemblyName.Name + ".dll"; + var assemblyFilePath = Path.Combine(ApplicationPaths.PluginsPath, assemblyFileName); + + assemblyPlugin.SetAttributes(assemblyFilePath, assemblyFileName, assemblyName.Version, assemblyId); + } + } + catch (Exception ex) + { + Logger.ErrorException("Error loading plugin {0}", ex, plugin.GetType().FullName); + return null; } return plugin; @@ -596,7 +604,7 @@ namespace MediaBrowser.Common.Implementations } catch (Exception ex) { - Logger.ErrorException("Error creating {0}", ex, type.Name); + Logger.ErrorException("Error creating {0}", ex, type.FullName); throw; } @@ -615,7 +623,7 @@ namespace MediaBrowser.Common.Implementations } catch (Exception ex) { - Logger.ErrorException("Error creating {0}", ex, type.Name); + Logger.ErrorException("Error creating {0}", ex, type.FullName); // Don't blow up in release mode return null; } diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj index 94ebf8dc94..931ac7227f 100644 --- a/MediaBrowser.Common/MediaBrowser.Common.csproj +++ b/MediaBrowser.Common/MediaBrowser.Common.csproj @@ -1,5 +1,5 @@  - + Debug @@ -13,7 +13,8 @@ ..\ 10.0.0 2.0 - v4.5 + v4.6 + true @@ -67,13 +68,8 @@ - - - - - diff --git a/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs b/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs deleted file mode 100644 index a3a28684dd..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs +++ /dev/null @@ -1,77 +0,0 @@ -using MediaBrowser.Model.Events; -using MediaBrowser.Model.Tasks; -using System; - -namespace MediaBrowser.Common.ScheduledTasks -{ - /// - /// Interface IScheduledTaskWorker - /// - public interface IScheduledTaskWorker : IDisposable - { - /// - /// Occurs when [task progress]. - /// - event EventHandler> TaskProgress; - - /// - /// Gets or sets the scheduled task. - /// - /// The scheduled task. - IScheduledTask ScheduledTask { get; } - - /// - /// Gets the last execution result. - /// - /// The last execution result. - TaskResult LastExecutionResult { get; } - - /// - /// Gets the name. - /// - /// The name. - string Name { get; } - - /// - /// Gets the description. - /// - /// The description. - string Description { get; } - - /// - /// Gets the category. - /// - /// The category. - string Category { get; } - - /// - /// Gets the state. - /// - /// The state. - TaskState State { get; } - - /// - /// Gets the current progress. - /// - /// The current progress. - double? CurrentProgress { get; } - - /// - /// Gets the triggers that define when the task will run - /// - /// The triggers. - /// value - TaskTriggerInfo[] Triggers { get; set; } - - /// - /// Gets the unique id. - /// - /// The unique id. - string Id { get; } - - /// - /// Reloads the trigger events. - /// - void ReloadTriggerEvents(); - } -} \ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs deleted file mode 100644 index e557a6b2c3..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs +++ /dev/null @@ -1,81 +0,0 @@ -using MediaBrowser.Model.Events; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using MediaBrowser.Model.Tasks; - -namespace MediaBrowser.Common.ScheduledTasks -{ - public interface ITaskManager : IDisposable - { - /// - /// Gets the list of Scheduled Tasks - /// - /// The scheduled tasks. - IScheduledTaskWorker[] ScheduledTasks { get; } - - /// - /// Cancels if running and queue. - /// - /// - /// Task options. - void CancelIfRunningAndQueue(TaskExecutionOptions options) - where T : IScheduledTask; - - /// - /// Cancels if running and queue. - /// - /// - void CancelIfRunningAndQueue() - where T : IScheduledTask; - - /// - /// Cancels if running. - /// - /// - void CancelIfRunning() - where T : IScheduledTask; - - /// - /// Queues the scheduled task. - /// - /// - /// Task options. - void QueueScheduledTask(TaskExecutionOptions options) - where T : IScheduledTask; - - /// - /// Queues the scheduled task. - /// - /// - void QueueScheduledTask() - where T : IScheduledTask; - - void QueueIfNotRunning() - where T : IScheduledTask; - - /// - /// Queues the scheduled task. - /// - /// The task. - /// The task run options. - void QueueScheduledTask(IScheduledTask task, TaskExecutionOptions options = null); - - /// - /// Adds the tasks. - /// - /// The tasks. - void AddTasks(IEnumerable tasks); - - void Cancel(IScheduledTaskWorker task); - Task Execute(IScheduledTaskWorker task, TaskExecutionOptions options = null); - - void Execute() - where T : IScheduledTask; - - event EventHandler> TaskExecuting; - event EventHandler TaskCompleted; - - bool SuspendTriggers { get; set; } - } -} \ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs b/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs deleted file mode 100644 index d6ca63ad7e..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs +++ /dev/null @@ -1,36 +0,0 @@ -using MediaBrowser.Model.Events; -using MediaBrowser.Model.Tasks; -using System; -using MediaBrowser.Model.Logging; - -namespace MediaBrowser.Common.ScheduledTasks -{ - /// - /// Interface ITaskTrigger - /// - public interface ITaskTrigger - { - /// - /// Fires when the trigger condition is satisfied and the task should run - /// - event EventHandler> Triggered; - - /// - /// Stars waiting for the trigger action - /// - void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup); - - /// - /// Stops waiting for the trigger action - /// - void Stop(); - - /// - /// Gets or sets the execution properties of this task. - /// - /// - /// The execution properties of this task. - /// - TaskExecutionOptions TaskOptions { get; set; } - } -} \ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs deleted file mode 100644 index fe45f16213..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs +++ /dev/null @@ -1,53 +0,0 @@ -using MediaBrowser.Model.Tasks; -using System; -using System.Linq; - -namespace MediaBrowser.Common.ScheduledTasks -{ - /// - /// Class ScheduledTaskHelpers - /// - public static class ScheduledTaskHelpers - { - /// - /// Gets the task info. - /// - /// The task. - /// TaskInfo. - public static TaskInfo GetTaskInfo(IScheduledTaskWorker task) - { - var isHidden = false; - - var configurableTask = task.ScheduledTask as IConfigurableScheduledTask; - - if (configurableTask != null) - { - isHidden = configurableTask.IsHidden; - } - - string key = task.ScheduledTask.Key; - - var triggers = task.Triggers - .OrderBy(i => i.Type) - .ThenBy(i => i.DayOfWeek ?? DayOfWeek.Sunday) - .ThenBy(i => i.TimeOfDayTicks ?? 0) - .ToList(); - - return new TaskInfo - { - Name = task.Name, - CurrentProgressPercentage = task.CurrentProgress, - State = task.State, - Id = task.Id, - LastExecutionResult = task.LastExecutionResult, - - Triggers = triggers, - - Description = task.Description, - Category = task.Category, - IsHidden = isHidden, - Key = key - }; - } - } -} diff --git a/MediaBrowser.Common/ScheduledTasks/TaskCompletionEventArgs.cs b/MediaBrowser.Common/ScheduledTasks/TaskCompletionEventArgs.cs deleted file mode 100644 index 2974806d02..0000000000 --- a/MediaBrowser.Common/ScheduledTasks/TaskCompletionEventArgs.cs +++ /dev/null @@ -1,12 +0,0 @@ -using MediaBrowser.Model.Tasks; -using System; - -namespace MediaBrowser.Common.ScheduledTasks -{ - public class TaskCompletionEventArgs : EventArgs - { - public IScheduledTaskWorker Task { get; set; } - - public TaskResult Result { get; set; } - } -} diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs index 07cf43c5bb..4fdd809e0d 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs @@ -11,6 +11,7 @@ using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Extensions; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities.Audio { diff --git a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs index a111166aca..cb17ea2659 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Runtime.Serialization; using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Extensions; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities.Audio { diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 9aad91a28c..4836aca8b4 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -26,6 +26,7 @@ using System.Threading.Tasks; using CommonIO; using MediaBrowser.Controller.Extensions; using MediaBrowser.Controller.Sorting; +using MediaBrowser.Model.Extensions; using MediaBrowser.Model.LiveTv; using MediaBrowser.Model.Providers; diff --git a/MediaBrowser.Controller/Entities/GameGenre.cs b/MediaBrowser.Controller/Entities/GameGenre.cs index 2987a9a077..545bef44c1 100644 --- a/MediaBrowser.Controller/Entities/GameGenre.cs +++ b/MediaBrowser.Controller/Entities/GameGenre.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Runtime.Serialization; using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Extensions; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/Genre.cs b/MediaBrowser.Controller/Entities/Genre.cs index cde9c6ce41..6fefdfa558 100644 --- a/MediaBrowser.Controller/Entities/Genre.cs +++ b/MediaBrowser.Controller/Entities/Genre.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Extensions; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/Person.cs b/MediaBrowser.Controller/Entities/Person.cs index d7acdb65ec..6f7a32a663 100644 --- a/MediaBrowser.Controller/Entities/Person.cs +++ b/MediaBrowser.Controller/Entities/Person.cs @@ -6,6 +6,7 @@ using System.Runtime.Serialization; using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Extensions; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs index 773250ad9e..114c141554 100644 --- a/MediaBrowser.Controller/Entities/Studio.cs +++ b/MediaBrowser.Controller/Entities/Studio.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Runtime.Serialization; using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Extensions; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Extensions/BaseExtensions.cs b/MediaBrowser.Controller/Extensions/BaseExtensions.cs deleted file mode 100644 index 84a9b1524e..0000000000 --- a/MediaBrowser.Controller/Extensions/BaseExtensions.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Globalization; -using System.Linq; -using System.Text; -using MediaBrowser.Model.Cryptography; - -namespace MediaBrowser.Controller.Extensions -{ - /// - /// Class BaseExtensions - /// - public static class BaseExtensions - { - public static ICryptographyProvider CryptographyProvider { get; set; } - - public static string RemoveDiacritics(this string text) - { - return String.Concat( - text.Normalize(NormalizationForm.FormD) - .Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch) != - UnicodeCategory.NonSpacingMark) - ).Normalize(NormalizationForm.FormC); - } - } -} diff --git a/MediaBrowser.Controller/Extensions/StringExtensions.cs b/MediaBrowser.Controller/Extensions/StringExtensions.cs new file mode 100644 index 0000000000..4f58d1bc52 --- /dev/null +++ b/MediaBrowser.Controller/Extensions/StringExtensions.cs @@ -0,0 +1,22 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Text; + +namespace MediaBrowser.Controller.Extensions +{ + /// + /// Class BaseExtensions + /// + public static class StringExtensions + { + public static string RemoveDiacritics(this string text) + { + return String.Concat( + text.Normalize(NormalizationForm.FormD) + .Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch) != + UnicodeCategory.NonSpacingMark) + ).Normalize(NormalizationForm.FormC); + } + } +} diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 46277a7839..670b08a3fa 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -165,7 +165,7 @@ - + diff --git a/MediaBrowser.Model/Dlna/ConditionProcessor.cs b/MediaBrowser.Model/Dlna/ConditionProcessor.cs index 6628e290e7..1fbb4ffa17 100644 --- a/MediaBrowser.Model/Dlna/ConditionProcessor.cs +++ b/MediaBrowser.Model/Dlna/ConditionProcessor.cs @@ -171,7 +171,7 @@ namespace MediaBrowser.Model.Dlna } bool expected; - if (BoolHelper.TryParseCultureInvariant(condition.Value, out expected)) + if (bool.TryParse(condition.Value, out expected)) { switch (condition.Condition) { @@ -196,7 +196,7 @@ namespace MediaBrowser.Model.Dlna } float expected; - if (FloatHelper.TryParseCultureInvariant(condition.Value, out expected)) + if (float.TryParse(condition.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out expected)) { switch (condition.Condition) { @@ -225,7 +225,7 @@ namespace MediaBrowser.Model.Dlna } double expected; - if (DoubleHelper.TryParseCultureInvariant(condition.Value, out expected)) + if (double.TryParse(condition.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out expected)) { switch (condition.Condition) { diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index a3e447d04a..06a883c069 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -1111,7 +1111,7 @@ namespace MediaBrowser.Model.Dlna case ProfileConditionValue.VideoFramerate: { float num; - if (FloatHelper.TryParseCultureInvariant(value, out num)) + if (float.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out num)) { item.MaxFramerate = num; } diff --git a/MediaBrowser.Model/Drawing/ImageSize.cs b/MediaBrowser.Model/Drawing/ImageSize.cs index 5ed6e72933..8cf09da185 100644 --- a/MediaBrowser.Model/Drawing/ImageSize.cs +++ b/MediaBrowser.Model/Drawing/ImageSize.cs @@ -1,4 +1,4 @@ -using MediaBrowser.Model.Extensions; +using System.Globalization; namespace MediaBrowser.Model.Drawing { @@ -71,12 +71,12 @@ namespace MediaBrowser.Model.Drawing { double val; - if (DoubleHelper.TryParseCultureInvariant(parts[0], out val)) + if (double.TryParse(parts[0], NumberStyles.Any, CultureInfo.InvariantCulture, out val)) { _width = val; } - if (DoubleHelper.TryParseCultureInvariant(parts[1], out val)) + if (double.TryParse(parts[1], NumberStyles.Any, CultureInfo.InvariantCulture, out val)) { _height = val; } diff --git a/MediaBrowser.Model/Extensions/BoolHelper.cs b/MediaBrowser.Model/Extensions/BoolHelper.cs deleted file mode 100644 index 5b61f864b0..0000000000 --- a/MediaBrowser.Model/Extensions/BoolHelper.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace MediaBrowser.Model.Extensions -{ - public static class BoolHelper - { - /// - /// Tries the parse culture invariant. - /// - /// The s. - /// The result. - /// true if XXXX, false otherwise. - public static bool TryParseCultureInvariant(string s, out bool result) - { - return bool.TryParse(s, out result); - } - } -} \ No newline at end of file diff --git a/MediaBrowser.Model/Extensions/DoubleHelper.cs b/MediaBrowser.Model/Extensions/DoubleHelper.cs deleted file mode 100644 index bcaf2d7800..0000000000 --- a/MediaBrowser.Model/Extensions/DoubleHelper.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Globalization; - -namespace MediaBrowser.Model.Extensions -{ - /// - /// Isolating these helpers allow this entire project to be easily converted to Java - /// - public static class DoubleHelper - { - /// - /// Tries the parse culture invariant. - /// - /// The s. - /// The result. - /// true if XXXX, false otherwise. - public static bool TryParseCultureInvariant(string s, out double result) - { - return double.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out result); - } - } -} diff --git a/MediaBrowser.Model/Extensions/FloatHelper.cs b/MediaBrowser.Model/Extensions/FloatHelper.cs deleted file mode 100644 index 171eccf931..0000000000 --- a/MediaBrowser.Model/Extensions/FloatHelper.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Globalization; - -namespace MediaBrowser.Model.Extensions -{ - public static class FloatHelper - { - /// - /// Tries the parse culture invariant. - /// - /// The s. - /// The result. - /// true if XXXX, false otherwise. - public static bool TryParseCultureInvariant(string s, out float result) - { - return float.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out result); - } - } -} \ No newline at end of file diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index e5aac6c061..c0ff5464e8 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -144,8 +144,6 @@ - - @@ -218,7 +216,6 @@ - @@ -389,6 +386,11 @@ + + + + + diff --git a/MediaBrowser.Model/Tasks/IScheduledTaskWorker.cs b/MediaBrowser.Model/Tasks/IScheduledTaskWorker.cs new file mode 100644 index 0000000000..415207f8f0 --- /dev/null +++ b/MediaBrowser.Model/Tasks/IScheduledTaskWorker.cs @@ -0,0 +1,76 @@ +using System; +using MediaBrowser.Model.Events; + +namespace MediaBrowser.Model.Tasks +{ + /// + /// Interface IScheduledTaskWorker + /// + public interface IScheduledTaskWorker : IDisposable + { + /// + /// Occurs when [task progress]. + /// + event EventHandler> TaskProgress; + + /// + /// Gets or sets the scheduled task. + /// + /// The scheduled task. + IScheduledTask ScheduledTask { get; } + + /// + /// Gets the last execution result. + /// + /// The last execution result. + TaskResult LastExecutionResult { get; } + + /// + /// Gets the name. + /// + /// The name. + string Name { get; } + + /// + /// Gets the description. + /// + /// The description. + string Description { get; } + + /// + /// Gets the category. + /// + /// The category. + string Category { get; } + + /// + /// Gets the state. + /// + /// The state. + TaskState State { get; } + + /// + /// Gets the current progress. + /// + /// The current progress. + double? CurrentProgress { get; } + + /// + /// Gets the triggers that define when the task will run + /// + /// The triggers. + /// value + TaskTriggerInfo[] Triggers { get; set; } + + /// + /// Gets the unique id. + /// + /// The unique id. + string Id { get; } + + /// + /// Reloads the trigger events. + /// + void ReloadTriggerEvents(); + } +} \ No newline at end of file diff --git a/MediaBrowser.Model/Tasks/ITaskManager.cs b/MediaBrowser.Model/Tasks/ITaskManager.cs new file mode 100644 index 0000000000..b6f847febb --- /dev/null +++ b/MediaBrowser.Model/Tasks/ITaskManager.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using MediaBrowser.Model.Events; + +namespace MediaBrowser.Model.Tasks +{ + public interface ITaskManager : IDisposable + { + /// + /// Gets the list of Scheduled Tasks + /// + /// The scheduled tasks. + IScheduledTaskWorker[] ScheduledTasks { get; } + + /// + /// Cancels if running and queue. + /// + /// + /// Task options. + void CancelIfRunningAndQueue(TaskExecutionOptions options) + where T : IScheduledTask; + + /// + /// Cancels if running and queue. + /// + /// + void CancelIfRunningAndQueue() + where T : IScheduledTask; + + /// + /// Cancels if running. + /// + /// + void CancelIfRunning() + where T : IScheduledTask; + + /// + /// Queues the scheduled task. + /// + /// + /// Task options. + void QueueScheduledTask(TaskExecutionOptions options) + where T : IScheduledTask; + + /// + /// Queues the scheduled task. + /// + /// + void QueueScheduledTask() + where T : IScheduledTask; + + void QueueIfNotRunning() + where T : IScheduledTask; + + /// + /// Queues the scheduled task. + /// + /// The task. + /// The task run options. + void QueueScheduledTask(IScheduledTask task, TaskExecutionOptions options = null); + + /// + /// Adds the tasks. + /// + /// The tasks. + void AddTasks(IEnumerable tasks); + + void Cancel(IScheduledTaskWorker task); + Task Execute(IScheduledTaskWorker task, TaskExecutionOptions options = null); + + void Execute() + where T : IScheduledTask; + + event EventHandler> TaskExecuting; + event EventHandler TaskCompleted; + + bool SuspendTriggers { get; set; } + } +} \ No newline at end of file diff --git a/MediaBrowser.Model/Tasks/ITaskTrigger.cs b/MediaBrowser.Model/Tasks/ITaskTrigger.cs new file mode 100644 index 0000000000..3beca569cc --- /dev/null +++ b/MediaBrowser.Model/Tasks/ITaskTrigger.cs @@ -0,0 +1,35 @@ +using System; +using MediaBrowser.Model.Events; +using MediaBrowser.Model.Logging; + +namespace MediaBrowser.Model.Tasks +{ + /// + /// Interface ITaskTrigger + /// + public interface ITaskTrigger + { + /// + /// Fires when the trigger condition is satisfied and the task should run + /// + event EventHandler> Triggered; + + /// + /// Stars waiting for the trigger action + /// + void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup); + + /// + /// Stops waiting for the trigger action + /// + void Stop(); + + /// + /// Gets or sets the execution properties of this task. + /// + /// + /// The execution properties of this task. + /// + TaskExecutionOptions TaskOptions { get; set; } + } +} \ No newline at end of file diff --git a/MediaBrowser.Model/Tasks/ScheduledTaskHelpers.cs b/MediaBrowser.Model/Tasks/ScheduledTaskHelpers.cs new file mode 100644 index 0000000000..66f5294e7c --- /dev/null +++ b/MediaBrowser.Model/Tasks/ScheduledTaskHelpers.cs @@ -0,0 +1,52 @@ +using System; +using System.Linq; + +namespace MediaBrowser.Model.Tasks +{ + /// + /// Class ScheduledTaskHelpers + /// + public static class ScheduledTaskHelpers + { + /// + /// Gets the task info. + /// + /// The task. + /// TaskInfo. + public static TaskInfo GetTaskInfo(IScheduledTaskWorker task) + { + var isHidden = false; + + var configurableTask = task.ScheduledTask as IConfigurableScheduledTask; + + if (configurableTask != null) + { + isHidden = configurableTask.IsHidden; + } + + string key = task.ScheduledTask.Key; + + var triggers = task.Triggers + .OrderBy(i => i.Type) + .ThenBy(i => i.DayOfWeek ?? DayOfWeek.Sunday) + .ThenBy(i => i.TimeOfDayTicks ?? 0) + .ToList(); + + return new TaskInfo + { + Name = task.Name, + CurrentProgressPercentage = task.CurrentProgress, + State = task.State, + Id = task.Id, + LastExecutionResult = task.LastExecutionResult, + + Triggers = triggers, + + Description = task.Description, + Category = task.Category, + IsHidden = isHidden, + Key = key + }; + } + } +} diff --git a/MediaBrowser.Model/Tasks/TaskCompletionEventArgs.cs b/MediaBrowser.Model/Tasks/TaskCompletionEventArgs.cs new file mode 100644 index 0000000000..be9eaa613d --- /dev/null +++ b/MediaBrowser.Model/Tasks/TaskCompletionEventArgs.cs @@ -0,0 +1,11 @@ +using System; + +namespace MediaBrowser.Model.Tasks +{ + public class TaskCompletionEventArgs : EventArgs + { + public IScheduledTaskWorker Task { get; set; } + + public TaskResult Result { get; set; } + } +} diff --git a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs index f05bf3ab81..eaaab22fdb 100644 --- a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs +++ b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs @@ -1,5 +1,4 @@ using MediaBrowser.Common.Configuration; -using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; diff --git a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs index e038a3d286..fdea1b205a 100644 --- a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs +++ b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs @@ -11,9 +11,9 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using CommonIO; -using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Plugins; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Providers.TV { diff --git a/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs index 3ea8417f86..9fafc561f2 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs @@ -13,6 +13,7 @@ using MediaBrowser.Model.Sync; using System; using System.Collections.Generic; using System.Threading; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.EntryPoints { diff --git a/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationNotifier.cs b/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationNotifier.cs index 5c3814f669..940730b3b2 100644 --- a/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationNotifier.cs +++ b/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationNotifier.cs @@ -7,6 +7,7 @@ using MediaBrowser.Model.FileOrganization; using MediaBrowser.Model.Logging; using System; using System.Threading; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.FileOrganization { diff --git a/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs b/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs index a42eba6cae..9aa49946d8 100644 --- a/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs +++ b/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs @@ -18,6 +18,7 @@ using CommonIO; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Events; using MediaBrowser.Common.Events; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.FileOrganization { diff --git a/MediaBrowser.Server.Implementations/IO/FileRefresher.cs b/MediaBrowser.Server.Implementations/IO/FileRefresher.cs index e689514c5b..1c9a057537 100644 --- a/MediaBrowser.Server.Implementations/IO/FileRefresher.cs +++ b/MediaBrowser.Server.Implementations/IO/FileRefresher.cs @@ -12,6 +12,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Extensions; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Tasks; using MediaBrowser.Server.Implementations.ScheduledTasks; namespace MediaBrowser.Server.Implementations.IO diff --git a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs index 76f0e6a1d9..36d9120389 100644 --- a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs +++ b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs @@ -14,6 +14,7 @@ using System.Linq; using System.Threading.Tasks; using CommonIO; using MediaBrowser.Controller; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.IO { diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 6ccfa13ec9..cf175f8617 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -43,6 +43,7 @@ using MediaBrowser.Server.Implementations.Library.Resolvers; using SortOrder = MediaBrowser.Model.Entities.SortOrder; using VideoResolver = MediaBrowser.Naming.Video.VideoResolver; using MediaBrowser.Common.Configuration; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.Library { diff --git a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs index 3dff16e24a..c266fb191b 100644 --- a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs +++ b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using MediaBrowser.Controller.Extensions; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Server.Implementations.Library { diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs index 7c75abeec4..3f8eb90250 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs @@ -35,6 +35,7 @@ using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Model.Events; using MediaBrowser.Model.Extensions; +using MediaBrowser.Model.Tasks; using MediaBrowser.Server.Implementations.LiveTv.Listings; namespace MediaBrowser.Server.Implementations.LiveTv diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs index c76cbf8aea..e6512f4dfd 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs @@ -26,6 +26,7 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Extensions; using MediaBrowser.Controller.Playlists; using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Extensions; using MediaBrowser.Model.IO; using MediaBrowser.Model.LiveTv; using MediaBrowser.Server.Implementations.Devices; diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs index eaf129e637..6bdb1692ec 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs @@ -31,6 +31,7 @@ using System.Threading.Tasks; using CommonIO; using MediaBrowser.Common.IO; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Tasks; namespace MediaBrowser.Server.Implementations.Sync { diff --git a/MediaBrowser.Server.Startup.Common/Migrations/DbMigration.cs b/MediaBrowser.Server.Startup.Common/Migrations/DbMigration.cs index 6bcdcca879..5705b3a59a 100644 --- a/MediaBrowser.Server.Startup.Common/Migrations/DbMigration.cs +++ b/MediaBrowser.Server.Startup.Common/Migrations/DbMigration.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.Configuration; +using MediaBrowser.Model.Tasks; using MediaBrowser.Server.Implementations.Persistence; namespace MediaBrowser.Server.Startup.Common.Migrations -- cgit v1.2.3 From 60bece614aeb05558741b81a624f37ce2921c027 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 23 Oct 2016 16:04:31 -0400 Subject: Don't use library monitor for internal folders --- MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs index 36d9120389..69d37591c4 100644 --- a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs +++ b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs @@ -175,6 +175,11 @@ namespace MediaBrowser.Server.Implementations.IO private bool IsLibraryMonitorEnabaled(BaseItem item) { + if (item is BasePluginFolder) + { + return false; + } + var options = LibraryManager.GetLibraryOptions(item); if (options != null) -- cgit v1.2.3