From 9febfef12ac86cb6c8eab949c35675d454e69f37 Mon Sep 17 00:00:00 2001 From: DarkFighterLuke Date: Thu, 9 May 2024 22:11:37 +0200 Subject: [PATCH] Ping TubeArchivist API when saving configuration and at boot --- .../Configuration/PluginConfiguration.cs | 19 +++++++- .../Plugin.cs | 26 +++++++++++ .../TubeArchivist/PingResponse.cs | 44 +++++++++++++++++++ .../TubeArchivist/TubeArchivistApi.cs | 30 +++++++++++++ 4 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 Jellyfin.Plugin.TubeArchivistMetadata/TubeArchivist/PingResponse.cs diff --git a/Jellyfin.Plugin.TubeArchivistMetadata/Configuration/PluginConfiguration.cs b/Jellyfin.Plugin.TubeArchivistMetadata/Configuration/PluginConfiguration.cs index ca063c3..4d3686a 100644 --- a/Jellyfin.Plugin.TubeArchivistMetadata/Configuration/PluginConfiguration.cs +++ b/Jellyfin.Plugin.TubeArchivistMetadata/Configuration/PluginConfiguration.cs @@ -13,6 +13,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Configuration { private ILogger _logger; private string _tubeArchivistUrl; + private string _tubeArchivistApiKey; /// /// Initializes a new instance of the class. @@ -30,7 +31,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Configuration CollectionTitle = string.Empty; _tubeArchivistUrl = string.Empty; - TubeArchivistApiKey = string.Empty; + _tubeArchivistApiKey = string.Empty; MaxDescriptionLength = 500; } @@ -60,13 +61,27 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Configuration _logger.LogInformation("{Message}", "Given TubeArchivist URL contains no schema. Adding http://..."); _tubeArchivistUrl = Utils.SanitizeUrl("http://" + value); } + + Plugin.Instance?.LogTAApiConnectionStatus(); } } /// /// Gets or sets TubeArchivist API key. /// - public string TubeArchivistApiKey { get; set; } + public string TubeArchivistApiKey + { + get + { + return _tubeArchivistApiKey; + } + + set + { + _tubeArchivistApiKey = value; + Plugin.Instance?.LogTAApiConnectionStatus(); + } + } /// /// Gets or sets maximum series and episodes overviews length. diff --git a/Jellyfin.Plugin.TubeArchivistMetadata/Plugin.cs b/Jellyfin.Plugin.TubeArchivistMetadata/Plugin.cs index 2c671a1..c1f3b40 100644 --- a/Jellyfin.Plugin.TubeArchivistMetadata/Plugin.cs +++ b/Jellyfin.Plugin.TubeArchivistMetadata/Plugin.cs @@ -2,7 +2,9 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Net.Http; +using System.Threading.Tasks; using Jellyfin.Plugin.TubeArchivistMetadata.Configuration; +using Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist; using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Plugins; using MediaBrowser.Model.Plugins; @@ -34,6 +36,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata HttpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Token", Instance?.Configuration.TubeArchivistApiKey); logger.LogInformation("{Message}", "Collection display name: " + Instance?.Configuration.CollectionTitle); logger.LogInformation("{Message}", "TubeArchivist API URL: " + Instance?.Configuration.TubeArchivistUrl); + logger.LogInformation("{Message}", "Pinging TubeArchivist API..."); } /// @@ -66,5 +69,28 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata EmbeddedResourcePath = string.Format(CultureInfo.InvariantCulture, "{0}.Configuration.configPage.html", GetType().Namespace) } }; + + /// + /// Logs the TubeArchivist API connection status. + /// + public void LogTAApiConnectionStatus() + { + Logger.LogInformation("{Message}", "Ping..."); + + var api = TubeArchivistApi.GetInstance(); + Task.Run(() => api.Ping()).ContinueWith( + task => + { + if (task.Result != null) + { + Logger.LogInformation("{Message}", "TubeArchivist API said: " + task.Result.Response + "!"); + } + else + { + Logger.LogCritical("{Message}", "TubeArchivist API was unreachable!"); + } + }, + TaskScheduler.Default); + } } } diff --git a/Jellyfin.Plugin.TubeArchivistMetadata/TubeArchivist/PingResponse.cs b/Jellyfin.Plugin.TubeArchivistMetadata/TubeArchivist/PingResponse.cs new file mode 100644 index 0000000..ee2e01a --- /dev/null +++ b/Jellyfin.Plugin.TubeArchivistMetadata/TubeArchivist/PingResponse.cs @@ -0,0 +1,44 @@ +using Newtonsoft.Json; + +namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist +{ + /// + /// A class representing TubeArchivist API ping response data. + /// + public class PingResponse + { + /// + /// Initializes a new instance of the class. + /// + /// Response from the API ("pong"). + /// TubeArchivist user id. + /// TubeArchivist version. + public PingResponse( + string response, + int user, + string version) + { + this.Response = response; + this.User = user; + this.Version = version; + } + + /// + /// Gets response to the ping ("pong"). + /// + [JsonProperty(PropertyName = "response")] + public string Response { get; } + + /// + /// Gets user id. + /// + [JsonProperty(PropertyName = "user")] + public int User { get; } + + /// + /// Gets TubeArchivist version. + /// + [JsonProperty(PropertyName = "version")] + public string Version { get; } + } +} diff --git a/Jellyfin.Plugin.TubeArchivistMetadata/TubeArchivist/TubeArchivistApi.cs b/Jellyfin.Plugin.TubeArchivistMetadata/TubeArchivist/TubeArchivistApi.cs index ca15e30..53adfbb 100644 --- a/Jellyfin.Plugin.TubeArchivistMetadata/TubeArchivist/TubeArchivistApi.cs +++ b/Jellyfin.Plugin.TubeArchivistMetadata/TubeArchivist/TubeArchivistApi.cs @@ -116,5 +116,35 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist return video?.Data; } + + /// + /// Validates connection and authentication to TubeArchivist. + /// + /// The ping response. + public async Task Ping() + { + PingResponse? pong = null; + + var pingEndpoint = "/api/ping/"; + var url = new Uri(Utils.SanitizeUrl(Plugin.Instance!.Configuration.TubeArchivistUrl + pingEndpoint)); + var response = await client.GetAsync(url).ConfigureAwait(true); + + while (response.StatusCode == HttpStatusCode.Moved) + { + url = response.Headers.Location; + _logger.LogInformation("{Message}", "Received redirect to: " + url); + response = await client.GetAsync(url).ConfigureAwait(true); + } + + _logger.LogInformation("{Message}", url + ": " + response.StatusCode); + + if (response.IsSuccessStatusCode) + { + string rawData = await response.Content.ReadAsStringAsync().ConfigureAwait(true); + pong = JsonConvert.DeserializeObject(rawData); + } + + return pong; + } } }