Files
stream-cinema/CinemaJellyfin/CinemaHost.cs
2025-04-03 22:04:44 +00:00

101 lines
3.7 KiB
C#

using System.Linq.Expressions;
using CinemaJellyfin;
using CinemaLib.Webshare;
using Jellyfin.Plugin.Cinema.Configuration;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Plugins;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace Jellyfin.Plugin.Cinema;
/// <summary>
/// <see cref="IHostedService"/> responsible for Live TV recordings.
/// </summary>
sealed class CinemaHost : IHostedService
{
#pragma warning disable CS8618
// This instance is specially registered and gets created before all classes
// except CinemaServiceRegistrator and CinemaPlugin.
private static Session? _webshare;
#pragma warning restore CS8618
private readonly ILogger<CinemaHost> _logger;
private string? _lastWebsharePassword;
private string? _lastWebshareToken;
/// <summary>
/// Initializes a the Stream Cinema plugin.
/// </summary>
public CinemaHost(ILibraryManager libraryManager, IServerConfigurationManager config, IFileSystem fileSystem, ILogger<CinemaHost> logger)
{
CinemaGlobals.Initialize(libraryManager, config, fileSystem);
this._logger = logger;
}
public static Session? Webshare => _webshare;
public static async Task<bool> IsWebshareFreeAccount(CancellationToken cancel)
{
var webshare = _webshare;
return webshare == null || await webshare.GetTokenAsync(cancel) == null;
}
/// <inheritdoc />
public Task StartAsync(CancellationToken cancellationToken)
{
CinemaPluginConfiguration config = CinemaPlugin.Instance!.Configuration;
CinemaPlugin.Instance!.ConfigurationChanged += ReloadConfig;
EnsureWebshareSession(config);
EnsureRootFolders(config);
return Task.CompletedTask;
}
/// <inheritdoc />
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
private void ReloadConfig(object? sender, BasePluginConfiguration e)
{
CinemaPluginConfiguration config = (CinemaPluginConfiguration)e;
EnsureWebshareSession(config);
EnsureRootFolders(config);
}
private void EnsureRootFolders(CinemaPluginConfiguration config)
{
CinemaFilterFolder.CreateRootFilterFolder<CinemaMoviesFolder>(string.IsNullOrWhiteSpace(config.MoviesFolderName) ? "Movies" : config.MoviesFolderName)
.Hide = config.HideMoviesFolder;
CinemaFilterFolder.CreateRootFilterFolder<CinemaTvShowsFolder>(string.IsNullOrWhiteSpace(config.SeriesFolderName) ? "TV Shows" : config.SeriesFolderName)
.Hide = config.HideSeriesFolder;
CinemaFilterFolder.CreateRootFilterFolder<CinemaAnimeFolder>(string.IsNullOrWhiteSpace(config.AnimeFolderName) ? "Anime" : config.AnimeFolderName)
.Hide = config.HideAnimeFolder;
CinemaFilterFolder.CreateRootFilterFolder<CinemaConcertFolder>(string.IsNullOrWhiteSpace(config.ConcertFolderName) ? "Concerts" : config.ConcertFolderName)
.Hide = config.HideConcertFolder;
}
private void EnsureWebshareSession(CinemaPluginConfiguration config)
{
if (config.WebshareUser != _webshare?.UserName
|| config.WebsharePassword != _lastWebsharePassword
|| config.WebshareToken != _lastWebshareToken)
{
// Re-create the Webshare session as the credentials have changed
if ((!string.IsNullOrEmpty(config.WebshareUser) && !string.IsNullOrEmpty(config.WebsharePassword)) || !string.IsNullOrEmpty(config.WebshareToken)) {
_webshare = new Session(config.WebshareUser ?? "", config.WebsharePassword ?? "", config.WebshareToken);
string? token = _webshare.GetTokenAsync(default).GetAwaiter().GetResult();
if (token != config.WebshareToken) {
config.WebshareToken = token;
CinemaPlugin.Instance!.SaveConfiguration(config);
}
} else
_webshare = null;
_lastWebsharePassword = config.WebsharePassword;
_lastWebshareToken = config.WebshareToken;
}
}
}