Răsfoiți Sursa

Merge pull request #4754 from jellyfin/warn50

Bond-009 4 ani în urmă
părinte
comite
94db751f4b
48 a modificat fișierele cu 200 adăugiri și 274 ștergeri
  1. 0 1
      Emby.Dlna/Emby.Dlna.csproj
  2. 0 1
      Emby.Drawing/Emby.Drawing.csproj
  3. 0 1
      Emby.Naming/Emby.Naming.csproj
  4. 0 1
      Emby.Notifications/Emby.Notifications.csproj
  5. 0 1
      Emby.Photos/Emby.Photos.csproj
  6. 0 1
      Emby.Server.Implementations/Emby.Server.Implementations.csproj
  7. 0 1
      Jellyfin.Api/Jellyfin.Api.csproj
  8. 0 1
      Jellyfin.Data/Jellyfin.Data.csproj
  9. 0 1
      Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj
  10. 0 1
      Jellyfin.Networking/Jellyfin.Networking.csproj
  11. 0 1
      Jellyfin.Server.Implementations/Jellyfin.Server.Implementations.csproj
  12. 0 1
      Jellyfin.Server/Jellyfin.Server.csproj
  13. 7 7
      Jellyfin.sln
  14. 0 1
      MediaBrowser.Common/MediaBrowser.Common.csproj
  15. 0 1
      MediaBrowser.Controller/MediaBrowser.Controller.csproj
  16. 0 1
      MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj
  17. 1 1
      MediaBrowser.MediaEncoding/BdInfo/BdInfoDirectoryInfo.cs
  18. 15 77
      MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
  19. 39 0
      MediaBrowser.MediaEncoding/FfmpegException.cs
  20. 2 5
      MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj
  21. 15 3
      MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
  22. 3 3
      MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
  23. 2 6
      MediaBrowser.Model/MediaBrowser.Model.csproj
  24. 2 5
      MediaBrowser.Providers/MediaBrowser.Providers.csproj
  25. 2 5
      MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj
  26. 1 3
      MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
  27. 1 1
      MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs
  28. 8 10
      MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs
  29. 6 7
      MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs
  30. 5 11
      MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
  31. 15 16
      MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs
  32. 8 9
      MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs
  33. 5 6
      MediaBrowser.XbmcMetadata/Savers/SeasonNfoSaver.cs
  34. 10 11
      MediaBrowser.XbmcMetadata/Savers/SeriesNfoSaver.cs
  35. 7 1
      jellyfin.ruleset
  36. 2 5
      tests/Jellyfin.Api.Tests/Jellyfin.Api.Tests.csproj
  37. 2 5
      tests/Jellyfin.Common.Tests/Jellyfin.Common.Tests.csproj
  38. 2 5
      tests/Jellyfin.Controller.Tests/Jellyfin.Controller.Tests.csproj
  39. 2 5
      tests/Jellyfin.Dlna.Tests/Jellyfin.Dlna.Tests.csproj
  40. 2 5
      tests/Jellyfin.MediaEncoding.Tests/Jellyfin.MediaEncoding.Tests.csproj
  41. 2 5
      tests/Jellyfin.Model.Tests/Jellyfin.Model.Tests.csproj
  42. 2 2
      tests/Jellyfin.Naming.Tests/AudioBook/AudioBookResolverTests.cs
  43. 3 6
      tests/Jellyfin.Naming.Tests/Jellyfin.Naming.Tests.csproj
  44. 2 2
      tests/Jellyfin.Naming.Tests/Video/VideoResolverTests.cs
  45. 9 7
      tests/Jellyfin.Networking.Tests/Jellyfin.Networking.Tests.csproj
  46. 14 15
      tests/Jellyfin.Networking.Tests/NetworkParseTests.cs
  47. 2 5
      tests/Jellyfin.Server.Implementations.Tests/Jellyfin.Server.Implementations.Tests.csproj
  48. 2 5
      tests/Jellyfin.XbmcMetadata.Tests/Jellyfin.XbmcMetadata.Tests.csproj

+ 0 - 1
Emby.Dlna/Emby.Dlna.csproj

@@ -25,7 +25,6 @@
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
Emby.Drawing/Emby.Drawing.csproj

@@ -25,7 +25,6 @@
 
   <!-- Code analysers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
Emby.Naming/Emby.Naming.csproj

@@ -44,7 +44,6 @@
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <!-- TODO: <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" /> -->
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
Emby.Notifications/Emby.Notifications.csproj

@@ -25,7 +25,6 @@
 
   <!-- Code analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
Emby.Photos/Emby.Photos.csproj

@@ -28,7 +28,6 @@
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
Emby.Server.Implementations/Emby.Server.Implementations.csproj

@@ -49,7 +49,6 @@
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
Jellyfin.Api/Jellyfin.Api.csproj

@@ -28,7 +28,6 @@
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
Jellyfin.Data/Jellyfin.Data.csproj

@@ -34,7 +34,6 @@
 
   <!-- Code analysers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj

@@ -32,7 +32,6 @@
 
   <!-- Code analysers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
Jellyfin.Networking/Jellyfin.Networking.csproj

@@ -13,7 +13,6 @@
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
Jellyfin.Server.Implementations/Jellyfin.Server.Implementations.csproj

@@ -14,7 +14,6 @@
 
   <!-- Code analysers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
Jellyfin.Server/Jellyfin.Server.csproj

@@ -26,7 +26,6 @@
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 7 - 7
Jellyfin.sln

