101 lines
3.7 KiB
C#
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;
|
|
}
|
|
}
|
|
} |