2
0
Эх сурвалжийг харах

Merge branch 'master' into dlnawarnings

Claus Vium 5 жил өмнө
parent
commit
241e351a61
100 өөрчлөгдсөн 310 нэмэгдсэн , 535 устгасан
  1. 1 1
      Dockerfile
  2. 1 1
      Dockerfile.arm
  3. 1 1
      Dockerfile.arm64
  4. 1 1
      DvdLib/DvdLib.csproj
  5. 2 2
      DvdLib/Ifo/Dvd.cs
  6. 1 1
      Emby.Dlna/Didl/Filter.cs
  7. 1 1
      Emby.Dlna/DlnaManager.cs
  8. 0 1
      Emby.Dlna/PlayTo/PlayToController.cs
  9. 0 1
      Emby.Dlna/PlayTo/PlaylistItemFactory.cs
  10. 0 1
      Emby.Dlna/Server/DescriptionXmlBuilder.cs
  11. 1 2
      Emby.Drawing/ImageProcessor.cs
  12. 1 4
      Emby.Naming/Emby.Naming.csproj
  13. 0 1
      Emby.Notifications/CoreNotificationTypes.cs
  14. 0 5
      Emby.Photos/Emby.Photos.csproj
  15. 0 1
      Emby.Server.Implementations/Activity/ActivityManager.cs
  16. 2 25
      Emby.Server.Implementations/ApplicationHost.cs
  17. 14 18
      Emby.Server.Implementations/Channels/ChannelPostScanTask.cs
  18. 17 7
      Emby.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs
  19. 0 1
      Emby.Server.Implementations/Collections/CollectionImageProvider.cs
  20. 0 1
      Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs
  21. 1 1
      Emby.Server.Implementations/Devices/DeviceManager.cs
  22. 4 4
      Emby.Server.Implementations/Emby.Server.Implementations.csproj
  23. 0 128
      Emby.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs
  24. 0 1
      Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
  25. 0 1
      Emby.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs
  26. 2 2
      Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs
  27. 7 7
      Emby.Server.Implementations/HttpServer/FileWriter.cs
  28. 4 4
      Emby.Server.Implementations/HttpServer/HttpResultFactory.cs
  29. 0 81
      Emby.Server.Implementations/IO/ManagedFileSystem.cs
  30. 10 12
      Emby.Server.Implementations/Library/LibraryManager.cs
  31. 4 3
      Emby.Server.Implementations/Library/UserManager.cs
  32. 3 5
      Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs
  33. 5 5
      Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
  34. 1 6
      Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
  35. 2 2
      Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs
  36. 0 1
      Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
  37. 2 2
      Emby.Server.Implementations/LiveTv/TunerHosts/SharedHttpStream.cs
  38. 4 4
      Emby.Server.Implementations/Localization/Core/ar.json
  39. 95 0
      Emby.Server.Implementations/Localization/Core/fil.json
  40. 1 0
      Emby.Server.Implementations/Localization/Core/gl.json
  41. 1 1
      Emby.Server.Implementations/Localization/Core/sl-SI.json
  42. 1 1
      Emby.Server.Implementations/Localization/Core/zh-CN.json
  43. 0 1
      Emby.Server.Implementations/Net/SocketFactory.cs
  44. 0 2
      Emby.Server.Implementations/Net/WebSocketConnectEventArgs.cs
  45. 0 1
      Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs
  46. 2 3
      Emby.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs
  47. 2 2
      Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
  48. 4 6
      Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs
  49. 2 2
      Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteTranscodeFileTask.cs
  50. 5 6
      Emby.Server.Implementations/ScheduledTasks/Tasks/PeopleValidationTask.cs
  51. 1 1
      Emby.Server.Implementations/ScheduledTasks/Tasks/PluginUpdateTask.cs
  52. 1 1
      Emby.Server.Implementations/ScheduledTasks/Tasks/RefreshMediaLibraryTask.cs
  53. 9 23
      Emby.Server.Implementations/Serialization/JsonSerializer.cs
  54. 11 7
      Emby.Server.Implementations/Session/SessionManager.cs
  55. 0 6
      Emby.Server.Implementations/SocketSharp/HttpPostedFile.cs
  56. 0 2
      Emby.Server.Implementations/SocketSharp/WebSocketSharpListener.cs
  57. 0 2
      Emby.Server.Implementations/WebSockets/WebSocketManager.cs
  58. 2 2
      Jellyfin.Api/Jellyfin.Api.csproj
  59. 3 3
      Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj
  60. 0 1
      Jellyfin.Drawing.Skia/SkiaCodecException.cs
  61. 4 7
      Jellyfin.Server/Jellyfin.Server.csproj
  62. 12 15
      Jellyfin.Server/Program.cs
  63. 1 1
      Jellyfin.Server/Resources/Configuration/logging.json
  64. 0 1
      Jellyfin.Server/Startup.cs
  65. 0 1
      MediaBrowser.Api/ApiEntryPoint.cs
  66. 0 1
      MediaBrowser.Api/EnvironmentService.cs
  67. 1 1
      MediaBrowser.Api/Images/ImageService.cs
  68. 2 4
      MediaBrowser.Api/Images/RemoteImageService.cs
  69. 1 1
      MediaBrowser.Api/ItemLookupService.cs
  70. 0 1
      MediaBrowser.Api/ItemUpdateService.cs
  71. 0 4
      MediaBrowser.Api/Library/LibraryService.cs
  72. 1 1
      MediaBrowser.Api/Playback/BaseStreamingService.cs
  73. 4 4
      MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
  74. 4 5
      MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
  75. 2 2
      MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
  76. 0 2
      MediaBrowser.Api/Playback/MediaInfoService.cs
  77. 1 1
      MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
  78. 5 7
      MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs
  79. 0 1
      MediaBrowser.Api/Playback/StreamRequest.cs
  80. 1 1
      MediaBrowser.Api/Playback/StreamState.cs
  81. 2 2
      MediaBrowser.Api/Session/SessionsService.cs
  82. 0 1
      MediaBrowser.Api/System/ActivityLogWebSocketListener.cs
  83. 2 2
      MediaBrowser.Api/System/SystemService.cs
  84. 0 1
      MediaBrowser.Api/UserLibrary/GenresService.cs
  85. 0 1
      MediaBrowser.Api/UserLibrary/PersonsService.cs
  86. 0 1
      MediaBrowser.Api/UserLibrary/YearsService.cs
  87. 2 2
      MediaBrowser.Api/UserService.cs
  88. 1 1
      MediaBrowser.Common/MediaBrowser.Common.csproj
  89. 1 8
      MediaBrowser.Controller/Entities/UserRootFolder.cs
  90. 0 1
      MediaBrowser.Controller/Entities/Video.cs
  91. 1 1
      MediaBrowser.Controller/MediaBrowser.Controller.csproj
  92. 14 14
      MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
  93. 1 1
      MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs
  94. 0 1
      MediaBrowser.Controller/MediaEncoding/EncodingJobOptions.cs
  95. 10 2
      MediaBrowser.Controller/MediaEncoding/JobLogger.cs
  96. 1 3
      MediaBrowser.Controller/Net/IHttpResultFactory.cs
  97. 0 1
      MediaBrowser.Controller/Net/IWebSocketConnection.cs
  98. 2 4
      MediaBrowser.Controller/Net/StaticResultOptions.cs
  99. 0 1
      MediaBrowser.Controller/Persistence/MediaAttachmentQuery.cs
  100. 2 8
      MediaBrowser.Controller/Session/SessionInfo.cs

+ 1 - 1
Dockerfile

@@ -31,7 +31,7 @@ COPY --from=web-builder /dist /jellyfin/jellyfin-web
 #   mesa-va-drivers: needed for VAAPI
 RUN apt-get update \
  && apt-get install --no-install-recommends --no-install-suggests -y \
