diff --git a/Apprise/Apprise.csproj b/Apprise/Apprise.csproj index 3939804f..579701af 100644 Binary files a/Apprise/Apprise.csproj and b/Apprise/Apprise.csproj differ diff --git a/BasicNodes/BasicNodes.csproj b/BasicNodes/BasicNodes.csproj index 116c87a6..ca76b362 100644 Binary files a/BasicNodes/BasicNodes.csproj and b/BasicNodes/BasicNodes.csproj differ diff --git a/ChecksumNodes/ChecksumNodes.csproj b/ChecksumNodes/ChecksumNodes.csproj index 1d99970a..f76b5fc7 100644 Binary files a/ChecksumNodes/ChecksumNodes.csproj and b/ChecksumNodes/ChecksumNodes.csproj differ diff --git a/CollectionNodes/CollectionNodes.csproj b/CollectionNodes/CollectionNodes.csproj index 5627a2e9..d4f57c41 100644 Binary files a/CollectionNodes/CollectionNodes.csproj and b/CollectionNodes/CollectionNodes.csproj differ diff --git a/DiscordNodes/DiscordNodes.csproj b/DiscordNodes/DiscordNodes.csproj index 5e10e0fc..c08b44a9 100644 Binary files a/DiscordNodes/DiscordNodes.csproj and b/DiscordNodes/DiscordNodes.csproj differ diff --git a/EmailNodes/EmailNodes.csproj b/EmailNodes/EmailNodes.csproj index 83df4e63..ffefd4e8 100644 Binary files a/EmailNodes/EmailNodes.csproj and b/EmailNodes/EmailNodes.csproj differ diff --git a/Emby/Emby.csproj b/Emby/Emby.csproj index a36fa260..d923a09a 100644 Binary files a/Emby/Emby.csproj and b/Emby/Emby.csproj differ diff --git a/FileFlows.Plugin.dll b/FileFlows.Plugin.dll index f9d8833f..ecb4cbf2 100644 Binary files a/FileFlows.Plugin.dll and b/FileFlows.Plugin.dll differ diff --git a/FileFlows.Plugin.pdb b/FileFlows.Plugin.pdb index 72c23812..977e87b5 100644 Binary files a/FileFlows.Plugin.pdb and b/FileFlows.Plugin.pdb differ diff --git a/Gotify/Gotify.csproj b/Gotify/Gotify.csproj index 9d914b67..b06ec535 100644 Binary files a/Gotify/Gotify.csproj and b/Gotify/Gotify.csproj differ diff --git a/ImageNodes/ExtensionMethods.cs b/ImageNodes/ExtensionMethods.cs index 3fcad0a3..521b19de 100644 --- a/ImageNodes/ExtensionMethods.cs +++ b/ImageNodes/ExtensionMethods.cs @@ -3,4 +3,11 @@ internal static class ExtensionMethods { public static string? EmptyAsNull(this string str) => str == string.Empty ? null : str; + public static void AddOrUpdate(this Dictionary dict, string key, object value) + { + if (dict.ContainsKey(key)) + dict[key] = value; + else + dict.Add(key, value); + } } diff --git a/ImageNodes/ImageInfo.cs b/ImageNodes/ImageInfo.cs new file mode 100644 index 00000000..bc10064a --- /dev/null +++ b/ImageNodes/ImageInfo.cs @@ -0,0 +1,10 @@ +namespace FileFlows.ImageNodes; + +public class ImageInfo +{ + public int Width { get; set; } + public int Height { get; set; } + public string Format { get; set; } + public bool IsPortrait => Width < Height; + public bool IsLandscape => Height < Width; +} diff --git a/ImageNodes/ImageNodes.csproj b/ImageNodes/ImageNodes.csproj index a4d1ca61..746bc780 100644 Binary files a/ImageNodes/ImageNodes.csproj and b/ImageNodes/ImageNodes.csproj differ diff --git a/ImageNodes/ImageNodes.en.json b/ImageNodes/ImageNodes.en.json index 2da1fcd4..bf3c8768 100644 --- a/ImageNodes/ImageNodes.en.json +++ b/ImageNodes/ImageNodes.en.json @@ -13,6 +13,12 @@ "Vertical-Help": "If set the image will be flipped vertically, otherwise horizontally" } }, + "ImageFile": { + "Outputs": { + "1": "Image file" + }, + "Description": "An image file" + }, "ImageFormat": { "Outputs": { "1": "Image converted, saved to new temporary file" @@ -23,6 +29,20 @@ "Format-Help": "The image format to convert to" } }, + "ImageIsLandscape": { + "Outputs": { + "1": "Image is landscape", + "2": "Image is not landscape" + }, + "Description": "Test if an image is landscape" + }, + "ImageIsPortrait": { + "Outputs": { + "1": "Image is portrait", + "2": "Image is not portrait" + }, + "Description": "Test if an image is portrait" + }, "ImageResizer": { "Outputs": { "1": "Image resized, saved to new temporary file" @@ -32,11 +52,11 @@ "Format": "Format", "Format-Help": "The image format to convert to", "Width": "Width", - "Width-Suffix": "px", "Height": "Height", - "Height-Suffix": "px", "Mode": "Mode", - "Mode-Help": "The mode to use when resizing the image" + "Mode-Help": "The mode to use when resizing the image", + "Percent": "Percent", + "Percent-Help": "When selected, the width and height values become percentages, with 100 being 100%" } }, "ImageRotate": { diff --git a/ImageNodes/Images/ImageBaseNode.cs b/ImageNodes/Images/ImageBaseNode.cs new file mode 100644 index 00000000..d9ddc4f7 --- /dev/null +++ b/ImageNodes/Images/ImageBaseNode.cs @@ -0,0 +1,72 @@ +using SixLabors.ImageSharp.Formats; + +namespace FileFlows.ImageNodes.Images; + +public abstract class ImageBaseNode:Node +{ + + private const string IMAGE_INFO = "ImageInfo"; + protected void UpdateImageInfo(NodeParameters args, Dictionary variables = null) + { + using var image = Image.Load(args.WorkingFile, out IImageFormat format); + var imageInfo = new ImageInfo + { + Width = image.Width, + Height = image.Height, + Format = format.Name + }; + + variables ??= new Dictionary(); + if (args.Parameters.ContainsKey(IMAGE_INFO)) + args.Parameters[IMAGE_INFO] = imageInfo; + else + args.Parameters.Add(IMAGE_INFO, imageInfo); + + variables.AddOrUpdate("img.Width", imageInfo.Width); + variables.AddOrUpdate("img.Height", imageInfo.Height); + variables.AddOrUpdate("img.Format", imageInfo.Format); + variables.AddOrUpdate("img.IsPortrait", imageInfo.IsPortrait); + variables.AddOrUpdate("img.IsLandscape", imageInfo.IsLandscape); + + args.UpdateVariables(variables); + } + protected void UpdateImageInfo(NodeParameters args, Image image, IImageFormat format, Dictionary variables = null) + { + var imageInfo = new ImageInfo + { + Width = image.Width, + Height = image.Height, + Format = format.Name + }; + + variables ??= new Dictionary(); + if (args.Parameters.ContainsKey(IMAGE_INFO)) + args.Parameters[IMAGE_INFO] = imageInfo; + else + args.Parameters.Add(IMAGE_INFO, imageInfo); + + variables.AddOrUpdate("img.Width", imageInfo.Width); + variables.AddOrUpdate("img.Height", imageInfo.Height); + variables.AddOrUpdate("img.Format", imageInfo.Format); + variables.AddOrUpdate("img.IsPortrait", imageInfo.IsPortrait); + variables.AddOrUpdate("img.IsLandscape", imageInfo.IsLandscape); + + args.UpdateVariables(variables); + } + + internal ImageInfo? GetImageInfo(NodeParameters args) + { + if (args.Parameters.ContainsKey(IMAGE_INFO) == false) + { + args.Logger?.WLog("No codec information loaded, use a 'Image File' node first"); + return null; + } + var result = args.Parameters[IMAGE_INFO] as ImageInfo; + if (result == null) + { + args.Logger?.WLog("ImageInfo not found for file"); + return null; + } + return result; + } +} diff --git a/ImageNodes/Images/ImageFile.cs b/ImageNodes/Images/ImageFile.cs new file mode 100644 index 00000000..b696ab4e --- /dev/null +++ b/ImageNodes/Images/ImageFile.cs @@ -0,0 +1,40 @@ +namespace FileFlows.ImageNodes.Images; + +using FileFlows.Plugin; + +public class ImageFile : ImageBaseNode +{ + public override int Outputs => 1; + public override FlowElementType Type => FlowElementType.Input; + + public override string Icon => "fas fa-file-image"; + + private Dictionary _Variables; + public override Dictionary Variables => _Variables; + public ImageFile() + { + _Variables = new Dictionary() + { + { "img.Width", 1920 }, + { "img.Heigh", 1080 }, + { "img.Format", "PNG" }, + { "img.IsPortrait", true }, + { "img.IsLandscape", false } + }; + } + + public override int Execute(NodeParameters args) + { + try + { + UpdateImageInfo(args, this.Variables); + + return 1; + } + catch (Exception ex) + { + args.Logger?.ELog("Failed processing MusicFile: " + ex.Message); + return -1; + } + } +} diff --git a/ImageNodes/Images/ImageFlip.cs b/ImageNodes/Images/ImageFlip.cs index 9602c20c..19501876 100644 --- a/ImageNodes/Images/ImageFlip.cs +++ b/ImageNodes/Images/ImageFlip.cs @@ -19,8 +19,7 @@ public class ImageFlip: ImageNode using var image = Image.Load(args.WorkingFile, out IImageFormat format); image.Mutate(c => c.Flip(Vertical ? FlipMode.Vertical : FlipMode.Horizontal)); var formatOpts = GetFormat(args); - SaveImage(image, formatOpts.file, formatOpts.format ?? format); - args.SetWorkingFile(formatOpts.file); + SaveImage(args, image, formatOpts.file, formatOpts.format ?? format); return 1; } diff --git a/ImageNodes/Images/ImageFormat.cs b/ImageNodes/Images/ImageFormat.cs index d4584c82..cd174a78 100644 --- a/ImageNodes/Images/ImageFormat.cs +++ b/ImageNodes/Images/ImageFormat.cs @@ -15,8 +15,7 @@ public class ImageFormat: ImageNode using var image = Image.Load(args.WorkingFile, out IImageFormat format); var formatOpts = GetFormat(args); - SaveImage(image, formatOpts.file, formatOpts.format ?? format); - args.SetWorkingFile(formatOpts.file); + SaveImage(args, image, formatOpts.file, formatOpts.format ?? format); return 1; } } diff --git a/ImageNodes/Images/ImageIsLandscape.cs b/ImageNodes/Images/ImageIsLandscape.cs new file mode 100644 index 00000000..82918ba5 --- /dev/null +++ b/ImageNodes/Images/ImageIsLandscape.cs @@ -0,0 +1,18 @@ +namespace FileFlows.ImageNodes.Images; + +public class ImageIsLandscape: ImageBaseNode +{ + public override int Inputs => 1; + public override int Outputs => 2; + public override FlowElementType Type => FlowElementType.Logic; + public override string Icon => "fas fa-image"; + + + public override int Execute(NodeParameters args) + { + var img = GetImageInfo(args); + if (img == null) + return -1; + return img.IsLandscape ? 1 : 2; + } +} diff --git a/ImageNodes/Images/ImageIsPortrait.cs b/ImageNodes/Images/ImageIsPortrait.cs new file mode 100644 index 00000000..ae9c1a9d --- /dev/null +++ b/ImageNodes/Images/ImageIsPortrait.cs @@ -0,0 +1,18 @@ +namespace FileFlows.ImageNodes.Images; + +public class ImageIsPortrait : ImageBaseNode +{ + public override int Inputs => 1; + public override int Outputs => 2; + public override FlowElementType Type => FlowElementType.Logic; + public override string Icon => "fas fa-portrait"; + + + public override int Execute(NodeParameters args) + { + var img = GetImageInfo(args); + if (img == null) + return -1; + return img.IsPortrait ? 1 : 2; + } +} diff --git a/ImageNodes/Images/ImageNode.cs b/ImageNodes/Images/ImageNode.cs index 8fb280c8..01c4828a 100644 --- a/ImageNodes/Images/ImageNode.cs +++ b/ImageNodes/Images/ImageNode.cs @@ -10,7 +10,7 @@ using SixLabors.ImageSharp.Formats.Webp; namespace FileFlows.ImageNodes.Images; -public abstract class ImageNode : Node +public abstract class ImageNode : ImageBaseNode { [Select(nameof(FormatOptions), 1)] public string Format { get; set; } @@ -24,6 +24,7 @@ public abstract class ImageNode : Node { _FormatOptions = new List { + new ListOption { Value = "", Label = "Same as source"}, new ListOption { Value = IMAGE_FORMAT_BMP, Label = "Bitmap"}, new ListOption { Value = IMAGE_FORMAT_GIF, Label = "GIF"}, new ListOption { Value = IMAGE_FORMAT_JPEG, Label = "JPEG"}, @@ -85,9 +86,14 @@ public abstract class ImageNode : Node return (format, newFile); } - protected void SaveImage(Image img, string file, IImageFormat format) + protected void SaveImage(NodeParameters args, Image img, string file, IImageFormat format, bool updateWorkingFile = true) { using Stream outStream = new FileStream(file, FileMode.Create); img.Save(outStream, format); + if (updateWorkingFile) + { + args.SetWorkingFile(file); + UpdateImageInfo(args, img, format, Variables); + } } } \ No newline at end of file diff --git a/ImageNodes/Images/ImageResizer.cs b/ImageNodes/Images/ImageResizer.cs index 10dd7226..6d6b2671 100644 --- a/ImageNodes/Images/ImageResizer.cs +++ b/ImageNodes/Images/ImageResizer.cs @@ -14,9 +14,9 @@ namespace FileFlows.ImageNodes.Images; public class ImageResizer: ImageNode { public override int Inputs => 1; - public override int Outputs => 2; + public override int Outputs => 1; public override FlowElementType Type => FlowElementType.Process; - public override string Icon => "fas fa-image"; + public override string Icon => "fas fa-expand"; [Select(nameof(ResizeModes), 2)] @@ -42,12 +42,15 @@ public class ImageResizer: ImageNode } [NumberInt(3)] - [Range(0, int.MaxValue)] + [Range(1, int.MaxValue)] public int Width { get; set; } [NumberInt(4)] - [Range(0, int.MaxValue)] + [Range(1, int.MaxValue)] public int Height { get; set; } - + + [Boolean(5)] + public bool Percent { get; set; } + public override int Execute(NodeParameters args) { using var image = Image.Load(args.WorkingFile, out IImageFormat format); @@ -65,15 +68,22 @@ public class ImageResizer: ImageNode } var formatOpts = GetFormat(args); + + float w = Width; + float h = Height; + if (Percent) + { + w = (int)(image.Width * (w / 100f)); + h = (int)(image.Height * (h / 100f)); + } image.Mutate(c => c.Resize(new ResizeOptions() { - Size = new Size(Width, Height), + Size = new Size((int)w, (int)h), Mode = rzMode })); - SaveImage(image, formatOpts.file, formatOpts.format ?? format); - args.SetWorkingFile(formatOpts.file); + SaveImage(args, image, formatOpts.file, formatOpts.format ?? format); return 1; } } diff --git a/ImageNodes/Images/ImageRotate.cs b/ImageNodes/Images/ImageRotate.cs index 821ec0e1..c0f45d6b 100644 --- a/ImageNodes/Images/ImageRotate.cs +++ b/ImageNodes/Images/ImageRotate.cs @@ -36,8 +36,7 @@ public class ImageRotate: ImageNode using var image = Image.Load(args.WorkingFile, out IImageFormat format); image.Mutate(c => c.Rotate(Angle)); var formatOpts = GetFormat(args); - SaveImage(image, formatOpts.file, formatOpts.format ?? format); - args.SetWorkingFile(formatOpts.file); + SaveImage(args, image, formatOpts.file, formatOpts.format ?? format); return 1; } diff --git a/ImageNodes/Tests/ImageTests.cs b/ImageNodes/Tests/ImageTests.cs index 7f3b3b1a..ed540bbf 100644 --- a/ImageNodes/Tests/ImageTests.cs +++ b/ImageNodes/Tests/ImageTests.cs @@ -2,31 +2,53 @@ using FileFlows.ImageNodes.Images; using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Runtime.InteropServices; namespace FileFlows.ImageNodes.Tests; [TestClass] public class ImageNodesTests { + string TestImage1; + string TestImage2; + string TempDir; + + public ImageNodesTests() + { + bool isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + if (isWindows) + { + TestImage1 = @"D:\videos\pictures\image1.jpg"; + TestImage2 = @"D:\videos\pictures\image2.png"; + TempDir = @"D:\videos\temp"; + } + else + { + TestImage1 = "/home/john/Pictures/fileflows.png"; + TestImage2 = "/home/john/Pictures/36410427.png"; + TempDir = "/home/john/src/temp/"; + } + } + [TestMethod] public void ImageNodes_Basic_ImageFormat() { - var args = new NodeParameters("/home/john/Pictures/fileflows.png", new TestLogger(), false, string.Empty) + var args = new NodeParameters(TestImage1, new TestLogger(), false, string.Empty) { - TempPath = "/home/john/src/temp/" + TempPath = TempDir }; var node = new ImageFormat(); node.Format = IMAGE_FORMAT_GIF; Assert.AreEqual(1, node.Execute(args)); } - + [TestMethod] public void ImageNodes_Basic_Resize() { - var args = new NodeParameters("/home/john/Pictures/fileflows.png", new TestLogger(), false, string.Empty) + var args = new NodeParameters(TestImage1, new TestLogger(), false, string.Empty) { - TempPath = "/home/john/src/temp/" + TempPath = TempDir }; var node = new ImageResizer(); @@ -35,13 +57,38 @@ public class ImageNodesTests node.Mode = ResizeMode.Fill; Assert.AreEqual(1, node.Execute(args)); } - + + [TestMethod] + public void ImageNodes_Basic_Resize_Percent() + { + var args = new NodeParameters(TestImage1, new TestLogger(), false, string.Empty) + { + TempPath = TempDir + }; + + var imgFile = new ImageFile(); + imgFile.Execute(args); + int width = imgFile.GetImageInfo(args).Width; + int height = imgFile.GetImageInfo(args).Height; + + var node = new ImageResizer(); + node.Width = 200; + node.Height = 50; + node.Percent = true; + node.Mode = ResizeMode.Fill; + Assert.AreEqual(1, node.Execute(args)); + var img = node.GetImageInfo(args); + Assert.IsNotNull(img); + Assert.AreEqual(width * 2, img.Width); + Assert.AreEqual(height / 2, img.Height); + } + [TestMethod] public void ImageNodes_Basic_Flip() { - var args = new NodeParameters("/home/john/Pictures/36410427.png", new TestLogger(), false, string.Empty) + var args = new NodeParameters(TestImage2, new TestLogger(), false, string.Empty) { - TempPath = "/home/john/src/temp/" + TempPath = TempDir }; var node = new ImageFlip(); @@ -53,9 +100,9 @@ public class ImageNodesTests [TestMethod] public void ImageNodes_Basic_Rotate() { - var args = new NodeParameters("/home/john/Pictures/36410427.png", new TestLogger(), false, string.Empty) + var args = new NodeParameters(TestImage2, new TestLogger(), false, string.Empty) { - TempPath = "/home/john/src/temp/" + TempPath = TempDir }; var node = new ImageRotate(); diff --git a/MetaNodes/MetaNodes.csproj b/MetaNodes/MetaNodes.csproj index 65c863fa..67463681 100644 Binary files a/MetaNodes/MetaNodes.csproj and b/MetaNodes/MetaNodes.csproj differ diff --git a/MusicNodes/MusicNodes.csproj b/MusicNodes/MusicNodes.csproj index 4434cbc9..4066fe6b 100644 Binary files a/MusicNodes/MusicNodes.csproj and b/MusicNodes/MusicNodes.csproj differ diff --git a/Plex/Plex.csproj b/Plex/Plex.csproj index 7fdb8613..5c1ddc9a 100644 Binary files a/Plex/Plex.csproj and b/Plex/Plex.csproj differ diff --git a/VideoNodes/VideoNodes.csproj b/VideoNodes/VideoNodes.csproj index b656063c..c4b1d75e 100644 Binary files a/VideoNodes/VideoNodes.csproj and b/VideoNodes/VideoNodes.csproj differ diff --git a/build/utils/PluginInfoGenerator/FileFlows.Plugin.dll b/build/utils/PluginInfoGenerator/FileFlows.Plugin.dll index 2115cd36..3305a82c 100644 Binary files a/build/utils/PluginInfoGenerator/FileFlows.Plugin.dll and b/build/utils/PluginInfoGenerator/FileFlows.Plugin.dll differ diff --git a/build/utils/PluginInfoGenerator/FileFlows.Plugin.pdb b/build/utils/PluginInfoGenerator/FileFlows.Plugin.pdb index 0e42da96..82d703d9 100644 Binary files a/build/utils/PluginInfoGenerator/FileFlows.Plugin.pdb and b/build/utils/PluginInfoGenerator/FileFlows.Plugin.pdb differ diff --git a/build/utils/PluginInfoGenerator/FileFlows.ServerShared.dll b/build/utils/PluginInfoGenerator/FileFlows.ServerShared.dll index 853263af..650a0cf2 100644 Binary files a/build/utils/PluginInfoGenerator/FileFlows.ServerShared.dll and b/build/utils/PluginInfoGenerator/FileFlows.ServerShared.dll differ diff --git a/build/utils/PluginInfoGenerator/FileFlows.ServerShared.pdb b/build/utils/PluginInfoGenerator/FileFlows.ServerShared.pdb index f603d988..5b8381b0 100644 Binary files a/build/utils/PluginInfoGenerator/FileFlows.ServerShared.pdb and b/build/utils/PluginInfoGenerator/FileFlows.ServerShared.pdb differ diff --git a/build/utils/PluginInfoGenerator/FileFlows.ServerShared.xml b/build/utils/PluginInfoGenerator/FileFlows.ServerShared.xml index c3138061..88b842df 100644 --- a/build/utils/PluginInfoGenerator/FileFlows.ServerShared.xml +++ b/build/utils/PluginInfoGenerator/FileFlows.ServerShared.xml @@ -31,5 +31,135 @@ The flow part an insstance of the plugin node + + + Plugin Service interface + + + + + Get all plugin infos + + all plugin infos + + + + Updates plugin info + + the plugin info + the updated plugininfo + + + + Download a plugin + + the plugin to download + the byte data of the plugin + + + + Gets the settings json for a plugin + + the name of the plugin package + the settings json + + + + Plugin service + + + + + Loads an instance of the plugin service + + an instance of the plugin service + + + + Download a plugin + + the plugin to download + the byte data of the plugin + + + + Get all plugin infos + + all plugin infos + + + + Gets the settings json for a plugin + + the name of the plugin package + the settings json + + + + Updates plugin info + + the plugin info + the updated plugininfo + This not yet implemented + + + + An interface of the System Service + + + + + Gets the version from the server + + the server version + + + + Gets the node updater binary + + the node updater binary + + + + Gets an node update available + + the current version of the node + if there is a node update available, returns the update + + + + A System Service + + + + + Gets or sets the loader for SystemService + + + + + Loads an instance of SystemService + + an instance of SystemService + + + + Gets the version from the server + + the server version + + + + Gets the node updater binary + + the node updater binary + + + + Gets an node update available + + the current version of the node + if there is a node update available, returns the update + diff --git a/build/utils/PluginInfoGenerator/FileFlows.Shared.dll b/build/utils/PluginInfoGenerator/FileFlows.Shared.dll index 186a6f83..72bc19f7 100644 Binary files a/build/utils/PluginInfoGenerator/FileFlows.Shared.dll and b/build/utils/PluginInfoGenerator/FileFlows.Shared.dll differ diff --git a/build/utils/PluginInfoGenerator/FileFlows.Shared.pdb b/build/utils/PluginInfoGenerator/FileFlows.Shared.pdb index 3ea68a7a..27a18e75 100644 Binary files a/build/utils/PluginInfoGenerator/FileFlows.Shared.pdb and b/build/utils/PluginInfoGenerator/FileFlows.Shared.pdb differ diff --git a/build/utils/PluginInfoGenerator/FileFlows.Shared.xml b/build/utils/PluginInfoGenerator/FileFlows.Shared.xml index 0fffa020..d64d47ab 100644 --- a/build/utils/PluginInfoGenerator/FileFlows.Shared.xml +++ b/build/utils/PluginInfoGenerator/FileFlows.Shared.xml @@ -4,6 +4,31 @@ FileFlows.Shared + + + Clones an object + + + + + Checks if objects are teh same reference + + + + + Checks if two objects are equal + + first object + second object + If the objects are ruqla + + + + Gets a hashcode of an object + + the object + the objec hashcode + Gets or sets optional place holder text, this can be a translation key diff --git a/build/utils/PluginInfoGenerator/PluginInfoGenerator.dll b/build/utils/PluginInfoGenerator/PluginInfoGenerator.dll index 83b26d5b..87d0fd88 100644 Binary files a/build/utils/PluginInfoGenerator/PluginInfoGenerator.dll and b/build/utils/PluginInfoGenerator/PluginInfoGenerator.dll differ diff --git a/build/utils/PluginInfoGenerator/PluginInfoGenerator.pdb b/build/utils/PluginInfoGenerator/PluginInfoGenerator.pdb index 7645dc6f..8e7f7db8 100644 Binary files a/build/utils/PluginInfoGenerator/PluginInfoGenerator.pdb and b/build/utils/PluginInfoGenerator/PluginInfoGenerator.pdb differ diff --git a/build/utils/spellcheck/ignoredwords.txt b/build/utils/spellcheck/ignoredwords.txt index 20afc093..6a0a0c59 100644 --- a/build/utils/spellcheck/ignoredwords.txt +++ b/build/utils/spellcheck/ignoredwords.txt @@ -83,4 +83,5 @@ Emby revenz Fenrus Plex-Token -analyze \ No newline at end of file +analyze +px \ No newline at end of file