various NFOguard versions

This commit is contained in:
2025-09-12 10:30:12 -04:00
parent 08cddf7799
commit 77295cc400
48 changed files with 2051 additions and 92 deletions
+173
View File
@@ -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<Episode>().Count();
var movies = _libraryManager.GetItemList(new InternalItemsQuery
{
IncludeItemTypes = new[] { "Movie" },
Recursive = true
}).OfType<Movie>().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)";
}
}
}
+23 -7
View File
@@ -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)
{
+221 -13
View File
@@ -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<bool> ValidateLicenseAsync(string licenseKey)
public async Task<bool> 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<bool> 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<bool> 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<bool> 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<string> 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);
}
}
}
}
@@ -10,6 +10,8 @@
<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.5" />
<PackageReference Include="System.Net.Http" Version="4.3.4" />
<PackageReference Include="System.Text.Json" Version="6.0.0" />
</ItemGroup>
<ItemGroup>
@@ -28,8 +30,5 @@
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="thumb.png" Condition="Exists('thumb.png')" />
<!-- <EmbeddedResource Include="Configuration\configPage.html" /> -->
</ItemGroup>
<!-- All web resources disabled to prevent UI loading issues -->
</Project>
+85 -9
View File
@@ -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<double> 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++;
+104 -14
View File
@@ -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<PluginConfiguration>, IHasThumbImage
public class Plugin : BasePlugin<PluginConfiguration>
{
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;
}
/// <summary>
/// Registers machine and checks for automatic subscription activation
/// </summary>
public async Task<string> 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}";
}
}
/// <summary>
/// Gets current license status and usage information
/// </summary>
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}";
}
}
/// <summary>
/// Manually checks for subscription updates
/// </summary>
public async Task<string> 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;
}
}
+55
View File
@@ -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");
Binary file not shown.
Binary file not shown.
Binary file not shown.
+58
View File
@@ -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
+52
View File
@@ -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
+46
View File
@@ -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
+46
View File
@@ -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|<EmbeddedResource Include="Configuration\\configPage.html" />|<!-- <EmbeddedResource Include="Configuration\\configPage.html" /> -->|' 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|<!-- <EmbeddedResource Include="Configuration\\configPage.html" /> -->|<EmbeddedResource Include="Configuration\\configPage.html" />|' NFOGuard.Emby.Plugin.csproj
+43
View File
@@ -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
+51
View File
@@ -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
+43
View File
@@ -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
+60
View File
@@ -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"
@@ -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"
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)system.text.json/6.0.0/build/System.Text.Json.targets" Condition="Exists('$(NuGetPackageRoot)system.text.json/6.0.0/build/System.Text.Json.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.netframework.referenceassemblies.net48/1.0.3/build/Microsoft.NETFramework.ReferenceAssemblies.net48.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.netframework.referenceassemblies.net48/1.0.3/build/Microsoft.NETFramework.ReferenceAssemblies.net48.targets')" />
</ImportGroup>
</Project>
@@ -1 +1 @@
bc9346eb5351b08e69d51772894aaede4c86d42a30ba9df1c921e5156198813e
ac9b1d05d1517a7c47b07fdf8111e5c0cb41b1f211b4f061f560a7f28e99067e
@@ -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
+850 -23
View File
@@ -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"
]
}
]
}
+26 -3
View File
@@ -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"
]
}
]
}
Binary file not shown.
Binary file not shown.
+32 -18
View File
@@ -17,11 +17,11 @@ NFOGuard is a comprehensive solution to protect and preserve date metadata for T
- `<aired>` maps to Emby's `PremiereDate` field
- **Current Fix**: Writing import date to `<aired>` 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
```
+28
View File
@@ -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
Binary file not shown.
+37
View File
@@ -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
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.