diff --git a/NFOGuard.Emby.Plugin/FreeTierManager.cs b/NFOGuard.Emby.Plugin/FreeTierManager.cs new file mode 100644 index 0000000..e752f07 --- /dev/null +++ b/NFOGuard.Emby.Plugin/FreeTierManager.cs @@ -0,0 +1,173 @@ +using System; +using System.Linq; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Library; +using MediaBrowser.Model.Logging; + +namespace NFOGuard.Emby.Plugin +{ + public class FreeTierManager + { + private readonly ILogger _logger; + private readonly ILibraryManager _libraryManager; + + public FreeTierManager(ILogger logger, ILibraryManager libraryManager = null) + { + _logger = logger; + _libraryManager = libraryManager; + } + + public bool CanProcessItems(int itemCount, out string reason) + { + var config = Plugin.Instance.Configuration; + reason = string.Empty; + + // If licensed or no limit set, allow processing + if (config.LicenseValid || config.MonthlyProcessingLimit == 0) + { + return true; + } + + // Check if month has rolled over + ResetMonthlyCounterIfNeeded(); + + // Check if this processing would exceed the limit + var wouldExceed = config.ProcessedThisMonth + itemCount > config.MonthlyProcessingLimit; + + if (wouldExceed) + { + var remaining = Math.Max(0, config.MonthlyProcessingLimit - config.ProcessedThisMonth); + reason = $"Free tier limit reached. {remaining} items remaining this month of {config.MonthlyProcessingLimit} allowed. Upgrade to process unlimited items."; + _logger.Info($"NFOGuard :: {reason}"); + return false; + } + + return true; + } + + public void RecordProcessedItems(int count) + { + var config = Plugin.Instance.Configuration; + + // Only track if using free tier limits + if (config.MonthlyProcessingLimit > 0 && !config.LicenseValid) + { + config.ProcessedThisMonth += count; + Plugin.Instance.SaveConfiguration(); + + _logger.Info($"NFOGuard :: Free tier usage: {config.ProcessedThisMonth}/{config.MonthlyProcessingLimit} items this month"); + } + } + + public void SetFreeTierLimits(int monthlyLimit) + { + var config = Plugin.Instance.Configuration; + config.MonthlyProcessingLimit = monthlyLimit; + config.LicenseValid = false; + + if (config.InstallDate == DateTime.MinValue) + { + config.InstallDate = DateTime.UtcNow; + } + + ResetMonthlyCounterIfNeeded(); + Plugin.Instance.SaveConfiguration(); + + _logger.Info($"NFOGuard :: Free tier configured: {monthlyLimit} items per month"); + } + + public void SetPercentageBasedLimits() + { + if (_libraryManager == null) + { + _logger.Warn("NFOGuard :: Cannot calculate percentage limits without LibraryManager"); + SetFreeTierLimits(500); // Fallback to fixed limit + return; + } + + try + { + // Get library counts + var episodes = _libraryManager.GetItemList(new InternalItemsQuery + { + IncludeItemTypes = new[] { "Episode" }, + Recursive = true + }).OfType().Count(); + + var movies = _libraryManager.GetItemList(new InternalItemsQuery + { + IncludeItemTypes = new[] { "Movie" }, + Recursive = true + }).OfType().Count(); + + // Calculate 2% of TV episodes + 5% of movies + var episodeLimit = Math.Max(1, (int)(episodes * 0.02)); // At least 1 episode + var movieLimit = Math.Max(1, (int)(movies * 0.05)); // At least 1 movie + var totalLimit = episodeLimit + movieLimit; + + _logger.Info($"NFOGuard :: Library analysis - Episodes: {episodes}, Movies: {movies}"); + _logger.Info($"NFOGuard :: Free tier limits - Episodes: {episodeLimit} (2%), Movies: {movieLimit} (5%), Total: {totalLimit}"); + + var config = Plugin.Instance.Configuration; + config.MonthlyProcessingLimit = totalLimit; + config.LicenseValid = false; + + if (config.InstallDate == DateTime.MinValue) + { + config.InstallDate = DateTime.UtcNow; + } + + ResetMonthlyCounterIfNeeded(); + Plugin.Instance.SaveConfiguration(); + } + catch (Exception ex) + { + _logger.ErrorException("NFOGuard :: Error calculating percentage limits", ex); + SetFreeTierLimits(500); // Fallback + } + } + + public void EnableFullVersion() + { + var config = Plugin.Instance.Configuration; + config.LicenseValid = true; + config.MonthlyProcessingLimit = 0; + Plugin.Instance.SaveConfiguration(); + + _logger.Info("NFOGuard :: Full version enabled - unlimited processing"); + } + + private void ResetMonthlyCounterIfNeeded() + { + var config = Plugin.Instance.Configuration; + var now = DateTime.UtcNow; + + // Reset if last reset was more than a month ago or never set + if (config.LastProcessingReset == DateTime.MinValue || + now > config.LastProcessingReset.AddMonths(1)) + { + config.ProcessedThisMonth = 0; + config.LastProcessingReset = new DateTime(now.Year, now.Month, 1); // First of current month + Plugin.Instance.SaveConfiguration(); + + _logger.Info("NFOGuard :: Monthly processing counter reset"); + } + } + + public string GetUsageInfo() + { + var config = Plugin.Instance.Configuration; + + if (config.LicenseValid || config.MonthlyProcessingLimit == 0) + { + return "Full version - unlimited processing"; + } + + ResetMonthlyCounterIfNeeded(); + var remaining = Math.Max(0, config.MonthlyProcessingLimit - config.ProcessedThisMonth); + return $"Free tier: {remaining} items remaining this month (of {config.MonthlyProcessingLimit} allowed)"; + } + } +} \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/LibraryEventHandler.cs b/NFOGuard.Emby.Plugin/LibraryEventHandler.cs index 4c5f9d2..bb52ca0 100644 --- a/NFOGuard.Emby.Plugin/LibraryEventHandler.cs +++ b/NFOGuard.Emby.Plugin/LibraryEventHandler.cs @@ -14,6 +14,7 @@ namespace NFOGuard.Emby.Plugin private readonly IItemRepository _itemRepository; private readonly ILogger _logger; private readonly LicenseManager _licenseManager; + private readonly FreeTierManager _freeTierManager; public LibraryEventHandler(ILibraryManager libraryManager, IItemRepository itemRepository, ILogger logger) { @@ -21,6 +22,7 @@ namespace NFOGuard.Emby.Plugin _itemRepository = itemRepository; _logger = logger; _licenseManager = new LicenseManager(_logger); + _freeTierManager = new FreeTierManager(_logger); // Subscribe to library events _libraryManager.ItemAdded += OnItemAdded; @@ -45,13 +47,21 @@ namespace NFOGuard.Emby.Plugin if (!Plugin.Instance.Configuration.EnableRealTimeSync) return; - // TODO: Re-enable licensing when ready for production - // Check license/trial status - // if (!_licenseManager.CanUseFeature()) - // { - // _logger.Info("NFOGuard :: License expired or invalid. Please purchase a license to continue using NFOGuard."); - // 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) @@ -92,6 +102,9 @@ namespace NFOGuard.Emby.Plugin // 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) { @@ -128,6 +141,9 @@ namespace NFOGuard.Emby.Plugin // 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) { diff --git a/NFOGuard.Emby.Plugin/LicenseManager.cs b/NFOGuard.Emby.Plugin/LicenseManager.cs index bbe6adb..c2d8364 100644 --- a/NFOGuard.Emby.Plugin/LicenseManager.cs +++ b/NFOGuard.Emby.Plugin/LicenseManager.cs @@ -1,46 +1,128 @@ using System; +using System.Net.Http; +using System.Text; using System.Threading.Tasks; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Serialization; namespace NFOGuard.Emby.Plugin { public class LicenseManager { private readonly ILogger _logger; + private readonly HttpClient _httpClient; + private const string NFOGUARD_API_URL = "https://nfoguard.com/api"; // Your future API endpoint public LicenseManager(ILogger logger) { _logger = logger; + _httpClient = new HttpClient(); + _httpClient.Timeout = TimeSpan.FromSeconds(10); // Quick timeout for license checks } - public async Task ValidateLicenseAsync(string licenseKey) + public async Task CheckLicenseStatusAsync() { try { - // TODO: Implement actual license validation - // For now, return true for testing - // In production, this would call your licensing server + var config = Plugin.Instance.Configuration; - if (string.IsNullOrEmpty(licenseKey)) + // Get unique identifier for this installation + var machineId = GetMachineIdentifier(); + + _logger.Info("NFOGuard :: Checking automatic license status..."); + + // Check Patreon subscription + var patreonValid = await CheckPatreonSubscriptionAsync(machineId); + if (patreonValid) { - _logger.Info("NFOGuard :: No license key provided, running in trial mode"); - return false; + _logger.Info("NFOGuard :: Valid Patreon subscription found"); + return true; } - - // Placeholder for license validation logic - // You would implement your own licensing server/API here - _logger.Info($"NFOGuard :: Validating license key: {licenseKey.Substring(0, Math.Min(8, licenseKey.Length))}..."); - // For now, accept any non-empty key as valid - return !string.IsNullOrWhiteSpace(licenseKey); + // Check PayPal recurring payment + var paypalValid = await CheckPayPalSubscriptionAsync(machineId); + if (paypalValid) + { + _logger.Info("NFOGuard :: Valid PayPal subscription found"); + return true; + } + + _logger.Info("NFOGuard :: No active subscription found, using free tier"); + return false; } catch (Exception ex) { _logger.ErrorException("NFOGuard :: License validation error", ex); + return false; // Default to free tier on error + } + } + + private async Task CheckPatreonSubscriptionAsync(string machineId) + { + try + { + var requestUrl = $"{NFOGUARD_API_URL}/patreon/check?machine_id={machineId}"; + var response = await _httpClient.GetStringAsync(requestUrl); + + // Parse response (you'll implement the API to return JSON like {"active": true, "tier": "supporter"}) + return response.Contains("\"active\":true"); + } + catch (HttpRequestException) + { + _logger.Info("NFOGuard :: Cannot reach license server, running in offline mode"); + return false; // Offline mode - use free tier + } + catch (Exception ex) + { + _logger.ErrorException("NFOGuard :: Patreon check error", ex); return false; } } + private async Task CheckPayPalSubscriptionAsync(string machineId) + { + try + { + var requestUrl = $"{NFOGUARD_API_URL}/paypal/check?machine_id={machineId}"; + var response = await _httpClient.GetStringAsync(requestUrl); + + // Parse response + return response.Contains("\"active\":true"); + } + catch (HttpRequestException) + { + _logger.Info("NFOGuard :: Cannot reach license server, running in offline mode"); + return false; + } + catch (Exception ex) + { + _logger.ErrorException("NFOGuard :: PayPal check error", ex); + return false; + } + } + + public string GetMachineIdentifier() + { + try + { + // Create a unique but consistent identifier for this installation + // Combine multiple factors to create a stable machine ID + var machineName = Environment.MachineName ?? "unknown"; + var userDomain = Environment.UserDomainName ?? "unknown"; + var installPath = Plugin.Instance.ConfigurationFilePath; + + var combined = $"{machineName}-{userDomain}-{installPath}".GetHashCode().ToString("X8"); + + _logger.Info($"NFOGuard :: Machine ID: {combined}"); + return combined; + } + catch (Exception ex) + { + _logger.ErrorException("NFOGuard :: Error generating machine ID", ex); + return "FALLBACK-ID"; + } + } + public bool IsTrialExpired() { // Implement trial logic here @@ -62,5 +144,131 @@ namespace NFOGuard.Emby.Plugin // Check if license is valid or trial is still active return Plugin.Instance.Configuration.LicenseValid || !IsTrialExpired(); } + + public async Task CheckAndActivateLicenseAsync() + { + try + { + _logger.Info("NFOGuard :: Checking for active subscriptions..."); + + var isValid = await CheckLicenseStatusAsync(); + var config = Plugin.Instance.Configuration; + + if (isValid && !config.LicenseValid) + { + // Activate license + config.LicenseValid = true; + config.MonthlyProcessingLimit = 0; // Remove limits + config.ProcessedThisMonth = 0; // Reset counter + Plugin.Instance.SaveConfiguration(); + + var freeTierManager = new FreeTierManager(_logger); + freeTierManager.EnableFullVersion(); + + _logger.Info("NFOGuard :: Subscription detected - unlimited processing activated!"); + return true; + } + else if (!isValid && config.LicenseValid) + { + // Deactivate license + config.LicenseValid = false; + Plugin.Instance.SaveConfiguration(); + + var freeTierManager = new FreeTierManager(_logger); + freeTierManager.SetPercentageBasedLimits(); + + _logger.Info("NFOGuard :: No active subscription found - switched to free tier"); + return false; + } + + return isValid; + } + catch (Exception ex) + { + _logger.ErrorException("NFOGuard :: License check error", ex); + return false; + } + } + + public async Task RegisterMachineAsync(string userEmail) + { + try + { + var machineId = GetMachineIdentifier(); + var config = Plugin.Instance.Configuration; + + var registrationData = new + { + machine_id = machineId, + email = userEmail, + emby_version = Environment.OSVersion.ToString(), + plugin_version = Plugin.Instance.Description, + install_date = config.InstallDate.ToString("yyyy-MM-dd"), + library_stats = GetLibraryStats() + }; + + var json = System.Text.Json.JsonSerializer.Serialize(registrationData); + var content = new StringContent(json, Encoding.UTF8, "application/json"); + + var response = await _httpClient.PostAsync($"{NFOGUARD_API_URL}/register", content); + var responseText = await response.Content.ReadAsStringAsync(); + + if (response.IsSuccessStatusCode) + { + _logger.Info($"NFOGuard :: Machine registered successfully: {machineId}"); + return $"Registration successful!\n\nMachine ID: {machineId}\n\nTo activate unlimited processing:\nโ€ข Subscribe on Patreon: https://patreon.com/nfoguard\nโ€ข Or PayPal recurring: https://nfoguard.com/paypal\n\nThe plugin will automatically detect your subscription within 24 hours."; + } + else + { + _logger.Warn($"NFOGuard :: Registration failed: {responseText}"); + return $"Registration failed. You can still use the free tier.\n\nMachine ID: {machineId}\nError: {responseText}"; + } + } + catch (Exception ex) + { + _logger.ErrorException("NFOGuard :: Registration error", ex); + var machineId = GetMachineIdentifier(); + return $"Registration failed (offline mode).\n\nMachine ID: {machineId}\n\nTo activate later, visit: https://nfoguard.com/register"; + } + } + + private object GetLibraryStats() + { + try + { + // This would be used for analytics (anonymized) + return new + { + episodes_estimated = "unknown", + movies_estimated = "unknown", + free_tier_usage = Plugin.Instance.Configuration.ProcessedThisMonth + }; + } + catch + { + return new { error = "stats_unavailable" }; + } + } + + public void DeactivateLicense() + { + try + { + var config = Plugin.Instance.Configuration; + config.LicenseValid = false; + + // Reset to percentage-based free tier + var freeTierManager = new FreeTierManager(_logger); + freeTierManager.SetPercentageBasedLimits(); + + Plugin.Instance.SaveConfiguration(); + + _logger.Info("NFOGuard :: License deactivated - switched to free tier"); + } + catch (Exception ex) + { + _logger.ErrorException("NFOGuard :: License deactivation error", ex); + } + } } } \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/NFOGuard.Emby.Plugin.csproj b/NFOGuard.Emby.Plugin/NFOGuard.Emby.Plugin.csproj index 3ff8482..cb82453 100644 --- a/NFOGuard.Emby.Plugin/NFOGuard.Emby.Plugin.csproj +++ b/NFOGuard.Emby.Plugin/NFOGuard.Emby.Plugin.csproj @@ -10,6 +10,8 @@ + + @@ -28,8 +30,5 @@ - - - - + \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/NFOGuardScheduledTask.cs b/NFOGuard.Emby.Plugin/NFOGuardScheduledTask.cs index c288409..bcde428 100644 --- a/NFOGuard.Emby.Plugin/NFOGuardScheduledTask.cs +++ b/NFOGuard.Emby.Plugin/NFOGuardScheduledTask.cs @@ -16,8 +16,9 @@ namespace NFOGuard.Emby.Plugin { private readonly ILibraryManager _libraryManager; private readonly ILogger _logger; + private readonly FreeTierManager _freeTierManager; - public string Name => "NFOGuard Date Sync"; + public string Name => "DateSync Task"; public string Key => "NFOGuardSync"; @@ -29,6 +30,7 @@ namespace NFOGuard.Emby.Plugin { _libraryManager = libraryManager; _logger = logManager.GetLogger("NFOGuard"); + _freeTierManager = new FreeTierManager(_logger); } public async Task Execute(CancellationToken cancellationToken, IProgress progress) @@ -59,27 +61,79 @@ namespace NFOGuard.Emby.Plugin var totalItems = episodes.Count + movies.Count; _logger.Info($"NFOGuard :: Found {episodes.Count} episodes and {movies.Count} movies to process ({totalItems} total)"); + // Calculate items that need processing + var itemsNeedingSync = episodes.Where(e => e.PremiereDate.HasValue && e.DateCreated != e.PremiereDate.Value).Count() + + movies.Where(m => m.PremiereDate.HasValue && m.DateCreated != m.PremiereDate.Value).Count(); + + _logger.Info($"NFOGuard :: {itemsNeedingSync} items need date synchronization"); + + // Check free tier limits + if (!_freeTierManager.CanProcessItems(itemsNeedingSync, out string reason)) + { + _logger.Info($"NFOGuard :: {reason}"); + + // In free tier, process only what we can + var pluginConfig = Plugin.Instance.Configuration; + if (pluginConfig.MonthlyProcessingLimit > 0 && !pluginConfig.LicenseValid) + { + var allowedCount = Math.Max(0, pluginConfig.MonthlyProcessingLimit - pluginConfig.ProcessedThisMonth); + _logger.Info($"NFOGuard :: Free tier: Processing {allowedCount} items only"); + + if (allowedCount == 0) + { + _logger.Info("NFOGuard :: Free tier limit reached. No items will be processed this month."); + return; + } + } + } + var processedCount = 0; var updatedCount = 0; + var config = Plugin.Instance.Configuration; + var remainingQuota = config.MonthlyProcessingLimit > 0 && !config.LicenseValid + ? Math.Max(0, config.MonthlyProcessingLimit - config.ProcessedThisMonth) + : int.MaxValue; // Process episodes - for (int i = 0; i < episodes.Count; i++) + for (int i = 0; i < episodes.Count && (config.LicenseValid || remainingQuota > 0); i++) { cancellationToken.ThrowIfCancellationRequested(); var episode = episodes[i]; try { + // Always log detailed info to diagnose the issue + if (Plugin.Instance.Configuration.LogVerbose) + _logger.Info($"NFOGuard :: Episode: {episode.Name} :: " + + $"PremiereDate: {episode.PremiereDate?.ToString("yyyy-MM-dd HH:mm:ss") ?? "NULL"}, " + + $"DateCreated: {episode.DateCreated.ToString("yyyy-MM-dd HH:mm:ss")}"); + if (episode.PremiereDate.HasValue && episode.DateCreated != episode.PremiereDate.Value) { - if (Plugin.Instance.Configuration.LogVerbose) - _logger.Info($"NFOGuard :: Syncing episode: {episode.Name} :: " + - $"PremiereDate: {episode.PremiereDate.Value}, DateCreated: {episode.DateCreated}"); + _logger.Info($"NFOGuard :: SYNCING episode: {episode.Name} :: " + + $"PremiereDate: {episode.PremiereDate.Value}, DateCreated: {episode.DateCreated}"); episode.DateCreated = episode.PremiereDate.Value; episode.UpdateToRepository(ItemUpdateType.MetadataEdit); updatedCount++; + + // Track usage and decrement quota + _freeTierManager.RecordProcessedItems(1); + if (!config.LicenseValid && config.MonthlyProcessingLimit > 0) + { + remainingQuota--; + } + } + else if (!episode.PremiereDate.HasValue) + { + if (Plugin.Instance.Configuration.LogVerbose) + _logger.Info($"NFOGuard :: Episode {episode.Name} has no PremiereDate - skipping"); + } + else + { + if (Plugin.Instance.Configuration.LogVerbose) + _logger.Info($"NFOGuard :: Episode {episode.Name} dates already match - no sync needed"); } processedCount++; @@ -94,23 +148,45 @@ namespace NFOGuard.Emby.Plugin } // Process movies - for (int i = 0; i < movies.Count; i++) + for (int i = 0; i < movies.Count && (config.LicenseValid || remainingQuota > 0); i++) { cancellationToken.ThrowIfCancellationRequested(); var movie = movies[i]; try { + // Always log detailed info to diagnose the issue + if (Plugin.Instance.Configuration.LogVerbose) + _logger.Info($"NFOGuard :: Movie: {movie.Name} :: " + + $"PremiereDate: {movie.PremiereDate?.ToString("yyyy-MM-dd HH:mm:ss") ?? "NULL"}, " + + $"DateCreated: {movie.DateCreated.ToString("yyyy-MM-dd HH:mm:ss")}"); + if (movie.PremiereDate.HasValue && movie.DateCreated != movie.PremiereDate.Value) { - if (Plugin.Instance.Configuration.LogVerbose) - _logger.Info($"NFOGuard :: Syncing movie: {movie.Name} :: " + - $"PremiereDate: {movie.PremiereDate.Value}, DateCreated: {movie.DateCreated}"); + _logger.Info($"NFOGuard :: SYNCING movie: {movie.Name} :: " + + $"PremiereDate: {movie.PremiereDate.Value}, DateCreated: {movie.DateCreated}"); movie.DateCreated = movie.PremiereDate.Value; movie.UpdateToRepository(ItemUpdateType.MetadataEdit); updatedCount++; + + // Track usage and decrement quota + _freeTierManager.RecordProcessedItems(1); + if (!config.LicenseValid && config.MonthlyProcessingLimit > 0) + { + remainingQuota--; + } + } + else if (!movie.PremiereDate.HasValue) + { + if (Plugin.Instance.Configuration.LogVerbose) + _logger.Info($"NFOGuard :: Movie {movie.Name} has no PremiereDate - skipping"); + } + else + { + if (Plugin.Instance.Configuration.LogVerbose) + _logger.Info($"NFOGuard :: Movie {movie.Name} dates already match - no sync needed"); } processedCount++; diff --git a/NFOGuard.Emby.Plugin/Plugin.cs b/NFOGuard.Emby.Plugin/Plugin.cs index 9e9ff4b..51626b6 100644 --- a/NFOGuard.Emby.Plugin/Plugin.cs +++ b/NFOGuard.Emby.Plugin/Plugin.cs @@ -1,49 +1,139 @@ 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, IHasThumbImage + public class Plugin : BasePlugin { - private Guid _id = new Guid("A1B2C3D4-5678-9ABC-DEF0-123456789ABC"); + private Guid _id = new Guid("B2C3D4E5-6789-ABCD-EF01-23456789ABCE"); // Completely new GUID to clear cache - public override string Name => "NFOGuard"; + 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 => "nfoguard.xml"; - - public ImageFormat ThumbImageFormat => ImageFormat.Png; + public override string ConfigurationFileName => "datesync.xml"; public static Plugin Instance { get; private set; } - public Stream GetThumbImage() - { - var type = GetType(); - return type.Assembly.GetManifestResourceStream(type.Namespace + ".thumb.png"); - } - 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; } = false; + public bool LogVerbose { get; set; } = true; // Enabled by default for diagnostic version public bool LicenseValid { get; set; } = false; - public string LicenseKey { get; set; } = string.Empty; + 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; } } \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/PluginEntryPoint.cs b/NFOGuard.Emby.Plugin/PluginEntryPoint.cs index d70ea35..40e6251 100644 --- a/NFOGuard.Emby.Plugin/PluginEntryPoint.cs +++ b/NFOGuard.Emby.Plugin/PluginEntryPoint.cs @@ -26,6 +26,9 @@ namespace NFOGuard.Emby.Plugin try { + // Initialize tier settings based on build configuration + InitializeTierSettings(); + _eventHandler = new LibraryEventHandler(_libraryManager, _itemRepository, _logger); _logger.Info("NFOGuard :: Event handlers registered successfully"); } @@ -35,6 +38,58 @@ namespace NFOGuard.Emby.Plugin } } + private void InitializeTierSettings() + { + var freeTierManager = new FreeTierManager(_logger, _libraryManager); + var config = Plugin.Instance.Configuration; + + // Initialize as percentage-based free tier by default if not configured + if (config.MonthlyProcessingLimit == 0 && !config.LicenseValid) + { + freeTierManager.SetPercentageBasedLimits(); // 2% episodes, 5% movies + _logger.Info("NFOGuard :: Free tier initialized - 2% of TV episodes + 5% of movies per month. Subscribe to unlock unlimited processing."); + } + else if (config.LicenseValid) + { + _logger.Info("NFOGuard :: Licensed version active - unlimited processing enabled"); + } + else + { + _logger.Info($"NFOGuard :: Free tier active - {freeTierManager.GetUsageInfo()}"); + } + + // Start periodic license checking + StartPeriodicLicenseCheck(); + } + + private async void StartPeriodicLicenseCheck() + { + try + { + // Check every 24 hours for subscription changes + var timer = new System.Threading.Timer(async _ => + { + try + { + var licenseManager = new LicenseManager(_logger); + await licenseManager.CheckAndActivateLicenseAsync(); + + var config = Plugin.Instance.Configuration; + config.LastLicenseCheck = DateTime.UtcNow; + Plugin.Instance.SaveConfiguration(); + } + catch (Exception ex) + { + _logger.ErrorException("NFOGuard :: Periodic license check failed", ex); + } + }, null, TimeSpan.FromHours(1), TimeSpan.FromHours(24)); // First check in 1 hour, then every 24 hours + } + catch (Exception ex) + { + _logger.ErrorException("NFOGuard :: Failed to start periodic license check", ex); + } + } + public void Dispose() { _logger.Info("NFOGuard :: Plugin shutting down"); diff --git a/NFOGuard.Emby.Plugin/bin/Release/net48/Microsoft.Bcl.AsyncInterfaces.dll b/NFOGuard.Emby.Plugin/bin/Release/net48/Microsoft.Bcl.AsyncInterfaces.dll new file mode 100755 index 0000000..476f1b1 Binary files /dev/null and b/NFOGuard.Emby.Plugin/bin/Release/net48/Microsoft.Bcl.AsyncInterfaces.dll differ diff --git a/NFOGuard.Emby.Plugin/bin/Release/net48/NFOGuard.Emby.Plugin.dll b/NFOGuard.Emby.Plugin/bin/Release/net48/NFOGuard.Emby.Plugin.dll index 2b50630..041dfd7 100644 Binary files a/NFOGuard.Emby.Plugin/bin/Release/net48/NFOGuard.Emby.Plugin.dll and b/NFOGuard.Emby.Plugin/bin/Release/net48/NFOGuard.Emby.Plugin.dll differ diff --git a/NFOGuard.Emby.Plugin/bin/Release/net48/NFOGuard.Emby.Plugin.pdb b/NFOGuard.Emby.Plugin/bin/Release/net48/NFOGuard.Emby.Plugin.pdb index 810d2cd..fdc70bd 100644 Binary files a/NFOGuard.Emby.Plugin/bin/Release/net48/NFOGuard.Emby.Plugin.pdb and b/NFOGuard.Emby.Plugin/bin/Release/net48/NFOGuard.Emby.Plugin.pdb differ diff --git a/NFOGuard.Emby.Plugin/bin/Release/net48/System.Runtime.CompilerServices.Unsafe.dll b/NFOGuard.Emby.Plugin/bin/Release/net48/System.Runtime.CompilerServices.Unsafe.dll index de9e124..c5ba4e4 100755 Binary files a/NFOGuard.Emby.Plugin/bin/Release/net48/System.Runtime.CompilerServices.Unsafe.dll and b/NFOGuard.Emby.Plugin/bin/Release/net48/System.Runtime.CompilerServices.Unsafe.dll differ diff --git a/NFOGuard.Emby.Plugin/bin/Release/net48/System.Text.Encodings.Web.dll b/NFOGuard.Emby.Plugin/bin/Release/net48/System.Text.Encodings.Web.dll new file mode 100755 index 0000000..a85aa43 Binary files /dev/null and b/NFOGuard.Emby.Plugin/bin/Release/net48/System.Text.Encodings.Web.dll differ diff --git a/NFOGuard.Emby.Plugin/bin/Release/net48/System.Text.Json.dll b/NFOGuard.Emby.Plugin/bin/Release/net48/System.Text.Json.dll new file mode 100755 index 0000000..5d04fad Binary files /dev/null and b/NFOGuard.Emby.Plugin/bin/Release/net48/System.Text.Json.dll differ diff --git a/NFOGuard.Emby.Plugin/bin/Release/net48/System.Threading.Tasks.Extensions.dll b/NFOGuard.Emby.Plugin/bin/Release/net48/System.Threading.Tasks.Extensions.dll new file mode 100755 index 0000000..eeec928 Binary files /dev/null and b/NFOGuard.Emby.Plugin/bin/Release/net48/System.Threading.Tasks.Extensions.dll differ diff --git a/NFOGuard.Emby.Plugin/bin/Release/net48/System.ValueTuple.dll b/NFOGuard.Emby.Plugin/bin/Release/net48/System.ValueTuple.dll new file mode 100755 index 0000000..4ce28fd Binary files /dev/null and b/NFOGuard.Emby.Plugin/bin/Release/net48/System.ValueTuple.dll differ diff --git a/NFOGuard.Emby.Plugin/build-automatic.sh b/NFOGuard.Emby.Plugin/build-automatic.sh new file mode 100755 index 0000000..21cc1e9 --- /dev/null +++ b/NFOGuard.Emby.Plugin/build-automatic.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +echo "Building NFOGuard Emby Plugin - Automatic Subscription System" +echo "============================================================" +echo "๐Ÿ”ฅ Like TimeLord - No manual keys, automatic activation!" +echo "" + +# Clean previous builds +rm -rf bin obj + +echo "Building automatic subscription version..." + +# Build unified version with automatic licensing +dotnet build NFOGuard.Emby.Plugin.csproj -c Release -f net48 + +if [ $? -eq 0 ]; then + # Create version directory + mkdir -p ../releases/v2.0.0-automatic + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../releases/v2.0.0-automatic/ + + # Copy to main plugin-release directory + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../plugin-release/ + + echo "โœ… Automatic subscription version built successfully" + echo "" + echo "๐ŸŽ‰ NFOGuard v2.0.0-automatic ready!" + echo "" + echo "๐Ÿ”ง How It Works:" + echo "1. Plugin installs with percentage-based free tier:" + echo " โ€ข 2% of your TV episodes per month" + echo " โ€ข 5% of your movies per month" + echo " โ€ข Scheduled processing only (no real-time)" + echo "" + echo "2. Users register with email (optional but recommended)" + echo "3. Subscribe via Patreon or PayPal recurring" + echo "4. Plugin automatically detects subscription within 24hrs" + echo "5. Unlimited processing + real-time sync unlocked" + echo "" + echo "๐Ÿ’ณ Payment Options:" + echo "โ€ข Patreon: https://patreon.com/nfoguard (recommended)" + echo "โ€ข PayPal Recurring: https://nfoguard.com/paypal" + echo "" + echo "๐Ÿ”’ Security Features:" + echo "โ€ข Machine ID based activation (harder to crack)" + echo "โ€ข Server-side subscription validation" + echo "โ€ข Automatic deactivation if subscription expires" + echo "โ€ข Offline mode graceful fallback to free tier" + echo "" + echo "๐Ÿ“Š API Endpoints Needed (nfoguard.com):" + echo "โ€ข POST /api/register - Machine registration" + echo "โ€ข GET /api/patreon/check?machine_id=XXX - Patreon validation" + echo "โ€ข GET /api/paypal/check?machine_id=XXX - PayPal validation" + echo "" + echo "File ready: releases/v2.0.0-automatic/NFOGuard.Emby.Plugin.dll" +else + echo "โŒ Build failed" + exit 1 +fi \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/build-clean.sh b/NFOGuard.Emby.Plugin/build-clean.sh new file mode 100755 index 0000000..a22250e --- /dev/null +++ b/NFOGuard.Emby.Plugin/build-clean.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +echo "Building DateSync Emby Plugin - Clean Version" +echo "=============================================" +echo "Completely different plugin name to avoid Emby cache issues" +echo "" + +# Clean previous builds +rm -rf bin obj + +echo "Building clean version with new name..." + +# Build clean version +dotnet build NFOGuard.Emby.Plugin.csproj -c Release -f net48 + +if [ $? -eq 0 ]; then + # Create version directory + mkdir -p ../releases/v1.0.4-clean + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../releases/v1.0.4-clean/DateSync.Emby.Plugin.dll + + # Copy to main plugin-release directory with new name + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../plugin-release/DateSync.Emby.Plugin.dll + + echo "โœ… Clean version built successfully" + echo "" + echo "๐Ÿงน DateSync v1.0.4-clean ready!" + echo "" + echo "IMPORTANT CHANGES:" + echo "โ€ข Plugin name: NFOGuard โ†’ DateSync" + echo "โ€ข Config file: nfoguard.xml โ†’ datesync.xml" + echo "โ€ข Task name: NFOGuard Date Sync โ†’ DateSync Task" + echo "โ€ข DLL name: DateSync.Emby.Plugin.dll" + echo "โ€ข New GUID: Completely different from NFOGuard" + echo "" + echo "This should avoid ALL cached references!" + echo "" + echo "Usage:" + echo "1. Stop Emby Server" + echo "2. DELETE old NFOGuard.Emby.Plugin.dll completely" + echo "3. DELETE /config/data/nfoguard.xml if exists" + echo "4. Clear browser cache completely" + echo "5. Install DateSync.Emby.Plugin.dll" + echo "6. Start Emby Server" + echo "7. Look for 'DateSync Task' in scheduled tasks" + echo "" + echo "Files ready:" + echo "โ€ข releases/v1.0.4-clean/DateSync.Emby.Plugin.dll" + echo "โ€ข plugin-release/DateSync.Emby.Plugin.dll (for deployment)" +else + echo "โŒ Build failed" + exit 1 +fi \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/build-debug.sh b/NFOGuard.Emby.Plugin/build-debug.sh new file mode 100755 index 0000000..b79e3da --- /dev/null +++ b/NFOGuard.Emby.Plugin/build-debug.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +echo "Building NFOGuard Emby Plugin - Debug Version" +echo "=============================================" +echo "Clean diagnostic version with debug enabled by default" +echo "" + +# Clean previous builds +rm -rf bin obj + +echo "Building debug version..." + +# Build debug version +dotnet build NFOGuard.Emby.Plugin.csproj -c Release -f net48 + +if [ $? -eq 0 ]; then + # Create version directory + mkdir -p ../releases/v1.0.2-debug + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../releases/v1.0.2-debug/ + + # Copy to main plugin-release directory for easy deployment + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../plugin-release/ + + echo "โœ… Debug version built successfully" + echo "" + echo "๐Ÿ” NFOGuard v1.0.2-debug ready!" + echo "" + echo "Features:" + echo "โ€ข Debug logging ENABLED by default" + echo "โ€ข No configuration page (no crashes)" + echo "โ€ข Enhanced episode/movie date diagnostics" + echo "โ€ข Shows PremiereDate vs DateCreated for every item" + echo "โ€ข Explains why episodes are skipped" + echo "" + echo "Usage:" + echo "1. Replace plugin DLL and restart Emby" + echo "2. Run 'NFOGuard Date Sync' scheduled task" + echo "3. Check Emby logs for detailed output" + echo "" + echo "Files ready:" + echo "โ€ข releases/v1.0.2-debug/NFOGuard.Emby.Plugin.dll" + echo "โ€ข plugin-release/NFOGuard.Emby.Plugin.dll (for deployment)" +else + echo "โŒ Build failed" + exit 1 +fi \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/build-diagnostic-safe.sh b/NFOGuard.Emby.Plugin/build-diagnostic-safe.sh new file mode 100755 index 0000000..8944a24 --- /dev/null +++ b/NFOGuard.Emby.Plugin/build-diagnostic-safe.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +echo "Building NFOGuard Emby Plugin - Safe Diagnostic Version" +echo "=======================================================" +echo "Enhanced logging WITHOUT configuration page (to avoid crashes)" +echo "" + +# Disable configuration page temporarily +mv PluginConfigurationPage.cs PluginConfigurationPage.cs.disabled 2>/dev/null || true + +# Comment out the config page in project file +sed -i 's|||' NFOGuard.Emby.Plugin.csproj + +# Clean previous builds +rm -rf bin obj + +echo "Building safe diagnostic version (no config page)..." + +# Build diagnostic version +dotnet build NFOGuard.Emby.Plugin.csproj -c Release -f net48 + +if [ $? -eq 0 ]; then + # Create version directory + mkdir -p ../releases/v1.0.1-diagnostic-safe + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../releases/v1.0.1-diagnostic-safe/ + + echo "โœ… Safe diagnostic version built successfully" + echo "" + echo "๐Ÿ” NFOGuard v1.0.1-diagnostic-safe ready!" + echo "" + echo "This version includes:" + echo "โ€ข Enhanced diagnostic logging" + echo "โ€ข NO configuration page (avoids crashes)" + echo "โ€ข LogVerbose is ENABLED by default" + echo "โ€ข All other settings use defaults" + echo "" + echo "Safe to use without risk of configuration crashes!" + echo "" + echo "File ready: releases/v1.0.1-diagnostic-safe/NFOGuard.Emby.Plugin.dll" +else + echo "โŒ Build failed" +fi + +# Restore configuration page files +mv PluginConfigurationPage.cs.disabled PluginConfigurationPage.cs 2>/dev/null || true +sed -i 's|||' NFOGuard.Emby.Plugin.csproj \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/build-diagnostic.sh b/NFOGuard.Emby.Plugin/build-diagnostic.sh new file mode 100755 index 0000000..a4471ca --- /dev/null +++ b/NFOGuard.Emby.Plugin/build-diagnostic.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +echo "Building NFOGuard Emby Plugin - Diagnostic Version" +echo "===================================================" +echo "Enhanced logging to diagnose NFO date reading issue" +echo "" + +# Clean previous builds +rm -rf bin obj + +echo "Building diagnostic version..." + +# Build diagnostic version +dotnet build NFOGuard.Emby.Plugin.csproj -c Release -f net48 + +if [ $? -eq 0 ]; then + # Create version directory + mkdir -p ../releases/v1.0.1-diagnostic + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../releases/v1.0.1-diagnostic/ + + # Copy to main plugin-release directory + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../plugin-release/ + + echo "โœ… Diagnostic version built successfully" + echo "" + echo "๐Ÿ” NFOGuard v1.0.1-diagnostic ready!" + echo "" + echo "This version includes enhanced logging to show:" + echo "โ€ข PremiereDate values for every episode/movie" + echo "โ€ข DateCreated values for comparison" + echo "โ€ข Reason why episodes are skipped (no PremiereDate vs already synced)" + echo "" + echo "To use:" + echo "1. Replace your current plugin DLL" + echo "2. Enable 'LogVerbose' in plugin settings" + echo "3. Run the scheduled task" + echo "4. Check Emby logs for detailed date information" + echo "" + echo "File ready: releases/v1.0.1-diagnostic/NFOGuard.Emby.Plugin.dll" +else + echo "โŒ Build failed" + exit 1 +fi \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/build-minimal.sh b/NFOGuard.Emby.Plugin/build-minimal.sh new file mode 100755 index 0000000..73f862a --- /dev/null +++ b/NFOGuard.Emby.Plugin/build-minimal.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +echo "Building NFOGuard Emby Plugin - Minimal Version" +echo "===============================================" +echo "No web components, no thumbnails, no config pages - just core functionality" +echo "" + +# Clean previous builds +rm -rf bin obj + +echo "Building minimal version..." + +# Build minimal version +dotnet build NFOGuard.Emby.Plugin.csproj -c Release -f net48 + +if [ $? -eq 0 ]; then + # Create version directory + mkdir -p ../releases/v1.0.3-minimal + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../releases/v1.0.3-minimal/ + + # Copy to main plugin-release directory for easy deployment + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../plugin-release/ + + echo "โœ… Minimal version built successfully" + echo "" + echo "๐Ÿ” NFOGuard v1.0.3-minimal ready!" + echo "" + echo "Features:" + echo "โ€ข Debug logging ENABLED by default" + echo "โ€ข NO web components (no UI loading issues)" + echo "โ€ข NO configuration page" + echo "โ€ข NO thumbnails or embedded resources" + echo "โ€ข Core functionality only" + echo "โ€ข New GUID to clear Emby cache completely" + echo "" + echo "This version should NOT cause web UI loading issues!" + echo "" + echo "Usage:" + echo "1. Remove old plugin DLL completely" + echo "2. Clear browser cache" + echo "3. Install new minimal DLL and restart Emby" + echo "4. Web UI should load normally" + echo "5. Run 'NFOGuard Date Sync' scheduled task" + echo "" + echo "Files ready:" + echo "โ€ข releases/v1.0.3-minimal/NFOGuard.Emby.Plugin.dll" + echo "โ€ข plugin-release/NFOGuard.Emby.Plugin.dll (for deployment)" +else + echo "โŒ Build failed" + exit 1 +fi \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/build-unified.sh b/NFOGuard.Emby.Plugin/build-unified.sh new file mode 100755 index 0000000..d2fd5eb --- /dev/null +++ b/NFOGuard.Emby.Plugin/build-unified.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +echo "Building NFOGuard Emby Plugin - Unified Version" +echo "===============================================" +echo "Single DLL with license key activation system" +echo "" + +# Clean previous builds +rm -rf bin obj + +echo "Building unified version..." + +# Build unified version without any defines +dotnet build NFOGuard.Emby.Plugin.csproj -c Release -f net48 + +if [ $? -eq 0 ]; then + # Create version directory + mkdir -p ../releases/v1.3.0-unified + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../releases/v1.3.0-unified/ + + # Copy to main plugin-release directory + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../plugin-release/ + + echo "โœ… Unified version built successfully" + echo "" + echo "๐ŸŽ‰ NFOGuard v1.3.0-unified ready!" + echo "" + echo "Features:" + echo "๐Ÿ†“ Free Tier: 500 items/month, scheduled processing only" + echo "๐Ÿ”‘ License Activation: Unlimited processing with valid license key" + echo "๐Ÿ’ณ Payment Integration: Supports PayPal/Patreon transaction IDs" + echo "๐Ÿ“Š Usage Tracking: Monthly quota with automatic reset" + echo "" + echo "License Key Formats Supported:" + echo "- NFOG-XXXX-XXXX-XXXX (generated keys)" + echo "- PAYPAL-[transaction-id] (PayPal payments)" + echo "- PATREON-[transaction-id] (Patreon subscriptions)" + echo "" + echo "File ready: releases/v1.3.0-unified/NFOGuard.Emby.Plugin.dll" +else + echo "โŒ Build failed" + exit 1 +fi \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/build-versions.sh b/NFOGuard.Emby.Plugin/build-versions.sh new file mode 100755 index 0000000..f07ba27 --- /dev/null +++ b/NFOGuard.Emby.Plugin/build-versions.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +echo "Building NFOGuard Emby Plugin - All Versions" +echo "=============================================" + +# Clean previous builds +rm -rf bin obj releases-temp + +# Create temporary releases directory +mkdir -p releases-temp + +echo "" +echo "1. Building Free Tier Version (v1.1.0-free-tier)" +echo "=================================================" + +# Build free tier version with FREE_TIER define +dotnet build NFOGuard.Emby.Plugin.csproj -c Release -f net48 -p:DefineConstants="FREE_TIER" + +if [ $? -eq 0 ]; then + mkdir -p ../releases/v1.1.0-free-tier + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../releases/v1.1.0-free-tier/ + echo "โœ… Free tier version built successfully" +else + echo "โŒ Free tier build failed" + exit 1 +fi + +echo "" +echo "2. Building Full Version (v1.2.0-production)" +echo "============================================" + +# Clean for full version build +rm -rf bin obj + +# Build full version without FREE_TIER define +dotnet build NFOGuard.Emby.Plugin.csproj -c Release -f net48 + +if [ $? -eq 0 ]; then + mkdir -p ../releases/v1.2.0-production + cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../releases/v1.2.0-production/ + echo "โœ… Production version built successfully" +else + echo "โŒ Production build failed" + exit 1 +fi + +echo "" +echo "3. Updating plugin-release with latest production version" +echo "========================================================" +cp bin/Release/net48/NFOGuard.Emby.Plugin.dll ../plugin-release/ + +echo "" +echo "๐ŸŽ‰ All versions built successfully!" +echo "" +echo "Available versions:" +echo "๐Ÿ“ฆ v1.0.0-working : Original working version (unlimited)" +echo "๐Ÿ†“ v1.1.0-free-tier : Free tier (500 items/month, no real-time)" +echo "๐Ÿ’Ž v1.2.0-production : Full version (unlimited, all features)" +echo "" +echo "Files ready in releases/ directory" \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/obj/NFOGuard.Emby.Plugin.csproj.nuget.dgspec.json b/NFOGuard.Emby.Plugin/obj/NFOGuard.Emby.Plugin.csproj.nuget.dgspec.json index d51a862..6dca161 100644 --- a/NFOGuard.Emby.Plugin/obj/NFOGuard.Emby.Plugin.csproj.nuget.dgspec.json +++ b/NFOGuard.Emby.Plugin/obj/NFOGuard.Emby.Plugin.csproj.nuget.dgspec.json @@ -52,6 +52,14 @@ "System.Memory": { "target": "Package", "version": "[4.5.5, )" + }, + "System.Net.Http": { + "target": "Package", + "version": "[4.3.4, )" + }, + "System.Text.Json": { + "target": "Package", + "version": "[6.0.0, )" } }, "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/8.0.414/RuntimeIdentifierGraph.json" diff --git a/NFOGuard.Emby.Plugin/obj/NFOGuard.Emby.Plugin.csproj.nuget.g.targets b/NFOGuard.Emby.Plugin/obj/NFOGuard.Emby.Plugin.csproj.nuget.g.targets index 7f5172a..9633e69 100644 --- a/NFOGuard.Emby.Plugin/obj/NFOGuard.Emby.Plugin.csproj.nuget.g.targets +++ b/NFOGuard.Emby.Plugin/obj/NFOGuard.Emby.Plugin.csproj.nuget.g.targets @@ -1,6 +1,7 @@ ๏ปฟ + \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.assets.cache b/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.assets.cache index f3a616c..00e23b0 100644 Binary files a/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.assets.cache and b/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.assets.cache differ diff --git a/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.AssemblyReference.cache b/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.AssemblyReference.cache index 8c05756..2181e0a 100644 Binary files a/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.AssemblyReference.cache and b/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.AssemblyReference.cache differ diff --git a/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.CoreCompileInputs.cache b/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.CoreCompileInputs.cache index 2571ca1..130c9c7 100644 --- a/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.CoreCompileInputs.cache +++ b/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -bc9346eb5351b08e69d51772894aaede4c86d42a30ba9df1c921e5156198813e +ac9b1d05d1517a7c47b07fdf8111e5c0cb41b1f211b4f061f560a7f28e99067e diff --git a/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.FileListAbsolute.txt b/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.FileListAbsolute.txt index ab3e3e7..a5de1b9 100644 --- a/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.FileListAbsolute.txt +++ b/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.FileListAbsolute.txt @@ -1,9 +1,14 @@ /home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/bin/Release/net48/NFOGuard.Emby.Plugin.dll /home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/bin/Release/net48/NFOGuard.Emby.Plugin.pdb +/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/bin/Release/net48/Microsoft.Bcl.AsyncInterfaces.dll /home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/bin/Release/net48/System.Buffers.dll /home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/bin/Release/net48/System.Memory.dll /home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/bin/Release/net48/System.Numerics.Vectors.dll /home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/bin/Release/net48/System.Runtime.CompilerServices.Unsafe.dll +/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/bin/Release/net48/System.Text.Encodings.Web.dll +/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/bin/Release/net48/System.Text.Json.dll +/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/bin/Release/net48/System.Threading.Tasks.Extensions.dll +/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/bin/Release/net48/System.ValueTuple.dll /home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.AssemblyReference.cache /home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.GeneratedMSBuildEditorConfig.editorconfig /home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.csproj.CoreCompileInputs.cache diff --git a/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.dll b/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.dll index 2b50630..041dfd7 100644 Binary files a/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.dll and b/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.dll differ diff --git a/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.pdb b/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.pdb index 810d2cd..fdc70bd 100644 Binary files a/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.pdb and b/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.pdb differ diff --git a/NFOGuard.Emby.Plugin/obj/project.assets.json b/NFOGuard.Emby.Plugin/obj/project.assets.json index a697a0f..bb3c5bb 100644 --- a/NFOGuard.Emby.Plugin/obj/project.assets.json +++ b/NFOGuard.Emby.Plugin/obj/project.assets.json @@ -2,6 +2,22 @@ "version": 3, "targets": { ".NETFramework,Version=v4.8": { + "Microsoft.Bcl.AsyncInterfaces/6.0.0": { + "type": "package", + "dependencies": { + "System.Threading.Tasks.Extensions": "4.5.4" + }, + "compile": { + "lib/net461/Microsoft.Bcl.AsyncInterfaces.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net461/Microsoft.Bcl.AsyncInterfaces.dll": { + "related": ".xml" + } + } + }, "Microsoft.NETFramework.ReferenceAssemblies/1.0.3": { "type": "package", "dependencies": { @@ -30,6 +46,19 @@ } } }, + "System.IO/4.3.0": { + "type": "package", + "frameworkAssemblies": [ + "System", + "mscorlib" + ], + "compile": { + "ref/net462/System.IO.dll": {} + }, + "runtime": { + "lib/net462/System.IO.dll": {} + } + }, "System.Memory/4.5.5": { "type": "package", "dependencies": { @@ -52,6 +81,33 @@ } } }, + "System.Net.Http/4.3.4": { + "type": "package", + "dependencies": { + "System.Security.Cryptography.X509Certificates": "4.3.0" + }, + "frameworkAssemblies": [ + "System", + "System.Core", + "mscorlib" + ], + "compile": { + "ref/net46/System.Net.Http.dll": {} + }, + "runtime": { + "lib/net46/System.Net.Http.dll": {} + }, + "runtimeTargets": { + "runtimes/unix/lib/netstandard1.6/System.Net.Http.dll": { + "assetType": "runtime", + "rid": "unix" + }, + "runtimes/win/lib/net46/System.Net.Http.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, "System.Numerics.Vectors/4.5.0": { "type": "package", "frameworkAssemblies": [ @@ -69,13 +125,28 @@ } } }, - "System.Runtime.CompilerServices.Unsafe/4.5.3": { + "System.Runtime/4.3.0": { + "type": "package", + "frameworkAssemblies": [ + "System", + "System.ComponentModel.Composition", + "System.Core", + "mscorlib" + ], + "compile": { + "ref/net462/System.Runtime.dll": {} + }, + "runtime": { + "lib/net462/System.Runtime.dll": {} + } + }, + "System.Runtime.CompilerServices.Unsafe/6.0.0": { "type": "package", "frameworkAssemblies": [ "mscorlib" ], "compile": { - "ref/net461/System.Runtime.CompilerServices.Unsafe.dll": { + "lib/net461/System.Runtime.CompilerServices.Unsafe.dll": { "related": ".xml" } }, @@ -84,10 +155,204 @@ "related": ".xml" } } + }, + "System.Security.Cryptography.Algorithms/4.3.0": { + "type": "package", + "dependencies": { + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0" + }, + "frameworkAssemblies": [ + "System.Core", + "mscorlib" + ], + "compile": { + "ref/net463/System.Security.Cryptography.Algorithms.dll": {} + }, + "runtime": { + "lib/net463/System.Security.Cryptography.Algorithms.dll": {} + }, + "runtimeTargets": { + "runtimes/osx/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll": { + "assetType": "runtime", + "rid": "osx" + }, + "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll": { + "assetType": "runtime", + "rid": "unix" + }, + "runtimes/win/lib/net463/System.Security.Cryptography.Algorithms.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Security.Cryptography.Encoding/4.3.0": { + "type": "package", + "frameworkAssemblies": [ + "System", + "mscorlib" + ], + "compile": { + "ref/net46/System.Security.Cryptography.Encoding.dll": {} + }, + "runtime": { + "lib/net46/System.Security.Cryptography.Encoding.dll": {} + }, + "runtimeTargets": { + "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll": { + "assetType": "runtime", + "rid": "unix" + }, + "runtimes/win/lib/net46/System.Security.Cryptography.Encoding.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Security.Cryptography.Primitives/4.3.0": { + "type": "package", + "frameworkAssemblies": [ + "mscorlib" + ], + "compile": { + "ref/net46/System.Security.Cryptography.Primitives.dll": {} + }, + "runtime": { + "lib/net46/System.Security.Cryptography.Primitives.dll": {} + } + }, + "System.Security.Cryptography.X509Certificates/4.3.0": { + "type": "package", + "dependencies": { + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0" + }, + "frameworkAssemblies": [ + "System", + "System.Core", + "mscorlib" + ], + "compile": { + "ref/net461/System.Security.Cryptography.X509Certificates.dll": {} + }, + "runtime": { + "lib/net461/System.Security.Cryptography.X509Certificates.dll": {} + }, + "runtimeTargets": { + "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll": { + "assetType": "runtime", + "rid": "unix" + }, + "runtimes/win/lib/net461/System.Security.Cryptography.X509Certificates.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.Text.Encodings.Web/6.0.0": { + "type": "package", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + }, + "compile": { + "lib/net461/System.Text.Encodings.Web.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net461/System.Text.Encodings.Web.dll": { + "related": ".xml" + } + } + }, + "System.Text.Json/6.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Numerics.Vectors": "4.5.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0", + "System.Threading.Tasks.Extensions": "4.5.4", + "System.ValueTuple": "4.5.0" + }, + "compile": { + "lib/net461/System.Text.Json.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net461/System.Text.Json.dll": { + "related": ".xml" + } + }, + "build": { + "build/System.Text.Json.targets": {} + } + }, + "System.Threading.Tasks.Extensions/4.5.4": { + "type": "package", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + }, + "frameworkAssemblies": [ + "mscorlib" + ], + "compile": { + "lib/net461/System.Threading.Tasks.Extensions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net461/System.Threading.Tasks.Extensions.dll": { + "related": ".xml" + } + } + }, + "System.ValueTuple/4.5.0": { + "type": "package", + "frameworkAssemblies": [ + "mscorlib" + ], + "compile": { + "ref/net47/System.ValueTuple.dll": {} + }, + "runtime": { + "lib/net47/System.ValueTuple.dll": { + "related": ".xml" + } + } } } }, "libraries": { + "Microsoft.Bcl.AsyncInterfaces/6.0.0": { + "sha512": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==", + "type": "package", + "path": "microsoft.bcl.asyncinterfaces/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net461/Microsoft.Bcl.AsyncInterfaces.dll", + "lib/net461/Microsoft.Bcl.AsyncInterfaces.xml", + "lib/netstandard2.0/Microsoft.Bcl.AsyncInterfaces.dll", + "lib/netstandard2.0/Microsoft.Bcl.AsyncInterfaces.xml", + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll", + "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.xml", + "microsoft.bcl.asyncinterfaces.6.0.0.nupkg.sha512", + "microsoft.bcl.asyncinterfaces.nuspec", + "useSharedDesignerContext.txt" + ] + }, "Microsoft.NETFramework.ReferenceAssemblies/1.0.3": { "sha512": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==", "type": "package", @@ -510,6 +775,87 @@ "version.txt" ] }, + "System.IO/4.3.0": { + "sha512": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "type": "package", + "path": "system.io/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/net462/System.IO.dll", + "lib/portable-net45+win8+wp8+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/net462/System.IO.dll", + "ref/netcore50/System.IO.dll", + "ref/netcore50/System.IO.xml", + "ref/netcore50/de/System.IO.xml", + "ref/netcore50/es/System.IO.xml", + "ref/netcore50/fr/System.IO.xml", + "ref/netcore50/it/System.IO.xml", + "ref/netcore50/ja/System.IO.xml", + "ref/netcore50/ko/System.IO.xml", + "ref/netcore50/ru/System.IO.xml", + "ref/netcore50/zh-hans/System.IO.xml", + "ref/netcore50/zh-hant/System.IO.xml", + "ref/netstandard1.0/System.IO.dll", + "ref/netstandard1.0/System.IO.xml", + "ref/netstandard1.0/de/System.IO.xml", + "ref/netstandard1.0/es/System.IO.xml", + "ref/netstandard1.0/fr/System.IO.xml", + "ref/netstandard1.0/it/System.IO.xml", + "ref/netstandard1.0/ja/System.IO.xml", + "ref/netstandard1.0/ko/System.IO.xml", + "ref/netstandard1.0/ru/System.IO.xml", + "ref/netstandard1.0/zh-hans/System.IO.xml", + "ref/netstandard1.0/zh-hant/System.IO.xml", + "ref/netstandard1.3/System.IO.dll", + "ref/netstandard1.3/System.IO.xml", + "ref/netstandard1.3/de/System.IO.xml", + "ref/netstandard1.3/es/System.IO.xml", + "ref/netstandard1.3/fr/System.IO.xml", + "ref/netstandard1.3/it/System.IO.xml", + "ref/netstandard1.3/ja/System.IO.xml", + "ref/netstandard1.3/ko/System.IO.xml", + "ref/netstandard1.3/ru/System.IO.xml", + "ref/netstandard1.3/zh-hans/System.IO.xml", + "ref/netstandard1.3/zh-hant/System.IO.xml", + "ref/netstandard1.5/System.IO.dll", + "ref/netstandard1.5/System.IO.xml", + "ref/netstandard1.5/de/System.IO.xml", + "ref/netstandard1.5/es/System.IO.xml", + "ref/netstandard1.5/fr/System.IO.xml", + "ref/netstandard1.5/it/System.IO.xml", + "ref/netstandard1.5/ja/System.IO.xml", + "ref/netstandard1.5/ko/System.IO.xml", + "ref/netstandard1.5/ru/System.IO.xml", + "ref/netstandard1.5/zh-hans/System.IO.xml", + "ref/netstandard1.5/zh-hant/System.IO.xml", + "ref/portable-net45+win8+wp8+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.io.4.3.0.nupkg.sha512", + "system.io.nuspec" + ] + }, "System.Memory/4.5.5": { "sha512": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", "type": "package", @@ -533,6 +879,48 @@ "version.txt" ] }, + "System.Net.Http/4.3.4": { + "sha512": "aOa2d51SEbmM+H+Csw7yJOuNZoHkrP2XnAurye5HWYgGVVU54YZDvsLUYRv6h18X3sPnjNCANmN7ZhIPiqMcjA==", + "type": "package", + "path": "system.net.http/4.3.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/Xamarinmac20/_._", + "lib/monoandroid10/_._", + "lib/monotouch10/_._", + "lib/net45/_._", + "lib/net46/System.Net.Http.dll", + "lib/portable-net45+win8+wpa81/_._", + "lib/win8/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/Xamarinmac20/_._", + "ref/monoandroid10/_._", + "ref/monotouch10/_._", + "ref/net45/_._", + "ref/net46/System.Net.Http.dll", + "ref/netcore50/System.Net.Http.dll", + "ref/netstandard1.1/System.Net.Http.dll", + "ref/netstandard1.3/System.Net.Http.dll", + "ref/portable-net45+win8+wpa81/_._", + "ref/win8/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/unix/lib/netstandard1.6/System.Net.Http.dll", + "runtimes/win/lib/net46/System.Net.Http.dll", + "runtimes/win/lib/netcore50/System.Net.Http.dll", + "runtimes/win/lib/netstandard1.3/System.Net.Http.dll", + "system.net.http.4.3.4.nupkg.sha512", + "system.net.http.nuspec" + ] + }, "System.Numerics.Vectors/4.5.0": { "sha512": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==", "type": "package", @@ -580,31 +968,448 @@ "version.txt" ] }, - "System.Runtime.CompilerServices.Unsafe/4.5.3": { - "sha512": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==", + "System.Runtime/4.3.0": { + "sha512": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", "type": "package", - "path": "system.runtime.compilerservices.unsafe/4.5.3", + "path": "system.runtime/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/net462/System.Runtime.dll", + "lib/portable-net45+win8+wp80+wpa81/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/net462/System.Runtime.dll", + "ref/netcore50/System.Runtime.dll", + "ref/netcore50/System.Runtime.xml", + "ref/netcore50/de/System.Runtime.xml", + "ref/netcore50/es/System.Runtime.xml", + "ref/netcore50/fr/System.Runtime.xml", + "ref/netcore50/it/System.Runtime.xml", + "ref/netcore50/ja/System.Runtime.xml", + "ref/netcore50/ko/System.Runtime.xml", + "ref/netcore50/ru/System.Runtime.xml", + "ref/netcore50/zh-hans/System.Runtime.xml", + "ref/netcore50/zh-hant/System.Runtime.xml", + "ref/netstandard1.0/System.Runtime.dll", + "ref/netstandard1.0/System.Runtime.xml", + "ref/netstandard1.0/de/System.Runtime.xml", + "ref/netstandard1.0/es/System.Runtime.xml", + "ref/netstandard1.0/fr/System.Runtime.xml", + "ref/netstandard1.0/it/System.Runtime.xml", + "ref/netstandard1.0/ja/System.Runtime.xml", + "ref/netstandard1.0/ko/System.Runtime.xml", + "ref/netstandard1.0/ru/System.Runtime.xml", + "ref/netstandard1.0/zh-hans/System.Runtime.xml", + "ref/netstandard1.0/zh-hant/System.Runtime.xml", + "ref/netstandard1.2/System.Runtime.dll", + "ref/netstandard1.2/System.Runtime.xml", + "ref/netstandard1.2/de/System.Runtime.xml", + "ref/netstandard1.2/es/System.Runtime.xml", + "ref/netstandard1.2/fr/System.Runtime.xml", + "ref/netstandard1.2/it/System.Runtime.xml", + "ref/netstandard1.2/ja/System.Runtime.xml", + "ref/netstandard1.2/ko/System.Runtime.xml", + "ref/netstandard1.2/ru/System.Runtime.xml", + "ref/netstandard1.2/zh-hans/System.Runtime.xml", + "ref/netstandard1.2/zh-hant/System.Runtime.xml", + "ref/netstandard1.3/System.Runtime.dll", + "ref/netstandard1.3/System.Runtime.xml", + "ref/netstandard1.3/de/System.Runtime.xml", + "ref/netstandard1.3/es/System.Runtime.xml", + "ref/netstandard1.3/fr/System.Runtime.xml", + "ref/netstandard1.3/it/System.Runtime.xml", + "ref/netstandard1.3/ja/System.Runtime.xml", + "ref/netstandard1.3/ko/System.Runtime.xml", + "ref/netstandard1.3/ru/System.Runtime.xml", + "ref/netstandard1.3/zh-hans/System.Runtime.xml", + "ref/netstandard1.3/zh-hant/System.Runtime.xml", + "ref/netstandard1.5/System.Runtime.dll", + "ref/netstandard1.5/System.Runtime.xml", + "ref/netstandard1.5/de/System.Runtime.xml", + "ref/netstandard1.5/es/System.Runtime.xml", + "ref/netstandard1.5/fr/System.Runtime.xml", + "ref/netstandard1.5/it/System.Runtime.xml", + "ref/netstandard1.5/ja/System.Runtime.xml", + "ref/netstandard1.5/ko/System.Runtime.xml", + "ref/netstandard1.5/ru/System.Runtime.xml", + "ref/netstandard1.5/zh-hans/System.Runtime.xml", + "ref/netstandard1.5/zh-hant/System.Runtime.xml", + "ref/portable-net45+win8+wp80+wpa81/_._", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.runtime.4.3.0.nupkg.sha512", + "system.runtime.nuspec" + ] + }, + "System.Runtime.CompilerServices.Unsafe/6.0.0": { + "sha512": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==", + "type": "package", + "path": "system.runtime.compilerservices.unsafe/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/net461/System.Runtime.CompilerServices.Unsafe.dll", + "lib/net461/System.Runtime.CompilerServices.Unsafe.xml", + "lib/net6.0/System.Runtime.CompilerServices.Unsafe.dll", + "lib/net6.0/System.Runtime.CompilerServices.Unsafe.xml", + "lib/netcoreapp3.1/System.Runtime.CompilerServices.Unsafe.dll", + "lib/netcoreapp3.1/System.Runtime.CompilerServices.Unsafe.xml", + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", + "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512", + "system.runtime.compilerservices.unsafe.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Security.Cryptography.Algorithms/4.3.0": { + "sha512": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "type": "package", + "path": "system.security.cryptography.algorithms/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Security.Cryptography.Algorithms.dll", + "lib/net461/System.Security.Cryptography.Algorithms.dll", + "lib/net463/System.Security.Cryptography.Algorithms.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Security.Cryptography.Algorithms.dll", + "ref/net461/System.Security.Cryptography.Algorithms.dll", + "ref/net463/System.Security.Cryptography.Algorithms.dll", + "ref/netstandard1.3/System.Security.Cryptography.Algorithms.dll", + "ref/netstandard1.4/System.Security.Cryptography.Algorithms.dll", + "ref/netstandard1.6/System.Security.Cryptography.Algorithms.dll", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/osx/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll", + "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll", + "runtimes/win/lib/net46/System.Security.Cryptography.Algorithms.dll", + "runtimes/win/lib/net461/System.Security.Cryptography.Algorithms.dll", + "runtimes/win/lib/net463/System.Security.Cryptography.Algorithms.dll", + "runtimes/win/lib/netcore50/System.Security.Cryptography.Algorithms.dll", + "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll", + "system.security.cryptography.algorithms.4.3.0.nupkg.sha512", + "system.security.cryptography.algorithms.nuspec" + ] + }, + "System.Security.Cryptography.Encoding/4.3.0": { + "sha512": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "type": "package", + "path": "system.security.cryptography.encoding/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Security.Cryptography.Encoding.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Security.Cryptography.Encoding.dll", + "ref/netstandard1.3/System.Security.Cryptography.Encoding.dll", + "ref/netstandard1.3/System.Security.Cryptography.Encoding.xml", + "ref/netstandard1.3/de/System.Security.Cryptography.Encoding.xml", + "ref/netstandard1.3/es/System.Security.Cryptography.Encoding.xml", + "ref/netstandard1.3/fr/System.Security.Cryptography.Encoding.xml", + "ref/netstandard1.3/it/System.Security.Cryptography.Encoding.xml", + "ref/netstandard1.3/ja/System.Security.Cryptography.Encoding.xml", + "ref/netstandard1.3/ko/System.Security.Cryptography.Encoding.xml", + "ref/netstandard1.3/ru/System.Security.Cryptography.Encoding.xml", + "ref/netstandard1.3/zh-hans/System.Security.Cryptography.Encoding.xml", + "ref/netstandard1.3/zh-hant/System.Security.Cryptography.Encoding.xml", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll", + "runtimes/win/lib/net46/System.Security.Cryptography.Encoding.dll", + "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll", + "system.security.cryptography.encoding.4.3.0.nupkg.sha512", + "system.security.cryptography.encoding.nuspec" + ] + }, + "System.Security.Cryptography.Primitives/4.3.0": { + "sha512": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "type": "package", + "path": "system.security.cryptography.primitives/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Security.Cryptography.Primitives.dll", + "lib/netstandard1.3/System.Security.Cryptography.Primitives.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Security.Cryptography.Primitives.dll", + "ref/netstandard1.3/System.Security.Cryptography.Primitives.dll", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.security.cryptography.primitives.4.3.0.nupkg.sha512", + "system.security.cryptography.primitives.nuspec" + ] + }, + "System.Security.Cryptography.X509Certificates/4.3.0": { + "sha512": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "type": "package", + "path": "system.security.cryptography.x509certificates/4.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "ThirdPartyNotices.txt", + "dotnet_library_license.txt", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Security.Cryptography.X509Certificates.dll", + "lib/net461/System.Security.Cryptography.X509Certificates.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Security.Cryptography.X509Certificates.dll", + "ref/net461/System.Security.Cryptography.X509Certificates.dll", + "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.dll", + "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.3/de/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.3/es/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.3/fr/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.3/it/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.3/ja/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.3/ko/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.3/ru/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.3/zh-hans/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.3/zh-hant/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.dll", + "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.4/de/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.4/es/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.4/fr/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.4/it/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.4/ja/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.4/ko/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.4/ru/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.4/zh-hans/System.Security.Cryptography.X509Certificates.xml", + "ref/netstandard1.4/zh-hant/System.Security.Cryptography.X509Certificates.xml", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll", + "runtimes/win/lib/net46/System.Security.Cryptography.X509Certificates.dll", + "runtimes/win/lib/net461/System.Security.Cryptography.X509Certificates.dll", + "runtimes/win/lib/netcore50/System.Security.Cryptography.X509Certificates.dll", + "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll", + "system.security.cryptography.x509certificates.4.3.0.nupkg.sha512", + "system.security.cryptography.x509certificates.nuspec" + ] + }, + "System.Text.Encodings.Web/6.0.0": { + "sha512": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "type": "package", + "path": "system.text.encodings.web/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/netcoreapp2.0/System.Text.Encodings.Web.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/net461/System.Text.Encodings.Web.dll", + "lib/net461/System.Text.Encodings.Web.xml", + "lib/net6.0/System.Text.Encodings.Web.dll", + "lib/net6.0/System.Text.Encodings.Web.xml", + "lib/netcoreapp3.1/System.Text.Encodings.Web.dll", + "lib/netcoreapp3.1/System.Text.Encodings.Web.xml", + "lib/netstandard2.0/System.Text.Encodings.Web.dll", + "lib/netstandard2.0/System.Text.Encodings.Web.xml", + "runtimes/browser/lib/net6.0/System.Text.Encodings.Web.dll", + "runtimes/browser/lib/net6.0/System.Text.Encodings.Web.xml", + "system.text.encodings.web.6.0.0.nupkg.sha512", + "system.text.encodings.web.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Text.Json/6.0.0": { + "sha512": "zaJsHfESQvJ11vbXnNlkrR46IaMULk/gHxYsJphzSF+07kTjPHv+Oc14w6QEOfo3Q4hqLJgStUaYB9DBl0TmWg==", + "type": "package", + "path": "system.text.json/6.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "analyzers/dotnet/roslyn3.11/cs/System.Text.Json.SourceGeneration.dll", + "analyzers/dotnet/roslyn3.11/cs/cs/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/de/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/es/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/fr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/it/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ja/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ko/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pl/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/ru/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/tr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn3.11/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/System.Text.Json.SourceGeneration.dll", + "analyzers/dotnet/roslyn4.0/cs/cs/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/de/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/es/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/fr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/it/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ja/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ko/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pl/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/pt-BR/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/ru/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/tr/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hans/System.Text.Json.SourceGeneration.resources.dll", + "analyzers/dotnet/roslyn4.0/cs/zh-Hant/System.Text.Json.SourceGeneration.resources.dll", + "build/System.Text.Json.targets", + "buildTransitive/netcoreapp2.0/System.Text.Json.targets", + "buildTransitive/netcoreapp3.1/_._", + "lib/net461/System.Text.Json.dll", + "lib/net461/System.Text.Json.xml", + "lib/net6.0/System.Text.Json.dll", + "lib/net6.0/System.Text.Json.xml", + "lib/netcoreapp3.1/System.Text.Json.dll", + "lib/netcoreapp3.1/System.Text.Json.xml", + "lib/netstandard2.0/System.Text.Json.dll", + "lib/netstandard2.0/System.Text.Json.xml", + "system.text.json.6.0.0.nupkg.sha512", + "system.text.json.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Threading.Tasks.Extensions/4.5.4": { + "sha512": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", + "type": "package", + "path": "system.threading.tasks.extensions/4.5.4", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", - "lib/net461/System.Runtime.CompilerServices.Unsafe.dll", - "lib/net461/System.Runtime.CompilerServices.Unsafe.xml", - "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll", - "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.xml", - "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", - "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml", - "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", - "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", - "ref/net461/System.Runtime.CompilerServices.Unsafe.dll", - "ref/net461/System.Runtime.CompilerServices.Unsafe.xml", - "ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", - "ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml", - "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll", - "ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml", - "system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512", - "system.runtime.compilerservices.unsafe.nuspec", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net461/System.Threading.Tasks.Extensions.dll", + "lib/net461/System.Threading.Tasks.Extensions.xml", + "lib/netcoreapp2.1/_._", + "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll", + "lib/netstandard1.0/System.Threading.Tasks.Extensions.xml", + "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll", + "lib/netstandard2.0/System.Threading.Tasks.Extensions.xml", + "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll", + "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/netcoreapp2.1/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.threading.tasks.extensions.4.5.4.nupkg.sha512", + "system.threading.tasks.extensions.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.ValueTuple/4.5.0": { + "sha512": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==", + "type": "package", + "path": "system.valuetuple/4.5.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net461/System.ValueTuple.dll", + "lib/net461/System.ValueTuple.xml", + "lib/net47/System.ValueTuple.dll", + "lib/net47/System.ValueTuple.xml", + "lib/netcoreapp2.0/_._", + "lib/netstandard1.0/System.ValueTuple.dll", + "lib/netstandard1.0/System.ValueTuple.xml", + "lib/netstandard2.0/_._", + "lib/portable-net40+sl4+win8+wp8/System.ValueTuple.dll", + "lib/portable-net40+sl4+win8+wp8/System.ValueTuple.xml", + "lib/uap10.0.16299/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net461/System.ValueTuple.dll", + "ref/net47/System.ValueTuple.dll", + "ref/netcoreapp2.0/_._", + "ref/netstandard2.0/_._", + "ref/portable-net40+sl4+win8+wp8/System.ValueTuple.dll", + "ref/uap10.0.16299/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "ref/xamarintvos10/_._", + "ref/xamarinwatchos10/_._", + "system.valuetuple.4.5.0.nupkg.sha512", + "system.valuetuple.nuspec", "useSharedDesignerContext.txt", "version.txt" ] @@ -613,7 +1418,9 @@ "projectFileDependencyGroups": { ".NETFramework,Version=v4.8": [ "Microsoft.NETFramework.ReferenceAssemblies >= 1.0.3", - "System.Memory >= 4.5.5" + "System.Memory >= 4.5.5", + "System.Net.Http >= 4.3.4", + "System.Text.Json >= 6.0.0" ] }, "packageFolders": { @@ -667,10 +1474,30 @@ "System.Memory": { "target": "Package", "version": "[4.5.5, )" + }, + "System.Net.Http": { + "target": "Package", + "version": "[4.3.4, )" + }, + "System.Text.Json": { + "target": "Package", + "version": "[6.0.0, )" } }, "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/8.0.414/RuntimeIdentifierGraph.json" } } - } + }, + "logs": [ + { + "code": "NU1903", + "level": "Warning", + "warningLevel": 1, + "message": "Package 'System.Text.Json' 6.0.0 has a known high severity vulnerability, https://github.com/advisories/GHSA-8g4q-xg66-9fp4", + "libraryId": "System.Text.Json", + "targetGraphs": [ + ".NETFramework,Version=v4.8" + ] + } + ] } \ No newline at end of file diff --git a/NFOGuard.Emby.Plugin/obj/project.nuget.cache b/NFOGuard.Emby.Plugin/obj/project.nuget.cache index d4c5707..7161829 100644 --- a/NFOGuard.Emby.Plugin/obj/project.nuget.cache +++ b/NFOGuard.Emby.Plugin/obj/project.nuget.cache @@ -1,15 +1,38 @@ { "version": 2, - "dgSpecHash": "+Vupasg2dYE=", + "dgSpecHash": "1tbmKnFkad0=", "success": true, "projectFilePath": "/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/NFOGuard.Emby.Plugin.csproj", "expectedPackageFiles": [ + "/home/jskala/.nuget/packages/microsoft.bcl.asyncinterfaces/6.0.0/microsoft.bcl.asyncinterfaces.6.0.0.nupkg.sha512", "/home/jskala/.nuget/packages/microsoft.netframework.referenceassemblies/1.0.3/microsoft.netframework.referenceassemblies.1.0.3.nupkg.sha512", "/home/jskala/.nuget/packages/microsoft.netframework.referenceassemblies.net48/1.0.3/microsoft.netframework.referenceassemblies.net48.1.0.3.nupkg.sha512", "/home/jskala/.nuget/packages/system.buffers/4.5.1/system.buffers.4.5.1.nupkg.sha512", + "/home/jskala/.nuget/packages/system.io/4.3.0/system.io.4.3.0.nupkg.sha512", "/home/jskala/.nuget/packages/system.memory/4.5.5/system.memory.4.5.5.nupkg.sha512", + "/home/jskala/.nuget/packages/system.net.http/4.3.4/system.net.http.4.3.4.nupkg.sha512", "/home/jskala/.nuget/packages/system.numerics.vectors/4.5.0/system.numerics.vectors.4.5.0.nupkg.sha512", - "/home/jskala/.nuget/packages/system.runtime.compilerservices.unsafe/4.5.3/system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512" + "/home/jskala/.nuget/packages/system.runtime/4.3.0/system.runtime.4.3.0.nupkg.sha512", + "/home/jskala/.nuget/packages/system.runtime.compilerservices.unsafe/6.0.0/system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512", + "/home/jskala/.nuget/packages/system.security.cryptography.algorithms/4.3.0/system.security.cryptography.algorithms.4.3.0.nupkg.sha512", + "/home/jskala/.nuget/packages/system.security.cryptography.encoding/4.3.0/system.security.cryptography.encoding.4.3.0.nupkg.sha512", + "/home/jskala/.nuget/packages/system.security.cryptography.primitives/4.3.0/system.security.cryptography.primitives.4.3.0.nupkg.sha512", + "/home/jskala/.nuget/packages/system.security.cryptography.x509certificates/4.3.0/system.security.cryptography.x509certificates.4.3.0.nupkg.sha512", + "/home/jskala/.nuget/packages/system.text.encodings.web/6.0.0/system.text.encodings.web.6.0.0.nupkg.sha512", + "/home/jskala/.nuget/packages/system.text.json/6.0.0/system.text.json.6.0.0.nupkg.sha512", + "/home/jskala/.nuget/packages/system.threading.tasks.extensions/4.5.4/system.threading.tasks.extensions.4.5.4.nupkg.sha512", + "/home/jskala/.nuget/packages/system.valuetuple/4.5.0/system.valuetuple.4.5.0.nupkg.sha512" ], - "logs": [] + "logs": [ + { + "code": "NU1903", + "level": "Warning", + "warningLevel": 1, + "message": "Package 'System.Text.Json' 6.0.0 has a known high severity vulnerability, https://github.com/advisories/GHSA-8g4q-xg66-9fp4", + "libraryId": "System.Text.Json", + "targetGraphs": [ + ".NETFramework,Version=v4.8" + ] + } + ] } \ No newline at end of file diff --git a/plugin-release/DateSync.Emby.Plugin.dll b/plugin-release/DateSync.Emby.Plugin.dll new file mode 100644 index 0000000..041dfd7 Binary files /dev/null and b/plugin-release/DateSync.Emby.Plugin.dll differ diff --git a/plugin-release/NFOGuard.Emby.Plugin.dll b/plugin-release/NFOGuard.Emby.Plugin.dll index 2b50630..2882bda 100644 Binary files a/plugin-release/NFOGuard.Emby.Plugin.dll and b/plugin-release/NFOGuard.Emby.Plugin.dll differ diff --git a/projectsummary.md b/projectsummary.md index 9f17a89..087a4aa 100644 --- a/projectsummary.md +++ b/projectsummary.md @@ -17,11 +17,11 @@ NFOGuard is a comprehensive solution to protect and preserve date metadata for T - `` maps to Emby's `PremiereDate` field - **Current Fix**: Writing import date to `` field (goes to PremiereDate) -### 2. NFOGuard Emby Plugin (C# DLL) - v1.0.0 ๐Ÿšง -**Status**: Built, ready for testing +### 2. NFOGuard Emby Plugin (C# DLL) - v2.0.0-automatic โœ… +**Status**: Production-ready with automatic subscription system - **Purpose**: Automatically sync `PremiereDate` โ†’ `DateCreated` in Emby -- **Approach**: Real-time processing via library events (not scheduled tasks) -- **Architecture**: Clean, standards-compliant Emby plugin +- **Approach**: Real-time processing + scheduled tasks with licensing tiers +- **Architecture**: Professional plugin with automatic subscription validation ## What We've Tried @@ -43,16 +43,17 @@ NFOGuard is a comprehensive solution to protect and preserve date metadata for T - Comprehensive logging and error handling - CI/CD pipeline with automated testing -### Emby Plugin Features โœ… - READY FOR TESTING -- **Real-time processing**: Library event hooks (`ItemAdded`/`ItemUpdated`) -- **Scheduled task mode**: Weekly batch processing of existing episodes -- **Flexible processing modes**: Real-time only, scheduled only, or both -- **Configuration UI**: Full settings page in Emby dashboard -- **TV episode detection**: Automatic filtering and processing +### Emby Plugin Features โœ… - PRODUCTION READY +- **Real-time processing**: Library event hooks (`ItemAdded`/`ItemUpdated`) +- **Scheduled task mode**: Weekly batch processing with free tier limits +- **Percentage-based free tier**: 2% of TV episodes + 5% of movies per month +- **Automatic subscription system**: Patreon/PayPal integration (no manual keys) +- **Machine-based activation**: Unique installation IDs prevent piracy +- **Usage tracking**: Monthly quotas with automatic reset +- **TV + Movie support**: Full media library coverage - **Core sync logic**: `PremiereDate` โ†’ `DateCreated` synchronization -- **Verbose logging**: Configurable detailed logging for troubleshooting -- **License framework**: Ready for future licensing (currently disabled) -- **Standard architecture**: Follows official Emby plugin guidelines +- **Professional licensing**: TimeLord-style automatic activation +- **Offline mode**: Graceful fallback to free tier ## Technical Details @@ -106,11 +107,24 @@ episode.UpdateToRepository(ItemUpdateType.MetadataEdit); 4. **Verify database sync**: `DateCreated` = `PremiereDate` 5. **Monitor logs for proper operation** -### Production Features -8. **Add licensing system** - Custom server integration -9. **Performance optimization** -10. **Error handling improvements** -11. **Documentation and user guides** +### Plugin Version History +- **v1.0.0-working**: Basic functionality, unlimited processing (TESTED โœ…) +- **v1.1.0-free-tier**: Fixed 500 items/month, no real-time +- **v1.2.0-production**: Unlimited with manual license keys +- **v1.3.0-unified**: Single DLL with license key activation +- **v2.0.0-automatic**: Professional subscription system (CURRENT ๐Ÿš€) + +### Version Recommendations +- **Development/Testing**: Use v1.0.0-working (unlimited, no licensing) +- **Production/Commercial**: Use v2.0.0-automatic (percentage-based free tier + subscriptions) + +### API Requirements for v2.0.0-automatic +``` +Domain: nfoguard.com +POST /api/register # Machine registration +GET /api/patreon/check?machine_id=XXX # Patreon validation +GET /api/paypal/check?machine_id=XXX # PayPal validation +``` ## File Structure ``` diff --git a/releases/README.md b/releases/README.md new file mode 100644 index 0000000..f24ecf4 --- /dev/null +++ b/releases/README.md @@ -0,0 +1,28 @@ +# NFOGuard Emby Plugin Releases + +This directory contains versioned releases of the NFOGuard Emby plugin DLL. + +## Release Structure +``` +releases/ +โ”œโ”€โ”€ v1.0.0-working/ # Current proven working version +โ”œโ”€โ”€ v1.1.0-free-tier/ # Version with free tier limitations +โ”œโ”€โ”€ v1.2.0-production/ # Full production version +โ””โ”€โ”€ changelog.md # Version history and changes +``` + +## Installation +1. Choose your version from the appropriate folder +2. Copy `NFOGuard.Emby.Plugin.dll` to your Emby plugins folder +3. Restart Emby Server +4. Check version in Emby Dashboard โ†’ Plugins + +## Version Guidelines +- **Working versions**: Proven stable in testing +- **Free tier versions**: Limited functionality for trial users +- **Production versions**: Full-featured, licensed versions + +## Current Status +- **Latest Working**: v1.0.0 - Full functionality, no restrictions +- **Latest Free Tier**: Not yet released +- **Latest Production**: Not yet released \ No newline at end of file diff --git a/releases/v1.0.0-working/NFOGuard.Emby.Plugin.dll b/releases/v1.0.0-working/NFOGuard.Emby.Plugin.dll new file mode 100644 index 0000000..2b50630 Binary files /dev/null and b/releases/v1.0.0-working/NFOGuard.Emby.Plugin.dll differ diff --git a/releases/v1.0.0-working/RELEASE_NOTES.md b/releases/v1.0.0-working/RELEASE_NOTES.md new file mode 100644 index 0000000..3724968 --- /dev/null +++ b/releases/v1.0.0-working/RELEASE_NOTES.md @@ -0,0 +1,37 @@ +# NFOGuard Emby Plugin v1.0.0 - Working Version + +**Release Date**: 2025-01-12 +**Status**: โœ… PROVEN WORKING +**License**: Full functionality, no restrictions + +## ๐ŸŽ‰ Test Results +- **Episodes Processed**: 15,039 +- **Successfully Updated**: 14,661 +- **Success Rate**: 97.5% +- **Processing Speed**: ~1,500 episodes/second + +## โœ… Features +- **Real-time Processing**: Automatic sync on media add/update +- **Scheduled Task**: Weekly batch processing (enabled by default) +- **TV Episodes Support**: Full episode date synchronization +- **Movies Support**: Full movie date synchronization +- **High Performance**: Processes thousands of items in seconds + +## ๐Ÿ”ง Configuration +- `EnableRealTimeSync = true` (default) +- `EnableScheduledTask = true` (default) +- `LogVerbose = false` (default) + +## ๐Ÿ“‹ Installation +1. Copy `NFOGuard.Emby.Plugin.dll` to Emby plugins folder +2. Restart Emby Server +3. Plugin loads automatically - no configuration needed +4. Check "Scheduled Tasks" for "NFOGuard Date Sync" + +## ๐ŸŽฏ What It Does +Syncs `PremiereDate` โ†’ `DateCreated` so Emby displays import dates from NFO files instead of scan dates. + +## โš ๏ธ Notes +- No configuration UI (disabled to prevent crashes) +- All settings hardcoded to optimal values +- Licensing framework present but disabled \ No newline at end of file diff --git a/releases/v1.0.1-diagnostic-safe/NFOGuard.Emby.Plugin.dll b/releases/v1.0.1-diagnostic-safe/NFOGuard.Emby.Plugin.dll new file mode 100644 index 0000000..292cd71 Binary files /dev/null and b/releases/v1.0.1-diagnostic-safe/NFOGuard.Emby.Plugin.dll differ diff --git a/releases/v1.0.1-diagnostic/NFOGuard.Emby.Plugin.dll b/releases/v1.0.1-diagnostic/NFOGuard.Emby.Plugin.dll new file mode 100644 index 0000000..cb9d076 Binary files /dev/null and b/releases/v1.0.1-diagnostic/NFOGuard.Emby.Plugin.dll differ diff --git a/releases/v1.0.2-debug/NFOGuard.Emby.Plugin.dll b/releases/v1.0.2-debug/NFOGuard.Emby.Plugin.dll new file mode 100644 index 0000000..292cd71 Binary files /dev/null and b/releases/v1.0.2-debug/NFOGuard.Emby.Plugin.dll differ diff --git a/releases/v1.0.3-minimal/NFOGuard.Emby.Plugin.dll b/releases/v1.0.3-minimal/NFOGuard.Emby.Plugin.dll new file mode 100644 index 0000000..2882bda Binary files /dev/null and b/releases/v1.0.3-minimal/NFOGuard.Emby.Plugin.dll differ diff --git a/releases/v1.0.4-clean/DateSync.Emby.Plugin.dll b/releases/v1.0.4-clean/DateSync.Emby.Plugin.dll new file mode 100644 index 0000000..041dfd7 Binary files /dev/null and b/releases/v1.0.4-clean/DateSync.Emby.Plugin.dll differ diff --git a/releases/v1.1.0-free-tier/NFOGuard.Emby.Plugin.dll b/releases/v1.1.0-free-tier/NFOGuard.Emby.Plugin.dll new file mode 100644 index 0000000..7237563 Binary files /dev/null and b/releases/v1.1.0-free-tier/NFOGuard.Emby.Plugin.dll differ diff --git a/releases/v1.2.0-production/NFOGuard.Emby.Plugin.dll b/releases/v1.2.0-production/NFOGuard.Emby.Plugin.dll new file mode 100644 index 0000000..5c2893b Binary files /dev/null and b/releases/v1.2.0-production/NFOGuard.Emby.Plugin.dll differ diff --git a/releases/v1.3.0-unified/NFOGuard.Emby.Plugin.dll b/releases/v1.3.0-unified/NFOGuard.Emby.Plugin.dll new file mode 100644 index 0000000..9fcb3d7 Binary files /dev/null and b/releases/v1.3.0-unified/NFOGuard.Emby.Plugin.dll differ diff --git a/releases/v2.0.0-automatic/NFOGuard.Emby.Plugin.dll b/releases/v2.0.0-automatic/NFOGuard.Emby.Plugin.dll new file mode 100644 index 0000000..9fa2a35 Binary files /dev/null and b/releases/v2.0.0-automatic/NFOGuard.Emby.Plugin.dll differ