-   libfontconfig1 libgomp1 libva-drm2 mesa-va-drivers openssl \
+   libfontconfig1 libgomp1 libva-drm2 mesa-va-drivers openssl ca-certificates \
  && apt-get clean autoclean \
  && apt-get autoremove \
  && rm -rf /var/lib/apt/lists/* \

+ 1 - 1
Dockerfile.arm

@@ -24,7 +24,7 @@ RUN dotnet publish Jellyfin.Server --configuration Release --output="/jellyfin"
 FROM debian:buster-slim
 RUN apt-get update \
  && apt-get install --no-install-recommends --no-install-suggests -y ffmpeg \
- libssl-dev \
+ libssl-dev ca-certificates \
  && rm -rf /var/lib/apt/lists/* \
  && mkdir -p /cache /config /media \
  && chmod 777 /cache /config /media

+ 1 - 1
Dockerfile.arm64

@@ -24,7 +24,7 @@ RUN dotnet publish Jellyfin.Server --configuration Release --output="/jellyfin"
 FROM debian:buster-slim
 RUN apt-get update \
  && apt-get install --no-install-recommends --no-install-suggests -y ffmpeg \
- libssl-dev \
+ libssl-dev ca-certificates \
  && rm -rf /var/lib/apt/lists/* \
  && mkdir -p /cache /config /media \
  && chmod 777 /cache /config /media

+ 1 - 1
DvdLib/DvdLib.csproj

@@ -9,7 +9,7 @@
   </ItemGroup>
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFramework>netstandard2.1</TargetFramework>
     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
     <GenerateDocumentationFile>true</GenerateDocumentationFile>
   </PropertyGroup>

+ 2 - 2
DvdLib/Ifo/Dvd.cs

@@ -42,7 +42,7 @@ namespace DvdLib.Ifo
             }
             else
             {
-                using (var vmgFs = _fileSystem.GetFileStream(vmgPath.FullName, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.Read))
+                using (var vmgFs = new FileStream(vmgPath.FullName, FileMode.Open, FileAccess.Read, FileShare.Read))
                 {
                     using (var vmgRead = new BigEndianBinaryReader(vmgFs))
                     {
@@ -95,7 +95,7 @@ namespace DvdLib.Ifo
         {
             VTSPaths[vtsNum] = vtsPath;
 
-            using (var vtsFs = _fileSystem.GetFileStream(vtsPath, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.Read))
+            using (var vtsFs = new FileStream(vtsPath, FileMode.Open, FileAccess.Read, FileShare.Read))
             {
                 using (var vtsRead = new BigEndianBinaryReader(vtsFs))
                 {

+ 1 - 1
Emby.Dlna/Didl/Filter.cs

@@ -19,7 +19,7 @@ namespace Emby.Dlna.Didl
 
         public Filter(string filter)
         {
-            _all = StringHelper.EqualsIgnoreCase(filter, "*");
+            _all = string.Equals(filter, "*", StringComparison.OrdinalIgnoreCase);
 
             _fields = (filter ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
         }

+ 1 - 1
Emby.Dlna/DlnaManager.cs

@@ -388,7 +388,7 @@ namespace Emby.Dlna
                     {
                         Directory.CreateDirectory(systemProfilesPath);
 
-                        using (var fileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
+                        using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))
                         {
                             await stream.CopyToAsync(fileStream);
                         }

+ 0 - 1
Emby.Dlna/PlayTo/PlayToController.cs

@@ -9,7 +9,6 @@ using System.Threading;
 using System.Threading.Tasks;
 using Emby.Dlna.Didl;
 using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Extensions;
 using MediaBrowser.Controller.Dlna;
 using MediaBrowser.Controller.Drawing;
 using MediaBrowser.Controller.Entities;

+ 0 - 1
Emby.Dlna/PlayTo/PlaylistItemFactory.cs

@@ -1,7 +1,6 @@
 #pragma warning disable CS1591
 #pragma warning disable SA1600
 
-using System.Globalization;
 using System.IO;
 using System.Linq;
 using MediaBrowser.Controller.Entities;

+ 0 - 1
Emby.Dlna/Server/DescriptionXmlBuilder.cs

@@ -8,7 +8,6 @@ using System.Linq;
 using System.Text;
 using Emby.Dlna.Common;
 using MediaBrowser.Model.Dlna;
-using MediaBrowser.Model.Extensions;
 
 namespace Emby.Dlna.Server
 {

+ 1 - 2
Emby.Drawing/ImageProcessor.cs

@@ -14,7 +14,6 @@ using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Drawing;
 using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Extensions;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Net;
 using Microsoft.Extensions.Logging;
@@ -129,7 +128,7 @@ namespace Emby.Drawing
         {
             var file = await ProcessImage(options).ConfigureAwait(false);
 
-            using (var fileStream = _fileSystem.GetFileStream(file.Item1, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.Read, true))
+            using (var fileStream = new FileStream(file.Item1, FileMode.Open, FileAccess.Read, FileShare.Read, IODefaults.FileStreamBufferSize, true))
             {
                 await fileStream.CopyToAsync(toStream).ConfigureAwait(false);
             }

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

@@ -4,10 +4,7 @@
     <TargetFramework>netstandard2.1</TargetFramework>
     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
     <GenerateDocumentationFile>true</GenerateDocumentationFile>
-  </PropertyGroup>
-
-  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
-    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <TreatWarningsAsErrors Condition=" '$(Configuration)' == 'Release' " >true</TreatWarningsAsErrors>
   </PropertyGroup>
 
   <ItemGroup>

+ 0 - 1
Emby.Notifications/CoreNotificationTypes.cs

@@ -1,7 +1,6 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using MediaBrowser.Controller;
 using MediaBrowser.Controller.Notifications;
 using MediaBrowser.Model.Globalization;
 using MediaBrowser.Model.Notifications;

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

@@ -1,9 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
-    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-  </PropertyGroup>
-
   <ItemGroup>
     <ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj" />
     <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj" />

+ 0 - 1
Emby.Server.Implementations/Activity/ActivityManager.cs

@@ -2,7 +2,6 @@
 #pragma warning disable SA1600
 
 using System;
-using System.Linq;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Activity;
 using MediaBrowser.Model.Events;

+ 2 - 25
Emby.Server.Implementations/ApplicationHost.cs

@@ -599,7 +599,7 @@ namespace Emby.Server.Implementations
                 HttpsPort = ServerConfiguration.DefaultHttpsPort;
             }
 
-            JsonSerializer = new JsonSerializer(FileSystemManager);
+            JsonSerializer = new JsonSerializer();
 
             if (Plugins != null)
             {
@@ -1007,7 +1007,7 @@ namespace Emby.Server.Implementations
         {
             string dir = Path.Combine(ApplicationPaths.PluginsPath, args.Argument.name);
             var types = Directory.EnumerateFiles(dir, "*.dll", SearchOption.AllDirectories)
-                        .Select(x => Assembly.LoadFrom(x))
+                        .Select(Assembly.LoadFrom)
                         .SelectMany(x => x.ExportedTypes)
                         .Where(x => x.IsClass && !x.IsAbstract && !x.IsInterface && !x.IsGenericType)
                         .ToArray();
@@ -1707,29 +1707,6 @@ namespace Emby.Server.Implementations
             _plugins = list.ToArray();
         }
 
-        /// <summary>
-        /// This returns localhost in the case of no external dns, and the hostname if the
-        /// dns is prefixed with a valid Uri prefix.
-        /// </summary>
-        /// <param name="externalDns">The external dns prefix to get the hostname of.</param>
-        /// <returns>The hostname in <paramref name="externalDns"/>.</returns>
-        private static string GetHostnameFromExternalDns(string externalDns)
-        {
-            if (string.IsNullOrEmpty(externalDns))
-            {
-                return "localhost";
-            }
-
-            try
-            {
-                return new Uri(externalDns).Host;
-            }
-            catch
-            {
-                return externalDns;
-            }
-        }
-
         public virtual void LaunchUrl(string url)
         {
             if (!CanLaunchWebBrowser)

+ 14 - 18
Emby.Server.Implementations/Channels/ChannelPostScanTask.cs

@@ -35,14 +35,6 @@ namespace Emby.Server.Implementations.Channels
             return Task.CompletedTask;
         }
 
-        public static string GetUserDistinctValue(User user)
-        {
-            var channels = user.Policy.EnabledChannels
-                .OrderBy(i => i);
-
-            return string.Join("|", channels);
-        }
-
         private void CleanDatabase(CancellationToken cancellationToken)
         {
             var installedChannelIds = ((ChannelManager)_channelManager).GetInstalledChannelIds();
@@ -75,19 +67,23 @@ namespace Emby.Server.Implementations.Channels
             {
                 cancellationToken.ThrowIfCancellationRequested();
 
-                _libraryManager.DeleteItem(item, new DeleteOptions
-                {
-                    DeleteFileLocation = false
-
-                }, false);
+                _libraryManager.DeleteItem(
+                    item,
+                    new DeleteOptions
+                    {
+                        DeleteFileLocation = false
+                    },
+                    false);
             }
 
             // Finally, delete the channel itself
-            _libraryManager.DeleteItem(channel, new DeleteOptions
-            {
-                DeleteFileLocation = false
-
-            }, false);
+            _libraryManager.DeleteItem(
+                channel,
+                new DeleteOptions
+                {
+                    DeleteFileLocation = false
+                },
+                false);
         }
     }
 }

+ 17 - 7
Emby.Server.Implementations/Channels/RefreshChannelsScheduledTask.cs

@@ -28,18 +28,28 @@ namespace Emby.Server.Implementations.Channels
             _libraryManager = libraryManager;
         }
 
+        /// <inheritdoc />
         public string Name => "Refresh Channels";
 
+        /// <inheritdoc />
         public string Description => "Refreshes internet channel information.";
 
+        /// <inheritdoc />
         public string Category => "Internet Channels";
 
+        /// <inheritdoc />
         public bool IsHidden => ((ChannelManager)_channelManager).Channels.Length == 0;
 
+        /// <inheritdoc />
         public bool IsEnabled => true;
 
+        /// <inheritdoc />
         public bool IsLogged => true;
 
+        /// <inheritdoc />
+        public string Key => "RefreshInternetChannels";
+
+        /// <inheritdoc />
         public async Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
         {
             var manager = (ChannelManager)_channelManager;
@@ -50,18 +60,18 @@ namespace Emby.Server.Implementations.Channels
                     .ConfigureAwait(false);
         }
 
-        /// <summary>
-        /// Creates the triggers that define when the task will run
-        /// </summary>
+        /// <inheritdoc />
         public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
         {
-            return new[] {
+            return new[]
+            {
 
                 // Every so often
-                new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(24).Ticks}
+                new TaskTriggerInfo
+                {
+                    Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(24).Ticks
+                }
             };
         }
-
-        public string Key => "RefreshInternetChannels";
     }
 }

+ 0 - 1
Emby.Server.Implementations/Collections/CollectionImageProvider.cs

@@ -1,7 +1,6 @@
 #pragma warning disable CS1591
 #pragma warning disable SA1600
 
-using System;
 using System.Collections.Generic;
 using System.Linq;
 using Emby.Server.Implementations.Images;

+ 0 - 1
Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs

@@ -1,5 +1,4 @@
 using System;
-using System.Collections.Generic;
 using System.Globalization;
 using System.IO;
 using Emby.Server.Implementations.AppBase;

+ 1 - 1
Emby.Server.Implementations/Devices/DeviceManager.cs

@@ -243,7 +243,7 @@ namespace Emby.Server.Implementations.Devices
 
             try
             {
-                using (var fs = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
+                using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))
                 {
                     await stream.CopyToAsync(fs).ConfigureAwait(false);
                 }

+ 4 - 4
Emby.Server.Implementations/Emby.Server.Implementations.csproj

@@ -29,11 +29,11 @@
     <PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="2.2.0" />
     <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" />
     <PackageReference Include="Microsoft.AspNetCore.WebSockets" Version="2.2.1" />
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
-    <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.0" />
-    <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.1" />
+    <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.1" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.1" />
     <PackageReference Include="Mono.Nat" Version="2.0.0" />
-    <PackageReference Include="ServiceStack.Text.Core" Version="5.7.0" />
+    <PackageReference Include="ServiceStack.Text.Core" Version="5.8.0" />
     <PackageReference Include="sharpcompress" Version="0.24.0" />
     <PackageReference Include="SQLitePCL.pretty.netstandard" Version="2.1.0" />
     <PackageReference Include="System.Interactive.Async" Version="4.0.0" />

+ 0 - 128
Emby.Server.Implementations/EntryPoints/AutomaticRestartEntryPoint.cs

@@ -1,128 +0,0 @@
-#pragma warning disable CS1591
-#pragma warning disable SA1600
-
-using System;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Controller.LiveTv;
-using MediaBrowser.Controller.Plugins;
-using MediaBrowser.Controller.Session;
-using MediaBrowser.Model.LiveTv;
-using MediaBrowser.Model.Tasks;
-using Microsoft.Extensions.Logging;
-
-namespace Emby.Server.Implementations.EntryPoints
-{
-    public class AutomaticRestartEntryPoint : IServerEntryPoint
-    {
-        private readonly IServerApplicationHost _appHost;
-        private readonly ILogger _logger;
-        private readonly ITaskManager _iTaskManager;
-        private readonly ISessionManager _sessionManager;
-        private readonly IServerConfigurationManager _config;
-        private readonly ILiveTvManager _liveTvManager;
-
-        private Timer _timer;
-
-        public AutomaticRestartEntryPoint(IServerApplicationHost appHost, ILogger logger, ITaskManager iTaskManager, ISessionManager sessionManager, IServerConfigurationManager config, ILiveTvManager liveTvManager)
-        {
-            _appHost = appHost;
-            _logger = logger;
-            _iTaskManager = iTaskManager;
-            _sessionManager = sessionManager;
-            _config = config;
-            _liveTvManager = liveTvManager;
-        }
-
-        public Task RunAsync()
-        {
-            if (_appHost.CanSelfRestart)
-            {
-                _appHost.HasPendingRestartChanged += _appHost_HasPendingRestartChanged;
-            }
-
-            return Task.CompletedTask;
-        }
-
-        void _appHost_HasPendingRestartChanged(object sender, EventArgs e)
-        {
-            DisposeTimer();
-
-            if (_appHost.HasPendingRestart)
-            {
-                _timer = new Timer(TimerCallback, null, TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(15));
-            }
-        }
-
-        private async void TimerCallback(object state)
-        {
-            if (_config.Configuration.EnableAutomaticRestart)
-            {
-                var isIdle = await IsIdle().ConfigureAwait(false);
-
-                if (isIdle)
-                {
-                    DisposeTimer();
-
-                    _logger.LogInformation("Automatically restarting the system because it is idle and a restart is required.");
-
-                    try
-                    {
-                        _appHost.Restart();
-                    }
-                    catch (Exception ex)
-                    {
-                        _logger.LogError(ex, "Error restarting server");
-                    }
-                }
-            }
-        }
-
-        private async Task<bool> IsIdle()
-        {
-            if (_iTaskManager.ScheduledTasks.Any(i => i.State != TaskState.Idle))
-            {
-                return false;
-            }
-
-            if (_liveTvManager.Services.Count == 1)
-            {
-                try
-                {
-                    var timers = await _liveTvManager.GetTimers(new TimerQuery(), CancellationToken.None).ConfigureAwait(false);
-                    if (timers.Items.Any(i => i.Status == RecordingStatus.InProgress))
-                    {
-                        return false;
-                    }
-                }
-                catch (Exception ex)
-                {
-                    _logger.LogError(ex, "Error getting timers");
-                }
-            }
-
-            var now = DateTime.UtcNow;
-
-            return !_sessionManager.Sessions.Any(i => (now - i.LastActivityDate).TotalMinutes < 30);
-        }
-
-        public void Dispose()
-        {
-            _appHost.HasPendingRestartChanged -= _appHost_HasPendingRestartChanged;
-
-            DisposeTimer();
-        }
-
-        private void DisposeTimer()
-        {
-            if (_timer != null)
-            {
-                _timer.Dispose();
-                _timer = null;
-            }
-        }
-    }
-}

+ 0 - 1
Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs

@@ -16,7 +16,6 @@ using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Session;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Events;
-using MediaBrowser.Model.Extensions;
 using Microsoft.Extensions.Logging;
 
 namespace Emby.Server.Implementations.EntryPoints

+ 0 - 1
Emby.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs

@@ -1,4 +1,3 @@
-using System;
 using System.Threading;
 using System.Threading.Tasks;
 using Emby.Server.Implementations.Udp;

+ 2 - 2
Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs

@@ -197,7 +197,7 @@ namespace Emby.Server.Implementations.HttpClientManager
             if (File.Exists(responseCachePath)
                 && _fileSystem.GetLastWriteTimeUtc(responseCachePath).Add(cacheLength) > DateTime.UtcNow)
             {
-                var stream = _fileSystem.GetFileStream(responseCachePath, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.Read, true);
+                var stream = new FileStream(responseCachePath, FileMode.Open, FileAccess.Read, FileShare.Read, IODefaults.FileStreamBufferSize, true);
 
                 return new HttpResponseInfo
                 {
@@ -220,7 +220,7 @@ namespace Emby.Server.Implementations.HttpClientManager
                 FileMode.Create,
                 FileAccess.Write,
                 FileShare.None,
-                StreamDefaults.DefaultFileStreamBufferSize,
+                IODefaults.FileStreamBufferSize,
                 true))
             {
                 await response.Content.CopyToAsync(fileStream).ConfigureAwait(false);

+ 7 - 7
Emby.Server.Implementations/HttpServer/FileWriter.cs

@@ -72,7 +72,7 @@ namespace Emby.Server.Implementations.HttpServer
                 SetRangeValues();
             }
 
-            FileShare = FileShareMode.Read;
+            FileShare = FileShare.Read;
             Cookies = new List<Cookie>();
         }
 
@@ -94,7 +94,7 @@ namespace Emby.Server.Implementations.HttpServer
 
         public List<Cookie> Cookies { get; private set; }
 
-        public FileShareMode FileShare { get; set; }
+        public FileShare FileShare { get; set; }
 
         /// <summary>
         /// Gets the options.
@@ -222,17 +222,17 @@ namespace Emby.Server.Implementations.HttpServer
             }
         }
 
-        public async Task TransmitFile(Stream stream, string path, long offset, long count, FileShareMode fileShareMode, CancellationToken cancellationToken)
+        public async Task TransmitFile(Stream stream, string path, long offset, long count, FileShare fileShare, CancellationToken cancellationToken)
         {
-            var fileOpenOptions = FileOpenOptions.SequentialScan;
+            var fileOptions = FileOptions.SequentialScan;
 
             // use non-async filestream along with read due to https://github.com/dotnet/corefx/issues/6039
             if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
             {
-                fileOpenOptions |= FileOpenOptions.Asynchronous;
+                fileOptions |= FileOptions.Asynchronous;
             }
 
-            using (var fs = _fileSystem.GetFileStream(path, FileOpenMode.Open, FileAccessMode.Read, fileShareMode, fileOpenOptions))
+            using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, fileShare, IODefaults.FileStreamBufferSize, fileOptions))
             {
                 if (offset > 0)
                 {
@@ -245,7 +245,7 @@ namespace Emby.Server.Implementations.HttpServer
                 }
                 else
                 {
-                    await fs.CopyToAsync(stream, StreamDefaults.DefaultCopyToBufferSize, cancellationToken).ConfigureAwait(false);
+                    await fs.CopyToAsync(stream, IODefaults.CopyToBufferSize, cancellationToken).ConfigureAwait(false);
                 }
             }
         }

+ 4 - 4
Emby.Server.Implementations/HttpServer/HttpResultFactory.cs

@@ -440,7 +440,7 @@ namespace Emby.Server.Implementations.HttpServer
 
         public Task<object> GetStaticFileResult(IRequest requestContext,
             string path,
-            FileShareMode fileShare = FileShareMode.Read)
+            FileShare fileShare = FileShare.Read)
         {
             if (string.IsNullOrEmpty(path))
             {
@@ -464,7 +464,7 @@ namespace Emby.Server.Implementations.HttpServer
                 throw new ArgumentException("Path can't be empty.", nameof(options));
             }
 
-            if (fileShare != FileShareMode.Read && fileShare != FileShareMode.ReadWrite)
+            if (fileShare != FileShare.Read && fileShare != FileShare.ReadWrite)
             {
                 throw new ArgumentException("FileShare must be either Read or ReadWrite");
             }
@@ -492,9 +492,9 @@ namespace Emby.Server.Implementations.HttpServer
         /// <param name="path">The path.</param>
         /// <param name="fileShare">The file share.</param>
         /// <returns>Stream.</returns>
-        private Stream GetFileStream(string path, FileShareMode fileShare)
+        private Stream GetFileStream(string path, FileShare fileShare)
         {
-            return _fileSystem.GetFileStream(path, FileOpenMode.Open, FileAccessMode.Read, fileShare);
+            return new FileStream(path, FileMode.Open, FileAccess.Read, fileShare);
         }
 
         public Task<object> GetStaticResult(IRequest requestContext,

+ 0 - 81
Emby.Server.Implementations/IO/ManagedFileSystem.cs

@@ -365,87 +365,6 @@ namespace Emby.Server.Implementations.IO
             return GetLastWriteTimeUtc(GetFileSystemInfo(path));
         }
 
-        /// <summary>
-        /// Gets the file stream.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        /// <param name="mode">The mode.</param>
-        /// <param name="access">The access.</param>
-        /// <param name="share">The share.</param>
-        /// <param name="isAsync">if set to <c>true</c> [is asynchronous].</param>
-        /// <returns>FileStream.</returns>
-        public virtual Stream GetFileStream(string path, FileOpenMode mode, FileAccessMode access, FileShareMode share, bool isAsync = false)
-        {
-            if (isAsync)
-            {
-                return GetFileStream(path, mode, access, share, FileOpenOptions.Asynchronous);
-            }
-
-            return GetFileStream(path, mode, access, share, FileOpenOptions.None);
-        }
-
-        public virtual Stream GetFileStream(string path, FileOpenMode mode, FileAccessMode access, FileShareMode share, FileOpenOptions fileOpenOptions)
-            => new FileStream(path, GetFileMode(mode), GetFileAccess(access), GetFileShare(share), 4096, GetFileOptions(fileOpenOptions));
-
-        private static FileOptions GetFileOptions(FileOpenOptions mode)
-        {
-            var val = (int)mode;
-            return (FileOptions)val;
-        }
-
-        private static FileMode GetFileMode(FileOpenMode mode)
-        {
-            switch (mode)
-            {
-                //case FileOpenMode.Append:
-                //    return FileMode.Append;
-                case FileOpenMode.Create:
-                    return FileMode.Create;
-                case FileOpenMode.CreateNew:
-                    return FileMode.CreateNew;
-                case FileOpenMode.Open:
-                    return FileMode.Open;
-                case FileOpenMode.OpenOrCreate:
-                    return FileMode.OpenOrCreate;
-                //case FileOpenMode.Truncate:
-                //    return FileMode.Truncate;
-                default:
-                    throw new Exception("Unrecognized FileOpenMode");
-            }
-        }
-
-        private static FileAccess GetFileAccess(FileAccessMode mode)
-        {
-            switch (mode)
-            {
-                //case FileAccessMode.ReadWrite:
-                //    return FileAccess.ReadWrite;
-                case FileAccessMode.Write:
-                    return FileAccess.Write;
-                case FileAccessMode.Read:
-                    return FileAccess.Read;
-                default:
-                    throw new Exception("Unrecognized FileAccessMode");
-            }
-        }
-
-        private static FileShare GetFileShare(FileShareMode mode)
-        {
-            switch (mode)
-            {
-                case FileShareMode.ReadWrite:
-                    return FileShare.ReadWrite;
-                case FileShareMode.Write:
-                    return FileShare.Write;
-                case FileShareMode.Read:
-                    return FileShare.Read;
-                case FileShareMode.None:
-                    return FileShare.None;
-                default:
-                    throw new Exception("Unrecognized FileShareMode");
-            }
-        }
-
         public virtual void SetHidden(string path, bool isHidden)
         {
             if (OperatingSystem.Id != OperatingSystemId.Windows)

+ 10 - 12
Emby.Server.Implementations/Library/LibraryManager.cs

@@ -710,10 +710,10 @@ namespace Emby.Server.Implementations.Library
         }
 
         /// <summary>
-        /// Creates the root media folder
+        /// Creates the root media folder.
         /// </summary>
         /// <returns>AggregateFolder.</returns>
-        /// <exception cref="InvalidOperationException">Cannot create the root folder until plugins have loaded</exception>
+        /// <exception cref="InvalidOperationException">Cannot create the root folder until plugins have loaded.</exception>
         public AggregateFolder CreateRootFolder()
         {
             var rootFolderPath = ConfigurationManager.ApplicationPaths.RootFolderPath;
@@ -824,7 +824,6 @@ namespace Emby.Server.Implementations.Library
         {
             // If this returns multiple items it could be tricky figuring out which one is correct.
             // In most cases, the newest one will be and the others obsolete but not yet cleaned up
-
             if (string.IsNullOrEmpty(path))
             {
                 throw new ArgumentNullException(nameof(path));
@@ -844,7 +843,7 @@ namespace Emby.Server.Implementations.Library
         }
 
         /// <summary>
-        /// Gets a Person
+        /// Gets the person.
         /// </summary>
         /// <param name="name">The name.</param>
         /// <returns>Task{Person}.</returns>
@@ -854,7 +853,7 @@ namespace Emby.Server.Implementations.Library
         }
 
         /// <summary>
-        /// Gets a Studio
+        /// Gets the studio.
         /// </summary>
         /// <param name="name">The name.</param>
         /// <returns>Task{Studio}.</returns>
@@ -879,7 +878,7 @@ namespace Emby.Server.Implementations.Library
         }
 
         /// <summary>
-        /// Gets a Genre
+        /// Gets the genre.
         /// </summary>
         /// <param name="name">The name.</param>
         /// <returns>Task{Genre}.</returns>
@@ -889,7 +888,7 @@ namespace Emby.Server.Implementations.Library
         }
 
         /// <summary>
-        /// Gets the genre.
+        /// Gets the music genre.
         /// </summary>
         /// <param name="name">The name.</param>
         /// <returns>Task{MusicGenre}.</returns>
@@ -899,7 +898,7 @@ namespace Emby.Server.Implementations.Library
         }
 
         /// <summary>
-        /// Gets a Year
+        /// Gets the year.
         /// </summary>
         /// <param name="value">The value.</param>
         /// <returns>Task{Year}.</returns>
@@ -1076,9 +1075,9 @@ namespace Emby.Server.Implementations.Library
 
             var innerProgress = new ActionableProgress<double>();
 
-            innerProgress.RegisterAction(pct => progress.Report(pct * .96));
+            innerProgress.RegisterAction(pct => progress.Report(pct * pct * 0.96));
 
-            // Now validate the entire media library
+            // Validate the entire media library
             await RootFolder.ValidateChildren(innerProgress, cancellationToken, new MetadataRefreshOptions(new DirectoryService(_fileSystem)), recursive: true).ConfigureAwait(false);
 
             progress.Report(96);
@@ -1087,7 +1086,6 @@ namespace Emby.Server.Implementations.Library
 
             innerProgress.RegisterAction(pct => progress.Report(96 + (pct * .04)));
 
-            // Run post-scan tasks
             await RunPostScanTasks(innerProgress, cancellationToken).ConfigureAwait(false);
 
             progress.Report(100);
@@ -1138,7 +1136,7 @@ namespace Emby.Server.Implementations.Library
                 }
                 catch (Exception ex)
                 {
-                    _logger.LogError(ex, "Error running postscan task");
+                    _logger.LogError(ex, "Error running post-scan task");
                 }
 
                 numComplete++;

+ 4 - 3
Emby.Server.Implementations/Library/UserManager.cs

@@ -291,10 +291,11 @@ namespace Emby.Server.Implementations.Library
                     && authenticationProvider != null
                     && !(authenticationProvider is DefaultAuthenticationProvider))
                 {
-                    // We should trust the user that the authprovider says, not what was typed
+                    // Trust the username returned by the authentication provider
                     username = updatedUsername;
 
-                    // Search the database for the user again; the authprovider might have created it
+                    // Search the database for the user again
+                    // the authentication provider might have created it
                     user = Users
                         .FirstOrDefault(i => string.Equals(username, i.Name, StringComparison.OrdinalIgnoreCase));
 
@@ -667,7 +668,7 @@ namespace Emby.Server.Implementations.Library
                 throw new ArgumentException("Invalid username", nameof(newName));
             }
 
-            if (user.Name.Equals(newName, StringComparison.OrdinalIgnoreCase))
+            if (user.Name.Equals(newName, StringComparison.Ordinal))
             {
                 throw new ArgumentException("The new and old names must be different.");
             }

+ 3 - 5
Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs

@@ -15,14 +15,12 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
     {
         private readonly ILogger _logger;
         private readonly IHttpClient _httpClient;
-        private readonly IFileSystem _fileSystem;
         private readonly IStreamHelper _streamHelper;
 
-        public DirectRecorder(ILogger logger, IHttpClient httpClient, IFileSystem fileSystem, IStreamHelper streamHelper)
+        public DirectRecorder(ILogger logger, IHttpClient httpClient, IStreamHelper streamHelper)
         {
             _logger = logger;
             _httpClient = httpClient;
-            _fileSystem = fileSystem;
             _streamHelper = streamHelper;
         }
 
@@ -45,7 +43,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         {
             Directory.CreateDirectory(Path.GetDirectoryName(targetFile));
 
-            using (var output = _fileSystem.GetFileStream(targetFile, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
+            using (var output = new FileStream(targetFile, FileMode.Create, FileAccess.Write, FileShare.Read))
             {
                 onStarted();
 
@@ -81,7 +79,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 
                 Directory.CreateDirectory(Path.GetDirectoryName(targetFile));
 
-                using (var output = _fileSystem.GetFileStream(targetFile, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
+                using (var output = new FileStream(targetFile, FileMode.Create, FileAccess.Write, FileShare.Read))
                 {
                     onStarted();
 

+ 5 - 5
Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs

@@ -427,7 +427,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         {
             foreach (NameValuePair mapping in mappings)
             {
-                if (StringHelper.EqualsIgnoreCase(mapping.Name, channelId))
+                if (string.Equals(mapping.Name, channelId, StringComparison.OrdinalIgnoreCase))
                 {
                     return mapping.Value;
                 }
@@ -1664,10 +1664,10 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         {
             if (mediaSource.RequiresLooping || !(mediaSource.Container ?? string.Empty).EndsWith("ts", StringComparison.OrdinalIgnoreCase) || (mediaSource.Protocol != MediaProtocol.File && mediaSource.Protocol != MediaProtocol.Http))
             {
-                return new EncodedRecorder(_logger, _fileSystem, _mediaEncoder, _config.ApplicationPaths, _jsonSerializer, _processFactory, _config);
+                return new EncodedRecorder(_logger, _mediaEncoder, _config.ApplicationPaths, _jsonSerializer, _processFactory, _config);
             }
 
-            return new DirectRecorder(_logger, _httpClient, _fileSystem, _streamHelper);
+            return new DirectRecorder(_logger, _httpClient, _streamHelper);
         }
 
         private void OnSuccessfulRecording(TimerInfo timer, string path)
@@ -1888,7 +1888,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                 return;
             }
 
-            using (var stream = _fileSystem.GetFileStream(nfoPath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
+            using (var stream = new FileStream(nfoPath, FileMode.Create, FileAccess.Write, FileShare.Read))
             {
                 var settings = new XmlWriterSettings
                 {
@@ -1952,7 +1952,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                 return;
             }
 
-            using (var stream = _fileSystem.GetFileStream(nfoPath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
+            using (var stream = new FileStream(nfoPath, FileMode.Create, FileAccess.Write, FileShare.Read))
             {
                 var settings = new XmlWriterSettings
                 {

+ 1 - 6
Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs

@@ -2,7 +2,6 @@ using System;
 using System.Collections.Generic;
 using System.Globalization;
 using System.IO;
-using System.Linq;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
@@ -14,7 +13,6 @@ using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Diagnostics;
 using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Serialization;
 using Microsoft.Extensions.Logging;
@@ -24,7 +22,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
     public class EncodedRecorder : IRecorder
     {
         private readonly ILogger _logger;
-        private readonly IFileSystem _fileSystem;
         private readonly IMediaEncoder _mediaEncoder;
         private readonly IServerApplicationPaths _appPaths;
         private bool _hasExited;
@@ -38,7 +35,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 
         public EncodedRecorder(
             ILogger logger,
-            IFileSystem fileSystem,
             IMediaEncoder mediaEncoder,
             IServerApplicationPaths appPaths,
             IJsonSerializer json,
@@ -46,7 +42,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             IServerConfigurationManager config)
         {
             _logger = logger;
-            _fileSystem = fileSystem;
             _mediaEncoder = mediaEncoder;
             _appPaths = appPaths;
             _json = json;
@@ -107,7 +102,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             Directory.CreateDirectory(Path.GetDirectoryName(logFilePath));
 
             // FFMpeg writes debug/error info to stderr. This is useful when debugging so let's put it in the log directory.
-            _logFileStream = _fileSystem.GetFileStream(logFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true);
+            _logFileStream = new FileStream(logFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, IODefaults.FileStreamBufferSize, true);
 
             var commandLineLogMessageBytes = Encoding.UTF8.GetBytes(_json.SerializeToString(mediaSource) + Environment.NewLine + Environment.NewLine + commandLineLogMessage + Environment.NewLine + Environment.NewLine);
             _logFileStream.Write(commandLineLogMessageBytes, 0, commandLineLogMessageBytes.Length);

+ 2 - 2
Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs

@@ -96,7 +96,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
                 FileMode.Open,
                 FileAccess.Read,
                 FileShare.ReadWrite,
-                StreamDefaults.DefaultFileStreamBufferSize,
+                IODefaults.FileStreamBufferSize,
                 allowAsyncFileRead ? FileOptions.SequentialScan | FileOptions.Asynchronous : FileOptions.SequentialScan);
 
         public Task DeleteTempFiles()
@@ -199,7 +199,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
                 await StreamHelper.CopyToAsync(
                     inputStream,
                     stream,
-                    StreamDefaults.DefaultCopyToBufferSize,
+                    IODefaults.CopyToBufferSize,
                     emptyReadLimit,
                     cancellationToken).ConfigureAwait(false);
             }

+ 0 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs

@@ -10,7 +10,6 @@ using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.LiveTv;
-using MediaBrowser.Model.Extensions;
 using Microsoft.Extensions.Logging;
 
 namespace Emby.Server.Implementations.LiveTv.TunerHosts

+ 2 - 2
Emby.Server.Implementations/LiveTv/TunerHosts/SharedHttpStream.cs

@@ -127,12 +127,12 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
                     Logger.LogInformation("Beginning {0} stream to {1}", GetType().Name, TempFilePath);
                     using (response)
                     using (var stream = response.Content)
-                    using (var fileStream = FileSystem.GetFileStream(TempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.None))
+                    using (var fileStream = new FileStream(TempFilePath, FileMode.Create, FileAccess.Write, FileShare.Read))
                     {
                         await StreamHelper.CopyToAsync(
                             stream,
                             fileStream,
-                            StreamDefaults.DefaultCopyToBufferSize,
+                            IODefaults.CopyToBufferSize,
                             () => Resolve(openTaskCompletionSource),
                             cancellationToken).ConfigureAwait(false);
                     }

+ 4 - 4
Emby.Server.Implementations/Localization/Core/ar.json

@@ -9,7 +9,7 @@
     "Channels": "القنوات",
     "ChapterNameValue": "الباب {0}",
     "Collections": "مجموعات",
-    "DeviceOfflineWithName": "تم قطع الاتصال بـ{0}",
+    "DeviceOfflineWithName": "تم قطع اتصال {0}",
     "DeviceOnlineWithName": "{0} متصل",
     "FailedLoginAttemptWithUserName": "عملية تسجيل الدخول فشلت من {0}",
     "Favorites": "التفضيلات",
@@ -75,8 +75,8 @@
     "Songs": "الأغاني",
     "StartupEmbyServerIsLoading": "سيرفر Jellyfin قيد التشغيل . الرجاء المحاولة بعد قليل.",
     "SubtitleDownloadFailureForItem": "عملية إنزال الترجمة فشلت لـ{0}",
-    "SubtitleDownloadFailureFromForItem": "الترجمات فشلت في التحميل من {0} لـ {1}",
-    "SubtitlesDownloadedForItem": "تم تحميل الترجمات لـ {0}",
+    "SubtitleDownloadFailureFromForItem": "الترجمات فشلت في التحميل من {0} الى {1}",
+    "SubtitlesDownloadedForItem": "تم تحميل الترجمات الى {0}",
     "Sync": "مزامنة",
     "System": "النظام",
     "TvShows": "البرامج التلفزيونية",
@@ -88,7 +88,7 @@
     "UserOfflineFromDevice": "تم قطع اتصال {0} من {1}",
     "UserOnlineFromDevice": "{0} متصل عبر {1}",
     "UserPasswordChangedWithName": "تم تغيير كلمة السر للمستخدم {0}",
-    "UserPolicyUpdatedWithName": "سياسة المستخدمين تم تحديثها لـ {0}",
+    "UserPolicyUpdatedWithName": "تم تحديث سياسة المستخدم {0}",
     "UserStartedPlayingItemWithValues": "قام {0} ببدء تشغيل {1} على {2}",
     "UserStoppedPlayingItemWithValues": "قام {0} بإيقاف تشغيل {1} على {2}",
     "ValueHasBeenAddedToLibrary": "{0} تم اضافتها الى مكتبة الوسائط",

+ 95 - 0
Emby.Server.Implementations/Localization/Core/fil.json

@@ -0,0 +1,95 @@
+{
+    "VersionNumber": "Bersyon {0}",
+    "ValueSpecialEpisodeName": "Espesyal - {0}",
+    "ValueHasBeenAddedToLibrary": "Naidagdag na ang {0} sa iyong media library",
+    "UserStoppedPlayingItemWithValues": "Natapos ni {0} ang {1} sa {2}",
+    "UserStartedPlayingItemWithValues": "Si {0} ay nagplaplay ng {1} sa {2}",
+    "UserPolicyUpdatedWithName": "Ang user policy ay naiupdate para kay {0}",
+    "UserPasswordChangedWithName": "Napalitan na ang password ni {0}",
+    "UserOnlineFromDevice": "Si {0} ay nakakonekta galing sa {1}",
+    "UserOfflineFromDevice": "Si {0} ay nadiskonekta galing sa {1}",
+    "UserLockedOutWithName": "Si {0} ay nalock out",
+    "UserDownloadingItemWithValues": "Nagdadownload si {0} ng {1}",
+    "UserDeletedWithName": "Natanggal na is user {0}",
+    "UserCreatedWithName": "Nagawa na si user {0}",
+    "User": "User",
+    "TvShows": "Pelikula",
+    "System": "Sistema",
+    "Sync": "Pag-sync",
+    "SubtitlesDownloadedForItem": "Naidownload na ang subtitles {0}",
+    "SubtitleDownloadFailureFromForItem": "Hindi naidownload ang subtitles {0} para sa {1}",
+    "StartupEmbyServerIsLoading": "Nagloload ang Jellyfin Server. Sandaling maghintay.",
+    "Songs": "Kanta",
+    "Shows": "Pelikula",
+    "ServerNameNeedsToBeRestarted": "Kailangan irestart ang {0}",
+    "ScheduledTaskStartedWithName": "Nagsimula na ang {0}",
+    "ScheduledTaskFailedWithName": "Hindi gumana and {0}",
+    "ProviderValue": "Ang provider ay {0}",
+    "PluginUpdatedWithName": "Naiupdate na ang {0}",
+    "PluginUninstalledWithName": "Naiuninstall na ang {0}",
+    "PluginInstalledWithName": "Nainstall na ang {0}",
+    "Plugin": "Plugin",
+    "Playlists": "Playlists",
+    "Photos": "Larawan",
+    "NotificationOptionVideoPlaybackStopped": "Huminto na ang pelikula",
+    "NotificationOptionVideoPlayback": "Nagsimula na ang pelikula",
+    "NotificationOptionUserLockedOut": "Nakalock out ang user",
+    "NotificationOptionTaskFailed": "Hindi gumana ang scheduled task",
+    "NotificationOptionServerRestartRequired": "Kailangan irestart ang server",
+    "NotificationOptionPluginUpdateInstalled": "Naiupdate na ang plugin",
+    "NotificationOptionPluginUninstalled": "Naiuninstall na ang plugin",
+    "NotificationOptionPluginInstalled": "Nainstall na ang plugin",
+    "NotificationOptionPluginError": "Hindi gumagana ang plugin",
+    "NotificationOptionNewLibraryContent": "May bagong content na naidagdag",
+    "NotificationOptionInstallationFailed": "Hindi nainstall ng mabuti",
+    "NotificationOptionCameraImageUploaded": "Naiupload na ang picture",
+    "NotificationOptionAudioPlaybackStopped": "Huminto na ang patugtog",
+    "NotificationOptionAudioPlayback": "Nagsimula na ang patugtog",
+    "NotificationOptionApplicationUpdateInstalled": "Naiupdate na ang aplikasyon",
+    "NotificationOptionApplicationUpdateAvailable": "May bagong update ang aplikasyon",
+    "NewVersionIsAvailable": "May bagong version ng Jellyfin Server na pwede idownload.",
+    "NameSeasonUnknown": "Hindi alam ang season",
+    "NameSeasonNumber": "Season {0}",
+    "NameInstallFailed": "Hindi nainstall ang {0}",
+    "MusicVideos": "Music video",
+    "Music": "Kanta",
+    "Movies": "Pelikula",
+    "MixedContent": "Halo-halong content",
+    "MessageServerConfigurationUpdated": "Naiupdate na ang server configuration",
+    "MessageNamedServerConfigurationUpdatedWithValue": "Naiupdate na ang server configuration section {0}",
+    "MessageApplicationUpdatedTo": "Ang Jellyfin Server ay naiupdate to {0}",
+    "MessageApplicationUpdated": "Naiupdate na ang Jellyfin Server",
+    "Latest": "Pinakabago",
+    "LabelRunningTimeValue": "Oras: {0}",
+    "LabelIpAddressValue": "Ang IP Address ay {0}",
+    "ItemRemovedWithName": "Naitanggal ang {0} sa library",
+    "ItemAddedWithName": "Naidagdag ang {0} sa library",
+    "Inherit": "Manahin",
+    "HeaderRecordingGroups": "Pagtatalang Grupo",
+    "HeaderNextUp": "Susunod",
+    "HeaderLiveTV": "Live TV",
+    "HeaderFavoriteSongs": "Paboritong Kanta",
+    "HeaderFavoriteShows": "Paboritong Pelikula",
+    "HeaderFavoriteEpisodes": "Paboritong Episodes",
+    "HeaderFavoriteArtists": "Paboritong Artista",
+    "HeaderFavoriteAlbums": "Paboritong Albums",
+    "HeaderContinueWatching": "Ituloy Manood",
+    "HeaderCameraUploads": "Camera Uploads",
+    "HeaderAlbumArtists": "Artista ng Album",
+    "Genres": "Kategorya",
+    "Folders": "Folders",
+    "Favorites": "Paborito",
+    "FailedLoginAttemptWithUserName": "maling login galing {0}",
+    "DeviceOnlineWithName": "nakakonekta si {0}",
+    "DeviceOfflineWithName": "nadiskonekta si {0}",
+    "Collections": "Koleksyon",
+    "ChapterNameValue": "Kabanata {0}",
+    "Channels": "Channel",
+    "CameraImageUploadedFrom": "May bagong larawan na naupload galing {0}",
+    "Books": "Libro",
+    "AuthenticationSucceededWithUserName": "{0} na patunayan",
+    "Artists": "Artista",
+    "Application": "Aplikasyon",
+    "AppDeviceValues": "Aplikasyon: {0}, Aparato: {1}",
+    "Albums": "Albums"
+}

+ 1 - 0
Emby.Server.Implementations/Localization/Core/gl.json

@@ -0,0 +1 @@
+{}

+ 1 - 1
Emby.Server.Implementations/Localization/Core/sl-SI.json

@@ -12,7 +12,7 @@
     "DeviceOfflineWithName": "{0} je prekinil povezavo",
     "DeviceOnlineWithName": "{0} je povezan",
     "FailedLoginAttemptWithUserName": "Neuspešen poskus prijave z {0}",
-    "Favorites": "Priljubljeni",
+    "Favorites": "Priljubljeno",
     "Folders": "Mape",
     "Genres": "Zvrsti",
     "HeaderAlbumArtists": "Izvajalci albuma",

+ 1 - 1
Emby.Server.Implementations/Localization/Core/zh-CN.json

@@ -79,7 +79,7 @@
     "SubtitlesDownloadedForItem": "已为 {0} 下载了字幕",
     "Sync": "同步",
     "System": "系统",
-    "TvShows": "电视节目",
+    "TvShows": "电视",
     "User": "用户",
     "UserCreatedWithName": "用户 {0} 已创建",
     "UserDeletedWithName": "用户 {0} 已删除",

+ 0 - 1
Emby.Server.Implementations/Net/SocketFactory.cs

@@ -1,5 +1,4 @@
 using System;
-using System.IO;
 using System.Net;
 using System.Net.Sockets;
 using MediaBrowser.Model.Net;

+ 0 - 2
Emby.Server.Implementations/Net/WebSocketConnectEventArgs.cs

@@ -1,6 +1,4 @@
 using System;
-using System.Net.WebSockets;
-using MediaBrowser.Model.Services;
 using Microsoft.AspNetCore.Http;
 
 namespace Emby.Server.Implementations.Net

+ 0 - 1
Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs

@@ -1,4 +1,3 @@
-using System;
 using System.Collections.Generic;
 using System.Linq;
 using Emby.Server.Implementations.Images;

+ 2 - 3
Emby.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs

@@ -70,7 +70,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// Returns the task to be executed
+        /// Returns the task to be executed.
         /// </summary>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <param name="progress">The progress.</param>
@@ -89,7 +89,6 @@ namespace Emby.Server.Implementations.ScheduledTasks
                 SourceTypes = new SourceType[] { SourceType.Library },
                 HasChapterImages = false,
                 IsVirtualItem = false
-
             })
                 .OfType<Video>()
                 .ToList();
@@ -160,7 +159,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
             }
         }
 
-        public string Name => "Chapter image extraction";
+        public string Name => "Extract Chapter Images";
 
         public string Description => "Creates thumbnails for videos that have chapters.";
 

+ 2 - 2
Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs

@@ -158,9 +158,9 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
             }
         }
 
-        public string Name => "Cache file cleanup";
+        public string Name => "Clean Cache Directory";
 
-        public string Description => "Deletes cache files no longer needed by the system";
+        public string Description => "Deletes cache files no longer needed by the system.";
 
         public string Category => "Maintenance";
 

+ 4 - 6
Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs

@@ -10,7 +10,7 @@ using MediaBrowser.Model.Tasks;
 namespace Emby.Server.Implementations.ScheduledTasks.Tasks
 {
     /// <summary>
-    /// Deletes old log files
+    /// Deletes old log files.
     /// </summary>
     public class DeleteLogFileTask : IScheduledTask, IConfigurableScheduledTask
     {
@@ -33,20 +33,18 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
         }
 
         /// <summary>
-        /// Creates the triggers that define when the task will run
+        /// Creates the triggers that define when the task will run.
         /// </summary>
         /// <returns>IEnumerable{BaseTaskTrigger}.</returns>
         public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
         {
             return new[] {
-
-                // Every so often
                 new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(24).Ticks}
             };
         }
 
         /// <summary>
-        /// Returns the task to be executed
+        /// Returns the task to be executed.
         /// </summary>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <param name="progress">The progress.</param>
@@ -81,7 +79,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
             return Task.CompletedTask;
         }
 
-        public string Name => "Log file cleanup";
+        public string Name => "Clean Log Directory";
 
         public string Description => string.Format("Deletes log files that are more than {0} days old.", ConfigurationManager.CommonConfiguration.LogFileRetentionDays);
 

+ 2 - 2
Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteTranscodeFileTask.cs

@@ -125,9 +125,9 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
             }
         }
 
-        public string Name => "Transcode file cleanup";
+        public string Name => "Clean Transcode Directory";
 
-        public string Description => "Deletes transcode files more than 24 hours old.";
+        public string Description => "Deletes transcode files more than one day old.";
 
         public string Category => "Maintenance";
 

+ 5 - 6
Emby.Server.Implementations/ScheduledTasks/Tasks/PeopleValidationTask.cs

@@ -9,12 +9,12 @@ using MediaBrowser.Model.Tasks;
 namespace Emby.Server.Implementations.ScheduledTasks
 {
     /// <summary>
-    /// Class PeopleValidationTask
+    /// Class PeopleValidationTask.
     /// </summary>
     public class PeopleValidationTask : IScheduledTask
     {
         /// <summary>
-        /// The _library manager
+        /// The library manager.
         /// </summary>
         private readonly ILibraryManager _libraryManager;
 
@@ -32,13 +32,12 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// Creates the triggers that define when the task will run
+        /// Creates the triggers that define when the task will run.
         /// </summary>
         public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
         {
             return new[]
             {
-                // Every so often
                 new TaskTriggerInfo
                 {
                     Type = TaskTriggerInfo.TriggerInterval,
@@ -48,7 +47,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// Returns the task to be executed
+        /// Returns the task to be executed.
         /// </summary>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <param name="progress">The progress.</param>
@@ -58,7 +57,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
             return _libraryManager.ValidatePeople(cancellationToken, progress);
         }
 
-        public string Name => "Refresh people";
+        public string Name => "Refresh People";
 
         public string Description => "Updates metadata for actors and directors in your media library.";
 

+ 1 - 1
Emby.Server.Implementations/ScheduledTasks/Tasks/PluginUpdateTask.cs

@@ -96,7 +96,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <inheritdoc />
-        public string Name => "Check for plugin updates";
+        public string Name => "Update Plugins";
 
         /// <inheritdoc />
         public string Description => "Downloads and installs updates for plugins that are configured to update automatically.";

+ 1 - 1
Emby.Server.Implementations/ScheduledTasks/Tasks/RefreshMediaLibraryTask.cs

@@ -57,7 +57,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
             return ((LibraryManager)_libraryManager).ValidateMediaLibraryInternal(progress, cancellationToken);
         }
 
-        public string Name => "Scan media library";
+        public string Name => "Scan Media Library";
 
         public string Description => "Scans your media library for new files and refreshes metadata.";
 

+ 9 - 23
Emby.Server.Implementations/Serialization/JsonSerializer.cs

@@ -2,7 +2,6 @@ using System;
 using System.Globalization;
 using System.IO;
 using System.Threading.Tasks;
-using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Serialization;
 
 namespace Emby.Server.Implementations.Serialization
@@ -12,13 +11,15 @@ namespace Emby.Server.Implementations.Serialization
     /// </summary>
     public class JsonSerializer : IJsonSerializer
     {
-        private readonly IFileSystem _fileSystem;
-
-        public JsonSerializer(
-            IFileSystem fileSystem)
+        public JsonSerializer()
         {
-            _fileSystem = fileSystem;
-            Configure();
+            ServiceStack.Text.JsConfig.DateHandler = ServiceStack.Text.DateHandler.ISO8601;
+            ServiceStack.Text.JsConfig.ExcludeTypeInfo = true;
+            ServiceStack.Text.JsConfig.IncludeNullValues = false;
+            ServiceStack.Text.JsConfig.AlwaysUseUtc = true;
+            ServiceStack.Text.JsConfig.AssumeUtc = true;
+
+            ServiceStack.Text.JsConfig<Guid>.SerializeFn = SerializeGuid;
         }
 
         /// <summary>
@@ -81,7 +82,7 @@ namespace Emby.Server.Implementations.Serialization
                 throw new ArgumentNullException(nameof(file));
             }
 
-            using (var stream = _fileSystem.GetFileStream(file, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
+            using (var stream = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.Read))
             {
                 SerializeToStream(obj, stream);
             }
@@ -162,7 +163,6 @@ namespace Emby.Server.Implementations.Serialization
                 throw new ArgumentNullException(nameof(stream));
             }
 
-
             return ServiceStack.Text.JsonSerializer.DeserializeFromStreamAsync<T>(stream);
         }
 
@@ -225,20 +225,6 @@ namespace Emby.Server.Implementations.Serialization
             }
         }
 
-        /// <summary>
-        /// Configures this instance.
-        /// </summary>
-        private void Configure()
-        {
-            ServiceStack.Text.JsConfig.DateHandler = ServiceStack.Text.DateHandler.ISO8601;
-            ServiceStack.Text.JsConfig.ExcludeTypeInfo = true;
-            ServiceStack.Text.JsConfig.IncludeNullValues = false;
-            ServiceStack.Text.JsConfig.AlwaysUseUtc = true;
-            ServiceStack.Text.JsConfig.AssumeUtc = true;
-
-            ServiceStack.Text.JsConfig<Guid>.SerializeFn = SerializeGuid;
-        }
-
         private static string SerializeGuid(Guid guid)
         {
             if (guid.Equals(Guid.Empty))

+ 11 - 7
Emby.Server.Implementations/Session/SessionManager.cs

@@ -30,17 +30,17 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.Session
 {
     /// <summary>
-    /// Class SessionManager
+    /// Class SessionManager.
     /// </summary>
     public class SessionManager : ISessionManager, IDisposable
     {
         /// <summary>
-        /// The _user data repository
+        /// The user data repository.
         /// </summary>
         private readonly IUserDataManager _userDataManager;
 
         /// <summary>
-        /// The _logger
+        /// The logger.
         /// </summary>
         private readonly ILogger _logger;
 
@@ -57,7 +57,7 @@ namespace Emby.Server.Implementations.Session
         private readonly IDeviceManager _deviceManager;
 
         /// <summary>
-        /// The _active connections
+        /// The active connections.
         /// </summary>
         private readonly ConcurrentDictionary<string, SessionInfo> _activeConnections =
             new ConcurrentDictionary<string, SessionInfo>(StringComparer.OrdinalIgnoreCase);
@@ -70,18 +70,23 @@ namespace Emby.Server.Implementations.Session
         /// Occurs when [playback start].
         /// </summary>
         public event EventHandler<PlaybackProgressEventArgs> PlaybackStart;
+
         /// <summary>
         /// Occurs when [playback progress].
         /// </summary>
         public event EventHandler<PlaybackProgressEventArgs> PlaybackProgress;
+
         /// <summary>
         /// Occurs when [playback stopped].
         /// </summary>
         public event EventHandler<PlaybackStopEventArgs> PlaybackStopped;
 
         public event EventHandler<SessionEventArgs> SessionStarted;
+
         public event EventHandler<SessionEventArgs> CapabilitiesChanged;
+
         public event EventHandler<SessionEventArgs> SessionEnded;
+
         public event EventHandler<SessionEventArgs> SessionActivity;
 
         public SessionManager(
@@ -924,7 +929,6 @@ namespace Emby.Server.Implementations.Session
                     ClientName = session.Client,
                     DeviceId = session.DeviceId,
                     Session = session
-
                 },
                 _logger);
         }
@@ -1610,7 +1614,7 @@ namespace Emby.Server.Implementations.Session
         private DtoOptions _itemInfoDtoOptions;
 
         /// <summary>
-        /// Converts a BaseItem to a BaseItemInfo
+        /// Converts a BaseItem to a BaseItemInfo.
         /// </summary>
         private BaseItemDto GetItemInfo(BaseItem item, MediaSourceInfo mediaSource)
         {
@@ -1680,7 +1684,7 @@ namespace Emby.Server.Implementations.Session
             }
             catch (Exception ex)
             {
-                _logger.LogError("Error getting {0} image info", ex, type);
+                _logger.LogError(ex, "Error getting image information for {Type}", type);
                 return null;
             }
         }

+ 0 - 6
Emby.Server.Implementations/SocketSharp/HttpPostedFile.cs

@@ -1,11 +1,5 @@
 using System;
-using System.Collections.Generic;
-using System.Globalization;
 using System.IO;
-using System.Net;
-using System.Text;
-using System.Threading.Tasks;
-using MediaBrowser.Model.Services;
 
 public sealed class HttpPostedFile : IDisposable
 {

+ 0 - 2
Emby.Server.Implementations/SocketSharp/WebSocketSharpListener.cs

@@ -1,13 +1,11 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Net;
 using System.Net.WebSockets;
 using System.Threading;
 using System.Threading.Tasks;
 using Emby.Server.Implementations.HttpServer;
 using Emby.Server.Implementations.Net;
-using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Services;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Http.Extensions;

+ 0 - 2
Emby.Server.Implementations/WebSockets/WebSocketManager.cs

@@ -1,12 +1,10 @@
 using System;
-using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Linq;
 using System.Net.WebSockets;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
-using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Net;
 using MediaBrowser.Model.Serialization;
 using Microsoft.Extensions.Logging;

+ 2 - 2
Jellyfin.Api/Jellyfin.Api.csproj

@@ -8,9 +8,9 @@
 
   <ItemGroup>
     <PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.2.0" />
-    <PackageReference Include="Microsoft.AspNetCore.Authorization" Version="3.0.0" />
+    <PackageReference Include="Microsoft.AspNetCore.Authorization" Version="3.1.1" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
-    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0-rc4" />
+    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0" />
   </ItemGroup>
 
   <ItemGroup>

+ 3 - 3
Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj

@@ -12,8 +12,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="SkiaSharp" Version="1.68.0" />
-    <PackageReference Include="SkiaSharp.NativeAssets.Linux" Version="1.68.0" />
+    <PackageReference Include="SkiaSharp" Version="1.68.1" />
+    <PackageReference Include="SkiaSharp.NativeAssets.Linux" Version="1.68.1" />
     <PackageReference Include="Jellyfin.SkiaSharp.NativeAssets.LinuxArm" Version="1.68.0" />
   </ItemGroup>
 
@@ -25,7 +25,7 @@
 
   <!-- Code analysers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.7" PrivateAssets="All" />
+    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
     <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />

+ 0 - 1
Jellyfin.Drawing.Skia/SkiaCodecException.cs

@@ -1,4 +1,3 @@
-using System.Diagnostics.CodeAnalysis;
 using System.Globalization;
 using SkiaSharp;
 

+ 4 - 7
Jellyfin.Server/Jellyfin.Server.csproj

@@ -6,9 +6,6 @@
     <TargetFramework>netcoreapp3.1</TargetFramework>
     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
     <GenerateDocumentationFile>true</GenerateDocumentationFile>
-  </PropertyGroup>
-
-  <PropertyGroup>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
     <Nullable>enable</Nullable>
   </PropertyGroup>
@@ -38,16 +35,16 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="CommandLineParser" Version="2.6.0" />
-    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.1.0" />
-    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.0" />
+    <PackageReference Include="CommandLineParser" Version="2.7.82" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.1.1" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.1" />
     <PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
     <PackageReference Include="Serilog.Enrichers.Thread" Version="3.1.0" />
     <PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
     <PackageReference Include="Serilog.Sinks.Async" Version="1.4.0" />
     <PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
     <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
-    <PackageReference Include="Serilog.Sinks.Graylog" Version="2.1.1" />
+    <PackageReference Include="Serilog.Sinks.Graylog" Version="2.1.2" />
     <PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="2.0.2" />
     <PackageReference Include="SQLitePCLRaw.provider.sqlite3.netstandard11" Version="1.1.14" />
   </ItemGroup>

+ 12 - 15
Jellyfin.Server/Program.cs

@@ -4,7 +4,6 @@ using System.Globalization;
 using System.IO;
 using System.Linq;
 using System.Net;
-using System.Net.Security;
 using System.Reflection;
 using System.Runtime.InteropServices;
 using System.Text;
@@ -238,7 +237,7 @@ namespace Jellyfin.Server
                     {
                         foreach (var address in addresses)
                         {
-                            _logger.LogInformation("Kestrel listening on {ipaddr}", address);
+                            _logger.LogInformation("Kestrel listening on {IpAddress}", address);
                             options.Listen(address, appHost.HttpPort);
 
                             if (appHost.EnableHttps && appHost.Certificate != null)
@@ -443,20 +442,18 @@ namespace Jellyfin.Server
             if (!File.Exists(configPath))
             {
                 // For some reason the csproj name is used instead of the assembly name
-                using (Stream? resource = typeof(Program).Assembly.GetManifestResourceStream(ResourcePath))
+                await using Stream? resource = typeof(Program).Assembly.GetManifestResourceStream(ResourcePath);
+                if (resource == null)
                 {
-                    if (resource == null)
-                    {
-                        throw new InvalidOperationException(
-                            string.Format(
-                                CultureInfo.InvariantCulture,
-                                "Invalid resource path: '{0}'",
-                                ResourcePath));
-                    }
-
-                    using Stream dst = File.Open(configPath, FileMode.CreateNew);
-                    await resource.CopyToAsync(dst).ConfigureAwait(false);
+                    throw new InvalidOperationException(
+                        string.Format(
+                            CultureInfo.InvariantCulture,
+                            "Invalid resource path: '{0}'",
+                            ResourcePath));
                 }
+
+                await using Stream dst = File.Open(configPath, FileMode.CreateNew);
+                await resource.CopyToAsync(dst).ConfigureAwait(false);
             }
 
             return new ConfigurationBuilder()
@@ -485,7 +482,7 @@ namespace Jellyfin.Server
                     .WriteTo.Async(x => x.File(
                         Path.Combine(appPaths.LogDirectoryPath, "log_.log"),
                         rollingInterval: RollingInterval.Day,
-                        outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] [{Level:u3}] [{ThreadId}] {SourceContext}:{Message}{NewLine}{Exception}"))
+                        outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] [{Level:u3}] [{ThreadId}] {SourceContext}: {Message}{NewLine}{Exception}"))
                     .Enrich.FromLogContext()
                     .Enrich.WithThreadId()
                     .CreateLogger();

+ 1 - 1
Jellyfin.Server/Resources/Configuration/logging.json

@@ -20,7 +20,7 @@
                                 "retainedFileCountLimit": 3,
                                 "rollOnFileSizeLimit": true,
                                 "fileSizeLimitBytes": 100000000,
-                                "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] [{Level:u3}] [{ThreadId}] {SourceContext}:{Message}{NewLine}{Exception}"
+                                "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] [{Level:u3}] [{ThreadId}] {SourceContext}: {Message}{NewLine}{Exception}"
                             }
                         }
                     ]

+ 0 - 1
Jellyfin.Server/Startup.cs

@@ -3,7 +3,6 @@ using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
 

+ 0 - 1
MediaBrowser.Api/ApiEntryPoint.cs

@@ -12,7 +12,6 @@ using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Session;
-using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Session;
 using Microsoft.Extensions.Logging;

+ 0 - 1
MediaBrowser.Api/EnvironmentService.cs

@@ -6,7 +6,6 @@ using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Net;
 using MediaBrowser.Model.Services;
 using Microsoft.Extensions.Logging;
 

+ 1 - 1
MediaBrowser.Api/Images/ImageService.cs

@@ -656,7 +656,7 @@ namespace MediaBrowser.Api.Images
                 IsHeadRequest = isHeadRequest,
                 Path = imageResult.Item1,
 
-                FileShare = FileShareMode.Read
+                FileShare = FileShare.Read
 
             }).ConfigureAwait(false);
         }

+ 2 - 4
MediaBrowser.Api/Images/RemoteImageService.cs

@@ -274,11 +274,9 @@ namespace MediaBrowser.Api.Images
 
                 Directory.CreateDirectory(Path.GetDirectoryName(fullCachePath));
                 using (var stream = result.Content)
+                using (var filestream = new FileStream(fullCachePath, FileMode.Create, FileAccess.Write, FileShare.Read, IODefaults.FileStreamBufferSize, true))
                 {
-                    using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
-                    {
-                        await stream.CopyToAsync(filestream).ConfigureAwait(false);
-                    }
+                    await stream.CopyToAsync(filestream).ConfigureAwait(false);
                 }
 
                 Directory.CreateDirectory(Path.GetDirectoryName(pointerCachePath));

+ 1 - 1
MediaBrowser.Api/ItemLookupService.cs

@@ -305,7 +305,7 @@ namespace MediaBrowser.Api
 
             Directory.CreateDirectory(Path.GetDirectoryName(fullCachePath));
             using (var stream = result.Content)
-            using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
+            using (var filestream = new FileStream(fullCachePath, FileMode.Create, FileAccess.Write, FileShare.Read, IODefaults.FileStreamBufferSize, true))
             {
                 await stream.CopyToAsync(filestream).ConfigureAwait(false);
             }

+ 0 - 1
MediaBrowser.Api/ItemUpdateService.cs

@@ -2,7 +2,6 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading;
-using System.Threading.Tasks;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;

+ 0 - 4
MediaBrowser.Api/Library/LibraryService.cs

@@ -16,17 +16,13 @@ using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.Net;
-using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Providers;
-using MediaBrowser.Controller.TV;
 using MediaBrowser.Model.Activity;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Globalization;
-using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Services;
 using Microsoft.Extensions.Logging;

+ 1 - 1
MediaBrowser.Api/Playback/BaseStreamingService.cs

@@ -261,7 +261,7 @@ namespace MediaBrowser.Api.Playback
             var logFilePath = Path.Combine(ServerConfigurationManager.ApplicationPaths.LogDirectoryPath, logFilePrefix + "-" + Guid.NewGuid() + ".txt");
 
             // FFMpeg writes debug/error info to stderr. This is useful when debugging so let's put it in the log directory.
-            Stream logStream = FileSystem.GetFileStream(logFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true);
+            Stream logStream = new FileStream(logFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, IODefaults.FileStreamBufferSize, true);
 
             var commandLineLogMessageBytes = Encoding.UTF8.GetBytes(Request.AbsoluteUri + Environment.NewLine + Environment.NewLine + JsonSerializer.SerializeToString(state.MediaSource) + Environment.NewLine + Environment.NewLine + commandLineLogMessage + Environment.NewLine + Environment.NewLine);
             await logStream.WriteAsync(commandLineLogMessageBytes, 0, commandLineLogMessageBytes.Length, cancellationTokenSource.Token).ConfigureAwait(false);

+ 4 - 4
MediaBrowser.Api/Playback/Hls/BaseHlsService.cs

@@ -168,7 +168,7 @@ namespace MediaBrowser.Api.Playback.Hls
 
         private string GetLivePlaylistText(string path, int segmentLength)
         {
-            using (var stream = FileSystem.GetFileStream(path, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.ReadWrite))
+            using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
             {
                 using (var reader = new StreamReader(stream))
                 {
@@ -211,7 +211,7 @@ namespace MediaBrowser.Api.Playback.Hls
             {
                 try
                 {
-                    // Need to use FileShareMode.ReadWrite because we're reading the file at the same time it's being written
+                    // Need to use FileShare.ReadWrite because we're reading the file at the same time it's being written
                     using (var fileStream = GetPlaylistFileStream(playlist))
                     {
                         using (var reader = new StreamReader(fileStream))
@@ -252,11 +252,11 @@ namespace MediaBrowser.Api.Playback.Hls
 
             try
             {
-                return FileSystem.GetFileStream(tmpPath, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.ReadWrite, FileOpenOptions.SequentialScan);
+                return new FileStream(tmpPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, IODefaults.FileStreamBufferSize, FileOptions.SequentialScan);
             }
             catch (IOException)
             {
-                return FileSystem.GetFileStream(path, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.ReadWrite, FileOpenOptions.SequentialScan);
+                return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, IODefaults.FileStreamBufferSize, FileOptions.SequentialScan);
             }
         }
 

+ 4 - 5
MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs

@@ -16,7 +16,6 @@ using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Dlna;
 using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Extensions;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Services;
@@ -537,7 +536,7 @@ namespace MediaBrowser.Api.Playback.Hls
             return ResultFactory.GetStaticFileResult(Request, new StaticFileResultOptions
             {
                 Path = segmentPath,
-                FileShare = FileShareMode.ReadWrite,
+                FileShare = FileShare.ReadWrite,
                 OnComplete = () =>
                 {
                     Logger.LogDebug("finished serving {0}", segmentPath);
@@ -954,12 +953,12 @@ namespace MediaBrowser.Api.Playback.Hls
                 // Unable to force key frames to h264_qsv transcode
                 if (string.Equals(codec, "h264_qsv", StringComparison.OrdinalIgnoreCase))
                 {
-                    Logger.LogInformation("Bug Workaround: Disabling force_key_frames for h264_qsv"); 
-                } 
+                    Logger.LogInformation("Bug Workaround: Disabling force_key_frames for h264_qsv");
+                }
                 else
                 {
                     args += " " + keyFrameArg;
-                } 
+                }
 
                 //args += " -mixed-refs 0 -refs 3 -x264opts b_pyramid=0:weightb=0:weightp=0";
 

+ 2 - 2
MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs

@@ -140,7 +140,7 @@ namespace MediaBrowser.Api.Playback.Hls
             var file = request.SegmentId + Path.GetExtension(Request.PathInfo);
             file = Path.Combine(ServerConfigurationManager.GetTranscodePath(), file);
 
-            return ResultFactory.GetStaticFileResult(Request, file, FileShareMode.ReadWrite);
+            return ResultFactory.GetStaticFileResult(Request, file, FileShare.ReadWrite);
         }
 
         private Task<object> GetFileResult(string path, string playlistPath)
@@ -150,7 +150,7 @@ namespace MediaBrowser.Api.Playback.Hls
             return ResultFactory.GetStaticFileResult(Request, new StaticFileResultOptions
             {
                 Path = path,
-                FileShare = FileShareMode.ReadWrite,
+                FileShare = FileShare.ReadWrite,
                 OnComplete = () =>
                 {
                     if (transcodingJob != null)

+ 0 - 2
MediaBrowser.Api/Playback/MediaInfoService.cs

@@ -5,7 +5,6 @@
 
 using System;
 using System.Buffers;
-using System.Collections.Generic;
 using System.Globalization;
 using System.Text.Json;
 using System.Linq;
@@ -23,7 +22,6 @@ using MediaBrowser.Model.Dlna;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.MediaInfo;
-using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Services;
 using MediaBrowser.Model.Session;
 using Microsoft.Extensions.Logging;

+ 1 - 1
MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs

@@ -248,7 +248,7 @@ namespace MediaBrowser.Api.Playback.Progressive
             //            ContentType = contentType,
             //            IsHeadRequest = isHeadRequest,
             //            Path = outputPath,
-            //            FileShare = FileShareMode.ReadWrite,
+            //            FileShare = FileShare.ReadWrite,
             //            OnComplete = () =>
             //            {
             //                if (transcodingJob != null)

+ 5 - 7
MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs

@@ -21,8 +21,6 @@ namespace MediaBrowser.Api.Playback.Progressive
         private readonly CancellationToken _cancellationToken;
         private readonly Dictionary<string, string> _outputHeaders;
 
-        const int StreamCopyToBufferSize = 81920;
-
         private long _bytesWritten = 0;
         public long StartPosition { get; set; }
         public bool AllowEndOfFile = true;
@@ -52,14 +50,14 @@ namespace MediaBrowser.Api.Playback.Progressive
 
         private Stream GetInputStream(bool allowAsyncFileRead)
         {
-            var fileOpenOptions = FileOpenOptions.SequentialScan;
+            var fileOptions = FileOptions.SequentialScan;
 
             if (allowAsyncFileRead)
             {
-                fileOpenOptions |= FileOpenOptions.Asynchronous;
+                fileOptions |= FileOptions.Asynchronous;
             }
 
-            return _fileSystem.GetFileStream(_path, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.ReadWrite, fileOpenOptions);
+            return new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, IODefaults.FileStreamBufferSize, fileOptions);
         }
 
         public async Task WriteToAsync(Stream outputStream, CancellationToken cancellationToken)
@@ -127,7 +125,7 @@ namespace MediaBrowser.Api.Playback.Progressive
 
         private async Task<int> CopyToInternalAsyncWithSyncRead(Stream source, Stream destination, CancellationToken cancellationToken)
         {
-            var array = new byte[StreamCopyToBufferSize];
+            var array = new byte[IODefaults.CopyToBufferSize];
             int bytesRead;
             int totalBytesRead = 0;
 
@@ -154,7 +152,7 @@ namespace MediaBrowser.Api.Playback.Progressive
 
         private async Task<int> CopyToInternalAsync(Stream source, Stream destination, CancellationToken cancellationToken)
         {
-            var array = new byte[StreamCopyToBufferSize];
+            var array = new byte[IODefaults.CopyToBufferSize];
             int bytesRead;
             int totalBytesRead = 0;
 

+ 0 - 1
MediaBrowser.Api/Playback/StreamRequest.cs

@@ -1,4 +1,3 @@
-using System;
 using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Model.Services;
 

+ 1 - 1
MediaBrowser.Api/Playback/StreamState.cs

@@ -103,7 +103,7 @@ namespace MediaBrowser.Api.Playback
             _mediaSourceManager = mediaSourceManager;
         }
 
-        public override void ReportTranscodingProgress(TimeSpan? transcodingPosition, float framerate, double? percentComplete, long bytesTranscoded, int? bitRate)
+        public override void ReportTranscodingProgress(TimeSpan? transcodingPosition, float? framerate, double? percentComplete, long? bytesTranscoded, int? bitRate)
         {
             ApiEntryPoint.Instance.ReportTranscodingProgress(TranscodingJob, this, transcodingPosition, framerate, percentComplete, bytesTranscoded, bitRate);
         }

+ 2 - 2
MediaBrowser.Api/Session/SessionsService.cs

@@ -18,7 +18,7 @@ using Microsoft.Extensions.Logging;
 namespace MediaBrowser.Api.Session
 {
     /// <summary>
-    /// Class GetSessions
+    /// Class GetSessions.
     /// </summary>
     [Route("/Sessions", "GET", Summary = "Gets a list of sessions")]
     [Authenticated]
@@ -34,7 +34,7 @@ namespace MediaBrowser.Api.Session
     }
 
     /// <summary>
-    /// Class DisplayContent
+    /// Class DisplayContent.
     /// </summary>
     [Route("/Sessions/{Id}/Viewing", "POST", Summary = "Instructs a session to browse to an item or view")]
     [Authenticated]

+ 0 - 1
MediaBrowser.Api/System/ActivityLogWebSocketListener.cs

@@ -1,5 +1,4 @@
 using System.Collections.Generic;
-using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Activity;

+ 2 - 2
MediaBrowser.Api/System/SystemService.cs

@@ -170,10 +170,10 @@ namespace MediaBrowser.Api.System
             // For older files, assume fully static
             if (file.LastWriteTimeUtc < DateTime.UtcNow.AddHours(-1))
             {
-                return ResultFactory.GetStaticFileResult(Request, file.FullName, FileShareMode.Read);
+                return ResultFactory.GetStaticFileResult(Request, file.FullName, FileShare.Read);
             }
 
-            return ResultFactory.GetStaticFileResult(Request, file.FullName, FileShareMode.ReadWrite);
+            return ResultFactory.GetStaticFileResult(Request, file.FullName, FileShare.ReadWrite);
         }
 
         /// <summary>

+ 0 - 1
MediaBrowser.Api/UserLibrary/GenresService.cs

@@ -5,7 +5,6 @@ using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Net;
-using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Querying;

+ 0 - 1
MediaBrowser.Api/UserLibrary/PersonsService.cs

@@ -6,7 +6,6 @@ using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Net;
-using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Services;

+ 0 - 1
MediaBrowser.Api/UserLibrary/YearsService.cs

@@ -6,7 +6,6 @@ using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Net;
-using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Services;
 using Microsoft.Extensions.Logging;

+ 2 - 2
MediaBrowser.Api/UserService.cs

@@ -281,7 +281,6 @@ namespace MediaBrowser.Api
             {
                 IsHidden = false,
                 IsDisabled = false
-
             }, true, true);
         }
 
@@ -395,10 +394,11 @@ namespace MediaBrowser.Api
                 throw new MethodNotAllowedException("Hashed-only passwords are not valid for this API.");
             }
 
+            // Password should always be null
             return Post(new AuthenticateUserByName
             {
                 Username = user.Name,
-                Password = null, // This should always be null
+                Password = null,
                 Pw = request.Pw
             });
         }

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

@@ -12,7 +12,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.1" />
     <PackageReference Include="Microsoft.Net.Http.Headers" Version="2.2.8" />
   </ItemGroup>
 

+ 1 - 8
MediaBrowser.Controller/Entities/UserRootFolder.cs

@@ -60,14 +60,7 @@ namespace MediaBrowser.Controller.Entities
                 PresetViews = query.PresetViews
             });
 
-            var itemsArray = result;
-            var totalCount = itemsArray.Length;
-
-            return new QueryResult<BaseItem>
-            {
-                TotalRecordCount = totalCount,
-                Items = itemsArray //TODO Fix The co-variant conversion between Folder[] and BaseItem[], this can generate runtime issues.
-            };
+            return UserViewBuilder.SortAndPage(result, null, query, LibraryManager, true);
         }
 
         public override int GetChildCount(User user)

+ 0 - 1
MediaBrowser.Controller/Entities/Video.cs

@@ -7,7 +7,6 @@ using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.LiveTv;
-using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Dto;

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

@@ -8,7 +8,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.0.0" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.1" />
   </ItemGroup>
 
   <ItemGroup>

+ 14 - 14
MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs

@@ -475,7 +475,7 @@ namespace MediaBrowser.Controller.MediaEncoding
                     .Append(' ');
             }
 
-            if (state.IsVideoRequest 
+            if (state.IsVideoRequest
                 && string.Equals(encodingOptions.HardwareAccelerationType, "qsv", StringComparison.OrdinalIgnoreCase))
             {
                 var videoDecoder = GetHardwareAcceleratedVideoDecoder(state, encodingOptions);
@@ -486,11 +486,11 @@ namespace MediaBrowser.Controller.MediaEncoding
                     if (!string.IsNullOrEmpty(videoDecoder) && videoDecoder.Contains("qsv", StringComparison.OrdinalIgnoreCase))
                     {
                         arg.Append("-hwaccel qsv ");
-                    } 
-                    else 
+                    }
+                    else
                     {
                         arg.Append("-init_hw_device qsv=hw -filter_hw_device hw ");
-                    }	
+                    }
                 }
 
                 arg.Append(videoDecoder + " ");
@@ -653,7 +653,7 @@ namespace MediaBrowser.Controller.MediaEncoding
             //     _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(fallbackFontPath));
             //     using (var stream = _assemblyInfo.GetManifestResourceStream(GetType(), GetType().Namespace + ".DroidSansFallback.ttf"))
             //     {
-            //         using (var fileStream = _fileSystem.GetFileStream(fallbackFontPath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
+            //         using (var fileStream = new FileStream(fallbackFontPath, FileMode.Create, FileAccess.Write, FileShare.Read))
             //         {
             //             stream.CopyTo(fileStream);
             //         }
@@ -1624,22 +1624,22 @@ namespace MediaBrowser.Controller.MediaEncoding
             // Setup default filtergraph utilizing FFMpeg overlay() and FFMpeg scale() (see the return of this function for index reference)
             var retStr = " -filter_complex \"[{0}:{1}]{4}[sub];[0:{2}][sub]overlay{3}\"";
 
-            if (string.Equals(outputVideoCodec, "h264_qsv", StringComparison.OrdinalIgnoreCase)) 
+            if (string.Equals(outputVideoCodec, "h264_qsv", StringComparison.OrdinalIgnoreCase))
             {
                 /*
                     QSV in FFMpeg can now setup hardware overlay for transcodes.
                     For software decoding and hardware encoding option, frames must be hwuploaded into hardware
-                    with fixed frame size. 
+                    with fixed frame size.
                 */
                 if (!string.IsNullOrEmpty(videoDecoder) && videoDecoder.Contains("qsv", StringComparison.OrdinalIgnoreCase))
                 {
                     retStr = " -filter_complex \"[{0}:{1}]{4}[sub];[0:{2}][sub]overlay_qsv=x=(W-w)/2:y=(H-h)/2{3}\"";
-                } 
-                else 
+                }
+                else
                 {
                     retStr = " -filter_complex \"[{0}:{1}]{4}[sub];[0:{2}]hwupload=extra_hw_frames=64[v];[v][sub]overlay_qsv=x=(W-w)/2:y=(H-h)/2{3}\"";
                 }
