Ver código fonte

Merge branch 'dev' into cleanup

Bond-009 6 anos atrás
pai
commit
900dc851e6
100 arquivos alterados com 756 adições e 535 exclusões
  1. 3 0
      .dockerignore
  2. 1 1
      .drone.yml
  3. 133 0
      .editorconfig
  4. 35 0
      .github/ISSUE_TEMPLATE/bug_report.md
  5. 20 0
      .github/ISSUE_TEMPLATE/enhancement-request.md
  6. 14 0
      .github/ISSUE_TEMPLATE/feature_request.md
  7. 9 0
      .github/pull_request_template.md
  8. 22 12
      .gitignore
  9. 3 0
      .gitmodules
  10. 4 0
      BDInfo/BDInfo.csproj
  11. 5 5
      BDInfo/BDROM.cs
  12. 9 17
      BDInfo/Properties/AssemblyInfo.cs
  13. 1 1
      BDInfo/TSCodecDTS.cs
  14. 5 5
      BDInfo/TSCodecDTSHD.cs
  15. 2 2
      BDInfo/TSCodecMPEG2.cs
  16. 6 6
      BDInfo/TSCodecTrueHD.cs
  17. 3 3
      BDInfo/TSCodecVC1.cs
  18. 12 12
      BDInfo/TSPlaylistFile.cs
  19. 8 8
      BDInfo/TSStream.cs
  20. 5 5
      BDInfo/TSStreamClipFile.cs
  21. 70 70
      BDInfo/TSStreamFile.cs
  22. 4 2
      CONTRIBUTORS.md
  23. 19 12
      Dockerfile
  24. 7 3
      Dockerfile.arm
  25. 4 0
      DvdLib/DvdLib.csproj
  26. 1 1
      DvdLib/Ifo/Dvd.cs
  27. 2 2
      DvdLib/Ifo/DvdTime.cs
  28. 1 1
      DvdLib/Ifo/ProgramChain.cs
  29. 1 1
      DvdLib/Ifo/Title.cs
  30. 9 17
      DvdLib/Properties/AssemblyInfo.cs
  31. 1 1
      Emby.Dlna/Common/Argument.cs
  32. 2 2
      Emby.Dlna/ConnectionManager/ConnectionManagerXmlBuilder.cs
  33. 4 4
      Emby.Dlna/ConnectionManager/ServiceActionListBuilder.cs
  34. 3 3
      Emby.Dlna/ContentDirectory/ContentDirectoryXmlBuilder.cs
  35. 7 7
      Emby.Dlna/ContentDirectory/ServiceActionListBuilder.cs
  36. 3 3
      Emby.Dlna/Didl/DidlBuilder.cs
  37. 3 3
      Emby.Dlna/DlnaManager.cs
  38. 4 0
      Emby.Dlna/Emby.Dlna.csproj
  39. 1 1
      Emby.Dlna/IUpnpService.cs
  40. BIN
      Emby.Dlna/Images/logo120.jpg
  41. BIN
      Emby.Dlna/Images/logo120.png
  42. BIN
      Emby.Dlna/Images/logo240.jpg
  43. BIN
      Emby.Dlna/Images/logo240.png
  44. BIN
      Emby.Dlna/Images/logo48.jpg
  45. BIN
      Emby.Dlna/Images/logo48.png
  46. 20 20
      Emby.Dlna/Main/DlnaEntryPoint.cs
  47. 3 3
      Emby.Dlna/MediaReceiverRegistrar/ControlHandler.cs
  48. 2 2
      Emby.Dlna/MediaReceiverRegistrar/MediaReceiverRegistrarXmlBuilder.cs
  49. 5 5
      Emby.Dlna/MediaReceiverRegistrar/ServiceActionListBuilder.cs
  50. 8 8
      Emby.Dlna/PlayTo/Device.cs
  51. 4 4
      Emby.Dlna/PlayTo/PlayToController.cs
  52. 2 2
      Emby.Dlna/PlayTo/PlaylistItemFactory.cs
  53. 15 15
      Emby.Dlna/PlayTo/SsdpHttpClient.cs
  54. 2 2
      Emby.Dlna/PlayTo/TransportCommands.cs
  55. 1 1
      Emby.Dlna/PlayTo/UpnpContainer.cs
  56. 2 2
      Emby.Dlna/PlayTo/uBaseObject.cs
  57. 2 2
      Emby.Dlna/PlayTo/uParser.cs
  58. 1 1
      Emby.Dlna/Profiles/SonyBravia2010Profile.cs
  59. 8 11
      Emby.Dlna/Properties/AssemblyInfo.cs
  60. 4 7
      Emby.Dlna/Server/DescriptionXmlBuilder.cs
  61. 1 1
      Emby.Dlna/Service/BaseService.cs
  62. 1 1
      Emby.Dlna/Service/ControlErrorHandler.cs
  63. 3 3
      Emby.Dlna/Service/ServiceXmlBuilder.cs
  64. 2 2
      Emby.Dlna/Ssdp/DeviceDiscovery.cs
  65. 9 13
      Emby.Drawing.Skia/Properties/AssemblyInfo.cs
  66. 5 5
      Emby.Drawing.Skia/SkiaEncoder.cs
  67. 6 1
      Emby.Drawing.Skia/StripCollageBuilder.cs
  68. 24 18
      Emby.Drawing/Common/ImageHeader.cs
  69. 11 11
      Emby.Drawing/ImageProcessor.cs
  70. 9 9
      Emby.Drawing/Properties/AssemblyInfo.cs
  71. 4 0
      Emby.IsoMounting/IsoMounter/IsoMounter.csproj
  72. 31 31
      Emby.IsoMounting/IsoMounter/LinuxIsoManager.cs
  73. 1 1
      Emby.IsoMounting/IsoMounter/LinuxMount.cs
  74. 21 0
      Emby.IsoMounting/IsoMounter/Properties/AssemblyInfo.cs
  75. 1 1
      Emby.Naming/AudioBook/AudioBookInfo.cs
  76. 2 2
      Emby.Naming/AudioBook/AudioBookResolver.cs
  77. 1 1
      Emby.Naming/Common/NamingOptions.cs
  78. 13 2
      Emby.Naming/Emby.Naming.csproj
  79. 21 0
      Emby.Naming/Properties/AssemblyInfo.cs
  80. 2 2
      Emby.Naming/Subtitles/SubtitleParser.cs
  81. 2 2
      Emby.Naming/TV/EpisodePathParser.cs
  82. 2 2
      Emby.Naming/TV/EpisodeResolver.cs
  83. 3 3
      Emby.Naming/Video/CleanDateTimeParser.cs
  84. 2 2
      Emby.Naming/Video/CleanStringParser.cs
  85. 1 1
      Emby.Naming/Video/FlagParser.cs
  86. 2 2
      Emby.Naming/Video/Format3DParser.cs
  87. 1 1
      Emby.Naming/Video/StackResolver.cs
  88. 1 1
      Emby.Naming/Video/StubResolver.cs
  89. 1 1
      Emby.Naming/Video/VideoFileInfo.cs
  90. 1 1
      Emby.Naming/Video/VideoInfo.cs
  91. 4 4
      Emby.Naming/Video/VideoListResolver.cs
  92. 1 1
      Emby.Naming/Video/VideoResolver.cs
  93. 4 0
      Emby.Notifications/Emby.Notifications.csproj
  94. 6 21
      Emby.Notifications/Properties/AssemblyInfo.cs
  95. 9 22
      Emby.Photos/Properties/AssemblyInfo.cs
  96. 4 4
      Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs
  97. 4 4
      Emby.Server.Implementations/Activity/ActivityRepository.cs
  98. 10 61
      Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs
  99. 3 2
      Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs
  100. 2 1
      Emby.Server.Implementations/AppBase/ConfigurationHelper.cs

+ 3 - 0
.dockerignore

@@ -3,3 +3,6 @@
 Dockerfile
 CONTRIBUTORS.md
 README.md
+deployment/*/dist
+deployment/*/pkg-dist
+deployment/collect-dist/

+ 1 - 1
.drone.yml

@@ -9,4 +9,4 @@ steps:
 - name: build
   image: microsoft/dotnet:2-sdk
   commands:
-    - dotnet publish --configuration release --output /release
+    - dotnet publish --configuration release --output /release Jellyfin.Server

+ 133 - 0
.editorconfig

@@ -0,0 +1,133 @@
+# With more recent updates Visual Studio 2017 supports EditorConfig files out of the box
+# Visual Studio Code needs an extension: https://github.com/editorconfig/editorconfig-vscode
+# For emacs, vim, np++ and other editors, see here: https://github.com/editorconfig
+############################### 
+# Core EditorConfig Options   # 
+###############################
+root = true
+# All files 
+[*] 
+indent_style = space 
+indent_size = 4
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+end_of_line = lf
+max_line_length = null
+
+# Code files 
+[*.{cs,csx,vb,vbx}] 
+indent_size = 4 
+insert_final_newline = true 
+charset = utf-8
+############################### 
+# .NET Coding Conventions     # 
+############################### 
+[*.{cs,vb}] 
+# Organize usings 
+dotnet_sort_system_directives_first = true 
+# this. preferences 
+dotnet_style_qualification_for_field = false:silent 
+dotnet_style_qualification_for_property = false:silent 
+dotnet_style_qualification_for_method = false:silent 
+dotnet_style_qualification_for_event = false:silent 
+# Language keywords vs BCL types preferences 
+dotnet_style_predefined_type_for_locals_parameters_members = true:silent 
+dotnet_style_predefined_type_for_member_access = true:silent 
+# Parentheses preferences 
+dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent 
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent 
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent 
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent 
+# Modifier preferences 
+dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent 
+dotnet_style_readonly_field = true:suggestion 
+# Expression-level preferences 
+dotnet_style_object_initializer = true:suggestion 
+dotnet_style_collection_initializer = true:suggestion 
+dotnet_style_explicit_tuple_names = true:suggestion 
+dotnet_style_null_propagation = true:suggestion 
+dotnet_style_coalesce_expression = true:suggestion 
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:silent 
+dotnet_prefer_inferred_tuple_names = true:suggestion 
+dotnet_prefer_inferred_anonymous_type_member_names = true:suggestion 
+dotnet_style_prefer_auto_properties = true:silent 
+dotnet_style_prefer_conditional_expression_over_assignment = true:silent 
+dotnet_style_prefer_conditional_expression_over_return = true:silent 
+############################### 
+# Naming Conventions          # 
+############################### 
+# Style Definitions 
+dotnet_naming_style.pascal_case_style.capitalization             = pascal_case 
+# Use PascalCase for constant fields   
+dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion 
+dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols  = constant_fields 
+dotnet_naming_rule.constant_fields_should_be_pascal_case.style    = pascal_case_style 
+dotnet_naming_symbols.constant_fields.applicable_kinds            = field 
+dotnet_naming_symbols.constant_fields.applicable_accessibilities  = * 
+dotnet_naming_symbols.constant_fields.required_modifiers          = const 
+############################### 
+# C# Coding Conventions       # 
+############################### 
+[*.cs] 
+# var preferences 
+csharp_style_var_for_built_in_types = true:silent 
+csharp_style_var_when_type_is_apparent = true:silent 
+csharp_style_var_elsewhere = true:silent 
+# Expression-bodied members 
+csharp_style_expression_bodied_methods = false:silent 
+csharp_style_expression_bodied_constructors = false:silent 
+csharp_style_expression_bodied_operators = false:silent 
+csharp_style_expression_bodied_properties = true:silent 
+csharp_style_expression_bodied_indexers = true:silent 
+csharp_style_expression_bodied_accessors = true:silent 
+# Pattern matching preferences 
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion 
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion 
+# Null-checking preferences 
+csharp_style_throw_expression = true:suggestion 
+csharp_style_conditional_delegate_call = true:suggestion 
+# Modifier preferences 
+csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion 
+# Expression-level preferences 
+csharp_prefer_braces = true:silent 
+csharp_style_deconstructed_variable_declaration = true:suggestion 
+csharp_prefer_simple_default_expression = true:suggestion 
+csharp_style_pattern_local_over_anonymous_function = true:suggestion 
+csharp_style_inlined_variable_declaration = true:suggestion 
+############################### 
+# C# Formatting Rules         # 
+############################### 
+# New line preferences 
+csharp_new_line_before_open_brace = all 
+csharp_new_line_before_else = true 
+csharp_new_line_before_catch = true 
+csharp_new_line_before_finally = true 
+csharp_new_line_before_members_in_object_initializers = true 
+csharp_new_line_before_members_in_anonymous_types = true 
+csharp_new_line_between_query_expression_clauses = true 
+# Indentation preferences 
+csharp_indent_case_contents = true 
+csharp_indent_switch_labels = true 
+csharp_indent_labels = flush_left 
+# Space preferences 
+csharp_space_after_cast = false 
+csharp_space_after_keywords_in_control_flow_statements = true 
+csharp_space_between_method_call_parameter_list_parentheses = false 
+csharp_space_between_method_declaration_parameter_list_parentheses = false 
+csharp_space_between_parentheses = false 
+csharp_space_before_colon_in_inheritance_clause = true 
+csharp_space_after_colon_in_inheritance_clause = true 
+csharp_space_around_binary_operators = before_and_after 
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false 
+csharp_space_between_method_call_name_and_opening_parenthesis = false 
+csharp_space_between_method_call_empty_parameter_list_parentheses = false 
+# Wrapping preferences 
+csharp_preserve_single_line_statements = true 
+csharp_preserve_single_line_blocks = true 
+############################### 
+# VB Coding Conventions       # 
+############################### 
+[*.vb] 
+# Modifier preferences 
+visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion 

+ 35 - 0
.github/ISSUE_TEMPLATE/bug_report.md

@@ -0,0 +1,35 @@
+---
+name: Bug report
+about: Create a bug report
+title: ''
+labels: bug
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Logs**
+Please paste any log errors.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**System (please complete the following information):**
+ - OS: [e.g. Docker, Debian, Windows]
+ - Browser: [e.g. Firefox, Chrome, Safari]
+ - Jellyfin Version: [e.g. 10.0.1]
+
+**Additional context**
+Add any other context about the problem here.

