瀏覽代碼

Merge branch 'master' into culture

Bond-009 6 年之前
父節點
當前提交
1ea219bf3f
共有 100 個文件被更改,包括 498 次插入840 次删除
  1. 6 6
      .github/ISSUE_TEMPLATE/bug_report.md
  2. 4 4
      .github/ISSUE_TEMPLATE/enhancement-request.md
  3. 2 2
      .github/ISSUE_TEMPLATE/feature_request.md
  4. 5 3
      .github/pull_request_template.md
  5. 3 3
      BDInfo/BDROM.cs
  6. 2 2
      BDInfo/TSPlaylistFile.cs
  7. 2 2
      BDInfo/TSStreamClipFile.cs
  8. 1 0
      CONTRIBUTORS.md
  9. 2 12
      Dockerfile
  10. 1 1
      Emby.Dlna/Didl/DidlBuilder.cs
  11. 2 2
      Emby.Dlna/DlnaManager.cs
  12. 3 3
      Emby.Drawing/ImageProcessor.cs
  13. 6 6
      Emby.IsoMounting/IsoMounter/LinuxIsoManager.cs
  14. 9 57
      Emby.Naming/Video/VideoListResolver.cs
  15. 0 1
      Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs
  16. 9 9
      Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs
  17. 3 3
      Emby.Server.Implementations/AppBase/ConfigurationHelper.cs
  18. 4 78
      Emby.Server.Implementations/ApplicationHost.cs
  19. 3 3
      Emby.Server.Implementations/Archiving/ZipClient.cs
  20. 2 2
      Emby.Server.Implementations/Channels/ChannelManager.cs
  21. 3 3
      Emby.Server.Implementations/Collections/CollectionManager.cs
  22. 2 2
      Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs
  23. 2 2
      Emby.Server.Implementations/Devices/DeviceId.cs
  24. 5 5
      Emby.Server.Implementations/Devices/DeviceManager.cs
  25. 5 5
      Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs
  26. 12 22
      Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs
  27. 2 2
      Emby.Server.Implementations/IO/FileRefresher.cs
  28. 4 4
      Emby.Server.Implementations/IO/LibraryMonitor.cs
  29. 45 152
      Emby.Server.Implementations/IO/ManagedFileSystem.cs
  30. 2 2
      Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs
  31. 3 3
      Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs
  32. 2 1
      Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
  33. 42 47
      Emby.Server.Implementations/Library/LibraryManager.cs
  34. 1 1
      Emby.Server.Implementations/Library/MediaSourceManager.cs
  35. 1 1
      Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs
  36. 13 11
      Emby.Server.Implementations/Library/UserManager.cs
  37. 3 2
      Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs
  38. 17 17
      Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
  39. 2 2
      Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
  40. 1 1
      Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
  41. 8 8
      Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs
  42. 1 1
      Emby.Server.Implementations/LiveTv/TunerHosts/BaseTunerHost.cs
  43. 1 1
      Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs
  44. 1 1
      Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
  45. 2 1
      Emby.Server.Implementations/LiveTv/TunerHosts/SharedHttpStream.cs
  46. 3 3
      Emby.Server.Implementations/Localization/LocalizationManager.cs
  47. 2 2
      Emby.Server.Implementations/MediaEncoder/EncodingManager.cs
  48. 13 8
      Emby.Server.Implementations/Playlists/PlaylistManager.cs
  49. 3 3
      Emby.Server.Implementations/ResourceFileManager.cs
  50. 16 12
      Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs
  51. 17 35
      Emby.Server.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
  52. 1 1
      Emby.Server.Implementations/ScheduledTasks/TaskManager.cs
  53. 1 1
      Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
  54. 1 1
      Emby.Server.Implementations/Serialization/XmlSerializer.cs
  55. 5 5
      Emby.Server.Implementations/Updates/InstallationManager.cs
  56. 21 0
      Jellyfin.Drawing.Skia/Properties/AssemblyInfo.cs
  57. 5 5
      Jellyfin.Drawing.Skia/SkiaEncoder.cs
  58. 1 1
      MediaBrowser.Api/ApiEntryPoint.cs
  59. 5 5
      MediaBrowser.Api/EnvironmentService.cs
  60. 10 10
      MediaBrowser.Api/Images/ImageByNameService.cs
  61. 6 6
      MediaBrowser.Api/Images/RemoteImageService.cs
  62. 6 6
      MediaBrowser.Api/ItemLookupService.cs
  63. 4 4
      MediaBrowser.Api/Library/LibraryStructureService.cs
  64. 3 3
      MediaBrowser.Api/Playback/BaseStreamingService.cs
  65. 3 3
      MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
  66. 8 8
      MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
  67. 3 2
      MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
  68. 8 18
      MediaBrowser.Api/PluginService.cs
  69. 8 1
      MediaBrowser.Api/StartupWizardService.cs
  70. 5 5
      MediaBrowser.Api/UserLibrary/PlaystateService.cs
  71. 2 1
      MediaBrowser.Controller/Drawing/ImageHelper.cs
  72. 7 6
      MediaBrowser.Controller/Entities/BaseItem.cs
  73. 1 1
      MediaBrowser.Controller/Entities/Game.cs
  74. 1 1
      MediaBrowser.Controller/Entities/TV/Season.cs
  75. 6 5
      MediaBrowser.Controller/Entities/User.cs
  76. 1 1
      MediaBrowser.Controller/Entities/Video.cs
  77. 1 1
      MediaBrowser.Controller/Library/ItemResolveArgs.cs
  78. 2 2
      MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
  79. 1 1
      MediaBrowser.Controller/Playlists/Playlist.cs
  80. 0 5
      MediaBrowser.Controller/Subtitles/ISubtitleManager.cs
  81. 3 2
      MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
  82. 1 1
      MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs
  83. 1 1
      MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs
  84. 1 1
      MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs
  85. 1 1
      MediaBrowser.MediaEncoding/Configuration/EncodingConfigurationFactory.cs
  86. 3 3
      MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs
  87. 7 7
      MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
  88. 1 1
      MediaBrowser.MediaEncoding/Subtitles/OpenSubtitleDownloader.cs
  89. 10 10
      MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
  90. 18 124
      MediaBrowser.Model/IO/IFileSystem.cs
  91. 1 1
      MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs
  92. 9 9
      MediaBrowser.Providers/Manager/ImageSaver.cs
  93. 1 1
      MediaBrowser.Providers/Manager/ItemImageProvider.cs
  94. 1 1
      MediaBrowser.Providers/Manager/ProviderManager.cs
  95. 3 3
      MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs
  96. 2 1
      MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs
  97. 2 2
      MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs
  98. 1 1
      MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs
  99. 2 1
      MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs
  100. 1 1
      MediaBrowser.Providers/Movies/MovieDbProvider.cs

+ 6 - 6
.github/ISSUE_TEMPLATE/bug_report.md

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

+ 4 - 4
.github/ISSUE_TEMPLATE/enhancement-request.md

@@ -8,13 +8,13 @@ assignees: ''
 ---
 
 **Is your feature request related to a problem? Please describe.**
-A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
 
 **Describe the solution you'd like**
-A clear and concise description of what you want to happen.
+<!-- A clear and concise description of what you want to happen. -->
 
 **Describe alternatives you've considered**
-A clear and concise description of any alternative solutions or features you've considered.
+<!-- A clear and concise description of any alternative solutions or features you've considered. -->
 
 **Additional context**
-Add any other context or screenshots about the feature request here.
+<!-- Add any other context or screenshots about the feature request here. -->

+ 2 - 2
.github/ISSUE_TEMPLATE/feature_request.md

@@ -8,7 +8,7 @@ assignees: ''
 ---
 
 **Describe the feature you'd like**
-A clear and concise description of what you want to happen.
+<!-- A clear and concise description of what you want to happen. -->
 
 **Additional context**
-Add any other context or screenshots about the feature request here.
+<!-- Add any other context or screenshots about the feature request here. -->

+ 5 - 3
.github/pull_request_template.md

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

+ 3 - 3
BDInfo/BDROM.cs

@@ -92,7 +92,7 @@ namespace BDInfo
             }
 
             DirectoryRoot =
-                _fileSystem.GetDirectoryInfo(_fileSystem.GetDirectoryName(DirectoryBDMV.FullName));
+                _fileSystem.GetDirectoryInfo(Path.GetDirectoryName(DirectoryBDMV.FullName));
             DirectoryBDJO =
                 GetDirectory("BDJO", DirectoryBDMV, 0);
             DirectoryCLIPINF =
@@ -150,7 +150,7 @@ namespace BDInfo
                 Is3D = true;
             }
 
-            if (_fileSystem.FileExists(Path.Combine(DirectoryRoot.FullName, "FilmIndex.xml")))
+            if (File.Exists(Path.Combine(DirectoryRoot.FullName, "FilmIndex.xml")))
             {
                 IsDBOX = true;
             }
@@ -345,7 +345,7 @@ namespace BDInfo
                 {
                     return dir;
                 }