-            } 
+            }
 
             return string.Format(
                 CultureInfo.InvariantCulture,
@@ -1731,8 +1731,8 @@ namespace MediaBrowser.Controller.MediaEncoding
                             vaapi_or_qsv,
                             outputWidth,
                             outputHeight));
-                } 
-                else 
+                }
+                else
                 {
                     filters.Add(string.Format(CultureInfo.InvariantCulture, "scale_{0}=format=nv12", vaapi_or_qsv));
                 }
@@ -1979,8 +1979,8 @@ namespace MediaBrowser.Controller.MediaEncoding
 
             var videoDecoder = GetHardwareAcceleratedVideoDecoder(state, options);
 
-            // If we are software decoding, and hardware encoding	  
-            if (string.Equals(outputVideoCodec, "h264_qsv", StringComparison.OrdinalIgnoreCase) 
+            // If we are software decoding, and hardware encoding
+            if (string.Equals(outputVideoCodec, "h264_qsv", StringComparison.OrdinalIgnoreCase)
                 && (string.IsNullOrEmpty(videoDecoder) || !videoDecoder.Contains("qsv", StringComparison.OrdinalIgnoreCase)))
             {
                 filters.Add("format=nv12|qsv");

+ 1 - 1
MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs

@@ -665,7 +665,7 @@ namespace MediaBrowser.Controller.MediaEncoding
         }
 
         public IProgress<double> Progress { get; set; }
-        public virtual void ReportTranscodingProgress(TimeSpan? transcodingPosition, float framerate, double? percentComplete, long bytesTranscoded, int? bitRate)
+        public virtual void ReportTranscodingProgress(TimeSpan? transcodingPosition, float? framerate, double? percentComplete, long? bytesTranscoded, int? bitRate)
         {
             Progress.Report(percentComplete.Value);
         }

+ 0 - 1
MediaBrowser.Controller/MediaEncoding/EncodingJobOptions.cs

@@ -1,6 +1,5 @@
 using System;
 using System.Collections.Generic;
-using System.Globalization;
 using System.Linq;
 using MediaBrowser.Model.Dlna;
 using MediaBrowser.Model.Services;

+ 10 - 2
MediaBrowser.Controller/MediaEncoding/JobLogger.cs

@@ -4,7 +4,6 @@ using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
-using MediaBrowser.Model.Extensions;
 using Microsoft.Extensions.Logging;
 
 namespace MediaBrowser.Controller.MediaEncoding
@@ -90,6 +89,15 @@ namespace MediaBrowser.Controller.MediaEncoding
                         framerate = val;
                     }
                 }
