Send playback progress to TubeArchivist

This commit is contained in:
DarkFighterLuke
2024-08-26 15:04:47 +02:00
parent 8b49afad25
commit 9179ea8602
2 changed files with 60 additions and 1 deletions
@@ -5,10 +5,15 @@ using System.Net.Http;
using System.Threading.Tasks;
using Jellyfin.Plugin.TubeArchivistMetadata.Configuration;
using Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist;
using Jellyfin.Plugin.TubeArchivistMetadata.Utilities;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Plugins;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Plugins;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Session;
using Microsoft.Extensions.Logging;
namespace Jellyfin.Plugin.TubeArchivistMetadata
@@ -24,7 +29,9 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata
/// <param name="applicationPaths">Instance of the <see cref="IApplicationPaths"/> interface.</param>
/// <param name="xmlSerializer">Instance of the <see cref="IXmlSerializer"/> interface.</param>
/// <param name="logger">Instance of the <see cref="ILogger"/> interface.</param>
public Plugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer, ILogger<Plugin> logger)
/// <param name="sessionManager">Instance of the <see cref="ISessionManager"/> interface.</param>
/// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
public Plugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer, ILogger<Plugin> logger, ISessionManager sessionManager, ILibraryManager libraryManager)
: base(applicationPaths, xmlSerializer)
{
Instance = this;
@@ -34,6 +41,9 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata
handler.CheckCertificateRevocationList = true;
HttpClient = new HttpClient(handler);
HttpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Token", Instance?.Configuration.TubeArchivistApiKey);
SessionManager = sessionManager;
sessionManager.PlaybackProgress += OnPlaybackProgress;
LibraryManager = libraryManager;
logger.LogInformation("{Message}", "Collection display name: " + Instance?.Configuration.CollectionTitle);
logger.LogInformation("{Message}", "TubeArchivist API URL: " + Instance?.Configuration.TubeArchivistUrl);
logger.LogInformation("{Message}", "Pinging TubeArchivist API...");
@@ -60,6 +70,16 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata
/// </summary>
public HttpClient HttpClient { get; }
/// <summary>
/// Gets the SessionManager used globally by the plugin.
/// </summary>
public ISessionManager SessionManager { get; }
/// <summary>
/// Gets the LibraryManager used globally by the plugin.
/// </summary>
public ILibraryManager LibraryManager { get; }
/// <inheritdoc />
public IEnumerable<PluginPageInfo> GetPages() => new[]
{
@@ -92,5 +112,20 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata
},
TaskScheduler.Default);
}
private async void OnPlaybackProgress(object? sender, PlaybackProgressEventArgs eventArgs)
{
BaseItem? channel = LibraryManager.GetItemById(eventArgs.Item.ParentId);
BaseItem? collection = LibraryManager.GetItemById(channel!.ParentId);
if (collection?.Name.ToLower(CultureInfo.CurrentCulture) == Instance?.Configuration.CollectionTitle.ToLower(CultureInfo.CurrentCulture) && eventArgs.PlaybackPositionTicks != null)
{
long progress = (long)eventArgs.PlaybackPositionTicks / TimeSpan.TicksPerSecond;
var statusCode = await TubeArchivistApi.GetInstance().SetProgress(Utils.GetVideoNameFromPath(eventArgs.Item.Path), progress).ConfigureAwait(true);
if (statusCode != System.Net.HttpStatusCode.OK)
{
Logger.LogInformation("{Message}", $"POST /progress returned {statusCode} for video {eventArgs.Item.Name} with progress {progress} seconds");
}
}
}
}
}
@@ -2,6 +2,7 @@ using System;
using System.Data;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Jellyfin.Plugin.TubeArchivistMetadata.Utilities;
using Microsoft.Extensions.Logging;
@@ -146,5 +147,28 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
return pong;
}
/// <summary>
/// Send video playback progress to TubeArchivist.
/// </summary>
/// <param name="videoId">Video id.</param>
/// <param name="progress">Progress in seconds.</param>
/// <returns>Nothing if successful.</returns>
/// <exception cref="HttpRequestException">Throws this exception if the request was not successful.</exception>
public async Task<HttpStatusCode> SetProgress(string videoId, long progress)
{
var progressEndpoint = $"/api/video/{videoId}/progress/";
var url = new Uri(Utils.SanitizeUrl(Plugin.Instance!.Configuration.TubeArchivistUrl + progressEndpoint));
var body = JsonConvert.SerializeObject(new
{
position = progress
});
var sc = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, new StringContent(body, Encoding.UTF8, "application/json")).ConfigureAwait(true);
return response.StatusCode;
}
}
}