@@ -68,14 +68,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Server.Implementat
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Networking", "Jellyfin.Networking\Jellyfin.Networking.csproj", "{0A3FCC4D-C714-4072-B90F-E374A15F9FF9}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Networking.Tests", "tests\Jellyfin.Networking.Tests\NetworkTesting\Jellyfin.Networking.Tests.csproj", "{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Dlna.Tests", "tests\Jellyfin.Dlna.Tests\Jellyfin.Dlna.Tests.csproj", "{B8AE4B9D-E8D3-4B03-A95E-7FD8CECECC50}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.XbmcMetadata.Tests", "tests\Jellyfin.XbmcMetadata.Tests\Jellyfin.XbmcMetadata.Tests.csproj", "{30922383-D513-4F4D-B890-A940B57FA353}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Model.Tests", "tests\Jellyfin.Model.Tests\Jellyfin.Model.Tests.csproj", "{FC1BC0CE-E8D2-4AE9-A6AB-8A02143B335D}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Networking.Tests", "tests\Jellyfin.Networking.Tests\Jellyfin.Networking.Tests.csproj", "{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -190,10 +190,6 @@ Global
 		{0A3FCC4D-C714-4072-B90F-E374A15F9FF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{0A3FCC4D-C714-4072-B90F-E374A15F9FF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{0A3FCC4D-C714-4072-B90F-E374A15F9FF9}.Release|Any CPU.Build.0 = Release|Any CPU
-		{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}.Release|Any CPU.Build.0 = Release|Any CPU
 		{B8AE4B9D-E8D3-4B03-A95E-7FD8CECECC50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{B8AE4B9D-E8D3-4B03-A95E-7FD8CECECC50}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{B8AE4B9D-E8D3-4B03-A95E-7FD8CECECC50}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -206,6 +202,10 @@ Global
 		{FC1BC0CE-E8D2-4AE9-A6AB-8A02143B335D}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{FC1BC0CE-E8D2-4AE9-A6AB-8A02143B335D}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{FC1BC0CE-E8D2-4AE9-A6AB-8A02143B335D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -217,10 +217,10 @@ Global
 		{A2FD0A10-8F62-4F9D-B171-FFDF9F0AFA9D} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
 		{2E3A1B4B-4225-4AAA-8B29-0181A84E7AEE} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
 		{462584F7-5023-4019-9EAC-B98CA458C0A0} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
-		{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
 		{B8AE4B9D-E8D3-4B03-A95E-7FD8CECECC50} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
 		{30922383-D513-4F4D-B890-A940B57FA353} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
 		{FC1BC0CE-E8D2-4AE9-A6AB-8A02143B335D} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
+		{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {3448830C-EBDC-426C-85CD-7BBB9651A7FE}

+ 0 - 1
MediaBrowser.Common/MediaBrowser.Common.csproj

@@ -46,7 +46,6 @@
 
   <!-- Code analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
MediaBrowser.Controller/MediaBrowser.Controller.csproj

@@ -47,7 +47,6 @@
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj

@@ -24,7 +24,6 @@
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 1 - 1
MediaBrowser.MediaEncoding/BdInfo/BdInfoDirectoryInfo.cs

@@ -71,7 +71,7 @@ namespace MediaBrowser.MediaEncoding.BdInfo
                     _impl.FullName,
                     new[] { searchPattern },
                     false,
-                    searchOption.HasFlag(System.IO.SearchOption.AllDirectories)).ToArray(),
+                    (searchOption & System.IO.SearchOption.AllDirectories) == System.IO.SearchOption.AllDirectories).ToArray(),
                 x => new BdInfoFileInfo(x));
         }
 

+ 15 - 77
MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs

@@ -448,7 +448,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 
                 if (result == null || (result.Streams == null && result.Format == null))
                 {
-                    throw new Exception("ffprobe failed - streams and format are both null.");
+                    throw new FfmpegException("ffprobe failed - streams and format are both null.");
                 }
 
                 if (result.Streams != null)
@@ -571,32 +571,18 @@ namespace MediaBrowser.MediaEncoding.Encoder
 
             // apply some filters to thumbnail extracted below (below) crop any black lines that we made and get the correct ar.
             // This filter chain may have adverse effects on recorded tv thumbnails if ar changes during presentation ex. commercials @ diff ar
-            var vf = string.Empty;
-
-            if (threedFormat.HasValue)
+            var vf = threedFormat switch
             {
-                switch (threedFormat.Value)
-                {
-                    case Video3DFormat.HalfSideBySide:
-                        vf = "-vf crop=iw/2:ih:0:0,scale=(iw*2):ih,setdar=dar=a,crop=min(iw\\,ih*dar):min(ih\\,iw/dar):(iw-min(iw\\,iw*sar))/2:(ih - min (ih\\,ih/sar))/2,setsar=sar=1";
-                        // hsbs crop width in half,scale to correct size, set the display aspect,crop out any black bars we may have made. Work out the correct height based on the display aspect it will maintain the aspect where -1 in this case (3d) may not.
-                        break;
-                    case Video3DFormat.FullSideBySide:
-                        vf = "-vf crop=iw/2:ih:0:0,setdar=dar=a,crop=min(iw\\,ih*dar):min(ih\\,iw/dar):(iw-min(iw\\,iw*sar))/2:(ih - min (ih\\,ih/sar))/2,setsar=sar=1";
-                        // fsbs crop width in half,set the display aspect,crop out any black bars we may have made
-                        break;
-                    case Video3DFormat.HalfTopAndBottom:
-                        vf = "-vf crop=iw:ih/2:0:0,scale=(iw*2):ih),setdar=dar=a,crop=min(iw\\,ih*dar):min(ih\\,iw/dar):(iw-min(iw\\,iw*sar))/2:(ih - min (ih\\,ih/sar))/2,setsar=sar=1";
-                        // htab crop heigh in half,scale to correct size, set the display aspect,crop out any black bars we may have made
-                        break;
-                    case Video3DFormat.FullTopAndBottom:
-                        vf = "-vf crop=iw:ih/2:0:0,setdar=dar=a,crop=min(iw\\,ih*dar):min(ih\\,iw/dar):(iw-min(iw\\,iw*sar))/2:(ih - min (ih\\,ih/sar))/2,setsar=sar=1";
-                        // ftab crop heigt in half, set the display aspect,crop out any black bars we may have made
-                        break;
-                    default:
-                        break;
-                }
-            }
+                // hsbs crop width in half,scale to correct size, set the display aspect,crop out any black bars we may have made. Work out the correct height based on the display aspect it will maintain the aspect where -1 in this case (3d) may not.
+                Video3DFormat.HalfSideBySide => "-vf crop=iw/2:ih:0:0,scale=(iw*2):ih,setdar=dar=a,crop=min(iw\\,ih*dar):min(ih\\,iw/dar):(iw-min(iw\\,iw*sar))/2:(ih - min (ih\\,ih/sar))/2,setsar=sar=1",
+                // fsbs crop width in half,set the display aspect,crop out any black bars we may have made
+                Video3DFormat.FullSideBySide => "-vf crop=iw/2:ih:0:0,setdar=dar=a,crop=min(iw\\,ih*dar):min(ih\\,iw/dar):(iw-min(iw\\,iw*sar))/2:(ih - min (ih\\,ih/sar))/2,setsar=sar=1",
+                // htab crop heigh in half,scale to correct size, set the display aspect,crop out any black bars we may have made
+                Video3DFormat.HalfTopAndBottom => "-vf crop=iw:ih/2:0:0,scale=(iw*2):ih),setdar=dar=a,crop=min(iw\\,ih*dar):min(ih\\,iw/dar):(iw-min(iw\\,iw*sar))/2:(ih - min (ih\\,ih/sar))/2,setsar=sar=1",
+                // ftab crop heigt in half, set the display aspect,crop out any black bars we may have made
+                Video3DFormat.FullTopAndBottom => "-vf crop=iw:ih/2:0:0,setdar=dar=a,crop=min(iw\\,ih*dar):min(ih\\,iw/dar):(iw-min(iw\\,iw*sar))/2:(ih - min (ih\\,ih/sar))/2,setsar=sar=1",
+                _ => string.Empty
+            };
 
             var mapArg = imageStreamIndex.HasValue ? (" -map 0:v:" + imageStreamIndex.Value.ToString(CultureInfo.InvariantCulture)) : string.Empty;
 
@@ -604,7 +590,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
             if (enableHdrExtraction)
             {
                 string tonemapFilters = "zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=hable:desat=0:peak=100,zscale=t=bt709:m=bt709,format=yuv420p";
-                if (string.IsNullOrEmpty(vf))
+                if (vf.Length == 0)
                 {
                     vf = "-vf " + tonemapFilters;
                 }
@@ -633,35 +619,11 @@ namespace MediaBrowser.MediaEncoding.Encoder
 
             var args = string.Format(CultureInfo.InvariantCulture, "-i {0}{3} -threads {4} -v quiet -vframes 1 {2} -f image2 \"{1}\"", inputPath, tempExtractPath, vf, mapArg, threads);
 
-            var probeSizeArgument = string.Empty;
-            var analyzeDurationArgument = string.Empty;
-
-            if (!string.IsNullOrWhiteSpace(probeSizeArgument))
-            {
-                args = probeSizeArgument + " " + args;
-            }
-
-            if (!string.IsNullOrWhiteSpace(analyzeDurationArgument))
-            {
-                args = analyzeDurationArgument + " " + args;
-            }
-
             if (offset.HasValue)
             {
                 args = string.Format(CultureInfo.InvariantCulture, "-ss {0} ", GetTimeParameter(offset.Value)) + args;
             }
 
-            if (videoStream != null)
-            {
-                /* fix
-                var decoder = encodinghelper.GetHardwareAcceleratedVideoDecoder(VideoType.VideoFile, videoStream, GetEncodingOptions());
-                if (!string.IsNullOrWhiteSpace(decoder))
-                {
-                    args = decoder + " " + args;
-                }
-                */
-            }
-
             if (!string.IsNullOrWhiteSpace(container))
             {
                 var inputFormat = EncodingHelper.GetInputFormat(container);
@@ -723,7 +685,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 
                     _logger.LogError(msg);
 
-                    throw new Exception(msg);
+                    throw new FfmpegException(msg);
                 }
 
                 return tempExtractPath;
@@ -770,30 +732,6 @@ namespace MediaBrowser.MediaEncoding.Encoder
 
             var args = string.Format(CultureInfo.InvariantCulture, "-i {0} -threads {3} -v quiet {2} -f image2 \"{1}\"", inputArgument, outputPath, vf, threads);
 
-            var probeSizeArgument = string.Empty;
-            var analyzeDurationArgument = string.Empty;
-
-            if (!string.IsNullOrWhiteSpace(probeSizeArgument))
-            {
-                args = probeSizeArgument + " " + args;
-            }
-
-            if (!string.IsNullOrWhiteSpace(analyzeDurationArgument))
-            {
-                args = analyzeDurationArgument + " " + args;
-            }
-
-            if (videoStream != null)
-            {
-                /* fix
-                var decoder = encodinghelper.GetHardwareAcceleratedVideoDecoder(VideoType.VideoFile, videoStream, GetEncodingOptions());
-                if (!string.IsNullOrWhiteSpace(decoder))
-                {
-                    args = decoder + " " + args;
-                }
-                */
-            }
-
             if (!string.IsNullOrWhiteSpace(container))
             {
                 var inputFormat = EncodingHelper.GetInputFormat(container);
@@ -872,7 +810,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 
                     _logger.LogError(msg);
 
-                    throw new Exception(msg);
+                    throw new FfmpegException(msg);
                 }
             }
         }

+ 39 - 0
MediaBrowser.MediaEncoding/FfmpegException.cs

@@ -0,0 +1,39 @@
+using System;
+
+namespace MediaBrowser.MediaEncoding
+{
+    /// <summary>
+    /// Represents errors that occur during interaction with FFmpeg.
+    /// </summary>
+    public class FfmpegException : Exception
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="FfmpegException"/> class.
+        /// </summary>
+        public FfmpegException()
+        {
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="FfmpegException"/> class with a specified error message.
+        /// </summary>
+        /// <param name="message">The message that describes the error.</param>
+        public FfmpegException(string message) : base(message)
+        {
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="FfmpegException"/> class with a specified error message and a
+        /// reference to the inner exception that is the cause of this exception.
+        /// </summary>
+        /// <param name="message">The error message that explains the reason for the exception.</param>
+        /// <param name="innerException">
+        /// The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if
+        /// no inner exception is specified.
+        /// </param>
+        public FfmpegException(string message, Exception innerException)
+            : base(message, innerException)
+        {
+        }
+    }
+}

+ 2 - 5
MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj

@@ -10,6 +10,8 @@
     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
     <GenerateDocumentationFile>true</GenerateDocumentationFile>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
 
   <ItemGroup>
@@ -30,13 +32,8 @@
     <PackageReference Include="UTF.Unknown" Version="2.3.0" />
   </ItemGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../jellyfin.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 15 - 3
MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs

@@ -640,7 +640,7 @@ namespace MediaBrowser.MediaEncoding.Probing
             }
 
             // Filter out junk
-            if (!string.IsNullOrWhiteSpace(streamInfo.CodecTagString) && streamInfo.CodecTagString.IndexOf("[0]", StringComparison.OrdinalIgnoreCase) == -1)
+            if (!string.IsNullOrWhiteSpace(streamInfo.CodecTagString) && !streamInfo.CodecTagString.Contains("[0]", StringComparison.OrdinalIgnoreCase))
             {
                 stream.CodecTag = streamInfo.CodecTagString;
             }
@@ -1500,11 +1500,23 @@ namespace MediaBrowser.MediaEncoding.Probing
                         }
                         else
                         {
-                            throw new Exception(); // Switch to default parsing
+                            // Switch to default parsing
+                            if (subtitle.Contains('.', StringComparison.Ordinal))
+                            {
+                                // skip the comment, keep the subtitle
+                                description = string.Join('.', subtitle.Split('.'), 1, subtitle.Split('.').Length - 1).Trim(); // skip the first
+                            }
+                            else
+                            {
+                                description = subtitle.Trim(); // Clean up whitespaces and save it
+                            }
                         }
                     }
