using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Jellyfin.Plugin.MediaCleaner.Helpers; using Jellyfin.Plugin.MediaCleaner.Models; using MediaBrowser.Controller.Library; using Microsoft.Extensions.Logging; using Jellyfin.Plugin.MediaCleaner.Enums; using System.Net.Http; using System; using System.Text.Json; using System.Globalization; namespace Jellyfin.Plugin.MediaCleaner.Data; public class MediaCleanerState(ILogger logger, ILibraryManager libraryManager) { private readonly Lock _lock = new(); private IEnumerable _mediaInfo = []; private readonly StaleMediaScanner _staleMediaScanner = new(logger, libraryManager); public async Task UpdateState() { _mediaInfo = await _staleMediaScanner.ScanStaleMedia().ConfigureAwait(false); } public async Task> GetTvSeriesInfo() { // Filter only TV // Get all series on tv sonarr server HttpHelper httpHelper = new HttpHelper(ServerType.Sonarr); JsonElement tvSeriesResponse = new JsonElement(); try { tvSeriesResponse = await httpHelper.SendHttpRequestAsync(HttpMethod.Get,"/api/v3/series").ConfigureAwait(false); } catch { return []; } var tvSeries = JsonSerializer.Deserialize>(tvSeriesResponse.GetRawText()); if(tvSeries == null) { return []; } lock (_lock) { var allSeries = _mediaInfo.OfType(); var tvSeriesInfo = allSeries .Where(series => tvSeries.Any(tv => tv.TvdbId == int.Parse(series.TvdbId, CultureInfo.InvariantCulture))); return [.. tvSeriesInfo]; } } public async Task> GetAnimeSeriesInfo() { // Get all series on anime sonarr server HttpHelper animeHttpHelper = new HttpHelper(ServerType.SonarrAnime); JsonElement animeSeriesResponse = new JsonElement(); try { animeSeriesResponse = await animeHttpHelper.SendHttpRequestAsync(HttpMethod.Get,"/api/v3/series").ConfigureAwait(false); } catch { return []; } var animeSeries = JsonSerializer.Deserialize>(animeSeriesResponse.GetRawText()); if(animeSeries == null) { return Enumerable.Empty(); } lock (_lock) { var allSeries = _mediaInfo.OfType(); var animeSeriesInfo = allSeries .Where(series => animeSeries.Any(anime => anime.TvdbId == int.Parse(series.TvdbId, CultureInfo.InvariantCulture))); return animeSeriesInfo; } } public IEnumerable GetMovieInfo() { lock (_lock) { return _mediaInfo.OfType(); } } }