using System; using System.IO; using System.Threading.Tasks; using MediaBrowser.Common.Plugins; using MediaBrowser.Model.Drawing; using MediaBrowser.Common.Configuration; using MediaBrowser.Model.Plugins; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Logging; namespace NFOGuard.Emby.Plugin { public class Plugin : BasePlugin { private Guid _id = new Guid("B2C3D4E5-6789-ABCD-EF01-23456789ABCE"); // Completely new GUID to clear cache public override string Name => "DateSync"; public override string Description => "Synchronizes TV episode PremiereDate to DateCreated to preserve import dates in Emby"; public override Guid Id => _id; public override string ConfigurationFileName => "datesync.xml"; public static Plugin Instance { get; private set; } public Plugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer) : base(applicationPaths, xmlSerializer) { Instance = this; } /// /// Registers machine and checks for automatic subscription activation /// public async Task RegisterAndCheckSubscriptionAsync(string userEmail, ILogger logger) { try { var licenseManager = new LicenseManager(logger); // Register machine first var registrationResult = await licenseManager.RegisterMachineAsync(userEmail); // Then check for existing subscription await licenseManager.CheckAndActivateLicenseAsync(); return registrationResult; } catch (Exception ex) { return $"Registration error: {ex.Message}"; } } /// /// Gets current license status and usage information /// public string GetLicenseStatus(ILogger logger) { try { var freeTierManager = new FreeTierManager(logger); var licenseManager = new LicenseManager(logger); var machineId = licenseManager.GetMachineIdentifier(); if (Configuration.LicenseValid) { return $"āœ… Subscription Active\nMachine ID: {machineId}\nStatus: Unlimited processing enabled\n\nSubscription automatically detected via Patreon/PayPal."; } else { var usageInfo = freeTierManager.GetUsageInfo(); var trialInfo = licenseManager.IsTrialExpired() ? "Trial expired" : $"Trial active ({Math.Max(0, (Configuration.InstallDate.AddDays(30) - DateTime.UtcNow).Days)} days remaining)"; return $"šŸ†“ Free Tier Active\nMachine ID: {machineId}\nUsage: {usageInfo}\nTrial: {trialInfo}\n\nTo unlock unlimited processing:\n• Subscribe: https://patreon.com/nfoguard\n• PayPal: https://nfoguard.com/paypal\n\nActivation is automatic within 24 hours."; } } catch (Exception ex) { return $"Error getting license status: {ex.Message}"; } } /// /// Manually checks for subscription updates /// public async Task RefreshSubscriptionStatusAsync(ILogger logger) { try { var licenseManager = new LicenseManager(logger); var wasLicensed = Configuration.LicenseValid; await licenseManager.CheckAndActivateLicenseAsync(); if (!wasLicensed && Configuration.LicenseValid) { return "āœ… Subscription found and activated! Unlimited processing enabled."; } else if (wasLicensed && !Configuration.LicenseValid) { return "āš ļø Subscription expired or cancelled. Switched to free tier."; } else if (Configuration.LicenseValid) { return "āœ… Subscription is still active."; } else { return "šŸ†“ No active subscription found. Still using free tier."; } } catch (Exception ex) { return $"Error checking subscription: {ex.Message}"; } } } public class PluginConfiguration : BasePluginConfiguration { public bool EnableRealTimeSync { get; set; } = true; public bool EnableScheduledTask { get; set; } = true; public bool LogVerbose { get; set; } = true; // Enabled by default for diagnostic version public bool LicenseValid { get; set; } = false; public string RegisteredEmail { get; set; } = string.Empty; public DateTime InstallDate { get; set; } = DateTime.MinValue; public DateTime LastLicenseCheck { get; set; } = DateTime.MinValue; // Free tier tracking public DateTime LastProcessingReset { get; set; } = DateTime.MinValue; public int ProcessedThisMonth { get; set; } = 0; public int MonthlyProcessingLimit { get; set; } = 0; // 0 = no limit (full version) // Machine registration public bool MachineRegistered { get; set; } = false; public string MachineId { get; set; } = string.Empty; } }