-                    catch // Default parsing
+                    catch (Exception ex)
                     {
+                        _logger.LogError(ex, "Error while parsing subtitle field");
+
+                        // Default parsing
                         if (subtitle.Contains('.', StringComparison.Ordinal))
                         {
                             // skip the comment, keep the subtitle

+ 3 - 3
MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs

@@ -25,7 +25,7 @@ using UtfUnknown;
 
 namespace MediaBrowser.MediaEncoding.Subtitles
 {
-    public class SubtitleEncoder : ISubtitleEncoder
+    public sealed class SubtitleEncoder : ISubtitleEncoder
     {
         private readonly ILogger<SubtitleEncoder> _logger;
         private readonly IApplicationPaths _appPaths;
@@ -484,7 +484,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
             {
                 _logger.LogError("ffmpeg subtitle conversion failed for {Path}", inputPath);
 
-                throw new Exception(
+                throw new FfmpegException(
                     string.Format(CultureInfo.InvariantCulture, "ffmpeg subtitle conversion failed for {0}", inputPath));
             }
 
@@ -637,7 +637,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 
                 _logger.LogError(msg);
 
-                throw new Exception(msg);
+                throw new FfmpegException(msg);
             }
             else
             {

+ 2 - 6
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -19,7 +19,8 @@
     <GenerateDocumentationFile>true</GenerateDocumentationFile>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
     <Nullable>enable</Nullable>
-    <LangVersion>latest</LangVersion>
+    <!-- <AnalysisMode>AllEnabledByDefault</AnalysisMode> -->
+    <CodeAnalysisRuleSet>../jellyfin.ruleset</CodeAnalysisRuleSet>
     <PublishRepositoryUrl>true</PublishRepositoryUrl>
     <EmbedUntrackedSources>true</EmbedUntrackedSources>
     <IncludeSymbols>true</IncludeSymbols>
@@ -44,7 +45,6 @@
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <!-- <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" /> -->
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
@@ -53,8 +53,4 @@
     <ProjectReference Include="..\Jellyfin.Data\Jellyfin.Data.csproj" />
   </ItemGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../jellyfin.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-
 </Project>

+ 2 - 5
MediaBrowser.Providers/MediaBrowser.Providers.csproj

@@ -30,20 +30,17 @@
     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
     <GenerateDocumentationFile>true</GenerateDocumentationFile>
     <TreatWarningsAsErrors Condition=" '$(Configuration)' == 'Release'">true</TreatWarningsAsErrors>
+    <AnalysisMode Condition=" '$(Configuration)' == 'Debug'">AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
   </ItemGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../jellyfin.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-
   <ItemGroup>
     <None Remove="Plugins\AudioDb\Configuration\config.html" />
     <EmbeddedResource Include="Plugins\AudioDb\Configuration\config.html" />

+ 2 - 5
MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj

@@ -20,18 +20,15 @@
     <GenerateDocumentationFile>true</GenerateDocumentationFile>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
     <Nullable>enable</Nullable>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
   </ItemGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../jellyfin.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-
 </Project>

+ 1 - 3
MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs

@@ -1168,11 +1168,9 @@ namespace MediaBrowser.XbmcMetadata.Parsers
         /// <returns>IEnumerable{System.String}.</returns>
         private IEnumerable<string> SplitNames(string value)
         {
-            value = value ?? string.Empty;
-
             // Only split by comma if there is no pipe in the string
             // We have to be careful to not split names like Matthew, Jr.
-            var separator = value.IndexOf('|', StringComparison.Ordinal) == -1 && value.IndexOf(';', StringComparison.Ordinal) == -1
+            var separator = !value.Contains('|', StringComparison.Ordinal) && !value.Contains(';', StringComparison.Ordinal)
                 ? new[] { ',' }
                 : new[] { '|', ';' };
 

+ 1 - 1
MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs

@@ -22,7 +22,7 @@ namespace MediaBrowser.XbmcMetadata.Providers
         private readonly IUserManager _userManager;
         private readonly IUserDataManager _userDataManager;
 
-        public BaseVideoNfoProvider(
+        protected BaseVideoNfoProvider(
             ILogger<BaseVideoNfoProvider<T>> logger,
             IFileSystem fileSystem,
             IConfigurationManager config,

+ 8 - 10
MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs

@@ -96,18 +96,16 @@ namespace MediaBrowser.XbmcMetadata.Savers
         }
 
         /// <inheritdoc />
-        protected override List<string> GetTagsUsed(BaseItem item)
+        protected override IEnumerable<string> GetTagsUsed(BaseItem item)
         {
-            var list = base.GetTagsUsed(item);
-            list.AddRange(
-                new string[]
-                {
-                    "track",
-                    "artist",
-                    "albumartist"
-                });
+            foreach (var tag in base.GetTagsUsed(item))
+            {
+                yield return tag;
+            }
 
-            return list;
+            yield return "track";
+            yield return "artist";
+            yield return "albumartist";
         }
     }
 }

+ 6 - 7
MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs

@@ -88,16 +88,15 @@ namespace MediaBrowser.XbmcMetadata.Savers
         }
 
         /// <inheritdoc />
-        protected override List<string> GetTagsUsed(BaseItem item)
+        protected override IEnumerable<string> GetTagsUsed(BaseItem item)
         {
-            var list = base.GetTagsUsed(item);
-            list.AddRange(new string[]
+            foreach (var tag in base.GetTagsUsed(item))
             {
-                "album",
-                "disbanded"
-            });
+                yield return tag;
+            }
 
-            return list;
+            yield return "album";
+            yield return "disbanded";
         }
     }
 }

+ 5 - 11
MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs

@@ -166,19 +166,16 @@ namespace MediaBrowser.XbmcMetadata.Savers
         /// <inheritdoc />
         public abstract bool IsEnabledFor(BaseItem item, ItemUpdateType updateType);
 
-        protected virtual List<string> GetTagsUsed(BaseItem item)
+        protected virtual IEnumerable<string> GetTagsUsed(BaseItem item)
         {
-            var list = new List<string>();
             foreach (var providerKey in item.ProviderIds.Keys)
             {
                 var providerIdTagName = GetTagForProviderKey(providerKey);
                 if (!_commonTags.Contains(providerIdTagName))
                 {
-                    list.Add(providerIdTagName);
+                    yield return providerIdTagName;
                 }
             }
-
-            return list;
         }
 
         /// <inheritdoc />
@@ -261,7 +258,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
                     AddMediaInfo(hasMediaSources, writer);
                 }
 
