Kaynağa Gözat

Merge pull request #5861 from BaronGreenback/ProfileMatch

Change profile matching to match what the web interface says.

(cherry picked from commit 12496677bd47a9c815e5af5dffb6b641656668e6)
Signed-off-by: Joshua M. Boniface <joshua@boniface.me>
Claus Vium 4 yıl önce
ebeveyn
işleme
53239b0529

+ 30 - 65
Emby.Dlna/DlnaManager.cs

@@ -111,7 +111,7 @@ namespace Emby.Dlna
 
             if (profile != null)
             {
-                _logger.LogDebug("Found matching device profile: {0}", profile.Name);
+                _logger.LogDebug("Found matching device profile: {ProfileName}", profile.Name);
             }
             else
             {
@@ -138,80 +138,45 @@ namespace Emby.Dlna
             _logger.LogInformation(builder.ToString());
         }
 
-        private bool IsMatch(DeviceIdentification deviceInfo, DeviceIdentification profileInfo)
+        /// <summary>
+        /// Attempts to match a device with a profile.
+        /// Rules:
+        /// - If the profile field has no value, the field matches irregardless of its contents.
+        /// - the profile field can be an exact match, or a reg exp.
+        /// </summary>
+        /// <param name="deviceInfo">The <see cref="DeviceIdentification"/> of the device.</param>
+        /// <param name="profileInfo">The <see cref="DeviceIdentification"/> of the profile.</param>
+        /// <returns><b>True</b> if they match.</returns>
+        public bool IsMatch(DeviceIdentification deviceInfo, DeviceIdentification profileInfo)
         {
-            if (!string.IsNullOrEmpty(profileInfo.FriendlyName))
-            {
-                if (deviceInfo.FriendlyName == null || !IsRegexOrSubstringMatch(deviceInfo.FriendlyName, profileInfo.FriendlyName))
-                {
-                    return false;
-                }
-            }
-
-            if (!string.IsNullOrEmpty(profileInfo.Manufacturer))
-            {
-                if (deviceInfo.Manufacturer == null || !IsRegexOrSubstringMatch(deviceInfo.Manufacturer, profileInfo.Manufacturer))
-                {
-                    return false;
-                }
-            }
-
-            if (!string.IsNullOrEmpty(profileInfo.ManufacturerUrl))
-            {
-                if (deviceInfo.ManufacturerUrl == null || !IsRegexOrSubstringMatch(deviceInfo.ManufacturerUrl, profileInfo.ManufacturerUrl))
-                {
-                    return false;
-                }
-            }
-
-            if (!string.IsNullOrEmpty(profileInfo.ModelDescription))
-            {
-                if (deviceInfo.ModelDescription == null || !IsRegexOrSubstringMatch(deviceInfo.ModelDescription, profileInfo.ModelDescription))
-                {
-                    return false;
-                }
-            }
-
-            if (!string.IsNullOrEmpty(profileInfo.ModelName))
-            {
-                if (deviceInfo.ModelName == null || !IsRegexOrSubstringMatch(deviceInfo.ModelName, profileInfo.ModelName))
-                {
-                    return false;
-                }
-            }
-
-            if (!string.IsNullOrEmpty(profileInfo.ModelNumber))
-            {
-                if (deviceInfo.ModelNumber == null || !IsRegexOrSubstringMatch(deviceInfo.ModelNumber, profileInfo.ModelNumber))
-                {
-                    return false;
-                }
-            }
+            return IsRegexOrSubstringMatch(deviceInfo.FriendlyName, profileInfo.FriendlyName)
+                && IsRegexOrSubstringMatch(deviceInfo.Manufacturer, profileInfo.Manufacturer)
+                && IsRegexOrSubstringMatch(deviceInfo.ManufacturerUrl, profileInfo.ManufacturerUrl)
+                && IsRegexOrSubstringMatch(deviceInfo.ModelDescription, profileInfo.ModelDescription)
+                && IsRegexOrSubstringMatch(deviceInfo.ModelName, profileInfo.ModelName)
+                && IsRegexOrSubstringMatch(deviceInfo.ModelNumber, profileInfo.ModelNumber)
+                && IsRegexOrSubstringMatch(deviceInfo.ModelUrl, profileInfo.ModelUrl)
+                && IsRegexOrSubstringMatch(deviceInfo.SerialNumber, profileInfo.SerialNumber);
+        }
 
