Merge pull request #774 from dkanada/plugin
reimplement support for plugin repository
This commit is contained in:
commit
a50fb922c5
|
@ -15,6 +15,7 @@
|
||||||
- [cvium](https://github.com/cvium)
|
- [cvium](https://github.com/cvium)
|
||||||
- [wtayl0r](https://github.com/wtayl0r)
|
- [wtayl0r](https://github.com/wtayl0r)
|
||||||
- [TtheCreator](https://github.com/Tthecreator)
|
- [TtheCreator](https://github.com/Tthecreator)
|
||||||
|
- [dkanada](https://github.com/dkanada)
|
||||||
- [LogicalPhallacy](https://github.com/LogicalPhallacy/)
|
- [LogicalPhallacy](https://github.com/LogicalPhallacy/)
|
||||||
- [RazeLighter777](https://github.com/RazeLighter777)
|
- [RazeLighter777](https://github.com/RazeLighter777)
|
||||||
|
|
||||||
|
|
|
@ -68,8 +68,6 @@ namespace Emby.Server.Implementations.ScheduledTasks
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Key => "RefreshChapterImages";
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns the task to be executed
|
/// Returns the task to be executed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -161,22 +159,18 @@ namespace Emby.Server.Implementations.ScheduledTasks
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the name of the task
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The name.</value>
|
|
||||||
public string Name => "Chapter image extraction";
|
public string Name => "Chapter image extraction";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the description.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The description.</value>
|
|
||||||
public string Description => "Creates thumbnails for videos that have chapters.";
|
public string Description => "Creates thumbnails for videos that have chapters.";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the category.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The category.</value>
|
|
||||||
public string Category => "Library";
|
public string Category => "Library";
|
||||||
|
|
||||||
|
public string Key => "RefreshChapterImages";
|
||||||
|
|
||||||
|
public bool IsHidden => false;
|
||||||
|
|
||||||
|
public bool IsEnabled => true;
|
||||||
|
|
||||||
|
public bool IsLogged => true;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -158,31 +158,15 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the name of the task
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The name.</value>
|
|
||||||
public string Name => "Cache file cleanup";
|
public string Name => "Cache file cleanup";
|
||||||
|
|
||||||
|
public string Description => "Deletes cache files no longer needed by the system";
|
||||||
|
|
||||||
|
public string Category => "Maintenance";
|
||||||
|
|
||||||
public string Key => "DeleteCacheFiles";
|
public string Key => "DeleteCacheFiles";
|
||||||
|
|
||||||
/// <summary>
|
public bool IsHidden => false;
|
||||||
/// Gets the description.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The description.</value>
|
|
||||||
public string Description => "Deletes cache files no longer needed by the system";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the category.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The category.</value>
|
|
||||||
public string Category => "Maintenance";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets a value indicating whether this instance is hidden.
|
|
||||||
/// </summary>
|
|
||||||
/// <value><c>true</c> if this instance is hidden; otherwise, <c>false</c>.</value>
|
|
||||||
public bool IsHidden => true;
|
|
||||||
|
|
||||||
public bool IsEnabled => true;
|
public bool IsEnabled => true;
|
||||||
|
|
||||||
|
|
|
@ -81,31 +81,15 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Key => "CleanLogFiles";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the name of the task
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The name.</value>
|
|
||||||
public string Name => "Log file cleanup";
|
public string Name => "Log file cleanup";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the description.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The description.</value>
|
|
||||||
public string Description => string.Format("Deletes log files that are more than {0} days old.", ConfigurationManager.CommonConfiguration.LogFileRetentionDays);
|
public string Description => string.Format("Deletes log files that are more than {0} days old.", ConfigurationManager.CommonConfiguration.LogFileRetentionDays);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the category.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The category.</value>
|
|
||||||
public string Category => "Maintenance";
|
public string Category => "Maintenance";
|
||||||
|
|
||||||
/// <summary>
|
public string Key => "CleanLogFiles";
|
||||||
/// Gets a value indicating whether this instance is hidden.
|
|
||||||
/// </summary>
|
public bool IsHidden => false;
|
||||||
/// <value><c>true</c> if this instance is hidden; otherwise, <c>false</c>.</value>
|
|
||||||
public bool IsHidden => true;
|
|
||||||
|
|
||||||
public bool IsEnabled => true;
|
public bool IsEnabled => true;
|
||||||
|
|
||||||
|
|
|
@ -47,8 +47,6 @@ namespace Emby.Server.Implementations.ScheduledTasks
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Key => "RefreshPeople";
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns the task to be executed
|
/// Returns the task to be executed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -60,22 +58,18 @@ namespace Emby.Server.Implementations.ScheduledTasks
|
||||||
return _libraryManager.ValidatePeople(cancellationToken, progress);
|
return _libraryManager.ValidatePeople(cancellationToken, progress);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the name of the task
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The name.</value>
|
|
||||||
public string Name => "Refresh people";
|
public string Name => "Refresh people";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the description.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The description.</value>
|
|
||||||
public string Description => "Updates metadata for actors and directors in your media library.";
|
public string Description => "Updates metadata for actors and directors in your media library.";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the category.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The category.</value>
|
|
||||||
public string Category => "Library";
|
public string Category => "Library";
|
||||||
|
|
||||||
|
public string Key => "RefreshPeople";
|
||||||
|
|
||||||
|
public bool IsHidden => false;
|
||||||
|
|
||||||
|
public bool IsEnabled => true;
|
||||||
|
|
||||||
|
public bool IsLogged => true;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,119 @@
|
||||||
|
using MediaBrowser.Common;
|
||||||
|
using MediaBrowser.Common.Updates;
|
||||||
|
using MediaBrowser.Model.Net;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Common.Progress;
|
||||||
|
using MediaBrowser.Model.Tasks;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
namespace Emby.Server.Implementations.ScheduledTasks
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Plugin Update Task
|
||||||
|
/// </summary>
|
||||||
|
public class PluginUpdateTask : IScheduledTask, IConfigurableScheduledTask
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The _logger
|
||||||
|
/// </summary>
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
|
private readonly IInstallationManager _installationManager;
|
||||||
|
|
||||||
|
private readonly IApplicationHost _appHost;
|
||||||
|
|
||||||
|
public PluginUpdateTask(ILogger logger, IInstallationManager installationManager, IApplicationHost appHost)
|
||||||
|
{
|
||||||
|
_logger = logger;
|
||||||
|
_installationManager = installationManager;
|
||||||
|
_appHost = appHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the triggers that define when the task will run
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
|
||||||
|
public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
|
||||||
|
{
|
||||||
|
return new[] {
|
||||||
|
|
||||||
|
// At startup
|
||||||
|
new TaskTriggerInfo {Type = TaskTriggerInfo.TriggerStartup},
|
||||||
|
|
||||||
|
// Every so often
|
||||||
|
new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(24).Ticks}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Update installed plugins
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
|
/// <param name="progress">The progress.</param>
|
||||||
|
/// <returns>Task.</returns>
|
||||||
|
public async Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
|
||||||
|
{
|
||||||
|
progress.Report(0);
|
||||||
|
|
||||||
|
var packagesToInstall = (await _installationManager.GetAvailablePluginUpdates(typeof(PluginUpdateTask).Assembly.GetName().Version, true, cancellationToken).ConfigureAwait(false)).ToList();
|
||||||
|
|
||||||
|
progress.Report(10);
|
||||||
|
|
||||||
|
var numComplete = 0;
|
||||||
|
|
||||||
|
foreach (var package in packagesToInstall)
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await _installationManager.InstallPackage(package, true, new SimpleProgress<double>(), cancellationToken).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException)
|
||||||
|
{
|
||||||
|
// InstallPackage has it's own inner cancellation token, so only throw this if it's ours
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (HttpException ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Error downloading {0}", package.name);
|
||||||
|
}
|
||||||
|
catch (IOException ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Error updating {0}", package.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update progress
|
||||||
|
lock (progress)
|
||||||
|
{
|
||||||
|
numComplete++;
|
||||||
|
progress.Report(90.0 * numComplete / packagesToInstall.Count + 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
progress.Report(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name => "Check for plugin updates";
|
||||||
|
|
||||||
|
public string Description => "Downloads and installs updates for plugins that are configured to update automatically.";
|
||||||
|
|
||||||
|
public string Category => "Application";
|
||||||
|
|
||||||
|
public string Key => "PluginUpdates";
|
||||||
|
|
||||||
|
public bool IsHidden => false;
|
||||||
|
|
||||||
|
public bool IsEnabled => true;
|
||||||
|
|
||||||
|
public bool IsLogged => true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -58,24 +58,18 @@ namespace Emby.Server.Implementations.ScheduledTasks
|
||||||
return ((LibraryManager)_libraryManager).ValidateMediaLibraryInternal(progress, cancellationToken);
|
return ((LibraryManager)_libraryManager).ValidateMediaLibraryInternal(progress, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the name.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The name.</value>
|
|
||||||
public string Name => "Scan media library";
|
public string Name => "Scan media library";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the description.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The description.</value>
|
|
||||||
public string Description => "Scans your media library and refreshes metatata based on configuration.";
|
public string Description => "Scans your media library and refreshes metatata based on configuration.";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the category.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The category.</value>
|
|
||||||
public string Category => "Library";
|
public string Category => "Library";
|
||||||
|
|
||||||
public string Key => "RefreshLibrary";
|
public string Key => "RefreshLibrary";
|
||||||
|
|
||||||
|
public bool IsHidden => false;
|
||||||
|
|
||||||
|
public bool IsEnabled => true;
|
||||||
|
|
||||||
|
public bool IsLogged => true;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -169,10 +169,8 @@ namespace Emby.Server.Implementations.Updates
|
||||||
string packageType = null,
|
string packageType = null,
|
||||||
Version applicationVersion = null)
|
Version applicationVersion = null)
|
||||||
{
|
{
|
||||||
// TODO cvium: when plugins get back this would need to be fixed
|
var packages = await GetAvailablePackagesWithoutRegistrationInfo(cancellationToken).ConfigureAwait(false);
|
||||||
// var packages = await GetAvailablePackagesWithoutRegistrationInfo(cancellationToken).ConfigureAwait(false);
|
return FilterPackages(packages, packageType, applicationVersion);
|
||||||
|
|
||||||
return Task.FromResult(new List<PackageInfo>()); //FilterPackages(packages, packageType, applicationVersion);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -184,12 +182,10 @@ namespace Emby.Server.Implementations.Updates
|
||||||
{
|
{
|
||||||
using (var response = await _httpClient.SendAsync(new HttpRequestOptions
|
using (var response = await _httpClient.SendAsync(new HttpRequestOptions
|
||||||
{
|
{
|
||||||
Url = "https://www.mb3admin.local/admin/service/EmbyPackages.json",
|
Url = "https://repo.jellyfin.org/releases/plugin/manifest.json",
|
||||||
CancellationToken = cancellationToken,
|
CancellationToken = cancellationToken,
|
||||||
Progress = new SimpleProgress<double>(),
|
Progress = new SimpleProgress<double>(),
|
||||||
CacheLength = GetCacheLength(),
|
CacheLength = GetCacheLength()
|
||||||
CacheMode = CacheMode.Unconditional
|
|
||||||
|
|
||||||
}, "GET").ConfigureAwait(false))
|
}, "GET").ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
using (var stream = response.Content)
|
using (var stream = response.Content)
|
||||||
|
|
|
@ -36,12 +36,6 @@ namespace MediaBrowser.Providers.MediaInfo
|
||||||
_json = json;
|
_json = json;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Name => "Download missing subtitles";
|
|
||||||
|
|
||||||
public string Description => "Searches the internet for missing subtitles based on metadata configuration.";
|
|
||||||
|
|
||||||
public string Category => "Library";
|
|
||||||
|
|
||||||
private SubtitleOptions GetOptions()
|
private SubtitleOptions GetOptions()
|
||||||
{
|
{
|
||||||
return _config.GetConfiguration<SubtitleOptions>("subtitles");
|
return _config.GetConfiguration<SubtitleOptions>("subtitles");
|
||||||
|
@ -204,6 +198,18 @@ namespace MediaBrowser.Providers.MediaInfo
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string Name => "Download missing subtitles";
|
||||||
|
|
||||||
|
public string Description => "Searches the internet for missing subtitles based on metadata configuration.";
|
||||||
|
|
||||||
|
public string Category => "Library";
|
||||||
|
|
||||||
public string Key => "DownloadSubtitles";
|
public string Key => "DownloadSubtitles";
|
||||||
|
|
||||||
|
public bool IsHidden => false;
|
||||||
|
|
||||||
|
public bool IsEnabled => true;
|
||||||
|
|
||||||
|
public bool IsLogged => true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user