-                var tagsUsed = GetTagsUsed(item);
+                var tagsUsed = GetTagsUsed(item).ToList();
 
                 try
                 {
@@ -351,10 +348,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
                 }
 
                 var scanType = stream.IsInterlaced ? "interlaced" : "progressive";
-                if (!string.IsNullOrEmpty(scanType))
-                {
-                    writer.WriteElementString("scantype", scanType);
-                }
+                writer.WriteElementString("scantype", scanType);
 
                 if (stream.Channels.HasValue)
                 {
@@ -968,7 +962,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
             => string.Equals(person.Type, type, StringComparison.OrdinalIgnoreCase)
                 || string.Equals(person.Role, type, StringComparison.OrdinalIgnoreCase);
 
-        private void AddCustomTags(string path, List<string> xmlTagsUsed, XmlWriter writer, ILogger<BaseNfoSaver> logger)
+        private void AddCustomTags(string path, IReadOnlyCollection<string> xmlTagsUsed, XmlWriter writer, ILogger<BaseNfoSaver> logger)
         {
             var settings = new XmlReaderSettings()
             {

+ 15 - 16
MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs

@@ -111,24 +111,23 @@ namespace MediaBrowser.XbmcMetadata.Savers
         }
 
         /// <inheritdoc />
-        protected override List<string> GetTagsUsed(BaseItem item)
+        protected override IEnumerable<string> GetTagsUsed(BaseItem item)
         {
-            var list = base.GetTagsUsed(item);
-            list.AddRange(new string[]
+            foreach (var tag in base.GetTagsUsed(item))
             {
-                "aired",
-                "season",
-                "episode",
-                "episodenumberend",
-                "airsafter_season",
-                "airsbefore_episode",
-                "airsbefore_season",
-                "displayseason",
-                "displayepisode",
-                "showtitle"
-            });
-
-            return list;
+                yield return tag;
+            }
+
+            yield return "aired";
+            yield return "season";
+            yield return "episode";
+            yield return "episodenumberend";
+            yield return "airsafter_season";
+            yield return "airsbefore_episode";
+            yield return "airsbefore_season";
+            yield return "displayseason";
+            yield return "displayepisode";
+            yield return "showtitle";
         }
     }
 }