+                else if (part.StartsWith("fps=", StringComparison.OrdinalIgnoreCase))
+                {
+                    var rate = part.Split(new[] { '=' }, 2)[^1];
+
+                    if (float.TryParse(rate, NumberStyles.Any, _usCulture, out var val))
+                    {
+                        framerate = val;
+                    }
+                }
                 else if (state.RunTimeTicks.HasValue &&
                     part.StartsWith("time=", StringComparison.OrdinalIgnoreCase))
                 {
@@ -146,7 +154,7 @@ namespace MediaBrowser.Controller.MediaEncoding
 
             if (framerate.HasValue || percent.HasValue)
             {
-                state.ReportTranscodingProgress(transcodingPosition, 0, percent, 0, bitRate);
+                state.ReportTranscodingProgress(transcodingPosition, framerate, percent, bytesTranscoded, bitRate);
             }
         }
     }

+ 1 - 3
MediaBrowser.Controller/Net/IHttpResultFactory.cs

@@ -2,8 +2,6 @@ using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Threading.Tasks;
-
-using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Services;
 
 namespace MediaBrowser.Controller.Net
@@ -66,7 +64,7 @@ namespace MediaBrowser.Controller.Net
         /// <param name="path">The path.</param>
         /// <param name="fileShare">The file share.</param>
         /// <returns>System.Object.</returns>
