Files
nfoguard/NFOGuard.Emby.Plugin/LibraryEventHandler.cs
T
2025-09-12 10:30:12 -04:00

169 lines
6.6 KiB
C#

using System;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Logging;
namespace NFOGuard.Emby.Plugin
{
public class LibraryEventHandler : IDisposable
{
private readonly ILibraryManager _libraryManager;
private readonly IItemRepository _itemRepository;
private readonly ILogger _logger;
private readonly LicenseManager _licenseManager;
private readonly FreeTierManager _freeTierManager;
public LibraryEventHandler(ILibraryManager libraryManager, IItemRepository itemRepository, ILogger logger)
{
_libraryManager = libraryManager;
_itemRepository = itemRepository;
_logger = logger;
_licenseManager = new LicenseManager(_logger);
_freeTierManager = new FreeTierManager(_logger);
// Subscribe to library events
_libraryManager.ItemAdded += OnItemAdded;
_libraryManager.ItemUpdated += OnItemUpdated;
}
private void OnItemAdded(object sender, ItemChangeEventArgs e)
{
ProcessItem(e.Item, "Added");
}
private void OnItemUpdated(object sender, ItemChangeEventArgs e)
{
ProcessItem(e.Item, "Updated");
}
private void ProcessItem(BaseItem item, string eventType)
{
try
{
// Check if real-time sync is enabled
if (!Plugin.Instance.Configuration.EnableRealTimeSync)
return;
// Free tier: disable real-time processing
var config = Plugin.Instance.Configuration;
if (config.MonthlyProcessingLimit > 0 && !config.LicenseValid)
{
if (Plugin.Instance.Configuration.LogVerbose)
_logger.Info($"NFOGuard :: Real-time processing disabled in free tier. Use scheduled task instead.");
return;
}
// Check if we can process this item
if (!_freeTierManager.CanProcessItems(1, out string reason))
{
_logger.Info($"NFOGuard :: Skipping real-time processing: {reason}");
return;
}
// Process TV episodes and Movies
if (item is Episode episode)
{
ProcessEpisode(episode, eventType);
}
else if (item is Movie movie)
{
ProcessMovie(movie, eventType);
}
}
catch (Exception ex)
{
_logger.ErrorException($"NFOGuard :: Error processing item {item?.Name}", ex);
}
}
private void ProcessEpisode(Episode episode, string eventType)
{
try
{
if (Plugin.Instance.Configuration.LogVerbose)
_logger.Info($"NFOGuard :: Processing {eventType} Episode :: {episode.Name}");
// Check if PremiereDate exists and differs from DateCreated
if (episode.PremiereDate.HasValue &&
episode.DateCreated != episode.PremiereDate.Value)
{
if (Plugin.Instance.Configuration.LogVerbose)
_logger.Info($"NFOGuard :: Syncing PremiereDate to DateCreated :: {episode.Name} :: " +
$"PremiereDate: {episode.PremiereDate.Value}, DateCreated: {episode.DateCreated}");
// Update DateCreated to match PremiereDate
episode.DateCreated = episode.PremiereDate.Value;
try
{
// Save to repository using ItemUpdateType.MetadataEdit
episode.UpdateToRepository(ItemUpdateType.MetadataEdit);
_logger.Info($"NFOGuard :: Successfully updated episode :: {episode.Name}");
// Record usage for free tier tracking
_freeTierManager.RecordProcessedItems(1);
}
catch (Exception ex)
{
_logger.ErrorException($"NFOGuard :: Failed to update episode {episode.Name}", ex);
}
}
}
catch (Exception ex)
{
_logger.ErrorException($"NFOGuard :: Error processing episode {episode?.Name}", ex);
}
}
private void ProcessMovie(Movie movie, string eventType)
{
try
{
if (Plugin.Instance.Configuration.LogVerbose)
_logger.Info($"NFOGuard :: Processing {eventType} Movie :: {movie.Name}");
// Check if PremiereDate exists and differs from DateCreated
if (movie.PremiereDate.HasValue &&
movie.DateCreated != movie.PremiereDate.Value)
{
if (Plugin.Instance.Configuration.LogVerbose)
_logger.Info($"NFOGuard :: Syncing PremiereDate to DateCreated :: {movie.Name} :: " +
$"PremiereDate: {movie.PremiereDate.Value}, DateCreated: {movie.DateCreated}");
// Update DateCreated to match PremiereDate
movie.DateCreated = movie.PremiereDate.Value;
try
{
// Save to repository using ItemUpdateType.MetadataEdit
movie.UpdateToRepository(ItemUpdateType.MetadataEdit);
_logger.Info($"NFOGuard :: Successfully updated movie :: {movie.Name}");
// Record usage for free tier tracking
_freeTierManager.RecordProcessedItems(1);
}
catch (Exception ex)
{
_logger.ErrorException($"NFOGuard :: Failed to update movie {movie.Name}", ex);
}
}
}
catch (Exception ex)
{
_logger.ErrorException($"NFOGuard :: Error processing movie {movie?.Name}", ex);
}
}
public void Dispose()
{
if (_libraryManager != null)
{
_libraryManager.ItemAdded -= OnItemAdded;
_libraryManager.ItemUpdated -= OnItemUpdated;
}
}
}
}