+ 8 - 9
MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs

@@ -123,18 +123,17 @@ namespace MediaBrowser.XbmcMetadata.Savers
         }
 
         /// <inheritdoc />
-        protected override List<string> GetTagsUsed(BaseItem item)
+        protected override IEnumerable<string> GetTagsUsed(BaseItem item)
         {
-            var list = base.GetTagsUsed(item);
-            list.AddRange(new string[]
+            foreach (var tag in base.GetTagsUsed(item))
             {
-                "album",
-                "artist",
-                "set",
-                "id"
-            });
+                yield return tag;
+            }
 
-            return list;
+            yield return "album";
+            yield return "artist";
+            yield return "set";
+            yield return "id";
         }
     }
 }

+ 5 - 6
MediaBrowser.XbmcMetadata/Savers/SeasonNfoSaver.cs

@@ -72,15 +72,14 @@ namespace MediaBrowser.XbmcMetadata.Savers
         }
 
         /// <inheritdoc />
-        protected override List<string> GetTagsUsed(BaseItem item)
+        protected override IEnumerable<string> GetTagsUsed(BaseItem item)
         {
-            var list = base.GetTagsUsed(item);
-            list.AddRange(new string[]
+            foreach (var tag in base.GetTagsUsed(item))
             {
-                "seasonnumber"
-            });
+                yield return tag;
+            }
 
-            return list;
+            yield return "seasonnumber";
         }
     }
 }

+ 10 - 11
MediaBrowser.XbmcMetadata/Savers/SeriesNfoSaver.cs

@@ -90,20 +90,19 @@ namespace MediaBrowser.XbmcMetadata.Savers
         }
 
         /// <inheritdoc />
-        protected override List<string> GetTagsUsed(BaseItem item)
+        protected override IEnumerable<string> GetTagsUsed(BaseItem item)
         {
-            var list = base.GetTagsUsed(item);
-            list.AddRange(new string[]
+            foreach (var tag in base.GetTagsUsed(item))
             {
-                "id",
-                "episodeguide",
-                "season",
-                "episode",
-                "status",
-                "displayorder"
-            });
+                yield return tag;
+            }
 
-            return list;
+            yield return "id";
+            yield return "episodeguide";
+            yield return "season";
+            yield return "episode";
+            yield return "status";
+            yield return "displayorder";
         }
     }
 }

+ 7 - 1
jellyfin.ruleset

@@ -38,7 +38,7 @@
     <Rule Id="SA1633" Action="None" />
   </Rules>
 
-  <Rules AnalyzerId="Microsoft.CodeAnalysis.FxCopAnalyzers" RuleNamespace="Microsoft.Design">
+  <Rules AnalyzerId="Microsoft.CodeAnalysis.NetAnalyzers" RuleNamespace="Microsoft.Design">
     <!-- error on CA2016: Forward the CancellationToken parameter to methods that take one
         or pass in 'CancellationToken.None' explicitly to indicate intentionally not propagating the token -->
     <Rule Id="CA2016" Action="Error" />
@@ -53,6 +53,8 @@
     <Rule Id="CA1716" Action="Info" />
     <!-- disable warning CA1720: Identifiers should not contain type names -->
     <Rule Id="CA1720" Action="Info" />
+    <!-- disable warning CA1805: Do not initialize unnecessarily -->
+    <Rule Id="CA1805" Action="Info" />
     <!-- disable warning CA1812: internal class that is apparently never instantiated.
         If so, remove the code from the assembly.
         If this class is intended to contain only static members, make it static -->
@@ -61,7 +63,11 @@
     <Rule Id="CA1822" Action="Info" />
     <!-- disable warning CA2000: Dispose objects before losing scope -->
     <Rule Id="CA2000" Action="Info" />
+    <!-- disable warning CA5394: Do not use insecure randomness -->
+    <Rule Id="CA5394" Action="Info" />
 
+    <!-- disable warning CA1014: Mark assemblies with CLSCompliantAttribute -->
+    <Rule Id="CA1014" Action="Info" />
     <!-- disable warning CA1054: Change the type of parameter url from string to System.Uri -->
     <Rule Id="CA1054" Action="None" />
     <!-- disable warning CA1055: URI return values should not be strings -->

+ 2 - 5
tests/Jellyfin.Api.Tests/Jellyfin.Api.Tests.csproj

@@ -10,6 +10,8 @@
     <IsPackable>false</IsPackable>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
     <Nullable>enable</Nullable>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
 
   <ItemGroup>
@@ -27,7 +29,6 @@
 
   <!-- Code Analyzers -->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
@@ -37,10 +38,6 @@
     <ProjectReference Include="..\..\Jellyfin.Server\Jellyfin.Server.csproj" />
   </ItemGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-
   <ItemGroup>
     <EmbeddedResource Include="TestPage.html" />
   </ItemGroup>

+ 2 - 5
tests/Jellyfin.Common.Tests/Jellyfin.Common.Tests.csproj

@@ -10,6 +10,8 @@
     <IsPackable>false</IsPackable>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
     <Nullable>enable</Nullable>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
 
   <ItemGroup>
@@ -21,7 +23,6 @@
 
   <!-- Code Analyzers -->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
@@ -32,8 +33,4 @@
     <ProjectReference Include="../../MediaBrowser.Providers/MediaBrowser.Providers.csproj" />
   </ItemGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-
 </Project>

+ 2 - 5
tests/Jellyfin.Controller.Tests/Jellyfin.Controller.Tests.csproj

@@ -10,6 +10,8 @@
     <IsPackable>false</IsPackable>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
     <Nullable>enable</Nullable>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
 
   <ItemGroup>
@@ -21,7 +23,6 @@
 
   <!-- Code Analyzers -->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
@@ -31,8 +32,4 @@
     <ProjectReference Include="../../MediaBrowser.Controller/MediaBrowser.Controller.csproj" />
   </ItemGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-
 </Project>

+ 2 - 5
tests/Jellyfin.Dlna.Tests/Jellyfin.Dlna.Tests.csproj

@@ -5,6 +5,8 @@
     <IsPackable>false</IsPackable>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
     <Nullable>enable</Nullable>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
 
   <ItemGroup>
@@ -16,7 +18,6 @@
 
   <!-- Code Analyzers -->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
@@ -26,8 +27,4 @@
     <ProjectReference Include="../../Emby.Dlna/Emby.Dlna.csproj" />
   </ItemGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-
 </Project>

+ 2 - 5
tests/Jellyfin.MediaEncoding.Tests/Jellyfin.MediaEncoding.Tests.csproj

@@ -10,6 +10,8 @@
     <IsPackable>false</IsPackable>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
     <Nullable>enable</Nullable>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
 
   <ItemGroup>
@@ -27,7 +29,6 @@
 
   <!-- Code Analyzers -->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
@@ -37,8 +38,4 @@
     <ProjectReference Include="../../MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj" />
   </ItemGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-
 </Project>

+ 2 - 5
tests/Jellyfin.Model.Tests/Jellyfin.Model.Tests.csproj

@@ -5,6 +5,8 @@
     <IsPackable>false</IsPackable>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
     <Nullable>enable</Nullable>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
 
   <ItemGroup>
@@ -16,7 +18,6 @@
 
   <!-- Code Analyzers -->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
@@ -26,8 +27,4 @@
     <ProjectReference Include="../../MediaBrowser.Model/MediaBrowser.Model.csproj" />
   </ItemGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-
 </Project>

+ 2 - 2
tests/Jellyfin.Naming.Tests/AudioBook/AudioBookResolverTests.cs

