dll integration

This commit is contained in:
2025-09-12 09:04:23 -04:00
parent dcbb25ca9e
commit 08cddf7799
57 changed files with 3293 additions and 1 deletions
@@ -0,0 +1,91 @@
<!DOCTYPE html>
<html>
<head>
<title>NFOGuard Settings</title>
</head>
<body data-role="page" class="page type-interior pluginConfigurationPage" data-require="emby-input,emby-button,emby-select,emby-checkbox">
<div data-role="content">
<div class="content-primary">
<form id="nfoguardConfigForm">
<h1>NFOGuard Settings</h1>
<p>Configure how NFOGuard synchronizes TV episode dates in Emby.</p>
<div class="inputContainer">
<label class="checkboxContainer">
<input type="checkbox" is="emby-checkbox" id="chkEnableRealTimeSync" />
<span>Enable Real-time Sync</span>
</label>
<div class="fieldDescription">Automatically sync PremiereDate to DateCreated when episodes are added or updated</div>
</div>
<div class="inputContainer">
<label class="checkboxContainer">
<input type="checkbox" is="emby-checkbox" id="chkEnableScheduledTask" />
<span>Enable Scheduled Task</span>
</label>
<div class="fieldDescription">Run NFOGuard as a scheduled task to process existing episodes</div>
</div>
<div class="inputContainer">
<label class="checkboxContainer">
<input type="checkbox" is="emby-checkbox" id="chkLogVerbose" />
<span>Verbose Logging</span>
</label>
<div class="fieldDescription">Enable detailed logging for troubleshooting</div>
</div>
<br/>
<div>
<button is="emby-button" type="submit" class="raised button-submit block">
Save
</button>
</div>
</form>
</div>
</div>
<script type="text/javascript">
(function () {
var pluginId = "B8A7F9E2-1234-4567-8901-2B3C4D5E6F7A";
function loadPage() {
ApiClient.getPluginConfiguration(pluginId).then(function (config) {
document.getElementById('chkEnableRealTimeSync').checked = config.EnableRealTimeSync !== false;
document.getElementById('chkEnableScheduledTask').checked = config.EnableScheduledTask === true;
document.getElementById('chkLogVerbose').checked = config.LogVerbose === true;
}).catch(function(err) {
console.error('Error loading NFOGuard config:', err);
});
}
function saveConfig() {
Dashboard.showLoadingMsg();
ApiClient.getPluginConfiguration(pluginId).then(function (config) {
config.EnableRealTimeSync = document.getElementById('chkEnableRealTimeSync').checked;
config.EnableScheduledTask = document.getElementById('chkEnableScheduledTask').checked;
config.LogVerbose = document.getElementById('chkLogVerbose').checked;
return ApiClient.updatePluginConfiguration(pluginId, config);
}).then(function () {
Dashboard.hideLoadingMsg();
Dashboard.alert('Settings saved successfully.');
}).catch(function (err) {
Dashboard.hideLoadingMsg();
Dashboard.alert('Error saving settings: ' + (err.message || err));
console.error('Save error:', err);
});
}
document.getElementById('nfoguardConfigForm').addEventListener('submit', function (e) {
e.preventDefault();
saveConfig();
return false;
});
// Load settings when page loads
loadPage();
})();
</script>
</body>
</html>
+70
View File
@@ -0,0 +1,70 @@
# NFOGuard Emby Plugin Deployment Guide
## Prerequisites
- .NET Framework 4.8 SDK or Visual Studio Build Tools
- Emby Server 4.7+ running
- Access to Emby's plugins directory
## Building the Plugin
### Windows
```cmd
build.bat
```
### Linux/macOS
```bash
./build.sh
```
## Installation Steps
1. **Build the plugin** using the build script above
2. **Locate your Emby plugins directory:**
- Windows: `C:\ProgramData\Emby-Server\plugins`
- Linux: `/var/lib/emby/plugins`
- Docker: `/config/plugins` (inside container)
- Synology: `/volume1/Emby/plugins`
3. **Copy the DLL:**
```bash
cp bin/Release/NFOGuard.Emby.Plugin.dll /path/to/emby/plugins/
```
4. **Restart Emby Server**
5. **Verify installation:**
- Check Emby dashboard → Plugins
- Look for "NFOGuard" in the installed plugins list
- Check Emby logs for "NFOGuard :: Plugin starting up"
## Testing
1. **Add a new TV episode** to your library with an NFO file containing `<dateadded>`
2. **Check the logs** for NFOGuard processing messages:
```
NFOGuard :: Processing Added Episode :: Episode Name
NFOGuard :: Syncing PremiereDate to DateCreated :: Episode Name
NFOGuard :: Successfully updated :: Episode Name
```
3. **Verify in database:**
```sql
sqlite3 library.db2 "SELECT DateCreated, PremiereDate FROM MediaItems WHERE Name LIKE '%episode%';"
```
## Troubleshooting
- **Plugin not appearing:** Check Emby logs for loading errors
- **Not processing episodes:** Verify log level includes Info messages
- **Build failures:** Ensure all Emby SDK DLLs are in EmbySDK folder
- **Permission errors:** Ensure Emby service has write access to database
## SDK Dependencies
The plugin requires these Emby SDK DLLs in the `EmbySDK` folder:
- MediaBrowser.Common.dll
- MediaBrowser.Controller.dll
- MediaBrowser.Model.dll
These can be extracted from your Emby Server installation directory.
+153
View File
@@ -0,0 +1,153 @@
using System;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Logging;
namespace NFOGuard.Emby.Plugin
{
public class LibraryEventHandler : IDisposable
{
private readonly ILibraryManager _libraryManager;
private readonly IItemRepository _itemRepository;
private readonly ILogger _logger;
private readonly LicenseManager _licenseManager;
public LibraryEventHandler(ILibraryManager libraryManager, IItemRepository itemRepository, ILogger logger)
{
_libraryManager = libraryManager;
_itemRepository = itemRepository;
_logger = logger;
_licenseManager = new LicenseManager(_logger);
// Subscribe to library events
_libraryManager.ItemAdded += OnItemAdded;
_libraryManager.ItemUpdated += OnItemUpdated;
}
private void OnItemAdded(object sender, ItemChangeEventArgs e)
{
ProcessItem(e.Item, "Added");
}
private void OnItemUpdated(object sender, ItemChangeEventArgs e)
{
ProcessItem(e.Item, "Updated");
}
private void ProcessItem(BaseItem item, string eventType)
{
try
{
// Check if real-time sync is enabled
if (!Plugin.Instance.Configuration.EnableRealTimeSync)
return;
// 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;
// }
// Process TV episodes and Movies
if (item is Episode episode)
{
ProcessEpisode(episode, eventType);
}
else if (item is Movie movie)
{
ProcessMovie(movie, eventType);
}
}
catch (Exception ex)
{
_logger.ErrorException($"NFOGuard :: Error processing item {item?.Name}", ex);
}
}
private void ProcessEpisode(Episode episode, string eventType)
{
try
{
if (Plugin.Instance.Configuration.LogVerbose)
_logger.Info($"NFOGuard :: Processing {eventType} Episode :: {episode.Name}");
// Check if PremiereDate exists and differs from DateCreated
if (episode.PremiereDate.HasValue &&
episode.DateCreated != episode.PremiereDate.Value)
{
if (Plugin.Instance.Configuration.LogVerbose)
_logger.Info($"NFOGuard :: Syncing PremiereDate to DateCreated :: {episode.Name} :: " +
$"PremiereDate: {episode.PremiereDate.Value}, DateCreated: {episode.DateCreated}");
// Update DateCreated to match PremiereDate
episode.DateCreated = episode.PremiereDate.Value;
try
{
// Save to repository using ItemUpdateType.MetadataEdit
episode.UpdateToRepository(ItemUpdateType.MetadataEdit);
_logger.Info($"NFOGuard :: Successfully updated episode :: {episode.Name}");
}
catch (Exception ex)
{
_logger.ErrorException($"NFOGuard :: Failed to update episode {episode.Name}", ex);
}
}
}
catch (Exception ex)
{
_logger.ErrorException($"NFOGuard :: Error processing episode {episode?.Name}", ex);
}
}
private void ProcessMovie(Movie movie, string eventType)
{
try
{
if (Plugin.Instance.Configuration.LogVerbose)
_logger.Info($"NFOGuard :: Processing {eventType} Movie :: {movie.Name}");
// Check if PremiereDate exists and differs from DateCreated
if (movie.PremiereDate.HasValue &&
movie.DateCreated != movie.PremiereDate.Value)
{
if (Plugin.Instance.Configuration.LogVerbose)
_logger.Info($"NFOGuard :: Syncing PremiereDate to DateCreated :: {movie.Name} :: " +
$"PremiereDate: {movie.PremiereDate.Value}, DateCreated: {movie.DateCreated}");
// Update DateCreated to match PremiereDate
movie.DateCreated = movie.PremiereDate.Value;
try
{
// Save to repository using ItemUpdateType.MetadataEdit
movie.UpdateToRepository(ItemUpdateType.MetadataEdit);
_logger.Info($"NFOGuard :: Successfully updated movie :: {movie.Name}");
}
catch (Exception ex)
{
_logger.ErrorException($"NFOGuard :: Failed to update movie {movie.Name}", ex);
}
}
}
catch (Exception ex)
{
_logger.ErrorException($"NFOGuard :: Error processing movie {movie?.Name}", ex);
}
}
public void Dispose()
{
if (_libraryManager != null)
{
_libraryManager.ItemAdded -= OnItemAdded;
_libraryManager.ItemUpdated -= OnItemUpdated;
}
}
}
}
+66
View File
@@ -0,0 +1,66 @@
using System;
using System.Threading.Tasks;
using MediaBrowser.Model.Logging;
namespace NFOGuard.Emby.Plugin
{
public class LicenseManager
{
private readonly ILogger _logger;
public LicenseManager(ILogger logger)
{
_logger = logger;
}
public async Task<bool> ValidateLicenseAsync(string licenseKey)
{
try
{
// TODO: Implement actual license validation
// For now, return true for testing
// In production, this would call your licensing server
if (string.IsNullOrEmpty(licenseKey))
{
_logger.Info("NFOGuard :: No license key provided, running in trial mode");
return false;
}
// 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);
}
catch (Exception ex)
{
_logger.ErrorException("NFOGuard :: License validation error", ex);
return false;
}
}
public bool IsTrialExpired()
{
// Implement trial logic here
// For example, check installation date vs current date
var installDate = Plugin.Instance.Configuration.InstallDate;
if (installDate == DateTime.MinValue)
{
Plugin.Instance.Configuration.InstallDate = DateTime.UtcNow;
Plugin.Instance.SaveConfiguration();
return false;
}
var trialDays = 30; // 30-day trial
return DateTime.UtcNow > installDate.AddDays(trialDays);
}
public bool CanUseFeature()
{
// Check if license is valid or trial is still active
return Plugin.Instance.Configuration.LicenseValid || !IsTrialExpired();
}
}
}
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Library</OutputType>
<RootNamespace>NFOGuard.Emby.Plugin</RootNamespace>
<AssemblyName>NFOGuard.Emby.Plugin</AssemblyName>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.5" />
</ItemGroup>
<ItemGroup>
<Reference Include="MediaBrowser.Common">
<HintPath>..\EmbySDK\MediaBrowser.Common.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="MediaBrowser.Controller">
<HintPath>..\EmbySDK\MediaBrowser.Controller.dll</HintPath>
<Private>false</Private>
</Reference>
<Reference Include="MediaBrowser.Model">
<HintPath>..\EmbySDK\MediaBrowser.Model.dll</HintPath>
<Private>false</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="thumb.png" Condition="Exists('thumb.png')" />
<!-- <EmbeddedResource Include="Configuration\configPage.html" /> -->
</ItemGroup>
</Project>
@@ -0,0 +1,150 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Tasks;
namespace NFOGuard.Emby.Plugin
{
public class NFOGuardScheduledTask : IScheduledTask
{
private readonly ILibraryManager _libraryManager;
private readonly ILogger _logger;
public string Name => "NFOGuard Date Sync";
public string Key => "NFOGuardSync";
public string Description => "Synchronizes PremiereDate to DateCreated for all TV episodes and movies";
public string Category => "Library";
public NFOGuardScheduledTask(ILibraryManager libraryManager, ILogManager logManager)
{
_libraryManager = libraryManager;
_logger = logManager.GetLogger("NFOGuard");
}
public async Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
{
if (!Plugin.Instance.Configuration.EnableScheduledTask)
{
_logger.Info("NFOGuard :: Scheduled task is disabled in configuration");
return;
}
_logger.Info("NFOGuard :: Starting scheduled task execution");
try
{
// Get all TV episodes and movies
var episodes = _libraryManager.GetItemList(new InternalItemsQuery
{
IncludeItemTypes = new[] { "Episode" },
Recursive = true
}).OfType<Episode>().ToList();
var movies = _libraryManager.GetItemList(new InternalItemsQuery
{
IncludeItemTypes = new[] { "Movie" },
Recursive = true
}).OfType<Movie>().ToList();
var totalItems = episodes.Count + movies.Count;
_logger.Info($"NFOGuard :: Found {episodes.Count} episodes and {movies.Count} movies to process ({totalItems} total)");
var processedCount = 0;
var updatedCount = 0;
// Process episodes
for (int i = 0; i < episodes.Count; i++)
{
cancellationToken.ThrowIfCancellationRequested();
var episode = episodes[i];
try
{
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}");
episode.DateCreated = episode.PremiereDate.Value;
episode.UpdateToRepository(ItemUpdateType.MetadataEdit);
updatedCount++;
}
processedCount++;
var progressPercentage = (double)processedCount / totalItems * 100;
progress?.Report(progressPercentage);
}
catch (Exception ex)
{
_logger.ErrorException($"NFOGuard :: Error processing episode {episode.Name}", ex);
}
}
// Process movies
for (int i = 0; i < movies.Count; i++)
{
cancellationToken.ThrowIfCancellationRequested();
var movie = movies[i];
try
{
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}");
movie.DateCreated = movie.PremiereDate.Value;
movie.UpdateToRepository(ItemUpdateType.MetadataEdit);
updatedCount++;
}
processedCount++;
var progressPercentage = (double)processedCount / totalItems * 100;
progress?.Report(progressPercentage);
}
catch (Exception ex)
{
_logger.ErrorException($"NFOGuard :: Error processing movie {movie.Name}", ex);
}
}
_logger.Info($"NFOGuard :: Scheduled task completed. Processed: {processedCount} items ({episodes.Count} episodes, {movies.Count} movies), Updated: {updatedCount}");
}
catch (Exception ex)
{
_logger.ErrorException("NFOGuard :: Scheduled task failed", ex);
throw;
}
}
public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
{
// Default to run weekly at 3 AM on Sunday
return new[]
{
new TaskTriggerInfo
{
Type = TaskTriggerInfo.TriggerWeekly,
DayOfWeek = DayOfWeek.Sunday,
TimeOfDayTicks = TimeSpan.FromHours(3).Ticks
}
};
}
}
}
+49
View File
@@ -0,0 +1,49 @@
using System;
using System.IO;
using MediaBrowser.Common.Plugins;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Model.Plugins;
using MediaBrowser.Model.Serialization;
namespace NFOGuard.Emby.Plugin
{
public class Plugin : BasePlugin<PluginConfiguration>, IHasThumbImage
{
private Guid _id = new Guid("A1B2C3D4-5678-9ABC-DEF0-123456789ABC");
public override string Name => "NFOGuard";
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 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;
}
}
public class PluginConfiguration : BasePluginConfiguration
{
public bool EnableRealTimeSync { get; set; } = true;
public bool EnableScheduledTask { get; set; } = true;
public bool LogVerbose { get; set; } = false;
public bool LicenseValid { get; set; } = false;
public string LicenseKey { get; set; } = string.Empty;
public DateTime InstallDate { get; set; } = DateTime.MinValue;
}
}
@@ -0,0 +1,29 @@
using System.IO;
using MediaBrowser.Common.Plugins;
using MediaBrowser.Controller.Plugins;
namespace NFOGuard.Emby.Plugin
{
public class PluginConfigurationPage : IPluginConfigurationPage
{
public string Name => "NFOGuard";
public ConfigurationPageType ConfigurationPageType => ConfigurationPageType.PluginConfiguration;
public IPlugin Plugin => NFOGuard.Emby.Plugin.Plugin.Instance;
public Stream GetHtmlStream()
{
var type = GetType();
var stream = type.Assembly.GetManifestResourceStream("NFOGuard.Emby.Plugin.Configuration.configPage.html");
if (stream == null)
{
// Try alternative resource names
stream = type.Assembly.GetManifestResourceStream("NFOGuard.Emby.Plugin.configPage.html");
}
return stream;
}
}
}
+44
View File
@@ -0,0 +1,44 @@
using System;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Plugins;
using MediaBrowser.Model.Logging;
namespace NFOGuard.Emby.Plugin
{
public class PluginEntryPoint : IServerEntryPoint
{
private readonly ILibraryManager _libraryManager;
private readonly IItemRepository _itemRepository;
private readonly ILogger _logger;
private LibraryEventHandler _eventHandler;
public PluginEntryPoint(ILibraryManager libraryManager, IItemRepository itemRepository, ILogManager logManager)
{
_libraryManager = libraryManager;
_itemRepository = itemRepository;
_logger = logManager.GetLogger("NFOGuard");
}
public void Run()
{
_logger.Info("NFOGuard :: Plugin starting up");
try
{
_eventHandler = new LibraryEventHandler(_libraryManager, _itemRepository, _logger);
_logger.Info("NFOGuard :: Event handlers registered successfully");
}
catch (Exception ex)
{
_logger.ErrorException("NFOGuard :: Failed to initialize event handlers", ex);
}
}
public void Dispose()
{
_logger.Info("NFOGuard :: Plugin shutting down");
_eventHandler?.Dispose();
}
}
}
@@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("NFOGuard Emby Plugin")]
[assembly: AssemblyDescription("Synchronizes TV episode PremiereDate to DateCreated to preserve import dates in Emby")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("NFOGuard")]
[assembly: AssemblyProduct("NFOGuard.Emby.Plugin")]
[assembly: AssemblyCopyright("Copyright © NFOGuard 2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("b8a7f9e2-1234-4567-8901-2b3c4d5e6f7a")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
+28
View File
@@ -0,0 +1,28 @@
# NFOGuard Emby Plugin
This is the companion Emby plugin for NFOGuard that automatically synchronizes TV episode PremiereDate to DateCreated to preserve import dates.
## Features
- Real-time processing of new and updated TV episodes
- Automatically syncs PremiereDate → DateCreated when episodes are added/scanned
- Preserves original import dates from NFO files
- Logging for debugging and monitoring
## Installation
1. Build the plugin DLL
2. Copy to Emby's plugins directory
3. Restart Emby server
4. Plugin will automatically start processing episodes
## How It Works
The plugin hooks into Emby's library events (ItemAdded/ItemUpdated) and:
1. Detects when TV episodes are processed
2. Checks if PremiereDate exists and differs from DateCreated
3. Updates DateCreated to match PremiereDate
4. Saves changes to the Emby database
This ensures that Emby displays the correct import date (from NFO dateadded) instead of the scan date.
+131
View File
@@ -0,0 +1,131 @@
# NFOGuard Emby Plugin - WSL Development Setup
This guide helps you build the NFOGuard Emby plugin on Windows using WSL (Windows Subsystem for Linux).
## Prerequisites
### 1. Install .NET SDK in WSL
```bash
# Update package list
sudo apt update
# Install .NET SDK 6.0 (supports .NET Framework 4.8 development)
sudo apt install -y dotnet-sdk-6.0
# Verify installation
dotnet --version
```
### 2. Get Emby SDK Files
You need to obtain the Emby SDK DLLs from an Emby Server installation:
**Option A: From existing Emby Server**
1. Locate your Emby Server installation directory:
- Windows: `C:\Program Files\Emby-Server\System`
- Or wherever you installed Emby Server
2. Copy these files to `NFOguard/EmbySDK/`:
- `MediaBrowser.Common.dll`
- `MediaBrowser.Controller.dll`
- `MediaBrowser.Model.dll`
**Option B: Download from official sources**
- Check the [Emby Plugin Development docs](https://dev.emby.media/doc/plugins/dev/index.html)
### 3. Prepare EmbySDK Directory
```bash
# From the NFOguard directory
mkdir -p EmbySDK
# Copy the DLL files here (use Windows Explorer or copy commands)
# You should have:
# EmbySDK/MediaBrowser.Common.dll
# EmbySDK/MediaBrowser.Controller.dll
# EmbySDK/MediaBrowser.Model.dll
```
## Building the Plugin
### Option 1: Using Build Script (Recommended)
```bash
cd NFOGuard.Emby.Plugin
./build.sh
```
### Option 2: Manual Build
```bash
cd NFOGuard.Emby.Plugin
# Clean previous builds
rm -rf bin obj
# Build the project
dotnet build NFOGuard.Emby.Plugin.csproj -c Release -f net48
```
## Troubleshooting
### Common Issues
**1. "MediaBrowser.* not found" errors:**
- Ensure SDK DLLs are in `../EmbySDK/` relative to the .csproj file
- Check DLL file names match exactly (case-sensitive on Linux)
**2. ".NET Framework 4.8 targeting pack" errors:**
```bash
# Install Mono for .NET Framework support
sudo apt install mono-complete
```
**3. Permission errors:**
```bash
# Make build script executable
chmod +x build.sh
```
**4. WSL file system issues:**
- Make sure you're working in the Linux filesystem (`/home/...`) not Windows mounts (`/mnt/c/...`) for better performance
- If files are on Windows side, they may have permission/line ending issues
### Verifying Build Success
After successful build:
```bash
# Check if DLL was created
ls -la bin/Release/net48/NFOGuard.Emby.Plugin.dll
# Check file size (should be > 0 bytes)
file bin/Release/net48/NFOGuard.Emby.Plugin.dll
```
## Deployment to Windows Emby Server
1. **Locate Emby plugins directory:**
- `C:\ProgramData\Emby-Server\plugins`
2. **Copy from WSL to Windows:**
```bash
# From WSL, copy to Windows (adjust path as needed)
cp bin/Release/net48/NFOGuard.Emby.Plugin.dll /mnt/c/ProgramData/Emby-Server/plugins/
```
3. **Restart Emby Server**
4. **Verify in Emby Dashboard:**
- Go to Dashboard → Plugins
- Look for "NFOGuard" in installed plugins
## Development Tips
- Use VS Code in WSL for editing: `code .`
- Keep source files in WSL filesystem for best performance
- Only copy final DLL to Windows Emby server
- Use `tail -f /var/log/emby.log` (or wherever Emby logs are) to monitor plugin activity
## Next Steps
Once built and deployed:
1. Test with a new TV episode import
2. Check Emby logs for NFOGuard messages
3. Verify DateCreated syncs to PremiereDate in database
4. Configure licensing when ready for production use
Binary file not shown.
Binary file not shown.
Binary file not shown.
+41
View File
@@ -0,0 +1,41 @@
@echo off
echo Building NFOGuard Emby Plugin...
REM Check if MSBuild is available
where msbuild >nul 2>&1
if %ERRORLEVEL% neq 0 (
echo ERROR: MSBuild not found. Please install Visual Studio Build Tools or use Developer Command Prompt.
pause
exit /b 1
)
REM Clean previous builds
if exist "bin" rmdir /s /q "bin"
if exist "obj" rmdir /s /q "obj"
REM Build the project
msbuild NFOGuard.Emby.Plugin.csproj /p:Configuration=Release /p:Platform="Any CPU"
if %ERRORLEVEL% equ 0 (
echo.
echo Build successful!
echo Plugin DLL location: bin\Release\net48\NFOGuard.Emby.Plugin.dll
echo.
REM Create plugin-release directory in repo root and copy DLL
if not exist "..\plugin-release" mkdir "..\plugin-release"
copy "bin\Release\net48\NFOGuard.Emby.Plugin.dll" "..\plugin-release\"
echo Plugin copied to: ..\plugin-release\NFOGuard.Emby.Plugin.dll
echo.
echo To install:
echo 1. Copy plugin-release\NFOGuard.Emby.Plugin.dll to your Emby plugins folder
echo 2. Restart Emby Server
echo.
) else (
echo.
echo Build failed! Check the output above for errors.
echo.
)
pause
+68
View File
@@ -0,0 +1,68 @@
#!/bin/bash
echo "Building NFOGuard Emby Plugin..."
# Check if we need to install .NET Framework support
if ! command -v dotnet &> /dev/null; then
echo "ERROR: .NET SDK not found. Installing..."
echo "Run: sudo apt update && sudo apt install -y dotnet-sdk-6.0"
exit 1
fi
# Create EmbySDK directory if it doesn't exist
if [ ! -d "../EmbySDK" ]; then
echo "Creating EmbySDK directory..."
mkdir -p ../EmbySDK
echo ""
echo "IMPORTANT: You need to copy Emby SDK DLLs to ../EmbySDK/"
echo "Required files:"
echo " - MediaBrowser.Common.dll"
echo " - MediaBrowser.Controller.dll"
echo " - MediaBrowser.Model.dll"
echo ""
echo "These can be found in your Emby Server installation directory."
echo "Continue? (y/n)"
read -r answer
if [[ $answer != "y" ]]; then
echo "Build cancelled. Please copy SDK files first."
exit 1
fi
fi
# Clean previous builds
rm -rf bin obj
# Try building with dotnet first (requires SDK), fall back to msbuild
if command -v dotnet &> /dev/null; then
echo "Building with .NET CLI..."
dotnet build NFOGuard.Emby.Plugin.csproj -c Release -f net48
elif command -v msbuild &> /dev/null; then
echo "Building with MSBuild..."
msbuild NFOGuard.Emby.Plugin.csproj /p:Configuration=Release /p:Platform="Any CPU"
else
echo "ERROR: No build tool found. Install .NET SDK or Mono with MSBuild."
exit 1
fi
if [ $? -eq 0 ]; then
echo
echo "Build successful!"
echo "Plugin DLL location: bin/Release/net48/NFOGuard.Emby.Plugin.dll"
echo
# Create plugin-release directory in repo root and copy DLL
PLUGIN_RELEASE_DIR="../plugin-release"
mkdir -p "$PLUGIN_RELEASE_DIR"
cp "bin/Release/net48/NFOGuard.Emby.Plugin.dll" "$PLUGIN_RELEASE_DIR/"
echo "Plugin copied to: $PLUGIN_RELEASE_DIR/NFOGuard.Emby.Plugin.dll"
echo
echo "To install:"
echo "1. Copy plugin-release/NFOGuard.Emby.Plugin.dll to your Emby plugins folder"
echo "2. Restart Emby Server"
echo
else
echo
echo "Build failed! Check the output above for errors."
echo
fi
@@ -0,0 +1,62 @@
{
"format": 1,
"restore": {
"/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/NFOGuard.Emby.Plugin.csproj": {}
},
"projects": {
"/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/NFOGuard.Emby.Plugin.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/NFOGuard.Emby.Plugin.csproj",
"projectName": "NFOGuard.Emby.Plugin",
"projectPath": "/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/NFOGuard.Emby.Plugin.csproj",
"packagesPath": "/home/jskala/.nuget/packages/",
"outputPath": "/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/home/jskala/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net48"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net48": {
"targetAlias": "net48",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net48": {
"targetAlias": "net48",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": {
"suppressParent": "All",
"target": "Package",
"version": "[1.0.3, )",
"autoReferenced": true
},
"System.Memory": {
"target": "Package",
"version": "[4.5.5, )"
}
},
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/8.0.414/RuntimeIdentifierGraph.json"
}
}
}
}
}
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/jskala/.nuget/packages/</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/jskala/.nuget/packages/</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.11.1</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="/home/jskala/.nuget/packages/" />
</ItemGroup>
</Project>
@@ -0,0 +1,6 @@
<?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)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>
@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
@@ -0,0 +1,5 @@
is_global = true
build_property.RootNamespace = NFOGuard.Emby.Plugin
build_property.ProjectDir = /home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
@@ -0,0 +1 @@
bc9346eb5351b08e69d51772894aaede4c86d42a30ba9df1c921e5156198813e
@@ -0,0 +1,12 @@
/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/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/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
/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.F23561FE.Up2Date
/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.dll
/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/obj/Release/net48/NFOGuard.Emby.Plugin.pdb
@@ -0,0 +1,676 @@
{
"version": 3,
"targets": {
".NETFramework,Version=v4.8": {
"Microsoft.NETFramework.ReferenceAssemblies/1.0.3": {
"type": "package",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3"
}
},
"Microsoft.NETFramework.ReferenceAssemblies.net48/1.0.3": {
"type": "package",
"build": {
"build/Microsoft.NETFramework.ReferenceAssemblies.net48.targets": {}
}
},
"System.Buffers/4.5.1": {
"type": "package",
"frameworkAssemblies": [
"mscorlib"
],
"compile": {
"ref/net45/System.Buffers.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net461/System.Buffers.dll": {
"related": ".xml"
}
}
},
"System.Memory/4.5.5": {
"type": "package",
"dependencies": {
"System.Buffers": "4.5.1",
"System.Numerics.Vectors": "4.5.0",
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
},
"frameworkAssemblies": [
"System",
"mscorlib"
],
"compile": {
"lib/net461/System.Memory.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net461/System.Memory.dll": {
"related": ".xml"
}
}
},
"System.Numerics.Vectors/4.5.0": {
"type": "package",
"frameworkAssemblies": [
"System.Numerics",
"mscorlib"
],
"compile": {
"ref/net46/System.Numerics.Vectors.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net46/System.Numerics.Vectors.dll": {
"related": ".xml"
}
}
},
"System.Runtime.CompilerServices.Unsafe/4.5.3": {
"type": "package",
"frameworkAssemblies": [
"mscorlib"
],
"compile": {
"ref/net461/System.Runtime.CompilerServices.Unsafe.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net461/System.Runtime.CompilerServices.Unsafe.dll": {
"related": ".xml"
}
}
}
}
},
"libraries": {
"Microsoft.NETFramework.ReferenceAssemblies/1.0.3": {
"sha512": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
"type": "package",
"path": "microsoft.netframework.referenceassemblies/1.0.3",
"files": [
".nupkg.metadata",
".signature.p7s",
"microsoft.netframework.referenceassemblies.1.0.3.nupkg.sha512",
"microsoft.netframework.referenceassemblies.nuspec"
]
},
"Microsoft.NETFramework.ReferenceAssemblies.net48/1.0.3": {
"sha512": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ==",
"type": "package",
"path": "microsoft.netframework.referenceassemblies.net48/1.0.3",
"files": [
".nupkg.metadata",
".signature.p7s",
"build/.NETFramework/v4.8/Accessibility.dll",
"build/.NETFramework/v4.8/Accessibility.xml",
"build/.NETFramework/v4.8/CustomMarshalers.dll",
"build/.NETFramework/v4.8/CustomMarshalers.xml",
"build/.NETFramework/v4.8/Facades/Microsoft.Win32.Primitives.dll",
"build/.NETFramework/v4.8/Facades/System.AppContext.dll",
"build/.NETFramework/v4.8/Facades/System.Collections.Concurrent.dll",
"build/.NETFramework/v4.8/Facades/System.Collections.NonGeneric.dll",
"build/.NETFramework/v4.8/Facades/System.Collections.Specialized.dll",
"build/.NETFramework/v4.8/Facades/System.Collections.dll",
"build/.NETFramework/v4.8/Facades/System.ComponentModel.Annotations.dll",
"build/.NETFramework/v4.8/Facades/System.ComponentModel.EventBasedAsync.dll",
"build/.NETFramework/v4.8/Facades/System.ComponentModel.Primitives.dll",
"build/.NETFramework/v4.8/Facades/System.ComponentModel.TypeConverter.dll",
"build/.NETFramework/v4.8/Facades/System.ComponentModel.dll",
"build/.NETFramework/v4.8/Facades/System.Console.dll",
"build/.NETFramework/v4.8/Facades/System.Data.Common.dll",
"build/.NETFramework/v4.8/Facades/System.Diagnostics.Contracts.dll",
"build/.NETFramework/v4.8/Facades/System.Diagnostics.Debug.dll",
"build/.NETFramework/v4.8/Facades/System.Diagnostics.FileVersionInfo.dll",
"build/.NETFramework/v4.8/Facades/System.Diagnostics.Process.dll",
"build/.NETFramework/v4.8/Facades/System.Diagnostics.StackTrace.dll",
"build/.NETFramework/v4.8/Facades/System.Diagnostics.TextWriterTraceListener.dll",
"build/.NETFramework/v4.8/Facades/System.Diagnostics.Tools.dll",
"build/.NETFramework/v4.8/Facades/System.Diagnostics.TraceSource.dll",
"build/.NETFramework/v4.8/Facades/System.Drawing.Primitives.dll",
"build/.NETFramework/v4.8/Facades/System.Dynamic.Runtime.dll",
"build/.NETFramework/v4.8/Facades/System.Globalization.Calendars.dll",
"build/.NETFramework/v4.8/Facades/System.Globalization.Extensions.dll",
"build/.NETFramework/v4.8/Facades/System.Globalization.dll",
"build/.NETFramework/v4.8/Facades/System.IO.Compression.ZipFile.dll",
"build/.NETFramework/v4.8/Facades/System.IO.FileSystem.DriveInfo.dll",
"build/.NETFramework/v4.8/Facades/System.IO.FileSystem.Primitives.dll",
"build/.NETFramework/v4.8/Facades/System.IO.FileSystem.Watcher.dll",
"build/.NETFramework/v4.8/Facades/System.IO.FileSystem.dll",
"build/.NETFramework/v4.8/Facades/System.IO.IsolatedStorage.dll",
"build/.NETFramework/v4.8/Facades/System.IO.MemoryMappedFiles.dll",
"build/.NETFramework/v4.8/Facades/System.IO.Pipes.dll",
"build/.NETFramework/v4.8/Facades/System.IO.UnmanagedMemoryStream.dll",
"build/.NETFramework/v4.8/Facades/System.IO.dll",
"build/.NETFramework/v4.8/Facades/System.Linq.Expressions.dll",
"build/.NETFramework/v4.8/Facades/System.Linq.Parallel.dll",
"build/.NETFramework/v4.8/Facades/System.Linq.Queryable.dll",
"build/.NETFramework/v4.8/Facades/System.Linq.dll",
"build/.NETFramework/v4.8/Facades/System.Net.Http.Rtc.dll",
"build/.NETFramework/v4.8/Facades/System.Net.NameResolution.dll",
"build/.NETFramework/v4.8/Facades/System.Net.NetworkInformation.dll",
"build/.NETFramework/v4.8/Facades/System.Net.Ping.dll",
"build/.NETFramework/v4.8/Facades/System.Net.Primitives.dll",
"build/.NETFramework/v4.8/Facades/System.Net.Requests.dll",
"build/.NETFramework/v4.8/Facades/System.Net.Security.dll",
"build/.NETFramework/v4.8/Facades/System.Net.Sockets.dll",
"build/.NETFramework/v4.8/Facades/System.Net.WebHeaderCollection.dll",
"build/.NETFramework/v4.8/Facades/System.Net.WebSockets.Client.dll",
"build/.NETFramework/v4.8/Facades/System.Net.WebSockets.dll",
"build/.NETFramework/v4.8/Facades/System.ObjectModel.dll",
"build/.NETFramework/v4.8/Facades/System.Reflection.Emit.ILGeneration.dll",
"build/.NETFramework/v4.8/Facades/System.Reflection.Emit.Lightweight.dll",
"build/.NETFramework/v4.8/Facades/System.Reflection.Emit.dll",
"build/.NETFramework/v4.8/Facades/System.Reflection.Extensions.dll",
"build/.NETFramework/v4.8/Facades/System.Reflection.Primitives.dll",
"build/.NETFramework/v4.8/Facades/System.Reflection.dll",
"build/.NETFramework/v4.8/Facades/System.Resources.Reader.dll",
"build/.NETFramework/v4.8/Facades/System.Resources.ResourceManager.dll",
"build/.NETFramework/v4.8/Facades/System.Resources.Writer.dll",
"build/.NETFramework/v4.8/Facades/System.Runtime.CompilerServices.VisualC.dll",
"build/.NETFramework/v4.8/Facades/System.Runtime.Extensions.dll",
"build/.NETFramework/v4.8/Facades/System.Runtime.Handles.dll",
"build/.NETFramework/v4.8/Facades/System.Runtime.InteropServices.RuntimeInformation.dll",
"build/.NETFramework/v4.8/Facades/System.Runtime.InteropServices.WindowsRuntime.dll",
"build/.NETFramework/v4.8/Facades/System.Runtime.InteropServices.dll",
"build/.NETFramework/v4.8/Facades/System.Runtime.Numerics.dll",
"build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Formatters.dll",
"build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Json.dll",
"build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Primitives.dll",
"build/.NETFramework/v4.8/Facades/System.Runtime.Serialization.Xml.dll",
"build/.NETFramework/v4.8/Facades/System.Runtime.dll",
"build/.NETFramework/v4.8/Facades/System.Security.Claims.dll",
"build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Algorithms.dll",
"build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Csp.dll",
"build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Encoding.dll",
"build/.NETFramework/v4.8/Facades/System.Security.Cryptography.Primitives.dll",
"build/.NETFramework/v4.8/Facades/System.Security.Cryptography.X509Certificates.dll",
"build/.NETFramework/v4.8/Facades/System.Security.Principal.dll",
"build/.NETFramework/v4.8/Facades/System.Security.SecureString.dll",
"build/.NETFramework/v4.8/Facades/System.ServiceModel.Duplex.dll",
"build/.NETFramework/v4.8/Facades/System.ServiceModel.Http.dll",
"build/.NETFramework/v4.8/Facades/System.ServiceModel.NetTcp.dll",
"build/.NETFramework/v4.8/Facades/System.ServiceModel.Primitives.dll",
"build/.NETFramework/v4.8/Facades/System.ServiceModel.Security.dll",
"build/.NETFramework/v4.8/Facades/System.Text.Encoding.Extensions.dll",
"build/.NETFramework/v4.8/Facades/System.Text.Encoding.dll",
"build/.NETFramework/v4.8/Facades/System.Text.RegularExpressions.dll",
"build/.NETFramework/v4.8/Facades/System.Threading.Overlapped.dll",
"build/.NETFramework/v4.8/Facades/System.Threading.Tasks.Parallel.dll",
"build/.NETFramework/v4.8/Facades/System.Threading.Tasks.dll",
"build/.NETFramework/v4.8/Facades/System.Threading.Thread.dll",
"build/.NETFramework/v4.8/Facades/System.Threading.ThreadPool.dll",
"build/.NETFramework/v4.8/Facades/System.Threading.Timer.dll",
"build/.NETFramework/v4.8/Facades/System.Threading.dll",
"build/.NETFramework/v4.8/Facades/System.ValueTuple.dll",
"build/.NETFramework/v4.8/Facades/System.Xml.ReaderWriter.dll",
"build/.NETFramework/v4.8/Facades/System.Xml.XDocument.dll",
"build/.NETFramework/v4.8/Facades/System.Xml.XPath.XDocument.dll",
"build/.NETFramework/v4.8/Facades/System.Xml.XPath.dll",
"build/.NETFramework/v4.8/Facades/System.Xml.XmlDocument.dll",
"build/.NETFramework/v4.8/Facades/System.Xml.XmlSerializer.dll",
"build/.NETFramework/v4.8/Facades/netstandard.dll",
"build/.NETFramework/v4.8/ISymWrapper.dll",
"build/.NETFramework/v4.8/ISymWrapper.xml",
"build/.NETFramework/v4.8/Microsoft.Activities.Build.dll",
"build/.NETFramework/v4.8/Microsoft.Activities.Build.xml",
"build/.NETFramework/v4.8/Microsoft.Build.Conversion.v4.0.dll",
"build/.NETFramework/v4.8/Microsoft.Build.Conversion.v4.0.xml",
"build/.NETFramework/v4.8/Microsoft.Build.Engine.dll",
"build/.NETFramework/v4.8/Microsoft.Build.Engine.xml",
"build/.NETFramework/v4.8/Microsoft.Build.Framework.dll",
"build/.NETFramework/v4.8/Microsoft.Build.Framework.xml",
"build/.NETFramework/v4.8/Microsoft.Build.Tasks.v4.0.dll",
"build/.NETFramework/v4.8/Microsoft.Build.Tasks.v4.0.xml",
"build/.NETFramework/v4.8/Microsoft.Build.Utilities.v4.0.dll",
"build/.NETFramework/v4.8/Microsoft.Build.Utilities.v4.0.xml",
"build/.NETFramework/v4.8/Microsoft.Build.dll",
"build/.NETFramework/v4.8/Microsoft.Build.xml",
"build/.NETFramework/v4.8/Microsoft.CSharp.dll",
"build/.NETFramework/v4.8/Microsoft.CSharp.xml",
"build/.NETFramework/v4.8/Microsoft.JScript.dll",
"build/.NETFramework/v4.8/Microsoft.JScript.xml",
"build/.NETFramework/v4.8/Microsoft.VisualBasic.Compatibility.Data.dll",
"build/.NETFramework/v4.8/Microsoft.VisualBasic.Compatibility.Data.xml",
"build/.NETFramework/v4.8/Microsoft.VisualBasic.Compatibility.dll",
"build/.NETFramework/v4.8/Microsoft.VisualBasic.Compatibility.xml",
"build/.NETFramework/v4.8/Microsoft.VisualBasic.dll",
"build/.NETFramework/v4.8/Microsoft.VisualBasic.xml",
"build/.NETFramework/v4.8/Microsoft.VisualC.STLCLR.dll",
"build/.NETFramework/v4.8/Microsoft.VisualC.STLCLR.xml",
"build/.NETFramework/v4.8/Microsoft.VisualC.dll",
"build/.NETFramework/v4.8/Microsoft.VisualC.xml",
"build/.NETFramework/v4.8/PermissionSets/FullTrust.xml",
"build/.NETFramework/v4.8/PermissionSets/Internet.xml",
"build/.NETFramework/v4.8/PermissionSets/LocalIntranet.xml",
"build/.NETFramework/v4.8/PresentationBuildTasks.dll",
"build/.NETFramework/v4.8/PresentationBuildTasks.xml",
"build/.NETFramework/v4.8/PresentationCore.dll",
"build/.NETFramework/v4.8/PresentationCore.xml",
"build/.NETFramework/v4.8/PresentationFramework.Aero.dll",
"build/.NETFramework/v4.8/PresentationFramework.Aero.xml",
"build/.NETFramework/v4.8/PresentationFramework.Aero2.dll",
"build/.NETFramework/v4.8/PresentationFramework.Aero2.xml",
"build/.NETFramework/v4.8/PresentationFramework.AeroLite.dll",
"build/.NETFramework/v4.8/PresentationFramework.AeroLite.xml",
"build/.NETFramework/v4.8/PresentationFramework.Classic.dll",
"build/.NETFramework/v4.8/PresentationFramework.Classic.xml",
"build/.NETFramework/v4.8/PresentationFramework.Luna.dll",
"build/.NETFramework/v4.8/PresentationFramework.Luna.xml",
"build/.NETFramework/v4.8/PresentationFramework.Royale.dll",
"build/.NETFramework/v4.8/PresentationFramework.Royale.xml",
"build/.NETFramework/v4.8/PresentationFramework.dll",
"build/.NETFramework/v4.8/PresentationFramework.xml",
"build/.NETFramework/v4.8/ReachFramework.dll",
"build/.NETFramework/v4.8/ReachFramework.xml",
"build/.NETFramework/v4.8/RedistList/FrameworkList.xml",
"build/.NETFramework/v4.8/System.Activities.Core.Presentation.dll",
"build/.NETFramework/v4.8/System.Activities.Core.Presentation.xml",
"build/.NETFramework/v4.8/System.Activities.DurableInstancing.dll",
"build/.NETFramework/v4.8/System.Activities.DurableInstancing.xml",
"build/.NETFramework/v4.8/System.Activities.Presentation.dll",
"build/.NETFramework/v4.8/System.Activities.Presentation.xml",
"build/.NETFramework/v4.8/System.Activities.dll",
"build/.NETFramework/v4.8/System.Activities.xml",
"build/.NETFramework/v4.8/System.AddIn.Contract.dll",
"build/.NETFramework/v4.8/System.AddIn.Contract.xml",
"build/.NETFramework/v4.8/System.AddIn.dll",
"build/.NETFramework/v4.8/System.AddIn.xml",
"build/.NETFramework/v4.8/System.ComponentModel.Composition.Registration.dll",
"build/.NETFramework/v4.8/System.ComponentModel.Composition.Registration.xml",
"build/.NETFramework/v4.8/System.ComponentModel.Composition.dll",
"build/.NETFramework/v4.8/System.ComponentModel.Composition.xml",
"build/.NETFramework/v4.8/System.ComponentModel.DataAnnotations.dll",
"build/.NETFramework/v4.8/System.ComponentModel.DataAnnotations.xml",
"build/.NETFramework/v4.8/System.Configuration.Install.dll",
"build/.NETFramework/v4.8/System.Configuration.Install.xml",
"build/.NETFramework/v4.8/System.Configuration.dll",
"build/.NETFramework/v4.8/System.Configuration.xml",
"build/.NETFramework/v4.8/System.Core.dll",
"build/.NETFramework/v4.8/System.Core.xml",
"build/.NETFramework/v4.8/System.Data.DataSetExtensions.dll",
"build/.NETFramework/v4.8/System.Data.DataSetExtensions.xml",
"build/.NETFramework/v4.8/System.Data.Entity.Design.dll",
"build/.NETFramework/v4.8/System.Data.Entity.Design.xml",
"build/.NETFramework/v4.8/System.Data.Entity.dll",
"build/.NETFramework/v4.8/System.Data.Entity.xml",
"build/.NETFramework/v4.8/System.Data.Linq.dll",
"build/.NETFramework/v4.8/System.Data.Linq.xml",
"build/.NETFramework/v4.8/System.Data.OracleClient.dll",
"build/.NETFramework/v4.8/System.Data.OracleClient.xml",
"build/.NETFramework/v4.8/System.Data.Services.Client.dll",
"build/.NETFramework/v4.8/System.Data.Services.Client.xml",
"build/.NETFramework/v4.8/System.Data.Services.Design.dll",
"build/.NETFramework/v4.8/System.Data.Services.Design.xml",
"build/.NETFramework/v4.8/System.Data.Services.dll",
"build/.NETFramework/v4.8/System.Data.Services.xml",
"build/.NETFramework/v4.8/System.Data.SqlXml.dll",
"build/.NETFramework/v4.8/System.Data.SqlXml.xml",
"build/.NETFramework/v4.8/System.Data.dll",
"build/.NETFramework/v4.8/System.Data.xml",
"build/.NETFramework/v4.8/System.Deployment.dll",
"build/.NETFramework/v4.8/System.Deployment.xml",
"build/.NETFramework/v4.8/System.Design.dll",
"build/.NETFramework/v4.8/System.Design.xml",
"build/.NETFramework/v4.8/System.Device.dll",
"build/.NETFramework/v4.8/System.Device.xml",
"build/.NETFramework/v4.8/System.Diagnostics.Tracing.dll",
"build/.NETFramework/v4.8/System.Diagnostics.Tracing.xml",
"build/.NETFramework/v4.8/System.DirectoryServices.AccountManagement.dll",
"build/.NETFramework/v4.8/System.DirectoryServices.AccountManagement.xml",
"build/.NETFramework/v4.8/System.DirectoryServices.Protocols.dll",
"build/.NETFramework/v4.8/System.DirectoryServices.Protocols.xml",
"build/.NETFramework/v4.8/System.DirectoryServices.dll",
"build/.NETFramework/v4.8/System.DirectoryServices.xml",
"build/.NETFramework/v4.8/System.Drawing.Design.dll",
"build/.NETFramework/v4.8/System.Drawing.Design.xml",
"build/.NETFramework/v4.8/System.Drawing.dll",
"build/.NETFramework/v4.8/System.Drawing.xml",
"build/.NETFramework/v4.8/System.Dynamic.dll",
"build/.NETFramework/v4.8/System.EnterpriseServices.Thunk.dll",
"build/.NETFramework/v4.8/System.EnterpriseServices.Wrapper.dll",
"build/.NETFramework/v4.8/System.EnterpriseServices.dll",
"build/.NETFramework/v4.8/System.EnterpriseServices.xml",
"build/.NETFramework/v4.8/System.IO.Compression.FileSystem.dll",
"build/.NETFramework/v4.8/System.IO.Compression.FileSystem.xml",
"build/.NETFramework/v4.8/System.IO.Compression.dll",
"build/.NETFramework/v4.8/System.IO.Compression.xml",
"build/.NETFramework/v4.8/System.IO.Log.dll",
"build/.NETFramework/v4.8/System.IO.Log.xml",
"build/.NETFramework/v4.8/System.IdentityModel.Selectors.dll",
"build/.NETFramework/v4.8/System.IdentityModel.Selectors.xml",
"build/.NETFramework/v4.8/System.IdentityModel.Services.dll",
"build/.NETFramework/v4.8/System.IdentityModel.Services.xml",
"build/.NETFramework/v4.8/System.IdentityModel.dll",
"build/.NETFramework/v4.8/System.IdentityModel.xml",
"build/.NETFramework/v4.8/System.Linq.xml",
"build/.NETFramework/v4.8/System.Management.Instrumentation.dll",
"build/.NETFramework/v4.8/System.Management.Instrumentation.xml",
"build/.NETFramework/v4.8/System.Management.dll",
"build/.NETFramework/v4.8/System.Management.xml",
"build/.NETFramework/v4.8/System.Messaging.dll",
"build/.NETFramework/v4.8/System.Messaging.xml",
"build/.NETFramework/v4.8/System.Net.Http.WebRequest.dll",
"build/.NETFramework/v4.8/System.Net.Http.WebRequest.xml",
"build/.NETFramework/v4.8/System.Net.Http.dll",
"build/.NETFramework/v4.8/System.Net.Http.xml",
"build/.NETFramework/v4.8/System.Net.dll",
"build/.NETFramework/v4.8/System.Net.xml",
"build/.NETFramework/v4.8/System.Numerics.dll",
"build/.NETFramework/v4.8/System.Numerics.xml",
"build/.NETFramework/v4.8/System.Printing.dll",
"build/.NETFramework/v4.8/System.Printing.xml",
"build/.NETFramework/v4.8/System.Reflection.Context.dll",
"build/.NETFramework/v4.8/System.Reflection.Context.xml",
"build/.NETFramework/v4.8/System.Runtime.Caching.dll",
"build/.NETFramework/v4.8/System.Runtime.Caching.xml",
"build/.NETFramework/v4.8/System.Runtime.DurableInstancing.dll",
"build/.NETFramework/v4.8/System.Runtime.DurableInstancing.xml",
"build/.NETFramework/v4.8/System.Runtime.Remoting.dll",
"build/.NETFramework/v4.8/System.Runtime.Remoting.xml",
"build/.NETFramework/v4.8/System.Runtime.Serialization.Formatters.Soap.dll",
"build/.NETFramework/v4.8/System.Runtime.Serialization.Formatters.Soap.xml",
"build/.NETFramework/v4.8/System.Runtime.Serialization.dll",
"build/.NETFramework/v4.8/System.Runtime.Serialization.xml",
"build/.NETFramework/v4.8/System.Security.dll",
"build/.NETFramework/v4.8/System.Security.xml",
"build/.NETFramework/v4.8/System.ServiceModel.Activation.dll",
"build/.NETFramework/v4.8/System.ServiceModel.Activation.xml",
"build/.NETFramework/v4.8/System.ServiceModel.Activities.dll",
"build/.NETFramework/v4.8/System.ServiceModel.Activities.xml",
"build/.NETFramework/v4.8/System.ServiceModel.Channels.dll",
"build/.NETFramework/v4.8/System.ServiceModel.Channels.xml",
"build/.NETFramework/v4.8/System.ServiceModel.Discovery.dll",
"build/.NETFramework/v4.8/System.ServiceModel.Discovery.xml",
"build/.NETFramework/v4.8/System.ServiceModel.Routing.dll",
"build/.NETFramework/v4.8/System.ServiceModel.Routing.xml",
"build/.NETFramework/v4.8/System.ServiceModel.Web.dll",
"build/.NETFramework/v4.8/System.ServiceModel.Web.xml",
"build/.NETFramework/v4.8/System.ServiceModel.dll",
"build/.NETFramework/v4.8/System.ServiceModel.xml",
"build/.NETFramework/v4.8/System.ServiceProcess.dll",
"build/.NETFramework/v4.8/System.ServiceProcess.xml",
"build/.NETFramework/v4.8/System.Speech.dll",
"build/.NETFramework/v4.8/System.Speech.xml",
"build/.NETFramework/v4.8/System.Threading.Tasks.Dataflow.xml",
"build/.NETFramework/v4.8/System.Transactions.dll",
"build/.NETFramework/v4.8/System.Transactions.xml",
"build/.NETFramework/v4.8/System.Web.Abstractions.dll",
"build/.NETFramework/v4.8/System.Web.ApplicationServices.dll",
"build/.NETFramework/v4.8/System.Web.ApplicationServices.xml",
"build/.NETFramework/v4.8/System.Web.DataVisualization.Design.dll",
"build/.NETFramework/v4.8/System.Web.DataVisualization.dll",
"build/.NETFramework/v4.8/System.Web.DataVisualization.xml",
"build/.NETFramework/v4.8/System.Web.DynamicData.Design.dll",
"build/.NETFramework/v4.8/System.Web.DynamicData.Design.xml",
"build/.NETFramework/v4.8/System.Web.DynamicData.dll",
"build/.NETFramework/v4.8/System.Web.DynamicData.xml",
"build/.NETFramework/v4.8/System.Web.Entity.Design.dll",
"build/.NETFramework/v4.8/System.Web.Entity.Design.xml",
"build/.NETFramework/v4.8/System.Web.Entity.dll",
"build/.NETFramework/v4.8/System.Web.Entity.xml",
"build/.NETFramework/v4.8/System.Web.Extensions.Design.dll",
"build/.NETFramework/v4.8/System.Web.Extensions.Design.xml",
"build/.NETFramework/v4.8/System.Web.Extensions.dll",
"build/.NETFramework/v4.8/System.Web.Extensions.xml",
"build/.NETFramework/v4.8/System.Web.Mobile.dll",
"build/.NETFramework/v4.8/System.Web.Mobile.xml",
"build/.NETFramework/v4.8/System.Web.RegularExpressions.dll",
"build/.NETFramework/v4.8/System.Web.RegularExpressions.xml",
"build/.NETFramework/v4.8/System.Web.Routing.dll",
"build/.NETFramework/v4.8/System.Web.Services.dll",
"build/.NETFramework/v4.8/System.Web.Services.xml",
"build/.NETFramework/v4.8/System.Web.dll",
"build/.NETFramework/v4.8/System.Web.xml",
"build/.NETFramework/v4.8/System.Windows.Controls.Ribbon.dll",
"build/.NETFramework/v4.8/System.Windows.Controls.Ribbon.xml",
"build/.NETFramework/v4.8/System.Windows.Forms.DataVisualization.Design.dll",
"build/.NETFramework/v4.8/System.Windows.Forms.DataVisualization.dll",
"build/.NETFramework/v4.8/System.Windows.Forms.DataVisualization.xml",
"build/.NETFramework/v4.8/System.Windows.Forms.dll",
"build/.NETFramework/v4.8/System.Windows.Forms.xml",
"build/.NETFramework/v4.8/System.Windows.Input.Manipulations.dll",
"build/.NETFramework/v4.8/System.Windows.Input.Manipulations.xml",
"build/.NETFramework/v4.8/System.Windows.Presentation.dll",
"build/.NETFramework/v4.8/System.Windows.Presentation.xml",
"build/.NETFramework/v4.8/System.Windows.dll",
"build/.NETFramework/v4.8/System.Workflow.Activities.dll",
"build/.NETFramework/v4.8/System.Workflow.Activities.xml",
"build/.NETFramework/v4.8/System.Workflow.ComponentModel.dll",
"build/.NETFramework/v4.8/System.Workflow.ComponentModel.xml",
"build/.NETFramework/v4.8/System.Workflow.Runtime.dll",
"build/.NETFramework/v4.8/System.Workflow.Runtime.xml",
"build/.NETFramework/v4.8/System.WorkflowServices.dll",
"build/.NETFramework/v4.8/System.WorkflowServices.xml",
"build/.NETFramework/v4.8/System.Xaml.dll",
"build/.NETFramework/v4.8/System.Xaml.xml",
"build/.NETFramework/v4.8/System.Xml.Linq.dll",
"build/.NETFramework/v4.8/System.Xml.Linq.xml",
"build/.NETFramework/v4.8/System.Xml.Serialization.dll",
"build/.NETFramework/v4.8/System.Xml.dll",
"build/.NETFramework/v4.8/System.Xml.xml",
"build/.NETFramework/v4.8/System.dll",
"build/.NETFramework/v4.8/System.xml",
"build/.NETFramework/v4.8/UIAutomationClient.dll",
"build/.NETFramework/v4.8/UIAutomationClient.xml",
"build/.NETFramework/v4.8/UIAutomationClientsideProviders.dll",
"build/.NETFramework/v4.8/UIAutomationClientsideProviders.xml",
"build/.NETFramework/v4.8/UIAutomationProvider.dll",
"build/.NETFramework/v4.8/UIAutomationProvider.xml",
"build/.NETFramework/v4.8/UIAutomationTypes.dll",
"build/.NETFramework/v4.8/UIAutomationTypes.xml",
"build/.NETFramework/v4.8/WindowsBase.dll",
"build/.NETFramework/v4.8/WindowsBase.xml",
"build/.NETFramework/v4.8/WindowsFormsIntegration.dll",
"build/.NETFramework/v4.8/WindowsFormsIntegration.xml",
"build/.NETFramework/v4.8/XamlBuildTask.dll",
"build/.NETFramework/v4.8/XamlBuildTask.xml",
"build/.NETFramework/v4.8/mscorlib.dll",
"build/.NETFramework/v4.8/mscorlib.xml",
"build/.NETFramework/v4.8/namespaces.xml",
"build/.NETFramework/v4.8/sysglobl.dll",
"build/.NETFramework/v4.8/sysglobl.xml",
"build/Microsoft.NETFramework.ReferenceAssemblies.net48.targets",
"microsoft.netframework.referenceassemblies.net48.1.0.3.nupkg.sha512",
"microsoft.netframework.referenceassemblies.net48.nuspec"
]
},
"System.Buffers/4.5.1": {
"sha512": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==",
"type": "package",
"path": "system.buffers/4.5.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/net461/System.Buffers.dll",
"lib/net461/System.Buffers.xml",
"lib/netcoreapp2.0/_._",
"lib/netstandard1.1/System.Buffers.dll",
"lib/netstandard1.1/System.Buffers.xml",
"lib/netstandard2.0/System.Buffers.dll",
"lib/netstandard2.0/System.Buffers.xml",
"lib/uap10.0.16299/_._",
"ref/net45/System.Buffers.dll",
"ref/net45/System.Buffers.xml",
"ref/netcoreapp2.0/_._",
"ref/netstandard1.1/System.Buffers.dll",
"ref/netstandard1.1/System.Buffers.xml",
"ref/netstandard2.0/System.Buffers.dll",
"ref/netstandard2.0/System.Buffers.xml",
"ref/uap10.0.16299/_._",
"system.buffers.4.5.1.nupkg.sha512",
"system.buffers.nuspec",
"useSharedDesignerContext.txt",
"version.txt"
]
},
"System.Memory/4.5.5": {
"sha512": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==",
"type": "package",
"path": "system.memory/4.5.5",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/net461/System.Memory.dll",
"lib/net461/System.Memory.xml",
"lib/netcoreapp2.1/_._",
"lib/netstandard1.1/System.Memory.dll",
"lib/netstandard1.1/System.Memory.xml",
"lib/netstandard2.0/System.Memory.dll",
"lib/netstandard2.0/System.Memory.xml",
"ref/netcoreapp2.1/_._",
"system.memory.4.5.5.nupkg.sha512",
"system.memory.nuspec",
"useSharedDesignerContext.txt",
"version.txt"
]
},
"System.Numerics.Vectors/4.5.0": {
"sha512": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==",
"type": "package",
"path": "system.numerics.vectors/4.5.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/MonoAndroid10/_._",
"lib/MonoTouch10/_._",
"lib/net46/System.Numerics.Vectors.dll",
"lib/net46/System.Numerics.Vectors.xml",
"lib/netcoreapp2.0/_._",
"lib/netstandard1.0/System.Numerics.Vectors.dll",
"lib/netstandard1.0/System.Numerics.Vectors.xml",
"lib/netstandard2.0/System.Numerics.Vectors.dll",
"lib/netstandard2.0/System.Numerics.Vectors.xml",
"lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.dll",
"lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.xml",
"lib/uap10.0.16299/_._",
"lib/xamarinios10/_._",
"lib/xamarinmac20/_._",
"lib/xamarintvos10/_._",
"lib/xamarinwatchos10/_._",
"ref/MonoAndroid10/_._",
"ref/MonoTouch10/_._",
"ref/net45/System.Numerics.Vectors.dll",
"ref/net45/System.Numerics.Vectors.xml",
"ref/net46/System.Numerics.Vectors.dll",
"ref/net46/System.Numerics.Vectors.xml",
"ref/netcoreapp2.0/_._",
"ref/netstandard1.0/System.Numerics.Vectors.dll",
"ref/netstandard1.0/System.Numerics.Vectors.xml",
"ref/netstandard2.0/System.Numerics.Vectors.dll",
"ref/netstandard2.0/System.Numerics.Vectors.xml",
"ref/uap10.0.16299/_._",
"ref/xamarinios10/_._",
"ref/xamarinmac20/_._",
"ref/xamarintvos10/_._",
"ref/xamarinwatchos10/_._",
"system.numerics.vectors.4.5.0.nupkg.sha512",
"system.numerics.vectors.nuspec",
"useSharedDesignerContext.txt",
"version.txt"
]
},
"System.Runtime.CompilerServices.Unsafe/4.5.3": {
"sha512": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==",
"type": "package",
"path": "system.runtime.compilerservices.unsafe/4.5.3",
"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",
"useSharedDesignerContext.txt",
"version.txt"
]
}
},
"projectFileDependencyGroups": {
".NETFramework,Version=v4.8": [
"Microsoft.NETFramework.ReferenceAssemblies >= 1.0.3",
"System.Memory >= 4.5.5"
]
},
"packageFolders": {
"/home/jskala/.nuget/packages/": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/NFOGuard.Emby.Plugin.csproj",
"projectName": "NFOGuard.Emby.Plugin",
"projectPath": "/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/NFOGuard.Emby.Plugin.csproj",
"packagesPath": "/home/jskala/.nuget/packages/",
"outputPath": "/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/home/jskala/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net48"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net48": {
"targetAlias": "net48",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net48": {
"targetAlias": "net48",
"dependencies": {
"Microsoft.NETFramework.ReferenceAssemblies": {
"suppressParent": "All",
"target": "Package",
"version": "[1.0.3, )",
"autoReferenced": true
},
"System.Memory": {
"target": "Package",
"version": "[4.5.5, )"
}
},
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/8.0.414/RuntimeIdentifierGraph.json"
}
}
}
}
@@ -0,0 +1,15 @@
{
"version": 2,
"dgSpecHash": "+Vupasg2dYE=",
"success": true,
"projectFilePath": "/home/jskala/github/NFOguard/NFOGuard.Emby.Plugin/NFOGuard.Emby.Plugin.csproj",
"expectedPackageFiles": [
"/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.memory/4.5.5/system.memory.4.5.5.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"
],
"logs": []
}
+22
View File
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<PluginInfo>
<Name>NFOGuard</Name>
<Description>Synchronizes TV episode PremiereDate to DateCreated to preserve import dates in Emby</Description>
<Overview>This plugin automatically syncs PremiereDate to DateCreated for TV episodes to ensure Emby displays the correct import date from NFO files instead of scan dates.</Overview>
<Version>1.0.0.0</Version>
<MinServerVersion>4.7.0.0</MinServerVersion>
<MaxServerVersion>4.8.99.99</MaxServerVersion>
<Author>NFOGuard Team</Author>
<Category>General</Category>
<ImageUrl>thumb.png</ImageUrl>
<PluginUrl>https://github.com/NFOguard/NFOguard</PluginUrl>
<IsPremium>false</IsPremium>
<IsHidden>false</IsHidden>
<TargetFilename>NFOGuard.Emby.Plugin.dll</TargetFilename>
<SourceUrl>https://github.com/NFOguard/NFOguard/releases/latest/NFOGuard.Emby.Plugin.dll</SourceUrl>
<Changelog>
<Version number="1.0.0.0">
<Description>Initial release - TV episode date synchronization</Description>
</Version>
</Changelog>
</PluginInfo>