+ 20 - 0
.github/ISSUE_TEMPLATE/enhancement-request.md

@@ -0,0 +1,20 @@
+---
+name: Enhancement request
+about: Suggest an modification to an existing feature
+title: ''
+labels: enhancement
+assignees: ''
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.

+ 14 - 0
.github/ISSUE_TEMPLATE/feature_request.md

@@ -0,0 +1,14 @@
+---
+name: Feature request
+about: Suggest a new feature
+title: ''
+labels: feature
+assignees: ''
+
+---
+
+**Describe the feature you'd like**
+A clear and concise description of what you want to happen.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.

+ 9 - 0
.github/pull_request_template.md

@@ -0,0 +1,9 @@
+Ensure your title is short, descriptive, and in the imperative mood (Fix X, Change Y, instead of Fixed X, Changed Y).
+For a good inspiration of what to write in commit messages and PRs please review https://chris.beams.io/posts/git-commit/ and our https://jellyfin.readthedocs.io/en/latest/developer-docs/contributing/ page.
+
+**Changes**
+Describe your changes here in 1-5 sentences.
+
+**Issues**
+Tag any issues that this PR solves here.
+Fixes #

+ 22 - 12
.gitignore

@@ -1,5 +1,3 @@
-!*
-
 .directory
 
 #################
@@ -49,6 +47,8 @@ ProgramData-UI*/
 ## Ignore Visual Studio temporary files, build results, and
 ## files generated by popular Visual Studio add-ons.
 
+.vs/
+
 # User-specific files
 *.suo
 *.user
@@ -204,7 +204,6 @@ $RECYCLE.BIN/
 # Mac crap
 .DS_Store
 
-
 #############
 ## Python
 #############
@@ -234,22 +233,33 @@ pip-log.txt
 
 #Mr Developer
 .mr.developer.cfg
-MediaBrowser.WebDashboard/dashboard-ui/.idea/
-/.vs
 
 ##########
 # Rider
 ##########
 .idea/
 
+##########
+# Visual Studio Code
+##########
+.vscode/
+
 #########################
-# Debian build artifacts
+# Build artifacts
 #########################
 
-debian/.debhelper/
-debian/files
-debian/jellyfin.substvars
-debian/jellyfin/
-
+# Artifacts for debian-x64
+deployment/debian-package-x64/pkg-src/.debhelper/
+deployment/debian-package-x64/pkg-src/*.debhelper
+deployment/debian-package-x64/pkg-src/debhelper-build-stamp
+deployment/debian-package-x64/pkg-src/files
+deployment/debian-package-x64/pkg-src/jellyfin.substvars
+deployment/debian-package-x64/pkg-src/jellyfin/
 # Don't ignore the debian/bin folder
-!debian/bin/
+!deployment/debian-package-x64/pkg-src/bin/
+
+deployment/**/dist/
+deployment/**/pkg-dist/
+deployment/**/pkg-dist-tmp/
+deployment/collect-dist/
+

+ 3 - 0
.gitmodules

@@ -1,3 +1,6 @@
 [submodule "ThirdParty/taglib-sharp"]
 	path = ThirdParty/taglib-sharp
 	url = https://github.com/mono/taglib-sharp.git
+[submodule "MediaBrowser.WebDashboard/jellyfin-web"]
+	path = MediaBrowser.WebDashboard/jellyfin-web
+	url = https://github.com/jellyfin/jellyfin-web.git

+ 4 - 0
BDInfo/BDInfo.csproj

@@ -1,5 +1,9 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
+  <ItemGroup>
+    <Compile Include="..\SharedVersion.cs" Link="SharedVersion.cs" />
+  </ItemGroup>
+
   <ItemGroup>
     <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
   </ItemGroup>

+ 5 - 5
BDInfo/BDROM.cs

@@ -77,7 +77,7 @@ namespace BDInfo
         {
             if (string.IsNullOrEmpty(path))
             {
-                throw new ArgumentNullException("path");
+                throw new ArgumentNullException(nameof(path));
             }
 
             _fileSystem = fileSystem;
@@ -235,7 +235,7 @@ namespace BDInfo
                             break;
                         }
                     }
-                    else throw ex;
+                    else throw;
                 }
             }
 
@@ -273,7 +273,7 @@ namespace BDInfo
                             break;
                         }
                     }
-                    else throw ex;
+                    else throw;
                 }
             }
 
@@ -310,7 +310,7 @@ namespace BDInfo
                             break;
                         }
                     }
-                    else throw ex;
+                    else throw;
                 }
             }
 
@@ -336,7 +336,7 @@ namespace BDInfo
         {
             if (string.IsNullOrEmpty(path))
             {
-                throw new ArgumentNullException("path");
+                throw new ArgumentNullException(nameof(path));
             }
 
             FileSystemMetadata dir = _fileSystem.GetDirectoryInfo(path);

+ 9 - 17
BDInfo/Properties/AssemblyInfo.cs

@@ -1,29 +1,21 @@
-using System.Resources;
 using System.Reflection;
-using System.Runtime.CompilerServices;
+using System.Resources;
 using System.Runtime.InteropServices;
 
-// General Information about an assembly is controlled through the following 
+// General Information about an assembly is controlled through the following
 // set of attributes. Change these attribute values to modify the information
 // associated with an assembly.
 [assembly: AssemblyTitle("BDInfo")]
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("BDInfo")]
-[assembly: AssemblyCopyright("Copyright ©  2016")]
+[assembly: AssemblyCompany("Jellyfin Project")]
+[assembly: AssemblyProduct("Jellyfin: The Free Software Media System")]
+[assembly: AssemblyCopyright("Copyright ©  2016 CinemaSquid. Copyright ©  2019 Jellyfin Contributors. Code released under the GNU General Public License Version 2")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 [assembly: NeutralResourcesLanguage("en")]
 
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers 
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.1")]
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]

+ 1 - 1
BDInfo/TSCodecDTS.cs

@@ -148,7 +148,7 @@ namespace BDInfo
                     stream.IsVBR = true;
                     stream.IsInitialized = true;
                     break;
-                
+
                 default:
                     stream.IsVBR = false;
                     stream.IsInitialized = true;

+ 5 - 5
BDInfo/TSCodecDTSHD.cs

@@ -22,9 +22,9 @@ namespace BDInfo
 {
     public abstract class TSCodecDTSHD
     {
-        private static int[] SampleRates = new int[] 
+        private static int[] SampleRates = new int[]
         { 0x1F40, 0x3E80, 0x7D00, 0x0FA00, 0x1F400, 0x5622, 0x0AC44, 0x15888, 0x2B110, 0x56220, 0x2EE0, 0x5DC0, 0x0BB80, 0x17700, 0x2EE00, 0x5DC00 };
-        
+
         public static void Scan(
             TSAudioStream stream,
             TSStreamBuffer buffer,
@@ -131,7 +131,7 @@ namespace BDInfo
                 else
                 {
                     AssetSizes[i] = buffer.ReadBits(16) + 1;
-                }                
+                }
             }
             for (int i = 0; i < nuNumAssets; i++)
             {
@@ -189,7 +189,7 @@ namespace BDInfo
                     }
                     stream.SampleRate = SampleRates[nuMaxSampleRate];
                     stream.BitDepth = nuBitResolution;
-                    
+
                     stream.LFE = 0;
                     if ((nuSpkrActivityMask & 0x8) == 0x8)
                     {
@@ -240,7 +240,7 @@ namespace BDInfo
                     stream.IsInitialized = true;
                 }
                 stream.IsInitialized = (stream.BitRate > 0 ? true : false);
-            }            
+            }
         }
     }
 }

+ 2 - 2
BDInfo/TSCodecMPEG2.cs

@@ -33,7 +33,7 @@ namespace BDInfo
             int pictureParse = 0;
             int sequenceHeaderParse = 0;
             int extensionParse = 0;