@@ -10,7 +10,7 @@ namespace Jellyfin.Naming.Tests.AudioBook
     {
         private readonly NamingOptions _namingOptions = new NamingOptions();
 
-        public static IEnumerable<object[]> GetResolveFileTestData()
+        public static IEnumerable<object[]> Resolve_ValidFileNameTestData()
         {
             yield return new object[]
             {
@@ -36,7 +36,7 @@ namespace Jellyfin.Naming.Tests.AudioBook
         }
 
         [Theory]
-        [MemberData(nameof(GetResolveFileTestData))]
+        [MemberData(nameof(Resolve_ValidFileNameTestData))]
         public void Resolve_ValidFileName_Success(AudioBookFileInfo expectedResult)
         {
             var result = new AudioBookResolver(_namingOptions).Resolve(expectedResult.Path);

+ 3 - 6
tests/Jellyfin.Naming.Tests/Jellyfin.Naming.Tests.csproj

@@ -8,8 +8,10 @@
   <PropertyGroup>
     <TargetFramework>net5.0</TargetFramework>
     <IsPackable>false</IsPackable>
-    <Nullable>enable</Nullable>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <Nullable>enable</Nullable>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
 
   <ItemGroup>
@@ -25,14 +27,9 @@
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
   </ItemGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-
 </Project>

+ 2 - 2
tests/Jellyfin.Naming.Tests/Video/VideoResolverTests.cs

@@ -11,7 +11,7 @@ namespace Jellyfin.Naming.Tests.Video
     {
         private readonly VideoResolver _videoResolver = new VideoResolver(new NamingOptions());
 
-        public static IEnumerable<object[]> GetResolveFileTestData()
+        public static IEnumerable<object[]> ResolveFile_ValidFileNameTestData()
         {
             yield return new object[]
             {
@@ -156,7 +156,7 @@ namespace Jellyfin.Naming.Tests.Video
         }
 
         [Theory]
-        [MemberData(nameof(GetResolveFileTestData))]
+        [MemberData(nameof(ResolveFile_ValidFileNameTestData))]
         public void ResolveFile_ValidFileName_Success(VideoFileInfo expectedResult)
         {
             var result = _videoResolver.ResolveFile(expectedResult.Path);

+ 9 - 7
tests/Jellyfin.Networking.Tests/NetworkTesting/Jellyfin.Networking.Tests.csproj → tests/Jellyfin.Networking.Tests/Jellyfin.Networking.Tests.csproj

@@ -8,8 +8,10 @@
   <PropertyGroup>
     <TargetFramework>net5.0</TargetFramework>
     <IsPackable>false</IsPackable>
-    <Nullable>enable</Nullable>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <Nullable>enable</Nullable>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
 
   <ItemGroup>
@@ -22,18 +24,18 @@
 
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
+    <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
   </ItemGroup>
+
   <ItemGroup>
-    <ProjectReference Include="..\..\..\Emby.Server.Implementations\Emby.Server.Implementations.csproj" />
-    <ProjectReference Include="..\..\..\MediaBrowser.Common\MediaBrowser.Common.csproj" />
+    <ProjectReference Include="../../Emby.Server.Implementations/Emby.Server.Implementations.csproj" />
+    <ProjectReference Include="../../MediaBrowser.Common/MediaBrowser.Common.csproj" />
   </ItemGroup>
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
+
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
     <DefineConstants>DEBUG</DefineConstants>
   </PropertyGroup>
+
 </Project>

+ 14 - 15
tests/Jellyfin.Networking.Tests/NetworkTesting/NetworkParseTests.cs → tests/Jellyfin.Networking.Tests/NetworkParseTests.cs

@@ -1,13 +1,13 @@
 using System;
+using System.Collections.ObjectModel;
 using System.Net;
 using Jellyfin.Networking.Configuration;
 using Jellyfin.Networking.Manager;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Net;
-using Moq;
 using Microsoft.Extensions.Logging.Abstractions;
+using Moq;
 using Xunit;
-using System.Collections.ObjectModel;
 
 namespace Jellyfin.Networking.Tests
 {
@@ -124,7 +124,6 @@ namespace Jellyfin.Networking.Tests
             Assert.True(IPNetAddress.TryParse(address, out _));
         }
 
-
         /// <summary>
         /// All should be invalid address strings.
         /// </summary>
@@ -141,7 +140,6 @@ namespace Jellyfin.Networking.Tests
             Assert.False(IPHost.TryParse(address, out _));
         }
 
-
         /// <summary>
         /// Test collection parsing.
         /// </summary>
@@ -152,19 +150,22 @@ namespace Jellyfin.Networking.Tests
         /// <param name="result4">Excluded IP4 addresses from the collection.</param>
         /// <param name="result5">Network addresses of the collection.</param>
         [Theory]
-        [InlineData("127.0.0.1#",
+        [InlineData(
+            "127.0.0.1#",
             "[]",
             "[]",
             "[]",
             "[]",
             "[]")]
-        [InlineData("!127.0.0.1",
+        [InlineData(
+            "!127.0.0.1",
             "[]",
             "[]",
             "[127.0.0.1/32]",
             "[127.0.0.1/32]",
             "[]")]
-        [InlineData("",
+        [InlineData(
+            "",
             "[]",
             "[]",
             "[]",
@@ -177,7 +178,8 @@ namespace Jellyfin.Networking.Tests
             "[10.10.10.10/32]",
             "[10.10.10.10/32]",
             "[192.158.0.0/16,127.0.0.1/32,::1/128,fd23:184f:2029:0:3139:7386:67d7:d517/128]")]
-        [InlineData("192.158.1.2/255.255.0.0,192.169.1.2/8",
+        [InlineData(
+            "192.158.1.2/255.255.0.0,192.169.1.2/8",
             "[192.158.1.2/16,192.169.1.2/8]",
             "[192.158.1.2/16,192.169.1.2/8]",
             "[]",
@@ -194,12 +196,12 @@ namespace Jellyfin.Networking.Tests
             {
                 EnableIPV6 = true,
                 EnableIPV4 = true,
-            };           
+            };
 
             using var nm = new NetworkManager(GetMockConfig(conf), new NullLogger<NetworkManager>());
 
             // Test included.
-            Collection<IPObject> nc = nm.CreateIPCollection(settings.Split(","), false); 
+            Collection<IPObject> nc = nm.CreateIPCollection(settings.Split(","), false);
             Assert.Equal(nc.AsString(), result1);
 
             // Test excluded.
@@ -208,7 +210,7 @@ namespace Jellyfin.Networking.Tests
 
             conf.EnableIPV6 = false;
             nm.UpdateSettings(conf);
-            
+
             // Test IP4 included.
             nc = nm.CreateIPCollection(settings.Split(","), false);
             Assert.Equal(nc.AsString(), result2);
@@ -252,7 +254,6 @@ namespace Jellyfin.Networking.Tests
                 throw new ArgumentNullException(nameof(result));
             }
 
-
             var conf = new NetworkConfiguration()
             {
                 EnableIPV6 = true,
@@ -378,7 +379,6 @@ namespace Jellyfin.Networking.Tests
             Assert.True(ncResult.Compare(resultCollection));
         }
 
-
         [Theory]
         [InlineData("10.1.1.1/32", "10.1.1.1")]
         [InlineData("192.168.1.254/32", "192.168.1.254/255.255.255.255")]
@@ -455,7 +455,7 @@ namespace Jellyfin.Networking.Tests
         // On my system eth16 is internal, eth11 external (Windows defines the indexes).
         //
         // This test is to replicate how subnet bound ServerPublisherUri work throughout the system.
-        
+
         // User on internal network, we're bound internal and external - so result is internal override.
         [InlineData("192.168.1.1", "192.168.1.0/24", "eth16,eth11", false, "192.168.1.0/24=internal.jellyfin", "internal.jellyfin")]
 
@@ -479,7 +479,6 @@ namespace Jellyfin.Networking.Tests
 
         // User is internal, no binding - so result is the 1st internal, which is then overridden.
         [InlineData("192.168.1.1", "192.168.1.0/24", "", false, "eth16=http://helloworld.com", "http://helloworld.com")]
-
         public void TestBindInterfaceOverrides(string source, string lan, string bindAddresses, bool ipv6enabled, string publishedServers, string result)
         {
             if (lan == null)

+ 2 - 5
tests/Jellyfin.Server.Implementations.Tests/Jellyfin.Server.Implementations.Tests.csproj

@@ -10,6 +10,8 @@
     <IsPackable>false</IsPackable>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
     <Nullable>enable</Nullable>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
     <RootNamespace>Jellyfin.Server.Implementations.Tests</RootNamespace>
   </PropertyGroup>
 
@@ -31,7 +33,6 @@
 
   <!-- Code Analyzers -->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
@@ -42,8 +43,4 @@
     <ProjectReference Include="..\..\Jellyfin.Server.Implementations\Jellyfin.Server.Implementations.csproj" />
   </ItemGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-
 </Project>

+ 2 - 5
tests/Jellyfin.XbmcMetadata.Tests/Jellyfin.XbmcMetadata.Tests.csproj

@@ -5,6 +5,8 @@
     <IsPackable>false</IsPackable>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
     <Nullable>enable</Nullable>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
 
   <ItemGroup>
@@ -23,7 +25,6 @@
 
   <!-- Code Analyzers -->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
@@ -34,8 +35,4 @@
     <ProjectReference Include="../../MediaBrowser.Providers/MediaBrowser.Providers.csproj" />
   </ItemGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-
 </Project>