diff options
Diffstat (limited to 'MediaBrowser.Common/Plugins/LocalPlugin.cs')
| -rw-r--r-- | MediaBrowser.Common/Plugins/LocalPlugin.cs | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/MediaBrowser.Common/Plugins/LocalPlugin.cs b/MediaBrowser.Common/Plugins/LocalPlugin.cs new file mode 100644 index 000000000..4c8e2d504 --- /dev/null +++ b/MediaBrowser.Common/Plugins/LocalPlugin.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using MediaBrowser.Model.Plugins; + +namespace MediaBrowser.Common.Plugins +{ + /// <summary> + /// Local plugin class. + /// </summary> + public class LocalPlugin : IEquatable<LocalPlugin> + { + private readonly bool _supported; + private Version? _version; + + /// <summary> + /// Initializes a new instance of the <see cref="LocalPlugin"/> class. + /// </summary> + /// <param name="path">The plugin path.</param> + /// <param name="isSupported"><b>True</b> if Jellyfin supports this version of the plugin.</param> + /// <param name="manifest">The manifest record for this plugin, or null if one does not exist.</param> + public LocalPlugin(string path, bool isSupported, PluginManifest manifest) + { + Path = path; + DllFiles = Array.Empty<string>(); + _supported = isSupported; + Manifest = manifest; + } + + /// <summary> + /// Gets the plugin id. + /// </summary> + public Guid Id => Manifest.Id; + + /// <summary> + /// Gets the plugin name. + /// </summary> + public string Name => Manifest.Name; + + /// <summary> + /// Gets the plugin version. + /// </summary> + public Version Version + { + get + { + if (_version == null) + { + _version = Version.Parse(Manifest.Version); + } + + return _version; + } + } + + /// <summary> + /// Gets the plugin path. + /// </summary> + public string Path { get; } + + /// <summary> + /// Gets or sets the list of dll files for this plugin. + /// </summary> + public IReadOnlyList<string> DllFiles { get; set; } + + /// <summary> + /// Gets or sets the instance of this plugin. + /// </summary> + public IPlugin? Instance { get; set; } + + /// <summary> + /// Gets a value indicating whether Jellyfin supports this version of the plugin, and it's enabled. + /// </summary> + public bool IsEnabledAndSupported => _supported && Manifest.Status >= PluginStatus.Active; + + /// <summary> + /// Gets a value indicating whether the plugin has a manifest. + /// </summary> + public PluginManifest Manifest { get; } + + /// <summary> + /// Compare two <see cref="LocalPlugin"/>. + /// </summary> + /// <param name="a">The first item.</param> + /// <param name="b">The second item.</param> + /// <returns>Comparison result.</returns> + public static int Compare(LocalPlugin a, LocalPlugin b) + { + if (a == null || b == null) + { + throw new ArgumentNullException(a == null ? nameof(a) : nameof(b)); + } + + var compare = string.Compare(a.Name, b.Name, StringComparison.OrdinalIgnoreCase); + + // Id is not equal but name is. + if (!a.Id.Equals(b.Id) && compare == 0) + { + compare = a.Id.CompareTo(b.Id); + } + + return compare == 0 ? a.Version.CompareTo(b.Version) : compare; + } + + /// <summary> + /// Returns the plugin information. + /// </summary> + /// <returns>A <see cref="PluginInfo"/> instance containing the information.</returns> + public PluginInfo GetPluginInfo() + { + var inst = Instance?.GetPluginInfo() ?? new PluginInfo(Manifest.Name, Version, Manifest.Description, Manifest.Id, true); + inst.Status = Manifest.Status; + inst.HasImage = !string.IsNullOrEmpty(Manifest.ImagePath); + return inst; + } + + /// <inheritdoc /> + public override bool Equals(object? obj) + { + return obj is LocalPlugin other && this.Equals(other); + } + + /// <inheritdoc /> + public override int GetHashCode() + { + return Name.GetHashCode(StringComparison.OrdinalIgnoreCase); + } + + /// <inheritdoc /> + public bool Equals(LocalPlugin? other) + { + if (other == null) + { + return false; + } + + return Name.Equals(other.Name, StringComparison.OrdinalIgnoreCase) && Id.Equals(other.Id) && Version.Equals(other.Version); + } + } +} |