-            if (!string.IsNullOrEmpty(profileInfo.ModelUrl))
+        private bool IsRegexOrSubstringMatch(string input, string pattern)
+        {
+            if (string.IsNullOrEmpty(pattern))
             {
-                if (deviceInfo.ModelUrl == null || !IsRegexOrSubstringMatch(deviceInfo.ModelUrl, profileInfo.ModelUrl))
-                {
-                    return false;
-                }
+                // In profile identification: An empty pattern matches anything.
+                return true;
             }
 
-            if (!string.IsNullOrEmpty(profileInfo.SerialNumber))
+            if (string.IsNullOrEmpty(input))
             {
-                if (deviceInfo.SerialNumber == null || !IsRegexOrSubstringMatch(deviceInfo.SerialNumber, profileInfo.SerialNumber))
-                {
-                    return false;
-                }
+                // The profile contains a value, and the device doesn't.
+                return false;
             }
 
-            return true;
-        }
-
-        private bool IsRegexOrSubstringMatch(string input, string pattern)
-        {
             try
             {
-                return input.Contains(pattern, StringComparison.OrdinalIgnoreCase) || Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
+                return input.Equals(pattern, StringComparison.OrdinalIgnoreCase)
+                    || Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
             }
             catch (ArgumentException ex)
             {

+ 131 - 0
tests/Jellyfin.Dlna.Tests/DlnaManagerTests.cs

@@ -0,0 +1,131 @@
+using Emby.Dlna;
+using Emby.Dlna.PlayTo;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Controller;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Serialization;
+using Microsoft.Extensions.Logging;
+using Moq;
+using Xunit;
+
+namespace Jellyfin.Dlna.Tests
+{
+    public class DlnaManagerTests
+    {
+        private DlnaManager GetManager()
+        {
+            var xmlSerializer = new Mock<IXmlSerializer>();
+            var fileSystem = new Mock<IFileSystem>();
+            var appPaths = new Mock<IApplicationPaths>();
+            var loggerFactory = new Mock<ILoggerFactory>();
+            var appHost = new Mock<IServerApplicationHost>();
+
+            return new DlnaManager(xmlSerializer.Object, fileSystem.Object, appPaths.Object, loggerFactory.Object, appHost.Object);
+        }
+
+        [Fact]
+        public void IsMatch_GivenMatchingName_ReturnsTrue()
+        {
+            var device = new DeviceInfo()
+            {
+                Name = "My Device",
+                Manufacturer = "LG Electronics",
+                ManufacturerUrl = "http://www.lge.com",
+                ModelDescription = "LG WebOSTV DMRplus",
+                ModelName = "LG TV",
+                ModelNumber = "1.0",
+            };
+
+            var profile = new DeviceProfile()
+            {
+                Name = "Test Profile",
+                FriendlyName = "My Device",
+                Manufacturer = "LG Electronics",
+                ManufacturerUrl = "http://www.lge.com",
+                ModelDescription = "LG WebOSTV DMRplus",
+                ModelName = "LG TV",
+                ModelNumber = "1.0",
+                Identification = new ()
+                {
+                    FriendlyName = "My Device",
+                    Manufacturer = "LG Electronics",
+                    ManufacturerUrl = "http://www.lge.com",
+                    ModelDescription = "LG WebOSTV DMRplus",
+                    ModelName = "LG TV",
+                    ModelNumber = "1.0",
+                }
+            };
+
+            var profile2 = new DeviceProfile()
+            {
+                Name = "Test Profile",
+                FriendlyName = "My Device",
+                Identification = new DeviceIdentification()
+                {
+                    FriendlyName = "My Device",
+                }
+            };
+
+            var deviceMatch = GetManager().IsMatch(device.ToDeviceIdentification(), profile2.Identification);
+            var deviceMatch2 = GetManager().IsMatch(device.ToDeviceIdentification(), profile.Identification);
+
+            Assert.True(deviceMatch);
+            Assert.True(deviceMatch2);
+        }
+
+        [Fact]
+        public void IsMatch_GivenNamesAndManufacturersDoNotMatch_ReturnsFalse()
+        {
+            var device = new DeviceInfo()
+            {
+                Name = "My Device",
+                Manufacturer = "JVC"
+            };
+
+            var profile = new DeviceProfile()
+            {
+                Name = "Test Profile",
+                FriendlyName = "My Device",
+                Manufacturer = "LG Electronics",
+                ManufacturerUrl = "http://www.lge.com",
+                ModelDescription = "LG WebOSTV DMRplus",
+                ModelName = "LG TV",
+                ModelNumber = "1.0",
+                Identification = new ()
+                {
+                    FriendlyName = "My Device",
+                    Manufacturer = "LG Electronics",
+                    ManufacturerUrl = "http://www.lge.com",
+                    ModelDescription = "LG WebOSTV DMRplus",
+                    ModelName = "LG TV",
+                    ModelNumber = "1.0",
+                }
+            };
+
+            var deviceMatch = GetManager().IsMatch(device.ToDeviceIdentification(), profile.Identification);
+
+            Assert.False(deviceMatch);
+        }
+
+        [Fact]
+        public void IsMatch_GivenNamesAndRegExMatch_ReturnsTrue()
+        {
+            var device = new DeviceInfo()
+            {
+                Name = "My Device"
+            };
+
+            var profile = new DeviceProfile()
+            {
+                Name = "Test Profile",
+                FriendlyName = "My .*",
+                Identification = new ()
+            };
+
+            var deviceMatch = GetManager().IsMatch(device.ToDeviceIdentification(), profile.Identification);
+
+            Assert.True(deviceMatch);
+        }
+    }
+}

+ 1 - 0
tests/Jellyfin.Dlna.Tests/Jellyfin.Dlna.Tests.csproj

@@ -9,6 +9,7 @@
 
   <ItemGroup>
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.0" />
+    <PackageReference Include="Moq" Version="4.16.1" />
     <PackageReference Include="xunit" Version="2.4.1" />
     <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3" />
     <PackageReference Include="coverlet.collector" Version="1.3.0" />