-            int sequenceExtensionParse = 0;            
+            int sequenceExtensionParse = 0;
 
             for (int i = 0; i < buffer.Length; i++)
             {
@@ -189,7 +189,7 @@ namespace BDInfo
 #if DEBUG
                     if (sequenceExtensionParse == 0)
                     {
-                        uint sequenceExtension = 
+                        uint sequenceExtension =
                             ((parse & 0x8) >> 3);
                         if (sequenceExtension == 0)
                         {

+ 6 - 6
BDInfo/TSCodecTrueHD.cs

@@ -36,7 +36,7 @@ namespace BDInfo
             for (int i = 0; i < buffer.Length; i++)
             {
                 sync = (sync << 8) + buffer.ReadByte();
-                if (sync == 0xF8726FBA) 
+                if (sync == 0xF8726FBA)
                 {
                     syncFound = true;
                     break;
@@ -63,7 +63,7 @@ namespace BDInfo
             int ratebits = buffer.ReadBits(4);
             if (ratebits != 0xF)
             {
-                stream.SampleRate = 
+                stream.SampleRate =
                     (((ratebits & 8) > 0 ? 44100 : 48000) << (ratebits & 7));
             }
             int temp1 = buffer.ReadBits(8);
@@ -149,9 +149,9 @@ namespace BDInfo
             int peak_bitrate = buffer.ReadBits(15);
             peak_bitrate = (peak_bitrate * stream.SampleRate) >> 4;
 
-            double peak_bitdepth = 
-                (double)peak_bitrate / 
-                (stream.ChannelCount + stream.LFE) / 
+            double peak_bitdepth =
+                (double)peak_bitrate /
+                (stream.ChannelCount + stream.LFE) /
                 stream.SampleRate;
             if (peak_bitdepth > 14)
             {
@@ -164,7 +164,7 @@ namespace BDInfo
 
 #if DEBUG
             System.Diagnostics.Debug.WriteLine(string.Format(
-                "{0}\t{1}\t{2:F2}", 
+                "{0}\t{1}\t{2:F2}",
                 stream.PID, peak_bitrate, peak_bitdepth));
 #endif
             /*

+ 3 - 3
BDInfo/TSCodecVC1.cs

@@ -50,18 +50,18 @@ namespace BDInfo
                         {
                             if ((parse & 0x80000000) == 0)
                             {
-                                pictureType = 
+                                pictureType =
                                     (uint)((parse & 0x78000000) >> 13);
                             }
                             else
                             {
-                                pictureType = 
+                                pictureType =
                                     (uint)((parse & 0x3c000000) >> 12);
                             }
                         }
                         else
                         {
-                            pictureType = 
+                            pictureType =
                                 (uint)((parse & 0xf0000000) >> 14);
                         }
 

+ 12 - 12
BDInfo/TSPlaylistFile.cs

@@ -42,7 +42,7 @@ namespace BDInfo
 
         public List<double> Chapters = new List<double>();
 
-        public Dictionary<ushort, TSStream> Streams = 
+        public Dictionary<ushort, TSStream> Streams =
             new Dictionary<ushort, TSStream>();
         public Dictionary<ushort, TSStream> PlaylistStreams =
             new Dictionary<ushort, TSStream>();
@@ -50,19 +50,19 @@ namespace BDInfo
             new List<TSStreamClip>();
         public List<Dictionary<ushort, TSStream>> AngleStreams =
             new List<Dictionary<ushort, TSStream>>();
-        public List<Dictionary<double, TSStreamClip>> AngleClips = 
+        public List<Dictionary<double, TSStreamClip>> AngleClips =
             new List<Dictionary<double, TSStreamClip>>();
         public int AngleCount = 0;
 
-        public List<TSStream> SortedStreams = 
+        public List<TSStream> SortedStreams =
             new List<TSStream>();
-        public List<TSVideoStream> VideoStreams = 
+        public List<TSVideoStream> VideoStreams =
             new List<TSVideoStream>();
-        public List<TSAudioStream> AudioStreams = 
+        public List<TSAudioStream> AudioStreams =
             new List<TSAudioStream>();
-        public List<TSTextStream> TextStreams = 
+        public List<TSTextStream> TextStreams =
             new List<TSTextStream>();
-        public List<TSGraphicsStream> GraphicsStreams = 
+        public List<TSGraphicsStream> GraphicsStreams =
             new List<TSGraphicsStream>();
 
         public TSPlaylistFile(
@@ -388,8 +388,8 @@ namespace BDInfo
 
 #if DEBUG
                     Debug.WriteLine(string.Format(
-                        "{0} : {1} -> V:{2} A:{3} PG:{4} IG:{5} 2A:{6} 2V:{7} PIP:{8}", 
-                        Name, streamFileName, streamCountVideo, streamCountAudio, streamCountPG, streamCountIG, 
+                        "{0} : {1} -> V:{2} A:{3} PG:{4} IG:{5} 2A:{6} 2V:{7} PIP:{8}",
+                        Name, streamFileName, streamCountVideo, streamCountAudio, streamCountPG, streamCountIG,
                         streamCountSecondaryAudio, streamCountSecondaryVideo, streamCountPIP));
 #endif
 
@@ -427,7 +427,7 @@ namespace BDInfo
                     }
                     /*
                      * TODO
-                     * 
+                     *
                     for (int i = 0; i < streamCountPIP; i++)
                     {
                         TSStream stream = CreatePlaylistStream(data, ref pos);
@@ -955,7 +955,7 @@ namespace BDInfo
         }
 
         public int CompareVideoStreams(
-            TSVideoStream x, 
+            TSVideoStream x,
             TSVideoStream y)
         {
             if (x == null && y == null)
@@ -996,7 +996,7 @@ namespace BDInfo
         }
 
         public int CompareAudioStreams(
-            TSAudioStream x, 
+            TSAudioStream x,
             TSAudioStream y)
         {
             if (x == y)

+ 8 - 8
BDInfo/TSStream.cs

@@ -109,7 +109,7 @@ namespace BDInfo
 
         public TSDescriptor Clone()
         {
-            TSDescriptor descriptor = 
+            TSDescriptor descriptor =
                 new TSDescriptor(Name, (byte)Value.Length);
             Value.CopyTo(descriptor.Value, 0);
             return descriptor;
@@ -153,15 +153,15 @@ namespace BDInfo
         private string _LanguageCode;
         public string LanguageCode
         {
-            get 
+            get
             {
-                return _LanguageCode; 
+                return _LanguageCode;
             }
-            set 
+            set
             {
                 _LanguageCode = value;
                 LanguageName = LanguageCodes.GetName(value);
-            } 
+            }
         }
 
         public bool IsVideoStream
@@ -407,7 +407,7 @@ namespace BDInfo
         }
 
         public abstract TSStream Clone();
-        
+
         protected void CopyTo(TSStream stream)
         {
             stream.PID = PID;
@@ -435,7 +435,7 @@ namespace BDInfo
 
         public int Width;
         public int Height;
-        public bool IsInterlaced;        
+        public bool IsInterlaced;
         public int FrameRateEnumerator;
         public int FrameRateDenominator;
         public TSAspectRatio AspectRatio;
@@ -581,7 +581,7 @@ namespace BDInfo
             stream.FrameRate = _FrameRate;
             stream.Width = Width;
             stream.Height = Height;
-            stream.IsInterlaced = IsInterlaced;        
+            stream.IsInterlaced = IsInterlaced;
             stream.FrameRateEnumerator = FrameRateEnumerator;
             stream.FrameRateDenominator = FrameRateDenominator;
             stream.AspectRatio = AspectRatio;

+ 5 - 5
BDInfo/TSStreamClipFile.cs

@@ -69,7 +69,7 @@ namespace BDInfo
 
                 byte[] fileType = new byte[8];
                 Array.Copy(data, 0, fileType, 0, fileType.Length);
-                
+
                 FileType = _textEncoding.GetASCIIEncoding().GetString(fileType, 0, fileType.Length);
                 if (FileType != "HDMV0100" &&
                     FileType != "HDMV0200")
@@ -78,7 +78,7 @@ namespace BDInfo
                         "Clip info file {0} has an unknown file type {1}.",
                         FileInfo.Name, FileType));
                 }
-#if DEBUG                
+#if DEBUG
                 Debug.WriteLine(string.Format(
                     "\tFileType: {0}", FileType));
 #endif
@@ -110,9 +110,9 @@ namespace BDInfo
                     TSStream stream = null;
 
                     ushort PID = (ushort)
-                        ((clipData[streamOffset] << 8) + 
+                        ((clipData[streamOffset] << 8) +
                           clipData[streamOffset + 1]);
-                    
+
                     streamOffset += 2;
 
                     TSStreamType streamType = (TSStreamType)
@@ -240,7 +240,7 @@ namespace BDInfo
                     }
 
                     streamOffset += clipData[streamOffset] + 1;
-                }                
+                }
                 IsValid = true;
             }
             finally

+ 70 - 70
BDInfo/TSStreamFile.cs

@@ -391,7 +391,7 @@ namespace BDInfo
                         }
 
                         Dictionary<ushort, TSStream> playlistStreams = playlist.Streams;
-                        if (clip.AngleIndex > 0 && 
+                        if (clip.AngleIndex > 0 &&
                             clip.AngleIndex < playlist.AngleStreams.Count + 1)
                         {
                             playlistStreams = playlist.AngleStreams[clip.AngleIndex - 1];
@@ -428,7 +428,7 @@ namespace BDInfo
                 TSStream stream = Streams[PID];
                 stream.PayloadBytes += streamState.WindowBytes;
                 stream.PacketCount += streamState.WindowPackets;
-                
+
                 if (stream.IsVideoStream)
                 {
                     TSStreamDiagnostics diag = new TSStreamDiagnostics();
@@ -457,7 +457,7 @@ namespace BDInfo
             int dataSize = 16384;
             Stream fileStream = null;
             try
-            {                
+            {
                 string fileName;
                 if (BDInfoSettings.EnableSSIF &&
                     InterleavedFile != null)
@@ -482,13 +482,13 @@ namespace BDInfo
                 StreamStates.Clear();
                 StreamDiagnostics.Clear();
 
-                TSPacketParser parser = 
+                TSPacketParser parser =
                     new TSPacketParser();
-                
+
                 long fileLength = (uint)fileStream.Length;
                 byte[] buffer = new byte[dataSize];
                 int bufferLength = 0;
-                while ((bufferLength = 
+                while ((bufferLength =
                     fileStream.Read(buffer, 0, buffer.Length)) > 0)
                 {
                     int offset = 0;
@@ -598,8 +598,8 @@ namespace BDInfo
                                             parser.StreamState.TransferCount++;
 
                                             bool isFinished = ScanStream(
-                                                parser.Stream, 
-                                                parser.StreamState, 
+                                                parser.Stream,
+                                                parser.StreamState,
                                                 parser.StreamState.StreamBuffer);
 
                                             if (!isFullScan && isFinished)
@@ -680,10 +680,10 @@ namespace BDInfo
                                         for (int k = 0; k < (parser.PATOffset - 4); k += 4)
                                         {
                                             uint programNumber = (uint)
-                                                ((parser.PAT[k] << 8) +  
+                                                ((parser.PAT[k] << 8) +
                                                   parser.PAT[k + 1]);
 
-                                            ushort programPID = (ushort)                                                 
+                                            ushort programPID = (ushort)
                                                 (((parser.PAT[k + 2] & 0x1F) << 8) +
                                                    parser.PAT[k + 3]);
 
@@ -985,7 +985,7 @@ namespace BDInfo
                                                 parser.PMTProgramDescriptorLength = buffer[i];
                                                 parser.PMTProgramDescriptors.Add(
                                                     new TSDescriptor(
-                                                        parser.PMTProgramDescriptor, 
+                                                        parser.PMTProgramDescriptor,
                                                         parser.PMTProgramDescriptorLength));
                                                 break;
                                         }
@@ -998,7 +998,7 @@ namespace BDInfo
                                             parser.PMTProgramDescriptors.Count - 1];
 
                                         int valueIndex =
-                                            descriptor.Value.Length - 
+                                            descriptor.Value.Length -
                                             parser.PMTProgramDescriptorLength - 1;
 
                                         descriptor.Value[valueIndex] = buffer[i];
@@ -1020,8 +1020,8 @@ namespace BDInfo
                                 parser.SyncState = false;
                             }
                         }
-                        else if (parser.Stream != null && 
-                            parser.StreamState != null && 
+                        else if (parser.Stream != null &&
+                            parser.StreamState != null &&
                             parser.TransportScramblingControl == 0)
                         {
                             TSStream stream = parser.Stream;
@@ -1032,7 +1032,7 @@ namespace BDInfo
 
                             if (streamState.TransferState)
                             {
-                                if ((bufferLength - i) >= streamState.PacketLength && 
+                                if ((bufferLength - i) >= streamState.PacketLength &&
                                     streamState.PacketLength > 0)
                                 {
                                     offset = streamState.PacketLength;
@@ -1085,7 +1085,7 @@ namespace BDInfo
                                 --parser.PacketLength;
 
                                 bool headerFound = false;
-                                if (stream.IsVideoStream && 
+                                if (stream.IsVideoStream &&
                                     streamState.Parse == 0x000001FD)
                                 {
                                     headerFound = true;
@@ -1170,18 +1170,18 @@ namespace BDInfo
                                                 (byte)(streamState.Parse & 0xFF);
 #endif
                                             break;
-                                        
+
                                         case 1:
-                                            streamState.PESHeaderFlags = 
+                                            streamState.PESHeaderFlags =
                                                 (byte)(streamState.Parse & 0xFF);
 #if DEBUG
                                             streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xFF);
 #endif
                                             break;
-                                        
+
                                         case 0:
-                                            streamState.PESHeaderLength = 
+                                            streamState.PESHeaderLength =
                                                 (byte)(streamState.Parse & 0xFF);
 #if DEBUG
                                             streamState.PESHeader[streamState.PESHeaderIndex++] =
@@ -1211,48 +1211,48 @@ namespace BDInfo
                                     switch (streamState.PTSParse)
                                     {
                                         case 4:
-                                            streamState.PTSTemp = 
+                                            streamState.PTSTemp =
                                                 ((streamState.Parse & 0xE) << 29);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xff);
 #endif
                                             break;
-                                        
+
                                         case 3:
-                                            streamState.PTSTemp |= 
+                                            streamState.PTSTemp |=
                                                 ((streamState.Parse & 0xFF) << 22);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xFF);
 #endif
                                             break;
-                                        
+
                                         case 2:
-                                            streamState.PTSTemp |= 
+                                            streamState.PTSTemp |=
                                                 ((streamState.Parse & 0xFE) << 14);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xFF);
 #endif
                                             break;
-                                        
+
                                         case 1:
-                                            streamState.PTSTemp |= 
+                                            streamState.PTSTemp |=
                                                 ((streamState.Parse & 0xFF) << 7);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xFF);
 #endif
                                             break;
-                                        
+
                                         case 0:
-                                            streamState.PTSTemp |= 
+                                            streamState.PTSTemp |=
                                                 ((streamState.Parse & 0xFE) >> 1);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xff);
-#endif                                        
+#endif
                                             streamState.PTS = streamState.PTSTemp;
 
                                             if (streamState.PTS > streamState.PTSLast)
@@ -1260,13 +1260,13 @@ namespace BDInfo
                                                 if (streamState.PTSLast > 0)
                                                 {
                                                     streamState.PTSTransfer = (streamState.PTS - streamState.PTSLast);
-                                                }                                                
+                                                }
                                                 streamState.PTSLast = streamState.PTS;
                                             }
 
                                             streamState.PTSDiff = streamState.PTS - streamState.DTSPrev;
 
-                                            if (streamState.PTSCount > 0 && 
+                                            if (streamState.PTSCount > 0 &&
                                                 stream.IsVideoStream)
                                             {
                                                 UpdateStreamBitrates(stream.PID, streamState.PTS, streamState.PTSDiff);
@@ -1280,7 +1280,7 @@ namespace BDInfo
                                                 }
                                                 Length = (double)(parser.PTSLast - parser.PTSFirst) / 90000;
                                             }
-                                            
+
                                             streamState.DTSPrev = streamState.PTS;
                                             streamState.PTSCount++;
                                             if (streamState.PESHeaderLength == 0)
@@ -1299,46 +1299,46 @@ namespace BDInfo
                                     switch (streamState.DTSParse)
                                     {
                                         case 9:
-                                            streamState.PTSTemp = 
+                                            streamState.PTSTemp =
                                                 ((streamState.Parse & 0xE) << 29);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xFF);
 #endif
                                             break;
-                                        
+
                                         case 8:
-                                            streamState.PTSTemp |= 
+                                            streamState.PTSTemp |=
                                                 ((streamState.Parse & 0xFF) << 22);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xFF);
 #endif
                                             break;
-                                        
+
                                         case 7:
-                                            streamState.PTSTemp |= 
+                                            streamState.PTSTemp |=
                                                 ((streamState.Parse & 0xFE) << 14);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xff);
 #endif
                                             break;
-                                        
+
                                         case 6:
-                                            streamState.PTSTemp |= 
+                                            streamState.PTSTemp |=
                                                 ((streamState.Parse & 0xFF) << 7);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xFF);
 #endif
                                             break;
-                                        
+
                                         case 5:
-                                            streamState.PTSTemp |= 
+                                            streamState.PTSTemp |=
                                                 ((streamState.Parse & 0xFE) >> 1);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xff);
 #endif
                                             streamState.PTS = streamState.PTSTemp;
@@ -1347,48 +1347,48 @@ namespace BDInfo
                                                 streamState.PTSLast = streamState.PTS;
                                             }
                                             break;
-                                        
+
                                         case 4:
-                                            streamState.DTSTemp = 
+                                            streamState.DTSTemp =
                                                 ((streamState.Parse & 0xE) << 29);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xff);
 #endif
                                             break;
-                                        
+
                                         case 3:
-                                            streamState.DTSTemp |= 
+                                            streamState.DTSTemp |=
                                                 ((streamState.Parse & 0xFF) << 22);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xff);
 #endif
                                             break;
-                                        
+
                                         case 2:
-                                            streamState.DTSTemp |= 
+                                            streamState.DTSTemp |=
                                                 ((streamState.Parse & 0xFE) << 14);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xff);
 #endif
                                             break;
-                                        
+
                                         case 1:
-                                            streamState.DTSTemp |= 
+                                            streamState.DTSTemp |=
                                                 ((streamState.Parse & 0xFF) << 7);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xFF);
 #endif
                                             break;
-                                        
+
                                         case 0:
-                                            streamState.DTSTemp |= 
+                                            streamState.DTSTemp |=
                                                 ((streamState.Parse & 0xFE) >> 1);
 #if DEBUG
-                                            streamState.PESHeader[streamState.PESHeaderIndex++] = 
+                                            streamState.PESHeader[streamState.PESHeaderIndex++] =
                                                 (byte)(streamState.Parse & 0xff);
 #endif
                                             streamState.PTSDiff = streamState.DTSTemp - streamState.DTSPrev;
@@ -1482,8 +1482,8 @@ namespace BDInfo
         }
 
         private TSStream CreateStream(
-            ushort streamPID, 
-            byte streamType, 
+            ushort streamPID,
+            byte streamType,
             List<TSDescriptor> streamDescriptors)
         {
             TSStream stream = null;
@@ -1548,6 +1548,6 @@ namespace BDInfo
             }
 
             return stream;
-        } 
+        }
     }
 }

+ 4 - 2
CONTRIBUTORS.md

@@ -10,8 +10,10 @@
  - [Bond_009](https://github.com/Bond-009)
  - [AnthonyLavado](https://github.com/anthonylavado)
  - [sparky8251](https://github.com/sparky8251)
- - [LeoVerto](https://github.com/LeoVerto]
-
+ - [LeoVerto](https://github.com/LeoVerto)
+ - [grafixeyehero](https://github.com/grafixeyehero)
+ - [cvium](https://github.com/cvium)
+ 
 # Emby Contributors
 
  - [LukePulverenti](https://github.com/LukePulverenti)

+ 19 - 12
Dockerfile

@@ -1,24 +1,31 @@
 ARG DOTNET_VERSION=2
 
+
+# Download ffmpeg first to allow quicker rebuild of other layers
+FROM alpine as ffmpeg
+ARG FFMPEG_URL=https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.0.3-64bit-static.tar.xz
+RUN wget ${FFMPEG_URL} -O - | tar Jxf - \
+ && mkdir ffmpeg-bin \
+ && mv ffmpeg*/ffmpeg ffmpeg-bin \
+ && mv ffmpeg*/ffprobe ffmpeg-bin
+
+
 FROM microsoft/dotnet:${DOTNET_VERSION}-sdk as builder
 WORKDIR /repo
 COPY . .
 RUN export DOTNET_CLI_TELEMETRY_OPTOUT=1 \
  && dotnet clean \
- && dotnet publish --configuration release --output /jellyfin
+ && dotnet publish \
+    --configuration release \
+    --output /jellyfin \
+    Jellyfin.Server
+
 
 FROM microsoft/dotnet:${DOTNET_VERSION}-runtime
 COPY --from=builder /jellyfin /jellyfin
+COPY --from=ffmpeg /ffmpeg-bin/* /usr/bin/
 EXPOSE 8096
-
 VOLUME /config /media
-
-ARG FFMPEG_URL=https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.0.3-64bit-static.tar.xz
-RUN apt update \
- && apt install -y xz-utils \
- && curl ${FFMPEG_URL} | tar Jxf - -C /usr/bin --wildcards --strip-components=1 ffmpeg*/ffmpeg ffmpeg*/ffprobe \
- && apt remove -y xz-utils
-
-ENTRYPOINT if [ -n "$PUID$PGUID" ]; \
-    then echo "PUID/PGID are deprecated. Use Docker user param." >&2; exit 1; \
-    else dotnet /jellyfin/jellyfin.dll -programdata /config; fi
+RUN apt-get update \
+ && apt-get install -y libfontconfig1 --no-install-recommends  # needed for Skia
+ENTRYPOINT dotnet /jellyfin/jellyfin.dll -programdata /config

+ 7 - 3
Dockerfile.aarch64 → Dockerfile.arm

@@ -3,15 +3,19 @@ ARG DOTNET_VERSION=3.0
 FROM microsoft/dotnet:${DOTNET_VERSION}-sdk as builder
 WORKDIR /repo
 COPY . .
+#TODO Remove or update the sed line when we update dotnet version.
 RUN export DOTNET_CLI_TELEMETRY_OPTOUT=1 \
  && find . -type f -exec sed -i 's/netcoreapp2.1/netcoreapp3.0/g' {} \; \
  && dotnet clean \
- && dotnet publish --configuration release --output /jellyfin
+ && dotnet publish \
+    --configuration release \
+    --output /jellyfin \
+    Jellyfin.Server
 
 FROM microsoft/dotnet:${DOTNET_VERSION}-runtime
 COPY --from=builder /jellyfin /jellyfin
 EXPOSE 8096
-RUN apt update \
- && apt install -y ffmpeg
+RUN apt-get update \
+ && apt-get install -y ffmpeg
 VOLUME /config /media
 ENTRYPOINT dotnet /jellyfin/jellyfin.dll -programdata /config

+ 4 - 0
DvdLib/DvdLib.csproj

@@ -1,5 +1,9 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
+  <ItemGroup>
+    <Compile Include="..\SharedVersion.cs" Link="SharedVersion.cs" />
+  </ItemGroup>
+
   <ItemGroup>
     <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
   </ItemGroup>

+ 1 - 1
DvdLib/Ifo/Dvd.cs

@@ -81,7 +81,7 @@ namespace DvdLib.Ifo
 
         private void ReadVTS(ushort vtsNum, List<FileSystemMetadata> allFiles)
         {
-            var filename = String.Format("VTS_{0:00}_0.IFO", vtsNum);
+            var filename = string.Format("VTS_{0:00}_0.IFO", vtsNum);
 
             var vtsPath = allFiles.FirstOrDefault(i => string.Equals(i.Name, filename, StringComparison.OrdinalIgnoreCase)) ??
                 allFiles.FirstOrDefault(i => string.Equals(i.Name, Path.ChangeExtension(filename, ".bup"), StringComparison.OrdinalIgnoreCase));

+ 2 - 2
DvdLib/Ifo/DvdTime.cs

@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -20,7 +20,7 @@ namespace DvdLib.Ifo
             else if ((data[3] & 0x40) != 0) FrameRate = 25;
         }
 
-        private byte GetBCDValue(byte data)
+        private static byte GetBCDValue(byte data)
         {
             return (byte)((((data & 0xF0) >> 4) * 10) + (data & 0x0F));
         }

+ 1 - 1
DvdLib/Ifo/ProgramChain.cs

@@ -68,7 +68,7 @@ namespace DvdLib.Ifo
             ProhibitedUserOperations = (UserOperation)br.ReadUInt32();
             AudioStreamControl = br.ReadBytes(16);
             SubpictureStreamControl = br.ReadBytes(128);
-            
+
             _nextProgramNumber = br.ReadUInt16();
             _prevProgramNumber = br.ReadUInt16();
             _goupProgramNumber = br.ReadUInt16();

+ 1 - 1
DvdLib/Ifo/Title.cs

@@ -20,7 +20,7 @@ namespace DvdLib.Ifo
         public ProgramChain EntryProgramChain { get; private set; }
         public readonly List<ProgramChain> ProgramChains;
 
-        public readonly List<Chapter> Chapters;        
+        public readonly List<Chapter> Chapters;
 
         public Title(uint titleNum)
         {

+ 9 - 17
DvdLib/Properties/AssemblyInfo.cs

@@ -1,29 +1,21 @@
-using System.Resources;
 using System.Reflection;
-using System.Runtime.CompilerServices;
+using System.Resources;
 using System.Runtime.InteropServices;
 
-// General Information about an assembly is controlled through the following 
+// General Information about an assembly is controlled through the following
 // set of attributes. Change these attribute values to modify the information
 // associated with an assembly.
 [assembly: AssemblyTitle("DvdLib")]
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("DvdLib")]
-[assembly: AssemblyCopyright("Copyright ©  2016")]
+[assembly: AssemblyCompany("Jellyfin Project")]
+[assembly: AssemblyProduct("Jellyfin: The Free Software Media System")]
+[assembly: AssemblyCopyright("Copyright ©  2019 Jellyfin Contributors. Code released under the GNU General Public License Version 2")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 [assembly: NeutralResourcesLanguage("en")]
 
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers 
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.1")]
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]

+ 1 - 1
Emby.Dlna/Common/Argument.cs

@@ -1,6 +1,6 @@
 
 namespace Emby.Dlna.Common
-{  
+{
     public class Argument
     {
         public string Name { get;  set; }

+ 2 - 2
Emby.Dlna/ConnectionManager/ConnectionManagerXmlBuilder.cs

@@ -1,4 +1,4 @@
-using Emby.Dlna.Common;
+using Emby.Dlna.Common;
 using Emby.Dlna.Service;
 using System.Collections.Generic;
 
@@ -11,7 +11,7 @@ namespace Emby.Dlna.ConnectionManager
             return new ServiceXmlBuilder().GetXml(new ServiceActionListBuilder().GetActions(), GetStateVariables());
         }
 
-        private IEnumerable<StateVariable> GetStateVariables()
+        private static IEnumerable<StateVariable> GetStateVariables()
         {
             var list = new List<StateVariable>();
 

+ 4 - 4
Emby.Dlna/ConnectionManager/ServiceActionListBuilder.cs

@@ -1,4 +1,4 @@
-using Emby.Dlna.Common;
+using Emby.Dlna.Common;
 using System.Collections.Generic;
 
 namespace Emby.Dlna.ConnectionManager
@@ -19,7 +19,7 @@ namespace Emby.Dlna.ConnectionManager
             return list;
         }
 
-        private ServiceAction PrepareForConnection()
+        private static ServiceAction PrepareForConnection()
         {
             var action = new ServiceAction
             {
@@ -77,8 +77,8 @@ namespace Emby.Dlna.ConnectionManager
 
             return action;
         }
-        
-        private ServiceAction GetCurrentConnectionInfo()
+
+        private static ServiceAction GetCurrentConnectionInfo()
         {
             var action = new ServiceAction
             {

+ 3 - 3
Emby.Dlna/ContentDirectory/ContentDirectoryXmlBuilder.cs

@@ -1,4 +1,4 @@
-using Emby.Dlna.Common;
+using Emby.Dlna.Common;
 using Emby.Dlna.Service;
 using System.Collections.Generic;
 
@@ -8,11 +8,11 @@ namespace Emby.Dlna.ContentDirectory
     {
         public string GetXml()
         {
-            return new ServiceXmlBuilder().GetXml(new ServiceActionListBuilder().GetActions(), 
+            return new ServiceXmlBuilder().GetXml(new ServiceActionListBuilder().GetActions(),
                 GetStateVariables());
         }
 
-        private IEnumerable<StateVariable> GetStateVariables()
+        private static IEnumerable<StateVariable> GetStateVariables()
         {
             var list = new List<StateVariable>();
 

+ 7 - 7
Emby.Dlna/ContentDirectory/ServiceActionListBuilder.cs

@@ -1,4 +1,4 @@
-using Emby.Dlna.Common;
+using Emby.Dlna.Common;
 using System.Collections.Generic;
 
 namespace Emby.Dlna.ContentDirectory
@@ -20,7 +20,7 @@ namespace Emby.Dlna.ContentDirectory
             };
         }
 
-        private ServiceAction GetGetSystemUpdateIDAction()
+        private static ServiceAction GetGetSystemUpdateIDAction()
         {
             var action = new ServiceAction
             {
@@ -37,7 +37,7 @@ namespace Emby.Dlna.ContentDirectory
             return action;
         }
 
-        private ServiceAction GetSearchCapabilitiesAction()
+        private static ServiceAction GetSearchCapabilitiesAction()
         {
             var action = new ServiceAction
             {
@@ -54,7 +54,7 @@ namespace Emby.Dlna.ContentDirectory
             return action;
         }
 
-        private ServiceAction GetSortCapabilitiesAction()
+        private static ServiceAction GetSortCapabilitiesAction()
         {
             var action = new ServiceAction
             {
@@ -71,7 +71,7 @@ namespace Emby.Dlna.ContentDirectory
             return action;
         }
 
-        private ServiceAction GetX_GetFeatureListAction()
+        private static ServiceAction GetX_GetFeatureListAction()
         {
             var action = new ServiceAction
             {
@@ -88,7 +88,7 @@ namespace Emby.Dlna.ContentDirectory
             return action;
         }
 
-        private ServiceAction GetSearchAction()
+        private static ServiceAction GetSearchAction()
         {
             var action = new ServiceAction
             {
@@ -334,7 +334,7 @@ namespace Emby.Dlna.ContentDirectory
 
             return action;
         }
-        
+
         private ServiceAction GetXSetBookmarkAction()
         {
             var action = new ServiceAction

+ 3 - 3
Emby.Dlna/Didl/DidlBuilder.cs

@@ -375,7 +375,7 @@ namespace Emby.Dlna.Didl
                ? GetMimeType(filename)
                : mediaProfile.MimeType;
 
-            writer.WriteAttributeString("protocolInfo", String.Format(
+            writer.WriteAttributeString("protocolInfo", string.Format(
                 "http-get:*:{0}:{1}",
                 mimeType,
                 contentFeatures
@@ -573,7 +573,7 @@ namespace Emby.Dlna.Didl
                 streamInfo.RunTimeTicks ?? 0,
                 streamInfo.TranscodeSeekInfo);
 
-            writer.WriteAttributeString("protocolInfo", String.Format(
+            writer.WriteAttributeString("protocolInfo", string.Format(
                 "http-get:*:{0}:{1}",
                 mimeType,
                 contentFeatures
@@ -1017,7 +1017,7 @@ namespace Emby.Dlna.Didl
             var contentFeatures = new ContentFeatureBuilder(_profile)
                 .BuildImageHeader(format, width, height, imageInfo.IsDirectStream, org_Pn);
 
-            writer.WriteAttributeString("protocolInfo", String.Format(
+            writer.WriteAttributeString("protocolInfo", string.Format(
                 "http-get:*:{0}:{1}",
                 GetMimeType("file." + format),
                 contentFeatures

+ 3 - 3
Emby.Dlna/DlnaManager.cs

@@ -95,7 +95,7 @@ namespace Emby.Dlna
         {
             if (deviceInfo == null)
             {
-                throw new ArgumentNullException("deviceInfo");
+                throw new ArgumentNullException(nameof(deviceInfo));
             }
 
             var profile = GetProfiles()
@@ -207,7 +207,7 @@ namespace Emby.Dlna
         {
             if (headers == null)
             {
-                throw new ArgumentNullException("headers");
+                throw new ArgumentNullException(nameof(headers));
             }
 
             // Convert to case insensitive
@@ -335,7 +335,7 @@ namespace Emby.Dlna
         {
             if (string.IsNullOrEmpty(id))
             {
-                throw new ArgumentNullException("id");
+                throw new ArgumentNullException(nameof(id));
             }
 
             var info = GetProfileInfosInternal().First(i => string.Equals(i.Info.Id, id, StringComparison.OrdinalIgnoreCase));

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

@@ -1,5 +1,9 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
+  <ItemGroup>
+    <Compile Include="..\SharedVersion.cs" Link="SharedVersion.cs" />
+  </ItemGroup>
+
   <ItemGroup>
     <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
     <ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj" />

+ 1 - 1
Emby.Dlna/IUpnpService.cs

@@ -10,7 +10,7 @@ namespace Emby.Dlna
         /// <param name="headers">The headers.</param>
         /// <returns>System.String.</returns>
         string GetServiceXml(IDictionary<string, string> headers);
-        
+
         /// <summary>
         /// Processes the control request.
         /// </summary>

BIN
Emby.Dlna/Images/logo120.jpg


BIN
Emby.Dlna/Images/logo120.png


BIN
Emby.Dlna/Images/logo240.jpg


BIN
Emby.Dlna/Images/logo240.png


BIN
Emby.Dlna/Images/logo48.jpg


BIN
Emby.Dlna/Images/logo48.png


+ 20 - 20
Emby.Dlna/Main/DlnaEntryPoint.cs

@@ -75,11 +75,11 @@ namespace Emby.Dlna.Main
             IUserDataManager userDataManager,
             ILocalizationManager localizationManager,
             IMediaSourceManager mediaSourceManager,
-            IDeviceDiscovery deviceDiscovery, 
-            IMediaEncoder mediaEncoder, 
-            ISocketFactory socketFactory, 
-            ITimerFactory timerFactory, 
-            IEnvironmentInfo environmentInfo, 
+            IDeviceDiscovery deviceDiscovery,
+            IMediaEncoder mediaEncoder,
+            ISocketFactory socketFactory,
+            ITimerFactory timerFactory,
+            IEnvironmentInfo environmentInfo,
             INetworkManager networkManager,
             IUserViewManager userViewManager,
             IXmlReaderSettingsFactory xmlReaderSettingsFactory,
@@ -104,19 +104,19 @@ namespace Emby.Dlna.Main
             _networkManager = networkManager;
             _logger = loggerFactory.CreateLogger("Dlna");
 
-            ContentDirectory = new ContentDirectory.ContentDirectory(dlnaManager, 
-                userDataManager, 
-                imageProcessor, 
-                libraryManager, 
-                config, 
-                userManager, 
-                _logger, 
-                httpClient, 
-                localizationManager, 
-                mediaSourceManager, 
+            ContentDirectory = new ContentDirectory.ContentDirectory(dlnaManager,
+                userDataManager,
+                imageProcessor,
+                libraryManager,
+                config,
+                userManager,
+                _logger,
+                httpClient,
+                localizationManager,
+                mediaSourceManager,
                 userViewManager,
-                mediaEncoder, 
-                xmlReaderSettingsFactory, 
+                mediaEncoder,
+                xmlReaderSettingsFactory,
                 tvSeriesManager);
 
             ConnectionManager = new ConnectionManager.ConnectionManager(dlnaManager, config, _logger, httpClient, xmlReaderSettingsFactory);
@@ -271,12 +271,12 @@ namespace Emby.Dlna.Main
                 var device = new SsdpRootDevice
                 {
                     CacheLifetime = TimeSpan.FromSeconds(1800), //How long SSDP clients can cache this info.
-                    Location = uri, // Must point to the URL that serves your devices UPnP description document. 
+                    Location = uri, // Must point to the URL that serves your devices UPnP description document.
                     FriendlyName = "Jellyfin",
                     Manufacturer = "Jellyfin",
                     ModelName = "Jellyfin Server",
                     Uuid = udn
-                    // This must be a globally unique value that survives reboots etc. Get from storage or embedded hardware etc.                
+                    // This must be a globally unique value that survives reboots etc. Get from storage or embedded hardware etc.
                 };
 
                 SetProperies(device, fullService);
@@ -297,7 +297,7 @@ namespace Emby.Dlna.Main
                         Manufacturer = device.Manufacturer,
                         ModelName = device.ModelName,
                         Uuid = udn
-                        // This must be a globally unique value that survives reboots etc. Get from storage or embedded hardware etc.                
+                        // This must be a globally unique value that survives reboots etc. Get from storage or embedded hardware etc.
                     };
 
                     SetProperies(embeddedDevice, subDevice);

+ 3 - 3
Emby.Dlna/MediaReceiverRegistrar/ControlHandler.cs

@@ -1,4 +1,4 @@
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Extensions;
 using MediaBrowser.Controller.Configuration;
 using Emby.Dlna.Server;
 using Emby.Dlna.Service;
@@ -21,7 +21,7 @@ namespace Emby.Dlna.MediaReceiverRegistrar
             throw new ResourceNotFoundException("Unexpected control request name: " + methodName);
         }
 
-        private IEnumerable<KeyValuePair<string, string>> HandleIsAuthorized()
+        private static IEnumerable<KeyValuePair<string, string>> HandleIsAuthorized()
         {
             return new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
             {
@@ -29,7 +29,7 @@ namespace Emby.Dlna.MediaReceiverRegistrar
             };
         }
 
-        private IEnumerable<KeyValuePair<string, string>> HandleIsValidated()
+        private static IEnumerable<KeyValuePair<string, string>> HandleIsValidated()
         {
             return new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
             {

+ 2 - 2
Emby.Dlna/MediaReceiverRegistrar/MediaReceiverRegistrarXmlBuilder.cs

@@ -1,4 +1,4 @@
-using Emby.Dlna.Common;
+using Emby.Dlna.Common;
 using Emby.Dlna.Service;
 using System.Collections.Generic;
 
@@ -12,7 +12,7 @@ namespace Emby.Dlna.MediaReceiverRegistrar
                 GetStateVariables());
         }
 
-        private IEnumerable<StateVariable> GetStateVariables()
+        private static IEnumerable<StateVariable> GetStateVariables()
         {
             var list = new List<StateVariable>();
 

+ 5 - 5
Emby.Dlna/MediaReceiverRegistrar/ServiceActionListBuilder.cs

@@ -1,4 +1,4 @@
-using Emby.Dlna.Common;
+using Emby.Dlna.Common;
 using System.Collections.Generic;
 
 namespace Emby.Dlna.MediaReceiverRegistrar
@@ -19,7 +19,7 @@ namespace Emby.Dlna.MediaReceiverRegistrar
             };
         }
 
-        private ServiceAction GetIsValidated()
+        private static ServiceAction GetIsValidated()
         {
             var action = new ServiceAction
             {
@@ -41,7 +41,7 @@ namespace Emby.Dlna.MediaReceiverRegistrar
             return action;
         }
 
-        private ServiceAction GetIsAuthorized()
+        private static ServiceAction GetIsAuthorized()
         {
             var action = new ServiceAction
             {
@@ -63,7 +63,7 @@ namespace Emby.Dlna.MediaReceiverRegistrar
             return action;
         }
 
-        private ServiceAction GetRegisterDevice()
+        private static ServiceAction GetRegisterDevice()
         {
             var action = new ServiceAction
             {
@@ -85,7 +85,7 @@ namespace Emby.Dlna.MediaReceiverRegistrar
             return action;
         }
 
-        private ServiceAction GetGetValidationSucceededUpdateID()
+        private static ServiceAction GetGetValidationSucceededUpdateID()
         {
             var action = new ServiceAction
             {

+ 8 - 8
Emby.Dlna/PlayTo/Device.cs

@@ -311,7 +311,7 @@ namespace Emby.Dlna.PlayTo
                 throw new InvalidOperationException("Unable to find service");
             }
 
-            await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, avCommands.BuildPost(command, service.ServiceType, String.Format("{0:hh}:{0:mm}:{0:ss}", value), "REL_TIME"))
+            await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, avCommands.BuildPost(command, service.ServiceType, string.Format("{0:hh}:{0:mm}:{0:ss}", value), "REL_TIME"))
                 .ConfigureAwait(false);
 
             RestartTimer(true);
@@ -364,7 +364,7 @@ namespace Emby.Dlna.PlayTo
         private string CreateDidlMeta(string value)
         {
             if (string.IsNullOrEmpty(value))
-                return String.Empty;
+                return string.Empty;
 
             return DescriptionXmlBuilder.Escape(value);
         }
@@ -739,7 +739,7 @@ namespace Emby.Dlna.PlayTo
 
             if (track == null)
             {
-                //If track is null, some vendors do this, use GetMediaInfo instead                    
+                //If track is null, some vendors do this, use GetMediaInfo instead
                 return new Tuple<bool, uBaseObject>(true, null);
             }
 
@@ -783,7 +783,7 @@ namespace Emby.Dlna.PlayTo
         {
             if (container == null)
             {
-                throw new ArgumentNullException("container");
+                throw new ArgumentNullException(nameof(container));
             }
 
             var url = container.GetValue(uPnpNamespaces.Res);
@@ -810,7 +810,7 @@ namespace Emby.Dlna.PlayTo
         {
             if (container == null)
             {
-                throw new ArgumentNullException("container");
+                throw new ArgumentNullException(nameof(container));
             }
 
             var resElement = container.Element(uPnpNamespaces.Res);
@@ -979,7 +979,7 @@ namespace Emby.Dlna.PlayTo
             if (modelDescription != null)
                 deviceProperties.ModelDescription = modelDescription.Value;
 
-            deviceProperties.BaseUrl = String.Format("http://{0}:{1}", url.Host, url.Port);
+            deviceProperties.BaseUrl = string.Format("http://{0}:{1}", url.Host, url.Port);
 
             var icon = document.Descendants(uPnpNamespaces.ud.GetName("icon")).FirstOrDefault();
 
@@ -1021,7 +1021,7 @@ namespace Emby.Dlna.PlayTo
         {
             if (element == null)
             {
-                throw new ArgumentNullException("element");
+                throw new ArgumentNullException(nameof(element));
             }
 
             var mimeType = element.GetDescendantValue(uPnpNamespaces.ud.GetName("mimetype"));
@@ -1173,7 +1173,7 @@ namespace Emby.Dlna.PlayTo
 
         public override string ToString()
         {
-            return String.Format("{0} - {1}", Properties.Name, Properties.BaseUrl);
+            return string.Format("{0} - {1}", Properties.Name, Properties.BaseUrl);
         }
     }
 }

+ 4 - 4
Emby.Dlna/PlayTo/PlayToController.cs

@@ -114,10 +114,10 @@ namespace Emby.Dlna.PlayTo
             info.Headers.TryGetValue("NTS", out nts);
 
             string usn;
-            if (!info.Headers.TryGetValue("USN", out usn)) usn = String.Empty;
+            if (!info.Headers.TryGetValue("USN", out usn)) usn = string.Empty;
 
             string nt;
-            if (!info.Headers.TryGetValue("NT", out nt)) nt = String.Empty;
+            if (!info.Headers.TryGetValue("NT", out nt)) nt = string.Empty;
 
             if (usn.IndexOf(_device.Properties.UUID, StringComparison.OrdinalIgnoreCase) != -1 &&
                 !_disposed)
@@ -829,7 +829,7 @@ namespace Emby.Dlna.PlayTo
             {
                 if (string.IsNullOrEmpty(url))
                 {
-                    throw new ArgumentNullException("url");
+                    throw new ArgumentNullException(nameof(url));
                 }
 
                 var parts = url.Split('/');
@@ -855,7 +855,7 @@ namespace Emby.Dlna.PlayTo
             {
                 if (string.IsNullOrEmpty(url))
                 {
-                    throw new ArgumentNullException("url");
+                    throw new ArgumentNullException(nameof(url));
                 }
 
                 var request = new StreamParams

+ 2 - 2
Emby.Dlna/PlayTo/PlaylistItemFactory.cs

@@ -1,4 +1,4 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Model.Dlna;
 using MediaBrowser.Model.Session;
 using System;
@@ -49,7 +49,7 @@ namespace Emby.Dlna.PlayTo
             return playlistItem;
         }
 
-        private bool IsSupported(DirectPlayProfile profile, Photo item)
+        private static bool IsSupported(DirectPlayProfile profile, Photo item)
         {
             var mediaPath = item.Path;
 

+ 15 - 15
Emby.Dlna/PlayTo/SsdpHttpClient.cs

@@ -1,4 +1,4 @@
-using MediaBrowser.Common.Net;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using Emby.Dlna.Common;
 using System;
@@ -25,10 +25,10 @@ namespace Emby.Dlna.PlayTo
             _config = config;
         }
 
-        public async Task<XDocument> SendCommandAsync(string baseUrl, 
-            DeviceService service, 
-            string command, 
-            string postData, 
+        public async Task<XDocument> SendCommandAsync(string baseUrl,
+            DeviceService service,
+            string command,
+            string postData,
             bool logRequest = true,
             string header = null)
         {
@@ -47,7 +47,7 @@ namespace Emby.Dlna.PlayTo
             }
         }
 
-        private string NormalizeServiceUrl(string baseUrl, string serviceUrl)
+        private static string NormalizeServiceUrl(string baseUrl, string serviceUrl)
         {
             // If it's already a complete url, don't stick anything onto the front of it
             if (serviceUrl.StartsWith("http", StringComparison.OrdinalIgnoreCase))
@@ -62,12 +62,12 @@ namespace Emby.Dlna.PlayTo
         }
 
         private readonly CultureInfo _usCulture = new CultureInfo("en-US");
-        
-        public async Task SubscribeAsync(string url, 
-            string ip, 
-            int port, 
-            string localIp, 
-            int eventport, 
+
+        public async Task SubscribeAsync(string url,
+            string ip,
+            int port,
+            string localIp,
+            int eventport,
             int timeOut = 3600)
         {
             var options = new HttpRequestOptions
@@ -121,9 +121,9 @@ namespace Emby.Dlna.PlayTo
             }
         }
 
-        private Task<HttpResponseInfo> PostSoapDataAsync(string url, 
-            string soapAction, 
-            string postData, 
+        private Task<HttpResponseInfo> PostSoapDataAsync(string url,
+            string soapAction,
+            string postData,
             string header,
             bool logRequest,
             CancellationToken cancellationToken)

+ 2 - 2
Emby.Dlna/PlayTo/TransportCommands.cs

@@ -80,7 +80,7 @@ namespace Emby.Dlna.PlayTo
         {
             if (container == null)
             {
-                throw new ArgumentNullException("container");
+                throw new ArgumentNullException(nameof(container));
             }
 
             return new Argument
@@ -171,7 +171,7 @@ namespace Emby.Dlna.PlayTo
             if (state != null)
             {
                 var sendValue = state.AllowedValues.FirstOrDefault(a => string.Equals(a, commandParameter, StringComparison.OrdinalIgnoreCase)) ??
-                                 state.AllowedValues.FirstOrDefault() ?? 
+                                 state.AllowedValues.FirstOrDefault() ??
                                  value;
 
                 return string.Format("<{0} xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"{1}\">{2}</{0}>", argument.Name, state.DataType ?? "string", sendValue);

+ 1 - 1
Emby.Dlna/PlayTo/UpnpContainer.cs

@@ -10,7 +10,7 @@ namespace Emby.Dlna.PlayTo
         {
             if (container == null)
             {
-                throw new ArgumentNullException("container");
+                throw new ArgumentNullException(nameof(container));
             }
 
             return new uBaseObject

+ 2 - 2
Emby.Dlna/PlayTo/uBaseObject.cs

@@ -2,7 +2,7 @@
 
 namespace Emby.Dlna.PlayTo
 {
-    public class uBaseObject 
+    public class uBaseObject
     {
         public string Id { get; set; }
 
@@ -26,7 +26,7 @@ namespace Emby.Dlna.PlayTo
         {
             if (obj == null)
             {
-                throw new ArgumentNullException("obj");
+                throw new ArgumentNullException(nameof(obj));
             }
 
             return string.Equals(Id, obj.Id);

+ 2 - 2
Emby.Dlna/PlayTo/uParser.cs

@@ -20,13 +20,13 @@ namespace Emby.Dlna.PlayTo
 
             if (document == null)
                 return list;
-            
+
             var item = (from result in document.Descendants("Result") select result).FirstOrDefault();
 
             if (item == null)
                 return list;
 
-            var uPnpResponse = XElement.Parse((String)item);
+            var uPnpResponse = XElement.Parse((string)item);
 
             var uObjects = from container in uPnpResponse.Elements(uPnpNamespaces.containers)
                            select new uParserObject { Element = container };

+ 1 - 1
Emby.Dlna/Profiles/SonyBravia2010Profile.cs

@@ -41,7 +41,7 @@ namespace Emby.Dlna.Profiles
 
             EnableSingleAlbumArtLimit = true;
             EnableAlbumArtInDidl = true;
-            
+
             TranscodingProfiles = new[]
             {
                 new TranscodingProfile

+ 8 - 11
Emby.Dlna/Properties/AssemblyInfo.cs

@@ -1,17 +1,16 @@
-using System.Resources;
+using System.Resources;
 using System.Reflection;
-using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 
-// General Information about an assembly is controlled through the following 
+// General Information about an assembly is controlled through the following
 // set of attributes. Change these attribute values to modify the information
 // associated with an assembly.
-[assembly: AssemblyTitle("Emby.Dlna2")]
+[assembly: AssemblyTitle("Emby.Dlna")]
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Emby.Dlna2")]
-[assembly: AssemblyCopyright("Copyright ©  2016")]
+[assembly: AssemblyCompany("Jellyfin Project")]
+[assembly: AssemblyProduct("Jellyfin: The Free Software Media System")]
+[assembly: AssemblyCopyright("Copyright ©  2019 Jellyfin Contributors. Code released under the GNU General Public License Version 2")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 [assembly: NeutralResourcesLanguage("en")]
@@ -19,12 +18,10 @@ using System.Runtime.InteropServices;
 // Version information for an assembly consists of the following four values:
 //
 //      Major Version
-//      Minor Version 
+//      Minor Version
 //      Build Number
 //      Revision
 //
-// You can specify all the values or you can default the Build and Revision Numbers 
+// You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]

+ 4 - 7
Emby.Dlna/Server/DescriptionXmlBuilder.cs

@@ -1,4 +1,4 @@
-using Emby.Dlna.Common;
+using Emby.Dlna.Common;
 using MediaBrowser.Model.Dlna;
 using MediaBrowser.Model.Extensions;
 using System;
@@ -24,12 +24,12 @@ namespace Emby.Dlna.Server
         {
             if (string.IsNullOrEmpty(serverUdn))
             {
-                throw new ArgumentNullException("serverUdn");
+                throw new ArgumentNullException(nameof(serverUdn));
             }
 
             if (string.IsNullOrEmpty(serverAddress))
             {
-                throw new ArgumentNullException("serverAddress");
+                throw new ArgumentNullException(nameof(serverAddress));
             }
 
             _profile = profile;
@@ -39,10 +39,7 @@ namespace Emby.Dlna.Server
             _serverId = serverId;
         }
 
-        private bool EnableAbsoluteUrls
-        {
-            get { return false; }
-        }
+        private static bool EnableAbsoluteUrls => false;
 
         public string GetXml()
         {

+ 1 - 1
Emby.Dlna/Service/BaseService.cs

@@ -14,7 +14,7 @@ namespace Emby.Dlna.Service
         protected BaseService(ILogger logger, IHttpClient httpClient)
         {
             Logger = logger;
-            HttpClient = httpClient;  
+            HttpClient = httpClient;
 
             EventManager = new EventManager(Logger, HttpClient);
         }

+ 1 - 1
Emby.Dlna/Service/ControlErrorHandler.cs

@@ -10,7 +10,7 @@ namespace Emby.Dlna.Service
     public class ControlErrorHandler
     {
         private const string NS_SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/";
-        
+
         public ControlResponse GetResponse(Exception ex)
         {
             var settings = new XmlWriterSettings

+ 3 - 3
Emby.Dlna/Service/ServiceXmlBuilder.cs

@@ -1,4 +1,4 @@
-using Emby.Dlna.Common;
+using Emby.Dlna.Common;
 using System.Collections.Generic;
 using System.Security;
 using System.Text;
@@ -28,7 +28,7 @@ namespace Emby.Dlna.Service
             return builder.ToString();
         }
 
-        private void AppendActionList(StringBuilder builder, IEnumerable<ServiceAction> actions)
+        private static void AppendActionList(StringBuilder builder, IEnumerable<ServiceAction> actions)
         {
             builder.Append("<actionList>");
 
@@ -59,7 +59,7 @@ namespace Emby.Dlna.Service
             builder.Append("</actionList>");
         }
 
-        private void AppendServiceStateTable(StringBuilder builder, IEnumerable<StateVariable> stateVariables)
+        private static void AppendServiceStateTable(StringBuilder builder, IEnumerable<StateVariable> stateVariables)
         {
             builder.Append("<serviceStateTable>");
 

+ 2 - 2
Emby.Dlna/Ssdp/DeviceDiscovery.cs

@@ -83,8 +83,8 @@ namespace Emby.Dlna.Ssdp
                 {
                     _deviceLocator = new SsdpDeviceLocator(_commsServer, _timerFactory);
 
-                    // (Optional) Set the filter so we only see notifications for devices we care about 
-                    // (can be any search target value i.e device type, uuid value etc - any value that appears in the 
+                    // (Optional) Set the filter so we only see notifications for devices we care about
+                    // (can be any search target value i.e device type, uuid value etc - any value that appears in the
                     // DiscoverdSsdpDevice.NotificationType property or that is used with the searchTarget parameter of the Search method).
                     //_DeviceLocator.NotificationFilter = "upnp:rootdevice";
 

+ 9 - 13
Emby.Drawing.Skia/Properties/AssemblyInfo.cs

@@ -1,25 +1,21 @@
-using System.Resources;
 using System.Reflection;
-using System.Runtime.CompilerServices;
+using System.Resources;
 using System.Runtime.InteropServices;
 
-// General Information about an assembly is controlled through the following 
+// General Information about an assembly is controlled through the following
 // set of attributes. Change these attribute values to modify the information
 // associated with an assembly.
 [assembly: AssemblyTitle("Emby.Drawing.Skia")]
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Emby.Drawing.Skia")]
-[assembly: AssemblyCopyright("Copyright ©  2017")]
+[assembly: AssemblyCompany("Jellyfin Project")]
+[assembly: AssemblyProduct("Jellyfin: The Free Software Media System")]
+[assembly: AssemblyCopyright("Copyright ©  2019 Jellyfin Contributors. Code released under the GNU General Public License Version 2")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 [assembly: NeutralResourcesLanguage("en")]
 
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]

+ 5 - 5
Emby.Drawing.Skia/SkiaEncoder.cs

@@ -197,7 +197,7 @@ namespace Emby.Drawing.Skia
 
         private static bool HasDiacritics(string text)
         {
-            return !String.Equals(text, text.RemoveDiacritics(), StringComparison.Ordinal);
+            return !string.Equals(text, text.RemoveDiacritics(), StringComparison.Ordinal);
         }
 
         private static bool RequiresSpecialCharacterHack(string path)
@@ -509,11 +509,11 @@ namespace Emby.Drawing.Skia
         {
             if (string.IsNullOrWhiteSpace(inputPath))
             {
-                throw new ArgumentNullException("inputPath");
+                throw new ArgumentNullException(nameof(inputPath));
             }
             if (string.IsNullOrWhiteSpace(inputPath))
             {
-                throw new ArgumentNullException("outputPath");
+                throw new ArgumentNullException(nameof(outputPath));
             }
 
             var skiaOutputFormat = GetImageFormat(selectedOutputFormat);
@@ -594,12 +594,12 @@ namespace Emby.Drawing.Skia
                         // If foreground layer present then draw
                         if (hasForegroundColor)
                         {
-                            if (!Double.TryParse(options.ForegroundLayer, out double opacity))
+                            if (!double.TryParse(options.ForegroundLayer, out double opacity))
                             {
                                 opacity = .4;
                             }
 
-                            canvas.DrawColor(new SKColor(0, 0, 0, (Byte)((1 - opacity) * 0xFF)), SKBlendMode.SrcOver);
+                            canvas.DrawColor(new SKColor(0, 0, 0, (byte)((1 - opacity) * 0xFF)), SKBlendMode.SrcOver);
                         }
 
                         if (hasIndicator)

+ 6 - 1
Emby.Drawing.Skia/StripCollageBuilder.cs

@@ -1,4 +1,4 @@
-using SkiaSharp;
+using SkiaSharp;
 using MediaBrowser.Common.Configuration;
 using System;
 using System.IO;
@@ -20,6 +20,11 @@ namespace Emby.Drawing.Skia
 
         public static SKEncodedImageFormat GetEncodedFormat(string outputPath)
         {
+            if (outputPath == null)
+            {
+                throw new ArgumentNullException(nameof(outputPath));
+            }
+
             var ext = Path.GetExtension(outputPath).ToLower();
 
             if (ext == ".jpg" || ext == ".jpeg")

+ 24 - 18
Emby.Drawing/Common/ImageHeader.cs

@@ -50,12 +50,13 @@ namespace Emby.Drawing.Common
         /// <exception cref="ArgumentException">The image was of an unrecognised format.</exception>
         public static ImageSize GetDimensions(string path, ILogger logger, IFileSystem fileSystem)
         {
-            var extension = Path.GetExtension(path);
-
-            if (string.IsNullOrEmpty(extension))
+            if (string.IsNullOrEmpty(path))
             {
-                throw new ArgumentException("ImageHeader doesn't support image file");
+                throw new ArgumentNullException(nameof(path));
             }
+
+            string extension = Path.GetExtension(path).ToLower();
+
             if (!SupportedExtensions.Contains(extension))
             {
                 throw new ArgumentException("ImageHeader doesn't support " + extension);
@@ -94,7 +95,7 @@ namespace Emby.Drawing.Common
                 }
             }
 
-            throw new ArgumentException(ErrorMessage, "binaryReader");
+            throw new ArgumentException(ErrorMessage, nameof(binaryReader));
         }
 
         /// <summary>
@@ -121,7 +122,7 @@ namespace Emby.Drawing.Common
         /// </summary>
         /// <param name="binaryReader">The binary reader.</param>
         /// <returns>System.Int16.</returns>
-        private static short ReadLittleEndianInt16(BinaryReader binaryReader)
+        private static short ReadLittleEndianInt16(this BinaryReader binaryReader)
         {
             var bytes = new byte[sizeof(short)];
 
@@ -137,7 +138,7 @@ namespace Emby.Drawing.Common
         /// </summary>
         /// <param name="binaryReader">The binary reader.</param>
         /// <returns>System.Int32.</returns>
-        private static int ReadLittleEndianInt32(BinaryReader binaryReader)
+        private static int ReadLittleEndianInt32(this BinaryReader binaryReader)
         {
             var bytes = new byte[sizeof(int)];
             for (int i = 0; i < sizeof(int); i += 1)
@@ -205,25 +206,30 @@ namespace Emby.Drawing.Common
         /// <exception cref="System.ArgumentException"></exception>
         private static ImageSize DecodeJfif(BinaryReader binaryReader)
         {
+            // A JPEG image consists of a sequence of segments,
+            // each beginning with a marker, each of which begins with a 0xFF byte
+            // followed by a byte indicating what kind of marker it is.
+            // Source: https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure
             while (binaryReader.ReadByte() == 0xff)
             {
                 byte marker = binaryReader.ReadByte();
-                short chunkLength = ReadLittleEndianInt16(binaryReader);
-                if (marker == 0xc0)
+                short chunkLength = binaryReader.ReadLittleEndianInt16();
+                // SOF0: Indicates that this is a baseline DCT-based JPEG,
+                // and specifies the width, height, number of components, and component subsampling
+                // SOF2: Indicates that this is a progressive DCT-based JPEG,
+                // and specifies the width, height, number of components, and component subsampling
+                if (marker == 0xc0 || marker == 0xc2)
                 {
-                    binaryReader.ReadByte();
-                    int height = ReadLittleEndianInt16(binaryReader);
-                    int width = ReadLittleEndianInt16(binaryReader);
-                    return new ImageSize
-                    {
-                        Width = width,
-                        Height = height
-                    };
+                    // https://help.accusoft.com/ImageGear/v18.2/Windows/ActiveX/IGAX-10-12.html
+                    binaryReader.ReadByte(); // We don't care about the first byte
+                    int height = binaryReader.ReadLittleEndianInt16();
+                    int width = binaryReader.ReadLittleEndianInt16();
+                    return new ImageSize(width, height);
                 }
 
                 if (chunkLength < 0)
                 {
-                    var uchunkLength = (ushort)chunkLength;
+                    ushort uchunkLength = (ushort)chunkLength;
                     binaryReader.ReadBytes(uchunkLength - 2);
                 }
                 else

+ 11 - 11
Emby.Drawing/ImageProcessor.cs

@@ -80,7 +80,7 @@ namespace Emby.Drawing
             {
                 if (value == null)
                 {
-                    throw new ArgumentNullException("value");
+                    throw new ArgumentNullException(nameof(value));
                 }
 
                 _imageEncoder = value;
@@ -103,7 +103,7 @@ namespace Emby.Drawing
                     "crw",
 
                     // Remove until supported
-                    //"nef", 
+                    //"nef",
                     "orf",
                     "pef",
                     "arw",
@@ -179,7 +179,7 @@ namespace Emby.Drawing
         {
             if (options == null)
             {
-                throw new ArgumentNullException("options");
+                throw new ArgumentNullException(nameof(options));
             }
 
             var originalImage = options.Image;
@@ -491,7 +491,7 @@ namespace Emby.Drawing
         {
             if (string.IsNullOrEmpty(path))
             {
-                throw new ArgumentNullException("path");
+                throw new ArgumentNullException(nameof(path));
             }
 
             try
@@ -691,12 +691,12 @@ namespace Emby.Drawing
         {
             if (string.IsNullOrEmpty(originalImagePath))
             {
-                throw new ArgumentNullException("originalImagePath");
+                throw new ArgumentNullException(nameof(originalImagePath));
             }
 
             if (item == null)
             {
-                throw new ArgumentNullException("item");
+                throw new ArgumentNullException(nameof(item));
             }
 
             var treatmentRequiresTransparency = false;
@@ -779,16 +779,16 @@ namespace Emby.Drawing
         {
             if (string.IsNullOrEmpty(path))
             {
-                throw new ArgumentNullException("path");
+                throw new ArgumentNullException(nameof(path));
             }
             if (string.IsNullOrEmpty(uniqueName))
             {
-                throw new ArgumentNullException("uniqueName");
+                throw new ArgumentNullException(nameof(uniqueName));
             }
 
             if (string.IsNullOrEmpty(fileExtension))
             {
-                throw new ArgumentNullException("fileExtension");
+                throw new ArgumentNullException(nameof(fileExtension));
             }
 
             var filename = uniqueName.GetMD5() + fileExtension;
@@ -811,11 +811,11 @@ namespace Emby.Drawing
         {
             if (string.IsNullOrEmpty(path))
             {
-                throw new ArgumentNullException("path");
+                throw new ArgumentNullException(nameof(path));
             }
             if (string.IsNullOrEmpty(filename))
             {
-                throw new ArgumentNullException("filename");
+                throw new ArgumentNullException(nameof(filename));
             }
 
             var prefix = filename.Substring(0, 1);

+ 9 - 9
Emby.Drawing/Properties/AssemblyInfo.cs

@@ -1,20 +1,20 @@
-using System.Reflection;
+using System.Reflection;
 using System.Runtime.InteropServices;
 
-// General Information about an assembly is controlled through the following 
+// General Information about an assembly is controlled through the following
 // set of attributes. Change these attribute values to modify the information
 // associated with an assembly.
 [assembly: AssemblyTitle("Emby.Drawing")]
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Emby.Drawing")]
-[assembly: AssemblyCopyright("Copyright ©  2015")]
+[assembly: AssemblyCompany("Jellyfin Project")]
+[assembly: AssemblyProduct("Jellyfin: The Free Software Media System")]
+[assembly: AssemblyCopyright("Copyright ©  2019 Jellyfin Contributors. Code released under the GNU General Public License Version 2")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
 // COM, set the ComVisible attribute to true on that type.
 [assembly: ComVisible(false)]
 
@@ -24,7 +24,7 @@ using System.Runtime.InteropServices;
 // Version information for an assembly consists of the following four values:
 //
 //      Major Version
-//      Minor Version 
+//      Minor Version
 //      Build Number
 //      Revision
-//
+//

+ 4 - 0
Emby.IsoMounting/IsoMounter/IsoMounter.csproj

@@ -1,5 +1,9 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
+  <ItemGroup>
+    <Compile Include="..\..\SharedVersion.cs" Link="SharedVersion.cs" />
+  </ItemGroup>
+
   <ItemGroup>
     <ProjectReference Include="..\..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
     <ProjectReference Include="..\..\MediaBrowser.Common\MediaBrowser.Common.csproj" />

+ 31 - 31
Emby.IsoMounting/IsoMounter/LinuxIsoManager.cs

@@ -44,13 +44,13 @@ namespace IsoMounter
             _logger.LogDebug(
                 "[{0}] System PATH is currently set to [{1}].",
                 Name,
-                EnvironmentInfo.GetEnvironmentVariable("PATH") ?? ""
+                Environment.GetEnvironmentVariable("PATH") ?? ""
             );
 
             _logger.LogDebug(
                 "[{0}] System path separator is [{1}].",
                 Name,
-                EnvironmentInfo.PathSeparator
+                Path.PathSeparator
             );
 
             _logger.LogDebug(
@@ -87,7 +87,7 @@ namespace IsoMounter
                 UmountCommand
             );
 
-            if (!String.IsNullOrEmpty(SudoCommand) && !String.IsNullOrEmpty(MountCommand) && !String.IsNullOrEmpty(UmountCommand)) {
+            if (!string.IsNullOrEmpty(SudoCommand) && !string.IsNullOrEmpty(MountCommand) && !string.IsNullOrEmpty(UmountCommand)) {
                 ExecutablesAvailable = true;
             } else {
                 ExecutablesAvailable = false;
@@ -118,25 +118,27 @@ namespace IsoMounter
         public bool CanMount(string path)
         {
 
-            if (EnvironmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Linux) {
-                _logger.LogInformation(
-                    "[{0}] Checking we can attempt to mount [{1}], Extension = [{2}], Operating System = [{3}], Executables Available = [{4}].",
-                    Name,
-                    path,
-                    Path.GetExtension(path),
-                    EnvironmentInfo.OperatingSystem,
-                    ExecutablesAvailable.ToString()
-                );
-
-                if (ExecutablesAvailable) {
-                    return string.Equals(Path.GetExtension(path), ".iso", StringComparison.OrdinalIgnoreCase);
-                } else {
-                    return false;
-                }
-            } else {
+            if (EnvironmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Linux)
+            {
                 return false;
             }
+            _logger.LogInformation(
+                "[{0}] Checking we can attempt to mount [{1}], Extension = [{2}], Operating System = [{3}], Executables Available = [{4}].",
+                Name,
+                path,
+                Path.GetExtension(path),
+                EnvironmentInfo.OperatingSystem,
+                ExecutablesAvailable.ToString()
+            );
 
+            if (ExecutablesAvailable)
+            {
+                return string.Equals(Path.GetExtension(path), ".iso", StringComparison.OrdinalIgnoreCase);
+            }
+            else
+            {
+                return false;
+            }
         }
 
         public Task Install(CancellationToken cancellationToken)
@@ -150,7 +152,7 @@ namespace IsoMounter
                 return Task.FromResult<IIsoMount>(mountedISO);
             }
             else {
-                throw new IOException(String.Format(
+                throw new IOException(string.Format(
                     "An error occurred trying to mount image [$0].",
                     isoPath
                 ));
@@ -211,18 +213,16 @@ namespace IsoMounter
         private string GetFullPathForExecutable(string name)
         {
 
-            foreach (string test in (EnvironmentInfo.GetEnvironmentVariable("PATH") ?? "").Split(EnvironmentInfo.PathSeparator)) {
-
+            foreach (string test in (Environment.GetEnvironmentVariable("PATH") ?? "").Split(Path.PathSeparator))
+            {
                 string path = test.Trim();
 
-                if (!String.IsNullOrEmpty(path) && FileSystem.FileExists(path = Path.Combine(path, name))) {
+                if (!string.IsNullOrEmpty(path) && FileSystem.FileExists(path = Path.Combine(path, name))) {
                     return FileSystem.GetFullPath(path);
                 }
-
             }
 
-            return String.Empty;
-
+            return string.Empty;
         }
 
         private uint GetUID()
@@ -315,9 +315,9 @@ namespace IsoMounter
                 );
 
             } else {
-                
+
                 throw new ArgumentNullException(nameof(isoPath));
-            
+
             }
 
             try
@@ -397,9 +397,9 @@ namespace IsoMounter
                 );
 
             } else {
-                
+
                 throw new ArgumentNullException(nameof(mount));
-            
+
             }
 
             if (GetUID() == 0) {
@@ -444,7 +444,7 @@ namespace IsoMounter
         }
 
         #endregion
-  
+
         #region Internal Methods
 
         internal void OnUnmount(LinuxMount mount)

+ 1 - 1
Emby.IsoMounting/IsoMounter/LinuxMount.cs

@@ -48,7 +48,7 @@ namespace IsoMounter
             if (disposed) {
                 return;
             }
-            
+
             if (disposing) {
 
                 //

+ 21 - 0
Emby.IsoMounting/IsoMounter/Properties/AssemblyInfo.cs

@@ -0,0 +1,21 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("IsoMounter")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Jellyfin Project")]
+[assembly: AssemblyProduct("Jellyfin: The Free Software Media System")]
+[assembly: AssemblyCopyright("Copyright ©  2019 Jellyfin Contributors. Code released under the GNU General Public License Version 2")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: NeutralResourcesLanguage("en")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]

+ 1 - 1
Emby.Naming/AudioBook/AudioBookInfo.cs

@@ -29,7 +29,7 @@ namespace Emby.Naming.AudioBook
         /// </summary>
         /// <value>The alternate versions.</value>
         public List<AudioBookFileInfo> AlternateVersions { get; set; }
-        
+
         public AudioBookInfo()
         {
             Files = new List<AudioBookFileInfo>();

+ 2 - 2
Emby.Naming/AudioBook/AudioBookResolver.cs

@@ -30,7 +30,7 @@ namespace Emby.Naming.AudioBook
         {
             if (string.IsNullOrEmpty(path))
             {
-                throw new ArgumentNullException("path");
+                throw new ArgumentNullException(nameof(path));
             }
             if (IsDirectory)
                 return null;
@@ -46,7 +46,7 @@ namespace Emby.Naming.AudioBook
 
             var parsingResult = new AudioBookFilePathParser(_options)
                 .Parse(path, IsDirectory);
-            
+
             return new AudioBookFileInfo
             {
                 Path = path,

+ 1 - 1
Emby.Naming/Common/NamingOptions.cs

@@ -282,7 +282,7 @@ namespace Emby.Naming.Common
                 new EpisodeExpression(@".*(\\|\/)(?<seriesname>((?![Ss]([0-9]+)[][ ._-]*[Ee]([0-9]+))[^\\\/])*)?[Ss](?<seasonnumber>[0-9]+)[][ ._-]*[Ee](?<epnumber>[0-9]+)([^\\/]*)$")
                 {
                     IsNamed = true
-                }, 
+                },
                 // <!-- foo.ep01, foo.EP_01 -->
                 new EpisodeExpression(@"[\._ -]()[Ee][Pp]_?([0-9]+)([^\\/]*)$"),
                 new EpisodeExpression("([0-9]{4})[\\.-]([0-9]{2})[\\.-]([0-9]{2})", true)

+ 13 - 2
Emby.Naming/Emby.Naming.csproj

@@ -4,9 +4,20 @@
     <TargetFramework>netstandard2.0</TargetFramework>
     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
   </PropertyGroup>
-  
+
+  <PropertyGroup>
+    <Authors>Jellyfin Contributors</Authors>
+    <PackageId>Jellyfin.Naming</PackageId>
+    <PackageLicenseUrl>https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt</PackageLicenseUrl>
+    <RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Compile Include="..\SharedVersion.cs" Link="SharedVersion.cs" />
+  </ItemGroup>
+
   <ItemGroup>
     <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj" />
   </ItemGroup>
-    
+
 </Project>

+ 21 - 0
Emby.Naming/Properties/AssemblyInfo.cs

@@ -0,0 +1,21 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Emby.Naming")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Jellyfin Project")]
+[assembly: AssemblyProduct("Jellyfin: The Free Software Media System")]
+[assembly: AssemblyCopyright("Copyright ©  2019 Jellyfin Contributors. Code released under the GNU General Public License Version 2")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: NeutralResourcesLanguage("en")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]

+ 2 - 2
Emby.Naming/Subtitles/SubtitleParser.cs

@@ -18,7 +18,7 @@ namespace Emby.Naming.Subtitles
         {
             if (string.IsNullOrEmpty(path))
             {
-                throw new ArgumentNullException("path");
+                throw new ArgumentNullException(nameof(path));
             }
 
             var extension = Path.GetExtension(path);
@@ -52,7 +52,7 @@ namespace Emby.Naming.Subtitles
         {
             if (string.IsNullOrEmpty(path))
             {
-                throw new ArgumentNullException("path");
+                throw new ArgumentNullException(nameof(path));
             }
 
             // Note: the tags need be be surrounded be either a space ( ), hyphen -, dot . or underscore _.

+ 2 - 2
Emby.Naming/TV/EpisodePathParser.cs

@@ -1,4 +1,4 @@
-using Emby.Naming.Common;
+using Emby.Naming.Common;
 using System;
 using System.Collections.Generic;
 using System.Globalization;
@@ -74,7 +74,7 @@ namespace Emby.Naming.TV
             return result ?? new EpisodePathParserResult();
         }
 
-        private EpisodePathParserResult Parse(string name, EpisodeExpression expression)
+        private static EpisodePathParserResult Parse(string name, EpisodeExpression expression)
         {
             var result = new EpisodePathParserResult();
 

+ 2 - 2
Emby.Naming/TV/EpisodeResolver.cs

@@ -19,7 +19,7 @@ namespace Emby.Naming.TV
         {
             if (string.IsNullOrEmpty(path))
             {
-                throw new ArgumentNullException("path");
+                throw new ArgumentNullException(nameof(path));
             }
 
             var isStub = false;
@@ -53,7 +53,7 @@ namespace Emby.Naming.TV
 
             var parsingResult = new EpisodePathParser(_options)
                 .Parse(path, IsDirectory, isNamed, isOptimistic, supportsAbsoluteNumbers, fillExtendedInfo);
-            
+
             return new EpisodeInfo
             {
                 Path = path,

+ 3 - 3
Emby.Naming/Video/CleanDateTimeParser.cs

@@ -1,4 +1,4 @@
-using System;
+using System;
 using Emby.Naming.Common;
 using System.Globalization;
 using System.IO;
@@ -38,7 +38,7 @@ namespace Emby.Naming.Video
             }
             catch (ArgumentException)
             {
-                
+
             }
 
             var result = _options.CleanDateTimeRegexes.Select(i => Clean(name, i))
@@ -63,7 +63,7 @@ namespace Emby.Naming.Video
                 result;
         }
 
-        private CleanDateTimeResult Clean(string name, Regex expression)
+        private static CleanDateTimeResult Clean(string name, Regex expression)
         {
             var result = new CleanDateTimeResult();
 

+ 2 - 2
Emby.Naming/Video/CleanStringParser.cs

@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Text.RegularExpressions;
 
 namespace Emby.Naming.Video
@@ -30,7 +30,7 @@ namespace Emby.Naming.Video
             };
         }
 
-        private CleanStringResult Clean(string name, Regex expression)
+        private static CleanStringResult Clean(string name, Regex expression)
         {
             var result = new CleanStringResult();
 

+ 1 - 1
Emby.Naming/Video/FlagParser.cs

@@ -22,7 +22,7 @@ namespace Emby.Naming.Video
         {
             if (string.IsNullOrEmpty(path))
             {
-                throw new ArgumentNullException("path");
+                throw new ArgumentNullException(nameof(path));
             }
 
             // Note: the tags need be be surrounded be either a space ( ), hyphen -, dot . or underscore _.

+ 2 - 2
Emby.Naming/Video/Format3DParser.cs

@@ -1,4 +1,4 @@
-using Emby.Naming.Common;
+using Emby.Naming.Common;
 using System;
 using System.Linq;
 
@@ -36,7 +36,7 @@ namespace Emby.Naming.Video
             return new Format3DResult();
         }
 
-        private Format3DResult Parse(string[] videoFlags, Format3DRule rule)
+        private static Format3DResult Parse(string[] videoFlags, Format3DRule rule)
         {
             var result = new Format3DResult();
 

+ 1 - 1
Emby.Naming/Video/StackResolver.cs

@@ -126,7 +126,7 @@ namespace Emby.Naming.Video
                                             }
                                             stack.Files.Add(file2.FullName);
                                         }
-                                        else 
+                                        else
                                         {
                                             // Sequel
                                             offset = 0;

+ 1 - 1
Emby.Naming/Video/StubResolver.cs

@@ -18,7 +18,7 @@ namespace Emby.Naming.Video
         {
             var result = new StubResult();
             var extension = Path.GetExtension(path) ?? string.Empty;
-            
+
             if (_options.StubFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase))
             {
                 result.IsStub = true;

+ 1 - 1
Emby.Naming/Video/VideoFileInfo.cs

@@ -55,7 +55,7 @@ namespace Emby.Naming.Video
         /// Gets or sets the type of the stub.
         /// </summary>
         /// <value>The type of the stub.</value>
-        public string StubType { get; set; }        
+        public string StubType { get; set; }
         /// <summary>
         /// Gets or sets the type.
         /// </summary>

+ 1 - 1
Emby.Naming/Video/VideoInfo.cs

@@ -32,7 +32,7 @@ namespace Emby.Naming.Video
         /// </summary>
         /// <value>The alternate versions.</value>
         public List<VideoFileInfo> AlternateVersions { get; set; }
-        
+
         public VideoInfo()
         {
             Files = new List<VideoFileInfo>();

+ 4 - 4
Emby.Naming/Video/VideoListResolver.cs

@@ -1,4 +1,4 @@
-using Emby.Naming.Common;
+using Emby.Naming.Common;
 using System;
 using System.Collections.Generic;
 using System.IO;
@@ -55,9 +55,9 @@ namespace Emby.Naming.Video
 
                 info.Year = info.Files.First().Year;
 
-                var extraBaseNames = new List<string> 
+                var extraBaseNames = new List<string>
                 {
-                    stack.Name, 
+                    stack.Name,
                     Path.GetFileNameWithoutExtension(stack.Files[0])
                 };
 
@@ -236,7 +236,7 @@ namespace Emby.Naming.Video
             if (testFilename.StartsWith(folderName, StringComparison.OrdinalIgnoreCase))
             {
                 testFilename = testFilename.Substring(folderName.Length).Trim();
-                return testFilename.StartsWith("-", StringComparison.OrdinalIgnoreCase)||Regex.Replace(testFilename, @"\[([^]]*)\]", "").Trim() == String.Empty;
+                return testFilename.StartsWith("-", StringComparison.OrdinalIgnoreCase) || Regex.Replace(testFilename, @"\[([^]]*)\]", "").Trim() == string.Empty;
             }
 
             return false;

+ 1 - 1
Emby.Naming/Video/VideoResolver.cs

@@ -45,7 +45,7 @@ namespace Emby.Naming.Video
         {
             if (string.IsNullOrEmpty(path))
             {
-                throw new ArgumentNullException("path");
+                throw new ArgumentNullException(nameof(path));
             }
 
             var isStub = false;

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

@@ -5,6 +5,10 @@
     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
   </PropertyGroup>
 
+  <ItemGroup>
+    <Compile Include="..\SharedVersion.cs" Link="SharedVersion.cs" />
+  </ItemGroup>
+
   <ItemGroup>
     <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
     <ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj" />

+ 6 - 21
Emby.Notifications/Properties/AssemblyInfo.cs

@@ -1,5 +1,5 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
+using System.Reflection;
+using System.Resources;
 using System.Runtime.InteropServices;
 
 // General Information about an assembly is controlled through the following
@@ -8,29 +8,14 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyTitle("Emby.Notifications")]
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Emby.Notifications")]
-[assembly: AssemblyCopyright("Copyright ©  2018")]
+[assembly: AssemblyCompany("Jellyfin Project")]
+[assembly: AssemblyProduct("Jellyfin: The Free Software Media System")]
+[assembly: AssemblyCopyright("Copyright ©  2019 Jellyfin Contributors. Code released under the GNU General Public License Version 2")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
+[assembly: NeutralResourcesLanguage("en")]
 
 // Setting ComVisible to false makes the types in this assembly not visible
 // to COM components.  If you need to access a type in this assembly from
 // COM, set the ComVisible attribute to true on that type.
 [assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("4d1d313b-60bb-4e11-acf9-cda6745266ef")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]

+ 9 - 22
Emby.Photos/Properties/AssemblyInfo.cs

@@ -1,34 +1,21 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
+using System.Reflection;
+using System.Resources;
 using System.Runtime.InteropServices;
 
-// General Information about an assembly is controlled through the following 
+// General Information about an assembly is controlled through the following
 // set of attributes. Change these attribute values to modify the information
 // associated with an assembly.
 [assembly: AssemblyTitle("Emby.Photos")]
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Emby.Photos")]
-[assembly: AssemblyCopyright("Copyright ©  2016")]
+[assembly: AssemblyCompany("Jellyfin Project")]
+[assembly: AssemblyProduct("Jellyfin: The Free Software Media System")]
+[assembly: AssemblyCopyright("Copyright ©  2019 Jellyfin Contributors. Code released under the GNU General Public License Version 2")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
+[assembly: NeutralResourcesLanguage("en")]
 
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
 // COM, set the ComVisible attribute to true on that type.
 [assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("89ab4548-770d-41fd-a891-8daff44f452c")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers 
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]

+ 4 - 4
Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs

@@ -202,7 +202,7 @@ namespace Emby.Server.Implementations.Activity
             return name;
         }
 
-        private string GetPlaybackNotificationType(string mediaType)
+        private static string GetPlaybackNotificationType(string mediaType)
         {
             if (string.Equals(mediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase))
             {
@@ -220,7 +220,7 @@ namespace Emby.Server.Implementations.Activity
             return null;
         }
 
-        private string GetPlaybackStoppedNotificationType(string mediaType)
+        private static string GetPlaybackStoppedNotificationType(string mediaType)
         {
             if (string.Equals(mediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase))
             {
@@ -577,8 +577,8 @@ namespace Emby.Server.Implementations.Activity
         /// <param name="description">The name of this item (singular form)</param>
         private static string CreateValueString(int value, string description)
         {
-            return String.Format("{0:#,##0} {1}",
-                value, value == 1 ? description : String.Format("{0}s", description));
+            return string.Format("{0:#,##0} {1}",
+                value, value == 1 ? description : string.Format("{0}s", description));
         }
     }
 }

+ 4 - 4
Emby.Server.Implementations/Activity/ActivityRepository.cs

@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections.Generic;
 using System.Globalization;
 using System.IO;
@@ -83,7 +83,7 @@ namespace Emby.Server.Implementations.Activity
         {
             if (entry == null)
             {
-                throw new ArgumentNullException("entry");
+                throw new ArgumentNullException(nameof(entry));
             }
 
             using (WriteLock.Write())
@@ -122,7 +122,7 @@ namespace Emby.Server.Implementations.Activity
         {
             if (entry == null)
             {
-                throw new ArgumentNullException("entry");
+                throw new ArgumentNullException(nameof(entry));
             }
 
             using (WriteLock.Write())
@@ -251,7 +251,7 @@ namespace Emby.Server.Implementations.Activity
             }
         }
 
-        private ActivityLogEntry GetEntry(IReadOnlyList<IResultSetValue> reader)
+        private static ActivityLogEntry GetEntry(IReadOnlyList<IResultSetValue> reader)
         {
             var index = 0;
 

+ 10 - 61
Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs

@@ -55,61 +55,31 @@ namespace Emby.Server.Implementations.AppBase
         }
 
         private const string _virtualDataPath = "%AppDataPath%";
-        public string VirtualDataPath
-        {
-            get
-            {
-                return _virtualDataPath;
-            }
-        }
+        public string VirtualDataPath => _virtualDataPath;
 
         /// <summary>
         /// Gets the image cache path.
         /// </summary>
         /// <value>The image cache path.</value>
-        public string ImageCachePath
-        {
-            get
-            {
-                return Path.Combine(CachePath, "images");
-            }
-        }
+        public string ImageCachePath => Path.Combine(CachePath, "images");
 
         /// <summary>
         /// Gets the path to the plugin directory
         /// </summary>
         /// <value>The plugins path.</value>
-        public string PluginsPath
-        {
-            get
-            {
-                return Path.Combine(ProgramDataPath, "plugins");
-            }
-        }
+        public string PluginsPath => Path.Combine(ProgramDataPath, "plugins");
 
         /// <summary>
         /// Gets the path to the plugin configurations directory
         /// </summary>
         /// <value>The plugin configurations path.</value>
-        public string PluginConfigurationsPath
-        {
-            get
-            {
-                return Path.Combine(PluginsPath, "configurations");
-            }
-        }
+        public string PluginConfigurationsPath => Path.Combine(PluginsPath, "configurations");
 
         /// <summary>
         /// Gets the path to where temporary update files will be stored
         /// </summary>
         /// <value>The plugin configurations path.</value>
-        public string TempUpdatePath
-        {
-            get
-            {
-                return Path.Combine(ProgramDataPath, "updates");
-            }
-        }
+        public string TempUpdatePath => Path.Combine(ProgramDataPath, "updates");
 
         /// <summary>
         /// The _log directory
@@ -133,10 +103,7 @@ namespace Emby.Server.Implementations.AppBase
 
                 return _logDirectoryPath;
             }
-            set
-            {
-                _logDirectoryPath = value;
-            }
+            set => _logDirectoryPath = value;
         }
 
         /// <summary>
@@ -161,23 +128,14 @@ namespace Emby.Server.Implementations.AppBase
 
                 return _configurationDirectoryPath;
             }
-            set
-            {
-                _configurationDirectoryPath = value;
-            }
+            set => _configurationDirectoryPath = value;
         }
 
         /// <summary>
         /// Gets the path to the system configuration file
         /// </summary>
         /// <value>The system configuration file path.</value>
-        public string SystemConfigurationFilePath
-        {
-            get
-            {
-                return Path.Combine(ConfigurationDirectoryPath, "system.xml");
-            }
-        }
+        public string SystemConfigurationFilePath => Path.Combine(ConfigurationDirectoryPath, "system.xml");
 
         /// <summary>
         /// The _cache directory
@@ -200,22 +158,13 @@ namespace Emby.Server.Implementations.AppBase
 
                 return _cachePath;
             }
-            set
-            {
-                _cachePath = value;
-            }
+            set => _cachePath = value;
         }
 
         /// <summary>
         /// Gets the folder path to the temp directory within the cache folder
         /// </summary>
         /// <value>The temp directory.</value>
-        public string TempDirectory
-        {
-            get
-            {
-                return Path.Combine(CachePath, "temp");
-            }
-        }
+        public string TempDirectory => Path.Combine(CachePath, "temp");
     }
 }

+ 3 - 2
Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs

@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.IO;
@@ -99,6 +99,7 @@ namespace Emby.Server.Implementations.AppBase
         /// <param name="applicationPaths">The application paths.</param>
         /// <param name="loggerFactory">The logger factory.</param>
         /// <param name="xmlSerializer">The XML serializer.</param>
+        /// <param name="fileSystem">The file system</param>
         protected BaseConfigurationManager(IApplicationPaths applicationPaths, ILoggerFactory loggerFactory, IXmlSerializer xmlSerializer, IFileSystem fileSystem)
         {
             CommonApplicationPaths = applicationPaths;
@@ -155,7 +156,7 @@ namespace Emby.Server.Implementations.AppBase
         {
             if (newConfiguration == null)
             {
-                throw new ArgumentNullException("newConfiguration");
+                throw new ArgumentNullException(nameof(newConfiguration));
             }
 
             ValidateCachePath(newConfiguration);

+ 2 - 1
Emby.Server.Implementations/AppBase/ConfigurationHelper.cs

@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.IO;
 using System.Linq;
 using MediaBrowser.Model.IO;
@@ -18,6 +18,7 @@ namespace Emby.Server.Implementations.AppBase
         /// <param name="type">The type.</param>
         /// <param name="path">The path.</param>
         /// <param name="xmlSerializer">The XML serializer.</param>
+        /// <param name="fileSystem">The file system</param>
         /// <returns>System.Object.</returns>
         public static object GetXmlConfiguration(Type type, string path, IXmlSerializer xmlSerializer, IFileSystem fileSystem)
         {

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff