|
|
|
@ -1,7 +1,5 @@
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Globalization;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using Jellyfin.Data.Entities;
|
|
|
|
|
using MediaBrowser.Common.Plugins;
|
|
|
|
@ -15,7 +13,6 @@ using MediaBrowser.Model.Activity;
|
|
|
|
|
using MediaBrowser.Model.Events;
|
|
|
|
|
using MediaBrowser.Model.Globalization;
|
|
|
|
|
using MediaBrowser.Model.Notifications;
|
|
|
|
|
using MediaBrowser.Model.Tasks;
|
|
|
|
|
using MediaBrowser.Model.Updates;
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
|
|
|
|
@ -28,7 +25,6 @@ namespace Emby.Server.Implementations.Activity
|
|
|
|
|
{
|
|
|
|
|
private readonly IInstallationManager _installationManager;
|
|
|
|
|
private readonly ISessionManager _sessionManager;
|
|
|
|
|
private readonly ITaskManager _taskManager;
|
|
|
|
|
private readonly IActivityManager _activityManager;
|
|
|
|
|
private readonly ILocalizationManager _localization;
|
|
|
|
|
private readonly ISubtitleManager _subManager;
|
|
|
|
@ -38,7 +34,6 @@ namespace Emby.Server.Implementations.Activity
|
|
|
|
|
/// Initializes a new instance of the <see cref="ActivityLogEntryPoint"/> class.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sessionManager">The session manager.</param>
|
|
|
|
|
/// <param name="taskManager">The task manager.</param>
|
|
|
|
|
/// <param name="activityManager">The activity manager.</param>
|
|
|
|
|
/// <param name="localization">The localization manager.</param>
|
|
|
|
|
/// <param name="installationManager">The installation manager.</param>
|
|
|
|
@ -46,7 +41,6 @@ namespace Emby.Server.Implementations.Activity
|
|
|
|
|
/// <param name="userManager">The user manager.</param>
|
|
|
|
|
public ActivityLogEntryPoint(
|
|
|
|
|
ISessionManager sessionManager,
|
|
|
|
|
ITaskManager taskManager,
|
|
|
|
|
IActivityManager activityManager,
|
|
|
|
|
ILocalizationManager localization,
|
|
|
|
|
IInstallationManager installationManager,
|
|
|
|
@ -54,7 +48,6 @@ namespace Emby.Server.Implementations.Activity
|
|
|
|
|
IUserManager userManager)
|
|
|
|
|
{
|
|
|
|
|
_sessionManager = sessionManager;
|
|
|
|
|
_taskManager = taskManager;
|
|
|
|
|
_activityManager = activityManager;
|
|
|
|
|
_localization = localization;
|
|
|
|
|
_installationManager = installationManager;
|
|
|
|
@ -65,8 +58,6 @@ namespace Emby.Server.Implementations.Activity
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public Task RunAsync()
|
|
|
|
|
{
|
|
|
|
|
_taskManager.TaskCompleted += OnTaskCompleted;
|
|
|
|
|
|
|
|
|
|
_installationManager.PluginInstalled += OnPluginInstalled;
|
|
|
|
|
_installationManager.PluginUninstalled += OnPluginUninstalled;
|
|
|
|
|
_installationManager.PluginUpdated += OnPluginUpdated;
|
|
|
|
@ -307,57 +298,12 @@ namespace Emby.Server.Implementations.Activity
|
|
|
|
|
}).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async void OnTaskCompleted(object sender, TaskCompletionEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var result = e.Result;
|
|
|
|
|
var task = e.Task;
|
|
|
|
|
|
|
|
|
|
if (task.ScheduledTask is IConfigurableScheduledTask activityTask
|
|
|
|
|
&& !activityTask.IsLogged)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var time = result.EndTimeUtc - result.StartTimeUtc;
|
|
|
|
|
var runningTime = string.Format(
|
|
|
|
|
CultureInfo.InvariantCulture,
|
|
|
|
|
_localization.GetLocalizedString("LabelRunningTimeValue"),
|
|
|
|
|
ToUserFriendlyString(time));
|
|
|
|
|
|
|
|
|
|
if (result.Status == TaskCompletionStatus.Failed)
|
|
|
|
|
{
|
|
|
|
|
var vals = new List<string>();
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(e.Result.ErrorMessage))
|
|
|
|
|
{
|
|
|
|
|
vals.Add(e.Result.ErrorMessage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(e.Result.LongErrorMessage))
|
|
|
|
|
{
|
|
|
|
|
vals.Add(e.Result.LongErrorMessage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await CreateLogEntry(new ActivityLog(
|
|
|
|
|
string.Format(CultureInfo.InvariantCulture, _localization.GetLocalizedString("ScheduledTaskFailedWithName"), task.Name),
|
|
|
|
|
NotificationType.TaskFailed.ToString(),
|
|
|
|
|
Guid.Empty)
|
|
|
|
|
{
|
|
|
|
|
LogSeverity = LogLevel.Error,
|
|
|
|
|
Overview = string.Join(Environment.NewLine, vals),
|
|
|
|
|
ShortOverview = runningTime
|
|
|
|
|
}).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task CreateLogEntry(ActivityLog entry)
|
|
|
|
|
=> await _activityManager.CreateAsync(entry).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public void Dispose()
|
|
|
|
|
{
|
|
|
|
|
_taskManager.TaskCompleted -= OnTaskCompleted;
|
|
|
|
|
|
|
|
|
|
_installationManager.PluginInstalled -= OnPluginInstalled;
|
|
|
|
|
_installationManager.PluginUninstalled -= OnPluginUninstalled;
|
|
|
|
|
_installationManager.PluginUpdated -= OnPluginUpdated;
|
|
|
|
@ -375,87 +321,5 @@ namespace Emby.Server.Implementations.Activity
|
|
|
|
|
_userManager.OnUserDeleted -= OnUserDeleted;
|
|
|
|
|
_userManager.OnUserLockedOut -= OnUserLockedOut;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Constructs a user-friendly string for this TimeSpan instance.
|
|
|
|
|
/// </summary>
|
|
|
|
|
private static string ToUserFriendlyString(TimeSpan span)
|
|
|
|
|
{
|
|
|
|
|
const int DaysInYear = 365;
|
|
|
|
|
const int DaysInMonth = 30;
|
|
|
|
|
|
|
|
|
|
// Get each non-zero value from TimeSpan component
|
|
|
|
|
var values = new List<string>();
|
|
|
|
|
|
|
|
|
|
// Number of years
|
|
|
|
|
int days = span.Days;
|
|
|
|
|
if (days >= DaysInYear)
|
|
|
|
|
{
|
|
|
|
|
int years = days / DaysInYear;
|
|
|
|
|
values.Add(CreateValueString(years, "year"));
|
|
|
|
|
days %= DaysInYear;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Number of months
|
|
|
|
|
if (days >= DaysInMonth)
|
|
|
|
|
{
|
|
|
|
|
int months = days / DaysInMonth;
|
|
|
|
|
values.Add(CreateValueString(months, "month"));
|
|
|
|
|
days = days % DaysInMonth;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Number of days
|
|
|
|
|
if (days >= 1)
|
|
|
|
|
{
|
|
|
|
|
values.Add(CreateValueString(days, "day"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Number of hours
|
|
|
|
|
if (span.Hours >= 1)
|
|
|
|
|
{
|
|
|
|
|
values.Add(CreateValueString(span.Hours, "hour"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Number of minutes
|
|
|
|
|
if (span.Minutes >= 1)
|
|
|
|
|
{
|
|
|
|
|
values.Add(CreateValueString(span.Minutes, "minute"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Number of seconds (include when 0 if no other components included)
|
|
|
|
|
if (span.Seconds >= 1 || values.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
values.Add(CreateValueString(span.Seconds, "second"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Combine values into string
|
|
|
|
|
var builder = new StringBuilder();
|
|
|
|
|
for (int i = 0; i < values.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
if (builder.Length > 0)
|
|
|
|
|
{
|
|
|
|
|
builder.Append(i == values.Count - 1 ? " and " : ", ");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
builder.Append(values[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Return result
|
|
|
|
|
return builder.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Constructs a string description of a time-span value.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="value">The value of this item.</param>
|
|
|
|
|
/// <param name="description">The name of this item (singular form).</param>
|
|
|
|
|
private static string CreateValueString(int value, string description)
|
|
|
|
|
{
|
|
|
|
|
return string.Format(
|
|
|
|
|
CultureInfo.InvariantCulture,
|
|
|
|
|
"{0:#,##0} {1}",
|
|
|
|
|
value,
|
|
|
|
|
value == 1 ? description : string.Format(CultureInfo.InvariantCulture, "{0}s", description));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|