-                var parentFolder = _fileSystem.GetDirectoryName(dir.FullName);
+                var parentFolder = Path.GetDirectoryName(dir.FullName);
                 if (string.IsNullOrEmpty(parentFolder))
                 {
                     dir = null;

+ 2 - 2
BDInfo/TSPlaylistFile.cs

@@ -1,4 +1,4 @@
-//============================================================================
+//============================================================================
 // BDInfo - Blu-ray Video and Audio Analysis Tool
 // Copyright © 2010 Cinema Squid
 //
@@ -231,7 +231,7 @@ namespace BDInfo
                 Streams.Clear();
                 StreamClips.Clear();
 
-                fileStream = _fileSystem.OpenRead(FileInfo.FullName);
+                fileStream = File.OpenRead(FileInfo.FullName);
                 fileReader = new BinaryReader(fileStream);
 
                 byte[] data = new byte[fileStream.Length];

+ 2 - 2
BDInfo/TSStreamClipFile.cs

@@ -1,4 +1,4 @@
-//============================================================================
+//============================================================================
 // BDInfo - Blu-ray Video and Audio Analysis Tool
 // Copyright © 2010 Cinema Squid
 //
@@ -57,7 +57,7 @@ namespace BDInfo
 #endif
                 Streams.Clear();
 
-                fileStream = _fileSystem.OpenRead(FileInfo.FullName);
+                fileStream = File.OpenRead(FileInfo.FullName);
                 fileReader = new BinaryReader(fileStream);
 
                 byte[] data = new byte[fileStream.Length];

+ 1 - 0
CONTRIBUTORS.md

@@ -16,6 +16,7 @@
  - [wtayl0r](https://github.com/wtayl0r)
  - [TtheCreator](https://github.com/Tthecreator)
  - [LogicalPhallacy](https://github.com/LogicalPhallacy/)
+ - [RazeLighter777](https://github.com/RazeLighter777)
 
 # Emby Contributors
 

+ 2 - 12
Dockerfile

@@ -1,15 +1,5 @@
 ARG DOTNET_VERSION=2
 
-
-# Download ffmpeg first to allow quicker rebuild of other layers
-FROM alpine as ffmpeg
-ARG FFMPEG_URL=https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.0.3-64bit-static.tar.xz
-RUN wget ${FFMPEG_URL} -O - | tar Jxf - \
- && mkdir ffmpeg-bin \
- && mv ffmpeg*/ffmpeg ffmpeg-bin \
- && mv ffmpeg*/ffprobe ffmpeg-bin
-
-
 FROM microsoft/dotnet:${DOTNET_VERSION}-sdk as builder
 WORKDIR /repo
 COPY . .
@@ -20,7 +10,7 @@ RUN export DOTNET_CLI_TELEMETRY_OPTOUT=1 \
     --output /jellyfin \
     Jellyfin.Server
 
-
+FROM jrottenberg/ffmpeg:4.0-scratch as ffmpeg
 FROM microsoft/dotnet:${DOTNET_VERSION}-runtime
 # libfontconfig1 is required for Skia
 RUN apt-get update \
@@ -29,8 +19,8 @@ RUN apt-get update \
  && apt-get clean autoclean \
  && apt-get autoremove \
  && rm -rf /var/lib/{apt,dpkg,cache,log}
+COPY --from=ffmpeg / /
 COPY --from=builder /jellyfin /jellyfin
-COPY --from=ffmpeg /ffmpeg-bin/* /usr/bin/
 EXPOSE 8096
 VOLUME /config /media
 ENTRYPOINT dotnet /jellyfin/jellyfin.dll -programdata /config

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

@@ -932,7 +932,7 @@ namespace Emby.Dlna.Didl
 
         private void AddCover(BaseItem item, BaseItem context, StubType? stubType, XmlWriter writer)
         {
-            ImageDownloadInfo imageInfo = GetImageInfo(item);;
+            ImageDownloadInfo imageInfo = GetImageInfo(item);
 
             if (imageInfo == null)
             {

+ 2 - 2
Emby.Dlna/DlnaManager.cs

@@ -379,7 +379,7 @@ namespace Emby.Dlna
 
                     if (!fileInfo.Exists || fileInfo.Length != stream.Length)
                     {
-                        _fileSystem.CreateDirectory(systemProfilesPath);
+                        Directory.CreateDirectory(systemProfilesPath);
 
                         using (var fileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
                         {
@@ -390,7 +390,7 @@ namespace Emby.Dlna
             }
 
             // Not necessary, but just to make it easy to find
-            _fileSystem.CreateDirectory(UserProfilesPath);
+            Directory.CreateDirectory(UserProfilesPath);
         }
 
         public void DeleteProfile(string id)

+ 3 - 3
Emby.Drawing/ImageProcessor.cs

@@ -244,7 +244,7 @@ namespace Emby.Drawing
 
             try
             {
-                if (!_fileSystem.FileExists(cacheFilePath))
+                if (!File.Exists(cacheFilePath))
                 {
                     if (options.CropWhiteSpace && !SupportsTransparency(originalImagePath))
                     {
@@ -626,12 +626,12 @@ namespace Emby.Drawing
             try
             {
                 // Check again in case of contention
-                if (_fileSystem.FileExists(enhancedImagePath))
+                if (File.Exists(enhancedImagePath))
                 {
                     return (enhancedImagePath, treatmentRequiresTransparency);
                 }
 
-                _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(enhancedImagePath));
+                Directory.CreateDirectory(Path.GetDirectoryName(enhancedImagePath));
 
                 await ExecuteImageEnhancers(supportedEnhancers, originalImagePath, enhancedImagePath, item, imageType, imageIndex).ConfigureAwait(false);
 

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

@@ -39,7 +39,7 @@ namespace IsoMounter
             _logger = logger;
             ProcessFactory = processFactory;
 
-            MountPointRoot = FileSystem.DirectorySeparatorChar + "tmp" + FileSystem.DirectorySeparatorChar + "Emby";
+            MountPointRoot = Path.DirectorySeparatorChar + "tmp" + Path.DirectorySeparatorChar + "Emby";
 
             _logger.LogDebug(
                 "[{0}] System PATH is currently set to [{1}].",
@@ -214,9 +214,9 @@ namespace IsoMounter
             {
                 string path = test.Trim();
 
-                if (!string.IsNullOrEmpty(path) && FileSystem.FileExists(path = Path.Combine(path, name)))
+                if (!string.IsNullOrEmpty(path) && File.Exists(path = Path.Combine(path, name)))
                 {
-                    return FileSystem.GetFullPath(path);
+                    return Path.GetFullPath(path);
                 }
             }
 
@@ -326,7 +326,7 @@ namespace IsoMounter
 
             try
             {
-                FileSystem.CreateDirectory(mountPoint);
+                Directory.CreateDirectory(mountPoint);
             }
             catch (UnauthorizedAccessException)
             {
@@ -376,7 +376,7 @@ namespace IsoMounter
 
                 try
                 {
-                    FileSystem.DeleteDirectory(mountPoint, false);
+                    Directory.Delete(mountPoint, false);
                 }
                 catch (Exception ex)
                 {
@@ -454,7 +454,7 @@ namespace IsoMounter
 
             try
             {
-                FileSystem.DeleteDirectory(mount.MountedPath, false);
+                Directory.Delete(mount.MountedPath, false);
             }
             catch (Exception ex)
             {

+ 9 - 57
Emby.Naming/Video/VideoListResolver.cs

@@ -175,71 +175,23 @@ namespace Emby.Naming.Video
                 return videos;
             }
 
-            var list = new List<VideoInfo>();
-
             var folderName = Path.GetFileName(Path.GetDirectoryName(videos[0].Files[0].Path));
 
             if (!string.IsNullOrEmpty(folderName) && folderName.Length > 1)
             {
-                if (videos.All(i => i.Files.Count == 1 && IsEligibleForMultiVersion(folderName, i.Files[0].Path)))
-                {
-                    // Enforce the multi-version limit
-                    if (videos.Count <= 8 && HaveSameYear(videos))
-                    {
-                        var ordered = videos.OrderBy(i => i.Name).ToList();
-
-                        list.Add(ordered[0]);
-
-                        list[0].AlternateVersions = ordered.Skip(1).Select(i => i.Files[0]).ToList();
-                        list[0].Name = folderName;
-                        list[0].Extras.AddRange(ordered.Skip(1).SelectMany(i => i.Extras));
+                var ordered = videos.OrderBy(i => i.Name);
 
-                        return list;
-                    }
-                }
+                return ordered.GroupBy(v => new {v.Name, v.Year}).Select(group => new VideoInfo
+                {
+                    Name = folderName,
+                    Year = group.First().Year,
+                    Files = group.First().Files,
+                    AlternateVersions = group.Skip(1).Select(i => i.Files[0]).ToList(),
+                    Extras = group.First().Extras.Concat(group.Skip(1).SelectMany(i => i.Extras)).ToList()
+                });
             }
 
             return videos;
-            //foreach (var video in videos.OrderBy(i => i.Name))
-            //{
-            //    var match = list
-            //        .FirstOrDefault(i => string.Equals(i.Name, video.Name, StringComparison.OrdinalIgnoreCase));
-
-            //    if (match != null && video.Files.Count == 1 && match.Files.Count == 1)
-            //    {
-            //        match.AlternateVersions.Add(video.Files[0]);
-            //        match.Extras.AddRange(video.Extras);
-            //    }
-            //    else
-            //    {
-            //        list.Add(video);
-            //    }
-            //}
-
-            //return list;
-        }
-
-        private bool HaveSameYear(List<VideoInfo> videos)
-        {
-            return videos.Select(i => i.Year ?? -1).Distinct().Count() < 2;
-        }
-
-        private bool IsEligibleForMultiVersion(string folderName, string testFilename)
-        {
-            testFilename = Path.GetFileNameWithoutExtension(testFilename);
-
-            if (string.Equals(folderName, testFilename, StringComparison.OrdinalIgnoreCase))
-            {
-                return true;
-            }
-
-            if (testFilename.StartsWith(folderName, StringComparison.OrdinalIgnoreCase))
-            {
-                testFilename = testFilename.Substring(folderName.Length).Trim();
-                return testFilename.StartsWith("-", StringComparison.OrdinalIgnoreCase) || Regex.Replace(testFilename, @"\[([^]]*)\]", "").Trim() == string.Empty;
-            }
-
-            return false;
         }
 
         private List<VideoFileInfo> GetExtras(IEnumerable<VideoFileInfo> remainingFiles, List<string> baseNames)

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

@@ -501,7 +501,6 @@ namespace Emby.Server.Implementations.Activity
             _sessionManager.PlaybackStart -= _sessionManager_PlaybackStart;
             _sessionManager.PlaybackStopped -= _sessionManager_PlaybackStopped;
 
-            _subManager.SubtitlesDownloaded -= _subManager_SubtitlesDownloaded;
             _subManager.SubtitleDownloadFailure -= _subManager_SubtitleDownloadFailure;
 
             _userManager.UserCreated -= _userManager_UserCreated;

+ 9 - 9
Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs

@@ -127,7 +127,7 @@ namespace Emby.Server.Implementations.AppBase
             Logger.LogInformation("Saving system configuration");
             var path = CommonApplicationPaths.SystemConfigurationFilePath;
 
-            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(path));
+            Directory.CreateDirectory(Path.GetDirectoryName(path));
 
             lock (_configurationSyncLock)
             {
@@ -197,7 +197,7 @@ namespace Emby.Server.Implementations.AppBase
                 && !string.Equals(CommonConfiguration.CachePath ?? string.Empty, newPath))
             {
                 // Validate
-                if (!FileSystem.DirectoryExists(newPath))
+                if (!Directory.Exists(newPath))
                 {
                     throw new FileNotFoundException(string.Format("{0} does not exist.", newPath));
                 }
@@ -209,8 +209,7 @@ namespace Emby.Server.Implementations.AppBase
         protected void EnsureWriteAccess(string path)
         {
             var file = Path.Combine(path, Guid.NewGuid().ToString());
-
-            FileSystem.WriteAllText(file, string.Empty);
+            File.WriteAllText(file, string.Empty);
             FileSystem.DeleteFile(file);
         }
 
@@ -246,13 +245,14 @@ namespace Emby.Server.Implementations.AppBase
 
         private object LoadConfiguration(string path, Type configurationType)
         {
-            try
+            if (!File.Exists(path))
             {
-                return XmlSerializer.DeserializeFromFile(configurationType, path);
+                return Activator.CreateInstance(configurationType);
             }
-            catch (FileNotFoundException)
+
+            try
             {
-                return Activator.CreateInstance(configurationType);
+                return XmlSerializer.DeserializeFromFile(configurationType, path);
             }
             catch (IOException)
             {
@@ -293,7 +293,7 @@ namespace Emby.Server.Implementations.AppBase
             _configurations.AddOrUpdate(key, configuration, (k, v) => configuration);
 
             var path = GetConfigurationFile(key);
-            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(path));
+            Directory.CreateDirectory(Path.GetDirectoryName(path));
 
             lock (_configurationSyncLock)
             {

+ 3 - 3
Emby.Server.Implementations/AppBase/ConfigurationHelper.cs

@@ -29,7 +29,7 @@ namespace Emby.Server.Implementations.AppBase
             // Use try/catch to avoid the extra file system lookup using File.Exists
             try
             {
-                buffer = fileSystem.ReadAllBytes(path);
+                buffer = File.ReadAllBytes(path);
 
                 configuration = xmlSerializer.DeserializeFromBytes(type, buffer);
             }
@@ -48,10 +48,10 @@ namespace Emby.Server.Implementations.AppBase
                 // If the file didn't exist before, or if something has changed, re-save
                 if (buffer == null || !buffer.SequenceEqual(newBytes))
                 {
-                    fileSystem.CreateDirectory(fileSystem.GetDirectoryName(path));
+                    Directory.CreateDirectory(Path.GetDirectoryName(path));
 
                     // Save it after load in case we got new items
-                    fileSystem.WriteAllBytes(path, newBytes);
+                    File.WriteAllBytes(path, newBytes);
                 }
 
                 return configuration;

+ 4 - 78
Emby.Server.Implementations/ApplicationHost.cs

@@ -112,7 +112,6 @@ using ServiceStack;
 using ServiceStack.Text.Jsv;
 using StringExtensions = MediaBrowser.Controller.Extensions.StringExtensions;
 using X509Certificate = System.Security.Cryptography.X509Certificates.X509Certificate;
-using UtfUnknown;
 
 namespace Emby.Server.Implementations
 {
@@ -881,7 +880,7 @@ namespace Emby.Server.Implementations
             MediaSourceManager = new MediaSourceManager(ItemRepository, ApplicationPaths, LocalizationManager, UserManager, LibraryManager, LoggerFactory, JsonSerializer, FileSystemManager, UserDataManager, TimerFactory, () => MediaEncoder);
             RegisterSingleInstance(MediaSourceManager);
 
-            SubtitleManager = new SubtitleManager(LoggerFactory, FileSystemManager, LibraryMonitor, MediaSourceManager, ServerConfigurationManager, LocalizationManager);
+            SubtitleManager = new SubtitleManager(LoggerFactory, FileSystemManager, LibraryMonitor, MediaSourceManager, LocalizationManager);
             RegisterSingleInstance(SubtitleManager);
 
             ProviderManager = new ProviderManager(HttpClient, SubtitleManager, ServerConfigurationManager, LibraryMonitor, LoggerFactory, FileSystemManager, ApplicationPaths, () => LibraryManager, JsonSerializer);
@@ -1008,7 +1007,7 @@ namespace Emby.Server.Implementations
 
             try
             {
-                if (!FileSystemManager.FileExists(certificateLocation))
+                if (!File.Exists(certificateLocation))
                 {
                     return null;
                 }
@@ -1434,7 +1433,7 @@ namespace Emby.Server.Implementations
 
             //if (generateCertificate)
             //{
-            //    if (!FileSystemManager.FileExists(certPath))
+            //    if (!File.Exists(certPath))
             //    {
             //        FileSystemManager.CreateDirectory(FileSystemManager.GetDirectoryName(certPath));
 
@@ -1564,7 +1563,7 @@ namespace Emby.Server.Implementations
         /// <returns>IEnumerable{Assembly}.</returns>
         protected List<Tuple<Assembly, string>> GetComposablePartAssemblies()
         {
-            var list = GetPluginAssemblies();
+            var list = GetPluginAssemblies(ApplicationPaths.PluginsPath);
 
             // Gets all plugin assemblies by first reading all bytes of the .dll and calling Assembly.Load against that
             // This will prevent the .dll file from getting locked, and allow us to replace it when needed
@@ -1615,79 +1614,6 @@ namespace Emby.Server.Implementations
 
         protected abstract IEnumerable<Assembly> GetAssembliesWithPartsInternal();
 
-        /// <summary>
-        /// Gets the plugin assemblies.
-        /// </summary>
-        /// <returns>IEnumerable{Assembly}.</returns>
-        private List<Tuple<Assembly, string>> GetPluginAssemblies()
-        {
-            // Copy pre-installed plugins
-            var sourcePath = Path.Combine(ApplicationPaths.ApplicationResourcesPath, "plugins");
-            CopyPlugins(sourcePath, ApplicationPaths.PluginsPath);
-
-            return GetPluginAssemblies(ApplicationPaths.PluginsPath);
-        }
-
-        private void CopyPlugins(string source, string target)
-        {
-            List<string> files;
-
-            try
-            {
-                files = Directory.EnumerateFiles(source, "*.dll", SearchOption.TopDirectoryOnly)
-                   .ToList();
-
-            }
-            catch (DirectoryNotFoundException)
-            {
-                return;
-            }
-
-            if (files.Count == 0)
-            {
-                return;
-            }
-
-            foreach (var sourceFile in files)
-            {
-                var filename = Path.GetFileName(sourceFile);
-                var targetFile = Path.Combine(target, filename);
-
-                var targetFileExists = File.Exists(targetFile);
-
-                if (!targetFileExists && ServerConfigurationManager.Configuration.UninstalledPlugins.Contains(filename, StringComparer.OrdinalIgnoreCase))
-                {
-                    continue;
-                }
-
-                if (targetFileExists && GetDllVersion(targetFile) >= GetDllVersion(sourceFile))
-                {
-                    continue;
-                }
-
-                Directory.CreateDirectory(target);
-                File.Copy(sourceFile, targetFile, true);
-            }
-        }
-
-        private Version GetDllVersion(string path)
-        {
-            try
-            {
-                var result = Version.Parse(FileVersionInfo.GetVersionInfo(path).FileVersion);
-
-                Logger.LogInformation("File {Path} has version {Version}", path, result);
-
-                return result;
-            }
-            catch (Exception ex)
-            {
-                Logger.LogError(ex, "Error getting version number from {Path}", path);
-
-                return new Version(1, 0);
-            }
-        }
-
         private List<Tuple<Assembly, string>> GetPluginAssemblies(string path)
         {
             try

+ 3 - 3
Emby.Server.Implementations/Archiving/ZipClient.cs

@@ -29,7 +29,7 @@ namespace Emby.Server.Implementations.Archiving
         /// <param name="overwriteExistingFiles">if set to <c>true</c> [overwrite existing files].</param>
         public void ExtractAll(string sourceFile, string targetPath, bool overwriteExistingFiles)
         {
-            using (var fileStream = _fileSystem.OpenRead(sourceFile))
+            using (var fileStream = File.OpenRead(sourceFile))
             {
                 ExtractAll(fileStream, targetPath, overwriteExistingFiles);
             }
@@ -115,7 +115,7 @@ namespace Emby.Server.Implementations.Archiving
         /// <param name="overwriteExistingFiles">if set to <c>true</c> [overwrite existing files].</param>
         public void ExtractAllFrom7z(string sourceFile, string targetPath, bool overwriteExistingFiles)
         {
-            using (var fileStream = _fileSystem.OpenRead(sourceFile))
+            using (var fileStream = File.OpenRead(sourceFile))
             {
                 ExtractAllFrom7z(fileStream, targetPath, overwriteExistingFiles);
             }
@@ -155,7 +155,7 @@ namespace Emby.Server.Implementations.Archiving
         /// <param name="overwriteExistingFiles">if set to <c>true</c> [overwrite existing files].</param>
         public void ExtractAllFromTar(string sourceFile, string targetPath, bool overwriteExistingFiles)
         {
-            using (var fileStream = _fileSystem.OpenRead(sourceFile))
+            using (var fileStream = File.OpenRead(sourceFile))
             {
                 ExtractAllFromTar(fileStream, targetPath, overwriteExistingFiles);
             }

+ 2 - 2
Emby.Server.Implementations/Channels/ChannelManager.cs

@@ -355,7 +355,7 @@ namespace Emby.Server.Implementations.Channels
                 return;
             }
 
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+            Directory.CreateDirectory(Path.GetDirectoryName(path));
 
             _jsonSerializer.SerializeToFile(mediaSources, path);
         }
@@ -834,7 +834,7 @@ namespace Emby.Server.Implementations.Channels
         {
             try
             {
-                _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+                Directory.CreateDirectory(Path.GetDirectoryName(path));
 
                 _jsonSerializer.SerializeToFile(result, path);
             }

+ 3 - 3
Emby.Server.Implementations/Collections/CollectionManager.cs

@@ -76,7 +76,7 @@ namespace Emby.Server.Implementations.Collections
                 return null;
             }
 
-            _fileSystem.CreateDirectory(path);
+            Directory.CreateDirectory(path);
 
             var libraryOptions = new LibraryOptions
             {
@@ -133,7 +133,7 @@ namespace Emby.Server.Implementations.Collections
 
             try
             {
-                _fileSystem.CreateDirectory(path);
+                Directory.CreateDirectory(path);
 
                 var collection = new BoxSet
                 {
@@ -359,7 +359,7 @@ namespace Emby.Server.Implementations.Collections
             {
                 var path = _collectionManager.GetCollectionsFolderPath();
 
-                if (_fileSystem.DirectoryExists(path))
+                if (Directory.Exists(path))
                 {
                     try
                     {

+ 2 - 2
Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs

@@ -148,7 +148,7 @@ namespace Emby.Server.Implementations.Configuration
                 && !string.Equals(Configuration.CertificatePath ?? string.Empty, newPath))
             {
                 // Validate
-                if (!FileSystem.FileExists(newPath))
+                if (!File.Exists(newPath))
                 {
                     throw new FileNotFoundException(string.Format("Certificate file '{0}' does not exist.", newPath));
                 }
@@ -168,7 +168,7 @@ namespace Emby.Server.Implementations.Configuration
                 && !string.Equals(Configuration.MetadataPath ?? string.Empty, newPath))
             {
                 // Validate
-                if (!FileSystem.DirectoryExists(newPath))
+                if (!Directory.Exists(newPath))
                 {
                     throw new FileNotFoundException(string.Format("{0} does not exist.", newPath));
                 }

+ 2 - 2
Emby.Server.Implementations/Devices/DeviceId.cs

@@ -53,11 +53,11 @@ namespace Emby.Server.Implementations.Devices
             {
                 var path = CachePath;
 
-                _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+                Directory.CreateDirectory(Path.GetDirectoryName(path));
 
                 lock (_syncLock)
                 {
-                    _fileSystem.WriteAllText(path, id, Encoding.UTF8);
+                    File.WriteAllText(path, id, Encoding.UTF8);
                 }
             }
             catch (Exception ex)

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

@@ -76,7 +76,7 @@ namespace Emby.Server.Implementations.Devices
         public void SaveCapabilities(string deviceId, ClientCapabilities capabilities)
         {
             var path = Path.Combine(GetDevicePath(deviceId), "capabilities.json");
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+            Directory.CreateDirectory(Path.GetDirectoryName(path));
 
             lock (_capabilitiesSyncLock)
             {
@@ -239,7 +239,7 @@ namespace Emby.Server.Implementations.Devices
             path = Path.Combine(path, file.Name);
             path = Path.ChangeExtension(path, MimeTypes.ToExtension(file.MimeType) ?? "jpg");
 
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+            Directory.CreateDirectory(Path.GetDirectoryName(path));
 
             await EnsureLibraryFolder(uploadPathInfo.Item2, uploadPathInfo.Item3).ConfigureAwait(false);
 
@@ -275,7 +275,7 @@ namespace Emby.Server.Implementations.Devices
         private void AddCameraUpload(string deviceId, LocalFileInfo file)
         {
             var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json");
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+            Directory.CreateDirectory(Path.GetDirectoryName(path));
 
             lock (_cameraUploadSyncLock)
             {
@@ -317,7 +317,7 @@ namespace Emby.Server.Implementations.Devices
                 return Task.CompletedTask;
             }
 
-            _fileSystem.CreateDirectory(path);
+            Directory.CreateDirectory(path);
 
             var libraryOptions = new LibraryOptions
             {
@@ -431,7 +431,7 @@ namespace Emby.Server.Implementations.Devices
             {
                 var path = _deviceManager.GetUploadsPath();
 
-                if (_fileSystem.DirectoryExists(path))
+                if (Directory.Exists(path))
                 {
                     try
                     {

+ 5 - 5
Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs

@@ -48,7 +48,7 @@ namespace Emby.Server.Implementations.FFMpeg
             var prebuiltFolder = _appPaths.ProgramSystemPath;
             var prebuiltffmpeg = Path.Combine(prebuiltFolder, downloadInfo.FFMpegFilename);
             var prebuiltffprobe = Path.Combine(prebuiltFolder, downloadInfo.FFProbeFilename);
-            if (_fileSystem.FileExists(prebuiltffmpeg) && _fileSystem.FileExists(prebuiltffprobe))
+            if (File.Exists(prebuiltffmpeg) && File.Exists(prebuiltffprobe))
             {
                 return new FFMpegInfo
                 {
@@ -75,11 +75,11 @@ namespace Emby.Server.Implementations.FFMpeg
                 Version = version
             };
 
-            _fileSystem.CreateDirectory(versionedDirectoryPath);
+            Directory.CreateDirectory(versionedDirectoryPath);
 
             var excludeFromDeletions = new List<string> { versionedDirectoryPath };
 
-            if (!_fileSystem.FileExists(info.ProbePath) || !_fileSystem.FileExists(info.EncoderPath))
+            if (!File.Exists(info.ProbePath) || !File.Exists(info.EncoderPath))
             {
                 // ffmpeg not present. See if there's an older version we can start with
                 var existingVersion = GetExistingVersion(info, rootEncoderPath);
@@ -92,7 +92,7 @@ namespace Emby.Server.Implementations.FFMpeg
                 else
                 {
                     info = existingVersion;
-                    versionedDirectoryPath = _fileSystem.GetDirectoryName(info.EncoderPath);
+                    versionedDirectoryPath = Path.GetDirectoryName(info.EncoderPath);
                     excludeFromDeletions.Add(versionedDirectoryPath);
                 }
             }
@@ -130,7 +130,7 @@ namespace Emby.Server.Implementations.FFMpeg
                     {
                         EncoderPath = encoder,
                         ProbePath = probe,
-                        Version = Path.GetFileName(_fileSystem.GetDirectoryName(probe))
+                        Version = Path.GetFileName(Path.GetDirectoryName(probe))
                     };
                 }
             }

+ 12 - 22
Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs

@@ -286,28 +286,18 @@ namespace Emby.Server.Implementations.HttpClientManager
 
         private HttpResponseInfo GetCachedResponse(string responseCachePath, TimeSpan cacheLength, string url)
         {
-            try
-            {
-                if (_fileSystem.GetLastWriteTimeUtc(responseCachePath).Add(cacheLength) > DateTime.UtcNow)
-                {
-                    var stream = _fileSystem.GetFileStream(responseCachePath, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.Read, true);
-
-                    return new HttpResponseInfo
-                    {
-                        ResponseUrl = url,
-                        Content = stream,
-                        StatusCode = HttpStatusCode.OK,
-                        ContentLength = stream.Length
-                    };
-                }
-            }
-            catch (FileNotFoundException) // REVIEW: @bond Is this really faster?
-            {
-
-            }
-            catch (DirectoryNotFoundException)
+            if (File.Exists(responseCachePath)
+                && _fileSystem.GetLastWriteTimeUtc(responseCachePath).Add(cacheLength) > DateTime.UtcNow)
             {
+                var stream = _fileSystem.GetFileStream(responseCachePath, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.Read, true);
 
+                return new HttpResponseInfo
+                {
+                    ResponseUrl = url,
+                    Content = stream,
+                    StatusCode = HttpStatusCode.OK,
+                    ContentLength = stream.Length
+                };
             }
 
             return null;
@@ -315,7 +305,7 @@ namespace Emby.Server.Implementations.HttpClientManager
 
         private async Task CacheResponse(HttpResponseInfo response, string responseCachePath)
         {
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(responseCachePath));
+            Directory.CreateDirectory(Path.GetDirectoryName(responseCachePath));
 
             using (var fileStream = _fileSystem.GetFileStream(responseCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.None, true))
             {
@@ -523,7 +513,7 @@ namespace Emby.Server.Implementations.HttpClientManager
         {
             ValidateParams(options);
 
-            _fileSystem.CreateDirectory(_appPaths.TempDirectory);
+            Directory.CreateDirectory(_appPaths.TempDirectory);
 
             var tempFile = Path.Combine(_appPaths.TempDirectory, Guid.NewGuid() + ".tmp");
 

+ 2 - 2
Emby.Server.Implementations/IO/FileRefresher.cs

@@ -189,13 +189,13 @@ namespace Emby.Server.Implementations.IO
             {
                 item = LibraryManager.FindByPath(path, null);
 
-                path = _fileSystem.GetDirectoryName(path);
+                path = System.IO.Path.GetDirectoryName(path);
             }
 
             if (item != null)
             {
                 // If the item has been deleted find the first valid parent that still exists
-                while (!_fileSystem.DirectoryExists(item.Path) && !_fileSystem.FileExists(item.Path))
+                while (!Directory.Exists(item.Path) && !File.Exists(item.Path))
                 {
                     item = item.GetOwner() ?? item.GetParent();
 

+ 4 - 4
Emby.Server.Implementations/IO/LibraryMonitor.cs

@@ -277,7 +277,7 @@ namespace Emby.Server.Implementations.IO
         /// <param name="path">The path.</param>
         private void StartWatchingPath(string path)
         {
-            if (!_fileSystem.DirectoryExists(path))
+            if (!Directory.Exists(path))
             {
                 // Seeing a crash in the mono runtime due to an exception being thrown on a different thread
                 Logger.LogInformation("Skipping realtime monitor for {0} because the path does not exist", path);
@@ -483,7 +483,7 @@ namespace Emby.Server.Implementations.IO
                 }
 
                 // Go up a level
-                var parent = _fileSystem.GetDirectoryName(i);
+                var parent = Path.GetDirectoryName(i);
                 if (!string.IsNullOrEmpty(parent))
                 {
                     if (_fileSystem.AreEqual(parent, path))
@@ -509,7 +509,7 @@ namespace Emby.Server.Implementations.IO
 
         private void CreateRefresher(string path)
         {
-            var parentPath = _fileSystem.GetDirectoryName(path);
+            var parentPath = Path.GetDirectoryName(path);
 
             lock (_activeRefreshers)
             {
@@ -538,7 +538,7 @@ namespace Emby.Server.Implementations.IO
                     }
 
                     // They are siblings. Rebase the refresher to the parent folder.
-                    if (string.Equals(parentPath, _fileSystem.GetDirectoryName(refresher.Path), StringComparison.Ordinal))
+                    if (string.Equals(parentPath, Path.GetDirectoryName(refresher.Path), StringComparison.Ordinal))
                     {
                         refresher.ResetPath(parentPath, path);
                         return;

+ 45 - 152
Emby.Server.Implementations/IO/ManagedFileSystem.cs

@@ -50,7 +50,7 @@ namespace Emby.Server.Implementations.IO
             _isEnvironmentCaseInsensitive = environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Windows;
         }
 
-        public string DefaultDirectory
+        public virtual string DefaultDirectory
         {
             get
             {
@@ -60,7 +60,7 @@ namespace Emby.Server.Implementations.IO
                 {
                     try
                     {
-                        if (DirectoryExists(value))
+                        if (Directory.Exists(value))
                         {
                             return value;
                         }
@@ -75,7 +75,7 @@ namespace Emby.Server.Implementations.IO
             }
         }
 
-        public void AddShortcutHandler(IShortcutHandler handler)
+        public virtual void AddShortcutHandler(IShortcutHandler handler)
         {
             _shortcutHandlers.Add(handler);
         }
@@ -94,13 +94,6 @@ namespace Emby.Server.Implementations.IO
             }
         }
 
-        public char DirectorySeparatorChar => Path.DirectorySeparatorChar;
-
-        public string GetFullPath(string path)
-        {
-            return Path.GetFullPath(path);
-        }
-
         /// <summary>
         /// Determines whether the specified filename is shortcut.
         /// </summary>
@@ -142,7 +135,7 @@ namespace Emby.Server.Implementations.IO
             return null;
         }
 
-        public string MakeAbsolutePath(string folderPath, string filePath)
+        public virtual string MakeAbsolutePath(string folderPath, string filePath)
         {
             if (string.IsNullOrWhiteSpace(filePath)) return filePath;
 
@@ -195,7 +188,7 @@ namespace Emby.Server.Implementations.IO
         /// or
         /// target
         /// </exception>
-        public void CreateShortcut(string shortcutPath, string target)
+        public virtual void CreateShortcut(string shortcutPath, string target)
         {
             if (string.IsNullOrEmpty(shortcutPath))
             {
@@ -227,7 +220,7 @@ namespace Emby.Server.Implementations.IO
         /// <returns>A <see cref="FileSystemMetadata"/> object.</returns>
         /// <remarks>If the specified path points to a directory, the returned <see cref="FileSystemMetadata"/> object's
         /// <see cref="FileSystemMetadata.IsDirectory"/> property will be set to true and all other properties will reflect the properties of the directory.</remarks>
-        public FileSystemMetadata GetFileSystemInfo(string path)
+        public virtual FileSystemMetadata GetFileSystemInfo(string path)
         {
             // Take a guess to try and avoid two file system hits, but we'll double-check by calling Exists
             if (Path.HasExtension(path))
@@ -262,7 +255,7 @@ namespace Emby.Server.Implementations.IO
         /// <remarks><para>If the specified path points to a directory, the returned <see cref="FileSystemMetadata"/> object's
         /// <see cref="FileSystemMetadata.IsDirectory"/> property and the <see cref="FileSystemMetadata.Exists"/> property will both be set to false.</para>
         /// <para>For automatic handling of files <b>and</b> directories, use <see cref="GetFileSystemInfo"/>.</para></remarks>
-        public FileSystemMetadata GetFileInfo(string path)
+        public virtual FileSystemMetadata GetFileInfo(string path)
         {
             var fileInfo = new FileInfo(path);
 
@@ -277,7 +270,7 @@ namespace Emby.Server.Implementations.IO
         /// <remarks><para>If the specified path points to a file, the returned <see cref="FileSystemMetadata"/> object's
         /// <see cref="FileSystemMetadata.IsDirectory"/> property will be set to true and the <see cref="FileSystemMetadata.Exists"/> property will be set to false.</para>
         /// <para>For automatic handling of files <b>and</b> directories, use <see cref="GetFileSystemInfo"/>.</para></remarks>
-        public FileSystemMetadata GetDirectoryInfo(string path)
+        public virtual FileSystemMetadata GetDirectoryInfo(string path)
         {
             var fileInfo = new DirectoryInfo(path);
 
@@ -339,24 +332,19 @@ namespace Emby.Server.Implementations.IO
             return result;
         }
 
-        /// <summary>
-        /// The space char
-        /// </summary>
-        private const char SpaceChar = ' ';
-
         /// <summary>
         /// Takes a filename and removes invalid characters
         /// </summary>
         /// <param name="filename">The filename.</param>
         /// <returns>System.String.</returns>
         /// <exception cref="ArgumentNullException">filename</exception>
-        public string GetValidFilename(string filename)
+        public virtual string GetValidFilename(string filename)
         {
             var builder = new StringBuilder(filename);
 
             foreach (var c in _invalidFileNameChars)
             {
-                builder = builder.Replace(c, SpaceChar);
+                builder = builder.Replace(c, ' ');
             }
 
             return builder.ToString();
@@ -386,17 +374,17 @@ namespace Emby.Server.Implementations.IO
         /// </summary>
         /// <param name="path">The path.</param>
         /// <returns>DateTime.</returns>
-        public DateTime GetCreationTimeUtc(string path)
+        public virtual DateTime GetCreationTimeUtc(string path)
         {
             return GetCreationTimeUtc(GetFileSystemInfo(path));
         }
 
-        public DateTime GetCreationTimeUtc(FileSystemMetadata info)
+        public virtual DateTime GetCreationTimeUtc(FileSystemMetadata info)
         {
             return info.CreationTimeUtc;
         }
 
-        public DateTime GetLastWriteTimeUtc(FileSystemMetadata info)
+        public virtual DateTime GetLastWriteTimeUtc(FileSystemMetadata info)
         {
             return info.LastWriteTimeUtc;
         }
@@ -425,7 +413,7 @@ namespace Emby.Server.Implementations.IO
         /// </summary>
         /// <param name="path">The path.</param>
         /// <returns>DateTime.</returns>
-        public DateTime GetLastWriteTimeUtc(string path)
+        public virtual DateTime GetLastWriteTimeUtc(string path)
         {
             return GetLastWriteTimeUtc(GetFileSystemInfo(path));
         }
@@ -439,7 +427,7 @@ namespace Emby.Server.Implementations.IO
         /// <param name="share">The share.</param>
         /// <param name="isAsync">if set to <c>true</c> [is asynchronous].</param>
         /// <returns>FileStream.</returns>
-        public Stream GetFileStream(string path, FileOpenMode mode, FileAccessMode access, FileShareMode share, bool isAsync = false)
+        public virtual Stream GetFileStream(string path, FileOpenMode mode, FileAccessMode access, FileShareMode share, bool isAsync = false)
         {
             if (_supportsAsyncFileStreams && isAsync)
             {
@@ -449,7 +437,7 @@ namespace Emby.Server.Implementations.IO
             return GetFileStream(path, mode, access, share, FileOpenOptions.None);
         }
 
-        public Stream GetFileStream(string path, FileOpenMode mode, FileAccessMode access, FileShareMode share, FileOpenOptions fileOpenOptions)
+        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)
@@ -511,7 +499,7 @@ namespace Emby.Server.Implementations.IO
             }
         }
 
-        public void SetHidden(string path, bool isHidden)
+        public virtual void SetHidden(string path, bool isHidden)
         {
             if (_environmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows)
             {
@@ -535,7 +523,7 @@ namespace Emby.Server.Implementations.IO
             }
         }
 
-        public void SetReadOnly(string path, bool isReadOnly)
+        public virtual void SetReadOnly(string path, bool isReadOnly)
         {
             if (_environmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows)
             {
@@ -559,7 +547,7 @@ namespace Emby.Server.Implementations.IO
             }
         }
 
-        public void SetAttributes(string path, bool isHidden, bool isReadOnly)
+        public virtual void SetAttributes(string path, bool isHidden, bool isReadOnly)
         {
             if (_environmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows)
             {
@@ -611,7 +599,7 @@ namespace Emby.Server.Implementations.IO
         /// </summary>
         /// <param name="file1">The file1.</param>
         /// <param name="file2">The file2.</param>
-        public void SwapFiles(string file1, string file2)
+        public virtual void SwapFiles(string file1, string file2)
         {
             if (string.IsNullOrEmpty(file1))
             {
@@ -630,18 +618,13 @@ namespace Emby.Server.Implementations.IO
             SetHidden(file2, false);
 
             Directory.CreateDirectory(_tempPath);
-            CopyFile(file1, temp1, true);
+            File.Copy(file1, temp1, true);
 
-            CopyFile(file2, file1, true);
-            CopyFile(temp1, file2, true);
+            File.Copy(file2, file1, true);
+            File.Copy(temp1, file2, true);
         }
 
-        private static char GetDirectorySeparatorChar(string path)
-        {
-            return Path.DirectorySeparatorChar;
-        }
-
-        public bool ContainsSubPath(string parentPath, string path)
+        public virtual bool ContainsSubPath(string parentPath, string path)
         {
             if (string.IsNullOrEmpty(parentPath))
             {
@@ -653,19 +636,19 @@ namespace Emby.Server.Implementations.IO
                 throw new ArgumentNullException(nameof(path));
             }
 
-            var separatorChar = GetDirectorySeparatorChar(parentPath);
+            var separatorChar = Path.DirectorySeparatorChar;
 
             return path.IndexOf(parentPath.TrimEnd(separatorChar) + separatorChar, StringComparison.OrdinalIgnoreCase) != -1;
         }
 
-        public bool IsRootPath(string path)
+        public virtual bool IsRootPath(string path)
         {
             if (string.IsNullOrEmpty(path))
             {
                 throw new ArgumentNullException(nameof(path));
             }
 
-            var parent = GetDirectoryName(path);
+            var parent = Path.GetDirectoryName(path);
 
             if (!string.IsNullOrEmpty(parent))
             {
@@ -675,12 +658,7 @@ namespace Emby.Server.Implementations.IO
             return true;
         }
 
-        public string GetDirectoryName(string path)
-        {
-            return Path.GetDirectoryName(path);
-        }
-
-        public string NormalizePath(string path)
+        public virtual string NormalizePath(string path)
         {
             if (string.IsNullOrEmpty(path))
             {
@@ -692,10 +670,10 @@ namespace Emby.Server.Implementations.IO
                 return path;
             }
 
-            return path.TrimEnd(GetDirectorySeparatorChar(path));
+            return path.TrimEnd(Path.DirectorySeparatorChar);
         }
 
-        public bool AreEqual(string path1, string path2)
+        public virtual bool AreEqual(string path1, string path2)
         {
             if (path1 == null && path2 == null)
             {
@@ -710,7 +688,7 @@ namespace Emby.Server.Implementations.IO
             return string.Equals(NormalizePath(path1), NormalizePath(path2), StringComparison.OrdinalIgnoreCase);
         }
 
-        public string GetFileNameWithoutExtension(FileSystemMetadata info)
+        public virtual string GetFileNameWithoutExtension(FileSystemMetadata info)
         {
             if (info.IsDirectory)
             {
@@ -720,12 +698,7 @@ namespace Emby.Server.Implementations.IO
             return Path.GetFileNameWithoutExtension(info.FullName);
         }
 
-        public string GetFileNameWithoutExtension(string path)
-        {
-            return Path.GetFileNameWithoutExtension(path);
-        }
-
-        public bool IsPathFile(string path)
+        public virtual bool IsPathFile(string path)
         {
             // Cannot use Path.IsPathRooted because it returns false under mono when using windows-based paths, e.g. C:\\
 
@@ -740,23 +713,13 @@ namespace Emby.Server.Implementations.IO
             //return Path.IsPathRooted(path);
         }
 
-        public void DeleteFile(string path)
+        public virtual void DeleteFile(string path)
         {
             SetAttributes(path, false, false);
             File.Delete(path);
         }
-
-        public void DeleteDirectory(string path, bool recursive)
-        {
-            Directory.Delete(path, recursive);
-        }
-
-        public void CreateDirectory(string path)
-        {
-            Directory.CreateDirectory(path);
-        }
-
-        public List<FileSystemMetadata> GetDrives()
+        
+        public virtual List<FileSystemMetadata> GetDrives()
         {
             // Only include drives in the ready state or this method could end up being very slow, waiting for drives to timeout
             return DriveInfo.GetDrives().Where(d => d.IsReady).Select(d => new FileSystemMetadata
@@ -768,19 +731,19 @@ namespace Emby.Server.Implementations.IO
             }).ToList();
         }
 
-        public IEnumerable<FileSystemMetadata> GetDirectories(string path, bool recursive = false)
+        public virtual IEnumerable<FileSystemMetadata> GetDirectories(string path, bool recursive = false)
         {
             var searchOption = recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
 
             return ToMetadata(new DirectoryInfo(path).EnumerateDirectories("*", searchOption));
         }
 
-        public IEnumerable<FileSystemMetadata> GetFiles(string path, bool recursive = false)
+        public virtual IEnumerable<FileSystemMetadata> GetFiles(string path, bool recursive = false)
         {
             return GetFiles(path, null, false, recursive);
         }
 
-        public IEnumerable<FileSystemMetadata> GetFiles(string path, string[] extensions, bool enableCaseSensitiveExtensions, bool recursive = false)
+        public virtual IEnumerable<FileSystemMetadata> GetFiles(string path, string[] extensions, bool enableCaseSensitiveExtensions, bool recursive = false)
         {
             var searchOption = recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
 
@@ -809,7 +772,7 @@ namespace Emby.Server.Implementations.IO
             return ToMetadata(files);
         }
 
-        public IEnumerable<FileSystemMetadata> GetFileSystemEntries(string path, bool recursive = false)
+        public virtual IEnumerable<FileSystemMetadata> GetFileSystemEntries(string path, bool recursive = false)
         {
             var directoryInfo = new DirectoryInfo(path);
             var searchOption = recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
@@ -827,89 +790,19 @@ namespace Emby.Server.Implementations.IO
         {
             return infos.Select(GetFileSystemMetadata);
         }
-
-        public string[] ReadAllLines(string path)
-        {
-            return File.ReadAllLines(path);
-        }
-
-        public void WriteAllLines(string path, IEnumerable<string> lines)
-        {
-            File.WriteAllLines(path, lines);
-        }
-
-        public Stream OpenRead(string path)
-        {
-            return File.OpenRead(path);
-        }
-
-        public void CopyFile(string source, string target, bool overwrite)
-        {
-            File.Copy(source, target, overwrite);
-        }
-
-        public void MoveFile(string source, string target)
-        {
-            File.Move(source, target);
-        }
-
-        public void MoveDirectory(string source, string target)
-        {
-            Directory.Move(source, target);
-        }
-
-        public bool DirectoryExists(string path)
-        {
-            return Directory.Exists(path);
-        }
-
-        public bool FileExists(string path)
-        {
-            return File.Exists(path);
-        }
-
-        public string ReadAllText(string path)
-        {
-            return File.ReadAllText(path);
-        }
-
-        public byte[] ReadAllBytes(string path)
-        {
-            return File.ReadAllBytes(path);
-        }
-
-        public void WriteAllText(string path, string text, Encoding encoding)
-        {
-            File.WriteAllText(path, text, encoding);
-        }
-
-        public void WriteAllText(string path, string text)
-        {
-            File.WriteAllText(path, text);
-        }
-
-        public void WriteAllBytes(string path, byte[] bytes)
-        {
-            File.WriteAllBytes(path, bytes);
-        }
-
-        public string ReadAllText(string path, Encoding encoding)
-        {
-            return File.ReadAllText(path, encoding);
-        }
-
-        public IEnumerable<string> GetDirectoryPaths(string path, bool recursive = false)
+        
+        public virtual IEnumerable<string> GetDirectoryPaths(string path, bool recursive = false)
         {
             var searchOption = recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
             return Directory.EnumerateDirectories(path, "*", searchOption);
         }
 
-        public IEnumerable<string> GetFilePaths(string path, bool recursive = false)
+        public virtual IEnumerable<string> GetFilePaths(string path, bool recursive = false)
         {
             return GetFilePaths(path, null, false, recursive);
         }
 
-        public IEnumerable<string> GetFilePaths(string path, string[] extensions, bool enableCaseSensitiveExtensions, bool recursive = false)
+        public virtual IEnumerable<string> GetFilePaths(string path, string[] extensions, bool enableCaseSensitiveExtensions, bool recursive = false)
         {
             var searchOption = recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
 
@@ -938,7 +831,7 @@ namespace Emby.Server.Implementations.IO
             return files;
         }
 
-        public IEnumerable<string> GetFileSystemEntryPaths(string path, bool recursive = false)
+        public virtual IEnumerable<string> GetFileSystemEntryPaths(string path, bool recursive = false)
         {
             var searchOption = recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
             return Directory.EnumerateFileSystemEntries(path, "*", searchOption);
@@ -948,7 +841,7 @@ namespace Emby.Server.Implementations.IO
         {
             if (_environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.OSX)
             {
-                RunProcess("chmod", "+x \"" + path + "\"", GetDirectoryName(path));
+                RunProcess("chmod", "+x \"" + path + "\"", Path.GetDirectoryName(path));
             }
         }
 

+ 2 - 2
Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs

@@ -24,7 +24,7 @@ namespace Emby.Server.Implementations.IO
 
             if (string.Equals(Path.GetExtension(shortcutPath), ".mblink", StringComparison.OrdinalIgnoreCase))
             {
-                var path = _fileSystem.ReadAllText(shortcutPath);
+                var path = File.ReadAllText(shortcutPath);
 
                 return _fileSystem.NormalizePath(path);
             }
@@ -44,7 +44,7 @@ namespace Emby.Server.Implementations.IO
                 throw new ArgumentNullException(nameof(targetPath));
             }
 
-            _fileSystem.WriteAllText(shortcutPath, targetPath);
+            File.WriteAllText(shortcutPath, targetPath);
         }
     }
 }

+ 3 - 3
Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs

@@ -99,7 +99,7 @@ namespace Emby.Server.Implementations.Images
             CancellationToken cancellationToken)
         {
             var outputPathWithoutExtension = Path.Combine(ApplicationPaths.TempDirectory, Guid.NewGuid().ToString("N"));
-            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(outputPathWithoutExtension));
+            Directory.CreateDirectory(Path.GetDirectoryName(outputPathWithoutExtension));
             string outputPath = CreateImage(item, itemsWithImages, outputPathWithoutExtension, imageType, 0);
 
             if (string.IsNullOrEmpty(outputPath))
@@ -165,7 +165,7 @@ namespace Emby.Server.Implementations.Images
 
         private string CreateCollage(BaseItem primaryItem, List<BaseItem> items, string outputPath, int width, int height)
         {
-            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(outputPath));
+            Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
 
             var options = new ImageCollageOptions
             {
@@ -300,7 +300,7 @@ namespace Emby.Server.Implementations.Images
             var ext = Path.GetExtension(image);
 
             var outputPath = Path.ChangeExtension(outputPathWithoutExtension, ext);
-            FileSystem.CopyFile(image, outputPath, true);
+            File.Copy(image, outputPath, true);
 
             return outputPath;
         }

+ 2 - 1
Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
@@ -146,7 +147,7 @@ namespace Emby.Server.Implementations.Library
                 if (parent != null)
                 {
                     // Don't resolve these into audio files
-                    if (string.Equals(_fileSystem.GetFileNameWithoutExtension(filename), BaseItem.ThemeSongFilename) && _libraryManager.IsAudioFile(filename))
+                    if (string.Equals(Path.GetFileNameWithoutExtension(filename), BaseItem.ThemeSongFilename) && _libraryManager.IsAudioFile(filename))
                     {
                         return true;
                     }

+ 42 - 47
Emby.Server.Implementations/Library/LibraryManager.cs

@@ -375,7 +375,7 @@ namespace Emby.Server.Implementations.Library
 
                 try
                 {
-                    _fileSystem.DeleteDirectory(metadataPath, true);
+                    Directory.Delete(metadataPath, true);
                 }
                 catch (IOException)
                 {
@@ -395,38 +395,33 @@ namespace Emby.Server.Implementations.Library
 
                 foreach (var fileSystemInfo in item.GetDeletePaths().ToList())
                 {
-                    try
+                    if (File.Exists(fileSystemInfo.FullName))
                     {
-                        _logger.LogDebug("Deleting path {path}", fileSystemInfo.FullName);
-                        if (fileSystemInfo.IsDirectory)
+                        try
                         {
-                            _fileSystem.DeleteDirectory(fileSystemInfo.FullName, true);
+                            _logger.LogDebug("Deleting path {path}", fileSystemInfo.FullName);
+                            if (fileSystemInfo.IsDirectory)
+                            {
+                                Directory.Delete(fileSystemInfo.FullName, true);
+                            }
+                            else
+                            {
+                                File.Delete(fileSystemInfo.FullName);
+                            }
                         }
-                        else
+                        catch (IOException)
                         {
-                            _fileSystem.DeleteFile(fileSystemInfo.FullName);
+                            if (isRequiredForDelete)
+                            {
+                                throw;
+                            }
                         }
-                    }
-                    catch (FileNotFoundException)
-                    {
-                        // may have already been deleted manually by user
-                    }
-                    catch (DirectoryNotFoundException)
-                    {
-                        // may have already been deleted manually by user
-                    }
-                    catch (IOException)
-                    {
-                        if (isRequiredForDelete)
-                        {
-                            throw;
-                        }
-                    }
-                    catch (UnauthorizedAccessException)
-                    {
-                        if (isRequiredForDelete)
+                        catch (UnauthorizedAccessException)
                         {
-                            throw;
+                            if (isRequiredForDelete)
+                            {
+                                throw;
+                            }
                         }
                     }
 
@@ -725,7 +720,7 @@ namespace Emby.Server.Implementations.Library
         {
             var rootFolderPath = ConfigurationManager.ApplicationPaths.RootFolderPath;
 
-            _fileSystem.CreateDirectory(rootFolderPath);
+            Directory.CreateDirectory(rootFolderPath);
 
             var rootFolder = GetItemById(GetNewItemId(rootFolderPath, typeof(AggregateFolder))) as AggregateFolder ?? ((Folder)ResolvePath(_fileSystem.GetDirectoryInfo(rootFolderPath))).DeepCopy<Folder, AggregateFolder>();
 
@@ -739,7 +734,7 @@ namespace Emby.Server.Implementations.Library
             // Add in the plug-in folders
             var path = Path.Combine(ConfigurationManager.ApplicationPaths.DataPath, "playlists");
 
-            _fileSystem.CreateDirectory(path);
+            Directory.CreateDirectory(path);
 
             Folder folder = new PlaylistsFolder
             {
@@ -790,7 +785,7 @@ namespace Emby.Server.Implementations.Library
                     {
                         var userRootPath = ConfigurationManager.ApplicationPaths.DefaultUserViewsPath;
 
-                        _fileSystem.CreateDirectory(userRootPath);
+                        Directory.CreateDirectory(userRootPath);
 
                         var tmpItem = GetItemById(GetNewItemId(userRootPath, typeof(UserRootFolder))) as UserRootFolder;
 
@@ -1004,7 +999,7 @@ namespace Emby.Server.Implementations.Library
         public Task ValidatePeople(CancellationToken cancellationToken, IProgress<double> progress)
         {
             // Ensure the location is available.
-            _fileSystem.CreateDirectory(ConfigurationManager.ApplicationPaths.PeoplePath);
+            Directory.CreateDirectory(ConfigurationManager.ApplicationPaths.PeoplePath);
 
             return new PeopleValidator(this, _logger, ConfigurationManager, _fileSystem).ValidatePeople(cancellationToken, progress);
         }
@@ -1233,7 +1228,7 @@ namespace Emby.Server.Implementations.Library
         private string GetCollectionType(string path)
         {
             return _fileSystem.GetFilePaths(path, new[] { ".collection" }, true, false)
-                .Select(i => _fileSystem.GetFileNameWithoutExtension(i))
+                .Select(i => Path.GetFileNameWithoutExtension(i))
                 .FirstOrDefault(i => !string.IsNullOrEmpty(i));
         }
 
@@ -2151,7 +2146,7 @@ namespace Emby.Server.Implementations.Library
 
             if (item == null || !string.Equals(item.Path, path, StringComparison.OrdinalIgnoreCase))
             {
-                _fileSystem.CreateDirectory(path);
+                Directory.CreateDirectory(path);
 
                 item = new UserView
                 {
@@ -2196,7 +2191,7 @@ namespace Emby.Server.Implementations.Library
 
             if (item == null)
             {
-                _fileSystem.CreateDirectory(path);
+                Directory.CreateDirectory(path);
 
                 item = new UserView
                 {
@@ -2261,7 +2256,7 @@ namespace Emby.Server.Implementations.Library
 
             if (item == null)
             {
-                _fileSystem.CreateDirectory(path);
+                Directory.CreateDirectory(path);
 
                 item = new UserView
                 {
@@ -2329,7 +2324,7 @@ namespace Emby.Server.Implementations.Library
 
             if (item == null)
             {
-                _fileSystem.CreateDirectory(path);
+                Directory.CreateDirectory(path);
 
                 item = new UserView
                 {
@@ -2868,7 +2863,7 @@ namespace Emby.Server.Implementations.Library
             var rootFolderPath = ConfigurationManager.ApplicationPaths.DefaultUserViewsPath;
 
             var virtualFolderPath = Path.Combine(rootFolderPath, name);
-            while (_fileSystem.DirectoryExists(virtualFolderPath))
+            while (Directory.Exists(virtualFolderPath))
             {
                 name += "1";
                 virtualFolderPath = Path.Combine(rootFolderPath, name);
@@ -2877,7 +2872,7 @@ namespace Emby.Server.Implementations.Library
             var mediaPathInfos = options.PathInfos;
             if (mediaPathInfos != null)
             {
-                var invalidpath = mediaPathInfos.FirstOrDefault(i => !_fileSystem.DirectoryExists(i.Path));
+                var invalidpath = mediaPathInfos.FirstOrDefault(i => !Directory.Exists(i.Path));
                 if (invalidpath != null)
                 {
                     throw new ArgumentException("The specified path does not exist: " + invalidpath.Path + ".");
@@ -2888,13 +2883,13 @@ namespace Emby.Server.Implementations.Library
 
             try
             {
-                _fileSystem.CreateDirectory(virtualFolderPath);
+                Directory.CreateDirectory(virtualFolderPath);
 
                 if (!string.IsNullOrEmpty(collectionType))
                 {
                     var path = Path.Combine(virtualFolderPath, collectionType + ".collection");
 
-                    _fileSystem.WriteAllBytes(path, Array.Empty<byte>());
+                    File.WriteAllBytes(path, Array.Empty<byte>());
                 }
 
                 CollectionFolder.SaveLibraryOptions(virtualFolderPath, options);
@@ -2940,7 +2935,7 @@ namespace Emby.Server.Implementations.Library
             //    // We can't validate protocol-based paths, so just allow them
             //    if (path.IndexOf("://", StringComparison.OrdinalIgnoreCase) == -1)
             //    {
-            //        return _fileSystem.DirectoryExists(path);
+            //        return Directory.Exists(path);
             //    }
             //}
 
@@ -2968,7 +2963,7 @@ namespace Emby.Server.Implementations.Library
                 throw new ArgumentNullException(nameof(path));
             }
 
-            if (!_fileSystem.DirectoryExists(path))
+            if (!Directory.Exists(path))
             {
                 throw new FileNotFoundException("The path does not exist.");
             }
@@ -2981,11 +2976,11 @@ namespace Emby.Server.Implementations.Library
             var rootFolderPath = ConfigurationManager.ApplicationPaths.DefaultUserViewsPath;
             var virtualFolderPath = Path.Combine(rootFolderPath, virtualFolderName);
 
-            var shortcutFilename = _fileSystem.GetFileNameWithoutExtension(path);
+            var shortcutFilename = Path.GetFileNameWithoutExtension(path);
 
             var lnk = Path.Combine(virtualFolderPath, shortcutFilename + ShortcutFileExtension);
 
-            while (_fileSystem.FileExists(lnk))
+            while (File.Exists(lnk))
             {
                 shortcutFilename += "1";
                 lnk = Path.Combine(virtualFolderPath, shortcutFilename + ShortcutFileExtension);
@@ -3078,7 +3073,7 @@ namespace Emby.Server.Implementations.Library
 
             var path = Path.Combine(rootFolderPath, name);
 
-            if (!_fileSystem.DirectoryExists(path))
+            if (!Directory.Exists(path))
             {
                 throw new FileNotFoundException("The media folder does not exist");
             }
@@ -3087,7 +3082,7 @@ namespace Emby.Server.Implementations.Library
 
             try
             {
-                _fileSystem.DeleteDirectory(path, true);
+                Directory.Delete(path, true);
             }
             finally
             {
@@ -3150,7 +3145,7 @@ namespace Emby.Server.Implementations.Library
             var rootFolderPath = ConfigurationManager.ApplicationPaths.DefaultUserViewsPath;
             var virtualFolderPath = Path.Combine(rootFolderPath, virtualFolderName);
 
-            if (!_fileSystem.DirectoryExists(virtualFolderPath))
+            if (!Directory.Exists(virtualFolderPath))
             {
                 throw new FileNotFoundException(string.Format("The media collection {0} does not exist", virtualFolderName));
             }

+ 1 - 1
Emby.Server.Implementations/Library/MediaSourceManager.cs

@@ -670,7 +670,7 @@ namespace Emby.Server.Implementations.Library
 
                 if (cacheFilePath != null)
                 {
-                    _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(cacheFilePath));
+                    Directory.CreateDirectory(Path.GetDirectoryName(cacheFilePath));
                     _jsonSerializer.SerializeToFile(mediaInfo, cacheFilePath);
 
                     //_logger.LogDebug("Saved media info to {0}", cacheFilePath);

+ 1 - 1
Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs

@@ -43,7 +43,7 @@ namespace Emby.Server.Implementations.Library.Resolvers
                         var filename = Path.GetFileNameWithoutExtension(args.Path);
 
                         // Make sure the image doesn't belong to a video file
-                        var files = args.DirectoryService.GetFiles(_fileSystem.GetDirectoryName(args.Path));
+                        var files = args.DirectoryService.GetFiles(Path.GetDirectoryName(args.Path));
                         var libraryOptions = args.GetLibraryOptions();
 
                         foreach (var file in files)

+ 13 - 11
Emby.Server.Implementations/Library/UserManager.cs

@@ -904,7 +904,7 @@ namespace Emby.Server.Implementations.Library
             // Tuesday, 22 August 2006 06:30 AM
             text.AppendLine("The pin code will expire at " + localExpirationTime.ToString("f1", CultureInfo.CurrentCulture));
 
-            _fileSystem.WriteAllText(path, text.ToString(), Encoding.UTF8);
+            File.WriteAllText(path, text.ToString(), Encoding.UTF8);
 
             var result = new PasswordPinCreationResult
             {
@@ -1029,6 +1029,11 @@ namespace Emby.Server.Implementations.Library
         {
             var path = GetPolicyFilePath(user);
 
+            if (!File.Exists(path))
+            {
+                return GetDefaultPolicy(user);
+            }
+
             try
             {
                 lock (_policySyncLock)
@@ -1036,10 +1041,6 @@ namespace Emby.Server.Implementations.Library
                     return (UserPolicy)_xmlSerializer.DeserializeFromFile(typeof(UserPolicy), path);
                 }
             }
-            catch (FileNotFoundException)
-            {
-                return GetDefaultPolicy(user);
-            }
             catch (IOException)
             {
                 return GetDefaultPolicy(user);
@@ -1079,7 +1080,7 @@ namespace Emby.Server.Implementations.Library
 
             var path = GetPolicyFilePath(user);
 
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+            Directory.CreateDirectory(Path.GetDirectoryName(path));
 
             lock (_policySyncLock)
             {
@@ -1128,6 +1129,11 @@ namespace Emby.Server.Implementations.Library
         {
             var path = GetConfigurationFilePath(user);
 
+            if (!File.Exists(path))
+            {
+                return new UserConfiguration();
+            }
+
             try
             {
                 lock (_configSyncLock)
@@ -1135,10 +1141,6 @@ namespace Emby.Server.Implementations.Library
                     return (UserConfiguration)_xmlSerializer.DeserializeFromFile(typeof(UserConfiguration), path);
                 }
             }
-            catch (FileNotFoundException)
-            {
-                return new UserConfiguration();
-            }
             catch (IOException)
             {
                 return new UserConfiguration();
@@ -1174,7 +1176,7 @@ namespace Emby.Server.Implementations.Library
                 config = _jsonSerializer.DeserializeFromString<UserConfiguration>(json);
             }
 
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+            Directory.CreateDirectory(Path.GetDirectoryName(path));
 
             lock (_configSyncLock)
             {

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

@@ -1,4 +1,5 @@
 using System;
+using System.IO;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common.Net;
@@ -41,7 +42,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 
         private async Task RecordFromDirectStreamProvider(IDirectStreamProvider directStreamProvider, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken)
         {
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(targetFile));
+            Directory.CreateDirectory(Path.GetDirectoryName(targetFile));
 
             using (var output = _fileSystem.GetFileStream(targetFile, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
             {
@@ -77,7 +78,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             {
                 _logger.LogInformation("Opened recording stream from tuner provider");
 
-                _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(targetFile));
+                Directory.CreateDirectory(Path.GetDirectoryName(targetFile));
 
                 using (var output = _fileSystem.GetFileStream(targetFile, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
                 {

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

@@ -1427,7 +1427,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                 timer.RetryCount++;
                 _timerProvider.AddOrUpdate(timer);
             }
-            else if (_fileSystem.FileExists(recordPath))
+            else if (File.Exists(recordPath))
             {
                 timer.RecordingPath = recordPath;
                 timer.Status = RecordingStatus.Completed;
@@ -1489,7 +1489,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         {
             _logger.LogInformation("Triggering refresh on {path}", path);
 
-            var item = GetAffectedBaseItem(_fileSystem.GetDirectoryName(path));
+            var item = GetAffectedBaseItem(Path.GetDirectoryName(path));
 
             if (item != null)
             {
@@ -1500,8 +1500,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                     RefreshPaths = new string[]
                     {
                         path,
-                        _fileSystem.GetDirectoryName(path),
-                        _fileSystem.GetDirectoryName(_fileSystem.GetDirectoryName(path))
+                        Path.GetDirectoryName(path),
+                        Path.GetDirectoryName(Path.GetDirectoryName(path))
                     }
 
                 }, RefreshPriority.High);
@@ -1512,13 +1512,13 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         {
             BaseItem item = null;
 
-            var parentPath = _fileSystem.GetDirectoryName(path);
+            var parentPath = Path.GetDirectoryName(path);
 
             while (item == null && !string.IsNullOrEmpty(path))
             {
                 item = _libraryManager.FindByPath(path, null);
 
-                path = _fileSystem.GetDirectoryName(path);
+                path = Path.GetDirectoryName(path);
             }
 
             if (item != null)
@@ -1573,7 +1573,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                     .Where(i => i.Status == RecordingStatus.Completed && !string.IsNullOrWhiteSpace(i.RecordingPath))
                     .Where(i => string.Equals(i.SeriesTimerId, seriesTimerId, StringComparison.OrdinalIgnoreCase))
                     .OrderByDescending(i => i.EndDate)
-                    .Where(i => _fileSystem.FileExists(i.RecordingPath))
+                    .Where(i => File.Exists(i.RecordingPath))
                     .Skip(seriesTimer.KeepUpTo - 1)
                     .ToList();
 
@@ -1595,7 +1595,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                     DtoOptions = new DtoOptions(true)
 
                 }))
-                    .Where(i => i.IsFileProtocol && _fileSystem.FileExists(i.Path))
+                    .Where(i => i.IsFileProtocol && File.Exists(i.Path))
                     .Skip(seriesTimer.KeepUpTo - 1)
                     .ToList();
 
@@ -1676,7 +1676,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 
             while (FileExists(path, timerId))
             {
-                var parent = _fileSystem.GetDirectoryName(originalPath);
+                var parent = Path.GetDirectoryName(originalPath);
                 var name = Path.GetFileNameWithoutExtension(originalPath);
                 name += " - " + index.ToString(CultureInfo.InvariantCulture);
 
@@ -1689,7 +1689,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 
         private bool FileExists(string path, string timerId)
         {
-            if (_fileSystem.FileExists(path))
+            if (File.Exists(path))
             {
                 return true;
             }
@@ -1822,12 +1822,12 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                 return;
             }
 
-            var imageSavePath = Path.Combine(_fileSystem.GetDirectoryName(recordingPath), imageSaveFilenameWithoutExtension);
+            var imageSavePath = Path.Combine(Path.GetDirectoryName(recordingPath), imageSaveFilenameWithoutExtension);
 
             // preserve original image extension
             imageSavePath = Path.ChangeExtension(imageSavePath, Path.GetExtension(image.Path));
 
-            _fileSystem.CopyFile(image.Path, imageSavePath, true);
+            File.Copy(image.Path, imageSavePath, true);
         }
 
         private async Task SaveRecordingImages(string recordingPath, LiveTvProgram program)
@@ -1961,7 +1961,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         {
             var nfoPath = Path.Combine(seriesPath, "tvshow.nfo");
 
-            if (_fileSystem.FileExists(nfoPath))
+            if (File.Exists(nfoPath))
             {
                 return;
             }
@@ -2023,7 +2023,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         {
             var nfoPath = Path.ChangeExtension(recordingPath, ".nfo");
 
-            if (_fileSystem.FileExists(nfoPath))
+            if (File.Exists(nfoPath))
             {
                 return;
             }
@@ -2688,7 +2688,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             var defaultFolder = RecordingPath;
             var defaultName = "Recordings";
 
-            if (_fileSystem.DirectoryExists(defaultFolder))
+            if (Directory.Exists(defaultFolder))
             {
                 list.Add(new VirtualFolderInfo
                 {
@@ -2698,7 +2698,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             }
 
             var customPath = GetConfiguration().MovieRecordingPath;
-            if ((!string.IsNullOrWhiteSpace(customPath) && !string.Equals(customPath, defaultFolder, StringComparison.OrdinalIgnoreCase)) && _fileSystem.DirectoryExists(customPath))
+            if ((!string.IsNullOrWhiteSpace(customPath) && !string.Equals(customPath, defaultFolder, StringComparison.OrdinalIgnoreCase)) && Directory.Exists(customPath))
             {
                 list.Add(new VirtualFolderInfo
                 {
@@ -2709,7 +2709,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             }
 
             customPath = GetConfiguration().SeriesRecordingPath;
-            if ((!string.IsNullOrWhiteSpace(customPath) && !string.Equals(customPath, defaultFolder, StringComparison.OrdinalIgnoreCase)) && _fileSystem.DirectoryExists(customPath))
+            if ((!string.IsNullOrWhiteSpace(customPath) && !string.Equals(customPath, defaultFolder, StringComparison.OrdinalIgnoreCase)) && Directory.Exists(customPath))
             {
                 list.Add(new VirtualFolderInfo
                 {

+ 2 - 2
Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs

@@ -79,7 +79,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
         private Task RecordFromFile(MediaSourceInfo mediaSource, string inputFile, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken)
         {
             _targetPath = targetFile;
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(targetFile));
+            Directory.CreateDirectory(Path.GetDirectoryName(targetFile));
 
             var process = _processFactory.Create(new ProcessOptions
             {
@@ -105,7 +105,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             _logger.LogInformation(commandLineLogMessage);
 
             var logFilePath = Path.Combine(_appPaths.LogDirectoryPath, "record-transcode-" + Guid.NewGuid() + ".txt");
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(logFilePath));
+            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);

+ 1 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs

@@ -70,7 +70,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             }
 
             var file = _dataPath + ".json";
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(file));
+            Directory.CreateDirectory(Path.GetDirectoryName(file));
 
             lock (_fileDataLock)
             {

+ 8 - 8
Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs

@@ -61,7 +61,7 @@ namespace Jellyfin.Server.Implementations.LiveTv.Listings
 
             string cacheFilename = DateTime.UtcNow.DayOfYear.ToString(CultureInfo.InvariantCulture) + "-" + DateTime.UtcNow.Hour.ToString(CultureInfo.InvariantCulture) + ".xml";
             string cacheFile = Path.Combine(_config.ApplicationPaths.CachePath, "xmltv", cacheFilename);
-            if (_fileSystem.FileExists(cacheFile))
+            if (File.Exists(cacheFile))
             {
                 return UnzipIfNeeded(path, cacheFile);
             }
@@ -83,9 +83,9 @@ namespace Jellyfin.Server.Implementations.LiveTv.Listings
 
             }).ConfigureAwait(false);
 
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(cacheFile));
+            Directory.CreateDirectory(Path.GetDirectoryName(cacheFile));
 
-            _fileSystem.CopyFile(tempFile, cacheFile, true);
+            File.Copy(tempFile, cacheFile, true);
 
             return UnzipIfNeeded(path, cacheFile);
         }
@@ -122,10 +122,10 @@ namespace Jellyfin.Server.Implementations.LiveTv.Listings
 
         private string ExtractFirstFileFromGz(string file)
         {
-            using (var stream = _fileSystem.OpenRead(file))
+            using (var stream = File.OpenRead(file))
             {
                 string tempFolder = Path.Combine(_config.ApplicationPaths.TempDirectory, Guid.NewGuid().ToString());
-                _fileSystem.CreateDirectory(tempFolder);
+                Directory.CreateDirectory(tempFolder);
 
                 _zipClient.ExtractFirstFileFromGz(stream, tempFolder, "data.xml");
 
@@ -135,10 +135,10 @@ namespace Jellyfin.Server.Implementations.LiveTv.Listings
 
         private string ExtractGz(string file)
         {
-            using (var stream = _fileSystem.OpenRead(file))
+            using (var stream = File.OpenRead(file))
             {
                 string tempFolder = Path.Combine(_config.ApplicationPaths.TempDirectory, Guid.NewGuid().ToString());
-                _fileSystem.CreateDirectory(tempFolder);
+                Directory.CreateDirectory(tempFolder);
 
                 _zipClient.ExtractAllFromGz(stream, tempFolder, true);
 
@@ -255,7 +255,7 @@ namespace Jellyfin.Server.Implementations.LiveTv.Listings
         public Task Validate(ListingsProviderInfo info, bool validateLogin, bool validateListings)
         {
             // Assume all urls are valid. check files for existence
-            if (!info.Path.StartsWith("http", StringComparison.OrdinalIgnoreCase) && !_fileSystem.FileExists(info.Path))
+            if (!info.Path.StartsWith("http", StringComparison.OrdinalIgnoreCase) && !File.Exists(info.Path))
             {
                 throw new FileNotFoundException("Could not find the XmlTv file specified:", info.Path);
             }

+ 1 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/BaseTunerHost.cs

@@ -95,7 +95,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
                     {
                         try
                         {
-                            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(channelCacheFile));
+                            Directory.CreateDirectory(Path.GetDirectoryName(channelCacheFile));
                             JsonSerializer.SerializeToFile(channels, channelCacheFile);
                         }
                         catch (IOException)

+ 1 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs

@@ -53,7 +53,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
             var uri = new Uri(mediaSource.Path);
             var localPort = _networkManager.GetRandomUnusedUdpPort();
 
-            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(TempFilePath));
+            Directory.CreateDirectory(Path.GetDirectoryName(TempFilePath));
 
             Logger.LogInformation("Opening HDHR UDP Live stream from {host}", uri.Host);
 

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

@@ -61,7 +61,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
                     UserAgent = _appHost.ApplicationUserAgent
                 });
             }
-            return Task.FromResult(_fileSystem.OpenRead(url));
+            return Task.FromResult((Stream)File.OpenRead(url));
         }
 
         const string ExtInfPrefix = "#EXTINF:";

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

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common.Net;
@@ -35,7 +36,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
 
             var url = mediaSource.Path;
 
-            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(TempFilePath));
+            Directory.CreateDirectory(Path.GetDirectoryName(TempFilePath));
 
             var typeName = GetType().Name;
             Logger.LogInformation("Opening " + typeName + " Live stream from {0}", url);

+ 3 - 3
Emby.Server.Implementations/Localization/LocalizationManager.cs

@@ -70,7 +70,7 @@ namespace Emby.Server.Implementations.Localization
 
             var localizationPath = LocalizationPath;
 
-            _fileSystem.CreateDirectory(localizationPath);
+            Directory.CreateDirectory(localizationPath);
 
             var existingFiles = GetRatingsFiles(localizationPath)
                 .Select(Path.GetFileName)
@@ -316,7 +316,7 @@ namespace Emby.Server.Implementations.Localization
         /// <returns>Dictionary{System.StringParentalRating}.</returns>
         private void LoadRatings(string file)
         {
-            var dict = _fileSystem.ReadAllLines(file).Select(i =>
+            var dict = File.ReadAllLines(file).Select(i =>
             {
                 if (!string.IsNullOrWhiteSpace(i))
                 {
@@ -337,7 +337,7 @@ namespace Emby.Server.Implementations.Localization
             .Where(i => i != null)
             .ToDictionary(i => i.Name, StringComparer.OrdinalIgnoreCase);
 
-            var countryCode = _fileSystem.GetFileNameWithoutExtension(file)
+            var countryCode = Path.GetFileNameWithoutExtension(file)
                 .Split('-')
                 .Last();
 

+ 2 - 2
Emby.Server.Implementations/MediaEncoder/EncodingManager.cs

@@ -141,12 +141,12 @@ namespace Emby.Server.Implementations.MediaEncoder
 
                             var inputPath = MediaEncoderHelpers.GetInputArgument(_fileSystem, video.Path, protocol, null, Array.Empty<string>());
 
-                            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+                            Directory.CreateDirectory(Path.GetDirectoryName(path));
 
                             var container = video.Container;
 
                             var tempFile = await _encoder.ExtractVideoImage(inputPath, container, protocol, video.GetDefaultVideoStream(), video.Video3DFormat, time, cancellationToken).ConfigureAwait(false);
-                            _fileSystem.CopyFile(tempFile, path, true);
+                            File.Copy(tempFile, path, true);
 
                             try
                             {

+ 13 - 8
Emby.Server.Implementations/Playlists/PlaylistManager.cs

@@ -119,7 +119,7 @@ namespace Emby.Server.Implementations.Playlists
 
             try
             {
-                _fileSystem.CreateDirectory(path);
+                Directory.CreateDirectory(path);
 
                 var playlist = new Playlist
                 {
@@ -164,7 +164,7 @@ namespace Emby.Server.Implementations.Playlists
 
         private string GetTargetPath(string path)
         {
-            while (_fileSystem.DirectoryExists(path))
+            while (Directory.Exists(path))
             {
                 path += "1";
             }
@@ -340,7 +340,8 @@ namespace Emby.Server.Implementations.Playlists
                     playlist.PlaylistEntries.Add(entry);
                 }
 
-                _fileSystem.WriteAllText(playlistPath, new WplContent().ToText(playlist));
+                string text = new WplContent().ToText(playlist);
+                File.WriteAllText(playlistPath, text);
             }
             if (string.Equals(".zpl", extension, StringComparison.OrdinalIgnoreCase))
             {
@@ -373,7 +374,8 @@ namespace Emby.Server.Implementations.Playlists
                     playlist.PlaylistEntries.Add(entry);
                 }
 
-                _fileSystem.WriteAllText(playlistPath, new ZplContent().ToText(playlist));
+                string text = new ZplContent().ToText(playlist);
+                File.WriteAllText(playlistPath, text);
             }
             if (string.Equals(".m3u", extension, StringComparison.OrdinalIgnoreCase))
             {
@@ -401,7 +403,8 @@ namespace Emby.Server.Implementations.Playlists
                     playlist.PlaylistEntries.Add(entry);
                 }
 
-                _fileSystem.WriteAllText(playlistPath, new M3uContent().ToText(playlist));
+                string text = new M3uContent().ToText(playlist);
+                File.WriteAllText(playlistPath, text);
             }
             if (string.Equals(".m3u8", extension, StringComparison.OrdinalIgnoreCase))
             {
@@ -429,7 +432,8 @@ namespace Emby.Server.Implementations.Playlists
                     playlist.PlaylistEntries.Add(entry);
                 }
 
-                _fileSystem.WriteAllText(playlistPath, new M3u8Content().ToText(playlist));
+                string text = new M3u8Content().ToText(playlist);
+                File.WriteAllText(playlistPath, text);
             }
             if (string.Equals(".pls", extension, StringComparison.OrdinalIgnoreCase))
             {
@@ -449,13 +453,14 @@ namespace Emby.Server.Implementations.Playlists
                     playlist.PlaylistEntries.Add(entry);
                 }
 
-                _fileSystem.WriteAllText(playlistPath, new PlsContent().ToText(playlist));
+                string text = new PlsContent().ToText(playlist);
+                File.WriteAllText(playlistPath, text);
             }
         }
 
         private string NormalizeItemPath(string playlistPath, string itemPath)
         {
-            return MakeRelativePath(_fileSystem.GetDirectoryName(playlistPath), itemPath);
+            return MakeRelativePath(Path.GetDirectoryName(playlistPath), itemPath);
         }
 
         private static string MakeRelativePath(string folderPath, string fileAbsolutePath)

+ 3 - 3
Emby.Server.Implementations/ResourceFileManager.cs

@@ -37,16 +37,16 @@ namespace Emby.Server.Implementations
 
         public string ReadAllText(string basePath, string virtualPath)
         {
-            return _fileSystem.ReadAllText(GetResourcePath(basePath, virtualPath));
+            return File.ReadAllText(GetResourcePath(basePath, virtualPath));
         }
 
         private string GetResourcePath(string basePath, string virtualPath)
         {
-            var fullPath = Path.Combine(basePath, virtualPath.Replace('/', _fileSystem.DirectorySeparatorChar));
+            var fullPath = Path.Combine(basePath, virtualPath.Replace('/', Path.DirectorySeparatorChar));
 
             try
             {
-                fullPath = _fileSystem.GetFullPath(fullPath);
+                fullPath = Path.GetFullPath(fullPath);
             }
             catch (Exception ex)
             {

+ 16 - 12
Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs

@@ -101,17 +101,20 @@ namespace Emby.Server.Implementations.ScheduledTasks
 
             List<string> previouslyFailedImages;
 
-            try
+            if (File.Exists(failHistoryPath))
             {
-                previouslyFailedImages = _fileSystem.ReadAllText(failHistoryPath)
-                    .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries)
-                    .ToList();
-            }
-            catch (FileNotFoundException)
-            {
-                previouslyFailedImages = new List<string>();
+                try
+                {
+                    previouslyFailedImages = File.ReadAllText(failHistoryPath)
+                        .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries)
+                        .ToList();
+                }
+                catch (IOException)
+                {
+                    previouslyFailedImages = new List<string>();
+                }
             }
-            catch (IOException)
+            else
             {
                 previouslyFailedImages = new List<string>();
             }
@@ -136,11 +139,12 @@ namespace Emby.Server.Implementations.ScheduledTasks
                     {
                         previouslyFailedImages.Add(key);
 
-                        var parentPath = _fileSystem.GetDirectoryName(failHistoryPath);
+                        var parentPath = Path.GetDirectoryName(failHistoryPath);
 
-                        _fileSystem.CreateDirectory(parentPath);
+                        Directory.CreateDirectory(parentPath);
 
-                        _fileSystem.WriteAllText(failHistoryPath, string.Join("|", previouslyFailedImages.ToArray()));
+                        string text = string.Join("|", previouslyFailedImages);
+                        File.WriteAllText(failHistoryPath, text);
                     }
 
                     numComplete++;

+ 17 - 35
Emby.Server.Implementations/ScheduledTasks/ScheduledTaskWorker.cs

@@ -129,21 +129,16 @@ namespace Emby.Server.Implementations.ScheduledTasks
                 {
                     if (_lastExecutionResult == null && !_readFromFile)
                     {
-                        try
+                        if (File.Exists(path))
                         {
-                            _lastExecutionResult = JsonSerializer.DeserializeFromFile<TaskResult>(path);
-                        }
-                        catch (DirectoryNotFoundException)
-                        {
-                            // File doesn't exist. No biggie
-                        }
-                        catch (FileNotFoundException)
-                        {
-                            // File doesn't exist. No biggie
-                        }
-                        catch (Exception ex)
-                        {
-                            Logger.LogError(ex, "Error deserializing {path}", path);
+                            try
+                            {
+                                _lastExecutionResult = JsonSerializer.DeserializeFromFile<TaskResult>(path);
+                            }
+                            catch (Exception ex)
+                            {
+                                Logger.LogError(ex, "Error deserializing {File}", path);
+                            }
                         }
                         _readFromFile = true;
                     }
@@ -156,7 +151,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
                 _lastExecutionResult = value;
 
                 var path = GetHistoryFilePath();
-                _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+                Directory.CreateDirectory(Path.GetDirectoryName(path));
 
                 lock (_lastExecutionResultSyncLock)
                 {
@@ -532,28 +527,15 @@ namespace Emby.Server.Implementations.ScheduledTasks
 
         private TaskTriggerInfo[] LoadTriggerSettings()
         {
-            try
+            string path = GetConfigurationFilePath();
+            TaskTriggerInfo[] list = null;
+            if (File.Exists(path))
             {
-                var list = JsonSerializer.DeserializeFromFile<IEnumerable<TaskTriggerInfo>>(GetConfigurationFilePath());
-
-                if (list != null)
-                {
-                    return list.ToArray();
-                }
-            }
-            catch (FileNotFoundException)
-            {
-                // File doesn't exist. No biggie. Return defaults.
-            }
-            catch (DirectoryNotFoundException)
-            {
-                // File doesn't exist. No biggie. Return defaults.
+                list = JsonSerializer.DeserializeFromFile<TaskTriggerInfo[]>(path);
             }
-            catch
-            {
 
-            }
-            return GetDefaultTriggers();
+            // Return defaults if file doesn't exist.
+            return list ?? GetDefaultTriggers();
         }
 
         private TaskTriggerInfo[] GetDefaultTriggers()
@@ -583,7 +565,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         {
             var path = GetConfigurationFilePath();
 
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+            Directory.CreateDirectory(Path.GetDirectoryName(path));
 
             JsonSerializer.SerializeToFile(triggers, path);
         }

+ 1 - 1
Emby.Server.Implementations/ScheduledTasks/TaskManager.cs

@@ -86,7 +86,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
 
             try
             {
-                lines = _fileSystem.ReadAllLines(path).Where(i => !string.IsNullOrWhiteSpace(i)).Distinct(StringComparer.OrdinalIgnoreCase).ToList();
+                lines = File.ReadAllLines(path).Where(i => !string.IsNullOrWhiteSpace(i)).Distinct(StringComparer.OrdinalIgnoreCase).ToList();
 
                 foreach (var key in lines)
                 {

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

@@ -128,7 +128,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
                 {
                     try
                     {
-                        _fileSystem.DeleteDirectory(directory, false);
+                        Directory.Delete(directory, false);
                     }
                     catch (UnauthorizedAccessException ex)
                     {

+ 1 - 1
Emby.Server.Implementations/Serialization/XmlSerializer.cs

@@ -107,7 +107,7 @@ namespace Emby.Server.Implementations.Serialization
         public object DeserializeFromFile(Type type, string file)
         {
             _logger.LogDebug("Deserializing file {0}", file);
-            using (var stream = _fileSystem.OpenRead(file))
+            using (var stream = File.OpenRead(file))
             {
                 return DeserializeFromStream(type, stream);
             }

+ 5 - 5
Emby.Server.Implementations/Updates/InstallationManager.cs

@@ -555,7 +555,7 @@ namespace Emby.Server.Implementations.Updates
             var packageChecksum = string.IsNullOrWhiteSpace(package.checksum) ? Guid.Empty : new Guid(package.checksum);
             if (!packageChecksum.Equals(Guid.Empty)) // support for legacy uploads for now
             {
-                using (var stream = _fileSystem.OpenRead(tempFile))
+                using (var stream = File.OpenRead(tempFile))
                 {
                     var check = Guid.Parse(BitConverter.ToString(_cryptographyProvider.ComputeMD5(stream)).Replace("-", string.Empty));
                     if (check != packageChecksum)
@@ -570,12 +570,12 @@ namespace Emby.Server.Implementations.Updates
             // Success - move it to the real target
             try
             {
-                _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(target));
-                _fileSystem.CopyFile(tempFile, target, true);
+                Directory.CreateDirectory(Path.GetDirectoryName(target));
+                File.Copy(tempFile, target, true);
                 //If it is an archive - write out a version file so we know what it is
                 if (isArchive)
                 {
-                    _fileSystem.WriteAllText(target + ".ver", package.versionStr);
+                    File.WriteAllText(target + ".ver", package.versionStr);
                 }
             }
             catch (IOException ex)
@@ -611,7 +611,7 @@ namespace Emby.Server.Implementations.Updates
             _logger.LogInformation("Deleting plugin file {0}", path);
 
             // Make this case-insensitive to account for possible incorrect assembly naming
-            var file = _fileSystem.GetFilePaths(_fileSystem.GetDirectoryName(path))
+            var file = _fileSystem.GetFilePaths(Path.GetDirectoryName(path))
                 .FirstOrDefault(i => string.Equals(i, path, StringComparison.OrdinalIgnoreCase));
 
             if (!string.IsNullOrWhiteSpace(file))

+ 21 - 0
Jellyfin.Drawing.Skia/Properties/AssemblyInfo.cs

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

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

@@ -219,8 +219,8 @@ namespace Jellyfin.Drawing.Skia
 
             var tempPath = Path.Combine(_appPaths.TempDirectory, Guid.NewGuid() + Path.GetExtension(path) ?? string.Empty);
 
-            fileSystem.CreateDirectory(fileSystem.GetDirectoryName(tempPath));
-            fileSystem.CopyFile(path, tempPath, true);
+            Directory.CreateDirectory(Path.GetDirectoryName(tempPath));
+            File.Copy(path, tempPath, true);
 
             return tempPath;
         }
@@ -257,7 +257,7 @@ namespace Jellyfin.Drawing.Skia
 
         internal static SKBitmap Decode(string path, bool forceCleanBitmap, IFileSystem fileSystem, ImageOrientation? orientation, out SKEncodedOrigin origin)
         {
-            if (!fileSystem.FileExists(path))
+            if (!File.Exists(path))
             {
                 throw new FileNotFoundException("File not found", path);
             }
@@ -532,7 +532,7 @@ namespace Jellyfin.Drawing.Skia
                     // If all we're doing is resizing then we can stop now
                     if (!hasBackgroundColor && !hasForegroundColor && blur == 0 && !hasIndicator)
                     {
-                        _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(outputPath));
+                        Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
                         using (var outputStream = new SKFileWStream(outputPath))
                         using (var pixmap = new SKPixmap(new SKImageInfo(width, height), resizedBitmap.GetPixels()))
                         {
@@ -584,7 +584,7 @@ namespace Jellyfin.Drawing.Skia
                             DrawIndicator(canvas, width, height, options);
                         }
 
-                        _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(outputPath));
+                        Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
                         using (var outputStream = new SKFileWStream(outputPath))
                         {
                             using (var pixmap = new SKPixmap(new SKImageInfo(width, height), saveBitmap.GetPixels()))

+ 1 - 1
MediaBrowser.Api/ApiEntryPoint.cs

@@ -646,7 +646,7 @@ namespace MediaBrowser.Api
         /// <param name="outputFilePath">The output file path.</param>
         private void DeleteHlsPartialStreamFiles(string outputFilePath)
         {
-            var directory = _fileSystem.GetDirectoryName(outputFilePath);
+            var directory = Path.GetDirectoryName(outputFilePath);
             var name = Path.GetFileNameWithoutExtension(outputFilePath);
 
             var filesToDelete = _fileSystem.GetFilePaths(directory)

+ 5 - 5
MediaBrowser.Api/EnvironmentService.cs

@@ -137,14 +137,14 @@ namespace MediaBrowser.Api
             {
                 if (request.IsFile.Value)
                 {
-                    if (!_fileSystem.FileExists(request.Path))
+                    if (!File.Exists(request.Path))
                     {
                         throw new FileNotFoundException("File not found", request.Path);
                     }
                 }
                 else
                 {
-                    if (!_fileSystem.DirectoryExists(request.Path))
+                    if (!Directory.Exists(request.Path))
                     {
                         throw new FileNotFoundException("File not found", request.Path);
                     }
@@ -153,7 +153,7 @@ namespace MediaBrowser.Api
 
             else
             {
-                if (!_fileSystem.FileExists(request.Path) && !_fileSystem.DirectoryExists(request.Path))
+                if (!File.Exists(request.Path) && !Directory.Exists(request.Path))
                 {
                     throw new FileNotFoundException("Path not found", request.Path);
                 }
@@ -169,7 +169,7 @@ namespace MediaBrowser.Api
         {
             var file = Path.Combine(path, Guid.NewGuid().ToString());
 
-            _fileSystem.WriteAllText(file, string.Empty);
+            File.WriteAllText(file, string.Empty);
             _fileSystem.DeleteFile(file);
         }
 
@@ -303,7 +303,7 @@ namespace MediaBrowser.Api
 
         public object Get(GetParentPath request)
         {
-            var parent = _fileSystem.GetDirectoryName(request.Path);
+            var parent = Path.GetDirectoryName(request.Path);
 
             if (string.IsNullOrEmpty(parent))
             {

+ 10 - 10
MediaBrowser.Api/Images/ImageByNameService.cs

@@ -158,7 +158,7 @@ namespace MediaBrowser.Api.Images
 
         private string GetThemeName(string path, string rootImagePath)
         {
-            var parentName = _fileSystem.GetDirectoryName(path);
+            var parentName = Path.GetDirectoryName(path);
 
             if (string.Equals(parentName, rootImagePath, StringComparison.OrdinalIgnoreCase))
             {
@@ -185,7 +185,7 @@ namespace MediaBrowser.Api.Images
 
             var paths = BaseItem.SupportedImageExtensions.Select(i => Path.Combine(_appPaths.GeneralPath, request.Name, filename + i)).ToList();
 
-            var path = paths.FirstOrDefault(_fileSystem.FileExists) ?? paths.FirstOrDefault();
+            var path = paths.FirstOrDefault(File.Exists) ?? paths.FirstOrDefault();
 
             return _resultFactory.GetStaticFileResult(Request, path);
         }
@@ -199,11 +199,11 @@ namespace MediaBrowser.Api.Images
         {
             var themeFolder = Path.Combine(_appPaths.RatingsPath, request.Theme);
 
-            if (_fileSystem.DirectoryExists(themeFolder))
+            if (Directory.Exists(themeFolder))
             {
                 var path = BaseItem.SupportedImageExtensions
                     .Select(i => Path.Combine(themeFolder, request.Name + i))
-                    .FirstOrDefault(_fileSystem.FileExists);
+                    .FirstOrDefault(File.Exists);
 
                 if (!string.IsNullOrEmpty(path))
                 {
@@ -213,14 +213,14 @@ namespace MediaBrowser.Api.Images
 
             var allFolder = Path.Combine(_appPaths.RatingsPath, "all");
 
-            if (_fileSystem.DirectoryExists(allFolder))
+            if (Directory.Exists(allFolder))
             {
                 // Avoid implicitly captured closure
                 var currentRequest = request;
 
                 var path = BaseItem.SupportedImageExtensions
                     .Select(i => Path.Combine(allFolder, currentRequest.Name + i))
-                    .FirstOrDefault(_fileSystem.FileExists);
+                    .FirstOrDefault(File.Exists);
 
                 if (!string.IsNullOrEmpty(path))
                 {
@@ -240,10 +240,10 @@ namespace MediaBrowser.Api.Images
         {
             var themeFolder = Path.Combine(_appPaths.MediaInfoImagesPath, request.Theme);
 
-            if (_fileSystem.DirectoryExists(themeFolder))
+            if (Directory.Exists(themeFolder))
             {
                 var path = BaseItem.SupportedImageExtensions.Select(i => Path.Combine(themeFolder, request.Name + i))
-                    .FirstOrDefault(_fileSystem.FileExists);
+                    .FirstOrDefault(File.Exists);
 
                 if (!string.IsNullOrEmpty(path))
                 {
@@ -253,13 +253,13 @@ namespace MediaBrowser.Api.Images
 
             var allFolder = Path.Combine(_appPaths.MediaInfoImagesPath, "all");
 
-            if (_fileSystem.DirectoryExists(allFolder))
+            if (Directory.Exists(allFolder))
             {
                 // Avoid implicitly captured closure
                 var currentRequest = request;
 
                 var path = BaseItem.SupportedImageExtensions.Select(i => Path.Combine(allFolder, currentRequest.Name + i))
-                    .FirstOrDefault(_fileSystem.FileExists);
+                    .FirstOrDefault(File.Exists);
 
                 if (!string.IsNullOrEmpty(path))
                 {

+ 6 - 6
MediaBrowser.Api/Images/RemoteImageService.cs

@@ -220,9 +220,9 @@ namespace MediaBrowser.Api.Images
 
             try
             {
-                contentPath = _fileSystem.ReadAllText(pointerCachePath);
+                contentPath = File.ReadAllText(pointerCachePath);
 
-                if (_fileSystem.FileExists(contentPath))
+                if (File.Exists(contentPath))
                 {
                     return await ResultFactory.GetStaticFileResult(Request, contentPath).ConfigureAwait(false);
                 }
@@ -239,7 +239,7 @@ namespace MediaBrowser.Api.Images
             await DownloadImage(request.ImageUrl, urlHash, pointerCachePath).ConfigureAwait(false);
 
             // Read the pointer file again
-            contentPath = _fileSystem.ReadAllText(pointerCachePath);
+            contentPath = File.ReadAllText(pointerCachePath);
 
             return await ResultFactory.GetStaticFileResult(Request, contentPath).ConfigureAwait(false);
         }
@@ -264,7 +264,7 @@ namespace MediaBrowser.Api.Images
 
                 var fullCachePath = GetFullCachePath(urlHash + "." + ext);
 
-                _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(fullCachePath));
+                Directory.CreateDirectory(Path.GetDirectoryName(fullCachePath));
                 using (var stream = result.Content)
                 {
                     using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
@@ -273,8 +273,8 @@ namespace MediaBrowser.Api.Images
                     }
                 }
 
-                _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(pointerCachePath));
-                _fileSystem.WriteAllText(pointerCachePath, fullCachePath);
+                Directory.CreateDirectory(Path.GetDirectoryName(pointerCachePath));
+                File.WriteAllText(pointerCachePath, fullCachePath);
             }
         }
 

+ 6 - 6
MediaBrowser.Api/ItemLookupService.cs

@@ -265,9 +265,9 @@ namespace MediaBrowser.Api
 
             try
             {
-                contentPath = _fileSystem.ReadAllText(pointerCachePath);
+                contentPath = File.ReadAllText(pointerCachePath);
 
-                if (_fileSystem.FileExists(contentPath))
+                if (File.Exists(contentPath))
                 {
                     return await ResultFactory.GetStaticFileResult(Request, contentPath).ConfigureAwait(false);
                 }
@@ -284,7 +284,7 @@ namespace MediaBrowser.Api
             await DownloadImage(request.ProviderName, request.ImageUrl, urlHash, pointerCachePath).ConfigureAwait(false);
 
             // Read the pointer file again
-            contentPath = _fileSystem.ReadAllText(pointerCachePath);
+            contentPath = File.ReadAllText(pointerCachePath);
 
             return await ResultFactory.GetStaticFileResult(Request, contentPath).ConfigureAwait(false);
         }
@@ -305,7 +305,7 @@ namespace MediaBrowser.Api
 
             var fullCachePath = GetFullCachePath(urlHash + "." + ext);
 
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(fullCachePath));
+            Directory.CreateDirectory(Path.GetDirectoryName(fullCachePath));
             using (var stream = result.Content)
             {
                 using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
@@ -314,8 +314,8 @@ namespace MediaBrowser.Api
                 }
             }
 
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(pointerCachePath));
-            _fileSystem.WriteAllText(pointerCachePath, fullCachePath);
+            Directory.CreateDirectory(Path.GetDirectoryName(pointerCachePath));
+            File.WriteAllText(pointerCachePath, fullCachePath);
         }
 
         /// <summary>

+ 4 - 4
MediaBrowser.Api/Library/LibraryStructureService.cs

@@ -255,12 +255,12 @@ namespace MediaBrowser.Api.Library
             var currentPath = Path.Combine(rootFolderPath, request.Name);
             var newPath = Path.Combine(rootFolderPath, request.NewName);
 
-            if (!_fileSystem.DirectoryExists(currentPath))
+            if (!Directory.Exists(currentPath))
             {
                 throw new FileNotFoundException("The media collection does not exist");
             }
 
-            if (!string.Equals(currentPath, newPath, StringComparison.OrdinalIgnoreCase) && _fileSystem.DirectoryExists(newPath))
+            if (!string.Equals(currentPath, newPath, StringComparison.OrdinalIgnoreCase) && Directory.Exists(newPath))
             {
                 throw new ArgumentException("Media library already exists at " + newPath + ".");
             }
@@ -273,11 +273,11 @@ namespace MediaBrowser.Api.Library
                 if (string.Equals(currentPath, newPath, StringComparison.OrdinalIgnoreCase))
                 {
                     var tempPath = Path.Combine(rootFolderPath, Guid.NewGuid().ToString("N"));
-                    _fileSystem.MoveDirectory(currentPath, tempPath);
+                    Directory.Move(currentPath, tempPath);
                     currentPath = tempPath;
                 }
 
-                _fileSystem.MoveDirectory(currentPath, newPath);
+                Directory.Move(currentPath, newPath);
             }
             finally
             {

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

@@ -192,7 +192,7 @@ namespace MediaBrowser.Api.Playback
             CancellationTokenSource cancellationTokenSource,
             string workingDirectory = null)
         {
-            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(outputPath));
+            Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
 
             await AcquireResources(state, cancellationTokenSource).ConfigureAwait(false);
 
@@ -258,7 +258,7 @@ namespace MediaBrowser.Api.Playback
             }
 
             var logFilePath = Path.Combine(ServerConfigurationManager.ApplicationPaths.LogDirectoryPath, logFilePrefix + "-" + Guid.NewGuid() + ".txt");
-            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(logFilePath));
+            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.
             state.LogFileStream = FileSystem.GetFileStream(logFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true);
@@ -290,7 +290,7 @@ namespace MediaBrowser.Api.Playback
             new JobLogger(Logger).StartStreamingLog(state, process.StandardError.BaseStream, state.LogFileStream);
 
             // Wait for the file to exist before proceeeding
-            while (!FileSystem.FileExists(state.WaitForPath ?? outputPath) && !transcodingJob.HasExited)
+            while (!File.Exists(state.WaitForPath ?? outputPath) && !transcodingJob.HasExited)
             {
                 await Task.Delay(100, cancellationTokenSource.Token).ConfigureAwait(false);
             }

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

@@ -83,13 +83,13 @@ namespace MediaBrowser.Api.Playback.Hls
             TranscodingJob job = null;
             var playlist = state.OutputFilePath;
 
-            if (!FileSystem.FileExists(playlist))
+            if (!File.Exists(playlist))
             {
                 var transcodingLock = ApiEntryPoint.Instance.GetTranscodingLock(playlist);
                 await transcodingLock.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(false);
                 try
                 {
-                    if (!FileSystem.FileExists(playlist))
+                    if (!File.Exists(playlist))
                     {
                         // If the playlist doesn't already exist, startup ffmpeg
                         try
@@ -264,7 +264,7 @@ namespace MediaBrowser.Api.Playback.Hls
             var useGenericSegmenter = true;
             if (useGenericSegmenter)
             {
-                var outputTsArg = Path.Combine(FileSystem.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath)) + "%d" + GetSegmentFileExtension(state.Request);
+                var outputTsArg = Path.Combine(Path.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath)) + "%d" + GetSegmentFileExtension(state.Request);
 
                 var timeDeltaParam = string.Empty;
 

+ 8 - 8
MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs

@@ -164,7 +164,7 @@ namespace MediaBrowser.Api.Playback.Hls
 
             TranscodingJob job = null;
 
-            if (FileSystem.FileExists(segmentPath))
+            if (File.Exists(segmentPath))
             {
                 job = ApiEntryPoint.Instance.OnTranscodeBeginRequest(playlistPath, TranscodingJobType);
                 return await GetSegmentResult(state, playlistPath, segmentPath, segmentExtension, requestedIndex, job, cancellationToken).ConfigureAwait(false);
@@ -177,7 +177,7 @@ namespace MediaBrowser.Api.Playback.Hls
 
             try
             {
-                if (FileSystem.FileExists(segmentPath))
+                if (File.Exists(segmentPath))
                 {
                     job = ApiEntryPoint.Instance.OnTranscodeBeginRequest(playlistPath, TranscodingJobType);
                     transcodingLock.Release();
@@ -381,7 +381,7 @@ namespace MediaBrowser.Api.Playback.Hls
 
         private static FileSystemMetadata GetLastTranscodingFile(string playlist, string segmentExtension, IFileSystem fileSystem)
         {
-            var folder = fileSystem.GetDirectoryName(playlist);
+            var folder = Path.GetDirectoryName(playlist);
 
             var filePrefix = Path.GetFileNameWithoutExtension(playlist) ?? string.Empty;
 
@@ -418,7 +418,7 @@ namespace MediaBrowser.Api.Playback.Hls
 
         private string GetSegmentPath(StreamState state, string playlist, int index)
         {
-            var folder = FileSystem.GetDirectoryName(playlist);
+            var folder = Path.GetDirectoryName(playlist);
 
             var filename = Path.GetFileNameWithoutExtension(playlist);
 
@@ -433,7 +433,7 @@ namespace MediaBrowser.Api.Playback.Hls
             TranscodingJob transcodingJob,
             CancellationToken cancellationToken)
         {
-            var segmentFileExists = FileSystem.FileExists(segmentPath);
+            var segmentFileExists = File.Exists(segmentPath);
 
             // If all transcoding has completed, just return immediately
             if (transcodingJob != null && transcodingJob.HasExited && segmentFileExists)
@@ -458,14 +458,14 @@ namespace MediaBrowser.Api.Playback.Hls
             {
                 try
                 {
-                    var text = FileSystem.ReadAllText(playlistPath, Encoding.UTF8);
+                    var text = File.ReadAllText(playlistPath, Encoding.UTF8);
 
                     // If it appears in the playlist, it's done
                     if (text.IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1)
                     {
                         if (!segmentFileExists)
                         {
-                            segmentFileExists = FileSystem.FileExists(segmentPath);
+                            segmentFileExists = File.Exists(segmentPath);
                         }
                         if (segmentFileExists)
                         {
@@ -932,7 +932,7 @@ namespace MediaBrowser.Api.Playback.Hls
 
             var mapArgs = state.IsOutputVideo ? EncodingHelper.GetMapArgs(state) : string.Empty;
 
-            var outputTsArg = Path.Combine(FileSystem.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath)) + "%d" + GetSegmentFileExtension(state.Request);
+            var outputTsArg = Path.Combine(Path.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath)) + "%d" + GetSegmentFileExtension(state.Request);
 
             var timeDeltaParam = string.Empty;
 

+ 3 - 2
MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Globalization;
+using System.IO;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common.Net;
@@ -153,7 +154,7 @@ namespace MediaBrowser.Api.Playback.Progressive
             }
 
             var outputPath = state.OutputFilePath;
-            var outputPathExists = FileSystem.FileExists(outputPath);
+            var outputPathExists = File.Exists(outputPath);
 
             var transcodingJob = ApiEntryPoint.Instance.GetTranscodingJob(outputPath, TranscodingJobType.Progressive);
             var isTranscodeCached = outputPathExists && transcodingJob != null;
@@ -377,7 +378,7 @@ namespace MediaBrowser.Api.Playback.Progressive
             {
                 TranscodingJob job;
 
-                if (!FileSystem.FileExists(outputPath))
+                if (!File.Exists(outputPath))
                 {
                     job = await StartFfMpeg(state, outputPath, cancellationTokenSource).ConfigureAwait(false);
                 }

+ 8 - 18
MediaBrowser.Api/PluginService.cs

@@ -153,7 +153,11 @@ namespace MediaBrowser.Api
         private readonly INetworkManager _network;
         private readonly IDeviceManager _deviceManager;
 
-        public PluginService(IJsonSerializer jsonSerializer, IApplicationHost appHost, IInstallationManager installationManager, INetworkManager network, IDeviceManager deviceManager)
+        public PluginService(IJsonSerializer jsonSerializer,
+            IApplicationHost appHost,
+            IInstallationManager installationManager,
+            INetworkManager network,
+            IDeviceManager deviceManager)
             : base()
         {
             if (jsonSerializer == null)
@@ -173,7 +177,7 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>System.Object.</returns>
-        public async Task<object> Get(GetRegistrationStatus request)
+        public object Get(GetRegistrationStatus request)
         {
             var record = new MBRegistrationRecord
             {
@@ -187,26 +191,12 @@ namespace MediaBrowser.Api
             return ToOptimizedResult(record);
         }
 
-        //TODO this function is only kept for compatibility and should be removed once paid plugins break
-        public async Task<object> Get(GetRegistration request)
-        {
-            var info = new RegistrationInfo
-            {
-                ExpirationDate = DateTime.Now.AddYears(100),
-                IsRegistered = true,
-                IsTrial = false,
-                Name = request.Name
-            };
-
-            return ToOptimizedResult(info);
-        }
-
         /// <summary>
         /// Gets the specified request.
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>System.Object.</returns>
-        public async Task<object> Get(GetPlugins request)
+        public object Get(GetPlugins request)
         {
             var result = _appHost.Plugins.OrderBy(p => p.Name).Select(p => p.GetPluginInfo()).ToArray();
             return ToOptimizedResult(result);
@@ -230,7 +220,7 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>System.Object.</returns>
-        public async Task<object> Get(GetPluginSecurityInfo request)
+        public object Get(GetPluginSecurityInfo request)
         {
             var result = new PluginSecurityInfo
             {

+ 8 - 1
MediaBrowser.Api/StartupWizardService.cs

@@ -102,7 +102,8 @@ namespace MediaBrowser.Api
             return new StartupUser
             {
                 Name = user.Name,
-                ConnectUserName = user.ConnectUserName
+                ConnectUserName = user.ConnectUserName,
+                Password = user.Password
             };
         }
 
@@ -111,8 +112,13 @@ namespace MediaBrowser.Api
             var user = _userManager.Users.First();
 
             user.Name = request.Name;
+
             _userManager.UpdateUser(user);
 
+            if (!string.IsNullOrEmpty(request.Password)) {
+                await _userManager.ChangePassword(user, request.Password).ConfigureAwait(false);
+            }
+
             var result = new UpdateStartupUserResult();
 
             return result;
@@ -130,6 +136,7 @@ namespace MediaBrowser.Api
     {
         public string Name { get; set; }
         public string ConnectUserName { get; set; }
+        public string Password { get; set; }
     }
 
     public class UpdateStartupUserResult

+ 5 - 5
MediaBrowser.Api/UserLibrary/PlaystateService.cs

@@ -267,13 +267,13 @@ namespace MediaBrowser.Api.UserLibrary
 
             var session = GetSession(_sessionContext);
 
-            var dto = await UpdatePlayedStatus(user, request.Id, true, datePlayed).ConfigureAwait(false);
+            var dto = UpdatePlayedStatus(user, request.Id, true, datePlayed);
 
             foreach (var additionalUserInfo in session.AdditionalUsers)
             {
                 var additionalUser = _userManager.GetUserById(additionalUserInfo.UserId);
 
-                await UpdatePlayedStatus(additionalUser, request.Id, true, datePlayed).ConfigureAwait(false);
+                UpdatePlayedStatus(additionalUser, request.Id, true, datePlayed);
             }
 
             return dto;
@@ -412,13 +412,13 @@ namespace MediaBrowser.Api.UserLibrary
 
             var session = GetSession(_sessionContext);
 
-            var dto = await UpdatePlayedStatus(user, request.Id, false, null).ConfigureAwait(false);
+            var dto = UpdatePlayedStatus(user, request.Id, false, null);
 
             foreach (var additionalUserInfo in session.AdditionalUsers)
             {
                 var additionalUser = _userManager.GetUserById(additionalUserInfo.UserId);
 
-                await UpdatePlayedStatus(additionalUser, request.Id, false, null).ConfigureAwait(false);
+                UpdatePlayedStatus(additionalUser, request.Id, false, null);
             }
 
             return dto;
@@ -432,7 +432,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// <param name="wasPlayed">if set to <c>true</c> [was played].</param>
         /// <param name="datePlayed">The date played.</param>
         /// <returns>Task.</returns>
-        private async Task<UserItemDataDto> UpdatePlayedStatus(User user, string itemId, bool wasPlayed, DateTime? datePlayed)
+        private UserItemDataDto UpdatePlayedStatus(User user, string itemId, bool wasPlayed, DateTime? datePlayed)
         {
             var item = _libraryManager.GetItemById(itemId);
 

+ 2 - 1
MediaBrowser.Controller/Drawing/ImageHelper.cs

@@ -63,7 +63,8 @@ namespace MediaBrowser.Controller.Drawing
                 case ImageType.Logo:
                     return 2.58;
                 case ImageType.Primary:
-                    return item.GetDefaultPrimaryImageAspectRatio();
+                    double defaultPrimaryImageAspectRatio = item.GetDefaultPrimaryImageAspectRatio();
+                    return defaultPrimaryImageAspectRatio > 0 ? defaultPrimaryImageAspectRatio : 2.0 / 3;
                 default:
                     return 1;
             }

+ 7 - 6
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Globalization;
+using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading;
@@ -228,7 +229,7 @@ namespace MediaBrowser.Controller.Entities
                     return Path;
                 }
 
-                return FileSystem.GetDirectoryName(Path);
+                return System.IO.Path.GetDirectoryName(Path);
             }
         }
 
@@ -1518,7 +1519,7 @@ namespace MediaBrowser.Controller.Entities
 
         public virtual double GetDefaultPrimaryImageAspectRatio()
         {
-            return 2.0 / 3;
+            return 0;
         }
 
         public virtual string CreatePresentationUniqueKey()
@@ -2208,7 +2209,7 @@ namespace MediaBrowser.Controller.Entities
         {
             var allFiles = ImageInfos
                 .Where(i => i.IsLocalFile)
-                .Select(i => FileSystem.GetDirectoryName(i.Path))
+                .Select(i => System.IO.Path.GetDirectoryName(i.Path))
                 .Distinct(StringComparer.OrdinalIgnoreCase)
                 .SelectMany(i => directoryService.GetFilePaths(i))
                 .ToList();
@@ -2343,7 +2344,7 @@ namespace MediaBrowser.Controller.Entities
                 var newImagePaths = images.Select(i => i.FullName).ToList();
 
                 var deleted = existingImages
-                    .Where(i => i.IsLocalFile && !newImagePaths.Contains(i.Path, StringComparer.OrdinalIgnoreCase) && !FileSystem.FileExists(i.Path))
+                    .Where(i => i.IsLocalFile && !newImagePaths.Contains(i.Path, StringComparer.OrdinalIgnoreCase) && !File.Exists(i.Path))
                     .ToList();
 
                 if (deleted.Count > 0)
@@ -2396,7 +2397,7 @@ namespace MediaBrowser.Controller.Entities
             var extensions = new List<string> { ".nfo", ".xml", ".srt", ".vtt", ".sub", ".idx", ".txt", ".edl", ".bif", ".smi", ".ttml" };
             extensions.AddRange(SupportedImageExtensions);
 
-            return FileSystem.GetFiles(FileSystem.GetDirectoryName(Path), extensions.ToArray(), false, false)
+            return FileSystem.GetFiles(System.IO.Path.GetDirectoryName(Path), extensions.ToArray(), false, false)
                 .Where(i => System.IO.Path.GetFileNameWithoutExtension(i.FullName).StartsWith(filename, StringComparison.OrdinalIgnoreCase))
                 .ToList();
         }
@@ -2508,7 +2509,7 @@ namespace MediaBrowser.Controller.Entities
 
             if (string.IsNullOrEmpty(Name) && !string.IsNullOrEmpty(Path))
             {
-                Name = FileSystem.GetFileNameWithoutExtension(Path);
+                Name = System.IO.Path.GetFileNameWithoutExtension(Path);
                 hasChanges = true;
             }
 

+ 1 - 1
MediaBrowser.Controller/Entities/Game.cs

@@ -87,7 +87,7 @@ namespace MediaBrowser.Controller.Entities
                 return new[] {
                     new FileSystemMetadata
                     {
-                        FullName = FileSystem.GetDirectoryName(Path),
+                        FullName = System.IO.Path.GetDirectoryName(Path),
                         IsDirectory = true
                     }
                 };

+ 1 - 1
MediaBrowser.Controller/Entities/TV/Season.cs

@@ -97,7 +97,7 @@ namespace MediaBrowser.Controller.Entities.TV
                     return series.Path;
                 }
 
-                return FileSystem.GetDirectoryName(Path);
+                return System.IO.Path.GetDirectoryName(Path);
             }
         }
 

+ 6 - 5
MediaBrowser.Controller/Entities/User.cs

@@ -1,4 +1,5 @@
 using System;
+using System.IO;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Controller.Library;
@@ -167,18 +168,18 @@ namespace MediaBrowser.Controller.Entities
                 var oldConfigurationDirectory = ConfigurationDirectoryPath;
 
                 // Exceptions will be thrown if these paths already exist
-                if (FileSystem.DirectoryExists(newConfigDirectory))
+                if (Directory.Exists(newConfigDirectory))
                 {
-                    FileSystem.DeleteDirectory(newConfigDirectory, true);
+                    Directory.Delete(newConfigDirectory, true);
                 }
 
-                if (FileSystem.DirectoryExists(oldConfigurationDirectory))
+                if (Directory.Exists(oldConfigurationDirectory))
                 {
-                    FileSystem.MoveDirectory(oldConfigurationDirectory, newConfigDirectory);
+                    Directory.Move(oldConfigurationDirectory, newConfigDirectory);
                 }
                 else
                 {
-                    FileSystem.CreateDirectory(newConfigDirectory);
+                    Directory.CreateDirectory(newConfigDirectory);
                 }
             }
 

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

@@ -345,7 +345,7 @@ namespace MediaBrowser.Controller.Entities
             {
                 if (IsStacked)
                 {
-                    return FileSystem.GetDirectoryName(Path);
+                    return System.IO.Path.GetDirectoryName(Path);
                 }
 
                 if (!IsPlaceHolder)

+ 1 - 1
MediaBrowser.Controller/Library/ItemResolveArgs.cs

@@ -85,7 +85,7 @@ namespace MediaBrowser.Controller.Library
                     return false;
                 }
 
-                var parentDir = BaseItem.FileSystem.GetDirectoryName(Path) ?? string.Empty;
+                var parentDir = System.IO.Path.GetDirectoryName(Path) ?? string.Empty;
 
                 return parentDir.Length > _appPaths.RootFolderPath.Length
                        && parentDir.StartsWith(_appPaths.RootFolderPath, StringComparison.OrdinalIgnoreCase);

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

@@ -434,7 +434,7 @@ namespace MediaBrowser.Controller.MediaEncoding
                     if (string.Equals(Path.GetExtension(subtitlePath), ".sub", StringComparison.OrdinalIgnoreCase))
                     {
                         var idxFile = Path.ChangeExtension(subtitlePath, ".idx");
-                        if (_fileSystem.FileExists(idxFile))
+                        if (File.Exists(idxFile))
                         {
                             subtitlePath = idxFile;
                         }
@@ -542,7 +542,7 @@ namespace MediaBrowser.Controller.MediaEncoding
             // var fallbackFontPath = Path.Combine(_appPaths.ProgramDataPath, "fonts", "DroidSansFallback.ttf");
             // string fallbackFontParam = string.Empty;
 
-            // if (!_fileSystem.FileExists(fallbackFontPath))
+            // if (!File.Exists(fallbackFontPath))
             // {
             //     _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(fallbackFontPath));
             //     using (var stream = _assemblyInfo.GetManifestResourceStream(GetType(), GetType().Namespace + ".DroidSansFallback.ttf"))

+ 1 - 1
MediaBrowser.Controller/Playlists/Playlist.cs

@@ -50,7 +50,7 @@ namespace MediaBrowser.Controller.Playlists
 
                 if (IsPlaylistFile(path))
                 {
-                    return FileSystem.GetDirectoryName(path);
+                    return System.IO.Path.GetDirectoryName(path);
                 }
 
                 return path;

+ 0 - 5
MediaBrowser.Controller/Subtitles/ISubtitleManager.cs

@@ -15,11 +15,6 @@ namespace MediaBrowser.Controller.Subtitles
         /// </summary>
         event EventHandler<SubtitleDownloadFailureEventArgs> SubtitleDownloadFailure;
 
-        /// <summary>
-        /// Occurs when [subtitles downloaded].
-        /// </summary>
-        event EventHandler<SubtitleDownloadEventArgs> SubtitlesDownloaded;
-
         /// <summary>
         /// Adds the parts.
         /// </summary>

+ 3 - 2
MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.TV;
@@ -29,11 +30,11 @@ namespace MediaBrowser.LocalMetadata.Images
 
         public List<LocalImageInfo> GetImages(BaseItem item, IDirectoryService directoryService)
         {
-            var parentPath = _fileSystem.GetDirectoryName(item.Path);
+            var parentPath = Path.GetDirectoryName(item.Path);
 
             var parentPathFiles = directoryService.GetFiles(parentPath);
 
-            var nameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(item.Path);
+            var nameWithoutExtension = Path.GetFileNameWithoutExtension(item.Path);
 
             return GetFilesFromParentFolder(nameWithoutExtension, parentPathFiles);
         }

+ 1 - 1
MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs

@@ -102,7 +102,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
         {
             item.ResetPeople();
 
-            using (var fileStream = FileSystem.OpenRead(metadataFile))
+            using (var fileStream = File.OpenRead(metadataFile))
             {
                 using (var streamReader = new StreamReader(fileStream, encoding))
                 {

+ 1 - 1
MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs

@@ -33,7 +33,7 @@ namespace MediaBrowser.LocalMetadata.Providers
             var specificFile = Path.ChangeExtension(info.Path, ".xml");
             var file = FileSystem.GetFileInfo(specificFile);
 
-            return info.IsInMixedFolder || file.Exists ? file : FileSystem.GetFileInfo(Path.Combine(FileSystem.GetDirectoryName(info.Path), "game.xml"));
+            return info.IsInMixedFolder || file.Exists ? file : FileSystem.GetFileInfo(Path.Combine(Path.GetDirectoryName(info.Path), "game.xml"));
         }
     }
 }

+ 1 - 1
MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs

@@ -94,7 +94,7 @@ namespace MediaBrowser.LocalMetadata.Savers
 
         private void SaveToFile(Stream stream, string path)
         {
-            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(path));
+            Directory.CreateDirectory(Path.GetDirectoryName(path));
             // On Windows, savint the file will fail if the file is hidden or readonly
             FileSystem.SetAttributes(path, false, false);
 

+ 1 - 1
MediaBrowser.MediaEncoding/Configuration/EncodingConfigurationFactory.cs

@@ -46,7 +46,7 @@ namespace MediaBrowser.MediaEncoding.Configuration
                 && !string.Equals(oldEncodingConfig.TranscodingTempPath ?? string.Empty, newPath))
             {
                 // Validate
-                if (!_fileSystem.DirectoryExists(newPath))
+                if (!Directory.Exists(newPath))
                 {
                     throw new FileNotFoundException(string.Format("{0} does not exist.", newPath));
                 }

+ 3 - 3
MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs

@@ -67,7 +67,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
                 .CreateJob(options, EncodingHelper, IsVideoEncoder, progress, cancellationToken).ConfigureAwait(false);
 
             encodingJob.OutputFilePath = GetOutputFilePath(encodingJob);
-            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(encodingJob.OutputFilePath));
+            Directory.CreateDirectory(Path.GetDirectoryName(encodingJob.OutputFilePath));
 
             encodingJob.ReadInputAtNativeFramerate = options.ReadInputAtNativeFramerate;
 
@@ -105,7 +105,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
             Logger.LogInformation(commandLineLogMessage);
 
             var logFilePath = Path.Combine(ConfigurationManager.CommonApplicationPaths.LogDirectoryPath, "transcode-" + Guid.NewGuid() + ".txt");
-            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(logFilePath));
+            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.
             encodingJob.LogFileStream = FileSystem.GetFileStream(logFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true);
@@ -137,7 +137,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
             new JobLogger(Logger).StartStreamingLog(encodingJob, process.StandardError.BaseStream, encodingJob.LogFileStream);
 
             // Wait for the file to exist before proceeeding
-            while (!FileSystem.FileExists(encodingJob.OutputFilePath) && !encodingJob.HasExited)
+            while (!File.Exists(encodingJob.OutputFilePath) && !encodingJob.HasExited)
             {
                 await Task.Delay(100, cancellationToken).ConfigureAwait(false);
             }

+ 7 - 7
MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs

@@ -214,7 +214,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
                     throw new ArgumentNullException(nameof(path));
                 }
 
-                if (!FileSystem.FileExists(path) && !FileSystem.DirectoryExists(path))
+                if (!File.Exists(path) && !Directory.Exists(path))
                 {
                     throw new ResourceNotFoundException();
                 }
@@ -288,12 +288,12 @@ namespace MediaBrowser.MediaEncoding.Encoder
 
             if (!string.IsNullOrWhiteSpace(appPath))
             {
-                if (FileSystem.DirectoryExists(appPath))
+                if (Directory.Exists(appPath))
                 {
                     return GetPathsFromDirectory(appPath);
                 }
 
-                if (FileSystem.FileExists(appPath))
+                if (File.Exists(appPath))
                 {
                     return new Tuple<string, string>(appPath, GetProbePathFromEncoderPath(appPath));
                 }
@@ -336,7 +336,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
             var ffmpegPath = files.FirstOrDefault(i => string.Equals(Path.GetFileNameWithoutExtension(i), "ffmpeg", StringComparison.OrdinalIgnoreCase) && !excludeExtensions.Contains(Path.GetExtension(i) ?? string.Empty));
             var ffprobePath = files.FirstOrDefault(i => string.Equals(Path.GetFileNameWithoutExtension(i), "ffprobe", StringComparison.OrdinalIgnoreCase) && !excludeExtensions.Contains(Path.GetExtension(i) ?? string.Empty));
 
-            if (string.IsNullOrWhiteSpace(ffmpegPath) || !FileSystem.FileExists(ffmpegPath))
+            if (string.IsNullOrWhiteSpace(ffmpegPath) || !File.Exists(ffmpegPath))
             {
                 files = FileSystem.GetFilePaths(path, true);
 
@@ -353,7 +353,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 
         private string GetProbePathFromEncoderPath(string appPath)
         {
-            return FileSystem.GetFilePaths(FileSystem.GetDirectoryName(appPath))
+            return FileSystem.GetFilePaths(Path.GetDirectoryName(appPath))
                 .FirstOrDefault(i => string.Equals(Path.GetFileNameWithoutExtension(i), "ffprobe", StringComparison.OrdinalIgnoreCase));
         }
 
@@ -608,7 +608,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
             }
 
             var tempExtractPath = Path.Combine(ConfigurationManager.ApplicationPaths.TempDirectory, Guid.NewGuid() + ".jpg");
-            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(tempExtractPath));
+            Directory.CreateDirectory(Path.GetDirectoryName(tempExtractPath));
 
             // apply some filters to thumbnail extracted below (below) crop any black lines that we made and get the correct ar then scale to width 600.
             // This filter chain may have adverse effects on recorded tv thumbnails if ar changes during presentation ex. commercials @ diff ar
@@ -770,7 +770,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
                 vf += string.Format(",scale=min(iw\\,{0}):trunc(ow/dar/2)*2", maxWidthParam);
             }
 
-            FileSystem.CreateDirectory(targetDirectory);
+            Directory.CreateDirectory(targetDirectory);
             var outputPath = Path.Combine(targetDirectory, filenamePrefix + "%05d.jpg");
 
             var args = string.Format("-i {0} -threads 0 -v quiet -vf \"{2}\" -f image2 \"{1}\"", inputArgument, outputPath, vf);

+ 1 - 1
MediaBrowser.MediaEncoding/Subtitles/OpenSubtitleDownloader.cs

@@ -269,7 +269,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
             var subLanguageId = NormalizeLanguage(request.Language);
             string hash;
 
-            using (var fileStream = _fileSystem.OpenRead(request.MediaPath))
+            using (var fileStream = File.OpenRead(request.MediaPath))
             {
                 hash = Utilities.ComputeHash(fileStream);
             }

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

@@ -210,7 +210,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
                 }
             }
 
-            return _fileSystem.OpenRead(path);
+            return File.OpenRead(path);
         }
 
         private async Task<SubtitleInfo> GetReadableFile(
@@ -386,7 +386,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 
             try
             {
-                if (!_fileSystem.FileExists(outputPath))
+                if (!File.Exists(outputPath))
                 {
                     await ConvertTextSubtitleToSrtInternal(inputPath, language, inputProtocol, outputPath, cancellationToken).ConfigureAwait(false);
                 }
@@ -422,7 +422,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
                 throw new ArgumentNullException(nameof(outputPath));
             }
 
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(outputPath));
+            Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
 
             var encodingParam = await GetSubtitleFileCharacterSet(inputPath, language, inputProtocol, cancellationToken).ConfigureAwait(false);
 
@@ -481,7 +481,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
             {
                 failed = true;
 
-                if (_fileSystem.FileExists(outputPath))
+                if (File.Exists(outputPath))
                 {
                     try
                     {
@@ -494,7 +494,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
                     }
                 }
             }
-            else if (!_fileSystem.FileExists(outputPath))
+            else if (!File.Exists(outputPath))
             {
                 failed = true;
             }
@@ -537,7 +537,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 
             try
             {
-                if (!_fileSystem.FileExists(outputPath))
+                if (!File.Exists(outputPath))
                 {
                     await ExtractTextSubtitleInternal(_mediaEncoder.GetInputArgument(inputFiles, protocol), subtitleStreamIndex, outputCodec, outputPath, cancellationToken).ConfigureAwait(false);
                 }
@@ -565,7 +565,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
                 throw new ArgumentNullException(nameof(outputPath));
             }
 
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(outputPath));
+            Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
 
             var processArgs = string.Format("-i {0} -map 0:{1} -an -vn -c:s {2} \"{3}\"", inputPath,
                 subtitleStreamIndex, outputCodec, outputPath);
@@ -634,7 +634,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
                     _logger.LogError(ex, "Error deleting extracted subtitle {Path}", outputPath);
                 }
             }
-            else if (!_fileSystem.FileExists(outputPath))
+            else if (!File.Exists(outputPath))
             {
                 failed = true;
             }
@@ -672,7 +672,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
             string text;
             Encoding encoding;
 
-            using (var fileStream = _fileSystem.OpenRead(file))
+            using (var fileStream = File.OpenRead(file))
             using (var reader = new StreamReader(fileStream, true))
             {
                 encoding = reader.CurrentEncoding;
@@ -747,7 +747,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
             }
             if (protocol == MediaProtocol.File)
             {
-                return _fileSystem.ReadAllBytes(path);
+                return File.ReadAllBytes(path);
             }
 
             throw new ArgumentOutOfRangeException(nameof(protocol));

+ 18 - 124
MediaBrowser.Model/IO/IFileSystem.cs

@@ -36,32 +36,32 @@ namespace MediaBrowser.Model.IO
         string MakeAbsolutePath(string folderPath, string filePath);
 
         /// <summary>
-        /// Returns a <see cref="FileSystemMetadata"/> object for the specified file or directory path.
+        /// Returns a <see cref="FileSystemMetadata" /> object for the specified file or directory path.
         /// </summary>
         /// <param name="path">A path to a file or directory.</param>
-        /// <returns>A <see cref="FileSystemMetadata"/> object.</returns>
-        /// <remarks>If the specified path points to a directory, the returned <see cref="FileSystemMetadata"/> object's
-        /// <see cref="FileSystemMetadata.IsDirectory"/> property will be set to true and all other properties will reflect the properties of the directory.</remarks>
+        /// <returns>A <see cref="FileSystemMetadata" /> object.</returns>
+        /// <remarks>If the specified path points to a directory, the returned <see cref="FileSystemMetadata" /> object's
+        /// <see cref="FileSystemMetadata.IsDirectory" /> property will be set to true and all other properties will reflect the properties of the directory.</remarks>
         FileSystemMetadata GetFileSystemInfo(string path);
 
         /// <summary>
-        /// Returns a <see cref="FileSystemMetadata"/> object for the specified file path.
+        /// Returns a <see cref="FileSystemMetadata" /> object for the specified file path.
         /// </summary>
         /// <param name="path">A path to a file.</param>
-        /// <returns>A <see cref="FileSystemMetadata"/> object.</returns>
-        /// <remarks><para>If the specified path points to a directory, the returned <see cref="FileSystemMetadata"/> object's
-        /// <see cref="FileSystemMetadata.IsDirectory"/> property and the <see cref="FileSystemMetadata.Exists"/> property will both be set to false.</para>
-        /// <para>For automatic handling of files <b>and</b> directories, use <see cref="GetFileSystemInfo"/>.</para></remarks>
+        /// <returns>A <see cref="FileSystemMetadata" /> object.</returns>
+        /// <remarks><para>If the specified path points to a directory, the returned <see cref="FileSystemMetadata" /> object's
+        /// <see cref="FileSystemMetadata.IsDirectory" /> property and the <see cref="FileSystemMetadata.Exists" /> property will both be set to false.</para>
+        /// <para>For automatic handling of files <b>and</b> directories, use <see cref="M:IFileSystem.GetFileSystemInfo(System.String)" />.</para></remarks>
         FileSystemMetadata GetFileInfo(string path);
 
         /// <summary>
-        /// Returns a <see cref="FileSystemMetadata"/> object for the specified directory path.
+        /// Returns a <see cref="FileSystemMetadata" /> object for the specified directory path.
         /// </summary>
         /// <param name="path">A path to a directory.</param>
-        /// <returns>A <see cref="FileSystemMetadata"/> object.</returns>
-        /// <remarks><para>If the specified path points to a file, the returned <see cref="FileSystemMetadata"/> object's
-        /// <see cref="FileSystemMetadata.IsDirectory"/> property will be set to true and the <see cref="FileSystemMetadata.Exists"/> property will be set to false.</para>
-        /// <para>For automatic handling of files <b>and</b> directories, use <see cref="GetFileSystemInfo"/>.</para></remarks>
+        /// <returns>A <see cref="FileSystemMetadata" /> object.</returns>
+        /// <remarks><para>If the specified path points to a file, the returned <see cref="FileSystemMetadata" /> object's
+        /// <see cref="FileSystemMetadata.IsDirectory" /> property will be set to true and the <see cref="FileSystemMetadata.Exists" /> property will be set to false.</para>
+        /// <para>For automatic handling of files <b>and</b> directories, use <see cref="M:IFileSystem.GetFileSystemInfo(System.String)" />.</para></remarks>
         FileSystemMetadata GetDirectoryInfo(string path);
 
         /// <summary>
@@ -110,14 +110,8 @@ namespace MediaBrowser.Model.IO
         /// <returns>FileStream.</returns>
         Stream GetFileStream(string path, FileOpenMode mode, FileAccessMode access, FileShareMode share, bool isAsync = false);
 
-        Stream GetFileStream(string path, FileOpenMode mode, FileAccessMode access, FileShareMode share, FileOpenOptions fileOpenOptions);
-
-        /// <summary>
-        /// Opens the read.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        /// <returns>Stream.</returns>
-        Stream OpenRead(string path);
+        Stream GetFileStream(string path, FileOpenMode mode, FileAccessMode access, FileShareMode share,
+            FileOpenOptions fileOpenOptions);
 
         string DefaultDirectory { get; }
 
@@ -152,8 +146,6 @@ namespace MediaBrowser.Model.IO
         /// <returns>System.String.</returns>
         string NormalizePath(string path);
 
-        string GetDirectoryName(string path);
-
         /// <summary>
         /// Gets the file name without extension.
         /// </summary>
@@ -161,13 +153,6 @@ namespace MediaBrowser.Model.IO
         /// <returns>System.String.</returns>
         string GetFileNameWithoutExtension(FileSystemMetadata info);
 
-        /// <summary>
-        /// Gets the file name without extension.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        /// <returns>System.String.</returns>
-        string GetFileNameWithoutExtension(string path);
-
         /// <summary>
         /// Determines whether [is path file] [the specified path].
         /// </summary>
@@ -181,13 +166,6 @@ namespace MediaBrowser.Model.IO
         /// <param name="path">The path.</param>
         void DeleteFile(string path);
 
-        /// <summary>
-        /// Deletes the directory.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        /// <param name="recursive">if set to <c>true</c> [recursive].</param>
-        void DeleteDirectory(string path, bool recursive);
-
         /// <summary>
         /// Gets the directories.
         /// </summary>
@@ -211,86 +189,6 @@ namespace MediaBrowser.Model.IO
         /// <returns>IEnumerable&lt;FileSystemMetadata&gt;.</returns>
         IEnumerable<FileSystemMetadata> GetFileSystemEntries(string path, bool recursive = false);
 
-        /// <summary>
-        /// Creates the directory.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        void CreateDirectory(string path);
-
-        /// <summary>
-        /// Copies the file.
-        /// </summary>
-        /// <param name="source">The source.</param>
-        /// <param name="target">The target.</param>
-        /// <param name="overwrite">if set to <c>true</c> [overwrite].</param>
-        void CopyFile(string source, string target, bool overwrite);
-
-        /// <summary>
-        /// Moves the file.
-        /// </summary>
-        /// <param name="source">The source.</param>
-        /// <param name="target">The target.</param>
-        void MoveFile(string source, string target);
-
-        /// <summary>
-        /// Moves the directory.
-        /// </summary>
-        /// <param name="source">The source.</param>
-        /// <param name="target">The target.</param>
-        void MoveDirectory(string source, string target);
-
-        /// <summary>
-        /// Directories the exists.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
-        bool DirectoryExists(string path);
-
-        /// <summary>
-        /// Files the exists.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
-        bool FileExists(string path);
-
-        /// <summary>
-        /// Reads all text.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        /// <returns>System.String.</returns>
-        string ReadAllText(string path);
-
-        byte[] ReadAllBytes(string path);
-
-        void WriteAllBytes(string path, byte[] bytes);
-
-        /// <summary>
-        /// Writes all text.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        /// <param name="text">The text.</param>
-        void WriteAllText(string path, string text);
-
-        /// <summary>
-        /// Writes all text.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        /// <param name="text">The text.</param>
-        /// <param name="encoding">The encoding.</param>
-        void WriteAllText(string path, string text, Encoding encoding);
-
-        /// <summary>
-        /// Reads all text.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        /// <param name="encoding">The encoding.</param>
-        /// <returns>System.String.</returns>
-        string ReadAllText(string path, Encoding encoding);
-
-        string[] ReadAllLines(string path);
-
-        void WriteAllLines(string path, IEnumerable<string> lines);
-
         /// <summary>
         /// Gets the directory paths.
         /// </summary>
@@ -306,6 +204,7 @@ namespace MediaBrowser.Model.IO
         /// <param name="recursive">if set to <c>true</c> [recursive].</param>
         /// <returns>IEnumerable&lt;System.String&gt;.</returns>
         IEnumerable<string> GetFilePaths(string path, bool recursive = false);
+
         IEnumerable<string> GetFilePaths(string path, string[] extensions, bool enableCaseSensitiveExtensions, bool recursive);
 
         /// <summary>
@@ -319,15 +218,10 @@ namespace MediaBrowser.Model.IO
         void SetHidden(string path, bool isHidden);
         void SetReadOnly(string path, bool readOnly);
         void SetAttributes(string path, bool isHidden, bool readOnly);
-
-        char DirectorySeparatorChar { get; }
-
-        string GetFullPath(string path);
-
         List<FileSystemMetadata> GetDrives();
-
         void SetExecutable(string path);
     }
+
     //TODO Investigate if can be replaced by the one from System.IO ?
     public enum FileOpenMode
     {

+ 1 - 1
MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs

@@ -156,7 +156,7 @@ namespace MediaBrowser.Providers.BoxSets
 
             var dataFilePath = GetDataFilePath(_config.ApplicationPaths, tmdbId, preferredMetadataLanguage);
 
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(dataFilePath));
+            Directory.CreateDirectory(Path.GetDirectoryName(dataFilePath));
 
             _json.SerializeToFile(mainResult, dataFilePath);
         }

+ 9 - 9
MediaBrowser.Providers/Manager/ImageSaver.cs

@@ -233,14 +233,14 @@ namespace MediaBrowser.Providers.Manager
         {
             _logger.LogDebug("Saving image to {0}", path);
 
-            var parentFolder = _fileSystem.GetDirectoryName(path);
+            var parentFolder = Path.GetDirectoryName(path);
 
             try
             {
                 _libraryMonitor.ReportFileSystemChangeBeginning(path);
                 _libraryMonitor.ReportFileSystemChangeBeginning(parentFolder);
 
-                _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+                Directory.CreateDirectory(Path.GetDirectoryName(path));
 
                 _fileSystem.SetAttributes(path, false, false);
 
@@ -411,7 +411,7 @@ namespace MediaBrowser.Providers.Manager
                     filename = item is MusicAlbum ? "cdart" : "disc";
                     break;
                 case ImageType.Primary:
-                    filename = saveLocally && item is Episode ? _fileSystem.GetFileNameWithoutExtension(item.Path) : folderName;
+                    filename = saveLocally && item is Episode ? Path.GetFileNameWithoutExtension(item.Path) : folderName;
                     break;
                 case ImageType.Backdrop:
                     filename = GetBackdropSaveFilename(item.GetImages(type), "backdrop", "backdrop", imageIndex);
@@ -437,7 +437,7 @@ namespace MediaBrowser.Providers.Manager
             {
                 if (type == ImageType.Primary && item is Episode)
                 {
-                    path = Path.Combine(_fileSystem.GetDirectoryName(item.Path), "metadata", filename + extension);
+                    path = Path.Combine(Path.GetDirectoryName(item.Path), "metadata", filename + extension);
                 }
 
                 else if (item.IsInMixedFolder)
@@ -471,7 +471,7 @@ namespace MediaBrowser.Providers.Manager
                 return zeroIndexFilename;
             }
 
-            var filenames = images.Select(i => _fileSystem.GetFileNameWithoutExtension(i.Path)).ToList();
+            var filenames = images.Select(i => Path.GetFileNameWithoutExtension(i.Path)).ToList();
 
             var current = 1;
             while (filenames.Contains(numberedIndexPrefix + current.ToString(UsCulture), StringComparer.OrdinalIgnoreCase))
@@ -569,9 +569,9 @@ namespace MediaBrowser.Providers.Manager
 
                 if (item is Episode)
                 {
-                    var seasonFolder = _fileSystem.GetDirectoryName(item.Path);
+                    var seasonFolder = Path.GetDirectoryName(item.Path);
 
-                    var imageFilename = _fileSystem.GetFileNameWithoutExtension(item.Path) + "-thumb" + extension;
+                    var imageFilename = Path.GetFileNameWithoutExtension(item.Path) + "-thumb" + extension;
 
                     return new[] { Path.Combine(seasonFolder, imageFilename) };
                 }
@@ -617,9 +617,9 @@ namespace MediaBrowser.Providers.Manager
             {
                 imageFilename = "poster";
             }
-            var folder = _fileSystem.GetDirectoryName(item.Path);
+            var folder = Path.GetDirectoryName(item.Path);
 
-            return Path.Combine(folder, _fileSystem.GetFileNameWithoutExtension(item.Path) + "-" + imageFilename + extension);
+            return Path.Combine(folder, Path.GetFileNameWithoutExtension(item.Path) + "-" + imageFilename + extension);
         }
     }
 }

+ 1 - 1
MediaBrowser.Providers/Manager/ItemImageProvider.cs

@@ -387,7 +387,7 @@ namespace MediaBrowser.Providers.Manager
                     var existing = item.GetImageInfo(type, 0);
                     if (existing != null)
                     {
-                        if (existing.IsLocalFile && !_fileSystem.FileExists(existing.Path))
+                        if (existing.IsLocalFile && !File.Exists(existing.Path))
                         {
                             item.RemoveImage(existing);
                             changed = true;

+ 1 - 1
MediaBrowser.Providers/Manager/ProviderManager.cs

@@ -703,7 +703,7 @@ namespace MediaBrowser.Providers.Manager
 
                                 // Manual edit occurred
                                 // Even if save local is off, save locally anyway if the metadata file already exists
-                                if (fileSaver == null || !_fileSystem.FileExists(fileSaver.GetSavePath(item)))
+                                if (fileSaver == null || !File.Exists(fileSaver.GetSavePath(item)))
                                 {
                                     return false;
                                 }

+ 3 - 3
MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs

@@ -58,9 +58,9 @@ namespace MediaBrowser.Providers.MediaInfo
         {
             var path = GetAudioImagePath(item);
 
-            if (!_fileSystem.FileExists(path))
+            if (!File.Exists(path))
             {
-                _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+                Directory.CreateDirectory(Path.GetDirectoryName(path));
 
                 var imageStream = imageStreams.FirstOrDefault(i => (i.Comment ?? string.Empty).IndexOf("front", StringComparison.OrdinalIgnoreCase) != -1) ??
                     imageStreams.FirstOrDefault(i => (i.Comment ?? string.Empty).IndexOf("cover", StringComparison.OrdinalIgnoreCase) != -1) ??
@@ -70,7 +70,7 @@ namespace MediaBrowser.Providers.MediaInfo
 
                 var tempFile = await _mediaEncoder.ExtractAudioImage(item.Path, imageStreamIndex, cancellationToken).ConfigureAwait(false);
 
-                _fileSystem.CopyFile(tempFile, path, true);
+                File.Copy(tempFile, path, true);
 
                 try
                 {

+ 2 - 1
MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs

@@ -1,4 +1,5 @@
 using System;
+using System.IO;
 using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
@@ -196,7 +197,7 @@ namespace MediaBrowser.Providers.MediaInfo
 
         private void FetchShortcutInfo(BaseItem item)
         {
-            item.ShortcutPath = _fileSystem.ReadAllLines(item.Path)
+            item.ShortcutPath = File.ReadAllLines(item.Path)
                 .Select(NormalizeStrmLine)
                 .FirstOrDefault(i => !string.IsNullOrWhiteSpace(i) && !i.StartsWith("#", StringComparison.OrdinalIgnoreCase));
         }

+ 2 - 2
MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs

@@ -98,7 +98,7 @@ namespace MediaBrowser.Providers.MediaInfo
             int startIndex,
             string[] files)
         {
-            var videoFileNameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(videoPath);
+            var videoFileNameWithoutExtension = Path.GetFileNameWithoutExtension(videoPath);
             videoFileNameWithoutExtension = NormalizeFilenameForSubtitleComparison(videoFileNameWithoutExtension);
 
             foreach (var fullName in files)
@@ -110,7 +110,7 @@ namespace MediaBrowser.Providers.MediaInfo
                     continue;
                 }
 
-                var fileNameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(fullName);
+                var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fullName);
                 fileNameWithoutExtension = NormalizeFilenameForSubtitleComparison(fileNameWithoutExtension);
 
                 if (!string.Equals(videoFileNameWithoutExtension, fileNameWithoutExtension, StringComparison.OrdinalIgnoreCase) &&

+ 1 - 1
MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs

@@ -254,7 +254,7 @@ namespace MediaBrowser.Providers.Movies
 
             var path = GetFanartJsonPath(id);
 
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
+            Directory.CreateDirectory(Path.GetDirectoryName(path));
 
             try
             {

+ 2 - 1
MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Globalization;
+using System.IO;
 using System.Linq;
 using System.Net;
 using System.Threading;
@@ -91,7 +92,7 @@ namespace MediaBrowser.Providers.Movies
                     tmdbId = movieInfo.id.ToString(_usCulture);
 
                     dataFilePath = MovieDbProvider.Current.GetDataFilePath(tmdbId, language);
-                    _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(dataFilePath));
+                    Directory.CreateDirectory(Path.GetDirectoryName(dataFilePath));
                     _jsonSerializer.SerializeToFile(movieInfo, dataFilePath);
                 }
             }

+ 1 - 1
MediaBrowser.Providers/Movies/MovieDbProvider.cs

@@ -198,7 +198,7 @@ namespace MediaBrowser.Providers.Movies
 
             var dataFilePath = GetDataFilePath(id, preferredMetadataLanguage);
 
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(dataFilePath));
+            Directory.CreateDirectory(Path.GetDirectoryName(dataFilePath));
 
             _jsonSerializer.SerializeToFile(mainResult, dataFilePath);
         }

Some files were not shown because too many files changed in this diff