-        Task<object> GetStaticFileResult(IRequest requestContext, string path, FileShareMode fileShare = FileShareMode.Read);
+        Task<object> GetStaticFileResult(IRequest requestContext, string path, FileShare fileShare = FileShare.Read);
 
         /// <summary>
         /// Gets the static file result.

+ 0 - 1
MediaBrowser.Controller/Net/IWebSocketConnection.cs

@@ -3,7 +3,6 @@ using System.Net.WebSockets;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Model.Net;
-using MediaBrowser.Model.Services;
 using Microsoft.AspNetCore.Http;
 
 namespace MediaBrowser.Controller.Net

+ 2 - 4
MediaBrowser.Controller/Net/StaticResultOptions.cs

@@ -3,8 +3,6 @@ using System.Collections.Generic;
 using System.IO;
 using System.Threading.Tasks;
 
-using MediaBrowser.Model.IO;
-
 namespace MediaBrowser.Controller.Net
 {
     public class StaticResultOptions
@@ -24,12 +22,12 @@ namespace MediaBrowser.Controller.Net
         public string Path { get; set; }
         public long? ContentLength { get; set; }
 
-        public FileShareMode FileShare { get; set; }
+        public FileShare FileShare { get; set; }
 
         public StaticResultOptions()
         {
             ResponseHeaders = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
-            FileShare = FileShareMode.Read;
+            FileShare = FileShare.Read;
         }
     }
 

