diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
index 8d727a1128..090966d2b6 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
@@ -311,7 +311,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
trigger.Triggered -= trigger_Triggered;
trigger.Triggered += trigger_Triggered;
- trigger.Start(LastExecutionResult, isApplicationStartup);
+ trigger.Start(LastExecutionResult, Logger, Name, isApplicationStartup);
}
}
@@ -339,7 +339,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
await Task.Delay(1000).ConfigureAwait(false);
- trigger.Start(LastExecutionResult, false);
+ trigger.Start(LastExecutionResult, Logger, Name, false);
}
private Task _currentTask;
diff --git a/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs b/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs
index 382a412552..3d33e958de 100644
--- a/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs
@@ -1,7 +1,9 @@
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Tasks;
using System;
+using System.Globalization;
using System.Threading;
+using MediaBrowser.Model.Logging;
namespace MediaBrowser.Common.ScheduledTasks
{
@@ -35,7 +37,7 @@ namespace MediaBrowser.Common.ScheduledTasks
///
/// The last result.
/// if set to true [is application startup].
- public void Start(TaskResult lastResult, bool isApplicationStartup)
+ public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup)
{
DisposeTimer();
@@ -44,7 +46,11 @@ namespace MediaBrowser.Common.ScheduledTasks
var triggerDate = now.TimeOfDay > TimeOfDay ? now.Date.AddDays(1) : now.Date;
triggerDate = triggerDate.Add(TimeOfDay);
- Timer = new Timer(state => OnTriggered(), null, triggerDate - now, TimeSpan.FromMilliseconds(-1));
+ 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));
}
///
diff --git a/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs b/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs
index 8c87f8f380..ef1ea9d387 100644
--- a/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Tasks;
using System;
+using MediaBrowser.Model.Logging;
namespace MediaBrowser.Common.ScheduledTasks
{
@@ -19,7 +20,7 @@ namespace MediaBrowser.Common.ScheduledTasks
///
/// The last result.
/// if set to true [is application startup].
- void Start(TaskResult lastResult, bool isApplicationStartup);
+ void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup);
///
/// Stops waiting for the trigger action
diff --git a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs b/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs
index e07dfcceb4..5107db6c4d 100644
--- a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Model.Tasks;
using System;
using System.Linq;
using System.Threading;
+using MediaBrowser.Model.Logging;
namespace MediaBrowser.Common.ScheduledTasks
{
@@ -38,7 +39,7 @@ namespace MediaBrowser.Common.ScheduledTasks
///
/// The last result.
/// if set to true [is application startup].
- public void Start(TaskResult lastResult, bool isApplicationStartup)
+ public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup)
{
DisposeTimer();
diff --git a/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs b/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs
index 1d82dc76a5..41f58a7ad5 100644
--- a/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs
@@ -2,6 +2,7 @@
using MediaBrowser.Model.Tasks;
using System;
using System.Threading.Tasks;
+using MediaBrowser.Model.Logging;
namespace MediaBrowser.Common.ScheduledTasks
{
@@ -30,7 +31,7 @@ namespace MediaBrowser.Common.ScheduledTasks
///
/// The last result.
/// if set to true [is application startup].
- public async void Start(TaskResult lastResult, bool isApplicationStartup)
+ public async void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup)
{
if (isApplicationStartup)
{
diff --git a/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs b/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs
index eaf4afc758..9972dc8044 100644
--- a/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Model.Tasks;
using Microsoft.Win32;
using System;
using System.Threading.Tasks;
+using MediaBrowser.Model.Logging;
namespace MediaBrowser.Common.ScheduledTasks
{
@@ -30,7 +31,7 @@ namespace MediaBrowser.Common.ScheduledTasks
///
/// The last result.
/// if set to true [is application startup].
- public void Start(TaskResult lastResult, bool isApplicationStartup)
+ public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup)
{
switch (SystemEvent)
{
diff --git a/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs b/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs
index 2e38264b24..318802e07d 100644
--- a/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs
@@ -1,6 +1,7 @@
using System;
using System.Threading;
using MediaBrowser.Model.Events;
+using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Tasks;
namespace MediaBrowser.Common.ScheduledTasks
@@ -41,7 +42,7 @@ namespace MediaBrowser.Common.ScheduledTasks
///
/// The last result.
/// if set to true [is application startup].
- public void Start(TaskResult lastResult, bool isApplicationStartup)
+ public void Start(TaskResult lastResult, ILogger logger, string taskName, bool isApplicationStartup)
{
DisposeTimer();
diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs
index 54b11a9042..82ab99980d 100644
--- a/MediaBrowser.Controller/Entities/TV/Series.cs
+++ b/MediaBrowser.Controller/Entities/TV/Series.cs
@@ -104,7 +104,14 @@ namespace MediaBrowser.Controller.Entities.TV
[IgnoreDataMember]
public override string PresentationUniqueKey
{
- get { return GetUserDataKeys().First(); }
+ get
+ {
+ if (EnablePooling())
+ {
+ return GetUserDataKeys().First();
+ }
+ return base.PresentationUniqueKey;
+ }
}
///
diff --git a/MediaBrowser.Controller/Health/IHealthMonitor.cs b/MediaBrowser.Controller/Health/IHealthMonitor.cs
new file mode 100644
index 0000000000..b8ad98fc14
--- /dev/null
+++ b/MediaBrowser.Controller/Health/IHealthMonitor.cs
@@ -0,0 +1,12 @@
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using MediaBrowser.Model.Notifications;
+
+namespace MediaBrowser.Controller.Health
+{
+ public interface IHealthMonitor
+ {
+ Task> GetNotifications(CancellationToken cancellationToken);
+ }
+}
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index 6ff4e39e2d..bc28ec0155 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -180,6 +180,7 @@
+
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index 0c342986f9..1407cdce30 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -933,21 +933,10 @@ namespace MediaBrowser.Server.Implementations.Library
Path.Combine(path, validFilename) :
Path.Combine(path, subFolderPrefix, validFilename);
- var id = GetNewItemId(fullPath, type);
-
- BaseItem obj;
-
- if (!_libraryItemsCache.TryGetValue(id, out obj))
- {
- obj = CreateItemByName(fullPath, name, id);
-
- RegisterItem(id, obj);
- }
-
- return obj as T;
+ return CreateItemByName(fullPath, name);
}
- private T CreateItemByName(string path, string name, Guid id)
+ private T CreateItemByName(string path, string name)
where T : BaseItem, new()
{
var isArtist = typeof(T) == typeof(MusicArtist);
@@ -970,6 +959,8 @@ namespace MediaBrowser.Server.Implementations.Library
}
}
+ var id = GetNewItemId(path, typeof(T));
+
var item = GetItemById(id) as T;
if (item == null)
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
index 9ea2af784d..308ca90e0a 100644
--- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
@@ -1,4 +1,3 @@
-using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.Movies;
@@ -85,15 +84,11 @@ namespace MediaBrowser.Server.Implementations.Persistence
private IDbCommand _updateInheritedRatingCommand;
private IDbCommand _updateInheritedTagsCommand;
- public const int LatestSchemaVersion = 77;
+ public const int LatestSchemaVersion = 78;
///
/// Initializes a new instance of the class.
///
- /// appPaths
- /// or
- /// jsonSerializer
- ///
public SqliteItemRepository(IServerConfigurationManager config, IJsonSerializer jsonSerializer, ILogManager logManager)
: base(logManager)
{
@@ -356,7 +351,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
"OriginalTitle",
"PrimaryVersionId",
"DateLastMediaAdded",
- "Album"
+ "Album",
+ "CriticRating",
+ "CriticRatingSummary"
};
private readonly string[] _mediaStreamSaveColumns =
@@ -1247,6 +1244,16 @@ namespace MediaBrowser.Server.Implementations.Persistence
item.Album = reader.GetString(55);
}
+ if (!reader.IsDBNull(56))
+ {
+ item.CriticRating = reader.GetFloat(56);
+ }
+
+ if (!reader.IsDBNull(57))
+ {
+ item.CriticRatingSummary = reader.GetString(57);
+ }
+
return item;
}
@@ -2306,12 +2313,13 @@ namespace MediaBrowser.Server.Implementations.Persistence
if (_config.Configuration.SchemaVersion >= 66)
{
whereClauses.Add("CleanName=@Name");
+ cmd.Parameters.Add(cmd, "@Name", DbType.String).Value = query.Name.RemoveDiacritics();
}
else
{
whereClauses.Add("Name=@Name");
+ cmd.Parameters.Add(cmd, "@Name", DbType.String).Value = query.Name;
}
- cmd.Parameters.Add(cmd, "@Name", DbType.String).Value = query.Name;
}
if (!string.IsNullOrWhiteSpace(query.NameContains))
@@ -2324,7 +2332,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
{
whereClauses.Add("Name like @NameContains");
}
- cmd.Parameters.Add(cmd, "@NameContains", DbType.String).Value = "%" + query.NameContains + "%";
+ cmd.Parameters.Add(cmd, "@NameContains", DbType.String).Value = "%" + query.NameContains.RemoveDiacritics() + "%";
}
if (!string.IsNullOrWhiteSpace(query.NameStartsWith))
{
diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs
index 3769787901..1569c1fc5a 100644
--- a/MediaBrowser.WebDashboard/Api/DashboardService.cs
+++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs
@@ -316,7 +316,7 @@ namespace MediaBrowser.WebDashboard.Api
DeleteFilesByExtension(bowerPath, ".txt");
DeleteFilesByExtension(bowerPath, ".map");
DeleteFilesByExtension(bowerPath, ".md");
- DeleteFilesByExtension(bowerPath, ".json");
+ DeleteFilesByExtension(bowerPath, ".json", "strings\\");
DeleteFilesByExtension(bowerPath, ".gz");
DeleteFilesByExtension(bowerPath, ".bat");
DeleteFilesByExtension(bowerPath, ".sh");
@@ -401,7 +401,7 @@ namespace MediaBrowser.WebDashboard.Api
}
}
- private void DeleteFilesByExtension(string path, string extension)
+ private void DeleteFilesByExtension(string path, string extension, string exclude = null)
{
var files = _fileSystem.GetFiles(path, true)
.Where(i => string.Equals(i.Extension, extension, StringComparison.OrdinalIgnoreCase))
@@ -409,6 +409,13 @@ namespace MediaBrowser.WebDashboard.Api
foreach (var file in files)
{
+ if (!string.IsNullOrWhiteSpace(exclude))
+ {
+ if (file.FullName.IndexOf(exclude, StringComparison.OrdinalIgnoreCase) != -1)
+ {
+ continue;
+ }
+ }
_fileSystem.DeleteFile(file.FullName);
}
}
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index 29c73d0ded..e6d690f272 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -140,12 +140,6 @@
PreserveNewest
-
- PreserveNewest
-
-
- PreserveNewest
-
PreserveNewest
@@ -467,9 +461,6 @@
PreserveNewest
-
- PreserveNewest
-
PreserveNewest
@@ -1710,9 +1701,6 @@
PreserveNewest
-
- PreserveNewest
-
PreserveNewest