+ 0 - 1
MediaBrowser.Controller/Persistence/MediaAttachmentQuery.cs

@@ -1,5 +1,4 @@
 using System;
-using MediaBrowser.Model.Entities;
 
 namespace MediaBrowser.Controller.Persistence
 {

+ 2 - 8
MediaBrowser.Controller/Session/SessionInfo.cs

@@ -126,12 +126,6 @@ namespace MediaBrowser.Controller.Session
         [JsonIgnore]
         public ISessionController[] SessionControllers { get; set; }
 
-        /// <summary>
-        /// Gets or sets the application icon URL.
-        /// </summary>
-        /// <value>The application icon URL.</value>
-        public string AppIconUrl { get; set; }
-
         /// <summary>
         /// Gets or sets the supported commands.
         /// </summary>
@@ -259,7 +253,7 @@ namespace MediaBrowser.Controller.Session
 
             foreach (var additionalUser in AdditionalUsers)
             {
-                if (userId.Equals(userId))
+                if (additionalUser.UserId.Equals(userId))
                 {
                     return true;
                 }
@@ -321,7 +315,7 @@ namespace MediaBrowser.Controller.Session
 
             var newPositionTicks = positionTicks + ProgressIncrement;
             var item = progressInfo.Item;
-            long? runtimeTicks = item == null ? null : item.RunTimeTicks;
+            long? runtimeTicks = item?.RunTimeTicks;
 
             // Don't report beyond the runtime
             if (runtimeTicks.HasValue && newPositionTicks >= runtimeTicks.Value)

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно